C语言程序设计报告上传版.docx
- 文档编号:25270725
- 上传时间:2023-06-06
- 格式:DOCX
- 页数:37
- 大小:687.99KB
C语言程序设计报告上传版.docx
《C语言程序设计报告上传版.docx》由会员分享,可在线阅读,更多相关《C语言程序设计报告上传版.docx(37页珍藏版)》请在冰豆网上搜索。
C语言程序设计报告上传版
C语言程序设计报告
学生成绩管理系统程序设计
姓名:
某某某
学号:
00
班级:
某专业某班
时间:
2013.00.00~2014.00.00
一、程序分析
1.问题背景在学习完了《C程序设计》课程之后,为了训练和提升个人的关于C语言的书写及设计能力,所以进行本次的C语言课程设计。
主要设计一个“学生成绩管理系统”。
2.运行环境MicrosoftVisualC++6.0
3.主要功能
(1)有简单的界面及能与用户进行交互,给出提示和结果。
(2)可以添加学生成绩,并选择、查询每门课程的平均成绩及最高分最低分、查询每个学生的各科成绩及总成绩、查询所有学生的平均总成绩、插入一个学生并录入信息及其各科成绩、修改任一个学生的任一门课程成绩、删除一个学生及其成绩。
(3)退出程序。
二、设计部分
1.关键性问题用什么数据结构对学生的成绩进行操作;如何使菜单循环被选择,直到用户选择退出程序;如何保存学生成绩为文件。
2.问题解决可以用结构体数组对学生信息进行操作;可以用死循环完成菜单选择;可以用文件函数进行对文件存入和载入操作。
3.程序流程图:
主函数(main())
说明:
程序开始,主函数调用菜单函数然后通过菜单函数选择实现以下的10个功能,最后每个功能函数结尾的时候都会再次调用菜单函数形成循环。
以下的num是指程序中的信息数量,flag是指信息是否保存为文件的标记。
添加学生信息(Add())
查询函数(Query())
删除函数(Delete())
新建函数(New())
修改函数(Modify())
退出函数(Quit())
保存函数(Save())
注意:
图中个别繁琐的结构未给出具体流程图,仅用文字简单说明请见谅,具体结构可参见下一部分给出的源码。
载入函数(Load())
排序函数(Sort())
4.程序的总体结构说明本程序的主要功能就是通过文字及简单的图形完成人机交互,对学生成绩进行管理,所以要求做到每个功能要清晰的展现在用户的眼前。
基于以上目的的考虑,所以本程序的结构是先通过主程序(main())调用一个菜单函数(MenuHandle())在屏幕上为用户列出一系列的功能列表如:
新建、添加、删除、修改等选项。
然后根据用户需要选择对应的功能,然后再每个功能函数的最后(除了退出函数Quit())都会返回菜单函数(MenuHandle()),因为整个菜单函数是一个封闭的死循环仅留下一个退出函数(Quit())的出口,所以使得整个程序能够重复的完成不同的功能知道用户选择退出。
除了这些功能函数还有一些为了使程序编写时减轻负担而写的工具函数比如排名函数(Index())、拷贝函数(copy())和查找函数(Find()),工具函数主要服务于上面那些功能函数。
5.函数间的调用关系在程序流程图中可以较清楚的看到这里就不作说明了。
6.数据的组织结构本程序选择的数据结构式数组,每一条信息通过在物理内存中的地址前后位置连接在一起形成单一链表结构,之所以选择数组作为数据的组织结构是因为数组在进行某些操作(如排序)的时候较简单且数据较好管理,出现错误容易查找。
7.函数介绍
本程序包括主函数在内一共有17个函数,其中有10个是功能函数主要由于用户选择管理数据,3个是工具函数只要服务于功能函数完成一些重复性操作。
三、编码部分
1.部分关键源代码及注释
#include
#include
#include
#defineSTUDENT3/*数组初始内存空间开辟量*/
#defineINCREASE20/*内存空间再次开辟增加量*/
#defineCOURSE4/*课程数量*/
voidMenuHandle(void);/*菜单函数*/
intMenuSelect(void);/*菜单选择函数*/
voidNew(void);/*新建函数*/
voidQuit();/*退出函数*/
voidShowTable(void);/*打印表头*/
voidDisplay(void);/*显示函数*/
voidAdd(void);/*添加函数*/
intIndex(floatsum);/*排名函数*/
intSave();/*保存函数*/
intLoad();/*载入函数*/
intFind(char*target,inttargetType,intfrom);/*查找函数*/
voidQuery(void);/*查询函数*/
voidDelete(void);/*删除函数*/
voidcopy(structStudent*_src,structStudent*dest);/*拷贝函数*/
voidModify(void);/*修改函数*/
voidSort();/*排序函数*/
structStudent/*定义结构体数据类型用于管理学生信息*/
{
intindex;
charnumber[12];
charname[20];
intscore[COURSE];
floatsum;
floataverage;
};
typedefstructStudentstu;
intnum=0;/*学生信息总条数*/
stu*record=NULL;/*数组的头部先定义为空*/
charflag=0;/*信息保存标记*/
intarraysize;/*数组大小*/
char*subject[]={"Politics","Maths","English","Computer"};/*科目类型*/
voidmain()/*主函数*/
{
record=(stu*)malloc(sizeof(stu)*STUDENT);/*开辟内存空间*/
if(record==NULL)/*检查是否成功开辟内存空间*/
{
printf("MemoryFail\n");
exit(-1);
}
arraysize=STUDENT;
printf("\n");/*在屏幕上打印出欢迎界面*/
printf("\t****************************************\n");
printf("\t|欢迎使用|\n");
printf("\t|学生成绩管理程序|\n");
printf("\t|可以对学生信息进行管理|\n");
printf("\t|请按提示操作|\n");
printf("\t****************************************\n");
MenuHandle();
}
voidMenuHandle(void)/*菜单选择函数*/
{
for(;;)/*此结构用于构成死循环以达到重复操作的目的*/
{
switch(MenuSelect())/*多选择结构*/
{
case0:
Add();break;
case1:
Modify();break;
case2:
Display();break;
case3:
Query();break;
case4:
Delete();break;
case5:
Sort();break;
case6:
Save();break;
case7:
Load();break;
case8:
New();break;
case9:
Quit();
}
}
}
intMenuSelect()/*菜单选择函数*/
{
chars[2];
intcn=0;
printf("\n");/*在屏幕上打印出功能列表*/
printf("\t|--------------------------------------|\n");
printf("\t|PleaseSelectTheFunctions|\n");
printf("\t|ThoughTheFollowingNumber|\n");
printf("\t|--------------------------------------|\n");
printf("\t****************************************\n");
printf("\t|0.Add增加学生信息|\n");
printf("\t||\n");
printf("\t|1.Modify修改学生信息|\n");
printf("\t||\n");
printf("\t|2.Display显示学生信息|\n");
printf("\t||\n");
printf("\t|3.Query查询学生信息|\n");
printf("\t||\n");
printf("\t|4.Delete删除学生信息|\n");
printf("\t||\n");
printf("\t|5.Sort学生信息排序|\n");
printf("\t||\n");
printf("\t|6.Save保存学生信息|\n");
printf("\t||\n");
printf("\t|7.Load读取学生信息|\n");
printf("\t||\n");
printf("\t|8.New新建记录信息|\n");
printf("\t||\n");
printf("\t|9.Quit退出管理系统|\n");
printf("\t****************************************\n");
printf("\t数字对应功能选择(0-9)的功能:
\n");
for(;;)
{
gets(s);
cn=atoi(s);/*此函数作用是将char中的数字挑出来转换为int*/
if(cn==0&&(strcmp(s,"0")!
=0))/*区分空字符和0*/
cn=11;
if(cn<0||cn>9)
printf("\n输入错误重新选择(0-9):
");
else
break;
}
system("cls");/*清屏*/
returncn;
}
voidNew(void)/*新建函数*/
{
charstr[2];
if(num!
=0)
{
if(flag==0)/*判断是否需要提示用户保存信息为文件*/
{
printf("\t管理系统文件中已经存在学生的记录!
\n");
printf("\t请按提示选择处理已存在记录的方法!
\n");
printf("\t是否保存原有记录?
(Y/N):
\n");/*提示用户保存信息为文件*/
gets(str);
if(str[0]!
='n'&&str[0]!
='N')
Save();
}
printf("\n");
}
num=0;
Add();
}
voidQuit()/*退出函数*/
{
charstr[2];
if(flag==0)/*退出前检查文件是否保存*/
{
printf("\n\t是否保存原有的记录?
(Y/N):
");/*提示用户保存文件*/
gets(str);
if(str[0]=='y'||str[0]=='Y')
Save();
}
printf("\n");
free(record);/*释放内存空间*/
exit(0);/*正常退出*/
}
voidAdd(void)/*添加函数*/
{
charstr[2];
intj;
floatmark,sum;
if(num==0)
printf("\n\t原来没有记录,现在建立新表\n");
else
printf("\n\t在当前表末添加新记录\n");
while
(1)/*死循环重复添加信息*/
{
if(num>=arraysize)/*当实际需要内存空间大于原先开辟的内存空间大小
重新在原内存空间末尾继续开辟内存空间*/
{
arraysize+=INCREASE;
record=(stu*)realloc(record,arraysize*sizeof(stu));
if(record==NULL)
{
printf("MemoryFail!
");
exit(-1);
}
}
system("cls");
printf("\n\t现在一共有%d条记录!
",num);
printf("\n\t你要添加一组信息确定吗?
(Y/N):
");
gets(str);
if(str[0]=='n'||str[0]=='N')
break;
printf("\t请输入学号:
");
gets(record[num].number);
printf("\t请输入姓名:
");
gets(record[num].name);
sum=0;
for(j=0;j { printf("\t请输入%s的成绩: ",subject[j]); gets(str); mark=(float)atof(str); record[num].score[j]=(int)mark; sum+=mark; } record[num].sum=sum; record[num].average=sum/COURSE; record[num].index=Index(sum); num++; } printf("\n\t现在一共有%d条记录\n",num); flag=0; MenuHandle(); } intSave()/*保存函数*/ { FILE*fp; charfname[30]; if(num==0) { printf("\n\t没有记录可存! \n"); return-1; } printf("\n\t输入要存入的文件名(Student): "); gets(fname); strcat(fname,".sas"); printf("\n"); if((fp=fopen(fname,"wb"))==NULL)/*检查文件是否正常打开*/ { printf("\n\t不能存入文件! \n"); return-1; } printf("\n\t存入文件。 。 。 。 。 。 \n"); fwrite(record,sizeof(stu)*num,1,fp); printf("\n\t有%d条信息已经存入文件\n",num); printf("\n\t请继续操作。 。 。 。 。 \n"); flag=1;/*标记为已保存*/ fclose(fp);/*关闭文件*/ return0; } intLoad(void)/*载入函数*/ { FILE*fp; charfname[30]; charstr[2]; if(num! =0&&flag==0) { printf("\n\t请选择是要覆盖现在有记录(Y)还是要"); printf("\n\t将读取的信息添加到现有记录之后(n)? \n"); printf("\n\t直接回车覆盖现有的记录\n");/*提示保存原来的信息*/ gets(str); if(str[0]=='n'||str[0]=='N') { flag=0; } else { if(flag==0) { printf("\n\t读取文件将会更改原来的记录,"); printf("是否保存原来的记录? (Y/N): "); gets(str); if(str[0]=='y'||str[0]=='Y') Save(); } num=0; } } printf("\n\t请输入要想取得文件名(student): "); gets(fname); strcat(fname,".sas"); if((fp=fopen(fname,"rb"))==NULL) { printf("\n\t不能载入文件! \n"); return-1; } printf("\n\t取文件。 。 。 。 。 \n"); while(! feof(fp))/*将文件的信息写入内存空间的数组上*/ { if(num>=arraysize) { arraysize+=INCREASE; record=(stu*)realloc(record,arraysize*sizeof(structStudent)); if(record==NULL) { printf("MemoryFail! "); exit(-1); } } if(fread(&record[num],sizeof(structStudent),1,fp)! =1) break; record[num].index=Index(record[num].sum); num++; } fclose(fp); printf("\t现在共有%d条记录。 ",num); return0; } voidDelete()/*删除函数*/ { charstr[5]; chartarget[20]; inttype,i,j,count; inttmpi; if(num==0) { printf("\n\t没有可供删除的记录! "); return; } while (1) { printf("\n\t查找记录的方式: \n"); printf("\n\t1.按学号查找\n"); printf("\t2.按姓查找\n"); printf("\t3.按名次查找\n"); printf("\t请输入删除的方式: "); gets(str); if(strlen(str)==0) break; if(str[0]=='1') { printf("\n\t请输入欲查询学生的学号: "); gets(target); type=0; } if(str[0]=='2') { printf("\n\t请输入欲查询学生的姓名: "); gets(target); type=2; } if(str[0]=='3') { printf("\n\t请输入欲查询学生的名次: "); gets(target); type=2; } i=Find(target,type,0); count=0; while(i! =-1) { ShowTable(); printf("%-4d\t%-12s%s",record[i].index,record[i].number,record[i].name); for(j=0;j printf("\t%d",record[i].score[j]); printf("\t%.1f\t%.1f\n",record[i].sum,record[i].average); printf("\n\t确定要删除这个学生的信息吗(回车结束)? (Y/N): "); gets(str); if(str[0]=='y'||str[0]=='Y') { num--; count++; } tmpi=record[i].index;/*重新计算排名*/ for(j=i;j { copy(&record[j+1],&record[j]); } for(j=0;j { if(record[j].index>tmpi) record[j].index--; } flag=0; i=Find(target,type,i); } printf("\n\t已删除%d条记录! ",count); } } voidSort()/*排序函数*/ { charstr[5]; inti,j; structStudenttmps; if(num==0) { printf("\n\t没有可供排序的记录! \n"); return; } printf("\n\t请输入排序的方式: \n"); printf("\t1.按学号升序排序\n"); printf("\t2.按学号降序排序\n"); printf("\t3.按名称升序排序\n"); printf("\t4.按名称降序排序\n"); printf("\t5.按名次升序排序\n"); printf("\t6.按名次降序排序\n"); printf("\t7.退出排序\n"); gets(str); if(str[0]<'1'||str[0]>'6') return; for(i=0;i { for(j=i+1;j { if((str[0]=='1'&&strcmp(record[i].number,record[j].number)>0)|| (str[0]=='2'&&strcmp(record[i].number,record[j].number)<0)|| (str[0]=='3'&&strcmp(record[i].name,record[j].name)>0)|| (str[0]=='4'&&strcmp(record[i].name,record[j].name)<0)|| (str[0]=='5'&&record[i].index>record[j].index)|| (str[0]=='6'&&record[i].index { copy(&r
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 报告 上传