《C语言程序设计实例.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计实例.ppt(47页珍藏版)》请在金锄头文库上搜索。
1、第 14章 C语言程序设计实例 第第 14章章 C语言程序设计实例语言程序设计实例 实例一实例一 成绩处理程序成绩处理程序实例二实例二 电子词典程序电子词典程序 第 14章 C语言程序设计实例 实例一实例一 成绩处理程序成绩处理程序 1. 问题描述问题描述 进行若干个学生、 若干门课程的成绩处理, 要求计算: (1) 每门课程的平均分和方差。 (2) 每个学生的总分、 平均分及方差。 (3) 按总分对学生由高分到低分排序。 第 14章 C语言程序设计实例 2. 数据说明数据说明 (1) 学生人数假定不超过1000人, 课程门数假定不超过30门,分别用符号常量N、M描述。 (2) 实际学生人数、
2、实际课程门数分别用整型量n、m描述。 (3) M门课程名称用二维字符数组sname描述。 (4) 学生数据考虑学号num、姓名name、M门课程成绩, 用结构体stt描述。M门课程成绩用一维数组score描述。N个学生数据用结构体数组sta描述。 第 14章 C语言程序设计实例 (5) 每门课程的平均分和方差分别用一维实型数组avs1、 sus1描述。 (6) 每个学生的总分、 平均分及方差分别用一维实型数组total、 avs2和实型量sus2描述。 (7) 排序结果引入一序号数组sort保存。 以上变量定义为全局变量, 同时利用这些变量在函数之间传递数据。 (8) 数据源文件、处理结果文件
3、分别用字符指针变量ps、pt与文件指针变量fps、fpt描述。 第 14章 C语言程序设计实例 (9) 引入中间整型变量i、 j、 k, i用于循环中控制学生, j用于循环中控制课程,k对应总分最高的学生序号。 (10) 数据源文件前面存放学生实际学生人数、 实际课程门数与课程名称;处理结果文件中学生数据增加总分、 平均分及名次,课程的平均分和方差、学生的平均分和方差存放于文件的最后。 第 14章 C语言程序设计实例 3. 算法分析算法分析 (1) 整个程序由主控模块main( )、 输入模块input( )、 每门课程的平均分和方差计算模块asfun( )、每个学生的总分平均分及方差计算模块
4、tasfun( )、排序模块sortfun( )、输出模块output( )六个模块组成。各模块之间顺序执行。 (2) 实际学生人数n、实际课程门数m、原始成绩数据由键盘输入或从磁盘数据文件读取。 第 14章 C语言程序设计实例 (3) 原始成绩数据由键盘输入时, 将送磁盘文件SCORE.DAT保存。 (4) 方差计算公式为数据平方和的平均值减去数据平均值的平方。 方差大,表示数据相互之间差别较大;方差小,表示数据相互之间差别较小。 (5) 排序采用选择排序方法, 利用序号数组保存学生名次, 无需交换数据。 (6) 处理结果与原始成绩数据合并后用另一磁盘文件STUDEN.DAT保存。 第 14
5、章 C语言程序设计实例 4. 参考程序参考程序include stdio.hinclude math.hdefine N 1000define M 30void input( ); void asfun( ); void tasfun( ); void sortfun( ); void output( ); 第 14章 C语言程序设计实例 int n, m; struct sttint num; char *name; float scoreM; staN; char snameM16; float avs1M, svs1M; float totalN, avs2N, svs2; int so
6、rtN; KH*2D 第 14章 C语言程序设计实例 main( )/*主控函数*/clrscr( ); input( ); asfun( ); tasfun( ); sortfun( ); output( ); 第 14章 C语言程序设计实例 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(请输入
7、实际课程门数: ); scanf(%d, &m); 第 14章 C语言程序设计实例 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,stai.name); for(j=0; jm; j+) scanf(%f, &stai.scorej); 第 14章 C语言程序设计实例 ps=SCORE.DA
8、T; /*送磁盘文件保存*/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); 第 14章 C语言程序设计实例 else if(ch=F|ch=f)/*从磁盘文件读取数据*/printf(请输入数据文件名: ); scanf(%s, ps);if(fps=fopen(ps, rb)=NUL
9、L) 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); 第 14章 C语言程序设计实例 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+) t
10、j+=sta i.scorej; tsj+=sta i.scorej*sta i.scorej; 第 14章 C语言程序设计实例 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; 第 14章 C语言程序设计实例 sus2=ts
11、/n-(ta/n)*(ta/n); void sortfun( )/*按总分排序*/int i, j, k; for(i=0; in; i+) k=i; for(j=i+1; jtotalk) k=j; sorti=k+1; 第 14章 C语言程序设计实例 void output( )/*输出数据*/int i, l, j; int is; clrscr( ); /*输出数据送屏幕*/printf(%d个学生%d门课程成绩数据如下: n); printf( 学号 姓名 ); for(j=0; jm; j+) printf(%16s, snamej); printf(| 总分 平均分 名次n);
12、 for(i=0; in; i+) for(l=0; ln; l+) 第 14章 C语言程序设计实例 if(sortl=i+1) is=l; printf(%8d%12s, stais.num, stais.name); 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( 方差 ); 第 14章 C语言程序设
13、计实例 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
14、, word); strcpy(explsi, expls); len+; 第 14章 C语言程序设计实例 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); 第 14章 C语言程序设计实例 elsefor(j=i; jlen-1; j+) strcpy(wordsj, wordsj+1); strcpy(ex
15、plsj, explsj+1); len-; continue( ); void modify( )/*修改*/char wordSTRLEN1, explSTRLEN2; int i; flag=1; 第 14章 C语言程序设计实例 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( ); 第 14章 C语
16、言程序设计实例 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); 第 14章 C语言程序设计实例 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
17、( ); int search1(1, r, word)/*查找单词位置*/int l, r; char word ; int m; 第 14章 C语言程序设计实例 while(l0) l=m+1; else r=m-1; return(-1); int search2(l, r, word)/*查找插入位置*/int l, r; char word; 第 14章 C语言程序设计实例 int m; while(l0) l=m+1; else r=m; return (l); 第 14章 C语言程序设计实例 void continue( )/*重复执行操作*/char ch; printf(继续执行吗(Y/N)?); ch=getch( ); if(ch=Y ch=y) flag=1; else flag=0; 第 14章 C语言程序设计实例 5. 说明说明 (1) 如果需增加单词及释义字串长度, 应修改源程序中有关参数。 (2) 对单词除了释义外, 还可增加发音、 同义词、 反义词等考虑。 (3) 流程图、 简单技术文档亦请读者给出。 (4) 延伸考虑电子新华字典程序。