当前位置:文档之家› C语言课程设计实验报告4340106

C语言课程设计实验报告4340106

《C语言课程设计》课程设计报告专业:网络工程班级:网络10601姓名:缪军指导教师:汪北阳余法红二00八年元月十五日目录系统摘要 (3)系统设计 (4)系统实现 (7)系统使用说明 (11)测试数据 (15)结论 (18)附录 (19)(一)系统摘要1.功能要求在主函数中读入两个原始数据文件的内容,保存在对应的结构体数组中,并根据以上内容计算每个学生5门课的加权平均分(保留1位小数,4舍5入),并按平均分排列名次,平均分相同则名次并列。

然后显示菜单,利用菜单调用每个函数,完成如下功能:1)用C语言创建一个数据文件,文件名为:“MC0116”。

用来存放班级排名后的成绩,2)分别统计全班每门课的平均分和标准差,并计算个分数段的学生人数;课程标准差的计算公式为:Y= s^2=1/n[(x1-m)^2+(x2-m)^2+...+(xn-m)^2]3)用C语言创建一个数据文件,文件名为:“KC0116”。

将文件中存放的数据以如下形式存放4)打印每名学生成绩条,结果存放到用C语言创建的一个数据文件中,文件名为:“cj0116”。

成绩条格式自定。

5)屏幕上显示所有存在不及格的课程的学生的名单(含学号、不及格的课程名称、课程的学分及成绩)。

6)屏幕上显示优等生名单(含学号、6门课程成绩、平均分、名次)。

(二)系统设计准备工作:编写两个记事本文件作为原始数据源。

本程序中建立两个文件,第一个中的内容是全班同学的5功课的成绩(英语,C语言,数学,大学物理,线性代数),保存在D盘下,其完整的路径名为D: \wl0116.txt.第二个中的内容是所有的五门功课的属性(编号,名称,学分),同样保存在D盘下内,起完整的路径名为D: \wl01kc.txt.1.系统功能模块框架图2.菜单结构图。

3.数据结构说明/* 学生结构体*/struct student{long num; /* 学号*/char name[20]; /* 姓名*/int score[N]; /* 各科分数构成的一维数组*/double ave; /* 每名学生所有科目的加权平均分*/int t; /* 名次*/}st[M];struct subject{int num; /* 课程编号*/int excellent; /* 成绩优秀*/int good; /* 成绩良好*/int mid; /* 成绩中等*/int pass; /* 成绩及格*/int fail; /* 不及格*/char kc[30]; /* 课程名称*/float xuefen; /* 课程学分*/double ave; /* 课程平均分*/double bzc; /* 课程标准差*/}course[N];整个系统的设计,可以将所有数据划分到两个结构体中,一个与学生有关,一个与课程有关。

数据的引入,可以从两个文件中读入,一个是学生成绩表,一个是课程与学分相关。

然后,将数据进行(1)加权平均;(2)标准差处理,排出每个学生在班级的名次。

最后,写出文件。

(三)系统实现(一).部分函数的实现过程:1.读入数据函数ReadDat1()和ReadDat2()用函数打开目标文件,通过文件指针指向目标文件,然后调用库函数(fscanf,fgets)将数据读入到定义的结构体当中。

第一步用fgets函数将文件中的的第一行的字符串读入到数组中,然后用一个for循环控制每个人的变化,将各种数据按照不同的类型规格赋值给结构体。

2.求平均分和标准差:求五门功课的平均分,用一个for循环控制着科目的变化,然后在内部再一个for 循环控制人的变化将全班的人的某门功课的成绩累加起来,再除以总人数即得平均分,类似的即可求的各门课的标准差。

3.求每个人的加权平均成绩:首先用for循环得到五门课程的学分的总和,然后再通过for循环控制每个人的不断变化,把每个人的每门成绩乘以各门课的学分,将其累加起来,再除以学分的和即得各个人的加权平均成绩4.排名次:首先用for循环控制各个人的变化,每一次将其名次赋值为1,然后将其平均成绩通过for循环于其他人进行比较,若小就将其自加1,最终即可得名次。

5.统计各分数段的人数:首先通过两个for循环检查每个人的每门课程,再通过switch语句判断起属于的类型。

6.C语言创建全班同学成绩单的数据文件和全班成绩分析:首先通过函数建立一个新的文件,for循环控制将分数输出到指定的文件中(二)程序调试过程中的要点和难点:在程序调试过程中,经常出现警告,这是因为数据类型不一致导致而成的。

由于不小心输入法的改变,容易造成一些不易发现的问题,比如在英文输入中的引号与在中文输入中的引号就是又区别的,应该保持在英文输入的环境中编辑此程序。

难点是,各个函数运行,要注意先后顺序。

因为一个函数的运行,需要上一个函数运行的结果为数据。

另外,还注意主函数的编写,是各个函数相互联系在一起。

(四) 系统使用说明源代码编写完成后,可以存放在记事本中,保存起来。

然后,选择打开方式为TC 环境,打开运行程序。

在打开的界面上会显示如下菜单界面:A在光标处输入:2 在屏幕上显示未及格学生名单;B在光标处输入:3 在屏幕上显示优等生名单;C在光标处输入:4 显示成绩分布(一个“=”代表一个人);D在光标处输入:5 查询成绩a在光标处输入:1 安学号查寻b在光标处输入:2 按姓名查寻E在光标处输入:0 退出界面;F在光标处输入:1 进入子菜单选项在光标处输入:1 创建班级名次文档到D盘;在光标处输入:2 创建课程成绩文档到D盘;在光标处输入:3 在屏幕上显示每个学生的成绩条;在光标处输入:5 返回主菜单;在光标处输入:0 退出编辑界面;(五)测试数据1. 两个原始数据(1)学生名次表(2)学生个人成绩单(3)不及格学生名单(4)优秀学生名单情况(六)结论1.通过对这一课题的设计和实现,我对TC3.0环境进行了深一步的了解,并逐渐开始熟练tc3.0环境的工作界面,以及对每一个快捷键的熟悉。

并认识到,熟悉这些快捷键,极为便捷编写程序,但是还要更加熟悉。

2.编程时要养成良好的风格,注意相同内容的缩进和对齐。

这样做,可以使程序代码出错的情况下,可以快速并且便捷的查找到错误的行,利于很好的修改。

3.通过这次编程我们深深的感受到对代码的变量命名,代码内注释格式,甚至嵌套中行缩进的长度和函数间的空行数字都有明确规定,良好的编写习惯,不但有助于代码的移植和纠错,也有助于不同人员之间的协作。

4.这个程序设计主要涉及到了C语言中的结构体、指针及文件操作等内容,只有充分掌握了C语言中的结构体、指针及文件操作等内容,才有可能组织好这些代码,使之符合运算逻辑,得到理想的结果。

5.善于总结,也是学习能力的一种体现,每次完成一个编程任务,完成一段代码,都应当有目的的跟踪该程序的应用状况,随时总结,找到自己的不足,这样所编写的程序才能逐步提高,生活就是这样,汗水预示着结果也见证着收获。

劳动是人类生存生活永恒不变的话题。

通过实际动手做,我们才真正领略到“艰苦奋斗”这一词的真正含义,我们想说,编程确实有些辛苦,但苦中也有乐,在这个团队的任务中,一起的工作可以让我们有说有笑,相互帮助,配合默契。

对我们而言,知识上的收获重要,精神上的丰收是可喜的。

挫折是一份财富,经历是一份拥有。

这次实际操作必将成为我们人生旅途上一个非常美好的回忆!6.回顾起此次课程设计,至今仍感慨颇多,的确,自从拿到题目到完成整个编程,从理论到实践,在整整半个月的日子里,可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。

通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。

在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对一些前面学过的知识理解得不够深刻,掌握得不够牢固,比如说结构体,指针……通过这次课程设计之后,我把前面所学过的知识又重新温故了一遍。

同时,在汪老师和余老师的身上我学得到很多实用的知识,在此表示感谢!同时,对给过我帮助的所有同学和指导老师再次表示忠心的感谢!(七)附录程序全部代码:#define M 25#define N 6#include "stdio.h"#include "math.h"#include "stdlib.h"#include "string.h"struct student{long num;char name[20];int score[N];double ave;int t;}st[M];struct subject{int num;int excellent;int good;int mid;int pass;int fail;char kc[30];float xuefen;double ave;double bzc;}course[N];/* 读取\\wl0116.txt */void read1(){int i,j;char str1[100];FILE *fp;if((fp=fopen("d:\\wl0116.txt","r"))==NULL){printf("Cannot open the file!\n");exit(0);}fgets(str1,100,fp);for(i=0;i<M;i++){fscanf(fp,"%ld%s",&st[i].num,st[i].name);for(j=0;j<N;j++){fscanf(fp,"%d",&st[i].score[j]);}}fclose(fp);}/* 读取\\wl01kc.txt */void read2(){FILE *fp=fopen("d:\\wl01kc.txt","r");int k;char str2[100];if(fp==NULL){printf("Cannot open the file !\n");exit(0);}fgets(str2,100,fp);for(k=0;k<N;k++){fscanf(fp,"%d%s%f",&course[k].num,course[k].k c,&course[k].xuefen);}fclose(fp);}void jaquan(){double s=0,sum;int i,j;for(i=0;i<N;i++)s=s+course[i].xuefen;for(i=0;i<M;i++){sum=0;for(j=0;j<N;j++)sum=sum+(st[i].score[j])*(course[j].xuefen);st[i].ave=(int)(sum*10.0/s+0.5)/10.0;}void mingci(){int i,j,t;for(i=0;i<M;i++){t=1;for(j=0;j<M;j++)if(st[i].ave<st[j].ave)t++;st[i].t=t;}}/* 计算课程平均分和优劣分布*/void ave(){double s;int i,j;for(j=0;j<N;j++){s=0;course[j].excellent=0;course[j].good=0;course[j].mid=0;course[j].pass=0;course[j].fail=0;for(i=0;i<M;i++){switch(st[i].score[j]/10){case 10:case 9:course[j].excellent++;break;case 8:course[j].good++;break;case 7:course[j].mid++;break;case 6:course[j].pass++;break;default :course[j].fail++;}s+=st[i].score[j];}course[j].ave=s/M;}}void bzcha(){int i,j;double s;for(j=0;j<N;j++){s=0;for(i=0;i<M;i++)s+=(st[i].score[j]-course[j].ave)*(st[i].score[j]-c ourse[j].ave);course[j].bzc=sqrt(s/N);}}/* 创建班级成绩排名*/void writefile1()FILE *fp;int i,j;if((fp=fopen("d:\\mc0116.txt","w"))==NULL) {printf("fail!\n");exit(0);}fprintf(fp,"名次学号姓名英语C语言离散线性物理密码学***平均成绩\n"); for(i=0;i<M;i++){fprintf(fp,"%3d%10ld%10s",st[i].t,st[i].num,st[i]. name);for(j=0;j<N;j++)fprintf(fp,"%6d",st[i].score[j]);fprintf(fp," ....%4.1f\n",st[i].ave);}fclose(fp);}/* 创建班级课程成绩分布*/writefile3(){FILE *fp;int i;if((fp=fopen("d:\\kc0116.txt","w"))==NULL){printf("Faile to build the file!\n");exit(0);}fprintf(fp,"编号课程名称平均分标准差优秀良好中等及格不及格\n");for(i=0;i<N;i++)fprintf(fp,"%4d%10s%8.1f%8.1f%6d%6d%6d%4d %4d\n",i+1,course[i].kc,course[i].ave,course[i].b zc,course[i].excellent,course[i].good,course[i].mi d,course[i].pass,course[i].fail);fclose(fp);}void writefile4(){FILE *fp=fopen("d:\\cjt0116.txt","w");int i,j;if(fp==NULL){printf("Faile to build a new file !\n");exit(0);}for(i=0;i<M;i++){fprintf(fp,"\n学号姓名英语C语言离散线性物理密码学***平均成绩\n%8ld%8s",st[i].num,st[i].name);printf("\n学号姓名英语C语言离散线性物理密码学***平均成绩\n%8ld%8s",st[i].num,st[i].name);for(j=0;j<N;j++){fprintf(fp,"%6d",st[i].score[j]);printf("%6d",st[i]. score[j]);}fprintf(fp," ....%4.1f\n",st[i].ave);printf(" ....% 4.1f\n",st[i].ave);fprintf(fp,"*****************************");printf("*****************************\n");}fclose(fp);}void read5(){int i,j;printf("未及格学生信息:\n学号课程名称学分成绩\n");for(i=0;i<M;i++)for(j=0;j<N;j++)if(st[i].score[j]<60)printf("%8ld%8s%8.1f%6d\n",st[i].num,course [j].kc,course[j].xuefen,st[i].score[j]);}void read6(){int i,j;printf("优秀学生信息:\n名次学号姓名英语C语言离散线性数物理密码学***平均成绩\n");for(i=0;i<M;i++)for(j=0;j<N;j++)if(st[i].ave>=92||st[i].t<=5||(st[i].ave>=88&& st[i].score[j]>=99)){printf("%3d%10ld%10s",st[i].t,st[i].num,st[i]. name);for(j=0;j<N;j++)printf("%6d",st[i].score[j]);printf(" ....%4.1f\n",st[i].ave);break;}}void pic(){int i,j;printf("##########科目成绩分布图##########\n");for(i=0;i<N;i++){printf("%10s\n优秀",course[i].kc);for(j=0;j<course[i].excellent;j++)printf("=");printf("\n良好");for(j=0;j<course[i].good;j++)printf("=");printf("\n中等");for(j=0;j<course[i].mid;j++)printf("=");printf("\n及格");for(j=0;j<course[i].pass;j++)printf("=");printf("\n不及格");for(j=0;j<course[i].fail;j++)printf("=");printf("\n&&&&&&&&&^^^^^^^^ ^&&&&&&&&&^^^^^^^^^^&&&&&&&&&\n"); }}void searchnum(){long n;int i,j;printf("\n请输入你要查寻的学生学号:");scanf("%ld",&n);for(i=0;i<M;i++)if(st[i].num==n){printf("\n学号姓名英语C语言离散线性大学物理密码学***平均成绩\n%8ld%8s",st[i].num,st[i].name);for(j=0;j<N;j++)printf("%6d",st[i].score[j]);printf(" ....%4.1f\n",st[i].ave);return;}printf("\n抱歉!你的输入有误,或无此学生信息!\n");return;}void searchname(){int i,j;char s[20];printf("\n请输入你要查寻的学生姓名:");scanf("%s",s);for(i=0;i<M;i++)if(strcmp(st[i].name,s)==0){printf("\n学号姓名英语C语言离散线性物理密码学***平均成绩\n%8ld%8s",st[i].num,st[i].name);for(j=0;j<N;j++)printf("%6d",st[i].score[j]);printf(" ....%4.1f\n",st[i].ave);return;}printf("\n抱歉!你的输入有误,或无此学生信息!\n");return;}/* 查寻学生信息主函数*/void search(){int n;printf("\n1.按学号查寻 2.按姓名查寻0.回主菜单");printf("\n请选择:");scanf("%d",&n);if(n==1){searchnum();search();}else if(n==2){searchname();search();}else if(n==0)return;else exit(0);}void menu1(){printf("\n****@@@@@@@@@@@@@@@ @@@@@@@@@@@@@班级成绩管理系统@@@@@@@@@@@@@@@@@@@@@@ @@@@****\n");printf("\n1.显示/创建文档 2.显示未及格 3.显示优秀成绩 4.成绩分布图\n5.查寻成绩0.退出\n");printf("\n******************************* *************************************** ********\n");}void menu2(){printf("\n___________________ 显示创建文档____________________________\n");printf("1.创建班级名次文档(mc0116.txt)\n2.创建课程成绩分布文档(kc0116.txt)\n3.打印并创建成绩条(cjt0116.txt)\n5.回主菜单\n0.退出");printf("\n_______________________________________________________\n");}void main1(){int n;extern void main2();while(1){menu1();printf("\n 请输入:");scanf("%d",&n);switch(n){case 1:main2();break;case 2:read5();break;case 3:read6();break;case 4:pic();break;case 5:search();break;case 0:exit(0);}n=0;}}void main2(){int n;menu2();while(1){printf("\n 请输入:");scanf("%d",&n);switch(n){case 1:writefile1();printf("The file has been created!\n");menu2();break;case 2:writefile3();printf("The file has been created!\n");menu2();break;case 3:writefile4();printf("The file has been created!\n");menu2();break;case 5:main1();case 0:exit(0);}n=0;}}。

相关主题