C语言课程设计报告_第1页
C语言课程设计报告_第2页
C语言课程设计报告_第3页
C语言课程设计报告_第4页
C语言课程设计报告_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、东华理工大学机械与电子工程学院课程设计报告课程名称 C 语言课程设计题 目专业班级学 号 20131321502学生姓名章洪高指导教师黄河2014年09月込日东华理工大学机械与电子工程学院课程设计任务书课程名称: C语言课程设计设计题目:学生试卷分数统计专 业: 自动化班 级: 二班完成时间: 2014-09-24 指导教师:黄河专业负责人: 罗金牛主要内容作为教师,考试完成后需要对试卷进行分析和研究。本课程设计要求用C语言编写程序完成以下功能:1. 从键盘输入若干名(=20人)学生的平时成绩和期末成绩2. 输入完毕后,显示所有学生的学号、平时成绩和期末成绩,并将成绩保存在文件an alysi

2、s.dat中。3. 读文件analysis.dat,根据文件中保存成绩的分布情况画出直方图,并显示在屏幕上。4. 计算总评成绩、平时成绩和期末成绩的平均分和标准差。5. 计算完毕后,在屏幕上显示总评成绩,平时成绩和期末成绩的平均分和标准差。 基本要求按照课程设计任务的要求,对题目进行需求分析、概要设计和详细设计,并用C进行编码实现,最后形成一份内容充实、条理清晰、分析严谨、结果正确、格式规范 的课程设计报告。提交内容:1. 程序代码(必须有注释)2. 课程设计报告3. 文件 analysis.dat参考资料1 谭浩强.C程序设计(第四版):清华大学出版社.2 谭浩强.C程序设计(第四版)学习辅

3、导:清华大学出版社【软件课程设计报告目录】1、需求分析 说明程序设计的任务,强调的是程序要做什么,明确规定:( 1)输入的形式和输入值的范围;( 2)输出的形式;(3)程序所能达到的功能;(4)测试数据:包括正确的输入及其输出结果和含有错误的输入及其输出 结果。2、概要设计 说明本程序中用到的所有抽象数据类型的定义、主程序的流程以及各程序 模块之间的层次(调用)关系。3、详细设计 实现概要设计中定义的所有数据类型,对每个操作只需要写出伪码算法; 对主程序和其他模块也都需要写出伪码算法;画出函数的调用关系。4、使用说明、测试分析及结果(1)说明如何使用你编写的程序;(2)测试结果与分析;(3)调

4、试过程中遇到的问题是如何解决提以及对设计与实现的回顾讨论和 分析;(4)运行界面。5、课程设计总结(设计心得)(1)你在编程过程中用时多少?多少时间在纸上设计?多少时间上机输入 和调试?多少时间在思考问题?(2)遇到了哪些难题?你是怎么克服的?(3)你对算法有什么改正想法吗?(4)你的收获有哪些?参考文献1. 课程设计目的全面熟悉、掌握 C 语言基本知识,增强对不同的问题运用和灵活选择合适 的数据结构以及算法描述的本领,熟悉编制和调试程序的技巧,掌握分析 结果的若干有效方法,进一步提高上机动手能力,培养使用计算机解决实 际问题的能力,养成提供文档资料的习惯和规范编程的思想,为后继课程 (数据结

5、构、数据库和汇编语言等课程)的实验以及课程设计打下较扎实 的基础。2. 需求分析1.1 从键盘输入若干名( =20 人)学生的平时成绩和期末成绩。输入完毕后,成 绩保存在文件 analysis.dat 中。1.1.1 程序能够对用户的错误输入给出提示。1.1.2 用户不需要先输入学生人数,在输入完成任意一个学生的所有信息后用户 可以方便的结束输入,程序会自动的计算出学生人数。1.1.3 用户能设定学生的平时成绩的次数 (即学生课程数) ,以便于用户每次使用 本程序时即使学生的平时成绩次数不一样,用户也能方便的使用本程序。1.1.4 用户可以设定进入本程序的密码 , 以防止其他人进入程序修改其信

6、息。 当用 户忘记密码时,用户也可以回答密保问题来找回密码。1.2 读文件 analysis.dat, 显示所有学生的学号、平时成绩和期末成绩,并将根 据文件中保存成绩的分布情况画出直方图,并显示在屏幕上。1.2.1 当用户发现某个学生的成绩输入出了错时,用户可以直接修改此学生的成 绩。1.2.2 当用户发现还有部分学生的成绩忘记了输入时,也可以继续添加输入。1.2.3 用户也可以删除某个学生。1.3 计算总评成绩、平时成绩和期末成绩的平均分和标准差。1.4 计算完毕后,在屏幕上显示总评成绩,平时成绩和期末成绩的平均分和标准差。1.4.1 用户可以选择输出总评成绩在前 N 名的优秀学生。1.5

7、 用户可以建立多个文件来存储多个班级的学生成绩, 在程序刚进入时用户可以选择 打开相应班级的文件,并操作。1.5.1 用户在新建文件时,要输入学生的学号、姓名、成绩等内容(即程序不允许建立 空文件)。1.5.2 程序也允许用户要删除文件。1.6 为了用户能更的使用本程序,在程序中用户可以查看帮助文档。3. 概要设计2.1本程序中用到的抽象数据类型的定义如下typedef struct stude ntchar nu m15;/学号char n ame15;/姓名float score 10;/平时成绩float SCORE;/总评成绩STU;图1.1, main函数的流程2.3各程序模块之间的

8、层次(调用)关系如图1.2所示主函数ew殲文档的函数函数设置密码函Open_fil|e()|Passw0rd Help)打开帮幵文件NeW)建.文件_Jccept_dataShow_d读 a立俞入学生成纟存储在文件件并输出学 中和相关数ood n各程序模块之间的调用图 1.2 ,谄并输秀学Add_dataDelete_dat增加学生删除学生Update修改学生成绩4. 详细设计4.1程序开始预编译部分如下:#in clude#in clude#in clude#in cludetypedef struct stude ntchar nu m15;/学号char n ame15;/姓名float

9、 score 10;/平时成绩float SCORE;/总评成绩STU;int File_ n; /学生成绩管理文件的个数4.2对menu_1()函数的设计如下:/菜单1 void menu _1()system(mode con cols=100 lines=25);/ 窗口宽度system(color OB);/ 窗口颜色system(date /T);/ 显示日期system(TIME /T);/ 显示时间char password7;int flag;FILE *fp;/ 文件指针if(fp=fopen( 系统文件 .txt,r)=NULL) printf( 系统文件不存在 !n);e

10、xit(0);fscanf(fp,%d %s %d,&flag,password,&File_n);fclose(fp);printf(ttt 您的当前位置 : 学生成绩管理 nn);printf(tttt丨丨丨丨丨丨丨丨丨丨丨丨n“);printf(tttt1学生成绩管理n);printf(tttt11 n ”);printf(tttt丨1.新建一个学生成绩管理文件1 n ”);printf(tttt11 n ”);printf(tttt丨2.打开已有的学生成绩管理文件(3d)1n,File_n);printf(tttt11 n ”);printf(tttt丨3.设置密码1 n ”);pri

11、ntf(tttt11 n ”);printf(tttt丨4.打开帮助文档1 n ”);printf(tttt11 n ”);printf(tttt丨5.退出系统1 n ”);printf(tttt1 1n);4.3 对 menu_2() 函数的设计如下 / 菜单 2 void menu_2()system(mode con cols=100 lines=1000); / 窗口宽度 system(color 0E); / 窗口颜色 system(date /T);/ 显示日期system(TIME /T);/ 显示时间printf(ttt 您的当前位置 : 学生成绩管理 - 新建一个学生成绩管理

12、文件 nn);prin tf(tttt丨丨n);printf(tttt1亠新建一个学生成绩管理文件1n);printf(tttt1n);printf(tttt丨1.输出刚才新建的文件和学生的总体成绩n);printf(tttt1n);printf(tttt丨2.输出成绩的直方图n);printf(tttt1n);printf(tttt丨3.输出总评成绩排在前n名的学生n);printf(tttt1n);printf(tttt丨4.清屏n);printf(tttt1n);printf(tttt丨5.返回上一级n);printf(tttt1n);printf(tttt丨6.退出系统n);print

13、f(tttt1 1n);4.4 对 menu_3() 函数的设计如下/ 菜单void menu_3()system(mode con cols=100 lines=1000); / 窗口宽度system(color 0E); / 窗口颜色system(date /T);/ 显示日期system(TIME /T);/ 显示时间printf(ttt 您的当前位置 : 学生成绩管理 - 打开已有的学生成绩管理文件nn);printf(ttttn);printf(tttt1亠打开已有的学生成绩管理文件1n);printf(tttt1n);printf(tttt丨1.输出此文件和学生的总体成绩n);pr

14、intf(tttt1n);printf(tttt丨2.输出此文件的学生成绩的直方图n);printf(tttt1n);printf(tttt丨3.输出此文件总评成绩排在前n名的学生n);printf(tttt1n);printf(tttt丨4.向此文件里增加学生n);printf(tttt1n);printf(tttt丨5.在此文件里删除学生n);printf(tttt1n);printf(tttt丨6修改此文件里的学生的成绩n);printf(tttt1n);printf(tttt丨7.清屏n);printf(tttt1n);printf(tttt丨8.返回上一级n);printf(tttt

15、1 9. 退出系统n);IIprintf(ttttn);printf(ttttn);4.5 对 menu_4() 函数的设计如下/ 菜单 4void menu_4()system(mode con cols=100 lines=1000); /窗口宽度system(color 0A); / 窗口颜色 system(date /T);/ 显示日期system(TIME /T);/ 显示时间printf(ttt 您的当前位置 : 学生成绩管理 - 设置密码 nn);printf(tttt| lllllIllllln);prin tf(tttti亠设置密码 1n);printf(tttt|n);pr

16、intf(tttt丨1修改密码|n);printf(tttt|n);printf(tttt丨2.修改密保|n,File_n);printf(tttt|n);printf(tttt丨3.设置密码权限|n);printf(tttt|n);printf(tttt丨4.返回上一级|n);printf(tttt|n);printf(tttt丨5.退出系统|n”);prin tf(tttt11n);4.6 对 Read_System() 函数的设计如下/ 扫描系统文件void Read_System()system(mode con cols=80 lines=25);/ 窗口宽度system(color

17、 0A);/ 设定显示字符的颜色int flag;/flag 是系统的密码标志位 , 标志用户是否设置过密码char password27;/ 用来存储系统密码和用户输入密码FILE *fp;/ 文件指针if(fp=fopen( 系统文件 .txt,r)=NULL) printf( 系统文件不存在 !n); exit(0); fscanf(fp,%d %s %d,&flag,password0,&File_n); if(flag!=0)/ 标志用户设置了密码flag=0;/ 标志密码输入正确printf( 您已设置过密码 , 请输入 6 位密码进入系统 :); scanf(%s,passwor

18、d1);getchar();for(int i=0;i6;i+) if(password1i!=(password0i-(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) fclos

19、e(fp); printf( 谢谢使用 ! 正在退出 .n);exit(0);if(flag=1)char matter100= “我的大学” ,key230= “东华理工大学” ;/matter 用来存放密保问题 ,key 用来存放密保答案和用户输入的答案fscanf(fp, %s %s,matter,key0);printf( 您的密保问题 :%sn,matter);printf( 请输入密保答案 :);scanf(%s,key1);getchar();if(strcmp(key0,key1)=0)printf( 密保回答正确 !n);printf( 您的密码为 :);for(int i=

20、0;i6;i+) / 解密密码printf(%c,password0i-(i+1);printf(n);fclose(fp);printf( 请您记住密码 ! 按 Enter 进入程序 n);getchar();return ;elseprintf( 密保回答错误 !n);fclose(fp);printf( 谢谢使用 ! 正在退出 .n);exit(0);fclose(fp); / 关闭文件4.7 对 New() 函数的设计如下/ 新建文件FILE* New()FILE *fp,*new_fp;/ 指向文件指针char filename30; printf(nnnnnnnnn);printf

21、(tttt 请输入新建文件名 :); scanf(%s,filename);getchar();for(int i=0;filenamei!=0;i+);filenamei+=.;filenamei+=t;filenamei+=x;filenamei+=t;filenamei=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(

22、fp=fopen( 系统文件 .txt,r)=NULL) / 修改系统文件内容 printf( 打开系统文件失败 !n);exit(0);if(new_fp=fopen( 临时文件 .txt,w)=NULL)printf( 应用程序错误 , 建立临时文件失败 !n);exit(0);char ch; / 用于修改文件内容时存储临时数据 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,&c

23、h); 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);return new_fp;4.8 对 Accept_data(FILE *fp) 函数的设计如下/ 输入学生成绩并存储在文件中void Accept_data(FILE *fp)system(mode con cols=100 lin

24、es=1000); / 窗口宽度 system(color 0E);int cnum;/cnum 用来计算平时成绩次数int a1,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);

25、printf( 平时成绩所占比例 :); scanf(%d,&a1);getchar();printf( 期末成绩所占比例 :); scanf(%d,&a2);getchar();printf( 请输入平时成绩的次数 (0 9):); scanf(%d,&cnum);getchar();while(cnum9)printf( 您的输入有误 ! 请重新输入 (0 9):); scanf(%d,&cnum);getchar();fprintf(fp, %d %d %dn,cnum,a1,a2); / 存储平时成绩次数、 值比例float sum_score; / 用来存放总的平时成绩printf(

26、 注意 : 输入的学号为 0 则结束输入 !n);for(int i=0;i+)sum_score=0; if(stu=(STU*)malloc(sizeof(STU)=NULL) printf( 内存分配失败 !n);exit(0);printf(”您正在输入第d位学生的信息n,i+1);printf( 学号 :);scanf(%s,stu-num);getchar();if(strcmp(stu-num,0)=0)free(stu);break;printf( 姓名 :); scanf(%s,stu-name); getchar();for(int j=0;jscorej); getcha

27、r();while(stu-scorej100 | stu-scorejscorej);getchar();sum_score+=stu-scorej;printf( 期末成绩 :); scanf(%f,&stu-scorecnum); getchar();while(stu-scorecnum100 | stu-scorecnumscorecnum);getchar();0);stu-SCORE=(sum_score/cnum)*(a1/100.0)+(stu-scorecnum)*(a2/100.fprintf(fp,%s %s ,stu-num,stu-name); for(j=0;js

28、corej); fprintf(fp,%fn,stu-SCORE); free(stu);fseek(fp,0L,0);fprintf(fp,%d ,i); / 存储学生人数 printf( 输入完毕 !n);printf( 文件已保存 !n);printf( 按 Enter 键继续 !);getchar();4.9 对 Show_data(FILE *fp) 函数的设计如下/ 输出文件和学生的总体成绩void Show_data(FILE *fp)int cnum,pnum;/cnum 用来存放平时成绩次数 ,pnum 用来存放学生人数int a1,a2;/ 用来存放总评成绩的比例float

29、 max,min,temp,SCORE; / 用来存放总评成绩最高分和最低分float aver3=0,0,0,avri3=0,0,0; /aver3 存放平均分 ,avri3 存 放标准差float pass_num=0; / 存放及格人数STU *stu;fscanf(fp,%d %d %d %dn,&pnum,&cnum,&a1,&a2); /读平时成绩次数、分值比例printf(nn);if(pnum=0)printf( 此文件里没有学生的成绩信息 !n);printf( 请按 Enter 键退出 !n);getchar();return ;printf( 输出的学生人数 :%3d 学

30、生平时成绩次数 :%dn,pnum,cnum);printf( 平时分值所占比例 :%d% 期末成绩所占比例 :%d%nn,a1,a2); printf( 学号 tt 姓名 t);for(int i=0;icnum;i+)printf( 课程 %dt,i+1);printf( 期末 t 总评 n);max=0;for(i=0;inum,stu-name); printf(%-16s%-8s,stu-num,stu-name);for(int j=0;jscorej); aver0+=stu-scorej;printf(%-8.2f,stu-scorej); fscanf(fp,%f ,&stu

31、-scorej); aver1+=stu-scorej; fscanf(fp,%fn,&stu-SCORE); aver2+=stu-SCORE;if(i=0) min=stu-SCORE;if(stu-SCORE=60) pass_num+;SCORE=stu-SCORE; if(maxSCORE)temp=max; max=SCORE; SCORE=temp; SCORE=stu-SCORE; if(minSCORE)temp=min; min=SCORE;SCORE=temp;printf(%-8.2f%-8.2fn,stu-scorej,stu-SCORE); free(stu); a

32、ver0=(aver0/(pnum*cnum); aver1=aver1/pnum; aver2=aver2/pnum;fseek(fp,0L,0);fscanf(fp,%d %d %d %dn,&pnum,&cnum,&a1,&a2); /读平时成绩次数、分值比例float temp1=0,temp2=0,temp3=0; / 用于帮助计算标准差 for(i=0;inum,stu-name);for(int j=0;jscorej); temp1=temp1+(aver0-stu-scorej)*(aver0-stu-scorej);fscanf(fp,%f ,&stu-scorej); t

33、emp2=temp2+(aver1-stu-scorej)*(aver1-stu-scorej); fscanf(fp,%fn,&stu-SCORE);temp3=temp3+(aver2-stu-SCORE)*(aver2-stu-SCORE); free(stu);avri0=sqrt(temp1);avri1=sqrt(temp2);avri2=sqrt(temp3);printf(总评成绩及格率:%4.2f%n,(pass_num/pnum)*100);printf(总评成绩最高分:%-4.2ft总评成绩最低分 :%-4.2fn,max,min)printf(平时成绩平均分:%-4.2

34、ft平时成绩标准差:-4.2fn,aver0,avri0);printf(期末成绩平均分:%-4.2ft期末成绩标准差:-4.2fn,aver1,avri1);printf(总评成绩平均分:%-4.2ft总评成绩标准差:-4.2fn,aver2,avri2);printf(nnn);4.10 对 Draw(FILE *fp)/ 输出成绩的直方图函数的设计如下void Draw(FILE *fp) char pic2141; float num10; int cnum,pnum; int a1,a2;STU *stu;/ 用来画直方图/ 用来存放各分数段的人数/cnum 用来存放平时成绩次数 ,

35、pnum 用来存放学生人数 / 用来存放总评成绩的比例fscanf(fp,%d %d %d %dn,&pnum,&cnum,&a1,&a2); / 读平时成绩次数、分值 比例printf(nn);if(pnum=0)printf( 此文件里没有学生的成绩信息 !n);printf( 请按 Enter 键退出 !n);getchar();return ;printf( 输出的学生人数 :%3d 学生平时成绩次数 :%dn,pnum,cnum); printf( 平时分值所占比例 :%d% 期末成绩所占比例 :%d%nn,a1,a2); printf(n 成绩直方图 n);for(int i=0;

36、i10;i+)numi=0;for(i=0;inum,stu-name);for(int j=0;jscorej);fscanf(fp,%f ,&stu-scorej); fscanf(fp,%fn,&stu-SCORE); switch (int)(stu-SCORE/10)case 0:num0+; break;case 1:num1+; break;case 2:num2+; break;case 3:num3+; break;case 4:num4+; break;case 5:num5+; break;case 6:num6+; break;case 7:num7+; break;c

37、ase 8:num8+;break;default :num9+;break;free(stu);for(i=0;i10;i+)numi=20*(numi/pnum)+0.5;for(i=0;i21;i+)for(int j=0;j41;j+)picij= ;for(i=0;i21;i+) / 画 Y 轴pici0=|;for(i=1;i41;i+) / 画 X 轴pic0i=_;printf( Y( 百分比 )n |n);for(i=0;i10;i+)for(int j=1;j=0;i-)for(int j=0;j41;j+)if(j=0)printf(%3d%,i*5); printf(%

38、c,picij);if(i=0)printf(X( 分数段 );printf(n);printf( 10 20 30 40 50 60 70 80 90 100n);printf(nn);3.11 对 Good_nstu(FILE *fp) 函数的设计如下void Good_nstu(FILE *fp)STU score200,temp; / 用来存放学生成绩int cnum,pnum;/cnum 用来存放平时成绩次数 ,pnum 用来存放学生人数int a1,a2;/ 用来存放总评成绩的比例int n; / 要输出的学生人数STU *stu;fscanf(fp,%d %d %d %dn,&p

39、num,&cnum,&a1,&a2); /读平时成绩次数、分值比例printf(nn);if(pnum=0)printf( 此文件里没有学生的成绩信息 !n);printf( 请按 Enter 键退出 !n);getchar();return ;printf( 总学生人数 :%3dttt 学生平时成绩次数 :%dn,pnum,cnum);printf( 平时分值所占比例 :%d%tt 期末成绩所占比例 :%d%nn,a1,a2); for(int i=0;inum,stu-name);strcpy(scorei.num,stu-num); strcpy(,stu-name

40、);for(int j=0;jscorej);scorei.scorej=stu-scorej;fscanf(fp,%f ,&stu-scorej); scorei.scorej=stu-scorej; fscanf(fp,%fn,&stu-SCORE); scorei.SCORE=stu-SCORE; free(stu); for(i=0;ipnum;i+)for(int j=i+1;jpnum;j+) if(scorei.SCOREscorej.SCORE)temp=scorei;scorei=scorej; scorej=temp;printf( 请输入 n 的数值 :); scanf(%d,&n);getchar();while(npnum)printf( 您的 n 值输入范围有误 ! 请重新输入 n 的数值 :); scanf(%d,&n);getchar();printf(”输出总评成绩排在前d名的学生如下:nn,n-1);printf(”名次 t 学号 tt 姓名 t);for(i=0;icnum;i+)printf(”课程 %dt,i+1);printf( 期末 t 总评 n);for(i=0;in;i+)printf(%-8d%-16s%-8s,i+

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论