精华内容
下载资源
问答
  • 按5 删除学生信息 按6 插入学生信息 按7 排序总成绩信息 学生信息主要有姓名,班级,学号,C语言成绩,高数成绩,大学英语成绩,控制台界面输出格式有点不美观。 #include #include struct student { char name...
  • 学生信息管理系统(C语言结构体版) 学生信息管理系统每个c语言入门者所需掌握的一个操作系统模板。下面就简单来介绍一个该操作系统。 功能介绍 该系统所具备的一般的增、删、查、改。另外,可根据个人需要增加...

    学生信息管理系统(C语言结构体版)

    学生信息管理系统每个c语言入门者所需掌握的一个操作系统模板。下面就简单来介绍一个该操作系统。

    1. 功能介绍
      该系统所具备的一般的增、删、查、改。另外,可根据个人需要增加排序、读取文件和保存文件等的功能。
      编写该系统时,我们要采用模块化的思想,将每个功能封装为一个函数,需要的时候再将其调用。
      添加功能:用于添加学生信息,可分为一次只添加一个或N个,下面介绍的代码为一个添加N个的情况。
      删除功能:用于删除学生信息,可分为按学生姓名、学号等进行删除,下面只介绍按学号删除的形式。
      查找功能:用于查找学生信息,可分为按学生姓名、学号、成绩等进行查找,下面只介绍按姓名和学号进行查找的形式。
      修改功能:用于修改错误的学生信息,可修改学生的姓名、学号、单科成绩等,下面将介绍根据查找是否学生的学号再进行修改的操作。
      排序功能:用于对学生信息进行自己想要的排序方式,可学生学号、单科、平均分或总分等进行排序,下面会介绍其中几种情况。

    2. 总体思路
      要构建一个操作系统。
      首先,我们要建立在自己的脑海里构建一个整体的框架。比如使用什么样的结构体,结构体里面的变量有什么,这些变量使用什么类型(当然也可以在后面根据实际需要更改)。
      再者,我们可能需要使用到什么功能,是否需要基本增、删、查、改之外的功能。
      最后,按模块化实现,即敲好每一个功能之后保证其能正常运行,再进行接下来的操作。这样避免在整体代码实现后改错太多造成心理不良影响。

    3. 界面设置
      通过一个好的界面能为一个操作管理系统带来舒适的操作感觉,因此界面的设置也显得尤为关键,下面展示我所设置的一个简陋的画面。
      在这里插入图片描述

    4. 源代码

      以下我的完整的源代码
      `

    #define _CRT_SECURE_NO_WARNINGS 1
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    #define LEN 30   //学号和姓名最大字符数(可按实际更改)
    #define N 100    //最大学生人数(可按实际更改)
    #define M 4      //学生科目门数(可按实际更改)
    
    static int n=0;//n表示当前记录的学生人数
    int k=1;   //switch开关控制
    float aver[M];  //储存各科平均数
    
    
    /*结构体保存学生信息*/
    struct student{
    	char ID[LEN+1];        
    	char name[LEN+1];      
    	int score[M];          
    	int total;             
    }stu[N],temp[1];           //temp[1]用于结构体交换时的存储单元
    
    /*函数声明*/
    void help();        //系统帮助函数
    int flush();		//读取文件函数
    void seek();     	//查找功能函数
    void modify();		//修改功能函数
    int stu_total();	//统计个人总分函数
    float stu_aver();	//统计单科平均分
    void insert();		//增加功能函数
    void del();			//删除功能函数
    void display();     //显示功能函数
    void sort();		//排序功能函数
    void save();		//保存文件函数
    void menu();		//界面函数
    
    
    /*主函数*/
    int main()
    {
    	system("color f0\n");//白底黑字
    	while(k)
    	{
    		system("cls");
    		menu();
    	}
    	system("pause");
    	return 0;
    }
    
    
    /*系统帮助函数*/
    void help()
    {
    	printf("\n0.欢迎使用系统帮助!\n");
    	printf("\n1.初次进入系统后,可读取已有的学生信息;\n");
    	printf("\n2.若无需读取学生信息,请自行添加学生信息;\n");
    	printf("\n3.若需要其他操作,可按照菜单提示输入数字代号;\n");
    	printf("\n4.添加学生信息后,请切记保存;\n");
    	printf("\n5.谢谢您的使用!\n");
    }
    
    
    /*读取文件函数*/
    int flush()
    {
    	char filename[LEN+1];
    	int i=0;
    	printf("请输入要读取的学生信息的文件名:\n");
    	scanf("%s",filename);
    	int j=0;
    	FILE * fp;
    	if((fp = fopen(filename,"r")) == NULL)
    	{
    		printf("没有找到该目标文件。\n");
    		return 0;
    	}
    	if((fp = fopen(filename,"r+")) != NULL)
    	{
    		//从文件读取信息
    		while (fscanf(fp,"%s %s %d %d %d %d %d %f %f %f %f",
    			&stu[j].ID,&stu[j].name,&stu[j].score[0],&stu[j].score[1],&stu[j].score[2],&stu[j].score[3],
    			&stu[j].total,&aver[0],&aver[1],&aver[2],&aver[3]) == 11)
    		{
    			j++;
    		}
    		n = j;
    		printf("读取成功!!!\n");	
    	}
    	return n;
    }
    
    
    /*查找学生信息函数*/
    void seek()
    {
    	int i,item,flag;
    	char s1[LEN+1]; //以姓名和学号的最长长度+1为准
    	printf("------------------------------\n");
    	printf("---------1.按学号查询---------\n");
    	printf("---------2.按姓名查询---------\n");
    	printf("---------3.退出本菜单---------\n");
    	printf("------------------------------\n");
    	while(k)
    	{
    		printf("请选择子菜单编号:");
    		scanf("%d",&item);
    		flag = 0;
    		switch(item)
    		{
    		case 1:
    			printf("请输入要查询的学生的学号:\n");
    			scanf("%s",s1);
    			for (i=0;i<n;i++)
    				if(strcmp(s1,stu[1].ID) == 0)
    				{
    					flag = 1;
    					printf("\t| 学生学号 \t 学生姓名 \tC语言成绩 \t高等数学成绩\t线性代数成绩\t大学英语成绩\t  总分\n");
    					for(i=0;i<n;i++)
    					{
    						printf("--------|-----------------------------------------------------------------------------------------------------\n");
    						printf("\t|%-11s\t%-10s\t%5d\t%15d\t%15d\t%15d\t%13d\n",
    							stu[i].ID,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].score[3],stu[i].total);
    					}
    					printf("--------|-----------------------------------------------------------------------------------------------------\n");
    					printf(" 平均分 |%38.2f\t%17.2f\t%9.2f\t%9.2f\n",aver[0],aver[1],aver[2],aver[3]);
    				}
    			if (0 == flag)
    				printf("该学号不存在!\n");
    			break;
    		case 2:
    			printf("请输入查询的学生的姓名:\n");
    			scanf("%s",s1);
    			for(i=0;i<n;i++)
    				if(strcmp(stu[i].name,s1) == 0)
    				{
    					flag = 1;
    					printf("\t| 学生学号 \t 学生姓名 \tC语言成绩 \t高等数学成绩\t线性代数成绩\t大学英语成绩\t  总分\n");
    					for(i=0;i<n;i++)
    					{
    						printf("--------|-----------------------------------------------------------------------------------------------------\n");
    						printf("\t|%-11s\t%-10s\t%5d\t%15d\t%15d\t%15d\t%13d\n",
    							stu[i].ID,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].score[3],stu[i].total);
    					}
    					printf("--------|-----------------------------------------------------------------------------------------------------\n");
    					printf(" 平均分 |%38.2f\t%17.2f\t%9.2f\t%9.2f\n",aver[0],aver[1],aver[2],aver[3]);
    				}
    			if (0 == flag)
    				printf("该姓名不存在!\n");
    			break;
    		case 3:
    			return;
    		default:
    			printf("输入错误!请在1-3之间选择!\n");
    		}
    	}
    }
    
    
    /*修改学生信息函数*/
    void modify()
    {
    	int i,item,num=-1;
    	char s1[LEN+1],s2[LEN+1];//以姓名和学号最长长度+1为准
    	int score1;
    	printf("请输入需要修改的学生的学号:\n");
    	scanf("%s",s1);
    	for(i=0;i<n;i++)
    	{
    		if(strcmp(stu[i].ID,s1) == 0)
    		{
    			num = i;
    			printf("--------------------------\n");
    			printf("----1.修改姓名------------\n");
    			printf("----2.修改C语言成绩-------\n");
    			printf("----3.修改高等数学成绩----\n");
    			printf("----4.修改线性代数成绩----\n");
    			printf("----5.修改大学英语成绩----\n");
    			printf("----6.退出本菜单----------\n");
    			printf("--------------------------\n");
    			while(k)
    			{
    				printf("请选择子菜单编号:");
    				scanf("%d",&item);
    				switch (item)
    				{
    				case 1:
    					printf("请输入新的姓名:\n");
    					scanf("%s",s2);
    					strcpy(stu[num].name,s2);
    					break;
    				case 2:
    					printf("请输入新的C语言成绩:\n");
    					scanf("%d",&score1);
    					stu[num].score[0] = score1;
    					break;
    				case 3:
    					printf("请输入新的高等数学成绩:\n");
    					scanf("%d",&score1);
    					stu[num].score[1] = score1;
    					break;
    				case 4:
    					printf("请输入新的线性代数成绩:\n");
    					scanf("%d",&score1);
    					stu[num].score[2] = score1;
    					break;
    				case 5:
    					printf("请输入新的大学英语成绩:\n");
    					scanf("%d",&score1);
    					stu[num].score[3] = score1;
    				case 6:
    					return;
    				default:
    					printf("输入错误!请在1-6之间选择!\n");
    				}
    			}
    			printf("修改完毕!请及时保存!\n");
    		}
    		else
    		{
    			printf("没有该学生学号!!!");
    		}
    	}
    }
    
    
    /*统计个人总分函数*/
    int stu_total()    
    {	
    	for(int i=0;i<n;i++)
    	{
    		stu[i].total = 0;
    		for(int j=0;j<M;j++)
    		{
    			stu[i].total += stu[i].score[j];
    		}
    	}
    	return stu[i].total;
    }
    
    
    /*统计单科平均分函数*/
    float stu_aver()
    {
    	float total;
    	for(int j=0;j<M;j++)
    	{
    		total = 0;
    		for(int i=0;i<n;i++)
    		{
    			total += stu[i].score[j];
    		}
    		aver[j] = total/n;
    	}
    	return aver[j];
    }
    
    
    /*添加学生信息函数*/
    void insert()
    {
    	int i=0,j,m,flag;
    	printf("请输入待增加的学生数:\n");
    	scanf("%d",&m);
    	if(m>0)
    	{
    		do
    		{
    			flag = 1;
    			while(flag)
    			{
    				flag = 0;
    				printf("请输入第%d位学生的学号:\n",i+1);
    				scanf("%s",stu[i].ID);
    				for(j=0;j<i;j++)
    				{
    					if (strcmp(stu[i].ID,stu[j].ID) == 0)
    					{
    						printf("该学号已存在,请重新输入正确学号!\n");
    						flag = 1;
    						break;
    					}
    				}
    			}
    			printf("请输入第%d个学生的姓名:\n",i+1);
    			scanf("%s",stu[i].name);
    			printf("请输入第%d个学生的C语言成绩:\n",i+1);
    			scanf("%d",&stu[i].score[0]);
    			printf("请输入第%d个学生的高等数学成绩:\n",i+1);
    			scanf("%d",&stu[i].score[1]);
    			printf("请输入第%d个学生的线性代数成绩:\n",i+1);
    			scanf("%d",&stu[i].score[2]);
    			printf("请输入第%d个学生的大学英语成绩:\n",i+1);
    			scanf("%d",&stu[i].score[3]);
    			if (0 == flag)
    			{
    				i++;
    			}
    		}
    		while(i<n+m);
    	}
    	n+=m;
    	stu_aver();
    	stu_total();
    	
    	printf("学生信息增加完毕!!!\n");
    }
    
    
    /*删除学生信息函数*/
    void del()
    {
    	int i,j,flag=0;
    	char s1[LEN+1];
    	printf("请输入要删除的学生的学号:\n");
    	scanf("%s",s1);
    	for(i=0;i<n;i++)
    	{
    		if(strcmp(stu[i].ID,s1) == 0)
    		{
    			flag = 1;
    			//将要删除学生后面的学生往前移动一位
    			for(j=i;j<n-1;j++)
    			{
    				stu[j] = stu[j+1];
    			}
    		}
    	}
    	//查找失败
    	if (0 == flag)
    	{
    		printf("该学号不存在!!!\n");
    	}
    	//删除成功,学生人数减1
    	if (1 == flag)
    	{
    		printf("删除成功!!!\n");
    		n--;
    	}
    }
    
    
    /*显示全部数据信息函数*/
    void display()
    {
    	int i;
    	printf("共有%d位学生的信息:\n",n);
    	if(0 != n)
    	{
    		printf("\t| 学生学号 \t 学生姓名 \tC语言成绩 \t高等数学成绩\t线性代数成绩\t大学英语成绩\t  总分\n");
    		for(i=0;i<n;i++)
    		{
    			printf("--------|-----------------------------------------------------------------------------------------------------\n");
    			printf("\t|%-11s\t%-10s\t%5d\t%15d\t%15d\t%15d\t%13d\n",
    					stu[i].ID,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].score[3],stu[i].total);
    		}
    		printf("--------|-----------------------------------------------------------------------------------------------------\n");
    		printf(" 平均分 |%38.2f\t%17.2f\t%9.2f\t%9.2f\n",aver[0],aver[1],aver[2],aver[3]);
    	}
    }
    
    
    /*排序函数*/
    void sort()
    {
    	int i,item,num;
    	int flag = 1;
    	printf("------------------------------------\n");
    	printf("------------1.按学号排序------------\n");
    	printf("------------2.按单科排序------------\n");
    	printf("------------3.按总分排序------------\n");
    	printf("------------4.退出本菜单------------\n");
    	printf("------------------------------------\n");
    	while(k)
    	{
    		printf("请选择子菜单1编号:\n");
    		scanf("%d",&item);
    		switch(item)
    		{
    		case 1:
    			num = n;
    			while (num>0 && flag)
    			{
    				flag = 0;
    				for(i=1;i<num;i++)
    				{
    					if(strcmp(stu[i-1].ID,stu[i].ID)>0)
    					{
    						flag = 1;
    						temp[0] = stu[i-1];
    						stu[i-1] = stu[i];
    						stu[i] = temp[0];
    					}
    				}
    				num -= 1;
    			}
    			printf("排序成功!\n");		
    			break;
    		case 2:
    			printf("------------------------------------\n");
    			printf("------1.按C语言成绩排序-------------\n");
    			printf("------2.按高等数学成绩排序----------\n");
    			printf("------3.按线性代数成绩排序----------\n");
    			printf("------4.按大学英语成绩排序----------\n");
    			printf("------5.退出本菜单------------------\n");
    			printf("------------------------------------\n");
    			while(k)
    			{
    				printf("请选择子菜单2编号:\n");
    				scanf("%d",&item);
    				switch (item)
    				{
    				case 1:
    					num = n;
    					while (num>0 && flag)
    					{
    						flag = 0;
    						for(i=1;i<num;i++)
    						{
    							if(stu[i-1].score[0]<stu[i].score[0])
    							{
    								flag = 1;
    								temp[0] = stu[i-1];
    								stu[i-1] = stu[i];
    								stu[i] = temp[0];
    							}
    						}
    						num -=1;
    					}
    					printf("排序成功!\n");
    					break;
    				case 2:
    					num = n;
    					while (num>0 && flag)
    					{
    						flag =0;
    						for(i=1;i<num;i++)
    						{
    							if(stu[i-1].score[1]<stu[i].score[1])
    							{
    								flag =1;
    								temp[0] = stu[i-1];
    								stu[i-1] = stu[i];
    								stu[i] = temp[0];
    							}
    						}
    						num -=1;
    					}
    					printf("排序成功!\n");
    					break;
    				case 3:
    					num = n;
    					while (num>0 && flag)
    					{
    						flag = 0;
    						for(i=1;i<num;i++)
    						{
    							if(stu[i-1].score[2]<stu[i].score[2])
    							{
    								flag = 1;
    								temp[0] = stu[i-1];
    								stu[i-1] = stu[i];
    								stu[i] = temp[0];
    							}
    						}
    						num -= 1;
    					}
    					printf("排序成功!\n");
    					break;
    				case 4:
    					num = n;
    					while (num>0 && flag)
    					{
    						for(i=1;i<num;i++)
    						{
    							if(stu[i-1].score[3]<stu[i].score[3])
    							{
    								flag = 1;
    								temp[0] = stu[i-1];
    								stu[i-1] = stu[i];
    								stu[i] = temp[0];
    							}
    						}
    						num -= 1;
    					}
    					printf("排序成功!\n");
    					break;
    				case 5:
    					return;
    				default:
    					printf("输入错误!请在1-5之间选择!\n");
    				}
    			}
    		case 3:
    			num = n;
    			while (num>0 && flag)
    			{
    				flag = 0;
    				for(i=1;i<n;i++)
    				{
    					if(stu[i-1].total<stu[i].total)
    					{
    						temp[0] = stu[i-1];
    						stu[i-1] = stu[i];
    						stu[i] = temp[0];
    					}
    				}
    				num -= 1;
    			}
    			printf("排序成功!\n");
    			break;
    		case 4:
    			return;
    		default:
    			printf("输入错误!请在1-4之间选择!\n");
    		}
    	}
    	printf("排序成功!请及时查看并保存!\n");
    }
    
    
    /*保存文件函数*/
    void save()
    {
    	int i;
    	FILE *fp;
    	char filename[LEN+1];
    	printf("请输入要保存的文件名:\n");
    	scanf("%s",filename);
    	fp = fopen(filename,"w");
    	for(i=0;i<n;i++)
    	{
    		fprintf(fp,"%s  %s  %d  %d  %d  %d  %d  %f  %f  %f %f\n",
    			stu[i].ID,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].score[3],
    			stu[i].total,aver[0],aver[1],aver[2],aver[3]);
    	}
    	printf("保存成功!!!\n");
    	fclose(fp);
    }
    
    
    /*界面*/
    void menu()
    {
    	int num;
    	printf("\n                                                     \n");
    	printf("*******************************************************\n");
    	printf("*                   学生信息管理系统                  *\n");
    	printf("*******************************************************\n");
    	printf("**********************系统功能菜单*********************\n");
    	printf("*╔══════════════════════════════════════════════════╗ *\n");
    	printf("*╠══════════════════════════════════════════════════╣ *\n");
    	printf("*╠*0.系统帮助及说明  *          *1.读取已有学生信息*╣ *\n");
    	printf("*╠══════════════════════════════════════════════════╣ *\n");
    	printf("*╠*2.查询学生信息    *          *3.修改学生信息    *╣ *\n");
    	printf("*╠══════════════════════════════════════════════════╣ *\n");
    	printf("*╠*4.增加学生信息    *          *5.删除学生信息    *╣ *\n");
    	printf("*╠══════════════════════════════════════════════════╣ *\n");
    	printf("*╠*6.显示当前信息    *          *7.排序            *╣ *\n");
    	printf("*╠══════════════════════════════════════════════════╣ *\n");
    	printf("*╠*8.保存当前学生信息*          *9.退出系统        *╣ *\n");
    	printf("*╠══════════════════════════════════════════════════╣ *\n");
    	printf("*╚══════════════════════════════════════════════════╝ *\n");
    	printf("*******************************************************\n");
    	printf("请选择菜单编号:");
    	scanf("%d",&num);
    	switch (num)
    	{
    	case 0:
    		system("cls");
    		help();
    		system("pause");
    		break;
    	case 1:
    		system("cls");
    		flush();
    		system("pause");
    		break;
    	case 2:
    		system("cls");
    		seek();
    		system("pause");
    		break;
    	case 3:
    		system("cls");
    		modify();
    		system("pause");
    		break;
    	case 4:
    		system("cls");
    		insert();
    		system("pause");
    		break;
    	case 5:
    		system("cls");
    		del();
    		system("pause");
    		break;
    	case 6:
    		system("cls");
    		display();
    		system("pause");
    		break;
    	case 7:
    		system("cls");
    		sort();
    		system("pause");
    		break;
    	case 8:
    		system("cls");
    		save();
    		system("pause");
    		break;
    	case 9:
    		k = 0;
    		printf("即将退出程序!\n");
    		system("pause");
    		break;
    	default:
    		printf("输入错误!请在0-8之间选择\n");
    		system("pause");
    	}
    }
    

    `

    展开全文
  • C语言结构体版的学生成绩管理系统

    千次阅读 多人点赞 2020-02-13 21:04:23
    按5 删除学生信息 按6 插入学生信息 按7 排序总成绩信息 学生信息主要有姓名,班级,学号,C语言成绩,高数成绩,大学英语成绩,控制台界面输出格式有点不美观, #include<stdio.h> #include<string.h> ...

    结构体版的学生成绩管理系统
    主要功能有
    按1 输入学生信息
    按2 输出学生信息
    按3 查询学生信息
    按4 修改学生信息
    按5 删除学生信息
    按6 插入学生信息
    按7 排序总成绩信息
    学生信息主要有姓名,班级,学号,C语言成绩,高数成绩,大学英语成绩,控制台界面输出格式有点不美观,

    #include<stdio.h>
    #include<string.h>
    struct student
    {
         char name[20];//名字
      char sex[10];//性别
      int number;//学号
      char ban[20];//班级
      int c;//C语言成绩
      int gaoshu;//高数成绩
      int yingyu;//大学英语成绩
      int sum;//总成绩
    
    }stu[60];
    int n;//学生数量
    void menu()//菜单
    {
     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("***         按0 退出系统        ***\n");
     printf("***********************************\n");
    }
    void input()//学生信息的录入
    {
    	int i,j=1;
    	printf("\n         请输入总学生数量:");
    	scanf("%d",&n);
    	for(i=1;i<=n;i++)
    	{
            printf("       输入第%d个学生相关信息\n",j++);
        	printf("输入姓名\n");
    	    scanf("%s",stu[i].name);
         	getchar();
         	printf("输入性别\n");
         	scanf("%s",stu[i].sex);
    		printf("输入学号\n");
    		scanf("%d",&stu[i].number);
    		printf("输入班级\n");
    		scanf("%s",stu[i].ban);
    		printf("输入c语言成绩\n");
    		scanf("%d",&stu[i].c);
    		printf("输入高数成绩\n");
    		scanf("%d",&stu[i].gaoshu);
    		printf("输入大学英语成绩\n");
    		scanf("%d",&stu[i].yingyu);
    		stu[i].sum=stu[i].c+stu[i].gaoshu+stu[i].yingyu;
    		printf("该学生的总成绩:%d\n",stu[i].sum);
    		
    
    		
    
    	}
    }
    void output()//学生信息输出
    {
    	int i;
    	printf("----------学生信息的是----------\n");
    	if(n==0)printf("    ++++++这里没有信息++++++\n");
    	else for(i=1;i<=n;i++)
    	{
    		printf("名字:%2s",stu[i].name);
    		printf("性别:%2s",stu[i].sex);
    		printf("学号:%2d",stu[i].number);
    		printf("班级:%2s",stu[i].ban);
    		printf("c语言成绩:%2d\n",stu[i].c);
    		printf("高数成绩:%2d\n",stu[i].gaoshu);
    		printf("英语成绩:%2d\n",stu[i].yingyu);
    		stu[i].sum=stu[i].c+stu[i].gaoshu+stu[i].yingyu;
    		printf("该学生的总成绩:%d\n",stu[i].sum);
    	}
    
    }
    void search()//查询
    {
    	int num,i,t;
    	char a[20],k;
    	if(n!=0)
    	{
    		printf("选择查找条件(1:学号  2:名字)\n");
    	    scanf("%d",&t);
    		if(t==1)
    		{
    			printf("输入您要查找的学生的学号\n");
    	        scanf("%d",&num);
    			for(i=1;i<=n;i++)
    			{
    				if(stu[i].number==num)
    			 {
    				 printf("名字:%s",stu[i].name);
    		         printf("性别:%s",stu[i].sex);
    		         printf("学号:%d",stu[i].number);
    	        	 printf("班级:%s",stu[i].ban);
    		         printf("c语言成绩:%d\n",stu[i].c);
    				 printf("高数成绩:%d\n",stu[i].gaoshu);
    				 printf("英语成绩:%d\n",stu[i].yingyu);
    				 stu[i].sum=stu[i].c+stu[i].gaoshu+stu[i].yingyu;
    		         printf("该学生的总成绩:%d\n",stu[i].sum);
    				 break;
    			 }
    			} if(i>n) printf("您查找的信息不存在或者学号输入错误\n");
    		}
    		if(t==2)
    		{
    			printf("输入您要查找的学生的名字\n");
    			scanf("%s",a);
    			for(i=1;i<=n;i++)
    			{
    				k=strcmp(stu[i].name,a);
    				if(k==0)
    				{
    					printf("名字:%s",stu[i].name);
    		         printf("性别:%s",stu[i].sex);
    		         printf("学号:%d",stu[i].number);
    	        	 printf("班级:%s",stu[i].ban);
    		         printf("c语言成绩:%d\n",stu[i].c);
    				 printf("高数成绩:%d\n",stu[i].gaoshu);
    				 printf("英语成绩:%d\n",stu[i].yingyu);
    				 stu[i].sum=stu[i].c+stu[i].gaoshu+stu[i].yingyu;
    		         printf("该学生的总成绩:%d\n",stu[i].sum);
    				 break;
    
    				}
    			}if(i>n) printf("您查找的信息不存在或者学号输入错误\n");
    		}
    
    	}
    	else printf("对不起,这里没有学生信息\n");
    
    	
    
    }
    void change()//修改
    {
    	int num,i;
    	printf("输入您要修改的学生的学号\n");
    	scanf("%d",&num);
    	if(n==0) printf("    ++++++这里没有信息++++++\n");
    	else
    	{
    		for(i=1;i<=n;i++)
    		{
    			if(stu[i].number==num)
    			{
    				printf("您要修改的学生信息为\n");
    				printf("名字:%s",stu[i].name);
    		        printf("性别:%s",stu[i].sex);
    		        printf("学号:%d",stu[i].number);
    	        	printf("班级:%s",stu[i].ban);
    		        printf("c语言成绩:%d\n",stu[i].c);
    				printf("高数成绩:%d\n",stu[i].gaoshu);
    				printf("英语成绩:%d\n",stu[i].yingyu);
    				stu[i].sum=stu[i].c+stu[i].gaoshu+stu[i].yingyu;
    		        printf("该学生的总成绩:%d\n",stu[i].sum);
    				printf("\n");
    				break;
    
    			}
    			
    		}
    
    		if(i>n) printf("您查找的信息不存在或者学号输入错误\n");
    		else
    		{
             printf("输入姓名\n");
    	     scanf("%s",stu[i].name);
         	getchar();
         	printf("输入性别\n");
         	scanf("%s",stu[i].sex);
    		printf("输入学号\n");
    		scanf("%d",&stu[i].number);
    		printf("输入班级\n");
    		scanf("%s",stu[i].ban);
    		printf("输入c语言成绩\n");
    		scanf("%d",&stu[i].c);
    		printf("输入高数成绩\n");
    		scanf("%d",&stu[i].gaoshu);
    		printf("输入大学英语成绩\n");
    		scanf("%d",&stu[i].yingyu);
    		}
    	}
    }
    void del()//删除
    {
    	int i,j,e,num;
    	if(n!=0)
    	{
    		printf("     ****这是所有学生的信息****\n");
    		for(i=1;i<=n;i++)
    		{
    			printf("--------------------------*\n");
    			printf("名字:%s\n",stu[i].name);
    			printf("                          *\n");
    		    printf("性别:%s\n",stu[i].sex);
    			printf("                          *\n");
    		    printf("学号:%d\n",stu[i].number);
    			printf("                          *\n");
    		    printf("班级:%s\n",stu[i].ban);
    			printf("                          *\n");
    		    printf("c语言成绩:%d\n",stu[i].c);
    			printf("高数成绩:%d\n",stu[i].gaoshu);
    			printf("英语成绩:%d\n",stu[i].yingyu);
    			stu[i].sum=stu[i].c+stu[i].gaoshu+stu[i].yingyu;
    		    printf("该学生的总成绩:%d\n",stu[i].sum);
    			printf("--------------------------*\n");
    		}
    		printf("请输入您要删除的学生的学号:");
    		scanf("%d",&num);
    		for(i=1;i<=n;i++)
    			if(stu[i].number==num)
    			{
    				j=i;
    				for(e=i-1;e<n;e++,j++)
    				{
    					strcpy(stu[j].name,stu[j+1].name);
    					strcpy(stu[j].sex,stu[j+1].sex);
    					stu[j].number=stu[j+1].number;
    					strcpy(stu[j].ban,stu[j+1].ban);
    					stu[j].c=stu[j+1].c;
    					stu[j].gaoshu=stu[j+1].gaoshu;
    					stu[j].yingyu=stu[j+1].yingyu;
    					n--;
    					}
    				}printf("**********该学生信息已删除**********\n");
    
    		}
    		else printf("对不起,这里没有学生信息\n");
    
    		
    		
    		
    }
    void add()//插入
    {
    	int i,j,t;
    	if(n!=0)
    	{
    		printf("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n");
    		printf("^   注: 下面已有信息,如有重复请不要插入  ^\n");
    		printf("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n");
    		printf("\n");
    		for(i=1;i<=n;i++)
    		{
    			
    		        printf("名字:%s",stu[i].name);
    		        printf("性别:%s",stu[i].sex);
    		        printf("学号:%d",stu[i].number);
    		        printf("班级:%s",stu[i].ban);
    		        printf("c语言成绩:%d\n",stu[i].c);
    				printf("高数成绩:%d\n",stu[i].gaoshu);
    			    printf("英语成绩:%d\n",stu[i].yingyu);
    			    stu[i].sum=stu[i].c+stu[i].gaoshu+stu[i].yingyu;
    		        printf("该学生的总成绩:%d\n",stu[i].sum);
    				printf("\n");
    			}
    			printf("是否继续插入(是:y   否:n)\n");
    			printf("%c您的选择是:",t=getchar());
    			t=getchar();
    			if(t=='y')
    			{
    				j=n;
    				printf("**********请插入学生相关信息**********\n");
    		          printf("输入姓名\n");
    	               scanf("%s",stu[j+1].name);
    				getchar();
         	          printf("输入性别\n");
         	          scanf("%s",stu[j+1].sex);
    		          printf("输入学号\n");
    		          scanf("%d",&stu[j+1].number);
    		          printf("输入班级\n");
    		          scanf("%s",stu[j+1].ban);
    		          printf("输入c语言成绩\n");
    		          scanf("%d",&stu[j+1].c);
    				  printf("输入高数成绩\n");
    		          scanf("%d",&stu[j+1].gaoshu);
    				  printf("输入英语成绩\n");
    		          scanf("%d",&stu[j+1].yingyu);
    				strcpy(stu[j+2].name,stu[j+1].name);
    				strcpy(stu[j+2].sex,stu[j+1].sex);
    				stu[j+2].number=stu[j+1].number;
    				strcpy(stu[j+2].ban,stu[j+1].ban);
    				stu[j+2].c=stu[j+1].c;
    				stu[j+2].gaoshu=stu[j+1].gaoshu;
    				stu[j+2].yingyu=stu[j+1].yingyu;
    				printf("           该学生信息已经插入\n");
    				n++;
    				}else printf("\n   (▔▽▔)插入程序结束,请重新选择");printf("\n");
    		
    		}
    	else{i=1;printf("请输入要插入学生的相关信息\n");
    		           printf("输入姓名\n");
    	    scanf("%s",stu[i].name);
         	getchar();
         	printf("输入性别\n");
         	scanf("%s",stu[i].sex);
    		printf("输入学号\n");
    		scanf("%d",&stu[i].number);
    		printf("输入班级\n");
    		scanf("%s",stu[i].ban);
    		printf("输入c语言成绩\n");
    		scanf("%d",&stu[i].c);
    		printf("输入高数成绩\n");
    		scanf("%d",&stu[i].gaoshu);
    	    printf("输入英语成绩\n");
    		scanf("%d",&stu[i].yingyu);
    		n++;
    	
    	}
    		
    }
    void paixu()
    {
    	int i,j,t;
    if(n!=0)
    {
    	printf("该排序是按照总分成绩从高到低进行排序\n");
            for(i=1;i<=n;i++)
               for(j=1;j<n;j++)
    		   {	
                     if(stu[j].sum<stu[j+1].sum)
                      {
                           t=stu[j].sum;
                           stu[j].sum=stu[j+1].sum;
                           stu[j+1].sum=t;
                       }
        }
        for(i=1;i<=n;i++)
        {
            printf("名字:%s\n",stu[i].name);
    		printf("性别:%s\n",stu[i].sex);
    		printf("学号:%d\n",stu[i].number);
    		printf("班级:%s\n",stu[i].ban);
    		printf("c语言成绩:%d\n",stu[i].c);
    		printf("高数成绩:%d\n",stu[i].gaoshu);		
    		printf("总成绩:%d\n",stu[i].sum);
        }
       
    }
    else printf("    ++++++这里没有信息++++++\n");
    }
    void main()
    {
     int a,b=1;
     while(b)
     {
      menu();
      printf("您选择的是: ");
      scanf("%d",&a);
      printf("\n");
      switch(a)
      {
      case 1:input();break;//输入
      case 2:output();break;//输出
      case 3:search();break;//查找
      case 4:change();break;//修改
      case 5:del();break;//删除
      case 6:add();break;//插入
      case 7:paixu();break;//排序
      case 0:b=0;break;//退出
      }
     }
     printf("       学生管理系统已退出( ^_^ )\n");
    }
    
    
    
    展开全文
  • 通过使用“学生管理系统”,可以更加有效地对学生实现管理,完成对学生基本信息以及成绩信息的文件保存,具有信息的增加,删除、查询以及修改等功能,能提供简单的数据统计、分析信息。 二、整体设计 学生管理系统 ...

    一、需求分析
    通过使用“学生管理系统”,可以更加有效地对学生实现管理,完成对学生基本信息以及成绩信息的文件保存,具有信息的增加删除查询以及修改等功能,能提供简单的数据统计分析信息

    二、整体设计
    学生管理系统 主要由两大功能模块组成,分别是是“学生档案管理”和“学生成绩管理“两个子系统。整体模块架构如下:
    在这里插入图片描述
    三、详细设计

    学生档案管理子系统

    • 用户选择

      进入“学生档案管理”子系统,显示该子系统菜单,用户分别可选择:录入数据、查询数据、修改数据、删除数据、增加数据、统计分析、退出系统等功能。

    • 录入数据

      主要实现函数为 readin_record( ) ,能引导用户输入学生人数,依次录入每个学生的学号、姓名、性别、出生日期、班级、生源地(具体到省、自治区和直辖市)等信息。采用结构体Stu_record数据类型保存学生档案信息。结构体中含有学号、姓名、性别、出生日期、班级、生源地(具体到省、自治区和直辖市)共六项信息。
      数据存储由链表实现,读入数据完成后,按学号排序输出,并将其保存在磁盘文件Tdata_new.txt中。

    • 查询数据

      采用函数menu3_inquire_record ()。设置查询菜单,分为按学号查询id_inquiry_record()、按姓名查询name_inquiry_record()、按班级查询clas_inquiry_record()、按生源地查询syd_inquiry_record()、多条件组合查询(班级与生源地组合查询)clasSyd_inquiry_record()、全部显示search()、退出查询等功能。

    • 修改数据

      采用函数modify_record()。用户输入修改学生的学号,系统显示该生信息。用switch case语句设置修改选项,选择修改学号、姓名、性别、出生日期、班级、生源地、修改全部、保存并退出修改等。在磁盘文件Tdata_new.txt中修改相应信息。

    • 删除数据

      采用函数delete_record()。用户输入删除学生的学号,删除前系统提示用户再次确认是否删除。注意需要在学生成绩管理系统同步删除该生信息。

    • 增加数据

      采用函数add_record()。引导用户输入增加学生的学号、姓名、性别、出生日期、班级、生源地信息,更新磁盘文件。

    • 统计分析

      采用函数statistics_record()。显示各生源地的人数以及所占百分比。

    学生成绩管理子系统

    • 用户选择

      进入“学生成绩管理”子系统,显示该子系统菜单,用户分别可选择:录入数据、查询数据、修改数据、删除数据、增加数据、统计分析、退出系统等功能。

    • 录入数据

      主要实现函数为 readin_score ( ) ,能引导用户输入学生人数,依次录入每个学生的学号、姓名、班级、课程成绩等信息。采用结构体Stu_score数据类型保存学生成绩信息。结构体中含有学号、姓名、班级、课程数据,其中课程数据包括3门课程的成绩以及平均成绩。
      读入数据完成后,根据用户输入的3门课程成绩自动计算平均分avg, 将所有数据保存在磁盘文件Tscore_new.txt中。

    • 查询数据

      采用函数inquiry_score()。设置查询菜单,分为按学号查询id_inquiry_score()、按姓名查询name_inquiry_score()、按班级查询clas_inquiry_score()、退出查询等功能。

    • 修改数据

      采用函数modify_ score ()。用户输入修改学生的学号,系统显示该生信息。用switch case语句设置修改选项,选择修改学号、姓名、班级、课程1成绩、课程2成绩、课程3成绩、保存并退出修改等。在磁盘文件Tscore_new.txt中修改相应信息。

    • 删除数据

      采用函数delete_ score ()。用户输入删除学生的学号,删除前系统提示用户再次确认是否删除。注意需要在学生档案管理系统同步删除该生信息。

    • 增加数据

      采用函数add_ score ()。引导用户输入增加学生的学号、姓名、班级、课程1成绩、课程2成绩和课程3成绩。系统自动计算平均分。更新磁盘文件。

    • 统计分析

      采用函数menu3_statistics_score ()。设置统计分析菜单,分为按学生分析和按课程分析。若用户选择按学生分析stu_statistics_score(),该函数统计输出有不及格课程的学生的人数和其所占百分比。若用户选择按课程分析course_statistics_score(),该函数分析并输出每门课程的最高分、最低分、平均分。

    四、代码实现
    文件 main.c

    #include<stdio.h>
    #include<string.h>
    #include <stdlib.h>
    #include<stdio.h>
    #include<malloc.h>
    #include"student.h"
    
    /*函数声明*/
    void menu1();
    void menu2_record();
    void menu2_score();
    int main()
    {
        while(1)
    	{
    		int n;
    		menu1();
    		printf("请输入您的选择:\n");
    		scanf("%d",&n);
    		switch (n)
    		{
    			case 1: menu2_record() ;break;
    			case 2: menu2_score() ;break;
    			case 0: return 0;
    			default: printf("您的选择错误,请重新输入。\n");
    		}
    		system("pause");
    		system("cls");
    	}
        return 0;
    }
    
    

    文件 student.h

    #include<stdio.h>
    #include<string.h>
    #include <stdlib.h>
    #include<stdio.h>
    #include<malloc.h>
    
    struct Date
    {
        int year;
        int month;
        int day;
    };
    enum Depart {sdjinan,sdqingdao,sdyantai,sdweifang,sdheze,sddezhou,sdbinzhou,sdweihai};
    struct Stu_record
    {
        int id;
        char name[20];
        char sex[10];
        struct Date birth;
        int clas;
        enum Depart syd;
        struct Stu_record *next;
    };
    struct Stu_record *head = NULL;
    
    struct Stu_score
    {
        int id;
        char name[20];
        int clas;
        double course1;
        double course2;
        double course3;
        double avg;
        struct Stu_score *next;
    };
    /*函数声明*/
    struct Stu_record *readin_record();
    void menu3_inquire_record();
    void id_inquiry_record(struct Stu_record *head);
    void name_inquiry_record(struct Stu_record *head);
    void clas_inquiry_record(struct Stu_record *head);
    void syd_inquiry_record(struct Stu_record *head);
    void clasSyd_inquiry_record(struct Stu_record *head);
    void modify_record(struct Stu_record *head);
    struct Stu_record *delete_record(struct Stu_record *head);
    struct Stu_record *add_record(struct Stu_record *head);
    void statistics_record(struct Stu_record *head);
    
    struct Stu_score *readin_score();
    void menu3_inquire_score();
    void id_inquiry_score(struct Stu_score *head);
    void name_inquiry_score(struct Stu_score *head);
    void clas_inquiry_score(struct Stu_score *head);
    void modify_score(struct Stu_score *head) ;
    struct Stu_score *delete_score(struct Stu_score *head) ;
    struct Stu_score *add_score(struct Stu_score *head) ;
    void menu3_statistics_score();
    void stu_statistics_score(struct Stu_score *head);
    void course_statistics_score(struct Stu_score *head);
    /********** 公共函数 **********/
    struct Stu_record *insert(struct Stu_record *head, struct Stu_record *stu)
    {
        struct Stu_record *p1, *p2;
        if (stu == NULL)
        {
            printf("请按照学号、姓名、性别、出生日期(如1999 9 9)、班级、生源地\n(0:山东济南 1:山东青岛 2:山东烟台 3:山东潍坊 4:山东菏泽 5:山东德州 6:山东滨州 7:山东威海)顺序输入\n");
            stu = (struct Stu_record *) malloc(sizeof(struct Stu_record));
            while (!scanf("%d %s %s %d %d %d %d %d", &stu->id, stu->name, stu->sex, &stu->birth.year, &stu->birth.month,&stu->birth.day,&stu->clas, &stu->syd))
            {
                printf("输入信息有误,请重新输入\n");
                fflush(stdin);
            }
        }
        if (head == NULL)
        {
            head = stu;
            head->next = NULL;
        }
        else
        {
            p1 = p2 = head;
            while (stu->id > p1->id && p1->next != NULL)
            {
                p2 = p1;
                p1 = p1->next;
            }
            if (p2 == p1)
            {
                if (stu->id < p2->id)
                {
                    head = stu;
                    stu->next = p2;
                }
                else
                {
                    p2->next = stu;
                    stu->next = NULL;
                }
            }
            else
            {
                if (stu->id < p1->id)
                {
                    p2->next = stu;
                    stu->next = p1;
                }
                else
                {
                    p1->next = stu;
                    stu->next = NULL;
                }
            }
        }
        return(head);
    }
    struct Stu_score *sinsert(struct Stu_score *head, struct Stu_score *stu)
    {
    
        struct Stu_score *p1, *p2;
        if (stu == NULL)
        {
    
            printf("请按照学号、姓名、班级、课程1、课程2、课程3 顺序输入\n");
            stu = (struct Stu_score *) malloc(sizeof(struct Stu_score));
            while (!scanf("%d %s %d %lf %lf %lf", &stu->id, stu->name, &stu->clas, &stu->course1, &stu->course2,&stu->course3))
            {
                printf("输入信息有误,请重新输入\n");
                fflush(stdin);
            }
    
            stu->avg=(stu->course1+stu->course2+stu->course3)/3.0;
        }
        if (head == NULL)
        {
            head = stu;
            head->next = NULL;
        }
        else
        {
            p1 = p2 = head;
            while (stu->id > p1->id && p1->next != NULL)
            {
                p2 = p1;
                p1 = p1->next;
            }
            if (p2 == p1)
            {
                if (stu->id < p2->id)
                {
                    head = stu;
                    stu->next = p2;
                }
                else
                {
                    p2->next = stu;
                    stu->next = NULL;
                }
            }
            else
            {
                if (stu->id < p1->id)
                {
                    p2->next = stu;
                    stu->next = p1;
                }
                else
                {
                    p1->next = stu;
                    stu->next = NULL;
                }
            }
        }
        return(head);
    }
    void search(struct Stu_record *head)
    {
        struct Stu_record *p1;
        if (head == NULL)
        {
            printf("没有学生信息,结束查询\n");
            return;
        }
        p1 = head;
        printf("  学号   姓名    性别    出生日期       班级    生源地  \n");
        printf("———————————————————————————\n");
        while (p1 != NULL)
        {
            printf("%-7d  %-4s  %-6s  %-4d年%-2d月%-2d日   %-6d  %-6d\n", p1->id, p1->name, p1->sex, p1->birth.year, p1->birth.month, p1->birth.day, p1->clas, p1->syd);
            p1 = p1->next;
        }
        printf("\n");
    }
    void ssearch(struct Stu_score *head)
    {
        struct Stu_score *p1;
        if (head == NULL)
        {
            printf("没有学生信息,结束查询\n");
            return;
        }
        p1 = head;
        printf("  学号   姓名   班级    课程1     课程2    课程3    平均分  \n");
        printf("—————————————————————————————————\n");
        while (p1 != NULL)
        {
            printf("%-7d %-7s %-7d %-5.2lf    %-5.2lf    %-5.2lf   %-5.2lf\n", p1->id, p1->name, p1->clas, p1->course1, p1->course2, p1->course3, p1->avg);
            p1 = p1->next;
        }
        printf("\n");
    }
    /*** 一堆menu函数的定义 ***/
    void menu1()
    {
    
        printf("                                                       \n");
        printf("               欢迎进入学生管理系统                    \n");
        printf("-------------------------------------------------------\n");
        printf("                                                       \n");
        printf("*************StudentInformationManagement**************\n");
        printf("*                                                     *\n");
        printf("*\t\t1.进入学生档案管理子系统              *\n");
        printf("*                                                     *\n");
        printf("*\t\t2.进入学生成绩管理子系统              *\n");
        printf("*                                                     *\n");
        printf("*\t\t0.退出系统                            *\n");
        printf("*                                                     *\n");
        printf("*******************************************************\n\n");
    
    }
    void menu2_record()
    {
        while(1)
        {
            int n;
            printf("********学生档案管理*********\n");
            printf("*                           *\n");
            printf("*\t1.录入数据          *\n");
            printf("*\t2.查询数据          *\n");
            printf("*\t3.修改数据          *\n");
            printf("*\t4.删除数据          *\n");
            printf("*\t5.增加数据          *\n");
            printf("*\t6.统计分析          *\n");
            printf("*\t0.退出系统          *\n");
            printf("*                           *\n");
            printf("*****************************\n\n");
    
            printf("请输入您的选择:\n");
            scanf("%d",&n);
            switch (n)
            {
            case 1:
                readin_record() ;
                break;
            case 2:
                menu3_inquire_record() ;
                break;
            case 3:
                modify_record(head) ;
                break;
            case 4:
                delete_record(head) ;
                break;
            case 5:
                head=add_record(head);
                search(head);
                break;
            case 6:
                statistics_record(head) ;
                break;
            case 0:
                return;
            default:
                printf("您的选择错误,请重新输入。\n");
            }
            system("pause");
            system("cls");
        }
    }
    void menu2_score()
    {
        while(1)
        {
            int n;
            printf("********学生成绩管理*********\n");
            printf("*                           *\n");
            printf("*\t1.录入数据          *\n");
            printf("*\t2.查询数据          *\n");
            printf("*\t3.修改数据          *\n");
            printf("*\t4.删除数据          *\n");
            printf("*\t5.增加数据          *\n");
            printf("*\t6.统计分析          *\n");
            printf("*\t0.退出系统          *\n");
            printf("*                           *\n");
            printf("*****************************\n\n");
    
            printf("请输入您的选择:\n");
            scanf("%d",&n);
            switch (n)
            {
            case 1:
                readin_score() ;
                break;
            case 2:
                menu3_inquire_score();
                break;
            case 3:
                modify_score(head);
                break;
            case 4:
                delete_score(head);
                break;
            case 5:
                head=add_score(head);
                ssearch(head);
                break;
            case 6:
                menu3_statistics_score() ;
                break;
            case 0:
                return;
            default:
                printf("您的选择错误,请重新输入。\n");
            }
            system("pause");
            system("cls");
        }
    }
    void menu3_inquire_record()
    {
        while(1)
        {
            int n;
            printf("************查询菜单*************\n");
            printf("*                               *\n");
            printf("*\t1.按学号查询            *\n");
            printf("*\t2.按姓名查询            *\n");
            printf("*\t3.按班级查询            *\n");
            printf("*\t4.按生源地查询          *\n");
            printf("*\t5.多条件组合查询        *\n");
            printf("*\t6.全部显示              *\n");
            printf("*\t0.退出查询              *\n");
            printf("*                               *\n");
            printf("*********************************\n\n");
    
            printf("请输入您的选择:\n");
            scanf("%d",&n);
            switch (n)
            {
            case 1:
                id_inquiry_record(head);
                break;
            case 2:
                name_inquiry_record(head) ;
                break;
            case 3:
                clas_inquiry_record(head) ;
                break;
            case 4:
                syd_inquiry_record(head) ;
                break;
            case 5:
                clasSyd_inquiry_record(head) ;
                break;
            case 6:
                search(head);
                break;
            case 0:
                return;
            default:
                printf("您的选择错误,请重新输入。\n");
            }
            system("pause");
            system("cls");
        }
    
    }
    void menu3_inquire_score()
    {
        while(1)
        {
            int n;
            printf("************查询菜单*************\n");
            printf("*                               *\n");
            printf("*\t1.按学号查询            *\n");
            printf("*\t2.按姓名查询            *\n");
            printf("*\t3.按班级查询            *\n");
            printf("*\t4.全部显示              *\n");
            printf("*\t0.退出查询              *\n");
            printf("*                               *\n");
            printf("*********************************\n\n");
    
            printf("请输入您的选择:\n");
            scanf("%d",&n);
            switch (n)
            {
            case 1:
                id_inquiry_score(head);
                break;
            case 2:
                name_inquiry_score(head) ;
                break;
            case 3:
                clas_inquiry_score(head) ;
                break;
            case 4:
                ssearch(head);
                break;
            case 0:
                return;
            default:
                printf("您的选择错误,请重新输入。\n");
            }
            system("pause");
            system("cls");
        }
    }
    void menu3_statistics_score()
    {
         while(1)
        {
            int n;
            printf("************统计分析*************\n");
            printf("*                               *\n");
            printf("*\t1.按学生分析            *\n");
            printf("*\t2.按课程分析            *\n");
            printf("*\t0.退出统计分析          *\n");
            printf("*                               *\n");
            printf("*********************************\n\n");
    
            printf("请输入您的选择:\n");
            scanf("%d",&n);
            switch (n)
            {
            case 1:
                stu_statistics_score(head);
                break;
            case 2:
                course_statistics_score(head) ;
                break;
            case 0:
                return;
            default:
                printf("您的选择错误,请重新输入。\n");
            }
            system("pause");
            system("cls");
        }
    }
    /****** record中函数 ******/
    struct Stu_record *readin_record()
    {
        struct Stu_record *p2,*p1;
        int n,i;
        head=NULL;
        FILE *w;
        if ((w = fopen("C:\\Desktop\\Tdata_new.txt", "wb+")) == NULL)
        {
            printf("cannot open file\n");
            exit(1);
        }
    
        printf("请输入学生人数: \n");
        scanf("%d",&n);
        head=p2=p1=(struct Stu_record *) malloc(sizeof(struct Stu_record));								//开辟内存,用于生成链表
        printf("学生个数为:%d个,请按照以下顺序输入\n", n);							//对学生总数的提示,并且提示每个学生信息的输入顺序
        printf("学号、姓名、性别、出生日期(如1999 9 9)、班级、生源地\n(0:山东济南 1:山东青岛 2:山东烟台 3:山东潍坊 4:山东菏泽 5:山东德州 6:山东滨州 7:山东威海)\n");	//每个学生信息的输入顺序
        for (i = 0; i < n; i++)
        {
            while (!scanf("%d %s %s %d %d %d %d %d", &p2->id, p2->name, p2->sex, &p2->birth.year, &p2->birth.month,&p2->birth.day,&p2->clas, &p2->syd))
            {
                printf("输入有误,请重新输入该学生信息\n   ");
                fflush(stdin);
            }
            if (n == 1)
            {
                p2->next = NULL;
            }
            else
            {
                head = insert(head, p2);
                p2 = (struct Student *) malloc(sizeof(struct Stu_record));
            }
        }
        p1=head;
        while(p1!=NULL)
        {
            fprintf(w,"%d %s %s %d %d %d %d %d\n", p1->id, p1->name, p1->sex, p1->birth.year, p1->birth.month,p1->birth.day,p1->clas, p1->syd);
            p1= p1->next;
        }
        fclose(w);
        printf("成功录入%d名学生信息,学生信息已经按学号从小到大排列,信息如下: \n\n",n);
        search(head);
        return head;
    }
    void id_inquiry_record(struct Stu_record *head)
    {
        int cho, t = 1;
        int num;
        struct Stu_record *p1;
        if (head == NULL)
        {
            printf("没有学生信息,结束查询\n");
            return;
        }
        p1 = head;
        do
        {
            p1 = head;
            if ( t == 1)
            {
                printf("请输入需要查询的学生学号: ");
                while (!scanf("%d", &num))
                {
                    printf("输入有误,请重新输入: ");
                    fflush(stdin);
                }
                t = 1;
            }
            else
            {
                cho = 2;
            }
            while (p1->id != num)
            {
                if (p1->next == NULL)
                    break;
                p1 = p1->next;
            }
            if (p1->id == num)
            {
                printf("  学号   姓名    性别    出生日期       班级    生源地  \n");
                printf("———————————————————————————\n");
                printf("%-7d  %-4s  %-6s  %-4d年%-2d月%-2d日   %-6d  %-6d\n", p1->id, p1->name, p1->sex, p1->birth.year, p1->birth.month, p1->birth.day, p1->clas, p1->syd);
            }
            else
            {
                printf("找不到该学生\n");
            }
            if (t == 1)
            {
                printf("1.继续查询\n");
                printf("2.结束查询\n");
                printf("请选择: ");
                while (!scanf("%d", &cho))
                {
                    printf("输入序号有误,请重新输入: ");
                    fflush(stdin);
                }
            }
        }
        while(cho==1);
    }
    void name_inquiry_record(struct Stu_record *head)
    {
        int cho, t = 1;
        char qname[20];
        struct Stu_record *p1;
        if (head == NULL)
        {
            printf("没有学生信息,结束查询\n");
            return;
        }
        p1 = head;
        do
        {
            p1 = head;
            if ( t == 1)
            {
                printf("请输入需要查询的学生姓名: ");
                while (!scanf("%s", qname))
                {
                    printf("输入有误,请重新输入: ");
                    fflush(stdin);
                }
                t = 1;
            }
            else
            {
                cho = 2;
            }
            while (strcmp(p1->name,qname)!=0)
            {
                if (p1->next == NULL)
                    break;
                p1 = p1->next;
            }
            if (strcmp(p1->name,qname)==0)
            {
                printf("  学号   姓名    性别    出生日期       班级    生源地  \n");
                printf("———————————————————————————\n");
                printf("%-7d  %-4s  %-6s  %-4d年%-2d月%-2d日   %-6d  %-6d\n", p1->id, p1->name, p1->sex, p1->birth.year, p1->birth.month, p1->birth.day, p1->clas, p1->syd);
            }
            else
            {
                printf("找不到该学生\n");
            }
            if (t == 1)
            {
                printf("1.继续查询\n");
                printf("2.结束查询\n");
                printf("请选择: ");
                while (!scanf("%d", &cho))
                {
                    printf("输入序号有误,请重新输入: ");
                    fflush(stdin);
                }
            }
        }
        while(cho==1);
    }
    void clas_inquiry_record(struct Stu_record *head)
    {
        int cho, t = 1;
        struct Stu_record *p1;
        int qclas;
        if (head == NULL)
        {
            printf("没有学生信息,结束查询\n");
            return;
        }
        p1 = head;
        do
        {
            p1 = head;
            if (t == 1)
            {
                printf("请输入需要查询的学生班级: ");
                while (!scanf("%d", &qclas))
                {
                    printf("输入有误,请重新输入: ");
                    fflush(stdin);
                }
                t = 1;
            }
            else
            {
                cho = 2;
            }
            while (p1->clas != qclas)
            {
                if (p1->next == NULL)
                    break;
                p1 = p1->next;
            }
            if (p1->clas == qclas)
            {
                printf("  学号   姓名    性别    出生日期       班级    生源地  \n");
                printf("———————————————————————————\n");
                printf("%-7d  %-4s  %-6s  %-4d年%-2d月%-2d日   %-6d  %-6d\n", p1->id, p1->name, p1->sex, p1->birth.year, p1->birth.month, p1->birth.day, p1->clas, p1->syd);
            }
            else
            {
                printf("找不到该学生\n");
            }
            if (t == 1)
            {
                printf("1.继续查询\n");
                printf("2.结束查询\n");
                printf("请选择: ");
                while (!scanf("%d", &cho))
                {
                    printf("输入序号有误,请重新输入: ");
                    fflush(stdin);
                }
            }
        }
        while(cho==1);
    
    }
    void syd_inquiry_record(struct Stu_record *head)
    {
        int cho,t = 1;
        struct Stu_record *p1;
        int qsyd;
        if (head == NULL)
        {
            printf("没有学生信息,结束查询\n");
            return;
        }
        p1 = head;
        do
        {
            p1 = head;
            if ( t == 1)
            {
                printf("请输入需要查询的学生生源地: ");
                printf("(0:山东济南 1:山东青岛 2:山东烟台 3:山东潍坊 4:山东菏泽 5:山东德州 6:山东滨州 7:山东威海)\n");
                while (!scanf("%d", &qsyd))
                {
                    printf("输入有误,请重新输入: ");
                    fflush(stdin);
                }
                t = 1;
            }
            else
            {
                cho = 2;
            }
            while (p1->syd != qsyd)
            {
                if (p1->next == NULL)
                    break;
                p1 = p1->next;
            }
            if (p1->syd == qsyd)
            {
                printf("  学号   姓名    性别    出生日期       班级    生源地  \n");
                printf("———————————————————————————\n");
                printf("%-7d  %-4s  %-6s  %-4d年%-2d月%-2d日   %-6d  %-6d\n", p1->id, p1->name, p1->sex, p1->birth.year, p1->birth.month, p1->birth.day, p1->clas, p1->syd);
            }
            else
            {
                printf("找不到该学生\n");
            }
            if (t == 1)
            {
                printf("1.继续查询\n");
                printf("2.结束查询\n");
                printf("请选择: ");
                while (!scanf("%d", &cho))
                {
                    printf("输入序号有误,请重新输入: ");
                    fflush(stdin);
                }
            }
        }
        while(cho==1);
    
    }
    void clasSyd_inquiry_record(struct Stu_record *head)
    {
        int cho, t = 1;
        struct Stu_record *p1;
        int qsyd,qclas;
        if (head == NULL)
        {
            printf("没有学生信息,结束查询\n");
            return;
        }
        p1 = head;
        do
        {
            p1 = head;
            if ( t == 1)
            {
                printf("请输入需要查询的学生生源地: ");
                while (!scanf("%d", &qsyd))
                {
                    printf("输入有误,请重新输入: ");
                    fflush(stdin);
                }
                printf("请输入需要查询的学生班级: ");
                while (!scanf("%d", &qclas))
                {
                    printf("输入有误,请重新输入: ");
                    fflush(stdin);
                }
                t = 1;
            }
            else
            {
                cho = 2;
            }
            while (p1->syd != qsyd||p1->clas != qclas)
            {
                if (p1->next == NULL)
                    break;
                p1 = p1->next;
            }
            if (p1->syd == qsyd&&p1->clas == qclas)
            {
                printf("  学号   姓名    性别    出生日期       班级    生源地  \n");
                printf("———————————————————————————\n");
                printf("%-7d  %-4s  %-6s  %-4d年%-2d月%-2d日   %-6d  %-6d\n", p1->id, p1->name, p1->sex, p1->birth.year, p1->birth.month, p1->birth.day, p1->clas, p1->syd);
            }
            else
            {
                printf("找不到该学生\n");
            }
            if (t == 1)
            {
                printf("1.继续查询\n");
                printf("2.结束查询\n");
                printf("请选择: ");
                while (!scanf("%d", &cho))
                {
                    printf("输入序号有误,请重新输入: ");
                    fflush(stdin);
                }
            }
        }
        while(cho==1);
    
    }
    void modify_record(struct Stu_record *head)
    {
        struct Stu_record *p1, *p2;
        int num,cho,k=1,l=0;
        FILE *w;
    
        if (head == NULL)
        {
            printf("没有学生信息,结束修改\n   ");
            system("pause");
            return;
        }
        printf("请输入需要修改的学生学号: ");
        while (!scanf("%d",&num))
        {
            printf("输入学号有误,请重新输入: ");
            fflush(stdin);
        }
        do
        {
            p2 = p1 = head;
            while (p1->id != num)
            {
                if (p1->next == NULL)
                    break;
                p2 = p1;
                p1 = p1->next;
            }
            if (p1->id == num)
            {
                printf("已找到该学生,该学生的信息为: \n");
                printf("生源地(0:山东济南 1:山东青岛 2:山东烟台 3:山东潍坊 4:山东菏泽 5:山东德州 6:山东滨州 7:山东威海)\n");
                printf("学号   姓名    性别    出生日期       班级    生源地  \n");
                printf("———————————————————————————\n");
                printf("%-7d  %-4s  %-6s  %-4d年%-2d月%-2d日   %-6d  %-6d\n", p1->id, p1->name, p1->sex, p1->birth.year, p1->birth.month, p1->birth.day, p1->clas, p1->syd);
                l = 0;
                do
                {
                    if (l == 0)
                        printf("\n选择修改的内容\n");
                    else
                        printf("序号输入错误,请重新选择\n");
                    l = 1;
                    printf("   1.学号\n");
                    printf("   2.姓名\n");
                    printf("   3.性别\n");
                    printf("   4.出生日期\n");
                    printf("   5.班级\n");
                    printf("   6.生源地\n");
                    printf("   7.全部\n");
                    printf("请选择序号: ");
                    fflush(stdin);
                    while (!scanf("%d", &cho))
                    {
                        printf("输入序号有误,请重新输入: ");
                        fflush(stdin);
                    }
                }
                while (cho > 7 || cho < 1);
                switch (cho)
                {
                case 1:
                {
                    printf("请输入该学生改正的学号信息: ");
                    while (!scanf("%d", &p1->id))
                    {
                        printf("输入改正信息有误,请重新输入: ");
                        fflush(stdin);
                    }
                    break;
                }
                case 2:
                {
                    printf("请输入该学生改正的姓名信息: ");
                    while (!scanf("%s", p1->name))
                    {
                        printf("输入改正信息有误,请重新输入: ");
                        fflush(stdin);
                    }
                    break;
                }
                case 3:
                {
                    printf("请输入该学生改正的性别信息: ");
                    while (!scanf("%s", p1->sex))
                    {
                        printf("输入改正信息有误,请重新输入: ");
                        fflush(stdin);
                    }
                    break;
                }
                case 4:
                {
                    printf("请输入该学生改正的出生年月信息(如输入1999 9 9): ");
                    while (!scanf("%d %d %d", &p1->birth.year,&p1->birth.month,&p1->birth.day))
                    {
                        printf("输入改正信息有误,请重新输入: ");
                        fflush(stdin);
                    }
                    break;
                }
                case 5:
                {
                    printf("请输入该学生改正的班级信息: ");
                    while (!scanf("%d",&p1->clas))
                    {
                        printf("输入改正信息有误,请重新输入: ");
                        fflush(stdin);
                    }
                    break;
                }
                case 6:
                {
                    printf("请输入该学生改正的生源地信息: ");
                    printf("生源地(0:山东济南 1:山东青岛 2:山东烟台 3:山东潍坊 4:山东菏泽 5:山东德州 6:山东滨州 7:山东威海)\n");
                    while (!scanf("%d",&p1->syd))
                    {
                        printf("输入改正信息有误,请重新输入: ");
                        fflush(stdin);
                    }
                    break;
                }
                case 7:
                {
                    printf("请输入该学生全部要改正的信息: ");
                    while (!scanf("%d %s %s %d %d %d %d %d",&p1->id, p1->name, p1->sex, &p1->birth.year, &p1->birth.month, &p1->birth.day, &p1->clas, &p1->syd))
                    {
                        printf("输入改正信息有误,请重新输入: ");
                        fflush(stdin);
                    }
                    break;
                }
                }
                if (cho == 1 || cho == 7)
                {
                    if (p1 == head)
                    {
                        head = head->next;
                    }
                    else if (p1->next == NULL)
                    {
                        p2->next = NULL;
                    }
                    else
                    {
                        p2->next = p1->next;
                    }
                    head = insert(head,p1);
                }
                printf("修改成功,该学生改正后的信息为: \n");
                printf("  学号   姓名    性别    出生日期       班级    生源地  \n");
                printf("———————————————————————————\n");
                printf("%-7d  %-4s  %-6s  %-4d年%-2d月%-2d日   %-6d  %-6d\n", p1->id, p1->name, p1->sex, p1->birth.year, p1->birth.month, p1->birth.day, p1->clas, p1->syd);
                printf("   1.继续修改其他学生信息\n");
                printf("   2.退出修改\n");
                printf("请选择: ");
                while (!scanf("%d",&k))
                {
                    printf("输入序号有误,请重新输入: ");
                    fflush(stdin);
                }
                if (k == 1)
                {
                    printf("请输入需要修改的学生学号: ");
                    while (!scanf("%d", &num))
                    {
                        printf("输入修改信息有误,请重新输入: ");
                        fflush(stdin);
                    }
                }
                else if (k != 2)
                {
                    printf("输入有误,请重新输入\n");
                }
                if ((w = fopen("C:\\Desktop\\Tdata_new.txt", "wb+")) == NULL)
                {
                    printf("cannot open file\n");
                    exit(1);
                }
                p1=head;
                while(p1!=NULL)
                {
                    fprintf(w,"%d %s %s %d %d %d %d %d\n", p1->id, p1->name, p1->sex, p1->birth.year, p1->birth.month,p1->birth.day,p1->clas, p1->syd);
                    p1= p1->next;
                }
                fclose(w);
            }
            else
            {
                k = 1;
                printf("找不到该学生信息,请重新输入需要修改的学生学号: ");
                fflush(stdin);
                while (!scanf("%d", &num))
                {
                    printf("输入修改信息有误,请重新输入: ");
                    fflush(stdin);
                }
            }
        }
        while(k == 1);
        printf("   ");
        system("pause");
    }
    struct Stu_record *delete_record(struct Stu_record *head)
    {
        int num,k;
        FILE *w;
        struct Stu_record *p1,*p2;
        if(head == NULL)
        {
            printf("没有学生信息,结束删除\n");
            return(head);
        }
        printf("请输入要删除的学生学号: ");
        while (!scanf("%d", &num))
        {
            printf("输入有误,请重新输入学生学号: ");
            fflush(stdin);
        }
        do
        {
            p1 = p2 = head;
            while (num != p1->id && p1->next != NULL)
            {
                p2 = p1;
                p1 = p1->next;
            }
            if (num == p1->id)
            {
                if (num == p1->id)
                {
                    if (p1->next == NULL && p1 == head)
                    {
                        free(p1);
                        head = NULL;
                    }
                    else if (p1->next == NULL)//如果删除完表空了 把表删除
                    {
                        free(p1);
                        p2->next = NULL;
                    }
                    else if (head == p1)
                    {
                        head = p1->next;
                        free(p1);
                    }
                    else
                    {
                        p2->next = p1->next;
                        free(p1);
                    }
                }
                printf("成功删除学生信息\n");
            }
            else
            {
                printf("找不到该同学信息\n");
                fflush(stdin);
            }
            if (head == NULL)
            {
                printf("没有学生信息,结束删除\n");
                return(head);
            }
            else
            {
                printf("   1.继续删除学生信息\n");
                printf("   2.结束删除\n");
                printf("请选择: ");
                while (!scanf("%d",&k))
                {
                    printf("输入有误,请重新输入选择的序号: ");
                    fflush(stdin);
                }
                if (k == 1)
                {
                    printf("请输入要删除的学生学号: ");
                    while (!scanf("%d", &num))
                    {
                        printf("输入有误,请重新输入学生学号: ");
                        fflush(stdin);
                    }
                }
                else if (k != 2)
                {
                    k = 1;
                }
                if ((w = fopen("C:\\Desktop\\Tdata_new.txt", "wb+")) == NULL)
                {
                    printf("cannot open file\n");
                    exit(1);
                }
                p1=head;
                while(p1!=NULL)
                {
                    fprintf(w,"%d %s %s %d %d %d %d %d\n", p1->id, p1->name, p1->sex, p1->birth.year, p1->birth.month,p1->birth.day,p1->clas, p1->syd);
                    p1= p1->next;
                }
                fclose(w);
            }
        }
        while (k == 1);
        return(head);
    }
    struct Stu_record *add_record(struct Stu_record *head)
    {
        FILE *w;
        int i,num;
        struct Stu_record *p1;
        head = insert(head, NULL);
        printf("   成功插入学生信息\n   ");
    
        if ((w = fopen("C:\\Desktop\\Tdata_new.txt", "wb+")) == NULL)
        {
            printf("cannot open file\n");
            exit(1);
        }
        p1=head;
        while(p1!=NULL)
        {
            fprintf(w,"%d %s %s %d %d %d %d %d\n", p1->id, p1->name, p1->sex, p1->birth.year, p1->birth.month,p1->birth.day,p1->clas, p1->syd);
            p1= p1->next;
        }
        fclose(w);
    
        return head;
    }
    void statistics_record(struct Stu_record *head)
    {
        double cnt[8];
        int i;
        double sum=0;
        struct Stu_record *p1;
        p1 = head;
        memset(cnt,0,sizeof(cnt));
        printf("统计各生源地人数及所占百分比:\n");
        while (1)
        {
            sum++;
            for(i=0;i<8;i++)
            {
                if(p1->syd==i) cnt[i]++;
            }
            if (p1->next == NULL)
                break;
            p1 = p1->next;
        }
        printf("全体学生人数:%.0lf人\n\n",sum);
        printf("山东济南:%.0lf人 %5.2lf%%\n",cnt[0],(cnt[0]/sum)*100);
        printf("山东青岛:%.0lf人 %5.2lf%%\n",cnt[1],(cnt[1]/sum)*100);
        printf("山东烟台:%.0lf人 %5.2lf%%\n",cnt[2],(cnt[2]/sum)*100);
        printf("山东潍坊:%.0lf人 %5.2lf%%\n",cnt[3],(cnt[3]/sum)*100);
        printf("山东菏泽:%.0lf人 %5.2lf%%\n",cnt[4],(cnt[4]/sum)*100);
        printf("山东德州:%.0lf人 %5.2lf%%\n",cnt[5],(cnt[5]/sum)*100);
        printf("山东滨州:%.0lf人 %5.2lf%%\n",cnt[6],(cnt[6]/sum)*100);
        printf("山东威海:%.0lf人 %5.2lf%%\n\n",cnt[7],(cnt[7]/sum)*100);
    }
    /*** score中的函数 ***/
    struct Stu_score *readin_score()
    {
        struct Stu_score *p2,*p1;
        int n,i;
        head=NULL;
        FILE *w;
        if ((w = fopen("C:\\Desktop\\Tscore_new.txt", "wb+")) == NULL)
        {
            printf("cannot open file\n");
            exit(1);
        }
    
        printf("请输入学生人数: \n");
        scanf("%d",&n);
        head=p2=p1=(struct Stu_score *) malloc(sizeof(struct Stu_score));								//开辟内存,用于生成链表
        printf("学生个数为:%d个,请按照以下顺序输入\n", n);							//对学生总数的提示,并且提示每个学生信息的输入顺序
        printf("学号、姓名、班级、课程1、课程2、课程3\n");	//每个学生信息的输入顺序
        for (i = 0; i < n; i++)
        {
            while (!scanf("%d %s %d %lf %lf %lf", &p2->id, p2->name, &p2->clas, &p2->course1, &p2->course2,&p2->course3))
            {
                printf("输入有误,请重新输入该学生信息\n   ");
                fflush(stdin);
            }
            p2->avg = (p2->course1+p2->course2+p2->course3)/3.0;
            if (n == 1)
            {
                p2->next = NULL;
            }
            else
            {
                head = sinsert(head, p2);
                p2 = (struct Stu_score *) malloc(sizeof(struct Stu_score));
            }
        }
        p1=head;
        while(p1!=NULL)
        {
            fprintf(w,"%d %s %d %lf %lf %lf\n",p2->id, p2->name, p2->clas, p2->course1, p2->course2,p2->course3,p2->avg);
            p1= p1->next;
        }
        fclose(w);
        printf("成功录入%d名学生成绩信息,学生成绩信息已经按学号从小到大排列,信息如下: \n\n",n);
        ssearch(head);
        return head;
    }
    void id_inquiry_score(struct Stu_score *head)
    {
        int cho, t = 1;
        int num;
        struct Stu_score *p1;
        if (head == NULL)
        {
            printf("没有学生信息,结束查询\n");
            return;
        }
        p1 = head;
        do
        {
            p1 = head;
            if ( t == 1)
            {
                printf("请输入需要查询的学生学号: ");
                while (!scanf("%d", &num))
                {
                    printf("输入有误,请重新输入: ");
                    fflush(stdin);
                }
                t = 1;
            }
            else
            {
                cho = 2;
            }
            while (p1->id != num)
            {
                if (p1->next == NULL)
                    break;
                p1 = p1->next;
            }
            if (p1->id == num)
            {
                printf("  学号   姓名   班级    课程1     课程2    课程3    平均分  \n");
                printf("—————————————————————————————————\n");
                printf("%-7d %-7s %-7d %-5.2lf    %-5.2lf    %-5.2lf   %-5.2lf\n", p1->id, p1->name, p1->clas, p1->course1, p1->course2, p1->course3, p1->avg);
            }
            else
            {
                printf("找不到该学生\n");
            }
            if (t == 1)
            {
                printf("1.继续查询\n");
                printf("2.结束查询\n");
                printf("请选择: ");
                while (!scanf("%d", &cho))
                {
                    printf("输入序号有误,请重新输入: ");
                    fflush(stdin);
                }
            }
        }
        while(cho==1);
    }
    void name_inquiry_score(struct Stu_score *head)
    {
        int cho, t = 1;
        char qname[20];
        struct Stu_score *p1;
        if (head == NULL)
        {
            printf("没有学生信息,结束查询\n");
            return;
        }
        p1 = head;
        do
        {
            p1 = head;
            if ( t == 1)
            {
                printf("请输入需要查询的学生姓名: ");
                while (!scanf("%s",qname))
                {
                    printf("输入有误,请重新输入: ");
                    fflush(stdin);
                }
                t = 1;
            }
            else
            {
                cho = 2;
            }
            while (strcmp(p1->name,qname)!=0)
            {
                if (p1->next == NULL)
                    break;
                p1 = p1->next;
            }
            if (strcmp(p1->name,qname)==0)
            {
                printf("  学号   姓名   班级    课程1     课程2    课程3    平均分  \n");
                printf("—————————————————————————————————\n");
                printf("%-7d %-7s %-7d %-5.2lf    %-5.2lf    %-5.2lf   %-5.2lf\n", p1->id, p1->name, p1->clas, p1->course1, p1->course2, p1->course3, p1->avg);
            }
            else
            {
                printf("找不到该学生\n");
            }
            if (t == 1)
            {
                printf("1.继续查询\n");
                printf("2.结束查询\n");
                printf("请选择: ");
                while (!scanf("%d", &cho))
                {
                    printf("输入序号有误,请重新输入: ");
                    fflush(stdin);
                }
            }
        }
        while(cho==1);
    }
    void clas_inquiry_score(struct Stu_score *head)
    {
        int cho, t = 1;
        int qclas;
        struct Stu_score *p1;
        if (head == NULL)
        {
            printf("没有学生信息,结束查询\n");
            return;
        }
        p1 = head;
        do
        {
            p1 = head;
            if ( t == 1)
            {
                printf("请输入需要查询的学生班级: ");
                while (!scanf("%d", &qclas))
                {
                    printf("输入有误,请重新输入: ");
                    fflush(stdin);
                }
                t = 1;
            }
            else
            {
                cho = 2;
            }
            while (p1->clas != qclas)
            {
                if (p1->next == NULL)
                    break;
                p1 = p1->next;
            }
            if (p1->clas == qclas)
            {
                printf("  学号   姓名   班级    课程1     课程2    课程3    平均分  \n");
                printf("—————————————————————————————————\n");
                printf("%-7d %-7s %-7d %-5.2lf    %-5.2lf    %-5.2lf   %-5.2lf\n", p1->id, p1->name, p1->clas, p1->course1, p1->course2, p1->course3, p1->avg);
            }
            else
            {
                printf("找不到该学生\n");
            }
            if (t == 1)
            {
                printf("1.继续查询\n");
                printf("2.结束查询\n");
                printf("请选择: ");
                while (!scanf("%d", &cho))
                {
                    printf("输入序号有误,请重新输入: ");
                    fflush(stdin);
                }
            }
        }
        while(cho==1);
    }
    void modify_score(struct Stu_score *head)
    {
        struct Stu_score *p1, *p2;
        int num,cho,k=1,l=0;
        FILE *w;
    
        if (head == NULL)
        {
            printf("没有学生成绩信息,结束修改\n ");
            system("pause");
            return;
        }
        printf("请输入需要修改的学生学号: ");
        while (!scanf("%d",&num))
        {
            printf("输入学号有误,请重新输入: ");
            fflush(stdin);
        }
        do
        {
            p2 = p1 = head;
            while (p1->id != num)
            {
                if (p1->next == NULL)
                    break;
                p2 = p1;
                p1 = p1->next;
            }
            if (p1->id == num)
            {
                printf("已找到该学生,该学生的信息为: \n");
                printf("  学号   姓名   班级    课程1     课程2    课程3    平均分  \n");
                printf("—————————————————————————————————\n");
                printf("%-7d %-7s %-7d %-5.2lf    %-5.2lf    %-5.2lf   %-5.2lf\n", p1->id, p1->name, p1->clas, p1->course1, p1->course2, p1->course3, p1->avg);
                l = 0;
                do
                {
                    if (l == 0)
                        printf("\n选择修改的内容\n");
                    else
                        printf("序号输入错误,请重新选择\n");
                    l = 1;
                    printf("   1.学号\n");
                    printf("   2.姓名\n");
                    printf("   3.班级\n");
                    printf("   4.课程1成绩\n");
                    printf("   5.课程2成绩\n");
                    printf("   6.课程3成绩\n");
                    printf("   7.全部\n");
                    printf("请选择序号: ");
                    fflush(stdin);
                    while (!scanf("%d", &cho))
                    {
                        printf("输入序号有误,请重新输入: ");
                        fflush(stdin);
                    }
                }
                while (cho > 7 || cho < 1);
                switch (cho)
                {
                case 1:
                {
                    printf("请输入该学生改正的学号信息: ");
                    while (!scanf("%d", &p1->id))
                    {
                        printf("输入改正信息有误,请重新输入: ");
                        fflush(stdin);
                    }
                    break;
                }
                case 2:
                {
                    printf("请输入该学生改正的姓名信息: ");
                    while (!scanf("%s", p1->name))
                    {
                        printf("输入改正信息有误,请重新输入: ");
                        fflush(stdin);
                    }
                    break;
                }
                case 3:
                {
                    printf("请输入该学生改正的班级信息: ");
                    while (!scanf("%d", &p1->clas))
                    {
                        printf("输入改正信息有误,请重新输入: ");
                        fflush(stdin);
                    }
                    break;
                }
                case 4:
                {
                    printf("请输入该学生改正的课程1成绩信息: ");
                    while (!scanf("%lf", &p1->course1))
                    {
                        printf("输入改正信息有误,请重新输入: ");
                        fflush(stdin);
                    }
                    p1->avg=(p1->course1+p1->course2+p1->course3)/3.0;
                    break;
                }
                case 5:
                {
                    printf("请输入该学生改正的课程2成绩信息: ");
                    while (!scanf("%lf",&p1->course2))
                    {
                        printf("输入改正信息有误,请重新输入: ");
                        fflush(stdin);
                    }
                    p1->avg=(p1->course1+p1->course2+p1->course3)/3.0;
                    break;
                }
                case 6:
                {
                    printf("请输入该学生改正的课程3成绩信息: ");
                    while (!scanf("%lf",&p1->course3))
                    {
                        printf("输入改正信息有误,请重新输入: ");
                        fflush(stdin);
                    }
                    p1->avg=(p1->course1+p1->course2+p1->course3)/3.0;
                    break;
                }
                case 7:
                {
                    printf("请输入该学生全部要改正的信息: ");
                    while (!scanf("%d %s %d %lf %lf %lf",&p1->id, p1->name, &p1->clas, &p1->course1, &p1->course2, &p1->course3))
                    {
                        printf("输入改正信息有误,请重新输入: ");
                        fflush(stdin);
                    }
                    p1->avg=(p1->course1+p1->course2+p1->course3)/3.0;
                    break;
                }
                }
                if (cho == 1 || cho == 7)
                {
                    if (p1 == head)
                    {
                        head = head->next;
                    }
                    else if (p1->next == NULL)
                    {
                        p2->next = NULL;
                    }
                    else
                    {
                        p2->next = p1->next;
                    }
                    head = sinsert(head,p1);
                }
                printf("  学号   姓名   班级    课程1     课程2    课程3    平均分  \n");
                printf("—————————————————————————————————\n");
                printf("%-7d %-7s %-7d %-5.2lf    %-5.2lf    %-5.2lf   %-5.2lf\n", p1->id, p1->name, p1->clas, p1->course1, p1->course2, p1->course3, p1->avg);
                l = 0;
                printf("   1.继续修改其他学生信息\n");
                printf("   2.退出修改\n");
                printf("请选择: ");
                while (!scanf("%d",&k))
                {
                    printf("输入序号有误,请重新输入: ");
                    fflush(stdin);
                }
                if (k == 1)
                {
                    printf("请输入需要修改的学生学号: ");
                    while (!scanf("%d", &num))
                    {
                        printf("输入修改信息有误,请重新输入: ");
                        fflush(stdin);
                    }
                }
                else if (k != 2)
                {
                    printf("输入有误,请重新输入\n");
                }
                if ((w = fopen("C:\\Desktop\\Tscore_new.txt", "wb+")) == NULL)
                {
                    printf("cannot open file\n");
                    exit(1);
                }
                p1=head;
                while(p1!=NULL)
                {
                    fprintf(w,"%d %s %d %lf %lf %lf %lf \n", p1->id, p1->name, p1->clas, p1->course1, p1->course2,p1->course3,p1->avg);
                    p1= p1->next;
                }
                fclose(w);
            }
            else
            {
                k = 1;
                printf("找不到该学生信息,请重新输入需要修改的学生学号: ");
                fflush(stdin);
                while (!scanf("%d", &num))
                {
                    printf("输入修改信息有误,请重新输入: ");
                    fflush(stdin);
                }
            }
        }
        while(k == 1);
        printf("   ");
        system("pause");
    }
    struct Stu_score *delete_score(struct Stu_score *head)
    {
        int num,k;
        FILE *w;
        struct Stu_score *p1,*p2;
        if(head == NULL)
        {
            printf("没有学生信息,结束删除\n");
            return(head);
        }
        printf("请输入要删除的学生学号: ");
        while (!scanf("%d", &num))
        {
            printf("输入有误,请重新输入学生学号: ");
            fflush(stdin);
        }
        do
        {
            p1 = p2 = head;
            while (num != p1->id && p1->next != NULL)
            {
                p2 = p1;
                p1 = p1->next;
            }
            if (num == p1->id)
            {
                if (num == p1->id)
                {
                    if (p1->next == NULL && p1 == head)
                    {
                        free(p1);
                        head = NULL;
                    }
                    else if (p1->next == NULL)//如果删除完表空了 把表删除
                    {
                        free(p1);
                        p2->next = NULL;
                    }
                    else if (head == p1)
                    {
                        head = p1->next;
                        free(p1);
                    }
                    else
                    {
                        p2->next = p1->next;
                        free(p1);
                    }
                }
                printf("成功删除学生信息\n");
            }
            else
            {
                printf("找不到该同学信息\n");
                fflush(stdin);
            }
            if (head == NULL)
            {
                printf("没有学生信息,结束删除\n");
                return(head);
            }
            else
            {
                printf("   1.继续删除学生信息\n");
                printf("   2.结束删除\n");
                printf("请选择: ");
                while (!scanf("%d",&k))
                {
                    printf("输入有误,请重新输入选择的序号: ");
                    fflush(stdin);
                }
                if (k == 1)
                {
                    printf("请输入要删除的学生学号: ");
                    while (!scanf("%d", &num))
                    {
                        printf("输入有误,请重新输入学生学号: ");
                        fflush(stdin);
                    }
                }
                else if (k != 2)
                {
                    k = 1;
                }
                if ((w = fopen("C:\\Desktop\\Tscore_new.txt", "wb+")) == NULL)
                {
                    printf("cannot open file\n");
                    exit(1);
                }
                p1=head;
                while(p1!=NULL)
                {
                    fprintf(w,"%d %s %d %lf %lf %lf %lf \n", p1->id, p1->name, p1->clas, p1->course1, p1->course2,p1->course3,p1->avg);
                    p1= p1->next;
                }
                fclose(w);
            }
        }
        while (k == 1);
        return(head);
    }
    struct Stu_score *add_score(struct Stu_score *head)
    {
        FILE *w;
        int i,num;
        struct Stu_score *p1;
        head = sinsert(head, NULL);
        printf("成功插入学生信息\n");
    
        if ((w = fopen("C:\\Desktop\\Tscore_new.txt", "wb+")) == NULL)
        {
            printf("cannot open file\n");
            exit(1);
        }
        p1=head;
        while(p1!=NULL)
        {
            fprintf(w,"%d %s %d %lf %lf %lf %lf\n",p1->id, p1->name, p1->clas, p1->course1, p1->course2,p1->course3,p1->avg);
            p1= p1->next;
        }
        fclose(w);
        return head;
    }
    void stu_statistics_score(struct Stu_score *head)
    {
        double cnt[3];
        int i;
        double sum=0;
        struct Stu_score *p1;
        p1 = head;
        memset(cnt,0,sizeof(cnt));
        printf("统计各课程不及格人数及所占百分比:\n");
        while (1)
        {
            sum++;
            if(p1->course1<60) cnt[0]++;
            if(p1->course2<60) cnt[1]++;
            if(p1->course3<60) cnt[2]++;
            if (p1->next == NULL)
                break;
            p1 = p1->next;
        }
        printf("全体学生人数:%.0lf人\n\n",sum);
        printf("课程1不及格人数:%.0lf人 %5.2lf%%\n",cnt[0],(cnt[0]/sum)*100);
        printf("课程2不及格人数:%.0lf人 %5.2lf%%\n",cnt[1],(cnt[1]/sum)*100);
        printf("课程3不及格人数:%.0lf人 %5.2lf%%\n\n",cnt[2],(cnt[2]/sum)*100);
    }
    void course_statistics_score(struct Stu_score *head)
    {
        int i;
        int c1max=0,c2max=0,c3max=0;
        int c1min=1000,c2min=1000,c3min=1000;
        double sum1=0,sum2=0,sum3=0;
        double n=0;
        struct Stu_score *p1;
        p1 = head;
        printf("统计各课程最高分、最低分和平均分:\n");
        while (1)
        {
            if(p1->course1<c1min) c1min=p1->course1;
            if(p1->course2<c2min) c2min=p1->course2;
            if(p1->course3<c3min) c3min=p1->course3;
            if(p1->course1>c1max) c1max=p1->course1;
            if(p1->course2>c2max) c2max=p1->course2;
            if(p1->course3>c3max) c3max=p1->course3;
            sum1+=p1->course1;
            sum2+=p1->course2;
            sum3+=p1->course3;
            n++;
            if (p1->next == NULL)
                break;
            p1 = p1->next;
        }
        printf("全体学生人数:%.0lf人\n\n",n);
        printf("课程1最高分、最低分和平均分:%3d  %3d  %3.2lf\n",c1max,c1min,sum1/n);
        printf("课程2最高分、最低分和平均分:%3d  %3d  %3.2lf\n",c2max,c2min,sum2/n);
        printf("课程3最高分、最低分和平均分:%3d  %3d  %3.2lf\n\n",c3max,c3min,sum3/n);
    }
    
    
    展开全文
  • C语言:Educoder结构体储存学生信息

    千次阅读 2020-12-13 21:16:37
    本关任务:使用结构体储存学生信息(包括学号,姓名,3门课程成绩,总分),要求实现对学生信息修改和删除操作,最多50名学生。 相关知识 参考结构体第1关相关知识 编程要求 在右侧编辑器Begin-End处补充代码,使用...

    任务描述
    本关任务:使用结构体储存学生信息(包括学号,姓名,3门课程成绩,总分),要求实现对学生信息修改和删除操作,最多50名学生。
    相关知识
    参考结构体第1关相关知识
    编程要求
    在右侧编辑器Begin-End处补充代码,使用结构体储存学生信息,实现对学生信息修改和删除操作。
    测试说明
    平台会对你编写的代码进行测试,比对你输出的数值与实际正确数值,只有所有数据全部计算正确才能通过测试:

    测试输入

    10 3
    1 Siyu 90 90 90
    2 Amy 60 70 94
    3 Jack 60 60 98
    4 Jack 77 90 60
    5 Banana 60 60 40
    6 White 60 60 60
    7 Pinkman 60 60 60
    8 Fring 60 60 70
    9 Ehrmantraut 80 63 61
    10 Schrader 99 66 100
    1 Jack
    2 1 100 100 100
    3 10

    测试输入数据说明
    输入一个n,q,标书下面n行则是n个学生的信息,再下q行则是对应的操作。
    1 name //为根据名字查询操作
    2 sno num1 num2 num2 //为修改分数操作,修改学号为sno的3门成绩
    3 sno //为删除操作
    预期输出

    3 Jack 60 60 98 218
    4 Jack 77 90 60 227
    1 Siyu 100 100 100 300
    2 Amy 60 70 94 224
    3 Jack 60 60 98 218
    4 Jack 77 90 60 227
    5 Banana 60 60 40 160
    6 White 60 60 60 180
    7 Pinkman 60 60 60 180
    8 Fring 60 60 70 190
    9 Ehrmantraut 80 63 61 204
    10 Schrader 99 66 100 265
    1 Siyu 100 100 100 300
    2 Amy 60 70 94 224
    3 Jack 60 60 98 218
    4 Jack 77 90 60 227
    5 Banana 60 60 40 160
    6 White 60 60 60 180
    7 Pinkman 60 60 60 180
    8 Fring 60 60 70 190
    9 Ehrmantraut 80 63 61 204

    预期输出数据说明
    每次修改操作则输出全部的学生信息,查询操作则输出查询的学生的信息。

    答案及解析

    #include<stdio.h>
    #include<string.h>
    int Count;
    struct student{
        char sno[20],name[20];
        int math,english,chinese,sum;
    };
    
    void print(struct student stu){
        printf("%s %s %d %d %d %d\n",stu.sno,stu.name,stu.math,stu.english,stu.chinese,stu.sum);
    }
    
    void query_stu(struct student s[],char *name){
        /*********Begin*********/
    	int i;
    	for(i = 0;i < Count;i++)
    		if(strcmp(s[i].name, name) == 0)
    		{
    			s[i].sum = s[i].math + s[i].english + s[i].chinese;
    			print(s[i]);
    		}
        /*********End**********/
    }
    
    void delete_stu(struct student s[],char *sno){
        /*********Begin*********/
    	for(int i = 0;i < Count - 1;i++)
    	if(strlen(s[i].sno) >= strlen(sno))
    		if(strcmp(s[i].sno, sno) >= 0)
    			s[i] = s[i + 1];
        /*********End**********/
    }
    /*
    或	void delete_stu(struct student s[],char *sno)
       {
       	    for(int i = 0;i < Count - 1;i++)
    		if(strcmp(s[i].sno, sno) == 0)
    			while(i < Count)
    			{
    				s[i] = s[i + 1];
    				i++;
    			}	
        }
    */
    
    void update_stu(struct student s[],char *sno,int math,int english,int chinese){
        /*********Begin*********/
    	for(int i = 0;i < Count;i++)
    	if(strcmp(s[i].sno, sno) == 0)
    	{
    		s[i].math = math;
    		s[i].english = english;
    		s[i].chinese = chinese;
    		s[i].sum = s[i].math + s[i].english + s[i].chinese;
    	}
    	/*********End**********/
    }
    
    int main(void)
    {
        int n,q;
        struct student students[50];
        scanf("%d%d",&n,&q);
        Count=n;
        for(int i=0;i<n;i++){
            /*********Begin*********/
    	scanf("%s%s%d%d%d",students[i].sno,students[i].name,&students[i].math,&students[i].english,&students[i].chinese);
    	students[i].sum = students[i].math + students[i].english + students[i].chinese;
            /*********End**********/
        }
        while(q--){
            int op;
            scanf("%d",&op);
            char sno[20],name[20];
            if(op==1){
                scanf("%s",name);
                query_stu(students,name);
            }
            else if(op==2){
                int a,b,c;
                scanf("%s%d%d%d",sno,&a,&b,&c);
                update_stu(students,sno,a,b,c);
                for(int i=0;i<Count;i++)
                    print(students[i]);
            }
            else{
                scanf("%s",sno);
                delete_stu(students,sno);
                for(int i=0;i<Count-1;i++)
                    print(students[i]);
            }
        }
        return 0;
    }
    
    展开全文
  • /* 输出删除后的记录 */ for(i=0; i printf("%13s%3c%4d\n",s[i].name,s[i].sex,s[i].score); getchar(); } int del_p(Student *q,char *a) { int i=0,j=0; for(i=0; i if(strcmp(q[i].name,a)==0) break; /* 找到...
  • 2.删除学生信息 3.修改学生信息 4.查找学生信息 5.列出学生信息 6.保存学生信息到文件 7.从文件中加载学生信息 二.学生信息结构体 首先定义一个学生结构体,再直接定义一个全局指针变量stu,让下面的函数都...
  • C语言学生信息管理系统

    千次阅读 2018-04-15 12:09:44
    学习了C语言结构体,链表和文件的知识之后,就可以做出一个学生信息管理系统了,下面的是我在刚学习完这块知识后写出来的,基本没什么界面,不过 能够实现 录入,添加,插入,遍历,删除,查询,并且保存到本地文件...
  • 做了一个学生成绩的结构体数组,运行的时候发现成绩始终是0.0,好像输入的score数据没有传进去,其他的都正常。源码贴在下面,请大佬纠错! <code class="language-cpp">#include&...
  • 递归算法就是直接或者间接的调用自己的算法。一般是通过函数或者子过程完成,在函数或者子过程的...功能:插入(输入学生信息,输入的信息保存在内存的链表中)、保存(将存储在链表中的信息保存在磁盘中)、加载(将磁盘...
  • 输入10个学生信息 保存在动态内存中 1.按学号升序显示 2.按总成绩降序显示,如果总成绩一样,按照学号升序显示 3.输入一个学号,删除该学生 4.输入两个学生信息 添加到内存中(扩容) #include <stdio.h> #...
  • 我们在学习完C语言后都会自己设计一个系统,而最著名的就属学生信息管理系统,接下来让我们一起来看看程序吧。 在设计一个系统之前我们应该思考系统的结构,系统的功能以及客户的需求等等。我设计的这个系统有以下...
  • 一 需求分析利用c语言的链表或结构体数组实现学生信息的管理,编写有登录界面的学生信息管理系统,可以实现学生信息的录入,显示,删除,排序,统计,文件读写等功能。 源码下载地址:...
  • C语言:学生信息管理系统(详解+源码)

    千次阅读 多人点赞 2020-05-30 21:56:40
    /* 主要方式 :结构体、链表和文件读取结合 功能模块 : 1、用户界面,给予用户更好的视觉体验 2、录入信息,通过... 6、删除信息,按照学号删除指定学生信息 7、查询信息,按照学号查询指定学生信息
  • C语言编写学生成绩信息管理系统

    千次阅读 多人点赞 2020-07-06 18:27:13
    C语言设计学生成绩信息管理系统介绍代码结构体数组的定义main_interface()函数add_infor()函数browse_infor()函数 介绍 软件方面采用的是Visual Studio 2019 IDE工具。 程序方面采用结构体数组,成员包括学号、...
  • C语言实现学生信息管理系统(包含文件存取)

    万次阅读 多人点赞 2019-04-01 20:39:24
    这是一个基本的学生信息管理系统(采用了结构体) 包含有六大功能 1.插入学生信息 2.修改学生信息 3.删除学生信息 4.查询学生信息 5.从文件中读取信息 6.将信息存入到文件中去 下面是完整代码(我是个好人) #...
  • 利用c语言的链表或结构体数组实现学生信息的管理,编写有登录界面的学生信息管理系统,可以实现学生信息的录入,显示,删除,排序,统计,文件读写等功能。 源码下载地址:https://www.writ...
  • 利用c语言的链表或结构体数组实现学生信息的管理,编写有登录界面的学生信息管理系统,可以实现学生信息的录入,显示,删除,排序,统计,文件读写等功能。 需要C/C++资料的同学请加小编C/C++编程QQ群:825414254...
  • 学生信息管理系统——C语言

    万次阅读 多人点赞 2019-04-06 18:07:13
    4)删除学生信息 5)刷新学生信息 6)保存学生信息 7)输出当前学生信息 2.题目要求: 1)使用结构体建立学生信息体制 2)实现七大基本功能 3)采用文件存储学生信息 二.算法构造 1.难点解析----对文件的操作 1.1...

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 187
精华内容 74
关键字:

c语言结构体学生信息删除

c语言 订阅