学籍成绩管理系统设计报告
一、实验目的:
综合应用所学的C语言程序设计知识,自行设计并实现一个较为完整的
小型管理信息系统。通过系统分析、系统设计、编程实现,写实验报告等环节,初步掌握软件系统的设计方法和步骤,提高灵活运用程序语言进行软件开发的技能,提高程序设计水平和分析问题、解决问题的能力。
二、实验内容:
1):熟悉C语言的开发环境,按照给定的上机步骤练习完成; 2):熟悉C程序的编辑,编译,链接和运行的过程。 3):编译一个应用系统程序,形成一个软件系统。 三、学籍成绩管理系统功能设计要求 :
1. 输入记录:将每一个学生的姓名、学号以及数学、物理、化学、英语、网络课程的成绩作为一个记录。•该软件能建立一个新的数据文件或给已建立好的数据文件增加记录。
2. 显示记录:根据用户提供的记录或根据学生姓名显示一个或几个学生的各门功课的成绩和平均成绩。
3. 修改记录:可以对数据文件的任意记录的数据进行修改并在修改前后对记录内容进行显示。 4.查找记录:可以对数据文件的任意记录的数据进行查找并在查找前后对记录内容进行显示。 5. 删除记录:可删除数据文件中的任一记录。 6.恢复记录:能恢复被删除的任一记录。
7.添加记录:可以在数据文件中添加记录并添加记录后对记录内容进行显示。
8. 统计: (A)计算各门课程全班平均成绩及总成绩;(B)•统计其课程全班得:100分、 9099分、8089分、7079分、6069分、59分以下学生人数及全班总人数的百分比;(C)按字符表格形式打印全部学生的平均成绩(•包括各课总的平均成绩)。
9.保存数据文件功能。 10.打开数据文件功能。
经过逐层逐块、不断细化、求精过程,编写程序并进行测试、验证,可以逐个模块地分开调试,并通
过文件包含或用工程文件的形式进行逐步联合调试。程序运行结果如下表所示(记录个数至少8个)。
学生学籍成绩统计表
序号 01 02 03 04 05 姓名 张望 李小明 张涛 林圆 黄佳 数学 67 78 96 87 79 81.40 物理 89 88 79 93 85 86.80 化学 88 77 93 78 74 82.00 英语 89 94 84 98 92 91.4 网络 平均 81.6 82.2 89.6 88.0 83.2 75 74 96 84 86 83.00 单科平均成绩
三、详细设计及运行结果
1、算法设计
学籍管理系统程序采用了结构化程序设计的思想,将程序分解成许多模块,再由主函数调用这些模块,实现不同的功能。 1、学生信息结构体:储存学生信息。
2、主菜单模块:通过利用输出函数显示输出主菜单信息。
3、提示错误信息模块:通过利用输出函数输出提示错误信息。
4、提示没有找到模块:通过利用输出函数输出提示没有找到该学生。 5、输出中文、英文模块:通过利用输出函数输出中文提示及学生数据。 6、定位模块:定位连表中符要求合的接点,并返回该指针。
7、增加学生信息模块:通过指针的不断后移逐个接受学生信息并将学生信息付给相应变量。
8、查询学生信息模块:根据用户选择按学号或按姓名查询,分别按学号或姓名逐个比较输入的数据与结构体中的数据,有匹配的则输出,没有则提示没有找到。
9、删除信息模块:根据用户选择按学号或按姓名删除,分别比对输入数据和结构体中的数据,有匹配的则删除,没有则提示无信息可删。
10、修改信息模块:通过用户输入的学号找到相应学生,然后逐项修改学生信息,否则提示无此学生。
11、显示信息模块:将学生信息输出。
12、保存信息模块:将接受的结构体信息利用指针存入文件中。 13、排序模块:按照学生的最高分进行排序,输出。
14、统计学生信息模块:逐项比较相邻两项的成绩信息,得到每项最大值,并输出统计结果。
15、主函数:通过调用各模块来实现学生信息的管理。
2、模块图设计 总分
主函数 增删查修加除询改学学学学生生生生信信信信息 息 息 息 按按按按学姓学姓号名号名删删查查除 除 询 询
3、流程图设计
1、主函数
显保学统示存生计 学学总最 生生分高信信排分 息 息 序 总分 按按按按按数英C总平学语语分均成成言排分绩绩成序 排排排绩序 序 序 排序 能 文件是否能打开 不能 提示文件已打开,正在导入 提示文件不能打开 将文件内容放入节点中 关闭文件 输出菜单,请用户选择 Choice 01 增加学生信息 2 删除学生信息 3 查询学生信息 4 修改学生信息 5 保存学生信息 6 统计最高分 7 按总分排名 按最高分打印 8 返回 2、增加学生信息模块:
N 是否存在(Y/N) Y 输入信息 提示学生已存在 给相应变量 返回
3删除学生信息
否 文件是否为空 是 输出提示:1、按学号2、按姓名 1 choice 提示输入学号 提示输入姓名 2 没有资料 接收输入学号 接收输入姓名 是否找到 否是 删除该生信息 提示没有找到 返回
4.查询学生信息
否 文件是否为空 是 输出提示:1、按学号2、按姓名 1 choice 提示输入学号 提示输入姓名 2 提示无资料可查 接收输入学号 接收输入姓名 是否找到 否提示没有找到 是 输出查询结果 返回
4、修改学生信息 是 文件中是否有资料 否 提示输入要修改的学号 提示无资料可修改 接收输入的学号 是否找到 否 提示没有找到 是 写入新数据并给相应变量 提示资料已修改完毕 返回
6、显示学生信息 是 文件是否能打开 否 依次显示学生信息 提示无资料可查 返回
7、保存学生信息
是 文件是否能打开 否 将输入内容存入文件 提示文件打开错误 提示保存完成 返回 8.按总分排序
是 资料知否存在 否 依次比较总分得出最大值 提示无资料查 输出比较结果 返回
9、统计学生最高分
是 资料知否存在 否 依次比较总分得出最大值 提示无资料可统计 依次比较平均分得出最大值 依次比较数学成绩得出最大值 依次比较英语成绩得出最大值 依次比较C语言成绩得出最大值 输出比较结果 返回
四、调试情况,设计技巧及体会
1、本系统在VC6下编译调试通过,可顺利运行,各项功能达到设计要求 本系统采用分模块调试的方法进行编译,即完成一个函数功能模块就编译一个功能模块,最后再进行整体编译并生成可执行文件honest.exe。
在调试过程中主要碰到以下问题:
(1)输入函数中的取地址符即“&”不能正确使用,导致程序在输入数据时发生错误。
(2)在比较两个字符串时不能正确使用“strcmp”函数,导致比较结果不能输出。
(3)在应用指针时没有注意头结点中的数据域中是不存放数据,导致指针指向错误。
2、在这次课程设计中我充分体会到C语言作为一门编程的基本语言它的精妙。通过这次课程设计使我了解到我有很多的不足,在程序调试的时候常常会因为几个错误而弄得心烦,这说明我对知识的掌握还不够牢,在程序设计的过程中也暴露出了我的诸多弊端,借这次课程设计的机会我会认真的加以改正,多多看书 多去图书馆学习,同时应该增强自己的实践能力,为以后的学习打下坚实的基础。
五、源程序清单(略,详见电子版实验报告)
#include #include char num[20]; /*序号*/ char name[10]; /*姓名*/ float score1; /*数学成绩*/ float score2; /*物理成绩*/ float score3; /*化学成绩*/ float score4; /*英语成绩*/ float score5; /*网络成绩*/ float av1; /*平均成绩*/ int vs; /*判断记录是否存在的变量*/ }; /*struct result { int f; int p; }; */ struct student student1; struct student total; FILE *fp; char temper[20]; int index=0; int position=0; /*--------------------------------------------------------------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------------------------------------------------------------*/ void fscan() { float temp1=0,temp2=0,temp3=0,temp4=0,temp5=0,temp6=0; student1.vs=0; fscanf(fp,\"%s%s%f%f%f%f%f%f%d\\n\&temp4,&temp5,&temp6,&student1.vs); student1.score1=temp1; student1.score2=temp2; student1.score3=temp3; student1.score4=temp4; student1.score5=temp5; student1.av1=temp6; } void fprint() { fprintf(fp,\"%-7s%-7s%-7.2f%-7.2f%-7.2f%-7.2f%-7.2f%-7.2f%-7d\\n\me,student1.score1,student1.score2,student1.score3,student1.score4,student1.score5,student1.av1,student1.vs); } void scan(int i) /*输入*/ { float temp1=0,temp2=0,temp3=0,temp4=0,temp5=0; if(i==1||i==8) { printf(\"请输入学生序号: \"); scanf(\"%s\ } if(i==2||i==8) { printf(\"请输入学生姓名: \"); scanf(\"%s\ } if(i==3||i==8) { while(1) { printf(\"请输入数学成绩: \"); scanf(\"%f\ if(temp1<=100&&temp1>=0) {student1.score1=temp1; break; } else printf(\"请输入正确数据!\\n\"); } } if(i==4||i==8) { while(1) { printf(\"请输入物理成绩: \"); scanf(\"%f\ if(temp2<=100&&temp2>=0) {student1.score2=temp2; break; } else printf(\"请输入正确数据!\\n\"); } } if(i==5||i==8) { while(1) { printf(\"请输入化学成绩: \"); scanf(\"%f\ if(temp3<=100&&temp3>=0) {student1.score3=temp3; break; } else printf(\"请输入正确数据!\\n\"); } } if(i==6||i==8) { while(1) { printf(\"请输入英语成绩: \"); scanf(\"%f\ if(temp4<=100&&temp4>=0) {student1.score4=temp4; break; } else printf(\"请输入正确数据!\\n\"); } } if(i==7||i==8) { while(1) { printf(\"请输入网络成绩: \"); scanf(\"%f\ if(temp5<=100&&temp5>=0) { student1.score5=temp5; /* student1.av1=(temp1+temp2+temp3+temp4+temp5)/5; */ break; } else printf(\"请输入正确数据!\\n\"); } } student1.av1=(student1.score1+student1.score2+student1.score3+student1.score4+student1.score5)/5; student1.vs=1; } void print() /*输出*/ { printf(\"|%-7s|%-7s|%-7.2f|%-7.2f|%-7.2f|%-7.2f|%-7.2f|%-7.2f|\\n\udent1.score1,student1.score2,student1.score3,student1.score4,student1.score5,student1.av1); printf(\"-----------------------------------------------------------------\\n\"); } /*表头*/ void handline() { printf(\"-----------------------------------------------------------------\\n\"); printf(\" 序号 姓名 数学 物理 化学 英语 网络 平均\\n\"); printf(\"|-------|-------|-------|-------|-------|-------|-------|-------|\\n\"); } void menu() /*菜单*/ { cleardevice(); setbkcolor(6); textcolor(WHITE); printf(\"\\16[{-20|50@40,40=30(2)9* * * * * * *菜单* * * * * * *}]\"); printf(\"\\16[{-130|100@35,35=30(7)9a 输入}]\"); printf(\"\\16[{-400|100@35,35=30(7)9b 显示}]\"); printf(\"\\16[{-130|145@35,35=30(7)9c 修改}]\"); printf(\"\\16[{-400|145@35,35=30(7)9d 查找}]\"); printf(\"\\16[{-130|205@35,35=30(7)9e 删除}]\"); printf(\"\\16[{-400|205@35,35=30(7)9f 恢复}]\"); printf(\"\\16[{-130|250@35,35=30(7)9g 添加}]\"); printf(\"\\16[{-400|250@35,35=30(7)9h 统计}]\"); printf(\"\\16[{-130|315@35,35=30(7)9i 保存}]\"); printf(\"\\16[{-400|315@35,35=30(7)9j 打开}]\"); printf(\"\\16[{-130|360@35,35=30(7)9k 退出}]\"); } void tothandline() { /*--------------------------------------------------------------------------------------------------------------------------------*/ int i=0; fp=fopen(temper,\"r\"); while(!feof(fp)) { fscan(); if(student1.vs!=0)/*判断是否被删除*/ { i++; } } /*--------------------------------------------------------------------------------------------------------------------------------*/ printf(\"|单科平均成绩 |%-7.2f|%-7.2f|%-7.2f|%-7.2f|%-7.2f|%-7.2f|\\n\e4/i,total.score5/i,total.av1/i); printf(\"-----------------------------------------------------------------\\n\"); } void cleartotal() /*清除统计数据*/ { total.score1=0; total.score2=0; total.score3=0; total.score4=0; total.score5=0; total.av1=0; } /*--------------------------------------------------------------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------------------------------------------------------------*/ void input(); void output(); void change(); void search(); void delete(); void nodelete(); void addto(); void statistics(); /*统计总分*/ void addup(); /*统计函数*/ void save(); void openfile(); void quit(); void choose() /*选择界面*/ { char i='0'; for( ; ;) { menu(); cleartotal(); setbkcolor(3); printf(\"\\16[{-400|370@30,20=11(8)15 请选择a至j}]\"); i=getch(); if(i=='k') quit(); else switch(i) { case'a': input();break;/*调用记录输入函数*/ case'b': output();break;/*调用记录显示函数*/ case'c': change();break;/*调用记录修改函数*/ case'd': search();break;/*调用记录查找函数*/ case'e': delete();break;/*调用记录删除函数*/ case'f': nodelete();break;/*调用记录恢复函数*/ case'g': addto();break;/*调用记录添加函数*/ case'h': addup();break;/*调用记录统计函数*/ case'i': save();break;/*调用数据保存函数*/ case'j': openfile();break;/*调用数据文件打开函数*/ } } } void main() { int drive=DETECT,mode; registerbgidriver(EGAVGA_driver); initgraph(&drive,&mode,\" \"); cleardevice(); setbkcolor(3); printf(\"\\16[co4st8e320,170,0,360,300,70,2,4]\"); printf(\"\\16[{-5|20@30,30=2(14)9 中南大学}]\"); printf(\"\\16[{-55|140@55,50=11(13)8 学生学籍成绩管理系统}]\"); printf(\"\\16[{-300|300@20,20=8(12)3 设计者: 电气信息11xx xxx}]\"); printf(\"\\16[{-480|450@20,20=8(4)3 请按Enter键进入}]\"); getch(); setbkcolor(6); strcpy(temper,\"temp.txt\"); choose(); } /*--------------------------------------------------------------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------------------------------------------------------------*/ void indexup()/*下一页*/ { index++; } void indexdown()/*上一页*/ { if(index>=1) index--; else printf(\"已经是第一页!\"); } void input() /*输入*/ { char ch='0'; cleardevice();clrscr(); printf(\"\\16[{-400|400@32,32=11(8)15 输入功能}]\"); printf(\"\\n\\n\\n 本操作将清空原数据,确定继续?(输入Y或者N)\"); while(1) { scanf(\"%c\ if(ch=='Y'||ch=='y'||ch=='n'||ch=='N') break; else printf(\"\\n请输入”Y“或”N“!\\n\"); } if(ch=='Y'||ch=='y') { if((fp=fopen(temper,\"w\"))==NULL) { printf(\"无法打开这个文件\\n\"); getch(); } else addto(); } fclose(fp); } void output() /*输出*/ { int i=0; char ch; cleardevice();clrscr(); cleartotal(); printf(\"\\16[{-400|400@32,32=11(8)15 显示全部}]\"); if((fp=fopen(temper,\"r\"))==NULL) { printf(\"无法打开文件\\n\"); } else { printf(\"\\n\\n\\n\"); handline(); while(!feof(fp)) { fscan(); if(student1.vs!=0)/*判断是否被删除*/ { i++; statistics(); if(i>=(1+index*7)&&i<(8+7*index)) { print(); } } } } tothandline(); fclose(fp); printf(\"1上一页,2下一页,输入其他键退出,现在第%d页\ ch=getch(); if(ch=='1') { indexdown(); output(); } else if(ch=='2') { indexup(); output(); } } int find(int a) { int r=0; char temp[20],temp2[50]; char i; position=0; /* rewind(fp); */ /*复位函数*/ printf(\"\\n\\n\\n 请选择您需要搜索的关键字:\\n1序号,2姓名(请输入1到2):\"); while(1) { scanf(\"%c\ if(i=='1'||i=='2') break; else printf(\"请正确输入1到2:\"); } if((fp=fopen(temper,\"r+\"))==NULL) { printf(\"无法打开这个文件\\n\"); exit(0); } printf(\"关键字:\"); scanf(\"%s\ printf(\"\\n查询到的信息\\n\"); handline(); while(!feof(fp)) { position=ftell(fp); fscan(); if(i=='1') strcpy(temp,student1.num); else if(i=='2') strcpy(temp,student1.name); if(a==1&&!strcmp(temp,temp2)&&student1.vs==1) { r=1; print(); break; } else if(a==2&&!strcmp(temp,temp2)&&student1.vs==0) { r=1; print(); break; } else if(a==3&&!strcmp(temp,temp2)&&student1.vs==1) { r=1; print(); } } if(r==0) printf(\"\\n\\n查找不到需要的信息\"); /* position=ftell(fp); */ fclose(fp); return(r); } void change() /*修改*/ { int i=0,r=0; cleardevice(); clrscr(); printf(\"\\16[{-400|400@25,25=11(8)15 更新内容}]\"); r=find(1); if((fp=fopen(temper,\"r+\"))==NULL) { printf(\"无法打开这个文件\\n\"); exit(0); } if(r!=0) { printf(\"\\n输入您希望更新的内容\\n1 序号, 2 姓名, 3 数学成绩, 4 物理成绩, 5 化学成绩, 6 英语成绩, 7 网络成绩, 8 所有信息, 0 退出?\\n输入0到8:\"); scanf(\"%d\ if(i==0) choose(); scan(i); rewind(fp); /*复位函数*/ fseek(fp,position,0);/*转到这一行的起始位置*/ fprint(); handline(); print(); } printf(\"\\\按任意键继续\"); getch(); fclose(fp); } void search() { clrscr(); find(3); getch(); } void delete() /*删除*/ { int r=0; char ch; cleardevice(); clrscr(); printf(\"\\16[{-400|400@32,32=11(8)15 删除}]\"); r=find(1); if((fp=fopen(temper,\"r+\"))==NULL) { printf(\"无法打开这个文件\\n\"); exit(0); } if(r!=0) { printf(\"请确定是否删除!(输入Y或者N)\"); while(1) { scanf(\"%c\ if(ch!='Y'&&ch!='y'&&ch!='n'&&ch!='N') printf(\"\\n请输入Y或N!:\"); else break; } if(ch=='Y'||ch=='y') { student1.vs=0; rewind(fp); /*复位函数*/ fseek(fp,position,0);/*转到这一行的起始位置*/ fprint(); printf(\"删除成功!\"); } else printf(\"删除取消。\"); } printf(\"\\\按任意键继续\"); getch(); fclose(fp); } void nodelete() /*恢复*/ { int r=0; char ch; cleardevice(); clrscr(); printf(\"\\16[{-400|400@32,32=11(8)15 恢复}]\"); if((fp=fopen(temper,\"r+\"))==NULL) { printf(\"无法打开这个文件\\n\"); } else { printf(\"\\n 以下是已经删除的数据:\\n\"); handline(); while(!feof(fp)) { fscan(); if(student1.vs==0) print(); } } fclose(fp); printf(\"------------------------------------------------\\n\"); printf(\"***************数 据 回 收 站***************\\n\"); printf(\"------------------------------------------------\\n\"); r=find(2); if((fp=fopen(temper,\"r+\"))==NULL) { printf(\"无法打开这个文件\\n\"); exit(0); } if(r!=0) { printf(\"确定要恢复吗?(输入(Y/N)):\"); while(1) { scanf(\"%c\ if(ch!='Y'&&ch!='y'&&ch!='n'&&ch!='N') printf(\"\\n请输入Y或N!:\"); else break; } if(ch=='Y'||ch=='y') { student1.vs=1; rewind(fp); /*复位函数*/ fseek(fp,position,0);/*转到这一行的起始位置*/ fprint(); printf(\"恢复成功!\"); } else printf(\"操作取消!\"); } printf(\"\\\按任意键继续\"); getch(); fclose(fp); } void addto() /*添加数据*/ { char ch; if((fp=fopen(temper,\"a\"))==NULL) { printf(\"无法打开这个文件\\n\"); exit(0); } while(1) { cleardevice();clrscr(); printf(\"\\16[{-400|400@32,32=11(8)15 添加记录}]\"); scan(8); fprint(); handline(); print(); printf(\"继续输入或退出(N或者E)\"); getchar(); while(1) { scanf(\"%c\ if(ch=='N'||ch=='e'||ch=='E'||ch=='n') break; else printf(\"\\n请输入N或者E\"); } if(ch=='E'||ch=='e') { break; } } fclose(fp); } 因篇幅问题不能全部显示,请点此查看更多更全内容