您好,欢迎访问三七文档
12345678大学123班李明(12345678)1算法与编程实习实习报告班级:姓名:李明学号:1234567812345678大学123班李明(12345678)2第一题一、题目:一、题目:统计字母的使用频率二、目的与要求1.目的:通过编写程序统计字母的使用频率,培养学生综合利用C语言进行程序设计的能力,熟悉字符串的操作方法,加强函数的运用,提高软件系统分析能力和程序文档建立、归纳总结的能力。2.基本要求:1)要求用C语言编程,在VisualC++环境下调试完成;2)要求按照程序功能分成几个功能模块来实现,各个功能模块分别使用函数来完成;3)要求应用本课所讲授的程序设计语言知识来解决问题三、设计方法和基本原理1.课题功能描述本程序的功能,就是要统计英文字母的使用频率。2.问题详细描述为统计英文字母的使用频率,输入一个不包括空格的由英文字母组成的字符串,长度不超过200个字符。统计26个英文字母的使用频率,不区分大小写。最后按使用频率从大到小输出字母(小写字母)和使用频率(出现的次数)。3.问题的解决方案按照程序要求,本程序应采用模块化设计方法,设计几个功能模块。例如(仅供参考):l将字符串中的大写字母转换为小写字母l统计输入的字符串中字母的使用频率l按使用频率从大到小进行排序主函数中控制输入、函数调用和输出。12345678大学123班李明(12345678)3四、主要技术问题的描述根据三的分析,主要问题在于:1)为统计字母的使用频率,定义一个长度为26的int数组存放所统计的各个字母的使用频率。2)在统计字母的使用频率时,不要使用if语句或switch语句,利用字母的ASCII码与数组元素下标之间的关系来求得。3)按使用频率从大到小进行排序时,建议使用指针数组更为方便。五、创新要求实现程序功能后,可进行创新设计:1)使用多文件,即主函数和各个函数分别存放在不同的.c文件中,在头文件中进行函数原型声明。2)读入一篇英文文档,并对其进行字母频率分析。二、功能描述1.程序运行第一步进行模式选择:从屏幕读入一串字母或从文件中读取文章(从屏幕读入时字符串长度不超过200)。2.读取文章完毕后,统计各个字母的使用频率,并按从大到小的顺序打印出来,同时,对使用次数相同的字母按字母表顺序打印,对使用次数为0的字母不予打印。(下页流程图)12345678大学123班李明(12345678)4三、解决方案四、主要函数描述1.Main函数:功能:负责变量的定义、模式的选择及函数的调用。2.chang函数功能:负责将大小写字母统一成小写字母后返回小写字母。3.cal函数Main函数Chang函数(大写字母转换为小写字母后返回)Mode_Num=1?Cal函数(统计某一字母的使用频率)Fprint函数(按顺序打印字母及使用频率)结束Fread函数(读入一篇文档)YN12345678大学123班李明(12345678)5功能:负责统计某一字母的使用频率并输出。4.fread函数功能:读入位于e:\\LDK的文档ldk.txt,通过调用函数统计字母频率并相应输出。5.fprint函数功能:按字母使用频率从大到小的顺序输出字母及其使用频率。五、实验心得通过这次“统计字母频率”算法编程的实习,我学习并掌握了函数的调用、形参为指针或数组的传递方法以及读取文件数据的方法。同时,在实习过程中,也遇到了许多问题:1.在文件调用的过程中,使用课本上的“while(ch!=EOF)”不能实现对文件结尾的判断,造成函数进入死循环,不能及时退出。解决方法:后来,运用老师讲述的调试方法,发现程序在运行到文档结尾的时候,从文档中读取的值为-1,于是我把判断文档结尾的条件改为了“while(ch!=-1)”,从而使函数正常地跳出了循环。心得:当自己的程序出现逻辑错误且自己不知道错误的地点时,用调试的方法一步步观察程序的运行方式,就可以发现错误的原因并加以改正。2.在输出字母及其使用频率的过成中,曾因为不知道运用转义字符而重新定义了一个数组用来存放a~z的英文字母,在一次翻书的过程中突然看见了转义字符的使用方法,从而使自己的程序大幅度的简化。虽然这并不属于程序的语法或逻辑错误,但这次经过使我明白了:程序的编译每个人可能都有不同的方法,但方法与方法之间是存在差别的,只有用心思考,才能以最简单明了的方式实现程序的功能。12345678大学123班李明(12345678)6附录:第一题源程序#includestdio.h#defineN200/*************************************************函数:chang功能:判断字母并将大写字母转换为小写字母后返回入口参数:字符指针出口参数:相应的小写字母*************************************************/voidchang(char*p){inti=0;for(i=0;*(p+i)!='\0';i++)*(p+i)=(('a'=(*(p+i))&&(*(p+i))='z'))?*(p+i):(*(p+i)+32);//判断字母的值并进行相应转换}/*************************************************函数:cal功能:统计某一字母的使用频率入口参数:被统计字母的地址指针,统计用数组的地址指针出口参数:void*************************************************/voidcal(char*p,int*q){inti=0,temp=0;for(i=0;*(p+i)!='\0';i++)(*(q+int(*(p+i)-'a')))++;//对相应统计字母的数组进行操作}/*************************************************函数:find功能:找出使用次数最大的字母,并按顺序打印出来入口参数:字符指针出口参数:相应的小写字母*************************************************/voidfind(intb[]){inti=0,max=0,j=0,k=0;while(k26)//依次判断各个字母的使用次数{for(i=0;b[i]!=-1;i++)12345678大学123班李明(12345678)7if(b[i]max)max=b[i],j=i;//记录最大使用次数为maxif(max==0)return;b[j]=0;printf(%c%6d\n,'a'+j,max);//按顺序打印各字母及其使用次数k++;max=0;}}/*************************************************函数:fread功能:读入位于e:\\LDK的文档ldk.txt,通过调用函数统计字母频率并相应输出入口参数:void出口参数:void*************************************************/voidfread(){FILE*fp;//定义文件指针charch;inta[27]={0};a[26]=-1;if(!(fp=fopen(e:\\LDK\\ldk.txt,r))){printf(ERROR!!);exit(1);}ch=fgetc(fp);while(ch!=-1){//txt文档的结束符为-1if(ch==-1)continue;ch=(('a'=ch&&(ch)='z'))?ch:(ch+32);//字母大小写统一if('a'=ch&&(ch)='z')a[ch-'a']++;ch=fgetc(fp);//获取下一个字符}fclose(fp);//关闭文件指针fprint(a);//打印统计结果return;}/*************************************************main函数12345678大学123班李明(12345678)8*************************************************/voidmain(){chara[N];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);chang(a);cal(a,b);fprint(b);}else{fread();}}12345678大学123班李明(12345678)9第二题一、题目:问题描述:N盏灯排成一排,从1到N按顺序依次编号。有N个人也从1到N依次编号。第一个人(1号)将灯全部关闭。第二个人(2号)将凡是2和2的倍数的灯打开。第三个人(3号)将凡是3和3的倍数的灯做相反的处理(如果该灯为打开的,则将它关闭;如果该灯为关闭的,则将它打开)。以后的人都和3号一样,将凡是与自己编号相同的灯,以及是自己编号倍数的灯做相反处理。请编写程序实现。要求:程序中要显示每一个人所做工作的过程,例如:当第i个人操作时,则显示将i和i的倍数的灯做相反的处理过程;当第N个人操作之后,显示灯的最后状态。(建议:采用图形法,显示每一盏灯,并为每一盏灯加边框,用不同的颜色显示开灯或关灯)。例如:当输入N为7时;当第一个人操作时则输出结果为:第1盏灯是黑的第2盏灯是黑的第3盏灯是黑的第4盏灯是黑的第5盏灯是黑的第6盏灯是黑的第7盏灯是黑的当第二个人操作时则输出结果为:第1盏灯是黑的第2盏灯是亮的第3盏灯是黑的第4盏灯是亮的第5盏灯是黑的第6盏灯是亮的第7盏灯是黑的当第三个人操作时则输出结果为:第1盏灯是黑的第2盏灯是亮的第3盏灯是亮的第4盏灯是亮的第5盏灯是黑的第6盏灯是黑的12345678大学123班李明(12345678)10第7盏灯是黑的二、功能描述本程序的主要功能为:记录并输出每个人对灯的操作后灯的状态。三、解决方案(流程图)四、主要函数1.main函数:功能:变量的定义以及函数的调用。2.ope函数功能:进行第k人对灯的操作。3.pr函数:功能:打印出当前灯的状态五、心得体会通过这次“指示灯控制”算法编程的实习,我学习并更加熟练地掌握了函数的调用、数组及循环体的使用,在变成过程中也遇到了很多问题,在不断解决问题的过程中,我学到了更多,当然,这也离不开老师的帮助!以下为这次变成实习中遇到的主要问题:1.在使用多文件存储函数(即主函数和各个函数分别存放在不同的.c文件中,在头文件中进行函数原型声明)时,发现有些变量只能在当前的C文件中使用,而不能正常调开始Main函数(变量的定义、函数的调用)Ope函数(第k人的操作)Pr函数(输出灯的状态)END12345678大学123班李明(12345678)11用,而且不知道如何将自己编写的头文件包含到函数中。解决方法:在老师的指导下,我学到了:在包含自己编写的头文件之前,需要先建立一个WIN32的工程,而不是简单新建一个cpp文件,同时,在工程中包含自己编写的头文件时,不能使用单括号,而应该使用双引号“”。这样将自己编写的头文件包含进函数后,程序就能正常运行了。附录:第二题源程序/*************************************************第二题:指示灯控制班级:通信五班姓名:林大凯2010.7*************************************************/#includestdio.h#defineN7/*************************************************函数:pr功能:打印出当前灯的状态入口参数:灯的
本文标题:算法与编程实习报告
链接地址:https://www.777doc.com/doc-3182156 .html