学生成绩记录簿设计

  • 格式:doc
  • 大小:253.65 KB
  • 文档页数:31

课程设计(大作业)报告课程名称:程序设计基础设计题目:学生成绩记录簿设计院系:信息技术学院班级:xx设计者:xx学号:xx指导教师:xx设计时间: xx信息技术学院昆明学院课程设计(大作业)任务书目录一.问题的定义 (5)二、需求分析 (5)三、总体设计 (5)四、详细设计 (6)五、调试与测试 (30)六、结语 (31)一.问题的定义编制一个C语言成绩记录簿,每个学生信息包括:学号、姓名、C语言成绩。

要求:1.数据存储采用文件形式。

2.标准的C语言输入输出3.功能完善,适当注释4.模块化设计、结构化编程二、需求分析系统能实现以下主要功能:1.系统以菜单方式工作2. 创建学生成绩信息并以磁盘文件保存;3. 读取磁盘文件并显示输出所有学生的成绩;4. 查询学生成绩(1)按学号查询成绩(2)学号姓名查询成绩4.添加成绩记录;5.修改指定姓名或学号的学生的成绩并可存盘;6.显示输出60分以下、60~79、80~89、90分以上各分数段的学生信息。

三、总体设计根据系统的要求,系统总体设计如图1所示。

图1 系统总体结构四、详细设计该部分主要包括:数据结构设计、函数设计(包括函数原型、算法思想、流程描述)、代码设计及程序运行结果显示。

(一) 学生成绩数据结构设计#include<stdio.h>#include<stdlib.h>#include<string.h>int i,j,k,y;FILE *fp;Struct stu{int no;char name[30];float cscore;long a;};struct stu s[100];(二) 函数设计1. 主函数main()允许用户通过菜单进行功能选择,使用相应的功能代码来调用对应的函数功能。

2. 其他各功能函数(1) 学生成绩信息录入函数void input()算法思想:①依次录入结构体数组中所包含的各个成员;②直到输入的结构体成员中信息全部为0,数据输入结束;③返回实际录入的学生成绩信息数。

(2) 将学生成绩信息输出为void output()算法思想:①定义结构体变量的指针变量;②输出所输入的全部信息,若不能输出信息给出提示信息;③将文件中的信息依次读出,最后结构体的指针为NULL。

(3)从文件中修改学生成绩信息void modify()算法思想:①定义指向结构体变量的指针和指向文件的指针;②修改方式分为两种(学号和姓名),选择是给出相应的信息;③将修改后的信息保存,并提示。

3. 流程描述(1)菜单函数int fun(){int n;system("cls");printf("\n\n\t\t\t\t 成绩记录薄");printf("\n\n\t\t\t");for(i=0;i<33;i++)printf("*");printf("\n");printf("\t\t\t ************菜单*************\n");printf("\t\t\t* 1、创建学生的信息!\t*\n");printf("\t\t\t* 2、输出所有学生的信息!\t*\n");printf("\t\t\t* 3、修改成绩!\t*\n");printf("\t\t\t* 4、查询!\t*\n");printf("\t\t\t* 5、显示成绩分段的学生信息!\t*\n");printf("\t\t\t* 6、学生成绩排名!\t*\n");printf("\t\t\t* 7、退出成绩记录薄!\t*\n");printf("\t\t\t");for(i=0;i<33;i++)printf("*");printf("\n\n");printf("\n\t\t\t 请输入选项:");scanf("%d",&n);return n;}(2) 学生成绩信息录入函数void input(){system("cls");i=0;fp=fopen("out.dat","w");printf("请以0作为输入学生学号信息的结束!\n");do{printf("输入学生的学号:");scanf("%d",&s[i].no);printf("输入学生的姓名:");scanf("%s",s[i].name);printf("输入学生的C语言成绩:");scanf("%f",&s[i].cscore);printf("输入添加成绩的时间:");scanf("%ld",&s[i].a);if(s[i].no!=0)fprintf(fp,"%d %-4s %.1f %ld\n",s[i].no,s[i].name,s[i].cscore,s[i].a);}while(s[i].no!=0);fclose(fp);}void output() //学生全部信息输出{if((fp=fopen("out.dat","r"))==NULL){printf("Cannot open the file!\n");}printf("\t\t\t全部的学生信息:\n");k=0;while(fscanf(fp,"%d%s%f%ld",&s[k].no,s[k].name,&s[k].cscore,&s[k].a)!=EOF) {printf("\t\t\t%d\t%s\t%.1f\t%ld\n",s[k].no,s[k].name,s[k].cscore,s[k].a);k++;}fclose(fp);}(3)学生信息输出函数void output(){if((fp=fopen("out.dat","r"))==NULL){printf("Cannot open the file!\n");}printf("\t\t\t全部的学生信息:\n");k=0;while(fscanf(fp,"%d%s%f%ld",&s[k].no,s[k].name,&s[k].cscore,&s[k].a)!=EOF) {printf("\t\t\t%d\t%s\t%.1f\t%ld\n",s[k].no,s[k].name,s[k].cscore,s[k].a);k++;}fclose(fp);}(4)修改学生信息函数void modify(){char st[30];int x,num;float nu;long h;k=0;system("cls");if((fp=fopen("out.dat","r"))==NULL){printf("Cannot open the file!\n");return;}while(fscanf(fp,"%d%s%f%ld",&s[k].no,s[k].name,&s[k].cscore,&s[k].a)!=EOF) {k++;}fclose(fp);printf("输入1表示用学号修改,输入2表示用姓名修改!请选择:\n");scanf("%d",&x);if(x==1){printf("请输入修改成绩人的学号:");scanf("%d",&num);for(i=0;i<k;i++)if(num==s[i].no){printf("请输入修改的成绩:\n");scanf("%f",&nu);s[i].cscore=nu;printf("请输入修改的时间:\n");scanf("%ld",&h);s[i].a=h;fp=fopen("out.dat","w");for(i=0;i<k;i++)fprintf(fp,"%d %s %.1f %ld\n",s[i].no,s[i].name,s[i].cscore,s[i].a);fclose(fp);printf("修改成功\n");return;}printf("没有找到该生的信息!\n");return;}if(x==2){printf("请输入修改成绩人的姓名:");scanf("%s",st);for(i=0;i<k;i++)if(strcmp(s[i].name,st)==0){printf("请输入修改的成绩:\n");scanf("%f",&nu);s[i].cscore=nu;printf("请输入修改成绩的时间:\n");scanf("%ld",&h);s[i].a=h;fp=fopen("out.dat","w");for(i=0;i<k;i++)fprintf(fp,"%d %s %.1f %ld\n",s[i].no,s[i].name,s[i].cscore,s[i].a);fclose(fp);printf("修改成功\n");return;}printf("没有找到该生的信息!\n");return;}(5) 代码设计和执行结果1.头文件Struct stu{int no;/*学号*/char name[30]; /*姓名*/float cscore; /*成绩*/long a; /*时间*/};struct stu s[100];/******以下是函数原型*******/void input() /*输入记录*/void output()/*输出记录*/void modify()/*修改记录*/2.源程序代码与运行结果#include<stdio.h>#include<stdlib.h>#include<string.h>int i,j,k,y;FILE *fp;struct stu //结构体函数的定义{int no;char name[30];float cscore;long a;};struct stu s[100];int fun() //目录函数{int n;system("cls");printf("\n\n\t\t\t\t 成绩记录薄");printf("\n\n\t\t\t");for(i=0;i<33;i++)printf("*");printf("\n");printf("\t\t\t ************菜单*************\n");printf("\t\t\t* 1、创建学生的信息!\t*\n");printf("\t\t\t* 2、输出所有学生的信息!\t*\n");printf("\t\t\t* 3、修改成绩!\t*\n");printf("\t\t\t* 4、查询!\t*\n");printf("\t\t\t* 5、显示成绩分段的学生信息!\t*\n");printf("\t\t\t* 6、学生成绩排名!\t*\n");printf("\t\t\t* 7、退出成绩记录薄!\t*\n");printf("\t\t\t");for(i=0;i<33;i++)printf("*");printf("\n\n");printf("\n\t\t\t 请输入选项:");scanf("%d",&n);return n;}void input() //输入学生的学号、姓名、成绩信息{system("cls");i=0;fp=fopen("out.dat","w");printf("请以0作为输入学生学号信息的结束!\n");do{printf("输入学生的学号:");scanf("%d",&s[i].no);printf("输入学生的姓名:");scanf("%s",s[i].name);printf("输入学生的C语言成绩:");scanf("%f",&s[i].cscore);printf("输入添加成绩的时间:");scanf("%ld",&s[i].a);if(s[i].no!=0)fprintf(fp,"%d%-4s%.1f%ld\n",s[i].no,s[i].name,s[i].csc ore,s[i].a);}while(s[i].no!=0);fclose(fp);}void output()//学生全部信息输出{if((fp=fopen("out.dat","r"))==NULL){printf("Cannot open the file!\n");}printf("\t\t\t全部的学生信息:\n");k=0;while(fscanf(fp,"%d%s%f%ld",&s[k].no,s[k].name,&s[k].cscor e,&s[k].a)!=EOF){printf("\t\t\t%d\t%s\t%.1f\t%ld\n",s[k].no,s[k].name,s[k].cscore ,s[k].a);k++;}fclose(fp);}void modify() //修改学生信息{char st[30];int x,num;float nu;long h;k=0;system("cls");if((fp=fopen("out.dat","r"))==NULL){printf("Cannot open the file!\n");return;}while(fscanf(fp,"%d%s%f%ld",&s[k].no,s[k].name,&s[k].cscor e,&s[k].a)!=EOF){k++;}fclose(fp);printf("输入1表示用学号修改,输入2表示用姓名修改!请选择:\n");scanf("%d",&x);if(x==1){printf("请输入修改成绩人的学号:");scanf("%d",&num);for(i=0;i<k;i++)if(num==s[i].no){printf("请输入修改的成绩:\n");scanf("%f",&nu);s[i].cscore=nu;printf("请输入修改的时间:\n");scanf("%ld",&h);s[i].a=h;fp=fopen("out.dat","w");for(i=0;i<k;i++)fprintf(fp,"%d%s%.1f%ld\n",s[i].no,s[i].name,s[i].cscor e,s[i].a);fclose(fp);printf("修改成功\n");return;}printf("没有找到该生的信息!\n");return;}if(x==2){printf("请输入修改成绩人的姓名:");scanf("%s",st);for(i=0;i<k;i++)if(strcmp(s[i].name,st)==0){printf("请输入修改的成绩:\n");scanf("%f",&nu);s[i].cscore=nu;printf("请输入修改成绩的时间:\n");scanf("%ld",&h);s[i].a=h;fp=fopen("out.dat","w");for(i=0;i<k;i++)fprintf(fp,"%d %s %.1f %ld\n",s[i].no,s[i].name,s[i ].cscore,s[i].a);fclose(fp);printf("修改成功\n");return;}printf("没有找到该生的信息!\n");return;}}void lookat()//学生信息查询{char st[30];int x,num;k=0;system("cls");if((fp=fopen("out.dat","r"))==NULL){printf("Cannot open the file!\n");return;}while(fscanf(fp,"%d%s%f%ld",&s[k].no,s[k].name,&s[k].cscor e,&s[k].a)!=EOF){k++;}printf("输入1表示用学号查询,输入2表示用姓名查询!请选择:\n");scanf("%d",&x);if(x==1){printf("请输入查询的学号:");scanf("%d",&num);for(i=0;i<k;i++)if(num==s[i].no){printf("%d%s%.1f%ld\n",s[i].no,s[i].name,s[i].cscore,s[i ].a);return;}printf("对不起,找不到该生!\n");return;}if(x==2){printf("请输入查询的姓名:");scanf("%s",st);for(i=0;i<k;i++)if(strcmp(s[i].name,st)==0){printf("%d%s%.1f%ld\n",s[i].no,s[i].name,s[i].cscore,s[i ].a);return;}printf("对不起,找不到该生!\n");}}void subsection() //学生成绩分段{system("cls");k=0;if((fp=fopen("out.dat","r"))==NULL){printf("Cannot open the file!\n");}while(fscanf(fp,"%d%s%f%ld",&s[k].no,s[k].name,&s[k].cscor e,&s[k].a)!=EOF){k++;}printf("\t\t\t 90分以上学生的信息!\n");for(i=0;i<k;i++)if(s[i].cscore>=90)printf("\t\t\t%d%s%.1f%ld\n",s[i].no,s[i].name,s[i].csco re,s[i].a);printf("\n\n");printf("\t\t\t 80到89分学生的信息!\n");for(i=0;i<k;i++)if(s[i].cscore<90&&s[i].cscore>=80)printf("\t\t\t%d%s%.1f%ld\n",s[i].no,s[i].name,s[i].csco re,s[i].a);printf("\n\n");printf("\t\t\t 60到79分学生的信息!\n");for(i=0;i<k;i++)if(s[i].cscore>=60&&s[i].cscore<80)printf("\t\t\t%d%s%.1f%ld\n",s[i].no,s[i].name,s[i].csco re,s[i].a);printf("\n\n");printf("\t\t\t 60分以下学生的信息!\n");for(i=0;i<k;i++)if(s[i].cscore<60)printf("\t\t\t%d%s%.1f%ld\n",s[i].no,s[i].name,s[i].csco re,s[i].a);printf("\n\n");}void rank() //成绩的排序{struct stu t;k=0;system("cls");if((fp=fopen("out.dat","r"))==NULL){printf("Cannot open the file!\n");}while(fscanf(fp,"%d%s%f%ld",&s[k].no,s[k].name,&s[k].cscor e,&s[k].a)!=EOF){k++;}for(i=0;i<k;i++)for(j=i+1;j<k+1;j++)if(s[i].cscore<s[j].cscore){t=s[i];s[i]=s[j];s[j]=t;}for(i=0;i<k;i++)printf("\t\t\t第%d 名%d %-4s %.1f %ld\n",i+1,s[i].no,s[i].name,s[i].cscore,s[i].a); }void choose(int n) //目录的选项{system("cls");switch(n){case 1:input();printf("\n\n\n\n\t\t\t是否返回?输入1表返回,输入2表退出!\n");scanf("%d",&y);if(y==1)choose(fun());break;case 2:output();printf("\n\n\n\n\t\t\t是否返回?输入1表返回,输入2表退出!\n");scanf("%d",&y);if(y==1)choose(fun());break;case 3:modify();printf("\n\n\n\n\t\t\t是否返回?输入1表返回,输入2表退出!\n");scanf("%d",&y);if(y==1)choose(fun());break;case 4:lookat();printf("\n\n\n\n\t\t\t是否返回?输入1表返回,输入2表退出!\n");scanf("%d",&y);if(y==1)choose(fun());break;case 5:subsection();printf("\n\n\n\n\t\t\t是否返回?输入1表返回,输入2表退出!\n");scanf("%d",&y);if(y==1)choose(fun());break;case 6:rank();printf("\n\n\n\n\t\t\t是否返回?输入1表返回,输入2表退出!\n");scanf("%d",&y);if(y==1)choose(fun());break;case 7:exit(0);break;default:printf("\n\n\t\t\t 输入没有的选项,请重新输入!\n");choose(fun());}}void main() //主函数{int n;system("cls");n=fun();choose(n);}执行结果如图所示:(1)菜单(2)创建学生信息(3)退出创建学生信息(4)输出全部的学生信息(5)用学号修改学生信息(6)用姓名修改学生信息(7)没有找到该学生的信息(8)以开始输入的学生信息作对比五、调试与测试起初,我们在运行程序的时候,程序基本上都能运行,并且也都可以达到一些基本的要求,但是在我们做完一项需求的时候,该程序并不能返回到菜单就直接结束了,当再次打开该程序的时候,以前输入的信息都保存了。