版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第14章C语言程序设计实例实例一成绩处理程序实例二电子词典程序实例三野人渡河程序第14章C语言程序设计实例实例一成绩处理程序1实例一成绩处理程序1.问题描述进行若干个学生、若干门课程的成绩处理,要求计算:(1)每门课程的平均分和方差。(2)每个学生的总分、平均分及方差。(3)按总分对学生由高分到低分排序。实例一成绩处理程序1.问题描述2
2.数据说明(1)学生人数假定不超过1000人,课程门数假定不超过30门,分别用符号常量N、M描述。(2)实际学生人数、实际课程门数分别用整型量n、m描述。(3)M门课程名称用二维字符数组sname描述。(4)学生数据考虑学号num、姓名name、M门课程成绩,用结构体stt描述。M门课程成绩用一维数组score描述。N个学生数据用结构体数组sta描述。2.数据说明3(5)每门课程的平均分和方差分别用一维实型数组avs1、sus1描述。(6)每个学生的总分、平均分及方差分别用一维实型数组total、avs2和实型量sus2描述。(7)排序结果引入一序号数组sort保存。以上变量定义为全局变量,同时利用这些变量在函数之间传递数据。(8)数据源文件、处理结果文件分别用字符指针变量ps、pt与文件指针变量fps、fpt描述。(5)每门课程的平均分和方差分别用一维实型4(9)引入中间整型变量i、j、k,i用于循环中控制学生,j用于循环中控制课程,k对应总分最高的学生序号。(10)数据源文件前面存放学生实际学生人数、实际课程门数与课程名称;处理结果文件中学生数据增加总分、平均分及名次,课程的平均分和方差、学生的平均分和方差存放于文件的最后。(9)引入中间整型变量i、j、k,i用于5
3.算法分析(1)整个程序由主控模块main()、输入模块input()、每门课程的平均分和方差计算模块asfun()、每个学生的平均分及方差计算模块tasfun()、排序模块sortfun()、输出模块output()六个模块组成。各模块之间顺序执行。(2)实际学生人数n、实际课程门数m、原始成绩数据由键盘输入或从磁盘数据文件读取。3.算法分析6(3)原始成绩数据由键盘输入时,将送磁盘文件SCORE.DAT保存。(4)方差计算公式为数据平方和的平均值减去数据平均值的平方。方差大,表示数据相互之间差别较大;方差小,表示数据相互之间差别较小。(5)排序采用选择排序方法,利用序号数组保存学生名次,无需交换数据。(6)处理结果与原始成绩数据合并后用另一磁盘文件STUDEN.DAT保存。(3)原始成绩数据由键盘输入时,将送磁盘文74.参考程序#include″stdio.h″#include″math.h″#defineN1000#defineM30voidinput();voidasfun();voidtasfun();voidsortfun();voidoutput();4.参考程序8intn,m;structstt{intnum;char*name;floatscore[M];}sta[N];charsname[M][16];floatavs1[M],svs1[M];floattotal[N],avs2[N],svs2;intsort[N];intn,m;9main()/*主控函数*/{clrscr();input();asfun();tasfun();sortfun();output();}main()/*主控函数*/10voidinput()/*获取数据*/{charch;inti,j;char*ps;FILE*fps;printf("请选择数据源(K—键盘输入F—磁盘文件读取):\n");ch=getch();switch(ch){case'K':/*数据从键盘输入*/case'k':{printf("请输入实际学生人数:");scanf("%d",&n);printf("请输入实际课程门数:");voidinput()/*获取数据*/11scanf("%d",&m);if(n<=0||n>1000||m<=0||m>30){printf("数据无效!");exit(0);}printf("请输入%d门课程名称:",m);for(j=0;j<m;j++)scanf("%s",sname[j]);for(i=0;i<n;i++){printf("请输入第%d个学生学号,姓名,%d门课程成绩:",i+1,m);scanf("%d%s",&sta[i].num,sta[i].name);for(j=0;j<m;j++)scanf("%f",&sta[i].score[j]);}scanf("%d",&m);12ps="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(structstt),n,fps);fclose(fps);break;}case'F':/*数据从磁盘文件读取*/case'f':ps="SCORE.DAT";/*送磁盘文件保存*/13{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(structstt),n,fps);fclose(fps);break;}{printf(“请输入数据文件名:”);14defautl: {printf("数据源选择错误!"); exit(0);}}}
voidasfun()/*计算每门课程的平均分和方差*/{intj;floatt[M],ts[M];for(j=0;j<m;j++){t[j]=0;ts[j]=0;for(i=0;i<n;i++)defautl:15{t[j]+=sta[i].score[j];ts[j]+=sta[i].score[j]*sta[i].score[j];}avs1[j]=t[j]/n;sus1[j]=ts[j]/n-avs1[j]*avs1[j];}}
voidtasfun()/*计算每个学生的总分、平均分和方差*/{inti,j;floatta=0,ts=0;for(i=0;i<n;i++){total[i]=0;{t[j]+=sta[i].score[16for(j=0;j<m;j++)total[i]+=sta[i].score[j];avs2[i]=total[i]/n;ta+=avs2[i];ts+=avs2[i]*avs2[i];}sus2=ts/n?(ta/n)*(ta/n);}
voidsortfun()/*按总分排序*/{inti,j,k;for(i=0;i<n;i++){k=i;for(j=i+1;j<m;j++)if(total[j]>total[k])k=j;sort[i]=k+1;}}for(j=0;j<m;j++)17voidoutput()/*输出数据*/{inti,l,j;intis;char*pt;FILE*fpt;clrscr();/*输出数据送屏幕*/printf("%d个学生%d门课程成绩数据如下:\n");printf("学号姓名");for(j=0;j<m;j++)printf("%16s",sname[j]);printf("|总分平均分名次\n");for(i=0;i<n;i++){for(l=0;l<n;l++)voidoutput()/*输出数据*/18if(sort[l]==i+1)is=l;printf("%8d%12s",sta[is].num,sta[is].name);for(j=0;j<m;j++)printf("%16.2f",sta[is].score[j]);printf("|%8.2f%8.2f%6d\n",total[is],avs2[is],sort[is]);}printf("课程平均分");for(j=0;j<m;j++)printf("%16.2f",avs1[j]);printf("\n");printf("方差");for(j=0;j<m;j++)printf("%16.2f",sus1[j]);if(sort[l]==i+1)19printf("%16.2\n",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;i<n;i++){fwrite(&sta[i],sizeof(structstt),1,fpt);fwrite(&total[i],4,1,fpt);fwrite(&avs2[i],4,1,fpt);printf("%16.2\n",sus2);20 fwrite(&sort[i],2,1,fpt);}fwrite(avs1,4,m,fpt);fwrite(&sus2,4,1,fpt);fclose(fpt);} fwrite(&sort[i],2,1,fpt);215.几点说明(1)数据源文件可用字处理软件直接建立。(2)程序的实现可以不用数组,而用链表。(3)函数之间数据可改用参数传递。(4)处理结果还可考虑打印输出。(5)流程图请读者画出。(6)所做的数据与算法分析可转化成本程序的简单技术文档。5.几点说明22实例二电子词典程序
1.问题描述在计算机中建立有限规模的电子英汉词典(文件),利用程序实现电子英汉词典的查找与增、删、改等维护。实例二电子词典程序1.问题描述232.数据说明(1)对单词和释义字符串长度的限定分别为不超过20个与40个字符,词条数限定为不超过1000条。(2)单词数组words,字符串数组。释义数组expls,字符串数组。词典中词条总数len,整型变量。(3)标志变量flag,在主函数中为0则执行菜单,为1则退出程序;在进入词典操作命令后,为1则继续执行同一命令,为0则退回到菜单。以上变量定义为全局变量。2.数据说明24(4)命令序号num,整型。在main()函数中用于散转执行对应操作。(5)一维字符数组(字符串)word在lookup()函数中为待查单词,在insert()函数中为r待插入单词,在delete()函数中为待删除单词,在modify()函数中为待修改单词,在display()函数中为待显示单词。(6)一维字符数组(字符串)expl为待插入释义或待改成的释义。(7)在search1()和search2()中,正整数l,查找下限,形参;正整数r,查找上限,形参;正整数m,中点位置,计算得到。(4)命令序号num,整型。在main(253.算法分析(1)执行该程序要求在磁盘上有一个词典文件,可使用任何中文编辑软件生成。其内容是每行对应一个词条,每词条包括用若干空格符分开两个字符串,前一个是单词字符串(英文),后一个是释义字符串(中文),使用分号作为多个释义的分隔符(无空格)。事实上,即使该文件内无一词条,也可用本程序在线生成所需词典,但必须有一个已存在的合乎上述格式的,哪怕是空白的文件。3.算法分析(1)执行该程序要求在磁盘上26(2)采用菜单工作方式。在一个操作命令执行之后,程序询问是否继续执行该命令。如输入y或Y,则重复同一操作,不退回到菜单;如输入其它信息,则回到菜单等待另一次选择。仅当选择退出操作时,程序会询问是否将修改后的词典存盘,并根据用户的选择存盘或不存盘退出。(2)采用菜单工作方式。在一个操作命令执行之27(3)除主函数之外,程序包含其它11个函数:
input(file):从文件file中读入词典各词条的单词和释义分别到字串数组words和expls中。对每个字符串长度进行检查,发现非法长度后会显示出错信息并退出程序。menu():显示控制菜单。lookup():查询一个单词的释义。insert():在词典中适当位置插入一个给定词条的单词和释义。delete():从词典中删去一个词条的单词和释义。modify():修改词典中给定单词的释义。display():显示词典中在给定单词前后的部分词条的单词和释义。(3)除主函数之外,程序包含其它11个函28quit():在询问是否要存盘之后退出程序。search1(l,r,word):在单词数组words的1~r位置中查找给定单词word的位置。查到,返回该位置;查不到返回-1。分别由lookup()、delete()、modify()和display()调用。search2(1,r,word):在单词数组words的1~r位置中查找给定单词word的插入位置。查到,返回该位置;查不到,不必插入,返回-1。分别由insert()和display()调用。continue():询问用户是否继续执行词典的操作。除了退出,查询、插入、删除、修改、显示均调用该函数。quit():在询问是否要存盘之后退出程序294.参考程序#include″stdio.h″#include″string.h″#defineMAXLEN1000#defineSTRLEN120#defineSTRLEN240voidmenu();voidinput();voidlookup();voidinsert();voiddelete();voidmodify();voiddisplay();voidquit();4.参考程序#include″stdio.h″30intsearch1();intsearch2();voidcontinue();char*words[MAXLEN],*expls[MAXLEN];intlen,flag=0;main()/*主控函数*/{char*file;intnum;printf(″请输入词典文件名:\n″);scanf(″%s″,file);input(file);while(!flag){menu();intsearch1();31scanf(″%d″,&num);switch(num){case1:lookup();break;case2:insert();break;case3:delete();break;case4:modify();break;case5:display();break;case6:qiut(file);break;default:printf(″选择错,按任一键返回菜单!″);getch();}}}scanf(″%d″,&num);32voidinput(file)/*读取词典*/charfile[];{inti;FILLE*fp;charstr[STRLEN1];if((fp=fopen(file,″r″))==NULL){printf(″不能打开文件%s!″,file);exit(0);}i=0;fscanf(fp,″%s″,str);while(!feof(fp))voidinput(file)/*读取词典*/33{strcpy(words[i],str);fscanf(fp,″%s″,expls[i++]);fscanf(fp,″%s″,str);}len=i;fclose(fp);}voidmenu()/*菜单*/{clrscr();printf(″电子词典程序\n″);printf(″\n\n1-单词查询\n″);printf(″2-增加词条\n″);{strcpy(words[i],str);34printf(″3-删除词条\n″);printf(″4-修改词条\n″);printf(″5-显示词条\n″);printf(″6-退出\n\n\n″);printf(″\n\n请选择(1~6)\n″);}voidlookup()/*查找单词释义*/{charword[STRLEN1];inti;flag=1;while(flag){printf(″请输入查询单词:″);scanf(″%s″,word);i=search1(0,len-1,word);printf(″3-删除词条\n″);35if(i==-1)printf(″无此单词!\n″);elseprintf(″%s\n″,expls[i]);continue();}}voidinsert()/*插入*/{charword[STRLEN1],expl[STRLEN2];inti,j;flag=1;while(flag){printf(″请输入待插入的单词和释义:″);scanf(″%s%s″,word,expl);if(i==-1)36i=search2(0,len,word);if(i==-1)printf(″已有此单词!\n″);else{for(j=len;j>i;j--){strcpy(words[j],words[j-1]);strcpy(expls[j],expls[j-1]);}strcpy(words[i],word);strcpy(expls[i],expls);len++;}i=search2(0,len,word);37continue();}}voiddelete()/*删除*/{charword[STRLEN1];inti,j;flag=1;while(flag){printf(″请输入待删除的单词:″);continue();38scanf(″%s″,word);i=search1(0,len-1,word);if(i==-1)printf(″无此单词!\n″);else{for(j=i;j<len-1;j++){strcpy(words[j],words[j+1]);strcpy(expls[j],expls[j+1]);}len--;}continue();}}scanf(″%s″,word);39voidmodify()/*修改*/{charword[STRLEN1],expl[STRLEN2];inti;flag=1;while(flag){printf(″请输入待修改的单词:″);scanf(″%s″,word);i=search1(0,len-1,word);if(i==-1)printf(″无此单词!\n″);else{printf(″输入新释义:″);scanf(″%s″,expl);voidmodify()/*修改*/40strcpy(expls[i],expl);}continue();}}voidquit(file)/*退出*/charfile[];{inti;FILE*fp;charch;printf(″是否存入词典(Y/N)?″);strcpy(expls[i],expl);41ch=getch();if(ch==′Y′‖ch==′y′){if((fp=fopen(file,″w″))==NULL){printf(″不能打开文件%s!\n″,file);exit(0);}for(i=0;i<len;i++)fprintf(fp,″%-20s%-40s\n″,words[i],expls[i]);fclose(fp);}ch=getch();42flag=1;}voiddisplay()/*显示*/{inti,i1,i2;charword[STRLEN1];flag=1;while(flag){printf(″请输入待显示的单词:″);scanf(″%s″,word);i=search1(0,len-1,word);flag=1;43if(i==-1)i=search2(0,len,word);i1=i>=8?i-8:0;i2=i<=len-8?i+8:len-1;for(i=i1;i<=i2;i++)printf(″%-20s%-40s\n″,words[i],expls[i]);continue();}}intsearch1(1,r,word)/*查找单词位置*/intl,r;charword[];{intm;if(i==-1)44while(l<=r){m=(l+r)/2;if(strcmp(word,words[m])==0)returnm;elseif(strcmp(word,words[m])>0)l=m+1;elser=m-1;}return(-1);}intsearch2(l,r,word)/*查找插入位置*/intl,r;charword[];while(l<=r)45{intm;while(l<r){m=(l+r)/2;if(strcmp(word,words[m])==0)return(-1);elseif(strcmp(word,words[m])>0)l=m+1;elser=m;}return(l);}{intm;46voidcontinue()/*重复执行操作*/{charch;printf(″继续执行吗(Y/N)?″);ch=getch();if(ch==′Y′‖ch=′y′)flag=1;elseflag=0;}voidcontinue()/*重复执行操作*/47
5.说明(1)如果需增加单词及释义字串长度,应修改源程序中有关参数。(2)对单词除了释义外,还可增加发音、同义词、反义词等考虑。(3)流程图、简单技术文档亦请读者给出。(4)延伸考虑电子新华字典程序。5.说明48实例三野人渡河程序1.问题描述3个野人和3个传教士来到河边,打算乘一只船从右岸到左岸去。该船的负载能力为两人。在任何时候,如果野人人数超过传教士人数,野人就会把传教士吃掉。他们怎样才能用这条船安全地把所有人都渡过河去呢?本问题是一个简单的人工智能问题,是个典型的状态图搜索问题。这个问题还可以拓展为m个野人和n个传教士,而船一次可以装下r个人的情况。实例三野人渡河程序1.问题描述492.参考程序#include<stdio.h>#include<stdlib.h>#definemaxloop100 //最大层数#definepristnum3 //传教士默认值#defineslavenum3 //野人默认值structSPQ{intsr,pr; //船运行一个来回后河右岸的野人、传教士的人数intsl,pl; //船运行一个来回后河左岸的野人、传教士的人数intssr,spr; //回来(由左向右时)船上的人数intsst,spt; //去时(由右向左时)船上的人数intloop;//本结点所在的层数2.参考程序50structSPQ*upnode,*nextnode;//本结点的父结点和同层的下一个结点的地址}spq;intloopnum;//记录总的扩展次数intopenednum;//记录已扩展节点个数intunopenednum;//记录待扩展节点个数intresultnum;structSPQ*opened;structSPQ*oend;structSPQ*unopened;structSPQ*uend;structSPQ*result;voidinitiate();voidreleasemem();structSPQ*upnode,*nextn51voidshowresult();voidaddtoopened(structSPQ*ntx);intsearch();voidgoon();intstretch(structSPQ*ntx);voidrecorder();
voidmain(){intflag;//标记扩展是否成功 for(;;){initiate();flag=search();if(flag==1)voidshowresult();52{recorder();releasemem();showresult();goon();}else{printf("无法找到符合条件的解");releasemem();goon();}}}voidinitiate(){intx;charchoice;{recorder();53uend=unopened=(structSPQ*)malloc(sizeof(spq));if(uend==NULL){printf("\n内存不够!\n");exit(0);}unopenednum=1;openednum=0;unopened->upnode=unopened;//保存父结点的地址以成链表unopened->nextnode=unopened;unopened->sr=slavenum;unopened->pr=pristnum;unopened->sl=0;unopened->pl=0;uend=unopened=(structSPQ*54unopened->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、m值皆为3\n");for(;;)unopened->sst=0;55 {printf("\n是否修改?(Y/N):"); scanf("%s",&choice); choice=toupper(choice); if(choice=='Y') {printf("\n请输入传教士人数:"); for(;;) {scanf("%d",&x); if(x>0) {unopened?>pr=x; break; } elseprintf("\n输入值应大于0!\n请重新输入"); } {printf("\n是否修56 printf("请输入野人人数:"); for(;;) {scanf("%d",&x); if(x>0) {unopened?>sr=x; break; } elseprintf("\n输入值应大于0!\n请重新输入"); } break; } if(choice=='N')break; }} printf("请输入野人人数:");57intsearch(){intflag;structSPQ*ntx;//提供将要扩展的结点的指针for(;;){ntx=unopened;//从待扩展链表中提取最前面的一个if(ntx->loop==maxloop)return0;addtoopened(ntx);//将ntx加入已扩展链表,并将这个节点从待扩展链表中去掉flag=stretch(ntx);//对ntx进行扩展,返回-1,0,1if(flag==1) return1; }}intsearch()58intstretch(structSPQ*ntx){intfsr,fpr;//在右岸上的人数intfsl,fpl;//在左岸上的人数intsst,spt;//出发时在船上的人数intssr,spr;//返回时船上的人数structSPQ*newnode;for(sst=0;sst<=2;sst++)//讨论不同的可能性并判断是否符合条件{fsr=ntx->sr;fpr=ntx->pr;fsl=ntx->sl;fpl=ntx->pl;if((sst<=fsr)&&((2-sst)<=fpr))//满足人数限制{spt=2-sst;fsr=fsr-sst;intstretch(structSPQ*ntx)59 fpr=fpr-spt; if((fpr==0)&&(fsr==0))//搜索成功 {newnode=(structSPQ*)malloc(sizeof(spq)); if(newnode==NULL) {printf("\n内存不够!\n"); exit(0); } newnode->upnode=ntx;//保存父结点的地址以成链表 newnode->nextnode=NULL; newnode->sr=0; newnode->pr=0; newnode->sl=opened?>sr; newnode->pl=opened?>pr; fpr=fpr-spt;60 newnode->sst=sst; newnode->spt=spt; newnode->ssr=0; newnode->spr=0; newnode->loop=ntx?>loop+1; oend->nextnode=newnode; oend=newnode; openednum++; return1; }elseif((fpr-fsr)*fpr>=0)//判断是否满足传教士人数大于或等于野人人数 {fsl=fsl+sst; newnode->sst=sst;61 fpl=fpl+spt; for(ssr=0;ssr<=1;ssr++)//返回 {intffsl,ffpl; if((ssr<=fsl)&&((1-ssr)<=fpl)) {spr=1-ssr; ffsl=fsl-ssr; ffpl=fpl-spr; if((ffpl-ffsl)*ffpl>=0)//若符合条件则分配内存并赋值 {intffsr,ffpr; ffsr=fsr+ssr; ffpr=fpr+spr; newnode=(structSPQ*)malloc(sizeof(spq)); if(newnode==NULL) {printf("\n内存不够!\n"); exit(0); } fpl=fpl+spt;62 newnode->upnode=ntx;//保存父结点的地址 newnode->sr=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++; } } }}}} return0;} newnode->upnode=ntx;/63voidaddtoopened(structSPQ*ntx){unopened=unopened?>nextnode;unopenednum??;if(openednum==0)oend=opened=ntx;oend?>nextnode=ntx;oend=ntx;openednum++;}voidaddtoopened(structSPQ*n64voidrecorder(){inti,loop;structSPQ*newnode;structSPQ*ntx;loop=oend?>loop;ntx=oend;resultnum=0;for(i=0;i<=loop;i++) {newnode=(structSPQ*)malloc(sizeof(spq)); if(newnode==NULL) {printf("\n内存不够!\n"); exit(0); }voidrecorder()65 newnode->sr=ntx->sr; ewnode->pr=ntx->pr; ewnode->sl=ntx->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++; }} newnode->sr=ntx->s66voidreleasemem(){inti;structSPQ*nodefree;for(i=1;i<openednum;i++){nodefree=opened; opened=opened?>nextnode; free(nodefree);}for(i=0;i<unopenednum;i++){nodefree=unopened;unopened=unopened?>nextnode;free(nodefree);}}voidreleasemem()67voidshowresult(){inti;intfsr,fpr;//在右岸上的人数intfsl,fpl;//在左岸上的人数structSPQ*nodefree;printf("\n");printf("%d个传教士和%d个野人渡河:",result?>pr,result?>sr);for(i=1;i<resultnum;i++){nodefree=result; result=result?>nextnode; free(nodefree); printf("\n\n\t左岸人数船上人数及方向右岸人数\n");voidshowresult()68 printf("第%d轮\n",i); fpl=result->pl-result->spt+result->spr; fpr=result->pr-result->spr; fsl=result->sl-result->sst+result->ssr; fsr=result->sr-result->ssr; printf("传教士%8d%8d\t<-\t%8d\n",fpl,result->spt,fpr); printf("野人%8d%8d\t<-\t%8d\n",fsl,result->sst,fsr); printf("传教士%8d%8d\t->\t%8d\n",result->pl,result->spr,result->pr-result->spr); printf("野人%8d%8d\t->\t%8d\n",result->sl,result->ssr,result->sr-result->ssr); }printf("\n全体传教士和野人全部到达对岸!");free(result);} printf("第%d轮\n",i);69voidgoon(){charchoice; for(;;){printf("\n是否继续?(Y/N):");scanf("%s",&choice);choice=toupper(choice);if(choice=='Y')break;if(choice=='N')exit(0);}}voidgoon()703.运行结果图14-1野人渡河问题的解答3.运行结果图14-1野人渡河问题的解答71
4.数据与算法分析本题的数据与算法分析以及问题拓展后的情况,请读者基于上面的程序,作为本章的练习去完成。4.数据与算法分析72第14章C语言程序设计实例实例一成绩处理程序实例二电子词典程序实例三野人渡河程序第14章C语言程序设计实例实例一成绩处理程序73实例一成绩处理程序1.问题描述进行若干个学生、若干门课程的成绩处理,要求计算:(1)每门课程的平均分和方差。(2)每个学生的总分、平均分及方差。(3)按总分对学生由高分到低分排序。实例一成绩处理程序1.问题描述74
2.数据说明(1)学生人数假定不超过1000人,课程门数假定不超过30门,分别用符号常量N、M描述。(2)实际学生人数、实际课程门数分别用整型量n、m描述。(3)M门课程名称用二维字符数组sname描述。(4)学生数据考虑学号num、姓名name、M门课程成绩,用结构体stt描述。M门课程成绩用一维数组score描述。N个学生数据用结构体数组sta描述。2.数据说明75(5)每门课程的平均分和方差分别用一维实型数组avs1、sus1描述。(6)每个学生的总分、平均分及方差分别用一维实型数组total、avs2和实型量sus2描述。(7)排序结果引入一序号数组sort保存。以上变量定义为全局变量,同时利用这些变量在函数之间传递数据。(8)数据源文件、处理结果文件分别用字符指针变量ps、pt与文件指针变量fps、fpt描述。(5)每门课程的平均分和方差分别用一维实型76(9)引入中间整型变量i、j、k,i用于循环中控制学生,j用于循环中控制课程,k对应总分最高的学生序号。(10)数据源文件前面存放学生实际学生人数、实际课程门数与课程名称;处理结果文件中学生数据增加总分、平均分及名次,课程的平均分和方差、学生的平均分和方差存放于文件的最后。(9)引入中间整型变量i、j、k,i用于77
3.算法分析(1)整个程序由主控模块main()、输入模块input()、每门课程的平均分和方差计算模块asfun()、每个学生的平均分及方差计算模块tasfun()、排序模块sortfun()、输出模块output()六个模块组成。各模块之间顺序执行。(2)实际学生人数n、实际课程门数m、原始成绩数据由键盘输入或从磁盘数据文件读取。3.算法分析78(3)原始成绩数据由键盘输入时,将送磁盘文件SCORE.DAT保存。(4)方差计算公式为数据平方和的平均值减去数据平均值的平方。方差大,表示数据相互之间差别较大;方差小,表示数据相互之间差别较小。(5)排序采用选择排序方法,利用序号数组保存学生名次,无需交换数据。(6)处理结果与原始成绩数据合并后用另一磁盘文件STUDEN.DAT保存。(3)原始成绩数据由键盘输入时,将送磁盘文794.参考程序#include″stdio.h″#include″math.h″#defineN1000#defineM30voidinput();voidasfun();voidtasfun();voidsortfun();voidoutput();4.参考程序80intn,m;structstt{intnum;char*name;floatscore[M];}sta[N];charsname[M][16];floatavs1[M],svs1[M];floattotal[N],avs2[N],svs2;intsort[N];intn,m;81main()/*主控函数*/{clrscr();input();asfun();tasfun();sortfun();output();}main()/*主控函数*/82voidinput()/*获取数据*/{charch;inti,j;char*ps;FILE*fps;printf("请选择数据源(K—键盘输入F—磁盘文件读取):\n");ch=getch();switch(ch){case'K':/*数据从键盘输入*/case'k':{printf("请输入实际学生人数:");scanf("%d",&n);printf("请输入实际课程门数:");voidinput()/*获取数据*/83scanf("%d",&m);if(n<=0||n>1000||m<=0||m>30){printf("数据无效!");exit(0);}printf("请输入%d门课程名称:",m);for(j=0;j<m;j++)scanf("%s",sname[j]);for(i=0;i<n;i++){printf("请输入第%d个学生学号,姓名,%d门课程成绩:",i+1,m);scanf("%d%s",&sta[i].num,sta[i].name);for(j=0;j<m;j++)scanf("%f",&sta[i].score[j]);}scanf("%d",&m);84ps="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(structstt),n,fps);fclose(fps);break;}case'F':/*数据从磁盘文件读取*/case'f':ps="SCORE.DAT";/*送磁盘文件保存*/85{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(structstt),n,fps);fclose(fps);break;}{printf(“请输入数据文件名:”);86defautl: {printf("数据源选择错误!"); exit(0);}}}
voidasfun()/*计算每门课程的平均分和方差*/{intj;floatt[M],ts[M];for(j=0;j<m;j++){t[j]=0;ts[j]=0;for(i=0;i<n;i++)defautl:87{t[j]+=sta[i].score[j];ts[j]+=sta[i].score[j]*sta[i].score[j];}avs1[j]=t[j]/n;sus1[j]=ts[j]/n-avs1[j]*avs1[j];}}
voidtasfun()/*计算每个学生的总分、平均分和方差*/{inti,j;floatta=0,ts=0;for(i=0;i<n;i++){total[i]=0;{t[j]+=sta[i].score[88for(j=0;j<m;j++)total[i]+=sta[i].score[j];avs2[i]=total[i]/n;ta+=avs2[i];ts+=avs2[i]*avs2[i];}sus2=ts/n?(ta/n)*(ta/n);}
voidsortfun()/*按总分排序*/{inti,j,k;for(i=0;i<n;i++){k=i;for(j=i+1;j<m;j++)if(total[j]>total[k])k=j;sort[i]=k+1;}}for(j=0;j<m;j++)89voidoutput()/*输出数据*/{inti,l,j;intis;char*pt;FILE*fpt;clrscr();/*输出数据送屏幕*/printf("%d个学生%d门课程成绩数据如下:\n");printf("学号姓名");for(j=0;j<m;j++)printf("%16s",sname[j]);printf("|总分平均分名次\n");for(i=0;i<n;i++){for(l=0;l<n;l++)voidoutput()/*输出数据*/90if(sort[l]==i+1)is=l;printf("%8d%12s",sta[is].num,sta[is].name);for(j=0;j<m;j++)printf("%16.2f",sta[is].score[j]);printf("|%8.2f%8.2f%6d\n",total[is],avs2[is],sort[is]);}printf("课程平均分");for(j=0;j<m;j++)printf("%16.2f",avs1[j]);printf("\n");printf("方差");for(j=0;j<m;j++)printf("%16.2f",sus1[j]);if(sort[l]==i+1)91printf("%16.2\n",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;i<n;i++){fwrite(&sta[i],sizeof(structstt),1,fpt);fwrite(&total[i],4,1,fpt);fwrite(&avs2[i],4,1,fpt);printf("%16.2\n",sus2);92 fwrite(&sort[i],2,1,fpt);}fwrite(avs1,4,m,fpt);fwrite(&sus2,4,1,fpt);fclose(fpt);} fwrite(&sort[i],2,1,fpt);935.几点说明(1)数据源文件可用字处理软件直接建立。(2)程序的实现可以不用数组,而用链表。(3)函数之间数据可改用参数传递。(4)处理结果还可考虑打印输出。(5)流程图请读者画出。(6)所做的数据与算法分析可转化成本程序的简单技术文档。5.几点说明94实例二电子词典程序
1.问题描述在计算机中建立有限规模的电子英汉词典(文件),利用程序实现电子英汉词典的查找与增、删、改等维护。实例二电子词典程序1.问题描述952.数据说明(1)对单词和释义字符串长度的限定分别为不超过20个与40个字符,词条数限定为不超过1000条。(2)单词数组words,字符串数组。释义数组expls,字符串数组。词典中词条总数len,整型变量。(3)标志变量flag,在主函数中为0则执行菜单,为1则退出程序;在进入词典操作命令后,为1则继续执行同一命令,为0则退回到菜单。以上变量定义为全局变量。2.数据说明96(4)命令序号num,整型。在main()函数中用于散转执行对应操作。(5)一维字符数组(字符串)word在lookup()函数中为待查单词,在insert()函数中为r待插入单词,在delete()函数中为待删除单词,在modify()函数中为待修改单词,在display()函数中为待显示单词。(6)一维字符数组(字符串)expl为待插入释义或待改成的释义。(7)在search1()和search2()中,正整数l,查找下限,形参;正整数r,查找上限,形参;正整数m,中点位置,计算得到。(4)命令序号num,整型。在main(973.算法分析(1)执行该程序要求在磁盘上有一个词典文件,可使用任何中文编辑软件生成。其内容是每行对应一个词条,每词条包括用若干空格符分开两个字符串,前一个是单词字符串(英文),后一个是释义字符串(中文),使用分号作为多个释义的分隔符(无空格)。事实上,即使该文件内无一词条,也可用本程序在线生成所需词典,但必须有一个已存在的合乎上述格式的,哪怕是空白的文件。3.算法分析(1)执行该程序要求在磁盘上98(2)采用菜单工作方式。在一个操作命令执行之后,程序询问是否继续执行该命令。如输入y或Y,则重复同一操作,不退回到菜单;如输入其它信息,则回到菜单等待另一次选择。仅当选择退出操作时,程序会询问是否将修改后的词典
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 农村房产置换协议书
- 蓝莓果酱制造行业深度调研及发展战略咨询报告
- 2025-2030年园艺种植技巧短视频行业跨境出海战略分析研究报告
- 企业数据安全合规服务合同2025年
- 2026江苏省中考英语写作与阅读综合仿真卷-听力文本范文评分标准
- 2026年广东省中考化学试卷(含答案及解析)
- 广州二手房买卖合同15篇
- 孝敬演讲稿(集锦15篇)
- 2026党史为民面试题及答案
- 2026贵州历年面试题目及答案
- 动脉粥样硬化性心血管疾病(ASCVD)全病程管理指南共识与实践路径
- 6《会摇尾巴的狼》 公开课一等奖创新教学设计
- 旅游漂流安全管理制度
- 无锡科技馆新建设方案
- 边坡应急抢险响应方案
- 消防安全说课课件
- 2025年长春小学英语考编笔试及答案
- 健身房安全工作培训课件
- 《当代教育心理学》(1-16章课后题答案)
- 软件开发项目需求文档快速模板
- 技能大师工作室工作汇报
评论
0/150
提交评论