[原创]使用链表的学生成绩多功能管理系统

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>

//定义学生结构体 
typedef struct _Student//每个学生对应一个结构体
{     
	char ID[200];//学号 
	char Name[20];//姓名 
	char Gender[4];//性别 
	float Mark1;//c成绩  
	float Mark2;//数学成绩 
	float Mark3;//英语成绩 
	float Sum;//个人总成绩 
	float Avg;//平均成绩  
}Student;

//链表
//节点
typedef struct _Node
{
   Student stu;        //数据域             
   struct _Node* next;     //指针域	
}Node; 

Node* g_pStudentlist=NULL;   //学生链表 ,头结点 

 
void menu();//进入主菜单
void input();//录入学生信息
void display();//浏览学生信息
void save();//保存学生信息
void read();//读取学生信息
void find();//查找学生信息
void change();//修改学生信息
void Delete(); //删除学生信息//有误 只能按顺序删除 
void math_sort_max();//数学成绩从小到大排序,取最大值 
void math_sort_min();//数学成绩从大到小排序,取最小值 
void c_sort_max();//数学成绩从小到大排序,取最大值 
void c_sort_min();//数学成绩从大到小排序,取最小值 
void english_sort_max();//数学成绩从小到大排序,取最大值 
void english_sort_min();//数学成绩从大到小排序,取最小值 

int main()//主函数 
{	
    while(1)
    {
	    menu();
	    //直接读取一个字符,接受键盘的输入
	    printf("请输入选择类型(1-8)(不显示):\n");
	    
		char ch = getch();
		int numstudents=0;
		int i=0;
		int ch3,ch4,ch5,ch6,ch7;

		switch (ch)
		{
		case '1'://录入学生信息 
		printf("请输入要录入的学生人数:\n");
	    scanf("%d",&numstudents);
	    if(numstudents == 0||numstudents > 50)
	    {
		    printf("学生人数不在1-50之间,请重新录入学生人数\n");
		    continue;
     	}
     	for(i;i<numstudents;i++)
		{
		    input();
		    printf("学生信息录入成功!是否继续录入(y/n):");
		    char ch1 = getch();
            if(ch1 =='y'||ch1 =='Y')
            {
        	   printf("继续录入\n");
	     	}
        
            if(ch1 =='n'||ch1 =='N')
            {
        	   printf("停止录入\n");
        	   break;
	     	}
	     	if(ch1 !='y'||ch1 !='Y'||ch1 !='n'||ch1 !='N')
	     	{
	     	    continue;
	        }
	    }
		    break;
	    case '2'://浏览学生信息 
	        display();
	        system("pause");//暂停 
            system("cls");//清屏
		    break;
		case '3'://保存学生信息
	        save();
		    break;
		case '4'://读取学生信息
	        read();
		    break;  
		case '5'://查找学生信息
            find();
		    break;
   		case '6'://统计学生信息
		    printf("统计学生信息,按1对数学进行统计,按2对英语进行统计,按3对c成绩进行统计,按4统计函数功能结束:\n");
		    scanf("%d",&ch4);
            if(ch4 == 1)
            {
            	printf("统计学生数学信息,按1对数学成绩进行排序:\n");
            	scanf("%d",&ch7);
			    if(ch7 == 1)
			    {
			       math_sort_min();
			       display();
			       math_sort_max();
			       display();
			       system("pause");//暂停 
                   system("cls");//清屏			       
				}
            }
            if(ch4 == 2)
            {
        	    printf("统计学生英语信息,按1对英语进行排序:\n");
        	    scanf("%d",&ch7);
			    if(ch7 == 1)
			    {
			       english_sort_min();
			       display();
			       english_sort_max();
			       display();
			       system("pause");//暂停 
                   system("cls");//清屏
				}
	        }
	        if(ch4 == 3)
            {
                printf("统计学生c信息,按1对c成绩进行排序");
                scanf("%d",&ch7);
			    if(ch7 == 1)
			    {
			      c_sort_min();	
			      display();
			      c_sort_max();
			      display();
 			      system("pause");//暂停 
                  system("cls");//清屏
				}
	        }
	        if(ch4 == 4)
            {
        	    printf("统计函数功能结束\n");
        	    break;
	        }   
		    break;
		case '7'://更改学生信息
		    printf("更改学生信息,按1修改学生信息,按2删除学生信息:");
		    scanf("%d",&ch3);
            if(ch3 == 1)
            {	
                printf("是否确认修改(y/n):");
		        char ch5 = getch();
		        if(ch5 =='y'||ch5 =='Y')
		        {
		        	printf("修改学生信息\n");
        	        change();
        	        display();
        	        system("pause");//暂停 
                    system("cls");//清屏 
				}
        	    if(ch5 =='n'||ch5 =='N')
        	    {
        	    	printf("取消修改\n");
        	    	break;
				}
            }
            if(ch3 == 2)
            {
            	printf("是否确认删除(y/n):");
		        char ch6 = getch();
		        if(ch6 =='y'||ch6 =='Y')
		        {
		        	printf("删除学生信息\n");
        	        Delete();  
        	        display();
        	        system("pause");//暂停 
                    system("cls");//清屏 
				}
        	    if(ch6 =='n'||ch6 =='N')
        	    {
        	    	printf("取消删除\n");
        	    	break;
				} 
	        }
			 break;			    
		case '0'://退出程序
			printf("退出程序!!!\n");
			return 0;//结束程序	
		default:
			printf("输入有误,请重新输入\n");
			system("pause");
	        system("cls"); 
			break;					
		}
		
    }
	return 0;
}
//主菜单 
void menu()
{
	 printf("*************************************************************************************************\n");
	 printf("                 学生成绩管理系统                     \n");
	 printf("  |1.录入学生信息  |              |2.浏览学生信息  |  \n");
	 printf("  |3.保存学生信息  |              |4.读取学生信息  |  \n");
	 printf("  |5.查找学生信息  |              |6.统计学生信息  |  \n");
	 printf("  |7.更新学生信息  |              |0.退出程序      |  \n");
	 printf("*************************************************************************************************\n");
}

//录入学生信息
void input()
{
	char id[200];
	float c,math,english,sum,avg;
	int flag;
	Node* pNewNode = (Node*)malloc(sizeof(Node));
	pNewNode->next = NULL;
	//输入学生姓名
	printf("请输入姓名:\n");
    scanf("%s",pNewNode->stu.Name);
    //检验学号的唯一性 
    printf("请录入一名同学后再使用此功能,检查学号是否已存在(1.执行;2.不执行):\n");
    scanf("%d",&flag);
	if(flag ==1)
	{
		printf("请输入学号:\n");
        scanf("%s",id);
	    //检查学号是否已存在 
		if(strcmp(pNewNode->stu.ID,id) == 0)
		{
			printf("输入的学号已存在\n");
		    return;
		}
		printf("请再输入学号:\n");
        scanf("%s",pNewNode->stu.ID);
    }
    if(flag ==2)
    {
    	printf("请输入学号:\n");
        scanf("%s",pNewNode->stu.ID);
    	printf("不执行\n");
	}
    printf("请输入性别:\n");
    scanf("%s",pNewNode->stu.Gender);
    printf("请输入c成绩:\n");
    scanf("%f",&c);
    pNewNode->stu.Mark1 = c;
    printf("请输入数学成绩:\n");
    scanf("%f",&math);
    pNewNode->stu.Mark2 = math;
    printf("请输入英语成绩:\n");
    scanf("%f",&english);
    pNewNode->stu.Mark3 = english;
    sum=c+math+english;
    printf("总分:%.1f\n",sum);
    pNewNode->stu.Sum = sum;
    avg=sum/3;
    printf("平均分:%.1f\n",avg);
    pNewNode->stu.Avg = avg;
   
    //插入到链表
	if(g_pStudentlist == NULL) 
	{
		g_pStudentlist = pNewNode;
	}
	else
	{
		pNewNode->next = g_pStudentlist;
		g_pStudentlist = pNewNode;
	}
	
	printf("录入学生信息成功\n");
    system("pause");//暂停 
    system("cls");//清屏 
}

//浏览学生信息
void display()
{
	printf("*************************************************************************************************\n");
	printf("\t浏览学生信息系统\t\n");
	printf("\t学号\t姓名\t性别\tc成绩\t数学\t英语\t总分\t平均分\n");
	printf("*************************************************************************************************\n");
    //遍历链表
 	Node* p = g_pStudentlist;
	while(p!=NULL)
	{
		printf("\t%s\t%s\t%s\t%.1f\t%.1f\t%.1f\t%.1f\t%.1f\n",p->stu.ID,p->stu.Name,p->stu.Gender,p->stu.Mark1,p->stu.Mark2,p->stu.Mark3,p->stu.Sum,p->stu.Avg);
		p = p->next;
	}
	
	printf("*************************************************************************************************\n");
}

//保存学生信息
void save()
{
	//打开文件
	FILE* fp=fopen("D:\\students.txt","wb");
	
	if(fp==NULL)
	{
		printf("打开文件失败\n");
		return;
	} 
	 //遍历链表
 	Node* p = g_pStudentlist;
	while(p!=NULL)
	{
		fwrite(&p->stu,sizeof(Student),1,fp);
		p = p->next;
	}
	//关闭文件
	fclose(fp);
	printf("\n数据保存成功\n");
	system("pause");
	system("cls"); 
	
}

//读取学生信息
void read()
{
	//打开文件
	FILE* fp=fopen("D:\\students.txt","rb");
	if(fp==NULL)
	{
		printf("打开文件失败\n");
		return;
	} 
	
	//读取文件
	Student stu;
	while (fread(&stu,sizeof(Student),1,fp))
	{
		//创建一个新节点
		Node* pNewNode = (Node*)malloc(sizeof(Node)); 
		pNewNode->next = NULL;
		
		memcpy(pNewNode,&stu,sizeof(Student));
		
		
		//头插法
		if (g_pStudentlist == NULL)
		{
			g_pStudentlist = pNewNode;
		}
		else
		{
			pNewNode->next = g_pStudentlist;
			g_pStudentlist = pNewNode;
		}
	} 
	
	//关闭文件
	fclose(fp);
	printf("加载数据成功");
	system("pause");
	system("cls"); 
}
//查找
void find()
{
	int flag=0;
	char id[200];//学号 
	char name[20];//姓名 
	Node* p = g_pStudentlist;
	printf("输入1按照姓名查找,输入2按照学号查找:\n");
	scanf("%d",&flag);
    if (flag == 1)
    {
    	printf("请输入要查找学生的姓名:\n");
    	scanf("%s",name);
    	while(p!=NULL)
    	{
    		if(strcmp(p->stu.Name,name)==0)
    		{
    			printf("查询到该姓名\n");
    			printf("学号\t姓名\t性别\tc成绩\t数学\t英语\t总分\t平均分\n");
    			printf("%s\t%s\t%s\t%.1f\t%.1f\t%.1f\t%.1f\t%.1f\n",p->stu.ID,p->stu.Name,p->stu.Gender,p->stu.Mark1,p->stu.Mark2,p->stu.Mark3,p->stu.Sum,p->stu.Avg);
			}
			else
			{
				printf("未查询到该姓名\n");
			}
			p=p->next;
		}  
	}
	if (flag == 2)
    {
    	printf("请输入要查找学生的学号:\n");
    	scanf("%s",&id);
    	while(p!=NULL)
    	{
    		if(strcmp(p->stu.ID,id)==0)
    		{
    			printf("查询到该学号\n");
    			printf("学号\t姓名\t性别\tc成绩\t数学\t英语\t总分\t平均分\n");
    			printf("%s\t%s\t%s\t%.1f\t%.1f\t%.1f\t%.1f\t%.1f\n",p->stu.ID,p->stu.Name,p->stu.Gender,p->stu.Mark1,p->stu.Mark2,p->stu.Mark3,p->stu.Sum,p->stu.Avg);
			}
			else
			{
				printf("未查询到该学号\n");
			}
			p=p->next;
		}
	}
	system("pause");
	system("cls");
}   

//修改学生信息
void change()
{
	char a,b; 
	float c,d,e,sum,avg;
	char num[200];
	printf("请输入需要修改的学生信息的学号:\n");
	scanf("%s",num);
	//遍历链表
	Node* p = g_pStudentlist;
	while (p!=NULL)
	{
		//	将输入的信息与链表中的信息进行比较
		//	strcmp字符串比较函数(0 == strcmp(p->stu.ID,num) ),trcmp数字比较函数(p->stu.Mark2==English)相等取值为0 
		if (0 == strcmp(p->stu.ID,num))
		{
			printf("请输入要修改的学生姓名 性别:\n");
			scanf("%s %s",&a,&b); 
			printf("请输入要修改的学生c成绩 数学成绩 英语成绩:\n");
			scanf("%f %f %f",&c,&d,&e);
			sum=c+d+e;
			printf("修改后的学生总分:%.1f\n",sum);
			avg=sum/3;
			printf("修改后的学生平均分:%.1f\n",avg);
			printf("请再次输入要修改的学生姓名 性别 c成绩 数学成绩 英语成绩 总分 平均分:\n");
			scanf("%s %s %f %f %f %f %f",p->stu.Name,p->stu.Gender,&p->stu.Mark1,&p->stu.Mark2,&p->stu.Mark3,&p->stu.Sum,&p->stu.Avg); //注意整型与浮点型要用&取p的地址,字符串本身为地址 
			printf("修改成功\n");
			break;
		}
		p = p->next;
	}
	if (p == NULL)
	{
		printf("没有找到该学生信息\n");
	}
	system("pause");
	system("cls");
}

//删除学生信息
void Delete()
{
    char num[200];
	printf("请输入需要删除的学生信息的学号:\n");
	scanf("%s",num);
	//遍历链表
	Node* p = g_pStudentlist;
	while (p!=NULL)
	{
		
		if (0 == strcmp(p->stu.ID,num))
		{
			p->stu.Mark1,p->stu.Mark2,p->stu.Mark3=-1;
			printf("删除成功\n");
			break;
		}
		p = p->next;
	}
    Node *pa,*t1,*temp1;//创建2个链表,temp临时链表,g_pStudentlist头链表
	t1=(Node*)malloc(sizeof(Node));
	for(temp1 = g_pStudentlist ; temp1!=NULL ; temp1=temp1->next)
	{
		for(pa = g_pStudentlist ; pa->next!=NULL ; pa = pa->next)
		{
			if(pa->stu.Mark1 > pa->next->stu.Mark1)
			{
				t1->stu = pa->stu;
				pa->stu = pa->next->stu;
				pa->next->stu = t1->stu;//交换数据区
			}
		}
	}
	Node *pb,*t2,*temp2;//创建2个链表,temp临时链表,g_pStudentlist头链表
	t2=(Node*)malloc(sizeof(Node));
	for(temp2 = g_pStudentlist ; temp2!=NULL ; temp2=temp2->next)
	{
		for(pb = g_pStudentlist ; pb->next!=NULL ; pb = pb->next)
		{
			if(pb->stu.Mark2 > pb->next->stu.Mark2)
			{
				t2->stu = pb->stu;
				pb->stu = pb->next->stu;
				pb->next->stu = t2->stu;//交换数据区
			}
		}
	}
	Node *pc,*t3,*temp3;//创建2个链表,temp临时链表,g_pStudentlist头链表
	t3=(Node*)malloc(sizeof(Node));
	for(temp3 = g_pStudentlist ; temp3!=NULL ; temp3=temp3->next)
	{
		for(pc = g_pStudentlist ; pc->next!=NULL ; pc = pc->next)
		{
			if(pc->stu.Mark3 > pc->next->stu.Mark3)
			{
				t3->stu = pc->stu;
				pc->stu = pc->next->stu;
				pc->next->stu = t3->stu;//交换数据
			}
		}
	}	
	//定义指针p1,p2
	Node* p1,*p2;
	//	将输入的信息与链表中的信息进行比较
	//	strcmp字符串比较函数(0 == strcmp(p->stu.ID,num) ),trcmp数字比较函数(p->stu.Mark2==English)相等取值为0 
	//判断是不是头结点,strcmp字符串比较函数(0 == strcmp(p->stu.ID,num)
	while(p!=NULL)
    {
     	if (0 == strcmp(g_pStudentlist->stu.ID,num)) 
	    {
		//备份头结点 
		    p1=g_pStudentlist;
		    g_pStudentlist = g_pStudentlist->next;//下一个作头 
		//释放g_pStudentlist
	    	free(p1);
	    	printf("删除成功\n");	
        } 
        else
        {
    	    printf("未查询到该学生信息\n");
	    }    
	    p=p->next;
    }
	system("pause");
	system("cls");
}

//按成绩排序
void math_sort_max() 
{
	Node *p,*t,*temp;//创建2个链表,temp临时链表,g_pStudentlist头链表
	t=(Node*)malloc(sizeof(Node));
	for(temp = g_pStudentlist ; temp!=NULL ; temp=temp->next)
	{
		for(p = g_pStudentlist ; p->next!=NULL ; p = p->next)
		{
			if(p->stu.Mark2 > p->next->stu.Mark2)
			{
				t->stu = p->stu;
				p->stu = p->next->stu;
				p->next->stu = t->stu;//交换数据区
			}
		}
	}
	printf("数学成绩最高分:%.1f\n",p->stu.Mark2);
	printf("统计成功\n");     
}

void math_sort_min() 
{
	Node *p,*t,*temp;//创建2个链表,temp临时链表,g_pStudentlist头链表
	t=(Node*)malloc(sizeof(Node));
	for(temp = g_pStudentlist ; temp!=NULL ; temp=temp->next)
	{
		for(p = g_pStudentlist ; p->next!=NULL ; p = p->next)
		{
			if(p->stu.Mark2 < p->next->stu.Mark2)
			{
				t->stu = p->stu;
				p->stu = p->next->stu;
				p->next->stu = t->stu;//交换数据区
			}
		}
	}
	printf("数学成绩最低分:%.1f\n",p->stu.Mark2);
	printf("统计成功\n");    
}

void c_sort_max() 
{
    Node *p,*t,*temp;//创建2个链表,temp临时链表,g_pStudentlist头链表
	t=(Node*)malloc(sizeof(Node));
	for(temp = g_pStudentlist ; temp!=NULL ; temp=temp->next)
	{
		for(p = g_pStudentlist ; p->next!=NULL ; p = p->next)
		{
			if(p->stu.Mark1> p->next->stu.Mark1)
			{
				t->stu = p->stu;
				p->stu = p->next->stu;
				p->next->stu = t->stu;//交换数据区
			}
		}
	}
	printf("c成绩最高分:%.1f\n",p->stu.Mark1);
	printf("统计成功\n");
}

void c_sort_min() 
{
    Node *p,*t,*temp;//创建2个链表,temp临时链表,g_pStudentlist头链表
	t=(Node*)malloc(sizeof(Node));
	for(temp = g_pStudentlist ; temp!=NULL ; temp=temp->next)
	{
		for(p = g_pStudentlist ; p->next!=NULL ; p = p->next)
		{
			if(p->stu.Mark1< p->next->stu.Mark1)
			{
				t->stu = p->stu;
				p->stu = p->next->stu;
				p->next->stu = t->stu;//交换数据区
			}
		}
	}
	printf("c成绩最低分:%.1f\n",p->stu.Mark1);
	printf("统计成功\n");
}

void english_sort_max() 
{
    Node *p,*t,*temp;//创建2个链表,temp临时链表,g_pStudentlist头链表
	t=(Node*)malloc(sizeof(Node));
	for(temp = g_pStudentlist ; temp!=NULL ; temp=temp->next)
	{
		for(p = g_pStudentlist ; p->next!=NULL ; p = p->next)
		{
			if(p->stu.Mark3> p->next->stu.Mark3)
			{
				t->stu = p->stu;
				p->stu = p->next->stu;
				p->next->stu = t->stu;//交换数据
			}
		}
	}	
	printf("英语成绩最高分:%.1f\n",p->stu.Mark3);
	printf("统计成功\n");
}

void english_sort_min() 
{
    Node *p,*t,*temp;//创建2个链表,temp临时链表,g_pStudentlist头链表
	t=(Node*)malloc(sizeof(Node));
	for(temp = g_pStudentlist ; temp!=NULL ; temp=temp->next)
	{
		for(p = g_pStudentlist ; p->next!=NULL ; p = p->next)
		{
			if(p->stu.Mark3< p->next->stu.Mark3)
			{
				t->stu = p->stu;
				p->stu = p->next->stu;
				p->next->stu = t->stu;//交换数据
			}
		}
	}	
	printf("英语成绩最低分:%.1f\n",p->stu.Mark3);
	printf("统计成功\n"); 
} 


     
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值