C语言课程设计报告分数统计.docx
《C语言课程设计报告分数统计.docx》由会员分享,可在线阅读,更多相关《C语言课程设计报告分数统计.docx(60页珍藏版)》请在冰豆网上搜索。
C语言课程设计报告分数统计
计算机科学学院
课程设计报告
课程名称C语言课程设计
题目学生试卷分数统计
专业班级计算机应用二班
学号
学生姓名
指导教师
2016年06月11日
计算机科学学院
课程设计任务书
课程名称:
C语言课程设计
设计题目:
学生试卷分数统计
专业:
电气自动化班级:
完成时间:
2016-6-11指导教师:
专业负责人:
主要内容
作为教师,考试完成后需要对试卷进行分析和研究。
本课程设计要求用C语言编写程序完成以下功能:
1.从键盘输入若干名(>=20人)学生的平时成绩和期末成绩
2.输入完毕后,显示所有学生的学号、平时成绩和期末成绩,并将成绩保存在文件analysis.dat中。
3.读文件analysis.dat,根据文件中保存成绩的分布情况画出直方图,并显示在屏幕上。
4.计算总评成绩、平时成绩和期末成绩的平均分和标准差。
5.计算完毕后,在屏幕上显示总评成绩,平时成绩和期末成绩的平均分和标准差。
基本要求
按照课程设计任务的要求,对题目进行需求分析、概要设计和详细设计,并用C/C++进行编码实现,最后形成一份内容充实、条理清晰、分析严谨、结果正确、格式规范的课程设计报告。
提交内容:
1.程序代码(必须有注释)
2.课程设计报告
3.文件analysis.dat
参考资料
计算机科学学院
课程设计成绩评价表
课程名称
C语言课程设计
题目
学生试卷分数统计
学生姓名
学号
指导教
师姓名
职称
助教
序号
评价项目
指标
满分
评分
1
工作量、工作态度和出勤率
按期圆满的完成了规定的任务,难易程度和工作量符合教学要求,工作努力,遵守纪律,出勤率高,工作作风严谨,善于与他人合作。
20
2
课程设计质量
课程设计选题合理,计算过程简练准确,分析问题思路清晰,结构严谨,文理通顺,撰写规范,图表完备正确。
45
3
创新
工作中有创新意识,对前人工作有一些改进或有一定应用价值。
5
4
答辩
能正确回答指导教师所提出的问题。
30
总分
评语:
指导教师:
年月日
【软件课程设计报告目录】
1、需求分析
说明程序设计的任务,强调的是程序要做什么,明确规定:
(1)输入的形式和输入值的范围;
(2)输出的形式;
(3)程序所能达到的功能;
(4)测试数据:
包括正确的输入及其输出结果和含有错误的输入及其输出结果。
2、概要设计
说明本程序中用到的所有抽象数据类型的定义、主程序的流程以及各程序模块之间的层次(调用)关系。
3、详细设计
实现概要设计中定义的所有数据类型,对每个操作只需要写出伪码算法;对主程序和其他模块也都需要写出伪码算法;画出函数的调用关系。
4、使用说明、测试分析及结果
(1)说明如何使用你编写的程序;
(2)测试结果与分析;
(3)调试过程中遇到的问题是如何解决提以及对设计与实现的回顾讨论和分析;
(4)运行界面。
5、课程设计总结(设计心得)
(1)你在编程过程中用时多少?
多少时间在纸上设计?
多少时间上机输入和调试?
多少时间在思考问题?
(2)遇到了哪些难题?
你是怎么克服的?
(3)你对算法有什么改正想法吗?
(4)你的收获有哪些?
参考文献
1.需求分析
1.1从键盘输入若干名(>=20人)学生的平时成绩和期末成绩。
输入完毕后,成绩保存在文件analysis.dat中。
1.1.1程序能够对用户的错误输入给出提示。
1.1.2用户不需要先输入学生人数,在输入完成任意一个学生的所有信息后用户可以方便的结束输入,程序会自动的计算出学生人数。
1.1.3用户能设定学生的平时成绩的次数(即学生课程数),以便于用户每次使用本程序时即使学生的平时成绩次数不一样,用户也能方便的使用本程序。
1.1.4用户可以设定进入本程序的密码,以防止其他人进入程序修改其信息。
当用户忘记密码时,用户也可以回答密保问题来找回密码。
1.2读文件analysis.dat,显示所有学生的学号、平时成绩和期末成绩,并将根据文件中保存成绩的分布情况画出直方图,并显示在屏幕上。
1.2.1当用户发现某个学生的成绩输入出了错时,用户可以直接修改此学生的成绩。
1.2.2当用户发现还有部分学生的成绩忘记了输入时,也可以继续添加输入。
1.2.3用户也可以删除某个学生。
1.3计算总评成绩、平时成绩和期末成绩的平均分和标准差。
1.4计算完毕后,在屏幕上显示总评成绩,平时成绩和期末成绩的平均分和标准差。
1.4.1用户可以选择输出总评成绩在前N名的优秀学生。
1.5用户可以建立多个文件来存储多个班级的学生成绩,在程序刚进入时用户可以选择打开相应班级的文件,并操作。
1.5.1用户在新建文件时,要输入学生的学号、姓名、成绩等内容(即程序不允许建立空文件)。
1.5.2程序也允许用户要删除文件。
1.6为了用户能更的使用本程序,在程序中用户可以查看帮助文档。
2.概要设计
2.1本程序中用到的抽象数据类型的定义如下:
typedefstructstudent
{
charnum[15];//学号
charname[15];//姓名
floatscore[10];//平时成绩
floatSCORE;//总评成绩
}STU;
2.2主程序的流程如图1.1
图1.1,main函数的流程
2.3各程序模块之间的层次(调用)关系如图1.2所示
图1.2,各程序模块之间的调用
3.详细设计
3.1程序开始预编译部分如下:
#include
#include
#include
#include
typedefstructstudent
{
charnum[15];//学号
charname[15];//姓名
floatscore[10];//平时成绩
floatSCORE;//总评成绩
}STU;
intFile_n;//学生成绩管理文件的个数
3.2对menu_1()函数的设计如下:
//菜单1
voidmenu_1()
{
system("modeconcols=100lines=25");//窗口宽度
system("color0B");//窗口颜色
system("date/T");//显示日期
system("TIME/T");//显示时间
charpassword[7];
intflag;
FILE*fp;//文件指针
if((fp=fopen("系统文件.txt","r"))==NULL)
{
printf("系统文件不存在!
\n");
exit(0);
}
fscanf(fp,"%d%s%d",&flag,password,&File_n);
fclose(fp);
printf("\t\t\t您的当前位置:
学生成绩管理\n\n");
printf("\t\t\t\t╪╪╪╪╪╪╧╧╧╧╧╧╧╧╧╪╪╪╪╪╪\n");
printf("\t\t\t\t╔════╧╧学生成绩管理╧╧════╗\n");
printf("\t\t\t\t║║\n");
printf("\t\t\t\t║※1.新建一个学生成绩管理文件║\n");
printf("\t\t\t\t║║\n");
printf("\t\t\t\t║※2.打开已有的学生成绩管理文件(%3d)║\n",File_n);
printf("\t\t\t\t║║\n");
printf("\t\t\t\t║※3.设置密码║\n");
printf("\t\t\t\t║║\n");
printf("\t\t\t\t║※4.打开帮助文档║\n");
printf("\t\t\t\t║║\n");
printf("\t\t\t\t║※5.退出系统║\n");
printf("\t\t\t\t╚═══════════════════╝\n");
}
3.3对menu_2()函数的设计如下
//菜单2
voidmenu_2()
{
system("modeconcols=100lines=1000");//窗口宽度
system("color0E");//窗口颜色
system("date/T");//显示日期
system("TIME/T");//显示时间
printf("\t\t\t您的当前位置:
学生成绩管理->新建一个学生成绩管理文件\n\n");
printf("\t\t\t\t╪╪╪╪╪╪╧╧╧╧╧╧╧╧╧╪╪╪╪╪╪╪╪╪╪\n");
printf("\t\t\t\t╔═══╧╧新建一个学生成绩管理文件╧╧═══╗\n");
printf("\t\t\t\t║║\n");
printf("\t\t\t\t║※1.输出刚才新建的文件和学生的总体成绩║\n");
printf("\t\t\t\t║║\n");
printf("\t\t\t\t║※2.输出成绩的直方图║\n");
printf("\t\t\t\t║║\n");
printf("\t\t\t\t║※3.输出总评成绩排在前n名的学生║\n");
printf("\t\t\t\t║║\n");
printf("\t\t\t\t║※4.清屏║\n");
printf("\t\t\t\t║║\n");
printf("\t\t\t\t║※5.返回上一级║\n");
printf("\t\t\t\t║║\n");
printf("\t\t\t\t║※6.退出系统║\n");
printf("\t\t\t\t╚═══════════════════════╝\n");
}
3.4对menu_3()函数的设计如下
//菜单
voidmenu_3()
{
system("modeconcols=100lines=1000");//窗口宽度
system("color0E");//窗口颜色
system("date/T");//显示日期
system("TIME/T");//显示时间
printf("\t\t\t您的当前位置:
学生成绩管理->打开已有的学生成绩管理文件\n\n");
printf("\t\t\t\t╪╪╪╪╪╪╧╧╧╧╧╧╧╧╧╪╪╪╪╪╪╪╪╪╪╪\n");
printf("\t\t\t\t╔═══╧╧打开已有的学生成绩管理文件╧╧═══╗\n");
printf("\t\t\t\t║║\n");
printf("\t\t\t\t║※1.输出此文件和学生的总体成绩║\n");
printf("\t\t\t\t║║\n");
printf("\t\t\t\t║※2.输出此文件的学生成绩的直方图║\n");
printf("\t\t\t\t║║\n");
printf("\t\t\t\t║※3.输出此文件总评成绩排在前n名的学生║\n");
printf("\t\t\t\t║║\n");
printf("\t\t\t\t║※4.向此文件里增加学生║\n");
printf("\t\t\t\t║║\n");
printf("\t\t\t\t║※5.在此文件里删除学生║\n");
printf("\t\t\t\t║║\n");
printf("\t\t\t\t║※6.修改此文件里的学生的成绩║\n");
printf("\t\t\t\t║║\n");
printf("\t\t\t\t║※7.清屏║\n");
printf("\t\t\t\t║║\n");
printf("\t\t\t\t║※8.返回上一级║\n");
printf("\t\t\t\t║║\n");
printf("\t\t\t\t║※9.退出系统║\n");
printf("\t\t\t\t╚════════════════════════╝\n");
}
3.5对menu_4()函数的设计如下
//菜单4
voidmenu_4()
{
system("modeconcols=100lines=1000");//窗口宽度
system("color0A");//窗口颜色
system("date/T");//显示日期
system("TIME/T");//显示时间
printf("\t\t\t您的当前位置:
学生成绩管理->设置密码\n\n");
printf("\t\t\t\t╪╪╪╪╪╪╧╧╧╧╧╧╧╧╧╪╪╪╪╪╪\n");
printf("\t\t\t\t╔═════╧╧设置密码╧╧═════╗\n");
printf("\t\t\t\t║║\n");
printf("\t\t\t\t║※1.修改密码║\n");
printf("\t\t\t\t║║\n");
printf("\t\t\t\t║※2.修改密保║\n",File_n);
printf("\t\t\t\t║║\n");
printf("\t\t\t\t║※3.设置密码权限║\n");
printf("\t\t\t\t║║\n");
printf("\t\t\t\t║※4.返回上一级║\n");
printf("\t\t\t\t║║\n");
printf("\t\t\t\t║※5.退出系统║\n");
printf("\t\t\t\t╚═══════════════════╝\n");
}
3.6对Read_System()函数的设计如下
//扫描系统文件
voidRead_System()
{
system("modeconcols=80lines=25");//窗口宽度
system("color0A");//设定显示字符的颜色
intflag;//flag是系统的密码标志位,标志用户是否设置过密码
charpassword[2][7];//用来存储系统密码和用户输入密码
FILE*fp;//文件指针
if((fp=fopen("系统文件.txt","r"))==NULL)
{
printf("系统文件不存在!
\n");
exit(0);
}
fscanf(fp,"%d%s%d",&flag,password[0],&File_n);
if(flag!
=0)//标志用户设置了密码
{
flag=0;//标志密码输入正确
printf("您已设置过密码,请输入6位密码进入系统:
");
scanf("%s",password[1]);
getchar();
for(inti=0;i<6;i++)
{
if(password[1][i]!
=(password[0][i]-(i+1)))
{
flag=i+1;//标志密码输入错误
break;
}
}
}
if(flag!
=0)//密码输入是否正确?
{
printf("您的密码输入有误!
是否找回密码?
\n");
printf("输入1确认找回,输入0退出程序:
");
scanf("%d",&flag);
getchar();
while(flag!
=1&&flag!
=0)
{
printf("该选择无效!
请重新选择:
");
scanf("%d",&flag);
getchar();
}
if(flag==0)
{
fclose(fp);
printf("谢谢使用!
正在退出...\n");
exit(0);
}
if(flag==1)
{
charmatter[100],key[2][30];//matter用来存放密保问题,key用来存放密保答案和用户输入的答案
fscanf(fp,"%s%s",matter,key[0]);
printf("您的密保问题:
%s\n",matter);
printf("请输入密保答案:
");
scanf("%s",key[1]);
getchar();
if(strcmp(key[0],key[1])==0)
{
printf("密保回答正确!
\n");
printf("您的密码为:
");
for(inti=0;i<6;i++)//解密密码
printf("%c",password[0][i]-(i+1));
printf("\n");
fclose(fp);
printf("请您记住密码!
按Enter进入程序\n");
getchar();
return;
}
else
{
printf("密保回答错误!
\n");
fclose(fp);
printf("谢谢使用!
正在退出...\n");
exit(0);
}
}
}
fclose(fp);//关闭文件
}
3.7对New()函数的设计如下
//新建文件
FILE*New()
{
FILE*fp,*new_fp;//指向文件指针
charfilename[30];
printf("\n\n\n\n\n\n\n\n\n");
printf("\t\t\t\t请输入新建文件名:
");
scanf("%s",filename);
getchar();
for(inti=0;filename[i]!
='\0';i++);
filename[i++]='.';
filename[i++]='t';
filename[i++]='x';
filename[i++]='t';
filename[i]='\0';
if((fp=fopen("系统文件.txt","a"))==NULL)
{
printf("系统文件不存在!
\n");
exit(0);
}
fprintf(fp,"%s",filename);//把新建的文件名存储到系统文件中
fseek(fp,9L,0);
fscanf(fp,"%d",File_n);
File_n++;
fclose(fp);
if((fp=fopen("系统文件.txt","r"))==NULL)//修改系统文件内容
{
printf("打开系统文件失败!
\n");
exit(0);
}
if((new_fp=fopen("临时文件.txt","w"))==NULL)
{
printf("应用程序错误,建立临时文件失败!
\n");
exit(0);
}
charch;//用于修改文件内容时存储临时数据
for(i=0;!
feof(fp);i++)
{
if(i==9)
{
fprintf(new_fp,"%d",File_n);
File_n=File_n-1;
while(File_n=File_n/10)
i++;
}
else
{
fseek(fp,i,0);
fscanf(fp,"%c",&ch);
fprintf(new_fp,"%c",ch);
}
}
fclose(fp);
fclose(new_fp);
system("del系统文件.txt");
system("rename临时文件.txt系统文件.txt");
if((new_fp=fopen(filename,"w+"))==NULL)
{
printf("应用程序错误,新建文件失败!
\n");
exit(0);
}
returnnew_fp;
}
3.8对Accept_data(FILE*fp)函数的设计如下
//输入学生成绩并存储在文件中
voidAccept_data(FILE*fp)
{
system("modeconcols=100lines=1000");//窗口宽度
system("color0E");
intcnum;//cnum用来计算平时成绩次数
inta1,a2;//用来接收总评成绩的比例
STU*stu;
printf("请输入计算总评成绩时使用平时成绩与期末成绩的比例,用整数表示\n");
printf("平时成绩所占比例:
");
scanf("%d",&a1);
getchar();
printf("期末成绩所占比例:
");
scanf("%d",&a2);
getchar();
while((a1+a2)!
=100)
{
printf("您的输入有误!
%d+%d=%d!
!
!
\n",a1,a2,a1+a2);
printf("请重新输入!
\n");
printf("平时成绩所占比例:
");
scanf("%d",&a1);
getchar();
printf("期末成绩所占比例:
");
scanf("%d",&a2);
getchar();
}
printf("请输入平时成绩的次数(0—9):
");
scanf("%d",&cnum);
getchar();
while(cnum<=0||cnum>9)
{
printf("您的输入有误!
请重新输入(0—9):
");
scanf("%d",&cnum);
getchar();
}
fprintf(fp,"%d%d%d\n",cnum,a1,a2);//存储平时成绩次数、分值比例
floatsum_score;//用来存放总的平时成绩
printf("注意:
输入的学号为\"0\"则结束输入!
\n");
for(inti=0;;i++)
{
sum_score=0;
if((stu=(STU*)malloc(sizeof(STU)))==NULL)
{
printf("内存分配失败!
\n"