版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第 14章 C语言程序设计实例 实例一 成绩处理程序实例二 电子词典程序实例三 野人渡河程序实例一 成绩处理程序 1. 问题描述 进行若干个学生、 若干门课程的成绩处理, 要求计算: (1) 每门课程的平均分和方差。 (2) 每个学生的总分、 平均分及方差。 (3) 按总分对学生由高分到低分排序。 2. 数据说明 (1) 学生人数假定不超过1000人, 课程门数假定不超过30门,分别用符号常量N、M描述。 (2) 实际学生人数、实际课程门数分别用整型量n、m描述。 (3) M门课程名称用二维字符数组sname描述。 (4) 学生数据考虑学号num、姓名name、M门课程成绩, 用结构体stt描
2、述。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、前面存放学生实际学生人数、 实际课程门数与课程名称;处理结果文件中学生数据增加总分、 平均分及名次,课程的平均分和方差、学生的平均分和方差存放于文件的最后。 3算法分析 (1) 整个程序由主控模块main( )、输入模块input( )、每门课程的平均分和方差计算模块asfun( )、每个学生的平均分及方差计算模块tasfun( )、排序模块sortfun( )、输出模块output( )六个模块组成。 各模块之间顺序执行。 (2) 实际学生人数n、实际课程门数m、原始成绩数据由键盘输入或从磁盘数据文件读取。 (3) 原始成绩数据由键盘输入时, 将送磁盘文件SCORE.DAT保存。 (4) 方
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 sttin
5、t num; char *name; float scoreM; staN; char snameM16; float avs1M, svs1M; float totalN, avs2N, svs2; int sortN;main( )/*主控函数*/ clrscr( ); input( ); asfun( ); tasfun( ); sortfun( ); output( ); void input( )/*获取数据*/ char ch; int i,j; char *ps; FILE *fps; printf(请选择数据源(K键盘输入 F磁盘文件读取):n); ch=getch( ); s
6、witch (ch) case K:/*数据从键盘输入*/ case 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+)
7、 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);break;case F:/*数据从磁盘文件读取*/case f : printf(“请输入数据文件名:”); scanf(%s,ps); if(fps=fopen(ps,rb)
8、=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); break; defautl: 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;
9、 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; fo
10、r(i=0;in;i+) k=i; for(j=i+1;jtotalk) k=j; sorti=k+1; void output( )/*输出数据*/ int i,l,j; int is; char *pt; FILE *fpt; 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%
11、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)=NU
12、LL) 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(请输入
13、待删除的单词: );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=search
14、1(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) printf(不能打开文件%s!n, file); exit(0); for(i=0; i=8?
15、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 r=m; return (
16、l); void continue( )/*重复执行操作*/char ch; printf(继续执行吗(Y/N)?); ch=getch( ); if(ch=Y ch=y) flag=1; else flag=0; 5. 说明 (1) 如果需增加单词及释义字串长度, 应修改源程序中有关参数。 (2) 对单词除了释义外, 还可增加发音、 同义词、 反义词等考虑。 (3) 流程图、 简单技术文档亦请读者给出。 (4) 延伸考虑电子新华字典程序。 实例三 野人渡河程序 1问题描述 3个野人和3个传教士来到河边,打算乘一只船从右岸到左岸去。该船的负载能力为两人。在任何时候,如果野人人数超过传教士人数,
17、野人就会把传教士吃掉。他们怎样才能用这条船安全地把所有人都渡过河去呢? 本问题是一个简单的人工智能问题,是个典型的状态图搜索问题。 这个问题还可以拓展为m个野人和n个传教士,而船一次可以装下r个人的情况。 2参考程序#include #include #define maxloop 100 /最大层数#define pristnum 3 /传教士默认值#define slavenum 3 /野人默认值struct SPQ int sr,pr; /船运行一个来回后河右岸的野人、传教士的人数 int sl,pl; /船运行一个来回后河左岸的野人、传教士的人数 int ssr,spr; /回来(由左
18、向右时)船上的人数 int sst,spt; /去时(由右向左时)船上的人数 int loop; /本结点所在的层数 struct SPQ *upnode ,*nextnode; /本结点的父结点和同层的下一个结点的地址 spq; int loopnum; /记录总的扩展次数int openednum; /记录已扩展节点个数int unopenednum; /记录待扩展节点个数int resultnum;struct SPQ *opened;struct SPQ *oend;struct SPQ *unopened; struct SPQ *uend;struct SPQ *result;vo
19、id initiate( );void releasemem( ); void showresult( );void addtoopened(struct SPQ *ntx);int search( );void goon( );int stretch(struct SPQ* ntx);void recorder( );void main( ) int flag; /标记扩展是否成功for( ; ; ) initiate( );flag = search ( );if(flag = 1) recorder( ); releasemem( ); showresult( ); goon( ); e
20、lse printf(无法找到符合条件的解); releasemem( ); goon( );void initiate( ) int x; char choice; uend = unopened = (struct SPQ*)malloc(sizeof(spq);if(uend=NULL) printf(n内存不够! n); exit(0); unopenednum=1;openednum=0;unopened - upnode = unopened; /保存父结点的地址以成链表unopened - nextnode = unopened;unopened - sr = slavenum;
21、unopened - pr = pristnum;unopened - sl = 0;unopened - pl = 0;unopened - sst = 0; unopened - spt = 0;unopened - ssr = 0;unopened - spr = 0;unopened - loop = 0;printf(题目:设有n个传教士和m个野人来到河边,打算乘一只船从右岸到左岸去。n);printf(该船的负载能力为两人。在任何时候,如果野人人数超过传教士人数,野人n);printf(就会把传教士吃掉。他们怎样才能用这条船安全地把所有人都渡过河去呢?n);printf(n默认的n
22、、m值皆为3n);for(; ;) printf(n是否修改?(Y/N):); scanf(%s,&choice); choice=toupper(choice); if(choice=Y)printf(n请输入传教士人数:); for(;) scanf(%d,&x); if(x0) unopened ?pr = x; break; else printf(n输入值应大于0!n请重新输入); printf(请输入野人人数:); for(;) scanf(%d,&x); if(x0) unopened ? sr = x; break; else printf(n输入值应大于0!n请重新输入);
23、break; if(choice=N) break; int search( ) int flag; struct SPQ *ntx; /提供将要扩展的结点的指针 for( ; ; ) ntx = unopened; /从待扩展链表中提取最前面的一个 if(ntx-loop = maxloop) return 0; addtoopened(ntx); /将ntx加入已扩展链表,并将这个节点从待扩展链表中去掉 flag = stretch(ntx); /对ntx进行扩展, 返回-1,0,1 if(flag = 1) return 1; int stretch(struct SPQ *ntx) i
24、nt fsr , fpr ; /在右岸上的人数 int fsl , fpl ; /在左岸上的人数 int sst , spt ; /出发时在船上的人数 int ssr , spr ; /返回时船上的人数 struct SPQ *newnode; for (sst = 0 ; sst sr; fpr = ntx- pr; fsl = ntx- sl; fpl = ntx - pl; if (sst = fsr) & ( 2 -sst) upnode = ntx; /保存父结点的地址以成链表newnode - nextnode = NULL;newnode - sr = 0;newnode- pr
25、 = 0;newnode - sl = opened ? sr;newnode - pl = opened ? pr; newnode- sst = sst;newnode- spt = spt;newnode- ssr = 0;newnode - spr = 0;newnode - loop = ntx ? loop + 1;oend - nextnode = newnode;oend = newnode;openednum+;return 1; else if (fpr - fsr) * fpr = 0) /判断是否满足传教士人数大于或等于野人人数fsl = fsl + sst; fpl
26、= fpl + spt;for (ssr = 0 ; ssr = 1 ; ssr+) /返回 int ffsl , ffpl; if (ssr = fsl) & (1 - ssr) = 0) /若符合条件则分配内存并赋值 int ffsr , ffpr; ffsr = fsr + ssr; ffpr = fpr + spr; newnode = (struct SPQ*) malloc (sizeof(spq); if ( newnode=NULL) printf(n内存不够!n); exit(0); newnode - upnode = ntx; /保存父结点的地址 newnode - sr
27、 = ffsr; newnode - pr = ffpr; newnode - sl = ffsl; newnode - pl = ffpl; newnode - sst = sst; newnode - spt = spt; newnode - ssr = ssr; newnode - spr = spr; newnode - loop = ntx ? loop + 1; uend - nextnode = newnode; uend = newnode; unopenednum+; return 0; void addtoopened(struct SPQ *ntx) unopened =
28、 unopened ? nextnode;unopenednum?;if ( openednum = 0 ) oend = opened = ntx;oend ? nextnode = ntx;oend = ntx;openednum+; void recorder( ) int i , loop;struct SPQ *newnode;struct SPQ *ntx;loop = oend ? loop;ntx = oend;resultnum = 0;for( i = 0 ; i sr = ntx - sr; ewnode - pr = ntx - pr; ewnode - sl = nt
29、x - sl; ewnode - pl = ntx - pl; ewnode - sst = ntx - sst; ewnode - spt = ntx - spt; ewnode - ssr = ntx - ssr; ewnode - spr = ntx - spr; ewnode - nextnode = NULL; tx = ntx - upnode; f ( i = 0) result = newnode; ewnode - nextnode = result; esult = newnode; esultnum+; void releasemem( ) int i; struct SPQ*
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 26年靶向疗效精细化管理
- 教育改变命运
- 年终清洁全流程实施指南
- 公鸡简笔画课件
- 深静脉血栓评估表
- 带量食谱设计思路
- 农村心理健康教育现状与推进策略
- 建材展厅设计软件介绍
- 硬脑膜下血肿患者手术后管理流程
- 结构设计教学
- 2026年金属非金属矿山(露天矿山)安全管理人员试题附答案详解【考试直接用】
- 2026湖南娄底市市直事业单位高层次和急需紧缺人才招聘集中组考18人备考题库含答案详解(预热题)
- 机械制图(王幼龙)第三章教案
- 15D501 建筑物防雷设施安装
- DB33-T 2350-2021数字化改革术语定义
- 广告效果研究方法课件
- 2.有机物的相互转化(图-方程式)
- 市政工程监理规划范本
- 桩基础负摩阻计算表格(自动版)
- 煎药机使用后清洗纪录表
- [PPT]杭州湾跨海大桥工程总体设计汇报(中交)_ppt
评论
0/150
提交评论