学生成绩管理系统C语言Word文档格式.docx
《学生成绩管理系统C语言Word文档格式.docx》由会员分享,可在线阅读,更多相关《学生成绩管理系统C语言Word文档格式.docx(32页珍藏版)》请在冰点文库上搜索。
首先,温习一下C语言课本,重拾一下当时学C时的好的思想和方法。
再者,拿出一下午和晚上的时间做完排序题目。
最后,拿出全部精力攻克学生成绩管理软件编程。
写实验报告
课程设计过程及结果
编程环境及工具
环境变量的应用和设置
批处理及命令行编译
C/C++工程的组成,软件开发环境的使用,重点掌握软件调试。
排序与简单分析
简单分析:
题目是“把一个完全由小写字母组成字符串按照每个字母的出现次数从低到高重新排序”。
首先分析题目要求的是字母,而且是小写字母,不同字母出现的次数相同的在一起并按字母表顺序排列,出现次数越多越靠后,如aassdfkjiowea回车后变成defijkowssaaa。
程序设计思路:
首先对输入的字符串用比较法进行排序,然后从前往后找字母个数分别为1,2,3,4,5·
·
直到N的字符,输出即可。
由于字母是事先排好序的,所以从前往后输出字母的顺序是字母表顺序。
综合设计
功能实现
文件读入
fscanf(文件指针,格式字符串,输入表列);
文件的读入是fscanf的应用。
首先在工程文件夹中建立一个文本文件,fscanf以“r”(只读方式)打开这个文本文件,并将这个文本文件中的内容以空格键为分隔符读入内存中。
读入程序如下图:
信息显示
信息显示同样是fscanf函数的应用,首先将文件中的数据读入内存中,然后用标准输出函数printf输出,学生信息表的信息输出如右图,编写的程序如下图,成绩表显示时其中的课程号要换成课程名称输出。
此功能遇到的问题:
用fscanf函数时写入浮点数成绩时,
只能写成如下格式:
fscanf(p2,"
%s%s%f"
stus[i].num,stus[i].cnum,&
stus[i].score);
而不能写成:
%s%s%.1f"
否则将显示一团乱码。
数据录入
fprintf(文件指针,格式字符串,输入列表);
fprintf函数和fscanf函数都是格式化读写函数,对象都是磁盘文件。
Fprintf和fscanf功能相反,它是把内存中的数据写到文件型指针fp指定的文件上去。
首先用fopen函数以“w”方式打开文件,如果没有此文件就以该文件名在工程文件夹中新建一个文件。
数据录入的设计思路是:
在屏幕中输入一条记录,通过scanf函数写入结构体(即内存)中,再通过fprintf函数把内存中的数据输出到指定的文件中。
注意输入时要做一下判断,判断输入的学号是否是学生表中存在的数据,如是在学生表中不存在则不往内存中输,屏幕打印“errornuminput!
”,需重新输入。
输入的课程号和输入学号一样需做一下判断。
再者成绩文件打开时要以文本追加形式打开,也可以用读写文本形式打开,再用指针定位到文件末尾进行数据录入。
输入完成后可以查看输入后的学成成绩表,如图。
数据录入的部分主要程序如下所示:
p2=fopen("
C.txt"
"
r+"
);
fseek(p2,0,2);
//对文件的追加
for(i=0,c='
'
;
c=='
i++)
{
printf("
\n输入学生的成绩记录:
\n学号:
"
for(j=0;
j==0;
)
{
scanf("
%s"
stus[i].num);
for(k=0;
k<
N;
k++)
if(strcmp(stus[i].num,stud[k].num)==0)
j=1;
if(j==1)
break;
else
printf("
errornuminput!
}
课程号:
stus[i].cnum);
if(strcmp(stus[i].cnum,cou[k].cnum)==0)
成绩:
scanf("
%f"
&
fprintf(p2,"
%4s%4s%.1f\n"
stus[i].num,stus[i].cnum,stus[i].score);
L=L+1;
\n*<
继续录入按空格键确认>
*\n"
c=getch();
}
fclose(p2);
成绩查询
成绩查询是文件中的数据输入数据区后,进行的一系列逻辑性的查找。
通过输入学号进入事先定义的字符型数组,然后通过在“C.txt”中查找该学号的学生所修课程的成绩输出。
改程序的算法为:
Step1:
用scanf函数将文件中的数据导入内存数据区中;
Step2:
定义字符型数组存储输入的学生学号;
Step3:
输入学号在文件3中查找是否有相同的字符串,若有则执行step4,若无则执行step;
Step4:
通过学号在文件1中查找到该生的姓名班级输出;
Step5:
通过学号找到对应的课程号,在文件2中找到相对应的课程名称和相应的学分。
课程名称输出,学分要根据文件3中所得的分数输出,如果分数小于60分则输出实得学分为0,如果分数大于60,则学分按原样输出,执行step7;
Step6:
输出“该学生无修课程记录请重新输入学号”;
Step7:
输入一个字符判断该字符是否为空格键,若是的则跳到step3,否则往下执行;
Step8:
算法结束。
对指定的课程的成绩排序功能
此功能的算法为:
Step1:
建立一个整型数组和一个字符型数组;
Step2:
输入课程号存在字符型数组中;
Step3:
将字符型数组中的字符串和文件3中的课程号进行比较,如果有相同的字符串则把此结构体的标号记下来存到整形数组中;
Step4:
用整形数组的值作为文件3结构体的标号,在文件3中找相同的值,若存在相同的值则执行step5,否则执行step;
Step5:
,进行比较为此标号的分数,比较法进行从大到小排列输出;
Step6:
根据文件3中的课程名找到相应的学号,找到学号后在文件1中输出对应的姓名;
Step7:
根据文件3中的课程号在文件2中找到相应的课程名输出,执行step9;
Step8:
输出“*<
!
无此课程的相关记录>
*”;
Step9:
输入一个字符,判断是不是空格键若是则返回step2;
否则输出“*<
此功能已退出!
>
*”,算法结束。
对成绩记录的删除
设计思路:
要想删除文件中的数据,首先以只读方式“r”打开,将这个文件中的数据输入内存中关闭文件型指针,然后以只读方式“w”打开(此时文件为空文件),然后将内存中的和要删除的数据不相同的记录再输出到文件,即可完成删除。
此功能设计算法:
将文本中的数据输入内存中;
将该文本删除后重新建立,创建字符型数组。
要是删除学生记录,则输入学号,在文件1中逐个查找当学号和文件1中的记录不相同时输出到文件中;
在文件3中查找当文件3中的数据和输入时学号不相同时导出到文件3中;
要是删除课程中的记录,则采用相同的方法在文件2和文件3中查找,不相同时重新导出到相应的文件中;
接收一个字符,判断是不是空格键,若是则返回step2
判断是否打印已经删除后的文件,若是则把相应的文件打印出来,结束;
否则不打印,算法结束。
保存功能
重新建立三个文件用来存放上次操作后保存的数据,当执行保存功能时因为原来的文件已经在操作中更改,故不需任何操作推出即可;
当不执行保存功能时,由于要恢复上次操作后(及本次操作前的数据),就可以把新建的三个文件中的数据重新输出到本次操作的文件中即可完成不保存。
程序异常处理
指针定位问题:
如果用fopen打开文件往内存中输入数据后,此时文件型指针已经指向末尾,若此时再想调用文件中的数据就会出错,必须再关闭文件再打开或者使用文件型指针定位使文件指针指向文件开头。
删除功能问题:
删除时当输入的数据较少时该功能能够准确无误的把删除后的数据输出到文件夹中,并能正确显示;
当删除数据较多时如删到五个以上时就会出现问题,其实输出到文件中的数据没有问题,显示时就会有少的数据。
成绩录入功能问题:
该功能存在和删除功能同样的问题,当文件中的成绩记录小于20时该功能能够成功录入,并能正确显示,超过20条记录时,就会出现如下图的对话框,我知道这是内存分配问题导致的,但始终未能改出来。
特色功能
界面友好:
功能菜单选择时,看到大部分学生的程序运行时,遇到需要选择的情况就要输入功能但后的数字,通过switch()语句进行转换到相应的功能,感到很乏味就想到了本程序的选择法,运用了转义字符“\r”的回车不换行功能,用Tab键实现跳格(也可以换成其他键的ASCII)。
选择时就只需按一个键(如Tab键)选择相应的功能再按回车键就行了,无需满键盘找相应的字母按,这种方式实现了操作界面友好。
进入菜单时,有几个光标闪几下才能进入功能菜单,这运用了时间延迟函数,老师您验程序时很生气地说我是故意的,说实在的我是怕您看不到,之前故意把闪动次数调大的。
这个设计对我这样的小程序无疑是毫无用处,我想对以后编的大程序是不是会有一定的缓冲作用,再此只是表明了我的一个想法。
能够完成保存功能:
未想到用保存功能之前,添加或删除时总是在操作前备份一次,操作后在复制进去,这样很是麻烦,想到程序运行结束时能不能自己把原来操作前的数据再导进已经操作的文件中去。
保存函数功能是:
删除数据或者添加数据时如果添加错了或删除错了能够恢复原来的数据即不保存。
课程设计总结
此次课程设计不仅让我们回顾了C语言,也让我们更好的了解C语言的应用和编程方法,尤其是最后一道编程题,虽然编的程序不尽是非常完美,但让我学到了很多东西。
猛然发现当初在课堂上学到的还不到C的一个角,C语言的许多功能都未曾涉及到。
上课时编的程序最多不过五十行,如今编的程序竟然达到五六百行,这是当时想都没有想到的。
以前看到的那些眼花缭乱的程序我也可以实现,心中莫名升起一种自豪感。
软件各功能之间除基础的之外几乎没有什么联系,这让我明白了各大公司为什么分模块编程,有的功能很好而有的功能不是很完美,这也许是软件之间的优异性所在吧。
以前觉得文件是很高级的编程方法,如今用起来也能得心应手,对该软件的编程就用了fscanf和fprintf两个函数,其余的都是逻辑设计方面的问题。
这种设计不仅让我学到了许多东西,而且让我开阔了视野,这个软件的程序除了一个函数getch()是网上搜的之外其余都是自己编的。
让我大为获益的一点是C可以调用其他方面的功能或转换成其他功能,比如转换成DOS功能,以后要对C语言多多学习来更好的掌握它。
看到其他同学编的软件,有密码和计算平均分的功能,
课程设计计划执行情况
各项计划都进行的挺顺利,只是时间来不及了书没看完就去编程,转换方法编程序时哪里不会就去找课本和资料。
我理解的C++
C++是比C更高级的语言。
主流的3种操作系统Windows,Linux,Unix,内核都是用C语言和汇编写的,上层高级特性是用C++写的。
我们玩的许多游戏如《魔兽》等都是用C++编写的。
改进设想
查询功能
该功能不能计算平均分,设想能够计算出查询出来的成绩的平均分,并能够实现把查询出的成绩记录从大到小和从小到大排列之间切换。
具有统计和防错功能
能够识别出输入的是字符还是数字,以至于在输入学号时给与提示输入字符还是数字,使界面更加友好。
能够统计出各个文件中的记录,比如说分宿舍时需要统计出学生数量就可以调用此功能。
保存功能的该进
在软件现有保存功能的基础上在增加保存时可以把操作的文件在存储到未操作的文件中,这样就使备用的未操作文件组保存,成为下一次操作的源文件,这一设计思路未能设计的原因是:
即使保存文件操作后,由于程序中存在宏定义的值,这个值不能改变。
此次设想定义全局变量,把上次运算的值记在文件中攻下一次调用,这样就可以实现真正意义上的保存功能了。
附录关键代码
排序程序
#include<
stdio.h>
string.h>
#defineN255
intM;
voidmain()
{
inti,j,k,t;
chara[N];
printf("
请输入小于%d个小写字母:
\n"
N);
scanf("
a);
M=strlen(a);
for(i=0;
i<
M;
for(j=i;
j<
j++)
if(a[i]>
a[j])
{
k=a[i];
a[i]=a[j];
a[j]=k;
}
for(t=1;
t<
=M;
t++)
for(i=0;
i+=k)
k=0;
for(j=i;
if(a[j]==a[i])
k++;
if(k==t)
for(j=1;
=t;
printf("
%c"
a[i]);
}
学生成绩管理软件程序
stdlib.h>
conio.h>
#defineN6
#defineM6
#defineY12
intP=N,Q=M,L=Y;
structstudent
charnum[20];
charname[20];
charsex[20];
charclas[20];
}stud[N];
structcourse
charcnum[20];
charcname[20];
intcredit;
}cou[M];
structstuscore
floatscore;
}stus[Y];
voidDelete()//-------------------------------------------------------------------------------------删除函数
inti,t=0,s=0,m=1,c,f=N,g=Y;
chara[20];
voidxstu();
voidscore();
FILE*DA,*DB,*DC;
DA=fopen("
A.txt"
r"
DB=fopen("
B.txt"
DC=fopen("
P;
fscanf(DA,"
%s%s%s%s"
stud[i].num,stud[i].name,stud[i].sex,stud[i].clas);
Q;
fscanf(DB,"
%s%s%d"
cou[i].cnum,cou[i].cname,&
cou[i].credit);
L;
fscanf(DC,"
fclose(DA);
fclose(DB);
fclose(DC);
for(c='
删除学生记录>
**<
删除课程记录>
//对学生记录和课程记录进行选择删除
for(m=9,s=0;
m==9;
s++)
if(m==9)
if(s%2==0)
*\r"
if(s%2==1)
printf("
m=getch();
if(m=='
\r'
if(s%2==0)//删除学生记录
{
*****************************************************\n"
请输入要删除的学生学号:
w"
//换成W后新建删除后的新文件
//fseek(RA,0,2);
//删除后的数放在原有数据后
f;
{
if(strcmp(a,stud[i].num)!
=0)
{
fprintf(DA,"
%10s%10s%10s%10s\n"
}
else
P=P-1;
}
DC=fopen("
//fseek(RC,0,2);
g;
if(strcmp(a,stus[i].num)!
fprintf(DC,"
%10s%10s%.1f\n"
L=L-1;
\n\n!
该学号及相关记录已经删除!
\n*****************************************************\n"
fclose(DA);
fclose(DC);
xstu();
score();
}
if(s%2==1)//删除课程记录
按空格键继续执行删除功能>
*\n\n"
c=getch();
if(c=='
f=f-1;
g=g-1;
voidin()//-----------------------------------------------------------------------------------------成绩录入函数
FILE*p2,*iA,*iB;
inti,j,k,c,m,t;
p2=fopen("
iA=fopen("
iB=fopen("
fscanf(iA,"
fscanf(iB,"
Y;
fscanf(p2,"
fclose(iA);
fclose(iB);
添加%d条记录成功,是否查看成绩表>
i);
<
是>
否>
for(m=0,t=9;
m>
=0;
m++)
if(t==9)
if(m%2==0)
if(m%2==1)
t=getch();
if(t