资源描述
内蒙古科技大学课程设计论文
内蒙古科技大学
本科生课程设计论文
题 目:学生成绩管理系统
学生姓名:胡书培
学 号:1067111106
专 业:计算机科学与技术
班 级:10级—计算机1班
指导教师:周李涌
2010年 12 月 30 日
目录
内蒙古科技大学课程设计任务书 3
学生成绩管理系统 4
【摘要】 4
1.论文题目:学生成绩管理系统 4
2.技术参数、设计步骤: 4
3.设计理论分析方法: 5
4.设计结论及分析: 5
4.1 各个函数功能简单分析: 5
4.1.1主菜单函数(main): 5
4.1.2输入函数(input): 5
4.1.3输出函数(display): 6
4.1.4查找(find): 6
4.1.5修改(change): 6
4.1.6删除(del): 6
4.1.7添加(add): 6
4.1.8读入(read): 6
4.1.9保存(save): 6
4.1.10排序(sort): 6
4.1.11学号排序(sortx): 7
4.1.12不及格输出(no_pass): 7
4.1.13输出(shuchu): 7
5.参考文献: 7
6. 附录: 8
6.1 程序部分: 8
内蒙古科技大学课程设计任务书
课程名称
C语言课程设计
设计题目
学生成绩管理系统
指导教师
周李涌
时间
2010.12.27——2010.12.31
一、教学要求
1. 巩固和加深学生对C语言课程的基本知识的理解和掌握
2. 掌握C语言编程和程序调试的基本技能
3. 利用C语言进行基本的软件设计
4. 掌握书写程序设计说明文档的能力
5. 提高运用C语言解决实际问题的能力
二、设计资料及参数
每个学生在教师提供的课程设计题目中任意选择一题,独立完成,题目选定后不可更换。
某班学生成绩管理,包括以下功能:
v 从键盘输入包括学号、姓名、各门课程成绩(不少于2门),并将其保存在磁盘文件student里
v 打开文件后,计算每个人的总分和平均分,排序并保存
v 具有在文件中进行单项查询或多项查询的功能(即能够按照给定的关键字,如姓名等找出满足条件的纪录)
v 具有输出文件数据信息的功能
三、设计要求及成果
1. 分析课程设计题目的要求
2. 写出详细设计说明
3. 编写程序代码,调试程序使其能正确运行
4. 设计完成的软件要便于操作和使用
4. 设计完成后提交课程设计报告
四、进度安排
第一天 选择课程设计题目,分析课题的要求
第二天 编程
第三天 编程及调试
第四天 写课程设计报告
第五天 提交课程设计报告(打印稿及电子稿)
五、评分标准
1. 根据平时上机考勤、表现和进度,教师将每天点名和检查
2. 根据课程设计完成情况,必须有可运行的软件。
3. 根据课程设计报告的质量,如有雷同,则所有雷同的所有人均判为不及格。
六、建议参考资料
1.《C语言程序设计》,谭浩强,清华大学出版社
2.《C语言程序设计课程设计》,刘振安,机械工业出版社
学生成绩管理系统
【摘要】
通过课程设计,让我对C语言有了更深的理解,让我们把学到的理论应用于具体实践中,锻炼了我们各方面的能力,从而让我们更快提高。通过一些简单函数的叠加构成了功能比较完备的学生成绩管理系统,从输入到处理再到输出,你将体会到完美的真正含义。学生成绩管理系统具有以下简单功能:
1.从键盘输入包括学号、姓名、各门课程成绩(不少于2门),并将其保存在磁盘文件里
2.打开文件后,计算每个人的总分,排序并保存
3.具有在文件中进行单项查询或多项查询的功能(即能够按照给定的关键字,如姓名等找出满足条件的纪录)
4.具有输出文件数据信息的功能
1.论文题目:学生成绩管理系统
2.技术参数、设计步骤:
本程序包含输入(input)、输出(display)、查找(find)、修改(change)、删除(del)、添加(add)、读入(read)、保存(save)等基本功能。先分别定义各种全局函数和全局变量now,同时定义结构体及结构体数组(本程序为实现简单操作暂定义长度为3)。其中now作为现有学生信息的一个标记作用尤为重要。每次执行完函数就返回主菜单。共含有四个开关语句,依次在main,display,find,change中,使界面更友好,用户操作更简单。设计共分四步完成,依次为简单设计,添加细节,上机调试,先改错再修改。遇到的问题可以查资料或向老师提问。
3.设计理论分析方法:
应有全局的概念,拿到题目首先进行总体功能分析,只有对整体功能有了全局把握才能去里自己用那部分知识进行编写。这个阶段好比盖房子,如果这个阶段做好了,说明房子已改好了。剩下任务就是怎么去装修了。确定了大体方向接下来就是功能实现阶段了,即所谓装修阶段。同样需要逐一地先写出能实现此功能的简单程序。比如学生成绩管理系统,先写出最简单的输入、输出、排序等功能函数。然后通过简单函数的互相调用、嵌套构成一个新功能的复杂函数。淡然这中间要加很多其他东西,这就需要我们多看书,多问老师同学啦。
等到所有功能都能“正常”(按提示正确输入)实现,再考虑一些细节问题,例如:如果所有都能简单运行,可是有些时候有些输入错误或正确它都运行,这就需要我们通过改写程序使之在正确输入时运行,在错误输入时给出出错提示。就像性别问题,输入M/W时运行,输入其他就不让它运行,同时给出正确输入的提示。这样就好很多了。后面的一一修改就可以了。同时还要考虑到见名知意,如: 输入(input)、输出(display)、查找(find)、修改(change)、删除(del)、添加(add)、读入(read)、保存(save)、排序(sort)、按学号排序(sortx)、不及格(no_pass)、输出(shuchu)。当然还有其他问题需要注意,在这里不一一细说。
4.设计结论及分析:
4.1 各个函数功能简单分析:
4.1.1主菜单函数(main):
主函数为一个死循环,前几个是功能实现函数,只有9是退出。也就是说每执行完一个函数,他就自动返回主菜单。只有选择9(退出)时才跳出循环。当然每选择一次它就自动清空屏幕,所以运行结果更直观。
4.1.2输入函数(input):
先输入要添加的学生数量n,同时now标记现有学生的数量。执行n次循环,输入n个学生的信息;其中输入性别时只有为M/W(M为男,W为女,均大写)时才跳出循环。如果出错,有提示信息。最后自动求和并保存。
4.1.3输出函数(display):
三部分1.按总分名次输出2.按学号顺序输出3.输出有不及格课程的学生
4.1.4查找(find):
查找分为按学号查找和按姓名查找,查找成功就输出,查找失败就返回,输出提示信息继续输入。
4.1.5修改(change):
输入学号,然后选择修改项,修改完后,提示用户“是否继续修改”,只有输入N/n时退出,输入其它字符都是继续。
4.1.6删除(del):
输入要删除学生的学号,如果找到就删除其信息,并提示用户删除成功,如果没找到就提示用户删除失败。
4.1.7添加(add):
根据信息总容量(结构体数组的长度)和第一次输入的信息量判断是否能继续添加。如果添加后信息已满,则提示用户不能继续添加,同时屏蔽了添加选项。
4.1.8读入(read):
从文件读入,避免了用户多次大量输入数据。
4.1.9保存(save):
每次执行完修改信息包括添加、录入、修改、删除等都需要保存信息。当然在每个修改函数最后都需要调用一下保存函数。
4.1.10排序(sort):
按总成绩名次排序(冒泡法排序)。n为要排序的学生数量,为形参。
4.1.11学号排序(sortx):
按学号先后顺序进行排序(冒泡法排序)。n为要排序的学生数量,为形参。
4.1.12不及格输出(no_pass):
输出不及格的学生信息。
4.1.13输出(shuchu):
输出第n个学生信息。
5.参考文献:
(1).《C语言程序设计》,谭浩强,清华大学出版社
(2).《C语言程序设计课程设计》,刘振安,机械工业出版社
6. 附录:
6.1 程序部分:
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
#define max 3
void input();
void display();
void find();
void change();
void del();
void read();
void save();
void add();
void sort(int n);
void sortx(int n);
void shuchu(int n);
void no_pass();
int now=0;/*标记位*/
struct student
{
int num;
char name[20];
char sex;
int NO;
float score1;
float score2;
float sum;
};struct student stu[max+1];
void main()/*主函数(菜单)*/
{
int as;
do
{
printf("\n\t\t\t欢迎使用学生成绩管理系统\n\n");
printf("\n\t\t\t\t1.录入学员信息\n\t\t\t\t2.显示学员信息\n\t\t\t\t3.查找学员信息\n\t\t\t\t4.修改学员信息\n\t\t\t\t5.删除学员信息\n\t\t\t\t6.添加学员信息\n\t\t\t\t7.读入学员信息\n\t\t\t\t8.保存学员信息\n\t\t\t\t9.退出");
printf("\n\n\n\t\t\t\t请选择");
scanf("%d",&as);
switch(as)
{
case 1:system("cls");input();break;
case 2:system("cls");display();break;
case 3:system("cls");find();break;
case 4:system("cls");change();break;
case 5:system("cls");del();break;
case 6:system("cls");add();break;
case 7:system("cls");read();break;
case 8:system("cls");save();break;
case 9:system("cls");exit(0);
}
}
while(1);
}
void input()/*输入函数*/
{
int i,n,j;
for(i=0;;i++)
{
printf("\n请输入添加的学生数量(在%d以内):",max-now);
scanf("%d",&n);
if(n>max)printf("\n请确保添加的数量在%d以内\t!!!",max);
if(n<=max)break;
}
now=n;
for(i=0;i<n;i++)
{
printf("\n\t\t\t\t输入第%d个学生的信息\n",i+1);
printf("\n输入学生的学号:");
scanf("%d",&stu[i].num);
getchar();
printf("\n输入学生的姓名:");
gets(stu[i].name);
printf("\n请输入学生的性别(M/W):");
for(j=0;;j++)
{
stu[i].sex=getchar();
if(stu[i].sex=='M'||stu[i].sex=='W')break;
else printf("\n\t\t\t请确保输入性别的正确性(区分大小写)!!!");
getchar();
}
printf("\n请输入学生成绩1:");
scanf("%f",&stu[i].score1);
printf("\n请输入学生成绩2:");
scanf("%f",&stu[i].score2);
stu[i].sum=stu[i].score1+stu[i].score2;
}
sort(n);
save();
system("cls");
}
void display()/*整体输出函数*/
{
int as,i;
printf("\n\t\t\t班级学生成绩列表\n\n\n");
printf("\n\t\t\t\t请选择\n\n\t\t\t1.按名次输出\n\t\t\t2.按学号输出\n\t\t\t3.不及格的学生信息\n\t\t\t");
scanf("%d",&as);
switch(as)
{
case 1:sort(now);for(i=0;i<now;i++)shuchu(i);break;
case 2:sort(now);sortx(now);for(i=0;i<now;i++)shuchu(i);break;
case 3:no_pass();break;
}
}
void find()/*查询函数*/
{
int num,as,i;
char name[20];
printf("\n\t\t\t请选择\n\n\n");
printf("\n\t\t\t1.按学号查找\n\t\t\t2.按姓名查找\n\t\t\t");
scanf("%d",&as);
switch(as)
{
case 1:system("cls");printf("请输入要查找的学号:");
do
{
scanf("%d",&num);
for(i=0;i<now;i++)
{
if(num==stu[i].num)
{
shuchu(i);break;
}
}
if(i>=now)
printf("\n\t\t该生信息不存在!!!请重新输入学号:");
}while(i>=now);break;
case 2:system("cls");getchar();printf("请输入要查找的学生姓名:");
do
{
gets(name);
for(i=0;i<now;i++)
{
if(strcmp(name,stu[i].name)==0)
{
shuchu(i);break;
}
}
if(i>=now)
printf("\n\n\t\t\t该生信息不存在!!!请重新输入姓名:");
}while(i>=now);break;
}
}
void change()/*修改函数*/
{
int num,as,j,i,m;
char a;
printf("\n\t\t\t请输入要修改的学生的学号:");
scanf("%d",&num);
for(i=0;i<now;i++)
{
if(stu[i].num==num)
{
for(j=0;j<6;j++)
{
printf("\n\t\t\t请选择\n\n\n");
printf("\n\t\t\t1.修改学号\n\t\t\t2.修改姓名\n\t\t\t3.修改性别(M/W)\n\t\t\t4.修改成绩1\n\t\t\t5.修改成绩2\n\t\t\t");
scanf("%d",&as);
switch(as)
{
case 1:printf("请输入新的学号:");scanf("%d",&stu[i].num);break;
case 2:printf("请输入新的姓名:");getchar();gets(stu[i].name);break;
case 3:printf("请输入新的性别:");getchar();
for(m=0;;m++)
{
stu[i].sex=getchar();
if(stu[i].sex=='M'||stu[i].sex=='W')break;
else printf("\n\t\t\t请确保输入性别的正确性(区分大小写)!!!");
getchar();
}break;
case 4:printf("请输入新成绩1:");scanf("%f",&stu[i].score1);break;
case 5:printf("请输入新成绩2:");scanf("%f",&stu[i].score2);break;
}
stu[i].sum=stu[i].score1+stu[i].score2;
printf("\n是否继续修改该生信息?(Y/N)");
getchar();
a=getchar();
if(a=='N'||a=='n')break;
}
sort(now);
save();
break;
}
}
if(i>=now)
printf("\n\n\t\t\t\t学号输入有误!!!\n\n");
}
void del()/*删除函数*/
{
int num,i;
printf("\n\t\t\t输入要删除的学生学号");
scanf("%d",&num);
for(i=0;i<=now;i++)
{
if(i>=now)
{
printf("\n\n\n\t\t\t学号输入有误!!!删除失败!!!\n\n");
break;
}
if(stu[i].num==num)
{
if(i==now-1)
now-=1;
else
{
stu[i]=stu[now-1];
now-=1;
}
printf("\n\n\t\t\t删除成功!!!\n\n"); sort(now);
break;
}
}
save();
}
void add()/*添加函数*/
{
char ch;
int j;
printf("\n\t\t\t\t还能添加%d个学生信息!!!\n\n",max-now);
if(now<max)
{
do
{
printf("\n\t\t\t\t输入新插入学生的信息\n");
printf("\n输入学生的学号:");
scanf("%d",&stu[now].num);
getchar();
printf("\n输入学生的姓名:");
gets(stu[now].name);
printf("\n输入学生的性别(M/W):");
for(j=0;;j++)
{
stu[now].sex=getchar();
if(stu[now].sex=='M'||stu[now].sex=='W')break;
else printf("\n\t\t\t请确保输入性别的正确性(区分大小写)!!!");
getchar();
}
printf("\n输入学生的成绩1:");
scanf("%f",&stu[now].score1);
printf("\n输入学生的成绩2:");
scanf("%f",&stu[now].score2);
stu[now].sum=stu[now].score1+stu[now].score2;
now=now+1;
sort(now);
if(now>=max)
{
printf("\n\n\n\t\t存储空间已满无法继续添加!!!\n\n");
break;
}
printf("\n\t\t\t是否继续添加?(Y/N)");
getchar();
ch=getchar();
}
while(ch!='n'||ch!='n');
}
}
void save()/*文件保存函数*/
{
FILE *fp;/*fp为文件指针*/
int i;
if((fp=fopen("stu_infer","wb"))==NULL)
{
printf("\n\n\t\t\t文件打开失败!!!");
return;
}
for(i=0;i<max+1;i++)
if(fwrite(&stu[i],sizeof(struct student),1,fp)!=1)
printf("\n\n\t\t\t文件保存错误!!!");
fclose(fp);
}
void read()/*从磁盘读入函数*/
{
int i;
FILE *fp;/*fp为文件指针*/
fp=fopen("stu_infer","rb");
for(i=0;i<max+1;i++)
fread(&stu[i],sizeof(struct student),1,fp);
fclose(fp);
}
void sort(int n)/*按成绩排序函数(n为排序个数)*/
{
struct student temp;
int i,j;
for(j=0;j<n-1;j++)
for(i=0;i<n-j-1;i++)
{
if(stu[i].sum<stu[i+1].sum)
{
temp=stu[i];
stu[i]=stu[i+1];
stu[i+1]=temp;
}
}
for(i=0;i<now;i++)
stu[i].NO=i+1;
}
void sortx(int n)/*按学号排序(n为排序个数)*/
{
struct student temp;
int i,j;
for(j=0;j<n-1;j++)
for(i=0;i<n-j-1;i++)
{
if(stu[i].num>stu[i+1].num)
{
temp=stu[i];
stu[i]=stu[i+1];
stu[i+1]=temp;
}
}
}
void no_pass()/*输出有不及格课程的学生的函数*/
{
int i;
printf("\n\t\t\t显示有不及格课程的学生信息:");
for(i=0;i<now;i++)
if(stu[i].score1<60||stu[i].score2<60)
shuchu(i);
}
void shuchu(int n)/*输出第n个学生信息的函数*/
{
printf("\n\t学号\t姓名\t性别\t名次\t成绩1\t成绩2\t总成绩\n");
printf("\t%d\t%s\t%c\t%d\t%.2f\t%.2f\t%.2f\n",stu[n].num,stu[n].name,stu[n].sex,stu[n].NO,stu[n].score1,stu[n].score2,stu[n].sum);
}
16
展开阅读全文