C语言课设.docx
《C语言课设.docx》由会员分享,可在线阅读,更多相关《C语言课设.docx(29页珍藏版)》请在冰豆网上搜索。
C语言课设
课程设计报告(参照262页9.3)
课程名称:
C语言程序设计Ⅲ
课程设计名称:
学生成绩管理系统
学生姓名:
专业班级:
学号:
实验成绩:
一、课设目的和要求
[题目描述]
设计一个学生成绩管理系统,主要提供学生资料的输入、输出、查询、删除、排序等,该程序应该具有下列功能:
(1)设计一个功能显示菜单,并有选择提示。
(2)增加信息:
增加学生信息,包括学好、姓名以及5门功课的成绩。
(3)删除信息:
输入待删除的学号,删除该学号学生的所有信息。
(4)修改信息:
可更新学生信息。
输入待编辑学生的学号,系统显示该学生原有信息,然后按提示进行更新。
(5)查找信息:
输入一个学号,查出并显示该学生的相关信息。
(6)成绩排序:
按学生平均成绩从大到小进行排序输出。
(7)输出信息:
输出全部学生信息。
(8)退出:
退出系统。
[题目要求]
(1)按照分析、设计、编码、调试和测试的软件开发过程完成这个应用程序;
(2)学生信息应包括:
学号、姓名、5门功课(语文、数学、英语、物理、计算机)的成绩;
(3)为各项操作功能设计一个菜单,应用程序运行后,先显示这个菜单,然后用户通过菜单项选择希望进行的操作项目。
[输入要求]
应用程序运行后,在屏幕上显示一个菜单。
用户可以根据需求,选定相应的操作项目。
进入每个操作后,根据应用程序的提示信息,从键盘输入相应的信息。
[输出要求]
(1)应用程序运行后,要在屏幕上显示一个菜单。
(2)要求用户输入数据时,要给出清晰、明确的提示信息,包括输入的数据内容、格式及结束方式等。
[提示]
设计一个顾客结构体和一个房间结构体,用来保存顾客信息和房间信息
[扩展功能]
将所有顾客和房间的信息分别写入文件中,并实现文件读写的操作。
二、课设内容
使用了一个结构体来描述学生信息,共有学号(number)、姓名(name)、五个科目的成绩、平均分(AVE)、排名参数(arra)、排序用值(AVE2)等10个成员。
使用6个操作模块:
增加(add)、删除(del)、修改(edit)、查找(find)、排序(arrange)、全显示(displayall),来表述要求的操作;使用6个应用函数:
菜单(displayMenu)、显示(display)、输入(input)、搜索(Search)、清零(zero)、检查选项(check)进行各模块中的操作,共使用12个函数。
程序中首先把各个数据设定为0。
“增加”操作中,0项作为可编辑的空项(输入的学号不能为0,否则有提示),先通过后台参数设定总项目数为常量N,每增加一个询问是否继续增加,无可增加的空项时有提示。
若增加一定数量信息后中断增加,可以再次选择进入增加模块,从已有信息之后进行输入,而不会对上次输入的信息造成任何影响。
平均分在输入完毕后自动计算。
“删除”操作中以清零表示删除,输入函数中逐个数据提示输入,查找函数为以学号项查找,删除、编辑模块中均有确认提示。
“排序”操作中先把平均分项输入到一个临时数组中,再从1到N给每条信息赋予临时排名,通过计算交换临时平均分数组和排名项,原始数据不发生变化,输出时通过排名项找到数据,输出的仍然是原始数据。
在“增加”和“修改”操作中都引用了输入函数,这个函数中有检查学号是否与已有学号重复或是否为0的步骤,如果有重复的学号或输入的学号为0,则提示并取消此操作,防止误操作以及在搜索时出现问题。
在“增加”、“删除”和“修改”操作中都有确认提示,需要从键盘输入“Y”或“N”(大小写均可)进行后续工作,为了防止误操作,这里引用了“检查选项”函数,在“Y”“N”(大小写均可)以外的符号算作非法,不会进行任何操作,并提示重新输入,只有输入合法的选项时程序才会继续运行。
程序中全部使用中文菜单及提示以便阅读和编辑。
三、程序流程图(可附页手绘)
1.主函数流程图
2.增加信息模块
3.删除信息模块
4.修改信息模块
5.查找信息模块
6.成绩排名模块
7.输入函数
8.选项检查函数
(其他函数较为简单,流程图省略不画)
四、程序代码及注释
/*头文件*/
#include
#include
#include
#include
#defineN20
/*创建结构体*/
typedefstructs{
intnumber;
charname[80];
intChi;
intMat;
intEng;
intPhy;
intCom;
intAVE;
intAVE2;
intarra;
}STUDENT;
/*函数声明*/
voidadd(STUDENTs[]);/*六个模块:
增加、删除、修改、查找、排序、全显示*/
voiddel(STUDENTs[]);
voidedit(STUDENTs[]);
voidfind(STUDENTs[]);
voidarrange(STUDENTs[]);
voiddisplayall(STUDENTs[]);
voiddisplayMenu();/*六个函数:
菜单、显示、输入、搜索、清零、检查选项*/
voiddisplay(STUDENTs[],intn);
intinput(STUDENTs[],inti);
intSearch(STUDENTs[],intn);
voidzero(STUDENTs[],intn);
charcheck(charchoice);
/*清零函数*/
voidzero(STUDENTs[],inti)
{s[i].number=0;
strcpy(s[i].name,"0");
s[i].Chi=0;
s[i].Mat=0;
s[i].Eng=0;
s[i].Phy=0;
s[i].Com=0;
s[i].AVE=(s[i].Chi+s[i].Mat+s[i].Eng+s[i].Phy+s[i].Com)/5;
s[i].arra=0;
}
/*主函数*/
main()
{
inti;
STUDENTs[N];
intchoice;
printf("\n==欢迎使用学生成绩管理系统!
==\n");
printf("\n--------11046133smallstone--------\n");
/*全部数据清零*/
for(i=0;izero(s,i);
}
/*重复显示菜单*/
do{
displayMenu();
scanf("%d",&choice);
switch(choice){
case1:
add(s);break;
case2:
del(s);break;
case3:
edit(s);break;
case4:
find(s);break;
case5:
arrange(s);break;
case6:
displayall(s);break;
case0:
printf("\n\n谢谢使用!
\n\n");break;
default:
printf("\n错误,请重新输入\n");break;
}
}while(choice!
=0);
}
/*显示菜单模块*/
voiddisplayMenu()
{
printf("\n=============MENU============");
printf("\n1------增加信息");
printf("\n2------删除信息");
printf("\n3------修改信息");
printf("\n4------查找信息");
printf("\n5------成绩排序");
printf("\n6------显示全部");
printf("\n0------结束程序");
printf("\n=============================");
printf("\n请选择要进行的操作:
");
}
/*输入函数*/
intinput(STUDENTs[],inti){
intj;
intk=0;
intx;
x=s[i].number;/*记录原始学号数据*/
printf("\n请输入新学生的学号:
\n");
scanf("%d",&s[i].number);
if(s[i].number==0)/*检查输入的学号是否合法*/
{printf("\n输入的学号不能为0!
\n");
s[i].number=x;
k=1;}
else
for(j=0;jif(s[i].number==s[j].number&&i!
=j){
printf("\n此学号已经存在!
\n");
k=1;
s[i].number=x;
break;
}
}
if(k!
=1){
printf("\n姓名:
\n");
scanf("%s",&s[i].name);
printf("\n语文成绩:
\n");
scanf("%d",&s[i].Chi);
printf("\n数学成绩:
\n");
scanf("%d",&s[i].Mat);
printf("\n英语成绩:
\n");
scanf("%d",&s[i].Eng);
printf("\n物理成绩:
\n");
scanf("%d",&s[i].Phy);
printf("\n计算机成绩:
\n");
scanf("%d",&s[i].Com);
s[i].AVE=(s[i].Chi+s[i].Mat+s[i].Eng+s[i].Phy+s[i].Com)/5;/*计算平均分*/
printf("\n你输入的学生信息是:
");
display(s,i);}/*显示结果*/
returnk;
}
/*显示单个数据函数*/
voiddisplay(STUDENTs[],inti){
printf("\n学号:
%20d\n姓名:
%20s",s[i].number,s[i].name);
printf("\n成绩(语文,数学,英语,物理,计算机,平均分):
\n%4d,%4d,%4d,%4d,%4d,%4d\n",s[i].Chi,s[i].Mat,s[i].Eng,s[i].Phy,s[i].Com,s[i].AVE);
}
/*按学号搜索单个数据函数*/
intSearch(STUDENTs[],intn)
{inti;
for(i=0;iif(n==s[i].number)
break;}
if(i==N){
return-1;}/*未找到返回-1*/
else
returni;/*找到则返回找到的值*/
}
/*检查选项函数*/
charcheck(charchoice){
intp=0;
if((choice=='Y')||(choice=='y')||(choice=='N')||(choice=='n')){p=1;}
if(p!
=1){
do{printf("输入错误,请重新选择:
\n");
scanf("%s",&choice);
if((choice=='Y')||(choice=='y')||(choice=='N')||(choice=='n')){p=1;}
}while(p!
=1);}
returnchoice;
}
/*增加信息模块*/
voidadd(STUDENTs[])
{
inti=0;
intk=0;
charchoice;
for(i=0;iif(s[i].number==0)
break;}/*检查是否为空位置*/
do{
if(s[i].number==0){/*从空位置开始执行输入循环*/
printf("\n\n输入第%d个学生信息:
",i+1);
k=input(s,i);
if(k==0){i++;}
printf("\n\n继续增加学生?
(Y是/N否)\n");/*继续运行提示*/
scanf("%s",&choice);
choice=check(choice);
}
else{
printf("\n存储空间不足.\n");/*无空位提示*/
break;
}
}while((choice=='Y')||(choice=='y'));
}
/*删除信息模块*/
voiddel(STUDENTs[])
{
inti,n;
intp=0;
charchoice;
printf("\n请输入要删除学生的学号:
");
scanf("%d",&n);
i=Search(s,n);/*搜索信息*/
if(i==-1){
printf("\n未找到符合的学生信息或信息为空.\n");}
else{
printf("\n找到的学生信息为:
");
display(s,i);/*显示结果*/
printf("\n确实要删除此条信息?
(Y是/N否)\n");/*显示确认*/
scanf("%s",&choice);
choice=check(choice);
if((choice=='Y')||(choice=='y')){
zero(s,i);/*数据清零*/
printf("\n已删除.\n");}
}
}
/*修改信息模块*/
voidedit(STUDENTs[])
{
inti,n;
intk=0;
charchoice;
printf("\n请输入要修改信息的学号:
");
scanf("%d",&n);
i=Search(s,n);/*搜索信息*/
if(i==-1){
printf("\n未找到符合的学生信息或信息为空.\n");}
else{
printf("\n找到的学生信息为:
");
display(s,i);}/*显示结果*/
printf("\n确实要编辑此条信息?
(Y是/N否)\n");/*显示确认*/
scanf("%s",&choice);
choice=check(choice);
if((choice=='Y')||(choice=='y')){
printf("\n输入新的学生信息:
\n");/*输入新信息*/
k=input(s,i);
}
}
/*查找信息模块*/
voidfind(STUDENTs[])
{
inti,n;
printf("\n请输入要查找信息的学号:
");
scanf("%d",&n);
i=Search(s,n);/*搜索信息*/
if(i==-1){
printf("\n未找到符合的学生信息或信息为空.\n");}
else{
printf("\n找到的学生信息为:
");
display(s,i);}
}
/*成绩排名模块*/
voidarrange(STUDENTs[])
{
inti,j,max;
intb=1;
inta=1;
inttemp1,temp2;
for(i=0;i<=N;i++){
s[i].AVE2=s[i].AVE;}/*为临时平均分赋值*/
for(i=0;i<=N;i++){
s[i].arra=b;
b++;}/*按顺序做初始排名*/
for(i=0;imax=i;
for(j=i+1;jif(s[j].AVE>s[max].AVE)
max=j;
}
if(max!
=i){
temp1=s[i].arra;
s[i].arra=s[max].arra;
s[max].arra=temp1;
temp2=s[i].AVE2;
s[i].AVE2=s[max].AVE2;
s[max].AVE2=temp2;}/*比较临时平均分并交换排名和临时平均分*/
}
do{for(i=0;iif(s[i].arra==a)
{
printf("排名:
%d",s[i].arra);
display(s,i);
a++;
break;}
}
}while(a!
=N);
}
/*显示所有信息模块*/
voiddisplayall(STUDENTs[])
{
inti;
for(i=0;idisplay(s,i);
}
}
五、结果记录
1.主界面:
这里少一张主界面的截图,自己补上哈!
!
!
2.输入信息:
(依次输入信息1,2,3)
3.删除信息:
(先选择信息1,不确认,再选择信息2,将信息2清空)
4.修改信息:
(将信息1内容修改为4)
5.按学号查找信息:
(以学号3找到相应信息,以学号2没找到,因其已被删除)
6.成绩排序:
(按平均分从大到小输出信息及相应名次)
7.显示信息
(按输入的顺序输出):
8.继续补充信息:
(提示从空白的第二位置开始)
9.学号输入非法提示:
(输入的学号为零或与之前的学号重复均为非法)
10.选项错误提示:
(只有大写或小写的“Y”或“N”才是合法的选项)
11.存储空间已满提示:
(空间总数由程序后台赋值确定)
12.退出程序提示:
六、问题及解决方法,心得(大哥,你能自己写就自己写!
!
!
)
出现较多的一个问题是在程序运行过程中常常出现运行错误,导致程序自动退出,经检查是在输入、读出函数时使用变量i,j等时没有给它们赋值,加入赋值语句后问题解决。
遇到的第一个问题是在执行模块后程序不能返回主菜单或显示主菜单后程序自动结束,经查是在从课本上抄写函数时使用的选项选择函数和作业的要求不同,删除这个函数,并把显示菜单及读取选项的语句加入主函数的循环后问题解决。
在编写输入函数input时,发现的第一个问题是终端输入后若再次运行输入模块,原有的信息就会被新的信息替换,经查是由于每次输入时都是从结构体的第一个位置开始的,加入检查空位并从空位开始循环的语句后问题解决。
这个程序中多个模块都涉及相同的操作,如“增加”“修改”都涉及输入信息操作,“修改”“删除”“查找”都涉及搜索信息操作,各个函数都需要用到显示信息操作,一开始是复制同样的内容多次,后来发现这样既显得嵌套混乱又不便修改程序,开始使用函数把这些操作都独立出来,各个模块中只需引用相应的函数即可。
最后解决的一个问题是字符型结构体成员的赋值问题,最初name项无法像其他整型成员一样加入初始值和清零,显示出的是一排乱码,后来经过查资料才回忆起来可以使用strcpy函数对它进行赋值。
有时软件没有错误提示,程序却运行不正常,最后才发现是if,while等操作中等号少了一个。
程序逐渐完善后,我开始对一些使用起来不方便的地方进行调整。
例如在Y/N选项时原来只有选Y时继续运行,而输入不是Y的其他值时都会执行相当于选N时的操作,在输入过快时容易误操作。
又如输入学号重复或输入为0时都会对搜索、删除、修改造成影响。
最后我都加入语句和函数做了修改。
在编程的过程中,我加深了对编程知识的了解,对C语言有了更深的认识。
同时掌握了几个调试程序的方法,例如把用到的变量先输出观察,再检查是否是赋值过程中出现了问题。
同时,我知道了一个程序的完善是一个逐渐进行的过程,需要不断地测试、调整、修改,也需要耐心和细心,这样才能完成一个良好的程序。
另一方面我也发现,有很多我们想要进行的操作都不能够以我们现在掌握的知识完成,学习程序是一个漫长而且不容易的过程。