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

下载本文档

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

文档简介

算法与编程实习报告指导老师:XXX专业:通信工程班级:10083415学号:XXXXXXXX姓名:XX第一题问题描述一、题目:统计字母的使用频率二、目的与规定1.目的:通过编写程序统计字母的使用频率,培养学生综合运用C语言进行程序设计的能力,熟悉字符串的操作办法,加强函数的运用,提高软件系统分析能力和程序文档建立、归纳总结的能力。2.基本规定:1)规定用C语言编程,在VisualC++环境下调试完毕;2)规定按照程序功效分成几个功效模块来实现,各个功效模块分别使用函数来完毕;规定应用本课所讲授的程序设计语言知识来解决问题三、设计办法和基本原理1.课题功效描述本程序的功效,就是要统计英文字母的使用频率。2.问题具体描述为统计英文字母的使用频率,输入一种不涉及空格的由英文字母构成的字符串,长度不超出200个字符。统计26个英文字母的使用频率,不分辨大小写。最后按使用频率从大到小输出字母(小写字母)和使用频率(出现的次数)。3.问题的解决方案按照程序规定,本程序应采用模块化设计办法,设计几个功效模块。例如(仅供参考):1)将字符串中的大写字母转换为小写字母2)统计输入的字符串中字母的使用频率3)按使用频率从大到小进行排序4)主函数中控制输入、函数调用和输出。四、重要技术问题的描述根据三的分析,重要问题在于:1)为统计字母的使用频率,定义一种长度为26的int数组寄存所统计的各个字母的使用频率。2)在统计字母的使用频率时,不要使用if语句或switch语句,运用字母的ASCII码与数组元素下标之间的关系来求得。3)按使用频率从大到小进行排序时,建议使用指针数组更为方便。五、创新规定实现程序功效后,可进行创新设计:1)使用多文献,即主函数和各个函数分别寄存在不同的.c文献中,在头文献中进行函数原型声明。读入一篇英文文档,并对其进行字母频率分析。功效描述运用MFC实现和谐界面,设计了两个功效按钮,“打开文献”和“计算”对文档的读入有两种方案,一是直接在界面上直接输入,二是运用“打开文献”按钮,打开一种寄存于D盘根目录的data.txt文本文献。把读取来的英文数据都在显示框内显示。当顾客按下“计算”按钮时,程序读取显示框内的数据,用于计算。将计算得到的成果在成果输出框内显示,并写入D盘的result.txt文本文献。(下页流程图)解决方案(流程图)数据读入数据读入OnButtonFopen事件OnButtonFopen事件按下“打开文献”按钮data_input函数顾客在输入框内输入result_display函数成果显示OnButtonCalc事件字母次数计算result_display函数成果显示OnButtonCalc事件字母次数计算重要函数描述1)OnButtonCalc()按钮解决函数“计算”,用于控制数据的输入与输出2)OnButtonFopen()按钮解决函数“打开文献”,用于打开文献操作3)result_display() 成果显示函数4)freq_sort()成果排序,并写入文献5)freq_calc()计算字母出现频率6)num_change字母大小写转换重要技术问题对字符串的操作和问件的操作。指针的运用,函数的调用。结论(实验心得)函数必须加上必要的注释,否则要记起当时的思路很难。附录:第一题部分源程序/*****************************按钮解决函数“计算”*****************************/voidCTask_oneDlg::OnButtonCalc(){ //TODO:Addyourcontrolnotificationhandlercodehere UpdateData(TRUE);//把现在文本框中的内容保存到变量中charen_in[N]; charen_out[250]={0}; intres[26]={0}; strcpy(en_in,m_input);//读取EDIT中的值,存入字符数组 data_input(en_in,res);//输入数据解决函数 result_display(en_out);//成果显示 m_display=en_out;//变量传入控件 UpdateData(FALSE);}/**************************按钮解决函数“打开文献”***************************/voidCTask_oneDlg::OnButtonFopen(){ //TODO:Addyourcontrolnotificationhandlercodehere UpdateData(TRUE);//把现在文本框中的内容保存到变量中 charen_in[N];//定义字符数组用于寄存输入数据 charen_out[250]={0}; //定义字符数组用于寄存成果,写入文献 intres[26]={0};//26个字母的数组用于频率值 FILE*fp_r; if((fp_r=fopen("d:\\data.txt","r"))==NULL)//打开D盘根目录的data.txt文献 { MessageBox(TEXT("在D:\\中找不到文献data.txt!"),TEXT("错误"),MB_OK); } else { fscanf(fp_r,"%s",en_in);//文献的值读取到数组中 fclose(fp_r); m_input=en_in;//把读入的数据在界面上显示(原数据) } UpdateData(FALSE); }/***************************字母大小写变换******************************/voidnum_change(char*en){inti=0; for(i=0;*(en+i)!='\0';i++)//三目运算符当字在AZ之间时,转化为小写 { *(en+i)=('A'<=*(en+i)&&*(en+i)<='Z')?(*(en+i)+32):(*(en+i)); }}/**************************计算字母出现频率****************************/voidfreq_calc(char*en,int*res){ inti=0; for(i=0;*(en+i)!='\0';i++) { (*(res+(int)(*(en+i))-97))++;//字符与成果数组相对应自加一次 }}/*************************成果显示,并写入文献**************************/voidresult_display(char*en_out){ FILE*fp;//存入D盘根目录的result.txt文献中 if((fp=fopen("d:\\result.txt","r"))==NULL) { exit(1); } fscanf(fp,"%s",en_out);//读取并在界面上显示(解决后的数据) fclose(fp);}第二题问题描述一、题目:自然数的进制转换二、目的与规定1.目的:通过编写对自然数进行不同进制转换程序,培养学生综合运用C语言进行程序设计的能力,熟悉字符串的操作办法,加强函数的运用,提高软件系统分析能力和程序文档建立、归纳总结的能力。2.基本规定:1)规定用C语言编程,在VisualC++环境下调试完毕;2)规定按照程序功效分成几个功效模块来实现,各个功效模块分别使用函数来完毕;3)规定应用本课所讲授的程序设计语言知识来解决问题.三、设计办法和基本原理1.课题功效描述本程序的功效,就是实现自然数的十进制、二进制、八进制、十六进制转换。即根据顾客选择的进制和输入的数据,转换得到该数所对应的十进制、二进制、八进制和十六进制数。2.问题具体描述程序运行时,首先由顾客选择输入数据所使用的进制,如:欢迎使用进制转换程序!1.十进制2.二进制3.八进制4.十六进制0.退出请选择输入数据的进制:顾客选择后,再输入数据,如选择3(八进制),则显示:请输入八进制数据:输入数据后,程序进行转换,最后输出该数所对应的十进制、二进制、八进制和十六进制数。如输出:转换成果:十进制21809二进制001八进制52461十六进制55313.问题的解决方案事实上,C语言在输入输出时可直接输入或输出多个进制的数,本题目是为了提高学生的编程能力,因此要自己编程来实现数制的转换。根据问题的描述,使用字符数组来寄存输入的数据,转换后的数据也寄存到字符数组中,按字符串进行输入和输出。注意:问题的解决方案有诸多,下面给出的仅供同窗们参考。按照程序规定,每次要将数据转换成多个进制,因此将输入数据(字符数组中)先转换成十进制数(long),再将其转换成多个进制并存入对应的字符数组中,最后输出。本程序应采用模块化设计办法,设计几个功效模块。例如(仅供参考):1)检查输入数与否正当(例八进制数中只能出现0~7)2)将数据(字符数组中)转换成十进制数(long)3)将十进制数(long)转换成某种进制数据(字符数组中)还能够把这几个模块中都使用的字符与数字之间的转换作为独立模块,供上面的模块调用。例如(仅供参考):4)字符转数字5)数字转字符主函数中控制输入、函数调用和输出。四、重要技术问题的描述根据三的分析,重要问题在于:1)单个字符与数字的转换在字符转数字时,’0’~’9’只需减去’0’即可,要考虑到’a’~’f’和’A’~’F’的转换(十六进制数)。同样的,数字转字符时,要考虑到10~15的转换与0~9不同。2)将数据(字符数组中)转换成十进制数(long)时,采用的算法是:按现在数制的位权进行多项式展开相加,即得到对应的十进制数。3)将十进制数(long)转换成某种进制数据(字符数组中)时,采用除留余数法:将十进制数除以转换进制的位权,保存余数(存到字符数组中),商继续除,直到商为零;然后将字符数组中的内容求头逆序,即得到转换数据。其中求逆序也可用一种独立模块来实现。五、创新规定实现程序功效后,可进行创新设计:1)使用多文献,即主函数和各个函数分别寄存在不同的.c文献中,在头文献中进行函数原型声明;2)本程序实现的是自然数的不同进制的转换,可进一步实现带小数的转换;3)实现负数的转换功效描述运用MFC实现和谐界面,设计了两个功效按钮,“转换”和“退出”。设计了一种Combox用来选择现在输入数据的进制。一种Edit框用于寄存输入数据。其它Edit框用于显示。(下页流程图)解决方案(流程图)GetCurSelGetCurSel函数读取顾客选择的进制Change_decChange_dec函数读取源数据,转换为十进制dec_to_string函数十进制转字符串dec_to_hex函数dec_to_string函数十进制转字符串dec_to_hex函数十进制转十六进制dec_to_oct函数十进制转八进制dec_to_bin函数十进制转二进制OnButtonChange函数把成果放入控件中显示 OnButtonChange函数把成果放入控件中显示重要函数描述1)OnButtonChange()“转换”按钮解决函数2)Change_dec() 按类别把输入的数据转换为十进制存入value中3)dec_to_string()dec_to_bin()dec_to_oct()dec_to_hex 十进制转化为多个进制4)OnButtonExit()“退出”按钮解决函数重要技术问题Combox控件的运用,Combox选用值的读取。按读进来的进制类型,统一转换为十进制。字符串转数字,数字转字符串。结论(实验心得)合理运用MFC能够使程序简洁又和谐。附录:第二题部分源程序/**************************Combox初始化******************************/m_kind.InsertString(0,"十进制");m_kind.InsertString(1,"二进制");m_kind.InsertString(2,"八进制");m_kind.InsertString(3,"十六进制");m_kind.SetCurSel(0);//默认显示十进制/************************“转换”按钮解决函数************************/voidCTask_twoDlg::OnButtonChange(){//TODO:Addyourcontrolnotificationhandlercodehereintkind=0;//输入数据的类别chars_dat[30]={0};//用于寄存输入的数据longvalue=0;//十进制存储位置把读到数据统一转换为十进制再解决kind=m_kind.GetCurSel();//读取combox的值,得到选中的类别UpdateData(TRUE);//把现在文本框中的内容保存到变量中 strcpy(s_dat,m_data);//把文本框的内容拷贝到字符数组里Change_dec(s_dat,kind,&value);//调用数据解决函数把读到数据统一转换为十进制/*******************************显示函数*******************************/dec_to_string(s_dat,&value);//十进制输出m_dec=s_dat; //把变量的值传控件中显示UpdateData(FALSE); dec_to_bin(s_dat,&value);//二进制输出m_bin=s_dat;UpdateData(FALSE);dec_to_oct(s_dat,&value);//八进制输出m_oct=s_dat;UpdateData(FALSE);dec_to_hex(s_dat,&value);//十六进制输出m_hex=s_dat;UpdateData(FALSE);}/***************************************************************************/voidChange_dec(char*dat,intkind,long*value)//把输入的数据转换为十进制存入value中{inti=0;kind=kind+1;//Combox中类别从0开始switch(kind)//按类别把输入的数据转换为十进制存入value中{case1://十进制while(*(dat+i)>='0'&&*(dat+i)<='9'){*value=(*value)*10+(*(dat+i)-'0');i++;}break;case2://二进制while(*(dat+i)>='0'&&*(dat+i)<='1'){*value=(*value)*2+(*(dat+i)-'0'); i++;}break;case3://八进制while(*(dat+i)>='0'&&*(dat+i)<='7'){*value=(*value)*8+(*(dat+i)-'0'); i++;}break; case4://十六进制while(*(dat+i)>='0'&&*(dat+i)<='F'){if((*dat)>'9')//十六进制时当数据不不大于9,单独解决{*value=(*value)*16+(*(dat+i)-'7'); //把大写的A转化为10}else{ *value=(*value)*16+(*(dat+i)-'0');}i++;}break; }}/*****************************十进制转十六进制***********************/voiddec_to_hex(char*dat,long*vp){ inti=0,j=0; charnum=0; longtemp=*vp; memset(dat,0,30); //清空字符串 while(temp) { if((temp%16)>9) { *(dat+i)=temp%16+'7';//余数不不大于9时解决10-15toA-F } else { *(dat+i)=temp%16+'0'; } temp=temp/16; i++; } for(j=0;j<i/2;j++)//字符串倒序输出 { num=*(dat+j); *(dat+j)=*(dat+i-1-j); *(dat+i-1-j)=num; }}第三题问题描述一、题目:四则运算二、目的与规定1.目的:通过编写四则运算程序,培养学生综合运用C语言进行程序设计的能力,熟悉字符串的操作办法,加强函数的运用,提高软件系统分析能力和程序文档建立、归纳总结的能力。2.基本规定:1)规定用C语言编程,在VisualC++环境下调试完毕;2)规定按照程序功效分成几个功效模块来实现,各个功效模块分别使用函数来完毕;3)规定应用本课所讲授的程序设计语言知识来解决问题.三、设计办法和基本原理1.课题功效描述本程序的功效,就是实现数的加减乘除四则运算,如自动计算3+5*8的成果。2.问题具体描述程序运行时,首先提示顾客输入四则运算体现式(体现式中最多有3个运算符,数据范畴为1-100的整数);输入结束后,程序自动行计算并给进出成果。如:输入13-10+5/8时输出3.625。3.问题的解决方案注意:问题的解决方案有诸多,下面给出的仅供同窗们参考。该问题重要注意四则运算的优先级问题:乘除运算比加减运算优先级高,同级运算按从左到右的次序运算。本程序应采用模块化设计办法,设计几个功效模块。例如(仅供参考):1)字符串解析函数(将输入字符串分解成数和运算符)2)将数据(字符数组中)转换成十进制数(long)3)判读与否存在高优先级运算符,若存在首先计算其运算成果并保存。4)同级运算按先后次序进行。四、创新规定实现程序功效后,可进行创新设计:1)使用多文献,即主函数和各个函数分别寄存在不同的.c文献中,在头文献中进行函数原型声明;2)在程序中增加自动出题功效及自动批卷功效3)不限定运算符个数允许括号运算的存在。功效描述读入现在字符串,并进行转换。按类别,把运算数字和运算符分辨开分别存入对应字符数组中。按四则运算法则,先乘除后加减执行计算。重要函数描述get_dat()字符串解析函数data_make()判读与否存在高优先级运算符,若存在首先计算其运算成果并保存重要技术问题字符串的解析,数据和运算符的分类先乘除后加减,把已运算过的数据赋值为0,已运算过的变为加号输入字符串必须以数字开头结论(实验心得)在解决先乘除后加减的过程中,对已进行乘除运算的数据解决时一种核心,这里我把这类数据赋值为0,乘除号变为加号,便于下面的加减运算。附录:第三题源程序#include<stdio.h>/**************************数据和运算符归类解决***************************/voidget_dat(char*dat,float*num,char*sig)//字符串解析函数{ inti=0,j=0; *num=0;//初始化 printf("欢迎使用简易四则运算器,请输入:\n"); scanf("%s",dat); for(i=0;*(dat+i)!='\0';i++) { if((*(dat+i)<'0')||(*(dat+i)>'9'))//如果输入的不是0-9的自然数 { if(i==0) { printf("算式有误,请重新输入!\n");//如果输入字符不是以数字开头 break; } *(sig+j)=*(dat+i);//如果是运算符就存储 j++;//指针位置加一 } else { *(num+j)=*(num+j)*10+(*(dat+i)-'0');//不是运算符就转化为数据存储 } }}//判读与否存在高优先级运算符,若存在首先计算其运算成果并保存voiddata_make(float*num,char*sig){ inti=0; for(i=0;*(sig+i)!='\0';i++)//扫描一遍先乘除后加减 { if(*(sig+i)=='*')//执行对应法则计算成果存入后一种数据单元 { *(num+i+1)=(*(num+i))*(*(num+i+1)); *(num+i)=0;//清空前一种数据单元,便于加减的运算 *(sig+i)='+';//把乘除转换为加避免运算符干扰 } if(*(sig+i)=='/') { *(num+i+1)=(*(num+i))/(*(num+i+1)); *(num+i)=0; *(sig+i)='+'; } } for(i=0;*(sig+i)!='\0';i++)//扫描一遍加减运算 { if(*(sig+i)=='+')//执行对应法则计算成果存入后一种数据单元 { *(num+i+1)=(*(num+i))+(*(num+i+1)); *(num+i)=0;//清空前一种数据单元,便于下一种运算 } if(*(sig+i)=='-') { *(num+i+1)=(*(num+i))-(*(num+i+1)); *(num+i)=0; } } printf("计算答案是:%.3f\n",*(num+i));//最后一种数据单元为计算成果}/*******************************主函数**********************************/intmain()//主函数{ inti=0; charcalc_dat[200]={0};//定义一种保存算式的字符数组 charcalc_sig[100]={0};//定义一种保存运算符的字符数组 floatnum_dat[100]={0};//定义一种保存运算数据的数组//字符串解析函数顾客输入算式运算符运算数据 get_dat(calc_dat,num_dat,calc_sig);//运算数据运算符先乘除后加减 data_make(num_dat,calc_sig); return0;}第四题问题描述一、题目:数字游戏玲玲喜欢通过玩数字游戏的方式来加深别人对她的印象。她最喜欢的一种数字游戏是让人给出一种数N,然后她会立刻说出N的阶乘最末尾有多少个持续的零。很显然,这会让别人会对她印象深刻,由于,普通来说N!是一种非常大的数。例如,N为100时,100!会比地球上全部原子的数目还要大,但玲玲能够很快说出100!末尾有持续24个0。但是,她的某些朋友普通不是以10为进制的。这时,玲玲却不懂得该怎么修改她的技巧来适应这些朋友了。问题:给出一种进制b和一种数n,计算当采用b进制时,n!末尾有多少个持续的0。例如,当b=2和n=5时,由于5!=120=1111000(2),成果应当为3.输入:第一行包含了总的计算次数。接下来的每一行给出了不同状况下的问题中的两个数b(2≤b≤1000)和n(1≤n≤1000000),这两个数都是10进制的。输出:输出成果中,对每一次计算都以"Scenario#i:"开始,其中的i是从1开始的第i次计算。然后打印一行,输出:当采用b进制时,n!末尾有多少个持续的0(以十进制形式)。对每一次计算都以一种空白行结束。输入样例:325101004510000对样例的对的输出:Scenario#1:3Scenario#2:24Scenario#3:2498功效描述这个问题是对n!背面有几个0的变种。如果是问n!最后有几个0应当怎么算?必定不是先算出n!是几,然后再数0的。如题目所言,N为100时,100!会比地球上全部原子的数目还要大,那么如何得出我们想要的成果呢?现在我们懂得,5!=120,因此当5!采用十进制表达的时候,5!末尾有一种零。也就是说5!只能被一种10整除!那么同理,当问5!采用二进制表达的时候,5!末尾有几个零,实际就是5!能被多少个2整除,120能被3个2整除,因此末尾就是3个0。例如现在规定12进制时9!末尾有几个0。我们先把12分解质因数,得12=2*2*3,然后再算9!=1*2*3*4*5*6*7*8*9,把这些阶乘逐个分解质因数,算出共有几个2,几个3相乘。显然里面有2+(2+2)+2+(2+2+2)共7个2,有3+3+(3+3)共4个3,又由于12里面有2个2,因此7/2=3.5,一种3,因此4/1=4,显然只能取3,因此9!能被3个12整除,末尾必有3个0。解决方案(流程图)Main函数Main函数主函数result_calc函数对两次的质因数进行计算display函数成果显示data_calcresult_calc函数对两次的质因数进行计算display函数成果显示data_calc函数对阶乘逐次分解质因数factor_calc函数对进制分解质因数scanf函数扫描运算次数和对应的数据重要函数描述1)factor_calc()//对进制进行分解质因数data_calc()//对阶乘逐个进行分解质因数result_calc//对统计的质因数进行比较display()//成果输出重要技术问题该题事实上是求n!能够被多少个对应的进制整除。运用C语言对进制进行分解质因数。运用C语言对阶乘逐个分解质因数。把两个成果进行比较,得出n!至多能被多少个进制整除,则在该进制下,它的末尾就有几个0。结论(实验心得)巧妙的算法很重要。附录:第四题源程序#include<stdio.h>voidfactor_calc(intbase,int*factor,int*factor_num)//计算进制的因数种类和个数{ inti=0,j=0,n=2,flag=0; while(n<=base) { if(base%n==0)//如果整除 { flag=1;//整除标志 base=base/n;//下次用商进行计算 *(factor+i)=n;//统计因数 *(factor_num+i)=++j;//对应次数加一 } else { n++;//除数加一 if(flag==1)//如果上次整除了 { i++;//统计的因数的数组向后移 j=0;//释放j flag=0;//释放flag } } }}voiddata_calc(intdata,int*factor,int*data_factor)//阶乘的因素计算{ inti=0,data_s=0,value=1;//计算n!中各个数所含因数 inttemp=0;//临时值用于存储n的阶乘 for(i=0;*(factor+i)!=0;i++)//因数一种个比较下去 { for(data_s=2;data_s<=data;data_s++)//阶乘一种个计算下去 { temp=data_s; while(temp%(*(factor+i))==0)//如果整除对应计数值就加一 { *(data_factor+i)=value++; temp=temp/(*(factor+i));

温馨提示

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

评论

0/150

提交评论