学生信息管理系统

时间:2022-10-30 18:10:40
读入文档未完成,是个败点
/******************************************************  File name:学生信息管理系统     // 文件名  Author:      Sno:1508010317  class:软工1503   Date:2017.3.19                // 作者及完成日期  Description:     1.改写程序为良好程序风格(文档注释,函数注释,语句注释)。  2.将功能补充完全(基于文件处理,完成刷新和保存功能)。  3.将学生信息改为更好的数据组织,而非离散形式(结构体)。  提高要求:    可将程序中的不足(如数据验证)等根据自己的能力与理解完成。  Function List:   // 主要函数及其功能    1、menu();                    //界面函数  2、insert(STUDENTS t[]);      //输入函数  3、list(STUDENTS t[],int n);  //显示函数  4、search(STUDENTS t[],int n);//查询函数  5、del(STUDENTS t[],int n);   //删除函数  6、save(STUDENTS t[],int n);  //保存函数  7、modify(STUDENTS t[],int n);//修改函数  8、load(STUDENTS t[]);        //加载函数  9、help();                    //帮助函数  10、find_name(STUDENTS t[],int n,char *s); //姓名查找函数  11、find_code(STUDENTS t[],int n,char *no);//学号查找函数  12、sort(STUDENTS t[],int n);              //排序函数  History:                  // 历史修改记录        <author>  <time>      <desc>                 2017.3.19    增加加载函数失败	                        不能实现读取文件信息               2017.3.19    增加排序函数,成功实现*************************************************/
#include <stdio.h>  /**I/O函数**/#include <stdlib.h> /**标准库函数**/#include <string.h> /**字符串函数**/#define N 50        /**最大学生人数**/typedef struct        {	char code[20];    /**学号**/	char name[20];  /**姓名**/	char sex[5];    /**性别**/	int  age;       /**年龄**/	float score0;   /**C语言成绩**/    float score1;   /**高数成绩**/    float score2;   /**英语成绩**/} STUDENTS;/**定义数据结构**/
/*****以下所有函数******/int  menu();                    /**界面函数**/int  insert(STUDENTS t[]);      /**输入函数**/void list(STUDENTS t[],int n);  /**显示函数**/void search(STUDENTS t[],int n);/**查询函数**/int  del(STUDENTS t[],int n);   /**删除函数**/void save(STUDENTS t[],int n);  /**保存函数**/void modify(STUDENTS t[],int n);/**修改函数**/int  load(STUDENTS t[]);        /**加载函数**/void help();                    /**帮助函数**/int  find_name(STUDENTS t[],int n,char *s); /**姓名查找函数**/int  find_code(STUDENTS t[],int n,char *no);/**学号查找函数**/void sort(STUDENTS t[],int n);              /**排序函数**/
/********界面函数********/int menu(){	int c;	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");	do{		printf("\n   输入您的菜单选项编号(0-9):");		scanf("%d",&c);	}while(c<0 || c>9);	return c;}
/********帮助函数********/void help(){ 	system("cls");                     /**清屏**/		printf("\n0.欢迎使用系统帮助!\n");	printf("\n1.初次进入系统后,请先选择 4 增加学生信息;\n");	printf("\n2.按照菜单提示键入数字代号;\n");	printf("\n3.增加学生信息后,切记按 7 保存;\n");	printf("\n4.谢谢您的使用!\n");	getchar();} 
/*******增加函数********/int insert(STUDENTS t[]){	int i,n;	system("cls");/**清屏**/	printf("\n 请输入待增加学生人数:\n");	scanf("%d",&n);	printf("请输入学生记录:\n");	printf("学生学号    学生姓名  性别  年龄   C语言成绩  高等数学  大学英语成绩\n");	printf("....................................................................\n");	for(i=0;i<n;i++)	{		scanf("%s",t[i].code);        /**输入学号**/					scanf("%s",t[i].name);        /**输入姓名**/		scanf("%s",t[i].sex);         /**输入性别**/		scanf("%d",&t[i].age);        /**输入年龄**/					scanf("%f",&t[i].score0);     /**C语言成绩**/		scanf("%f",&t[i].score1);     /**高数成绩**/			scanf("%f",&t[i].score2);     /**英语成绩**/	}	getchar();	return n;        }
/**查找函数**/void search(STUDENTS t[],int n){	char s[21];                        /**以姓名和学号最长长度+1为准**/	system("cls");                     /**清屏**/	int i,item;                         	printf("----------------------\n");	printf("-----1.按学号查询-----\n");	printf("-----2.按姓名查询-----\n");	printf("-----3.退出本菜单-----\n");	printf("----------------------\n");	while(1)	{		printf("请选择子菜单编号:");		scanf("%d",&item);		switch(item)		{		case 1:			printf("请输入查找的学号:\n");       /**学号查找**/			scanf("%s",s);			getchar();			i=find_code(t,n,s);                    /**将学号查找函数返回值赋给i**/			if(i>n-1)				printf("没有学号为%s的学生! \n",s);			else						{				printf("学生学号    学生姓名  性别  年龄   C语言成绩  高等数学  大学英语成绩\n");					printf("%6s %10s %6s %6d %9.1f %10.1f %10.1f\n",								t[i].code,t[i].name,t[i].sex,t[i].age,t[i].score0,t[i].score1,t[i].score2);			}			break;		case 2:			printf("请输入查找的姓名:\n");          /**姓名查找**/			scanf("%s",s);			getchar();			i=find_name(t,n,s);                     /**将姓名查找函数返回值赋给i**/			if(i>n-1)				printf("没有姓名为%s的学生! \n",s);			else			{				printf("学生学号    学生姓名  性别  年龄   C语言成绩  高等数学  大学英语成绩\n");				printf("%6s %10s %6s %6d %9.1f %10.1f %10.1f\n",								t[i].code,t[i].name,t[i].sex,t[i].age,t[i].score0,t[i].score1,t[i].score2);			}			break;		case 3:return;                      /**返回界面函数**/		default:printf("请在1-3之间选择\n");		}	}}
/**按姓名查找函数,参数为学生数组和学生总数以及姓名s**/int find_name(STUDENTS t[],int n,char *s){	int i;	for(i=0;i<n;i++)	{		if(strcmp(s,t[i].name)==0)     /**比较两者是否相等,相等则返回0**/			return i;	}	return i;}
/**按学号查找函数,参数为学生数组和学生总数以及学号no**/int find_code(STUDENTS t[],int n,char *no){	int i;	for(i=0;i<n;i++)	{		if(strcmp(no,t[i].code)==0)    /**比较两者是否相等,相等则返回0**/			return i;	}	return i;}
/**修改学生信息函数**/void modify(STUDENTS t[],int n){	char s1[21];                     /**以姓名和学号最长长度+1为准**/	int ch=0;	int i,item;	system("cls");                     /**清屏**/	printf("请输入要修改的学生学号:\n");	scanf("%s",s1);	for(i=0;i<n;i++)		if(strcmp(t[i].code,s1)!=0)		{				printf("没有找到学号为%s的学生!\n",s1);		}			else			{					printf("------------------\n");				printf("1.修改姓名\n");				printf("2.修改年龄\n");					printf("3.修改性别\n");					printf("4.修改C语言成绩\n");					printf("5.修改高等数学成绩\n");					printf("6.修改大学英语成绩\n");				printf("7.退出本菜单\n");				printf("------------------\n");					printf("学号为%s的学生修改前:\n",s1);					printf("学生学号    学生姓名  性别  年龄   C语言成绩  高等数学  大学英语成绩\n");					printf("%6s %7s %6s %6d %9.1f %10.1f %10.1f\n",										t[i].code,t[i].name,t[i].sex,t[i].age,t[i].score0,t[i].score1,t[i].score2);				while(1)					{							printf("请选择子菜单编号:");						scanf("%d",&item);						switch(item)						{						case 1:								printf("请输入新的姓名:\n");						scanf("%s",t[i].name);								break;					case 2:								printf("请输入新的年龄:\n");								scanf("%d",&t[i].age);									break;						case 3:								printf("请输入新的性别:\n");								scanf("%s",t[i].sex);					break;						case 4:								printf("请输入新的C语言成绩:\n");/**C语言成绩**/								scanf("%f",&t[i].score0); 								break;						case 5:								printf("请输入新的高等数学成绩:\n"); /**高数成绩**/								scanf("%f",&t[i].score1); 								break;							case 6:								printf("请输入新的大学英语成绩:\n");/**英语成绩**/								scanf("%f",&t[i].score2);					break;				case 7:	return;								getchar();						default:printf("请在1-7之间选择\n");						}					}		}}
/**删除函数,参数是结构体数组,记录数**/int del(STUDENTS t[],int n){	char s[21];	int ch=0;	int i;	system("cls");                     /**清屏**/	printf("请输入要删除的学生学号:\n");	scanf("%s",s);	getchar();	i=find_code(t,n,s);	if(i==n)		printf("没有学号为%s的学生! \n",s);	else	{		printf("正在删除中! \n");		for(;i<n;i++)		{			strcpy(t[i].name,t[i+1].name);			strcpy(t[i].code,t[i+1].code);			strcpy(t[i].sex,t[i+1].sex);			t[i].age=t[i+1].age;			t[i].score0=t[i+1].score0;			t[i].score1=t[i+1].score1;			t[i].score2=t[i+1].score2;		}		n--;		printf("删除成功! \n");	}	getchar();	return n;}
/**显示信息,参数为记录数组和总人数**/void list(STUDENTS t[],int n){	int i;	system("cls");	printf("****************************学生清单********************************\n");	printf("学生学号    学生姓名  性别  年龄   C语言成绩  高等数学  大学英语成绩\n");	printf("--------------------------------------------------------------------\n");	for(i=0;i<n;i++)	{		printf("%6s %10s %6s %6d %9.1f %10.1f %10.1f\n",			t[i].code,t[i].name,t[i].sex,t[i].age,t[i].score0,t[i].score1,t[i].score2);				}	printf("--------------------------------------------------------------------\n");	getchar();}
/****保存函数,参数为结构体数组和总人数****/void save(STUDENTS t[],int n){	int i;	FILE * fp ;                             /**指向文件的指针**/	system("cls");	if((fp=fopen("017.txt","w"))==NULL)     /**打开文件,并判断打开是否正常**/	{		printf("无法打开学生记录文件! \n"); /**打开失败**/		exit(1);                            /**退出**/	}	printf("\n正在保存中\n");	fprintf(fp,"%d",n);                     /**将记录数写入文件**/	fprintf(fp,"\r\n");                     /**将换行符号写入文件**/	for(i=0;i<n;i++)	{		fprintf(fp,"%6s %10s %6s %6d %9.1f %10.1f %10.1f",			t[i].code,t[i].name,t[i].sex,t[i].age,t[i].score0,t[i].score1,t[i].score2);		fprintf(fp,"\r\n");                 /**将换行符号写入文件**/	}	fclose(fp);                             /**关闭文件**/	getchar();	printf("--------保存成功---------\n");  /**显示保存成功**/}
/**加载函数,读入参数,参数为结构体数组**/int load(STUDENTS t[]){	int i,n;	system("cls");	FILE * fp;	if((fp=fopen("017.txt","r"))==NULL) /**打开文件**/	{		printf("无法打开学生信息文件! \n");    /**打开失败**/		exit(1);        /**退出**/	}	fscanf(fp,"%d",&n);     /**读入记录数**/	for(i=0;i<n;i++)	{/**按格式读入记录**/		fscanf(fp,"%6s %10s %6s %6d %9.1f %10.1f %10.1f",			t[i].code,t[i].name,t[i].sex,&t[i].age,&t[i].score0,&t[i].score1,&t[i].score2);	}		fclose(fp);                                    /**关闭文件**/	printf("已经成功加载学生信息文件! \n");        /**显示保存成功**/	getchar();	return n;}    
/**排序函数**/void sort(STUDENTS t[],int n){	int i,j,p1,p2,p3,p4;	system("cls");	STUDENTS temp;	for(i=0;i<n-1;i++)	{		for(j=n-1;j>i;j--)			if((strcmp(t[j-1].code,t[j].code))>0)   /**比较学号大小**/			{				/**交换学号**/				strcpy(temp.code,t[j-1].code);      				strcpy(t[j-1].code,t[j].code);				strcpy(t[j].code,temp.code);				/**交换姓名**/				strcpy(temp.name,t[j-1].name);				strcpy(t[j-1].name,t[j].name);				strcpy(t[j].name,temp.name);				/**交换性别**/				strcpy(temp.sex,t[j-1].sex);				strcpy(t[j-1].sex,t[j].sex);				strcpy(t[j].sex,temp.sex);				/**交换年龄**/				p1=t[j-1].age;				t[j-1].age=t[j].age;				t[j].age=p1;				/**交换C成绩**/				p2=t[j-1].score0;				t[j-1].score0=t[j].score0;				t[j].score0=p2;				/**交换高数成绩**/				p3=t[j-1].score1;				t[j-1].score1=t[j].score1;				t[j].score1=p2;				/**交换英语成绩**/				p4=t[j-1].score2;				t[j-1].score2=t[j].score2;				t[j].score2=p2;			}	}	printf("排序成功! \n");	getchar();}
/******主函数******/int main(){	STUDENTS stu[N];                              /**定义结构体数组**/	int length;                                   /**定义学号姓名等长度**/		for(;;)                                       /**无限循环**/	{		switch(menu())                            /**调用界面函数,返回值作为开关语句的条件**/		{			case 0:help();break;                      /**显示操作步骤**/		case 1:load(stu);break;                   /**加载到内存**/		case 2:search(stu,length);break;          /**按姓名查找记录**/		case 3:modify(stu,length);break;          /**按学号修改记录**/		case 4:length=insert(stu);break;          /**输入记录**/		case 5:length=del(stu,length);break;      /**按姓名删除记录**/		case 6:list(stu,length);break;            /**显示全部记录**/		case 7:save(stu,length);break;            /**保存文件**/		case 8:exit(0);                           /**程序结束**/		case 9:sort(stu,length);break;            /**排序**/		}		getchar();		printf("按回车键返回主菜单...\n");        /**提示信息**/	}	return 0;}