学生成绩管理系统 C语言

其中还有些小BUG,单链表实现!

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include <conio.h>
int n;
struct student {
	char name[20];
	int xh;//学号
	int  bj;//班级
	double eng;//英语
	double math;//数学
	double C;//C语言
	double datab;//数据库
	double sjjg;//数据结构
	double avg;//平均
	double sum;// 总分
	struct student *next;//指向下一个节点
};
typedef struct student student;
student *Copylist(student *head);
//+++++++++++++++++++++++++++++++++++++++++++++++++++
student *create_list();
void add(student *head,student *newnode);            //创建 增加  输出 
void print_list(student *head);
//+++++++++++++++++++++++++++++++++++++++++++++++++++
void searchmeun();
student *search(student *head);                      //查找 
//+++++++++++++++++++++++++++++++++++++++++++++++++++
void tongjimeun();
student *tongji(student *head);                      //统计 
//+++++++++++++++++++++++++++++++++++++++++++++++++++
void paixumeun();
student *paixu(student *head);                       //排序 
//+++++++++++++++++++++++++++++++++++++++++++++++++++
int writeToFile(student *head );
student* readFromFile();                             //存取 
//+++++++++++++++++++++++++++++++++++++++++++++++++++ 
void print();                                        //主界面 
//***************************************************
void delete1(student *head);                                      //删除
//*************************************************** 
int main() {
	int g;
	student *head=NULL,*p,*newnode;

	while(1) {
		system("cls");
		print();//显示主菜单 (1)
		fflush(stdin);
		printf("请输入对应命令\n");
		scanf("%d",&g);//选择主菜单 (2)
		switch(g) {
			case 1:
				fflush(stdin);//--------------------------------------------清空缓存区
				system("cls");//清屏
				student * head, * p, * q;
				head=create_list();//调用链表   创建链表
				system("cls");
				break;
				
			case 2:
				fflush(stdin);
				system("cls");
				newnode=(student*)malloc(sizeof(student));
				printf("请输入姓名:") ;
				gets(newnode->name);
				printf("请输入学号: ");
				scanf("%d",&newnode->xh);
				printf("请输入班级: ");
				scanf("%d",&newnode->bj);
				printf("请输入英语成绩: ");
				scanf("%lf",&newnode->eng);
				printf("请输入高数成绩: ");
				scanf("%lf",&newnode->math);
				printf("请输入C语言成绩: ");
				scanf("%lf",&newnode->C);
				printf("请输入数据库成绩: ");
				scanf("%lf",&newnode->datab);
				printf("请输入数据结构成绩: ");
				scanf("%lf",&newnode->sjjg);
				newnode->sum=newnode->eng+newnode->math+newnode->C+newnode->datab+newnode->sjjg;//总分
				newnode->avg=(newnode->eng+newnode->math+newnode->C+newnode->datab+newnode->sjjg)/5.0;//平均分

				add(head,newnode);
				printf("已增加录入一名学生信息\n");
				printf("按任意键继续\n");
				getchar();// 任意输入一个字符
				system("cls");
				break;
				
			case 3:
				system("cls");
				fflush(stdin);
				if(head->next!=NULL)
					print_list(head);
				else printf("无可查信息!^_^");
				printf("按任意键继续\n");
				getchar();
				break;
				
			case 4:
				fflush(stdin);
				system("cls");
				n=1;               //n为全局变量   在循环中会发生变化 
				while(n) {
					searchmeun();
					head = search(head);
					
				}
				break;
				
			case 5:
				fflush(stdin);
				system("cls");
				n=1;
			while(n){
				tongjimeun();
				head=tongji(head);
				}
				getchar();
			    break;

			case 6:
				fflush(stdin);
				system("cls");
				paixumeun();
				int ed;        //定义ed作为switch选择 
				printf("请输入命令\n");
				scanf("%d",&ed);
				switch(ed){
					
					case 1:fflush(stdin);
						head=paixu(head);
						getchar();
						break;
					case 0:
					    printf("退出子程序,按任意键继续\n");
					    getchar();
					    break;
				}
				break;
				
			case 7:
				fflush(stdin);
				system("cls");
				printf("正在使用删除模块\n");
				delete1(head);
				break;
				
			case 8:
				fflush(stdin);
				system("cls");
				int success;
				printf("正在存盘\n");
				success=writeToFile(head);
				if(success)
				printf("存盘成功\n");
				else printf("存储不成功\n");
				fflush(stdin);
				printf("按任意键继续\n");
				getchar();
				break;	
				
			case 9:	
				fflush(stdin);
				system("cls");
				printf("正在读盘\n");
				head=readFromFile();
				if(head!=NULL)
				printf("读盘成功\n");
				else printf("读取不成功\n");
				fflush(stdin);
				printf("按任意键继续\n");
				getchar();
				break;		 

			case 0:
				exit(0);
				break;
		}
	}
	free(head);
	head=NULL;
	return 0;

}
//*******************************************************
student * create_list() { //创建链表函数

	student *head,*p,*q;

	char name1[20];
	head =(student*)malloc(sizeof(student));
	if(NULL==head) {//判断是否申请成功

		free(head);
		return NULL;
	}
	fflush(stdin);
	q=head;
	printf("请输入学生姓名\n");
	gets(name1);
	while (strlen(name1)!=0) {//判断输入然否有效
		p=(student*)malloc(sizeof(student));
		if(NULL==p)
			return head;
		strcpy(p->name,name1);
		printf("请输入学号:\n");
		scanf("%d",&p->xh);
		printf("请输入班级:\n");
		scanf("%d",&p->bj);
		printf("请输入英语成绩:\n");
		scanf("%lf",&p->eng);
		printf("请输入高数成绩:\n");
		scanf("%lf",&p->math);
		printf("请输入C语言成绩:\n");
		scanf("%lf",&p->C);
		printf("请输入数据库成绩:\n");
		scanf("%lf",&p->datab);
		printf("请输入数据结构成绩:\n");
		scanf("%lf",&p->sjjg);
		p->sum=p->eng+p->math+p->C+p->datab+p->sjjg;//总分
		p->avg=(p->eng+p->math+p->C+p->datab+p->sjjg)/5;//平均分
		q->next =p;//通过复制的头节点进行移动
		q=p;
		printf("继续录入请再次输入学生姓名,否则回车结束!\n");
		fflush(stdin);//---------------------------------------清空缓冲区
		gets(name1);//进入下一个节点
	}
	q->next = NULL;
	system("cls");
	return head;

}
//******************************************************
void add(student *head,student *newnode) { //添加学生信息
	fflush(stdin);
	student *q,*p;
	q=head;
	if(head==NULL) head=(student * )(malloc(sizeof(student)));
	p=head->next;
	while (p!=NULL) {
		if(strcmp(p->name, newnode->name)>0)//升序
			break;
		else {
			p=p->next;
			q=q->next; //寻找下一个节点
		}
	}
	q->next = newnode;
	newnode->next = p;

}

//*******************************************************
void print_list(student *head) { //输出学生信息
	student *p;
	printf("\n学生成绩如下\n");
	printf("姓名     学号     班级     英语     高数     C语言     数据库     数据结构     总分     平均分\n");
	p=head->next;
	while(p!=NULL) {
		p->avg=(p->eng+p->math+p->C+p->datab+p->sjjg)/5;
		p->sum=p->eng+p->math+p->C+p->datab+p->sjjg;
		printf("%s",p->name);
		printf("%10d%9d%8.0lf%9.0lf%10.0lf%12.0lf%11.0lf%13.0lf%10.0lf\n",p->xh,p->bj,p->eng,p->math,p->C,p->datab,p->sjjg,p->sum,p->avg);
		p=p->next;
	}
}
//****************************************************
student *search(student *head) { //查找学生信息
	fflush(stdin);//--------------------------------------清空缓存区
	student *p;
	p=head;
	int s;
	scanf("%d",&s);
	switch(s) {
		case 1: {
			fflush(stdin);
			printf("正在使用学号查找信息\n请输入学号\n");
			int  y=0;//表示输入所查询的学号
			scanf("%d",&y);
			while (p!=NULL) {
				if(p->xh==y) { //找到
					p->avg=(p->eng+p->math+p->C+p->datab+p->sjjg)/5.0;
					p->sum=p->eng+p->math+p->C+p->datab+p->sjjg;
					printf("\n学生成绩如下\n");
					printf("姓名     学号     班级     英语     高数     C语言     数据库     数据结构     总分     平均分\n");
					printf("%s",p->name);
					printf("%10d%9d%8.0lf%9.0lf%10.0lf%12.0lf%11.0lf%13.0lf%10.0lf\n",p->xh,p->bj,p->eng,p->math,p->C,p->datab,p->sjjg,p->sum,p->avg);
					printf("按任意键继续"); 
					getchar();
					break;
				} else
					p=p->next;//指向下一个  由while进行遍历 直到最后
			}
		}
		n=1;
		getchar();
		
		break;
		case 2: {
			fflush(stdin);
			char k[20]= {0};
			printf("正在使用姓名查找信息\n请输入姓名\n");
			gets(k) ;//输入所查询的姓名
			while (p!=NULL) {
				if(strcmp(p->name,k)==0) {//找到
					p->avg=(p->eng+p->math+p->C+p->datab+p->sjjg)/5.0;
					p->sum=p->eng+p->math+p->C+p->datab+p->sjjg;
					printf("\n学生成绩如下\n");
					printf("姓名     学号     班级     英语     高数     C语言     数据库     数据结构     总分     平均分\n");
					printf("%s",p->name);
					printf("%10d%9d%8.0lf%9.0lf%10.0lf%12.0lf%11.0lf%13.0lf%10.0lf\n",p->xh,p->bj,p->eng,p->math,p->C,p->datab,p->sjjg,p->sum,p->avg);
					printf("按任意键继续"); 
					getchar();
					break;
				} else
					p=p->next;//指向下一个  由while进行遍历 直到最后
			}
		}
		getchar(); 
		n=1;
		break;
		
		case 3: {
			fflush(stdin);
			int cla=0;
			printf("正在使用班级查找信息\n请输入班级\n");
			scanf("%d",&cla);
			while (p!=NULL) {
				if(p->bj==cla) { //找到
					p->avg=(p->eng+p->math+p->C+p->datab+p->sjjg)/5.0;
					p->sum=p->eng+p->math+p->C+p->datab+p->sjjg;
					printf("\n学生成绩如下\n");
					printf("姓名     学号     班级     英语     高数     C语言     数据库     数据结构     总分     平均分\n");
					printf("%s",p->name);
					printf("%10d%9d%8.0lf%9.0lf%10.0lf%12.0lf%11.0lf%13.0lf%10.0lf\n",p->xh,p->bj,p->eng,p->math,p->C,p->datab,p->sjjg,p->sum,p->avg);
					p=p->next;
				} else
					p=p->next;//指向下一个  由while进行遍历 直到最后
			}
			printf("按任意键继续"); 
			getchar();
			getchar();
			break;
		}
		
		n=1;
		getchar ();
		break;

		case 0:
			fflush(stdin);
			system("cls");
			n=0;
			break;
			
		default:
			fflush(stdin);
			printf("输入有误!\n");
			printf("请重新输入\n"); 
			printf("按任意键继续!");
			getchar(); 
			n=1;
			break;
	}
	return head;
}
//******************************************************
student *tongji(student *head) {
	//统计某班的平均分
	//统计某班高于平均分的人数
	//统计某门课程的平均分

	fflush(stdin);
	student * p;
	p = head->next;
	int f;
	scanf("%d",&f);
	switch(f) 
	{
		case 1: {//询所有学生的平均成绩
		    fflush(stdin);
			printf("正在查询所有学生的总平均成绩\n");
			double Count = 0.0;
			double allsum=0.0;
			while (p!=NULL ) {
			allsum+=p->sum;
			Count +=1.0;
			p=p->next;
			}
			printf("所有学生的平均为%.2lf\n",allsum/Count);
			}
			n=1; 
			printf("按任意键继续\n");
			getchar();
			break;
//=================================================================
		case 2: {//按课程号查询某课程的平均成绩
			fflush(stdin);
			int mn;
			printf("正在按课程号查询某课程的平均成绩\n");
			printf("请输入需查询平均成绩的课程号\n");
			printf("英语 :请输入 1    数学:请输入 2   C语言:请输入 3    数据库:请输入 4    数据结构:请输入 5\n");
			scanf("%d",&mn);
			switch(mn) 
			{
				case 1: {//英语的平均成绩
					double Count1 = 0.0;
					double allsum1=0.0;
					while (p!=NULL ) {
					allsum1+=p->eng;
					Count1 +=1.0;
					p=p->next;
					}
					printf("所有学生的英语平均分为: %.2lf\n",allsum1/Count1);
					}
					printf("按任意键继续\n");
					getchar();
					break;

				case 2: {//数学的平均成绩
					double Count2 = 0.0;
					double allsum2=0.0;
					while (p!=NULL ) {
					allsum2+=p->math;
					Count2 +=1.0;
					p=p->next;
					}
					printf("所有学生的数学平均为分%.2lf\n",allsum2/Count2);
					}
					printf("按任意键继续\n");
					getchar();
					break;

				case 3: {//C语言的平均成绩
					double Count5 = 0.0;
					double allsum5=0.0;
					while (p!=NULL ) {
					allsum5+=p->C;
					Count5 +=1.0;
					p=p->next;
					}
					printf("所有学生的C语言平均为分%.2lf\n",allsum5/Count5);
					}
					printf("按任意键继续\n");
					getchar();
					break;

				case 4: {//数据库平均成绩
					double Count3 = 0.0;
					double allsum3=0.0;
					while (p!=NULL ) {
					allsum3+=p->datab;
					Count3 +=1.0;
					p=p->next;
					}
					printf("所有学生的数据库平均分为%.2lf\n",allsum3/Count3);
					}
					printf("按任意键继续\n");
					getchar();
					break;

				case 5: {//数据结构平均成绩
					double Count4 = 0.0;
					double allsum4=0.0;
					while (p!=NULL ) {
					allsum4+=p->sjjg;
					Count4 +=1.0;
					p=p->next;
					}
					printf("所有学生的数据结构平均分为%.2lf\n",allsum4/Count4);
					}
					printf("按任意键继续\n");
					getchar();
					break;
			}
			//***************************************************内部嵌套的switch结束
		} //--------------------------------------------------//这里第二个case2结束
		
		n=1; 
		getchar();
		break;

		//===============================================================
		case 3: {//查询高于总平均分的人数
			fflush(stdin);
			printf("正在查询高于总平均分的人数\n");
			double Count6 = 0.0;
			double allsum6=0.0;
			while (p!=NULL ) {
			allsum6+=p->sum;
			Count6 +=1.0;              //先求出平均分
			p=p->next;
			}
			int qw=allsum6/Count6;//总平均成绩
			double Count7=0.0;
			while (p!=NULL ) {
				if(p->avg>qw) {
					Count7 +=1.0;              //先求出平均分
					p=p->next;
					} else p=p->next;
					}
					printf("所高于平均数的人数为%.0lf\n",Count7);
				}
				n=1; 
				printf("按任意键继续\n");
				getchar();
				break;
		case 0:
			fflush(stdin);
			printf("结束\n");
			printf("按任意键继续");
			n=0;
			break;
		default :
			fflush(stdin);
		printf("请输入正确信息\n"); 
		n=1;
		printf("按任意键继续\n");
		getchar();
		break;
	}
	return head; 
}
//**************************************************************
student *Copylist(student *head)//复制先前列表 
{
  student *newlist,*s,*p;
  int i=0,j;
  while(head!=NULL)
  {
    i++;
    s=(student *)malloc(sizeof(student));
    strcpy(s->name,head->name);
    s->xh=head->xh;
    s->bj=head->bj;
    s->eng=head->eng;
    s->math=head->math;
    s->C=head->C;
    s->datab=head->datab;
    s->sjjg=head->sjjg;
    s->avg=head->avg;
    s->sum=head->sum;
    if(i==1)
		{
		  newlist=s;
			s->next=NULL;
		}
		else   p->next=s;
    p=s;
    head=head->next;
  }
  p->next=NULL;
  printf("---复制链表成功!---\n");
  return newlist;
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
student *paixu(student *head)
{
	fflush(stdin);
  char ch;
  student *first,*tail,*p_front,*min,*p,*copyhead;
	if(head==NULL)
	{
		printf("---空链表!请先新建链表或文件读取---\n");
		return head;
	}
//先复制链表,以作备份
  copyhead=Copylist(head);

  first=NULL;
  while(head!=NULL)
  {
     for(p=head,min=head;p->next!=NULL;p=p->next)
     {
        if(p->next->sum <min->sum)//p->next->sum比较小
        {
           p_front=p;       //保存最小节点的前一个节点
           min=p->next;     //保存此时链表最小的节点值
        }
     }
      //将得到的值放入有序链表中;
     if(first==NULL)
      {
        first=min;
        tail=min;
      }
     else           //有序链表中已经有节点
     {
        tail->next=min;
        tail=min;
     }
     //原链表指针后移
     if(min==head)
        head=head->next;
     else
        p_front->next = min->next;
  }
  if(first!=NULL)
    tail->next=NULL;
//完成总分排序
	system("cls");
	printf("---排序成功!排序如下--\n");
	print_list(first);
	printf("按任意键继续!"); 
	  return copyhead;
	
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void delete1 (student *head) 
{	printf("输入要删除的学生姓名\n");
	fflush(stdin); 
	char who[20];
	scanf("%s",&who); 
	student  *p,*q;
	q=head; 
	p = head->next;
	while (p!=NULL) 
       {if(strcmp(p->name,who)==0)//找到
		break;
	    else
		{ p=p->next;
		  q=q->next;
		}
       }
       if(p != NULL)  //表示找到了,是经break语句跳出循环的
        {	q->next = p->next;
		printf("名为%s 的学生已被删除。\n",p->name);
		free(p);
        p=NULL;
        printf("按任意键继续"); 
        getchar();   //防止直接闪过 
	  	}
		else
		printf("没有找到,不删除!\n");
		getchar(); 
}
//**************************************************************
int writeToFile(student *head) { //将链表写入到默认文件
	FILE *fpw = NULL; //文件指针
	student *p;

	if( NULL==head ) {
		printf("没有学生信息,无须写入文件!\n");
		return 0;
	}
	fpw = fopen("student.txt", "wb");
	if( NULL == fpw) //文件打开失败,则数据存盘失败
		return 0;

	p = head->next;
	while( p != NULL ) {
		fwrite(p,sizeof(student),1, fpw);//每次读入一个学生信息,直到结束
		p = p->next;
	}
	if( NULL!=fpw )//如果读取到了信息,就保存
		fclose(fpw);

	return 1; //返回成功标志
}
//*******************************************************
student * readFromFile() { //从默认文件(haohaninfo.txt)中读取信息
	FILE *fpr = NULL; //文件指针
	student *p, *head;

	fpr = fopen("student.txt", "rb");
	if( NULL == fpr) {
		printf("文件打开失败\n");
		return NULL;
	}

	head = (student*)malloc(sizeof(student));
	head->next = NULL;

	while( !feof(fpr) ) { //未读取文件末尾
		p = (student*)	malloc(sizeof(student));
		if(fread(p,sizeof(student),1, fpr) ) { //如果读取成功一个结点信息
			//p插入到链表头部
			p->next = head->next;
			head->next = p;
		} else //如果未读取到结点信息,则p是多余的,要释放
			free(p) ;
	}
	if( NULL!=fpr )
		fclose(fpr);

	return head; //返回链表头指针
}
//***********************************************************
void print() { //显示
	system("cls");//清屏
	printf("+======================================+\n");
	printf("|      制作人: <span style="white-space:pre">			</span>       |\n");
	printf("+======================================+\n");
	printf("|    学 生 成 绩 管 理 系 统 主 菜 单  |\n");
	printf("+======================================+\n");
	printf("|    1  重新输入所有学生信息           |\n");
	printf("|    2  补充输入一个学生信息           |\n");
	printf("|    3  输出所有成绩                   |\n");
	printf("|    4  查询子程序                     |\n");
	printf("|    5  统计汇总子系统                |\n");
	printf("|    6  排序子系统                     |\n");
	printf("|    7  删除学生信息                   |\n");
	printf("+======================================+\n");
	printf("|    8  数据存盘                       |\n");
	printf("|    9  读入学生信息                   |\n");
	printf("+======================================+\n");
	printf("|    0  退出系统                       |\n");
	printf("+======================================+\n");

}
//*********************************************************
void  searchmeun() { //查询子菜单
	system("cls");
	printf("+======================================+\n");
	printf("|    查  询  子  系  统  主  菜  单    |\n");
	printf("+======================================+\n");
	printf("|    1   按学号查询                    |\n");
	printf("|    2   按姓名查询                    |\n");
	printf("|    3   按班级查询                    |\n");
	printf("+======================================+\n");
	printf("|    0   返回上一级                    |\n");
	printf("+======================================+\n");
	printf("\n");
	printf("请输入命令:");
}
void tongjimeun() {
	system("cls");
	printf("+======================================+\n");
	printf("|    统  计  子  系  统  主  菜  单    |\n");
	printf("+======================================+\n");
	printf("|    1   统计所有学生的总平均分        |\n");
	printf("|    2   统计某门课程的平均分          |\n");
	printf("|    3   统统计某班高于总分平均分的人数|\n");
	printf("+======================================+\n");
	printf("|    0   返回上一级                    |\n");
	printf("+======================================+\n");
	printf("\n");
	printf("请输入命令:");
}
void paixumeun() {
	system("cls");
	printf("+======================================+\n");
	printf("|    排  序  子  系  统  主  菜  单    |\n");
	printf("+======================================+\n");
	printf("|    1   按总分升序排序                |\n");
	printf("+======================================+\n");
	printf("|    0   返回上一级                    |\n");
	printf("+======================================+\n");
	printf("\n");
	printf("请输入命令:");
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值