资源描述
C语言课程设计 实验题目 学生信息管理系统一、引言 1熟练掌握C语言编程的应用的相关操作。 2综合应用C语言的知识,实现一个完整的系统,提高编程能力,体会软件程序的开发过程。 3. 培养学生独立完成C语言程序课程设计的能力4运用结构体和链表编辑一个简单的学生基本信息管理系统,使之能够完成学生基本信息的创建、修改、添加、查询、删除、排序、输出、退出操作。5执行编译操作,并根据提示调试此程序,排除所有的错误和警告。直到编译成功为止。6执行运行操作,逐一对每个模块进行调试。直到全部程序运行成功为止。 二、 需求分析1该学生信息管理系统,完成学生基本信息的录入、修改、添加、查询、删除、排序、输出、退出操作。 每个模块的功能如下: A、录入模块能够完成学生姓名、性别、学号、年龄、出生年月、入学年月的输入。 B、更新模块中可以对学生信息进行添加、删除、修改。 C、打印模块可以输出以保存的所有学生信息。 D、查询模块能按学号或姓名查询一个学生的全部信息,并能显示该学生的全部信息,可以查询所有已经录入的学生信息。 E、排序模块将按照学生学号的顺序进行所有学生基本信息的排序并显示。 F、退出模块可直接退出此程序,结束操作。2创建该学生信息管理系统目的就是能够对学生基本信息进行创建、修改、添加、查询、删除、排序等功能,这样可以简化许多人工做起来很复杂的问题,它还可以重复使用,方便、快捷。三、概要设计1. 设计方案主 函 数 录入模块 查询模块 输出(打印)模块 添加模块 排序模块 修改模块 删除模块2、模块功能说明(1)录入模块:对定义的学生信息结构体变量,利用循环,将键入的学生 保存至指定文件,其中,学号、姓名、性别定义为字符型,年龄、出生年月,入学年月都定义为整型。 (2)添加模块:选择添加信息选项,按系统提示依次输入基本信息,完毕后,将询问是否继续。 (3)修改模块:选择修改选项,输入要修改学生的姓名,利用循环、判断语句,找到对应的信息,可对任意一项进行修改,完毕后,询问是够继续。 (4)删除模块:选择删除选项,可继续选择按学号或按姓名删除。选择后,将打印出其基本信息,询问是否确认删除。利用覆盖删除法,删除所选的项目。 (5)输出模块:利用读函数,读取键入的信息,出入编辑好的表格及所有学生信息。(6)查询模块:此模块有2种查询方式:按姓名查询、按学号查询。它也是通过循环判断查找,如果找到则显示该学生的全部信息,否则,将输出没有查到该学生信息,,给以提示。(7)排序模块:对学生的学号进行排序。利用选择排序法排序,最后保存结果。四、详细设计及运行结果流程图录入模块输入学生基本信息输入完毕返回主菜单否是主函数录入模块函数查询模块函数输出模块函数添加模块函数排序模块函数修改模块函数删除模块函数按姓名查询按学号查询按学号删除按所选项修改添加模块输入要添加人的学号输入添加学生的全部信息返回主菜单继续?是否删除模块按姓名删除按学号删除返回上一级菜单显 示删除人 的信 息返回菜单确认删除修改模块输入修改学生学号显示学生基本信息查询信息存在不存在学号姓名性别年龄入学年月选择修改项显示修改后信息返回主菜单是否继续是否排序模块排序方式按学号排序显示排序结果返回主界面查 询 模 块按 姓 名 查 询按 学 号 查 询输出所查询的学生信息返回主界面六调试情况,设计技巧及体会1.调试: 输入学生信息的情况,按照编写的程序进行进行调试,输出学生信息情况、添加、删除、查询(1按学号or2按姓名)、排序、修改等学生信息的管理的情况,退出程序。2.设计技巧: 通过运用C语言的语法规则,结构体和链表编写简单的学生信息管理系统。运用模块,编写各个小程序是指连接成一个完整的学生信息管理系统,使程序更加严谨,简洁,清晰,实用。3.体会: 我对自己这次的实验设计完成的还比较满意,这个学生管数组知识运用C+编写完成。此程序的不足之处是学生基本信息方面还不够完善,譬如没有家庭住址,电话号码等相关的学生基本信息。课程设计看似简单,实则不然。 它花费了近一周的时间写程序,以后的大多数时间就在调程序,从构思到结构大体框架再到细节。这让我明白“宏观主宰全局,细节决定成败”的道理,即使是小到一个分号也有可能使你的程序无法运行。写程序的时候必须很认真,欲速则不达。在实习中,我深刻体会到老师发挥的重要作用:C语言程序对我们来说比较难,在匆忙的学习中更是难上加难,但在老师的帮助下我学会了如何调试,如何查找系统没有提示的错误,最后终于排除万难把程序搞定,体会到原来编程也挺有意思的。七、源程序(略,详见电子版实验报告)#includestdio.h#includestdlib.h#includestring.h#define MAX 100#define N 3struct day_type /*日期结构体类型*/ int year; int month; ;struct student_type char num8; /*学号*/ char name20; /*姓名*/ char sex1; /*性别*/ int age; /*年龄*/ struct day_type birthday; /*出生年月*/ struct day_type comingday; /*入学年月*/ ;int number;int read_file(struct student_type students) FILE *fp; int i=0; if(fp=fopen(student.txt,rt)=NULL) printf(n 库存文件不存在,请创建!n); return 0; while(!feof(fp) fread(&studentsi,sizeof(struct student_type),1,fp); if(studentsi.num=0) break; else i+; fclose(fp); return i;void save_file(struct student_type students,int sum) FILE *fp; int i; if(fp=fopen(student.txt,wt)=NULL) printf(读文件错误n); return; for(i=0;isum;i+) if(fwrite(&studentsi,sizeof(struct student_type),1,fp)!=1) printf(写文件错误n); fclose(fp); /*输入模块*/int input(struct student_type students) int i=0; system(cls); printf(n请输入要录入的学生的个数(最多%d个):n,MAX); scanf(%d,&number); printf(nn 录入学生信息 (最多录入%d个)n,number); printf( -n); while(inumber) printf(n 第%d个学生,i+1); printf(n 学生学号:);scanf(%s,studentsi.num);if( studentsi.num=0) break; printf(n 学生姓名:); scanf(%s,studentsi.name); printf(n 学生性别(男为m,女为w):); scanf(%s,studentsi.sex); printf(n 学生年龄:); scanf(%d,&studentsi.age); printf(n 学生出生年月(yyyy-mm):);scanf(%d-%d,&studentsi.birthday.year,&studentsi.birthday.month); printf(n 学生入学年月(yyyy-mm):); scanf(%d-%d,&studentsi.comingday.year,&studentsi.comingday.month); i+; printf(n %d个学生信息录入完毕!n,i); getchar(); printf(n 按回车键返回主菜单!); getchar(); return i; /*输出模块*/void output(struct student_type students,int sum) FILE *fp; int i=0; system(cls); fp=fopen(student.txt,rt); printf(n -学生信息表- nn); printf(学生学号-学生姓名-学生性别-学生年龄-出生年月(yyyy-mm)-入学年月(yyyy-mm)n); printf(-n);do fread(&studentsi,sizeof(struct student_type),1,fp);if(studentsi.num!=0) printf(%6s %8s %3s %4d %10d-%2d %10d-%2dn,studentsi.num,studentsi.name,studentsi.sex,studentsi.age,studentsi.birthday.year,studentsi.birthday.month,studentsi.comingday.year,studentsi.comingday.month); printf(-n); i+; while(isum); getchar(); printf(按回车键返回主菜单); getchar(); fclose(fp);void modify(struct student_type students,int sum) /*修改模块*/ int i=0,choice,flag; char modify_num8; do system(cls); printf(n 输入要修改的学生的学号:);scanf(%s,modify_num);for(i=0;isum;i+)if(!strcmp(studentsi.num,modify_num) printf(n -学生信息- n ); printf(学生学号-学生姓名-学生性别-学生年龄-出生年月(yyyy-mm)-入学年月(yyyy-mm)n); printf(-n); printf(%6s %8s %3s %4d %10d-%2d %10d-%2dn,studentsi.num,studentsi.name,studentsi.sex,studentsi.age,studentsi.birthday.year,studentsi.birthday.month,studentsi.comingday.year,studentsi.comingday.month); printf(1.学生学号 2.学生姓名 3.学生性别 4.学生年龄 5.出生年月(yyyy-mm) 6.入学年月(yyyy-mm)n); printf(请输入要修改项的编号(选择1-6):); scanf(%d,&choice); switch(choice) case 1: printf(n 输入修改后的学生学号:); scanf(%s,studentsi.num); break; case 2: printf(n 输入修改后的学生姓名:); scanf(%s,studentsi.name); break; case 3: printf(n 输入修改后的学生性别:); scanf(%s,studentsi.sex); break; case 4: printf(n 输入修改后的学生年龄:); scanf(%d,&studentsi.age); break; case 5: printf(n 输入修改后的学生出生年月(yyyy-mm):); scanf(%d-%d,&studentsi.birthday.year,&studentsi.birthday.month); break; case 6: printf(n 输入修改后的学生入学年月(yyyy-mm):); scanf(%d-%d,&studentsi.comingday.year,&studentsi.comingday.month); break; printf(n -学生信息-(修改后) n ); printf(学生学号-学生姓名-学生性别-学生年龄-出生年月(yyyy-mm)-入学年月(yyyy-mm)n); printf(-n); printf(%6s %8s %3s %4d %10d-%2d %10d-%2dn,studentsi.num,studentsi.name,studentsi.sex,studentsi.age,studentsi.birthday.year,studentsi.birthday.month,studentsi.comingday.year,studentsi.comingday.month); getchar(); break; if(i=sum) printf(n 该学生不存在); getchar(); save_file(students,sum); printf(nn 继续修改吗?( Y/N(选择N则返回主菜单) )); choice=getchar();if(choice=Y|choice=y) flag=1; printf(n 继续修改!n); else flag=0;while(flag=1); printf(n);void reserch(struct student_type students,int sum) /*查询模块*/ int i=0,choice,flag; char reserch8; do system(cls); printf(n 请选择查询方式(1或2): 1.按学号 2.按姓名n);scanf(%d,&choice);switch(choice) case 1: printf(n 请输入要查询的学生的学号:); scanf(%s,reserch); for(i=0;isum;i+) if(!strcmp(studentsi.num,reserch) printf(n -学生信息- n ); printf(学生学号-学生姓名-学生性别-学生年龄-出生年月(yyyy-mm)-入学年月(yyyy-mm)n); printf(-n); printf(%6s %8s %3s %4d %10d-%2d %10d-%2dn,studentsi.num,studentsi.name,studentsi.sex,studentsi.age,studentsi.birthday.year,studentsi.birthday.month,studentsi.comingday.year,studentsi.comingday.month); getchar(); break;break; case 2: printf(n 请输入要查询的学生的姓名:); scanf(%s,reserch); for(i=0;isum;i+) if(!strcmp(studentsi.name,reserch) printf(n -学生信息- n ); printf(学生学号-学生姓名-学生性别-学生年龄-出生年月(yyyy-mm)-入学年月(yyyy-mm)n); printf(-n); printf(%6s %8s %3s %4d %10d-%2d %10d-%2dn,studentsi.num,studentsi.name,studentsi.sex,studentsi.age,studentsi.birthday.year,studentsi.birthday.month,studentsi.comingday.year,studentsi.comingday.month); getchar(); break;break;if(i=sum) printf(n 该学生不存在); getchar();printf(nn 继续查询吗?( Y/N(选择N则返回主菜单) ));choice=getchar();if(choice=Y|choice=y) flag=1; printf(n 继续修改!n); else flag=0;while(flag=1); printf(n);void sort(struct student_type students,int sum) /*排序模块*/ int i,j; struct student_type t; system(cls); for(i=0;isum-1;i+) for(j=i+1;j0) t=studentsi; studentsi=studentsj; studentsj=t; printf(n按学号排序:nn); printf(n -学生信息表- nn); printf(学生学号-学生姓名-学生性别-学生年龄-出生年月(yyyy-mm)-入学年月(yyyy-mm)n); printf(-n); for(i=0;isum;i+) printf(%6s %8s %3s %4d %10d-%2d %10d-%2dn,studentsi.num,studentsi.name,studentsi.sex,studentsi.age,studentsi.birthday.year,studentsi.birthday.month,studentsi.comingday.year,studentsi.comingday.month); printf(-n); getchar(); printf(n 按回车键返回主菜单!); getchar();int del(struct student_type students,int sum) /*删除模块*/ int i,j,k=0; char del_num8; system(cls); printf(请输入需要删除的学生信息的学号nn); scanf(%s,del_num); for(i=0;isum;i+) if(!strcmp(studentsi.num,del_num) for(j=i;jsum-1;j+) studentsj=studentsj+1;else k+; if(k=sum) printf(该学生不存在n); getchar(); printf(按回车键返回主菜单); getchar();return(sum); else save_file(students,sum);printf(删除成功:n); getchar(); printf(n 按回车键返回主菜单!); getchar(); return(sum-1); /*添加模块*/void add(struct student_type students,int *sum) int i,flag; char choice; system(cls); i=(*sum); do if(iMAX) printf( 请输入要添加的学生的信息:n); printf(n 学生学号:);scanf(%s,studentsi.num);if(studentsi.num=0) break; printf(n 学生姓名:); scanf(%s,studentsi.name); printf(n 学生性别(男为m,女为w):); scanf(%s,studentsi.sex); printf(n 学生年龄:); scanf(%d,&studentsi.age); printf(n 学生出生年月(yyyy-mm):); scanf(%d-%d,&studentsi.birthday.year,&studentsi.birthday.month); printf(n 学生入学年月(yyyy-mm):); scanf(%d-%d,&studentsi.comingday.year,&studentsi.comingday.month); (*sum)+; i=(*sum); getchar(); printf(n 成功添加一个学生的信息!n); getchar(); printf(n 是否继续添加?( Y/N(选择N则返回主菜单) )n); choice=getchar(); if(choice=Y|choice=y) flag=1; printf(n 继续添加!n); else flag=0; else printf(n 返回主菜单n); break; while(flag=1);void main() int choice,sum; /system(color ) struct student_type studentsMAX; sum=read_file(students)-1; if(sum=0) printf(按回车键开始录入基本库存信息!); getchar();sum=input(students); save_file(students,sum); do system(cls); printf(n *学生信息管理系统*nn);printf( 1.重新录入学生信息 nn);printf( 2.查询学生信息 nn);printf( 3.输出学生信息 nn);printf( 4.添加学生信息 nn);printf( 5.排序学生信息 nn);printf( 6.修改学生信息 nn);printf( 7.删除学生信息 nn);printf( 0.退出系统 nn);printf( 请选择您要执行的操作(0-7)n);scanf(%d,&choice);switch(choice) case 1: sum=input(students); save_file(students,sum); break; case 2: reserch(students,sum); break; case 3: save_file(students,sum); output(students,sum); break; case 4: add(students,&sum); save_file(students,sum); break; case 5: sort(students,sum); break; case 6: modify(students,sum); save_file(students,sum); break; case 7: sum=del(students,sum); save_file(students,sum); break; case 0: break; while(choice!=0); save_file(students,sum); 八、参考文献 王曙燕.C语言程序设计.北京:科技出版社.2008
展开阅读全文