第23次c语言课程设计实例_第1页
第23次c语言课程设计实例_第2页
第23次c语言课程设计实例_第3页
第23次c语言课程设计实例_第4页
第23次c语言课程设计实例_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

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

文档简介

第 14章 C语言程序设计实例,实例一 成绩处理程序实例二 电子词典程序,实例一 成绩处理程序,1. 问题描述 进行若干个学生、 若干门课程的成绩处理, 要求计算: (1) 每门课程的平均分和方差。 (2) 每个学生的总分、 平均分及方差。 (3) 按总分对学生由高分到低分排序。,2. 数据说明 (1) 学生人数假定不超过1000人, 课程门数假定不超过30门,分别用符号常量N、M描述。 (2) 实际学生人数、实际课程门数分别用整型量n、m描述。 (3) M门课程名称用二维字符数组sname描述。 (4) 学生数据考虑学号num、姓名name、M门课程成绩, 用结构体stt描述。M门课程成绩用一维数组score描述。N个学生数据用结构体数组sta描述。,(5) 每门课程的平均分和方差分别用一维实型数组avs1、 sus1描述。 (6) 每个学生的总分、 平均分及方差分别用一维实型数组total、 avs2和实型量sus2描述。 (7) 排序结果引入一序号数组sort保存。 以上变量定义为全局变量, 同时利用这些变量在函数之间传递数据。 (8) 数据源文件、处理结果文件分别用字符指针变量ps、pt与文件指针变量fps、fpt描述。,(9) 引入中间整型变量i、 j、 k, i用于循环中控制学生, j用于循环中控制课程,k对应总分最高的学生序号。 (10) 数据源文件前面存放学生实际学生人数、 实际课程门数与课程名称;处理结果文件中学生数据增加总分、 平均分及名次,课程的平均分和方差、学生的平均分和方差存放于文件的最后。,3. 算法分析 (1) 整个程序由主控模块main( )、 输入模块input( )、 每门课程的平均分和方差计算模块asfun( )、每个学生的总分平均分及方差计算模块tasfun( )、排序模块sortfun( )、输出模块output( )六个模块组成。各模块之间顺序执行。 (2) 实际学生人数n、实际课程门数m、原始成绩数据由键盘输入或从磁盘数据文件读取。,(3) 原始成绩数据由键盘输入时, 将送磁盘文件SCORE.DAT保存。 (4) 方差计算公式为数据平方和的平均值减去数据平均值的平方。 方差大,表示数据相互之间差别较大;方差小,表示数据相互之间差别较小。 (5) 排序采用选择排序方法, 利用序号数组保存学生名次, 无需交换数据。 (6) 处理结果与原始成绩数据合并后用另一磁盘文件STUDEN.DAT保存。,4. 参考程序include stdio.hinclude math.hdefine N 1000define M 30void input( ); void asfun( ); void tasfun( ); void sortfun( ); void output( );,int n, m; struct sttint num; char *name; float scoreM; staN; char snameM16; float avs1M, svs1M; float totalN, avs2N, svs2; int sortN; KH*2D,main( )/*主控函数*/clrscr( ); input( ); asfun( ); tasfun( ); sortfun( ); output( ); ,void input( )/*获取数据*/char ch; int i, j; char *ps; FILE *fps; printf(请选择数据源(K-键盘输入 F-磁盘文件读取): n); ch=getch( ); if(ch=K|ch=k)/*键盘输入*/printf(请输入实际学生人数: ); scanf(%d, &n); printf(请输入实际课程门数: ); scanf(%d, &m); ,if(n1000 |m30) printf(数据无效!); exit(0); printf(请输入%d门课程名称: , m); for(j=0; jm; j+) scanf(%s, snamej); for(i=0; in; i+) printf(请输入第%d个学生学号,姓名,%d门课程成绩:,i+1,m); scanf(%d%s,&stai.num,); for(j=0; jm; j+) scanf(%f, &stai.scorej); ,ps=SCORE.DAT; /*送磁盘文件保存*/if(fps=fopen(ps, wb)= =NULL)printf(文件建立错误!); exit(0); fwrite(&n, 2, 1, fps); fwrite(&m, 2, 1, fps); fwrite(sname, 16, m, fps); fwrite(sta, sizeof(struct stt), n, fps); fclose(fps); ,else if(ch=F|ch=f)/*从磁盘文件读取数据*/printf(请输入数据文件名: ); scanf(%s, ps);if(fps=fopen(ps, rb)=NULL) printf(文件打开错误!); exit(0); fread(&n, 2, 1, fps); fread(&m, 2, 1, fps); fread(sname, 16, m, fps); fread(sta, sizeof(struct stt), n, fps); fclose(fps); ,else printf(数据源选择错误!); exit(0); void asfun( )/*计算每门课程的平均分和方差*/int j; float tM, tsM; for(j=0; jm; j+) tj=0; tsj=0; for(i=0; in; i+) tj+=sta i.scorej; tsj+=sta i.scorej*sta i.scorej; ,avs1j=tj/n; sus1j=tsj/n- avs1j* avs1j; void tasfun( )/*计算每个学生的总分、 平均分和方差*/int i, j; float ta=0, ts=0; for(i=0; in; i+) totali=0; for(j=0; jm; j+) totali+=sta i.scorej; avs2i=totali/n; ta+=avs2i; ts+=avs2i*avs2i; ,sus2=ts/n-(ta/n)*(ta/n); void sortfun( )/*按总分排序*/int i, j, k; for(i=0; itotalk) k=j; sorti=k+1; ,void output( )/*输出数据*/int i, l, j; int is; clrscr( ); /*输出数据送屏幕*/printf(%d个学生%d门课程成绩数据如下: n); printf( 学号 姓名 ); for(j=0; jm; j+) printf(%16s, snamej); printf(| 总分 平均分 名次n); for(i=0; in; i+) for(l=0; ln; l+),if(sortl=i+1) is=l; printf(%8d%12s, stais.num, ); for(j=0; jm; j+) printf(%16.2f, stais.scorej); printf(| %8.2f%8.2f%6dn,totalis,avs2is,sortis); printf( 课程平均分 ); for(j=0; jm; j+) printf(%16.2f, avs1j); printf(n); printf( 方差 ); ,for(j=0; jm; j+) printf(%16.2f, sus1j); printf(%16.2n, sus2); pt=STUDENT.DAT; /*输出数据送磁盘*/if(fpt=fopen(pt, wb)=NULL)printf(文件建立错误!); exit(0); fwrite(&n, 2, 1, fpt); fwrite(&m, 2, 1, fpt); fwrite(sname, 16, m, fpt); for(i=0; ii; j-) strcpy(wordsj, wordsj-1); strcpy(explsj, explsj-1); strcpy(wordsi, word); strcpy(explsi, expls); len+; ,continue( ); void delete( )/*删除*/char wordSTRLEN1; int i, j; flag=1; while(flag)printf(请输入待删除的单词: ); scanf(%s, word); i=search1(0, len-1, word); if(i=-1) printf(无此单词!n);,elsefor(j=i; jlen-1; j+) strcpy(wordsj, wordsj+1); strcpy(explsj, explsj+1); len-; continue( ); void modify( )/*修改*/char wordSTRLEN1, explSTRLEN2; int i; flag=1;,while(flag)printf(请输入待修改的单词: ); scanf(%s, word); i=search1(0, len-1, word); if(i=-1) printf(无此单词!n); elseprintf(输入新释义: ); scanf(%s, expl); strcpy(explsi, expl); continue( ); ,void quit(file)/*退出*/char file ; int i; FILE *fp; char ch; printf(是否存入词典(Y/N)?); ch=getch( ); if(ch=Ych=y)if(fp=fopen(file, w)=NULL)printf(不能打开文件%s!n, file); exit(0); ,for(i=0; i=8?i-8: 0; i2=i=len-8?i+8: len-1; for(i=i1; i=i2; i+) printf(%-20s%-40sn, wordsi, explsi); continue( ); int search1(1, r, word)/*查找单词位置*/int l, r; char word ; int m;,while(l0) l=m+1; else r=m-1; return(-1); int search2(l, r, word)/*查找插入位置*/int l, r; char word;,int m; while(l0) l=m+1; else

温馨提示

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

评论

0/150

提交评论