算法与编程实习报告_第1页
算法与编程实习报告_第2页
算法与编程实习报告_第3页
算法与编程实习报告_第4页
算法与编程实习报告_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

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

文档简介

算法与编程实习报告第一题:统计字母的使用频率一、题目:统计字母的使用频率目的与规定1.目的:通过编写程序统计字母的使用频率,培养学生综合运用C语言进行程序设计的能力,熟悉字符串的操作办法,加强函数的运用,提高软件系统分析能力和程序文档建立、归纳总结的能力。2.基本规定:1)规定用C语言编程,在VisualC++环境下调试完毕;2)规定按照程序功效分成几个功效模块来实现,各个功效模块分别使用函数来完毕;3)规定应用本课所讲授的程序设计语言知识来解决问题设计办法和基本原理1.课题功效描述:本程序的功效,就是要统计英文字母的使用频率。2.问题具体描述为统计英文字母的使用频率,输入一种不涉及空格的由英文字母构成的字符串,长度不超出200个字符。统计26个英文字母的使用频率,不分辨大小写。最后按使用频率从大到小输出字母(小写字母)和使用频率(出现的次数)。3.问题的解决方案按照程序规定,本程序应采用模块化设计办法,设计几个功效模块。例如(仅供参考):◆将字符串中的大写字母转换为小写字母◆统计输入的字符串中字母的使用频率◆按使用频率从大到小进行排序主函数中控制输入、函数调用和输出。重要技术问题的描述根据三的分析,重要问题在于:1)为统计字母的使用频率,定义一种长度为26的int数组寄存所统计的各个字母的使用频率。2)在统计字母的使用频率时,不要使用if语句或switch语句,运用字母的ASCII码与数组元素下标之间的关系来求得。3)按使用频率从大到小进行排序时,建议使用指针数组更为方便。创新规定实现程序功效后,可进行创新设计:1)使用多文献,即主函数和各个函数分别寄存在不同的.c文献中,在头文献中进行函数原型声明。2)读入一篇英文文档,并对其进行字母频率分析。功效描述1.程序运行第一步进行模式选择:从屏幕读入一串字母或从文献中读取文章(从屏幕读入时字符串长度不超出200)。2.读取文章完毕后,统计各个字母的使用频率,并按从大到小的次序打印出来,同时,对使用次数相似的字母按字母表次序打印,对使用次数为0的字母不予打印。开始三、解决方案(流程图)MMain函数Chang函数(大写字母转换为小写字母后返回)Mode_Num=1?Cal函数(统计某一字母的使用频率)Fprint函数(按次序打印字母及使用频率)结束Fread函数(读入一篇文档)YN重要函数描述1.Main函数:负责变量的定义、模式的选择及函数的调用。2.change函数:负责将大小写字母统一成小写字母后返回小写字母。3.calculate函数:负责统计某一字母的使用频率并输出。4.read函数:读入位于f://单词开头大写.txt,通过调用函数统计字母频率并对应输出。5.fprint函数:按字母使用频率从大到小的次序输出字母及其使用频率。重要技术问题程序以下:#include<stdio.h>#include<stdlib.h>#defineN200 /*判断字母并将大写字母转换为小写字母后返回*/ voidchange(char*p) { inti=0; for(i=0;*(p+i)!='\0';i++) *(p+i)=(('a'<=(*(p+i))&&(*(p+i))<='z'))?*(p+i):(*(p+i)+32); //判断字母}的值,将全部字母转换成小写/*统计某一字母的使用频率*/voidcalculate(char*p,int*q){ inti=0,temp=0; for(i=0;*(p+i)!='\0';i++) (*(q+(*(p+i)-'a')))++;//对对应统计字母的数组进行操作,统计对应字母的使用}频率/*找出使用次数最多的字母并按次序打印*/ voidfind(intb[]){ inti=0,max=0,j=0,k=0; while(k<26) //依次判断各个字母的使用次数 { for(i=0;b[i]!=-1;i++) if(b[i]>max) max=b[i],j=i; //统计最大使用次数为max if(max==0) return; b[j]=0; printf("%c%6d\n",'a'+j,max); //按次序打印各字母及其使用次数 k++; max=0; }}/*读入位于f://单词开头大写.txt,通过调用函数统计字母频率并对应输出*/voidread(){ FILE*fp;//定义文献指针 charch; inti; inta[27]={0}; a[26]=-1; if(!(fp=fopen("f:\\单词开头大写.txt","r"))){ printf("ERROR!!"); exit(1); } ch=fgetc(fp); while(ch!=-1){//文档的结束符为-1 if(ch==-1) continue; ch=(('a'<=ch&&(ch)<='z'))?ch:(ch+32);//字母大小写统一 if('a'<=ch&&(ch)<='z') a[ch-'a']++; ch=fgetc(fp);//获取下一种字符 } fclose(fp);//关闭文献指针 for(i=0;i<=25;i++) { printf("%d",a[i]);//统计并打印该文档中各字母的使用频率 printf(""); } return;}voidmain()//主函数{ chara[N]; inti; intb[27]={0},Mode_Num;//Mode_Num为模式选择 b[26]=-1; printf("PleasechoosetheMODE:\n1--toreadfromthescreen\n2--toreadfromfile\n"); scanf("%d",&Mode_Num); if(Mode_Num==1){ scanf("%s",a);//输入字符串 change(a);//调用change函数,将全部字母统一为小写字母 calculate(a,b);//调用calculate函数,统计个字母的使用频率 for(i=0;i<=25;i++) { printf("%d",b[i]);//对26个字母一次统计并打印 printf(""); } } else { read(); }}运行成果:六、实验心得通过这次“统计字母使用的频率”算法编程的实习,我学习并掌握了函数的调用、形参为指针或数组的传递办法以及读取文献数据的办法。同时,在编程过程中,也碰到了许多问题:1.在文献调用的过程中,使用课本上的“while(ch!=EOF)”不能实现对文献结尾的判断,造成函数进入死循环,不能及时退出。心得:当自己的程序出现逻辑错误且自己不懂得错误的地点时,用调试的办法一步步观察程序的运行方式,就能够发现错误的因素并加以改正。2.在输出字母及其使用频率的过成中,曾由于不懂得运用转义字符而重新定义了一种数组用来寄存a~z的英文字母,在一次翻书的过程中忽然看见了转义字符的使用办法,从而使自己的程序大幅度的简化。心得:即使这并不属于程序的语法或逻辑错误,但这次通过使我明白了:程序的编译每个人可能都有不同的办法,但办法与办法之间是存在差别的,只有用心思考,才干以最简朴明了的方式实现程序的功效。第二题:四则运算题目:四则运算目的与规定1.目的:通过编写四则运算程序,培养学生综合运用C语言进行程序设计的能力,熟悉字符串的操作办法,加强函数的运用,提高软件系统分析能力和程序文档建立、归纳总结的能力。2.基本规定:1)规定用C语言编程,在VisualC++环境下调试完毕;2)规定按照程序功效分成几个功效模块来实现,各个功效模块分别使用函数来完毕;3)规定应用本课所讲授的程序设计语言知识来解决问题.设计办法和基本原理1.课题功效描述本程序的功效,就是实现数的加减乘除四则运算,如自动计算3+5*8的成果。2.问题具体描述程序运行时,首先提示顾客输入四则运算体现式(体现式中最多有3个运算符,数据范畴为1-100的整数);输入结束后,程序自动进行计算并给出成果。如:输入13-10+5/8时输出3.625。3.问题的解决方案注意:问题的解决方案有诸多,下面给出的仅供同窗们参考。该问题重要注意四则运算的优先级问题:乘除运算比加减运算优先级高,同级运算按从左到右的次序运算。本程序应采用模块化设计办法,设计几个功效模块。例如(仅供参考):◆字符串解析函数(将输入字符串分解成数和运算符)◆将数据(字符数组中)转换成十进制数(long)◆判读与否存在高优先级运算符,若存在首先计算其运算成果并保存。◆同级运算按先后次序进行。创新规定实现程序功效后,可进行创新设计:1)使用多文献,即主函数和各个函数分别寄存在不同的.c文献中,在头文献中进行函数原型声明;2)在程序中增加自动出题功效及自动批卷功效3)不限定运算符个数4)允许括号运算的存在。功效描述本程序的功效,就是实现数的加减乘除四则运算,同时支持多重括号,算是的长度不超出20个运算符(能够修改数量)。并且,程序中包含自动出题及自动阅卷功效,对答错的问题会给出对的答案,最后会给出整体分数。解决方案(流程图)开始开始Main函数(变量的定义、函数的调用)用)Scan函数(将字符型算式转化为数字型)Cal函数(计算算式的值并输出)结束K=1?Ftext函数(出题模式)YN重要函数描述main函数:变量的定义,模式的选择以及函数的调用。disg函数:判断该字符与否为数字3.scan函数:给运算符赋优先级,同时调用函数cal,向主函数返回最后计算值4.cal函数:计算算式的值并返回。5.ftext函数:程序的出题模式重要技术问题程序以下:#include<stdio.h>#include<stdlib.h>#include<time.h>#include<math.h>#defineN20structyun //统计算式构造的构造体参数{ charkind;//算式的算术类型 doublea;//算式的第一种参数 doubleb;//算式的第二个参数 intflag;//算式的优先级}y[N];//定义一种构造体数组,使每个y[N]中含以上4个参数/*判断该字符与否为数字*/intdisg(chara){ if(a>='0'&&a<='9')return(1); elsereturn(0);}/*计算算式的值*/doublecal(structyuny[],intMinflag){ inti=0,j=0; doubletemp; while(Minflag<=1){ //最高优先级为括号外的'+'法运算,其优先级为1,故令Minflag<=1 for(i=0;y[i].b!=0;i++)//此循环用于计算一种符号的运算成果,并对应修改前后 {运算符的参数 if(y[i].flag==Minflag)//按照优先级次序计算 { switch(y[i].kind){ case'+':temp=y[i].a+y[i].b; y[i-1].b=y[i+1].a=temp;break; case'-':temp=y[i].a-y[i].b; y[i-1].b=y[i+1].a=temp;break; case'*':temp=y[i].a*y[i].b; y[i-1].b=y[i+1].a=temp;break; case'/':temp=y[i].a/y[i].b; y[i-1].b=y[i+1].a=temp;break; default:printf("ERROR!!"); } for(j=i;y[j].b!=0;j++)//一种运算符计算完毕后,覆盖其值 y[j]=y[j+1]; i=-1; } } Minflag++;//一种优先级计算完毕后,计算下一优先级 } return(temp);//最后仅剩的运算符的计算值temp即为整个算式的值}/*给运算符赋优先级,同时调用函数cal,向主函数返回最后计算值;*/doublescan(chara[]){ inti=0,j=0,flag=0,Minflag=0,b[N]={0}; doublere; for(i=0;a[i]!='=';i++) { if(disg(a[i])&&disg(a[i+1])) //判断与否为两位的数字 b[j]=(a[i]-48)*10+(a[i+1]-48),i++,j++;//将两位数字从字符状态转换为 else数字状态并存入b[] if(disg(a[i])) b[j]=a[i]-48,j++; //将单位数字从字符状态转换为数字状态并存入 elseb[] { switch(a[i]){ case'(':flag-=2;Minflag=flag; continue; //碰到'('则提高括号内算式的优先级(仍然分辨加减 case')':flag+=2;符号的优先级) continue;//遇')'减少括号内算式优先级(仍然分辨加减号优先级) default:y[j-1].kind=a[i]; //若a[i]既不是数字又不是括号,则为 }运算符 switch(y[j-1].kind){//下列是对括号外的运算符赋优先级 case'+': case'-':y[j-1].flag=1; break; case'*': case'/':y[j-1].flag=0; break; default:printf("ERROR!!"); } if(flag!=0) //下列是对括号内的运算符赋优先级 { y[j-1].flag=flag; if(a[i]=='+'||a[i]=='-') y[j-1].flag++; } y[j-1].a=b[j-1]; if((j-1)!=0) y[j-2].b=b[j-1]; } } y[j-2].b=b[j-1]; re=cal(y,Minflag);//调用cal()函数计算算式的值 return(re); //返回算式的最后计算成果}/*程序的出题模式;*/voidftext(){ inta=0,b=0,i=0,j=0,k=0,l=0; doubleRe[10],Ans[10];//Ans[]统计顾客答案;Re[]统计原则答案 srand(time(0)); //随机数初始化 printf("Herewehave10questionsforyou\n"); do { for(i=0;i<3;i++) { if(i==0) y[i].a=rand()%100;//限制随机数的范畴为0~99 else y[i].a=y[i-1].b; y[i].b=rand()%100; switch(rand()%4){//随机产生运算符 case0:y[i].kind='+';break; case1:y[i].kind='-';break; case2:y[i].kind='*';break; case3:y[i].kind='/';break; default:printf("ERROR2"); } } printf("%.2f",y[0].a);//下列是输出题目 for(i=0;i<3;i++) printf("%c%.2f",y[i].kind,y[i].b); printf("=\n"); Re[l++]=cal(y,0);//计算每小题的原则答案 j++; //j统计已出题数 }while(j<10); for(i=0;i<10;i++)//下列循环校对答案,并统计分数 { scanf("%lf",&Ans[i]); if(fabs(Ans[i]-Re[i])<0.1) { printf("YouranswertoquestionNO.%disright\n",i); k++; } else { printf("YouranswertoquestionNO.%diswrong\nThecorrectansweris%.2f\n",i,Re[i]); } } printf("Yourfinalscoreis:%d\n",k*10); printf("Thankyouforyouruse\ncopyrightby:LDK\n");}voidmain()//主函数{ chara[40]; inti=0,k=0;//k为模式选择,1为计算机模式,2为考试模式 doublere; printf("Pleasechoosethemode:\npress1forcalcaution\npress2fortext\n"); scanf("%d",&k); if(k==1) { printf("pleaseinputtheshizi!\n"); scanf("%s",a); re=scan(a); printf("%.3f\n",re); printf("Thankyouforyouruse\ncopyrightby:LDK\n"); } else { ftext(); }}运行成果:实验心得通过这次“四则运算”算法编程的实习,我学习并更加纯熟地掌握了函数的调用、数组及循环体的使用,同时在编程过程中也碰到了诸多问题:这次编程的重要问题在于其逻辑问题,语法上没有出现过多问题。逻辑上的重要问题有:将字符型算式存储为数字型算式的办法、算式中优先级的判断以及给每个运算符赋优先级的办法、对已知的有优先级的算式的计算办法…… 心得:在这次编程过程中,我明白了对于要实现的一种项目,首先应当将它分成若干个简朴的小功效,理清解决问题的整体环节,然后才干开始便携程序,不懂得各个函数的具体功效、入口、出口参数就盲目开始编写程序是很难实现随即的功效的。第三题:解决文献题目:通信录目的与规定目的:通过编写程序熟悉文献的访问、文本文献的读写。掌握如何将字符串写入文本文献,从文本文献中读入字符串、随机访问文献中的数据以及修改文献中的内容。培养学生综合运用C语言对文献进行操作的能力。基本规定:1)规定用C语言编程,在VisualC++环境下调试完毕;2)规定按照程序功效分成几个功效模块来实现,各个功效模块分别使用函数来完毕;3)规定编写的程序规范、有良好的可读性和可移植性。设计办法和基本原理课题功效描述:本程序的功效是对文献进行灵活操作。问题具体描述从键盘读入姓名、电话号码和住宅地址,人数要10人以上。输入的符号由英文字母、数字及中文构成。将他们写入一种文献。如果这个文献不存在,就写入新文献。如果文献已存在,就将它们写入该文献。程序课添加新的姓名、电话号码和住宅地址。问题的解决方案按照程序规定,提供参考以下:(1)如果没有文献名,规定顾客输入。(2)打开文献并显示文献的内容。(3)将字符串写入文本文献。(4)从文本文献读取字符串。(5)更新文献的内容。重要技术问题的描述重要问题在于:(1)修改文献内容时,当新纪录与旧统计的长度不同时,需统计字符串长度。(2)查找文献中的内容时,可在文献中的设定位置,提高搜索速度。(3)建议使用构造体。创新规定实现程序功效后,可进行创新设计:(1)提取指定的姓的全部电话号码。(2)可删除已有的项。(3)可在文献的每条统计中插入图片,进行图片信息提取并运用图片进行检索(进一步创新规定)。功效描述本程序用于实现对通信录信息的解决,涉及查找、修改、删除通信信息等功效解决方案(流程图)开始开始 主函数1.enter函数:录入通信信息2.inquiry函数:查询通信信息3.modify函数:修改通信信息4.del函数:删除通信信息结束重要函数描述1.main函数:负责定义变量,函数的调用及成果的显示2.hello函数:用于显示登录界面3.enter函数:用于录入通信信息4.inquiry函数:用于查询通信信息5.Modify函数:用于修改通信信息6.del函数:用于删除通信信息7.find_free函数:用于检测通信录里与否有空栏重要技术问题程序以下:#include<stdio.h>#include<stdlib.h>#include<string.h>#defineMAX10inthello(void);//系统界面voidfound(void);//录入通信信息voidinquiry(void);//查询通信信息voidmodify(void);//修改通信信息voiddel(void);//删除某个通信信息intfind_free(void);//检测通信录里与否有空栏structpeople{//通信录构造体 charname[30];//姓名 charphone[30];//电话 charaddr[30];//住宅地址}one[MAX];intmain()//主函数{ intp; printf("\n*****欢迎登陆通讯录系统*****\n"); printf("1.信息录入;\n"); printf("2.信息查询;\n"); printf("3.信息修改;\n"); printf("4.信息删除;\n"); printf("5.退出系统;\n"); printf("\n****************************\n"); printf("请输入你需要的服务:\n"); for(;;)//用于延时 { p=hello();//调用hello()函数进入界面 switch(p){ case1:found();break; case2:inquiry();break; case3:modify();break; case4:del();break; case5:exit(0); } } return0;}inthello()//hello()函数:显示登录界面{ chara[10]; intb; do { gets(a); b=atoi(a); }while(b<1||b>5); returnb;}/*found()函数:录入通信信息*/voidfound(){ intp; p=find_free();//调用find_free()函数,检测通信录里与否有空栏 if(p==MAX) { printf("\n信息储存已满,需要删除其它的,才干执行录入操作\n"); return; } gets(one[p].name); gets(one[p].phone); gets(one[p].addr);}/*inquiry函数:查询通信信息*/voidinquiry(){ chars[30]; intp,i; gets(s); for(i=0;i<MAX;i++) { p=strcmp(s,one[i].name);//比较字符串s和one[i].name if(!p) { printf("%s%s%s\n",one[i].name,one[i].phone,one[i].addr); } }}/*modify()函数:修改通信信息*/voidmodify(){ intp,i; chars[30]; gets(s); for(i=0;i<MAX;i++){ p=strcmp(s,one[i].name);//比较字符串s和one[i].name if(!p) { intj; charm[10]; printf("1.姓名\n"); printf("2.电话号码\n"); printf("3.住宅地址\n"); printf("请输入你要修改的选项:"); do { gets(m); j=atoi(m);//将数组m[10]中的内容转化为int类型 }while(j<1||j>3); switch(j){ case1:gets(one[i].name);break; case2:gets(one[i].phone);break; case3:gets(one[i].addr);break; } } }}/*del()函数:删除通信信息*/voiddel(){ intp,i; chars[30]; gets(s); for(i=0;i<MAX;i++) { p=strcmp(s,one[i].name);//比较字符串s和one[i].name if(!p) { one[i].name[0]='\0'; } }}/*find_free()函数:检测通信录里与否有空栏*/intfind_free(){ inti; for(i=0;one[i].name[0]&&i<MAX;i++) if(i==MAX)returnMAX; returni;}运行成果:实验心得通过这次“通信录”算法编程的实习,我更加纯熟地掌握了函数的调用、循环体的使用,掌握了switch语句的使用,巩固了字符串这一块知识,固然在编程过程中也碰到了问题:这次编程的重要问题在于字符串操作函数的使用,语法上没有出现过多问题。对字符串函数的使用不够熟悉,造成编程经常出现错误。 心得:通过这次编程,是我更深刻地理解:对编程语言各个板块知识的均衡掌握有多重要。我会再接再厉,继续努力的。第四题:单词开头大写题目:单词开头大写目的与规定目的:通过编写程序熟悉字符串的操作办法,加强函数的运用,字母大小写的转换。基本规定:1)规定用C语言编程,在VisualC++环境下调试完毕;2)规定按照程序功效分成几个功效模块来实现,各个功效模块分别使用函数来完毕;3)规定应用本课所讲授的程序设计语言知识来解决问题设计办法和基本原理课题功效描述本程序的功效,从一种英语句子中找出单词,并把单词的首字母变成大写。2.问题具体描述输入一种由多个英文单词构成的句

温馨提示

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

评论

0/150

提交评论