已阅读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.h include math.h define N 1000 define M 30 void input( ); void asfun( ); void tasfun( ); void sortfun( ); void output( );,int n, m; struct stt int 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; in; i+), fwrite(&stai, sizeof(struct stt), 1, fpt); fwrite(&totali, 4, 1, fpt); fwrite(&avs2i, 4, 1, fpt); fwrite(&sorti, 2, 1, fpt); fwrite(avs1, 4, m, fpt); fwrite(&sus2, 4, 1, fpt); fclose(fpt); ,5. 几点说明 (1) 数据源文件可用字处理软件直接建立。 (2) 程序的实现可以不用数组,而用链表。 (3) 函数之间数据可改用参数传递。 (4) 处理结果还可考虑打印输出。 (5) 流程图请读者画出。 (6) 所做的数据与算法分析可转化成本程序的简单技术文档。,实例二 电子词典程序,1. 问题描述 在计算机中建立有限规模的电子英汉词典(文件),利用程序实现电子英汉词典的查找与增、删、 改等维护。,2. 数据说明 (1) 对单词和释义字符串长度的限定分别为不超过20个与40个字符, 词条数限定为不超过1000条。 (2) 单词数组words,字符串数组。释义数组expls, 字符串数组。 词典中词条总数len,整型变量。 (3) 标志变量flag,在主函数中为0则执行菜单,为1则退出程序;在进入词典操作命令后,为1则继续执行同一命令,为0则退回到菜单。 以上变量定义为全局变量。,(4) 命令序号num, 整型。 在main( )函数中用于散转执行对应操作。 (5) 一维字符数组(字符串)word在lookup( )函数中为待查单词, 在insert( )函数中为r待插入单词,在delete( )函数中为待删除单词,在modify( )函数中为待修改单词,在display( )函数中为待显示单词。 (6) 一维字符数组(字符串)expl为待插入释义或待改成的释义。 (7) 在search1( )和search2( )中,正整数l,查找下限,形参;正整数r,查找上限,形参;正整数m,中点位置, 计算得到。,3. 算法分析,(1) 执行该程序要求在磁盘上有一个词典文件, 可使用任何中文编辑软件生成。其内容是每行对应一个词条, 每词条包括用若干空格符分开两个字符串, 前一个是单词字符串(英文),后一个是释义字符串(中文),使用分号作为多个释义的分隔符(无空格)。事实上,即使该文件内无一词条,也可用本程序在线生成所需词典,但必须有一个已存在的合乎上述格式的,哪怕是空白的文件。,(2) 采用菜单工作方式。在一个操作命令执行之后, 程序询问是否继续执行该命令。如输入y或Y,则重复同一操作,不退回到菜单;如输入其它信息,则回到菜单等待另一次选择。仅当选择退出操作时,程序会询问是否将修改后的词典存盘,并根据用户的选择存盘或不存盘退出。,(3) 除主函数之外,程序包含其它 11 个函数: input(file):从文件file中读入词典各词条的单词和释义分别到字串数组words和expls中。对每个字符串长度进行检查,发现非法长度后会显示出错信息并退出程序。 menu( ): 显示控制菜单。 lookup( ): 查询一个单词的释义 。 insert( ): 在词典中适当位置插入一个给定词条的单词和释义。 delete( ): 从词典中删去一个词条的单词和释义。 modify( ): 修改词典中给定单词的释义。 display( ): 显示词典中在给定单词前后的部分词条的单词和释义。,quit( ): 在询问是否要存盘之后退出程序。 search1(l, r, word): 在单词数组words的1r位置中查找给定单词word的位置。查到,返回该位置;查不到返回-1。分别由lookup( )、delete( )、modify( )和display( )调用。 search2(1, r, word): 在单词数组words的1r位置中查找给定单词word的插入位置。查到,返回该位置;查不到,不必插入,返回-1。分别由insert( )和display( )调用。 continue( ): 询问用户是否继续执行词典的操作。 除了退出,查询、插入、删除、修改、显示均调用该函数。,4. 参考程序,include stdio.h include string.h define MAXLEN 1000 define STRLEN1 20 define STRLEN2 40 void menu( ); void input( ); void lookup( ); void insert( ); void delete( ); void modify( ); void display( ); void quit( );,int search1( ); int search2( ); void continue( ); char *wordsMAXLEN, *explsMAXLEN; int len, flag=0; KH*2D main( )/*主控函数*/ char *file; int num; printf(请输入词典文件名: n); scanf(%s, file); input(file); while(!flag) menu( );,scanf(%d, &num); switch(num) case 1: lookup( ); break; case 2: insert( ); break; case 3: delete( ); break; case 4: modify( ); break; case 5: display( ); break; case 6: qiut(file); break; default: printf(选择错, 按任一键返回菜单!); getch( ); ,void input(file)/*读取词典*/ char file ; int i; FILLE *fp; char strSTRLEN1; if(fp=fopen(file, r)=NULL) printf(不能打开文件%s!, file); exit(0); i=0; fscanf(fp, %s, str); while(! feof(fp),strcpy(wordsi , str); fscanf(fp, %s, explsi+); fscanf(fp, %s, str); len=i; fclose(fp); void menu( )/*菜单*/ clrscr( ); printf(电子词典程序n); printf(nn1-单词查询n); printf(2-增加词条n);,printf(3-删除词条n); printf(4-修改词条n); printf(5-显示词条n); printf(6-退出nnn); printf(nn请选择(16)n); void lookup( )/*查找单词释义*/ char wordSTRLEN1; int i; flag=1; while(flag) printf(请输入查询单词: ); scanf(%s, word); i=search1(0, len-1, word);,if(i=-1) printf(无此单词!n); else printf(%sn, explsi); continue( ); void insert( )/*插入*/ char wordSTRLEN1, explSTRLEN2; int i, j; flag=1; while(flag) printf(请输入待插入的单词和释义: ); scanf(%s%s, word, expl);,i=search2(0, len, word); if(i=-1) printf(已有此单词!n); else for(j=len; ji; 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);,else for(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); else printf(输入新释义: ); 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
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 网络营销数据分析与效果评估体系
- 小学生劳动教育总结报告
- 家长会有效主持语言与技巧
- 新人教版七年级英语期末复习资料
- 企业年度工作总结范文及模板
- 电子制造业质量管理体系文件范本
- 中国电梯行业市场需求及发展趋势
- 智能家居产品市场推广案例
- 高校在线教育课程教学设计案例
- 商业圈层营销方案(3篇)
- 2025枣庄市生态环境修复矿区复垦政策实施效果与国土空间规划
- 购车意向金合同范本
- 2025广东广电网络校园招聘笔试历年参考题库附带答案详解
- 江苏大学《无机与分析化学实验B》2025-2026学年第一学期期末试卷
- 2025GINA全球哮喘处理和预防策略(更新版)解读课件
- 2025年中国职场人心理健康调查研究报告
- 2025~2026学年山东省德州市高二上学期九校联考英语试卷
- 第24课《寓言四则》课件2025-2026学年统编版语文七年级上册
- 前牙区种植修复的美学效果与临床观察
- 墓地购置协议书范本
- 国家开放大学电大本科【国际私法】2025年期末试题及答案
评论
0/150
提交评论