




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
等中科技火孚课程实验报告课程名称: C语言程序设计实验专业班级: 学号: 姓名: 指导教师: 报告日期: 计算机科学与技术学院1流程控制实验TOC\o"1-5"\h\z\o"CurrentDocument"1.1程序改错 12程序修改替换 错误!未定义书签。\o"CurrentDocument"1.3程序设计 31.4小结 18\o"CurrentDocument"2数组程序设计实验 19\o"CurrentDocument"1程序改错与跟踪调试 19\o"CurrentDocument"2程序完善与修改替换 22\o"CurrentDocument"3程序设计 274小结 52\o"CurrentDocument"3结构与联合实验 54\o"CurrentDocument"1表达式求值的程序验证 54\o"CurrentDocument"2源程序修改替换 56\o"CurrentDocument"3.3程序设计 593.4小结 95\o"CurrentDocument"参考文献 961流程控制实验1.1程序改错/*合数判断器*/#include<stdio.h>intmain(void)(inti,x,k,flag=0;printf("本程序判断合数,请输入大于1的整数,以ctrl+Z结束\n");while(scanf&x)!=EOF)for(i=2,k=x»l;i<=k;i++){if(!x%i) ※※此处应改为if(!(x%i))或改为if(x%i==0)(flag=l;break;)}if(flag=l) ※※此处应改为flag==l,一个“=”表示赋值printf(*%d是合数、n”,x);elseprintf(*%d不是合数\n”,x);※※此处应添加语句flag=0,否则无论是否是合数flag的值始终是1return0;33不是合数44是合数5不是合数66是合数7不是合数88是合数99站合数ZProcessexitedafter12.26secondswithreturnvalue0请接任点健继续...■1.2程序修改替换(1)修改方案:将原实验程序中if语句的break改为k=i;保证了if语句执行后退出循环。(2)修改方案:将for循环改为如下代码:inti=2,k;k=x»l;do{if(!(x%i)){flag=l;break;}i++;}while(i<=k);3C:\U$ef$\20140\Desktop\Operate\_t®l20201104\6/WfS(2.exe - □X33不足合数7878是合数79不是合数103103不是合数234234是合数1414是合数1717不足合数*ZProcessexitedafter28.22secondswithreturnvalue0请按任意健继续...(3)修改方案:定义两个函数,一个函数判断为合数,另一个判断是纯粹合数,并在main函数中调用判断纯粹合数的函数,输出所有的3位纯粹合数。程序代码如下:#include<stdio.h>intNotPrime(intx)〃判断是合数iinti,k,flag=0;for(i=2,k=x»l;i<=k;i++){if(x%i==0){flag=l;break;))returnflag;}〃判断是纯粹合数intpure(intx){intflag=0,count=0;for(intj=0;j<3;++j){if(NotPrime(x))count++;x/=10;
if(count==3)flag=l;returnflag;}intmain(void){intnum=0;printf(〃纯粹合数有\n");for(intx=100;x<=999;++x){if(pure(x)){printf(,z%d\t/z,x);num++;if(num%10==0)printf("\n");}Ireturn0;}4224424.-)4468489602623634646658680692802SM8268488618728859069189309429549649869984204414534664224424.-)4468489602623634646658680692802SM826848861872885906918930942954964986998420441453466488600622633669690801813S258478608718849059179289409529639859968025681246890246802467912450456892345680124578012356894444446666W6888888899999999791457000^578900^56903568012402568923456891245680123568944441446666666888888999999990628506284960929>405466J87980820M55687902142536496081934444446666666888888999999990527L4860839508283952)65>86970719J43546778K)l132435485980»92444444666666688888899999999467924678145668226602346890oo~45890235689014567010^34569444444666666688888899999999356813567034557115590235789o245099023568901456781234568444444666666688888889999999245602456922446004489124668■J02^-5890234689014567802345687444444666666688&88889999999五-F0345903458013358923680135579-hu0245690234689012467802345689-9444444666666688888889999999gProcessexitedafter0.02486secondswithreturnvalue请按任意键继续...1.3程序设计1.计算税金1)解题思路:2)程序源代码:①利用switch语句:#include<stdio.h>intmain(void){intwage,tax,flag=l;while(flag){printf(〃\n请输入工资:\n〃);〃提示输入工资scanf(〃%d〃,&wage);tax=(int)((wage)/1000);//用于计算不同的工资范围switch(tax){case0:printf("您不用交税金!”);break;case1:printf(〃您应交税金:%.3f”,(float)wage*。.05);break;case2:printf(“您应交税金:%.3fz,,(float)wage*0.1);break;case3:printf(〃您应交税金:%.3f/z,(float)wage*0.15);break;case4:printf(“您应交税金:%.3f”,(float)wage*0.2);break;default:printf("您应交税金:%.3f/z,(float)wage*O.25);break;} 〃强制类型转换,输出较为精确的浮点数printf("\n是否需要继续计算?(0orl)\n\n");scanf &flag);〃用于决定是否继续循环的语句}return0;)②利用if语句:#include<stdio.h>intmain(void){intx,y,flag=l;while(flag){printf("\n请输入工资:\n");〃提示输入工资scanf&x);if(x<0)printf("请输入正整数!”);if(x<1000)printf("您不用交税金!”);if(x<2000&&x>=1000)printf("您应交税金:%.3f/z,(float)x*0.05);if(x<3000&&x>=2000)printf("您应交税金:%.3r,(float)x*0.1);if(x<4000&&x>=3000)printf("您应交税金:%.3f,z,(float)x*0.15);if(x<5000&&x>=4000)printf("您应交税金:%.3f(float)x*0.2);if(x>5000)printf("您应交税金:%.3r,(float)x*0.25);
〃强制类型转换,输出较为精确的浮点数printf("\n是否需要继续计算?(0or1)\n\n*);scanf(飞d”,&flag); 〃用于决定是否继续循环的语句return0;3)测试:X[0,1000)[10000,2000)[2000,3000)[3000,4000)[4000,5000)[5000,+8)输入值99911002400345643125679结果不用交税金55.000240.000518.400862.4001419.750图1-1程序设计题1的运行结果.输出满足条件的三位数1)解题思路:2)程序源代码:#include<stdio.h>intmain(void){for(inti=100;i<=999;i++){〃for循环语句确定是三位数intt;t=i*i;if(t%1000==i)〃if判断该数平方末三位是否是该数本身
printf(*%d\nw,i);〃若结果为真,输出该值。return0;3)测试:[1C:\Users\20140\Desktop\Operate\±ei20201104\2.exe376625Processexitedafter0.01501secondsvithreturnvalue0请按任意键继续...图1-2程序设计题2的运行结果.股票收盘价格波动值1)解题思路:2)程序源代码:#include<stdio.h>doubleabs(doublea){if(a<0)a=-a;returna;"/定义绝对值函数intmain(void){doublea,b,max;intday;printf(”请输入天数:\n");scanf(〃%d〃,&day);printf(〃请输入这些天的收盘价格:\n〃);scanf(z,%ir,&b);〃提示输入收盘天数与每天收盘价格for(inti=l;i<day;++i){a=b;scanfC%ir,&b);if(abs(a-b)>max)//if语句将每次的最大波动值赋给maxmax=abs(a-b);)printf(,z%.21f\n",max);〃输出最大波动值return0;3)测试:项目测试输入输出115396.0021.231.782.571.590.983200267.45345.8978.443CAUter$\20l40U)etktop\OperateVt9l2020H04\3.exe — □X这4天最大波动值为6.00是否需要继续计算?(0or1)1清输入天数:-1济城入这些大的收&价格:231.782.571.59这4天最大波动值为0.98是否需要维续计算?(0or1)1谓输入天数:3诂输入这些天的收盘价格:200267.45345.89这3天最大波动值为78.44是否需要继续计尊?(0or1)0(Processexitedafter36.77secondsvithreturnvalue0 图1-3程序设计题3的运行结果.将正文的多个空格用一个代替1)解题思路:2)程序源代码:#include<stdio.h>intmain(void){chara,b;printf(〃请输入一段正文,并以Ctrl+Z结束:\n〃);while((b=getchar())!=EOF){if(!(a=32&&b=32))〃如果前后两个字符均为空格,则只输出一个putchar(b);a二b;〃将后一个字符赋给前一个字符return0;
3)测试:项目测试输入输出1Hust1037Hust10372I love hustIlovehust3XuruidaisahusterXuruidaisahuster3C:\Users\20140\De$ktop\Operate\±9U0201104\4.exe - □XMust1037Hust1037IlovehustIlovehustXuruidaisahusterXuruidaisahusterProcessexitedafter38.27secondswithreturnvalue0请按任意陵继续..・图1-4程序设计题4的运行结果.输出10行杨辉三角1)解题思路:2)程序源代码:Sinclude<stdio.h>intmain(){inti,j,a[100][100];〃定义一个二维数组,代表行和列for(i=0;i<10;++i)a[i][0]=l;〃通过遍历,将第一列的值赋为1for(i=0;i<10;++i)for(j=l;j<10;++j)a[i][j]=(a[i][jT])*(i-j+l)/j;〃应用公式将值存入二维数组中for(i=0;i<10;++i)for(j=i;j<10;++j)printfC");〃打印空格,形成三角格式for(j=0;j<10;++j)if(a[i][j]!=0)printf("4d”,a[i][j]);〃按一个数字占四个字符的域宽输出printf("\n");〃确保换行输出return0;3)输出结果:图1-5程序设计题5的运行结果.输出梅森素数1)解题思路:2)程序源代码:#include<stdio.h>#include<math.h>longisprime(longn)〃定义一个函数判断是素数{intflag=l;for(inti=2;i<=sqrt(n);i++)(if(n%i==0){flag=0;break;)}returnflag;}longisMasonNumber(1ongnum)〃定义一个函数判断是梅森数(intflag=0;if(((num+1)&(num))==0)flag=l;returnflag;}intcount(longx)〃定义一个求某数是2的几次方的函数(intcount=0;inttotal=l;while(total<x)(total=total*2;++count;)if(total==x)returncount;)intmain(void)(longi=2,m;printf("请输入一个长度大于三的长整数:\n");scanf("%d",&m);for(;i<=m;++i)(if(isMasonNumber(i))〃if循环的嵌套,先判断是梅森数,再判断是否为梅森素数if(isprime(i))printf(Z,M(%d)=%ld\n/z,count(i+1),i);〃按示例输出return0;)3)测试:输入一个较大的m可得到结果如图3C:\Users\2O140\Desktop\OperateVttfU0201104\6.exe 一口X12345678W2)=3W3)=7■(5)=31*(7)=127*(13)=819111(17)=13107111(19)=524287Processexitedafter2.18secondswithreturnvalue0力按任。键维续•••■图1-6程序设计题6的运行结果7.筛法构造素数表1)解题思路:2)程序源代码:#include<stdio.h>ttdefinescale100000〃可改变素数表输出范围intmain(){longlongi,j,a[scale],prime[scale];for(a[0]=a[l]=0,i=2;i<scale;i++)
a[i]=l;for(i=2;i<scale;i++){if(a[i]){for(j=i*2;jCscale;j+=i)a[_j]=0;〃筛掉素数的倍数longlongn=0;for(i=2;i<scale;++i)if(a[i]){prime[n]=iif(a[i]){prime[n]=i;++n;〃将表中的下标(素数)存入素数表中longlongm;scanf&m);longlongq=0;for(;prime[q+lkm;q++)〃查找素数表输出李生素数if(prime[q+1]-prime[q]==2)printf(zz(%lld,%lld)\n<z,prime[q],prime[q+1]);return0;}3)测试输出:分别输入m的值为50,150,500可得如图结果:□IC:\Users\20140\Desktop\Operate\_t^L20201104\10.exe50(3,5)(5,7)□IC:\Users\20140\Desktop\Operate\_t^L20201104\10.exe50(3,5)(5,7)(11,13)(17,19)(29,31)(41,43)(3C:\Users\2O140\Desktop\Operate\_ttfl20201104\10.exe15^^(3.5)(5,7)(11.13)(17.19)(29,31)(41,43)(59,61)(71,73)(101,103)(107,109)(137,139)Processexitedafter1.198secondswithreturnvalue0请按任意键继续...■Processexitedafter1.765secondswithreturnvalue0,「急键继续...■BC:\UsefS\20140\Desktop\Operate\JtVl20201104\10.exe・苑困在[4.1000000]之间的值:500(11,13)(17,19)(29.31)(41,43)(59,61)(71,73)(101,103)(107,109)(137,139)(149,151)(179,181)(191,193)(197,199)(227,229)(239,241)(269,271)(281,283)(311,313)(347,349)(419,421)(431,433)(461,463)Processexitedafter1.953secondswithreturnvalue0生拉仃也选小; _图1-7 程序设计题7的运行结果8.输出符合形式的表达式1)解题思路:2)程序源代码:#include<stdio.h>intmain(){intp,i=0,j=O,k=0,A[10],x;longm=0,n=0;scanf&p);for(;n<=98765;n++){x=0;m=n;for(i=4;i>=0;i—){ 〃将被除数各位存在数组中A[i]=m%10;m=m/10;}if((n%p)!=0)continue;else{ 〃当被除数可整除输入的数时,将除数的各位存在数组中m=n/p;for(i=9;i>=5;i-){A[i]=m%10;m=m/10;})for(k=0;k<=8;k++){ 〃嵌套循环,当有重复数字时退出循环for(j=k+l;j<=9;j++){if(A[k]==A[j]){X=1;break;})if(x==l)break;}if(x==O){ 〃循环得到保存在数组中的数字,并按格式输出for(i=0;i<=4;i++)printfA[i]);printf("/");for(i=5;i<=9;i++)printf(V,A[i]);printf(*=%d\n*,p);return0;)3)测试:项目测试输入输出13275168/02349=3222439528/01647=2446872/01953=2436898736/01452=68C1C:\Users\2O140\Desktop诔=1.exe-□X13275168/02349=32Processexitedafter1.401secondswithreturnvalue0请按任怠键维续...13C:\User5\20140\Desktop诔❺名1.exe□1C:\Users\20140\Desktop\^^€1.exe2439528/01647=244687201953=246S98736/01452=68Processexitedafter1.777secondswithreturnvalue0请按任意键继续...Processexitedafter请按任意键继接.・・,1.322secondsvithreturnvalue0图1-8程序设计题8的运行结果1.4小结通过本节有关程序设计中流程控制的程序设计题目,我进一步地练习了如何运用嵌套循环,掌握了用筛法求素数表,但是在按照格式输出结果,算法的实现上尚还欠缺能力。叵t=Ox62feOO-Programming"&=0x62fe10Muage叵t=Ox62feOO-Programming"&=0x62fe10Muageagi=12回j=。[atl^OAOOO'2数组程序设计实验2.1程序改错与跟踪调试(1)单步执行源程序的跟踪调试Qt=Ox62feOO"Programming"@s=0x62fe10"Language"Qis12Qj=o◎姆]=0、000'由调试结果可知,当其进入strcate函数时,字符数组t和s的内容都是正确的。当处在第二个while语句时i=12,但是由于“Programming"的字符个数是11,因此此时应该是在t[l1]的位置,所以i应该减去1;才能顺利完成后续的拼接操作。而当执行到花括号时,发现按预料的一样并未执行正确。因为t[ll]的值也为,\0',所以此时字符数组t的结果就像是没有拼接一样,其实是从W2]开始进行了复制操作。我们添加代码i=i-l;后得到如下结果:我们发现此时s的值输出并不正确。t=0x62fe00"ProgrammingLanguage1s:0x62fe10uage,,is11血j=0@中]=0、000'3voidstrdeIc(char(](char);4intmain(void)5E316chara[]«MLanguage".b[]«7printf(*%«%s\n".b.a);•8•9B str■ str陲10return0;11L)1213voidstrcate(chart(].char(14E15inti■0,j■0;16whiIe(t(i*♦]);17i■i-1;18whiIe((t[i+♦]■s[j+♦])I♦9■ I2021void$trdelc(chars[].char(22E3(23intj.k;24for(j-k-O;s(jJ!-*\O':j25if(s[j]I«c)s【kp=s[j];26L)#incIude<stdio.h>2voidstrcate(char[ ],char[(2)跟踪进入strdelc函数s=0x62fe00^ProgrammingLanguage"回k=026L)我们看到,初始进入函数时值是正确的,然而最终得到的结果却是ProgrmmingLngugeage,正确结果是ProgrmmingLnguge,可见数组末尾多了"age”三个字符。这是由于数组本该在s[k]处终止,因此,要将其值赋为'\0'。最后得到结果如图:13C:\Users\20140\Desktop\Operate\C语音上机客赛\第五次上机20201119\程序改播与跟踪调试.exe - □ProgrammingLanguageProgrammingLanguageLanguageProgmnningLnguge最终代码修改方案如下:#include<stdio.h>voidstrcate(char[],char[]);voidstrdelc(char[],char);intmain(void)(chara口=“Language”,b口="Programming”;printf(〃%s%s\n,z,b,a);strcate(b,a);printf(z,%s%s\nz,,b,a);strdelc(b,'a');printf(〃%s\n〃,b);return0;voidstrcate(chart[],chars[])(inti=0,j=0;while(t[i++]);此处添加代码i=i-l;while((t[i++]=s[j++])!='\0');}voidstrdelc(chars[],charc)intj,k;for(j=k=0;s[j]!=\0";j++)if(s[j]!=c)s[k++]=s[j];此处添加代码s[k]=,\0';)2程序完善与修改替换(1)文本去重①完善后代码:include<stdio.h>include<string.h>voidRemoveDuplicate(char*s);intmain(){charstr[200];printf("Inputstrings,endofCtrl+z\n〃);while(fgets(str,200,stdin)!=NULL){RemoveDuplicate(str);printfstr);)return0;)voidRemoveDuplicate(char*s){intr,w,i,len;len=strlen(s);for(r=w=0;r<1en;r++){if(s[r]) {s[w++]=s[r];for(i=r+l;i<len;i++){if(s[i]==s[r])s[i]='\0';s[w]-\0*;运行结果如下:BC:\Users\20140\Desktop\Operate\C语音上机回8\»五次上机20201119展序亢普和修改*1J.exe - □XInputstrings,endofCtrl+z12eerer12erhusthust666!!hust6!*ZProcessexitedafter28.54secondsvithreturnvalue0请按任应椎纳撅...■②空间换时间提高效率:include<stdio.h>include<string.h>voidRemoveDuplicate(char*s);intmain(){charstr[200];printf("Inputstrings,endofCtrl+z\n〃);while(fgets(str,200,stdin)!=NULL){RemoveDuplicate(str);printfstr);)return0;)voidRemoveDuplicate(char*s){inti,j,len,remainder;intcheck[8]={0};len=strlen(s);for(i=j=0;i<len;i++) {remainder=s[i]%32;if((check[s[i]»5]&(1<<remainder))==0)s[j++]=s[i];check[s[i]»5]|=(1«remainder);s[j]=>\0';)运行后截图:□IC:\Users\20140\Desktop\Operate\CS8±m^tt\B£^Lt9U0201112.exe 一口XInputstrings,endofCtrl+z12eerer12erhusthust888!!!hust8!prosr&iHDingprogaainZProcessexitedafter33.19secondsvithreturnvalue0请按任意键继续...(2)约瑟夫问题①完善代码:include<stdio.h>include<string.h>intmain(void)(intM,N;scanf(%d%d”,&M,&N);inta[M],b[M];inti,j,k;for(i=0;i<M;i++)a[i]=i+l;for(i=M,j=0;i>l;i-)(for(k=l;k<=N;k++)if(++j>i-l)j=0;b[M-i]=(j?a[j-l]:a[i-l]);if(j)for(k=-j;k<i;k++)a[k]=a[k+l];)for(i=0;i<M-l;i++)printf(*%d\n*,b[i]);printf(*%d*,a[0]);return0;I运行截图如下BC:\Users\20140\Desktop\OperateVt;ffl^\Sfi;>Ltyi20201119\的完善和修改共2.1.exe00J49Processexitedafter2.229secondswithreturnvalue0请按任意键继续...EC:\Users\20140\Desktop\OperateVt贩圆便五牡912020111和修改费奂2.1.exe135759Processexitedafter7.162secondswithreturnvalue0请按任意键继续...②提高效率:#include<stdio.h>intmain()(intj,m,i=0;scanf(',%d%d,,,&j,&m);intchecklj];for(;i<j;i++)check[i]=0;intk=0,count=l,n=j;for(i=0;n>=1;)(if(m==count)k=i%j;check[k]=l;n-Scount=0;〃此时遍历下标还在出列元素,而下一个元素才是从1开始报数,〃故此处将count置为0,当下标i遍历至下一个未出列元素时count再加1)i++;if(check[i%j]!=l)count++;)printf("%d\n",k+l);)运行截图如下2000004147451Processexitedafter3.576secondswithreturnvalue0请按任意键继续.•.100434Processexitedafter3.826secondswithreturnvalue0请按任意键继续...3程序设计.输出二进制1)解题思路:2)源代码:#include<stdio.h>#include<math.h>#include<string.h>intmain(void){intm,n,flag,count=0;scanf("%d〃,&m);inta[50];if(m>=0)n=m;〃判断正负,如果是正数不变,如果是负数则根据二进制原理加上相应值Elsen=m+(int)pow(2,32)+1;for(intj=0;j<32;j++){〃采用除二取余法依次将二进制从低位到高位存入数组flag=n%2;n=(int)(n/2);count++;a[j]=flag;}if(m<0)a[31]=l;〃如果小于零,则把符号位置为1for(intj=count-l;j>=0;j—){ 〃从高位到低位输出二进制if(j!=0&&(j+l)%4==0&&(j+l)!=32)printf("");〃实现按格式输出printfa[j]);Jprintf("\n");return0;3)测试:项目测试输入输出10000000000000000000000000000000002-111111111111111111111111111111111312300000000000000000000000001111011000000000000000000000000000000000Processexitedafter0.8367secondswithreturnvalue0清按任意键继续...-1mimimimimi111111111111Processexitedafter1.809secondswithreturnvalue0请按任意键继续...
\T2200000000000000000000000001111011Processexitedafter0.8412secondswithreturnvalue0请按任意键继续・・・图2-1程序设计题1的运行结果2.将成绩与对应姓名进行排序1)解题思路:2)源代码:#include<stdio.h>〃声明冒泡排序函数voidbubble_sort(chara[][10],intb[],ints);intmain(void){intflag=l;intscore[1000];intnumber;charname[1000][10];while(flag!=0) {〃使用while函数实现多次输入指令scanf(,z%dz,,&flag);if(flag==l){scanf,&number);for(inti=0;i<number;i++){〃当flag的值为1时,提示输入姓名与成绩scanf(z/%s,z,&name[i]);scanf&score[i]);1:lif(flag==2)〃值为2时,进行排序但并不输出bubble_sort(name,score,number);if(flag=3){〃值为3时,进行输出for(inti=0;i<number;i++){printfC%szz,name[i]);printf(〃%d\n”,score[i]);}})return0;)voidbubble_sort(chara[][10],intb[],ints){inti,j,t;charm[1000][10];for(i=0;i<s-l;i++) {for(j=0;j<s-i-l;j++){if(b[j]<b[j+l]){t=b[j],b[j]=b[j+l],b[j+l]=t;for(intk=0;k<10;k++){〃在冒泡排序成绩时,同时对成绩对应的姓名进行交换操作m[j][k]=a[j][k];a[j][k]=a[j+l][k];a[j+l][k]=m[j][k]:}.)if(b[j]==b[j+l]){〃如果成绩相等,那么就比较姓名首字母,若仍相同比较下一个字母,以此类推进行排序for(inti=0;i<4;i++){if(a[j][i]>a[j+l][i]){for(intk=0;k<10;k++){m[j][k]=a[j][k]:a[j][k]=a[j+l][k];a[j+l][k]=m[j][k];)break;)if(a[j][i]==a[j+l][i])continue;〃当首字母相同时,继续下一个循环elsebreak;
3)测试:项目测试输入输出(换行符在输出截图中展示)113a90b70c8530a90b70c85214ming80jerry89hong80angel87230jerry89angel87hong80ming80314xhong80jerry89xming80angel87230jerry89angel87xhong80xming8013a90b70c853a90b70c850Processexitedafter22.75secondswithreturnvalue0请按任意键继续...■8089808797978800v»IXressr8nnenoiProcessexitedafter5.139secondswithreturnvalue0请按任意键继续.•.14xhong80jerry89xming80angel8723jerry89angel87xhong80xming800Processexitedafter0.7989secondswithreturnvalue0请按任意键继续.•・■图2-2程序设计题2的运行结果3.对第2题增加查找功能1)解题思路:只需在第二题的基础上添加功能按键4,,查找功能的流程图如下2)源代码:以下只在功能按键4处添加注释#include<stdio.h>#include<string.h>voidbubble_sort(chara[][10],intb[],ints);intsearch(intscored,intcheck,intnumber);intmain(void)(intflag=l;intscore[1000];intnumber;charname[1000][10];while(flag!=0){scanf(〃%d”,&flag);if(flag=l)(scanf&number);for(inti=0;i<number;i++)(scanf(zz%s,z,&name[i]);scanf(zz%d,z,&score[i]);I}if(flag==2)bubble_sort(name,score,number);if(flag=3)(for(inti=0;i<number;i++)printf(〃牺”,name[i]);printf("%d\n",score[i]);if(flag=4)intcheck;scanf("%d”,&check);inti=0,j=number-1,flag=0,k,result[10],p,q;while(i<=j){〃二分查找k=(i+j)/2;if(check>score[k])j=k-l;elseif(check<score[k])i=k+l;else{〃当找到第一个满足的值时,向前向后继续寻找满足条件的值q=P=k;while(score[-p]==check);while(score[++q]==check);flag=l;break;if(flag==0)printf(z,notfound");//flag==0,也即没有找到该成绩elsefor(intj=p+l;j<q;j++){〃下面比较名字的字母顺序,并将字母顺序靠前的姓名通过交换数组来移动for(inti=0;i<4&&j<q-l;i++)if(name[j][i]>name[j+l][i])(printf("enter!\n〃);charm[20];strcpy(m,name[j]);strcpy(name[j],name[j+1]);strcpy(name[j+1],m);break;)elsebreak;I〃输出符合条件的成绩和姓名printf(z,%s%d\n〃,name[j],score[j]);II))return0;)voidbubble_sort(chara[][10],intb[],ints)(inti,j,t;charm[1000][10];for(i=0;i<s-l;i++)(for(j=0;j<s-i-l;j++)t=b[j],b[j]=b[j+l],b[j+l]=t;for(intk=0;k<10;k++){m[j][k]=a[j][k];a[j][k]=a[j+l][k];a[j+l][k]=m[j][k]:}.}if(b[j]==b[j+l])(for(inti=0;i<4;i++)(if(a[j][i]>a[j+l][i])(for(intk=0;k<10;k++)(m[j][k]=a[j][k];a[j][k]=a[j+l][k];a[j+l][k]=m[j][k];)break;)elseif(a[j][i]==a[j+l][i])continue;elsebreak;3)测试:项目测试输入输出113a90b70c8524850c85214ming80jerry89hong80angel8724800hong80ming80314xhong80jerry89xming80angel8724800xhong80xming80S3C:\Users\20140\Desktop\Operate\±tn^S\85Z;X±^l20201119\3.exea90b70c8585 MMMMc85 HHMHMClC:\Users\20140\Desktop\OperateVt^l^\S5;X±^l20201119\3.exe14ming80jerry89hong80angel8780hong80ming800□IC:\Users\20140\Desktop\OperateVtVl^\a5fi;X±^l20201119\3.exe14xhong80jerry89xming80angel87p80xhong80xming800图2-3程序设计题3的运行结果
5,编写插入字符串函数1)解题思路:2)代码:#include<stdio.h>〃声明函数voidcodel(chart[],charmid[],intn);voidstrcate(chartL],chars[]);voidstrains(chart[],chars[],intn);intmain(void){chart[100],s[100];intn;scanf("%s%s%d〃,t,s,&n);strnins(t,s,n);voidcodel(chart[],charmid[],intn){〃将数组t自第n个字符后的字符复制到中间数组中,并将数组t的后半部分删除inti=0,k=n;for(;t[k]!=,\0';i++,k++)mid[i]=t[k];mid[i]=,\0';t[n]=\0,;)voidstrcate(chart[],chars[]){〃将一个字符串拼接到另一个字符串后inti=0,j=0,k=-l;while(t[i++]); i―;while((t[i++]=s[j++])!='\0');}voidstrnins(chart[],chars[],intn){〃调用以上两个函数,实现插入字符串功能,charmid[100];codel(t,mid,n);strcate(t,s);strcate(t,mid);}3)测试项目测试输入(依次为t,s,n)输出1iyoulove1iloveyou2lifewonderful_0wonderful_life3xudarui2xuruidalyoulove1iloveyouProcessexitedafter8.217secondswithreturnvalue0请按任意键继续・・・ lifewonderful_0wonderful」ifeProcessexitedafter10.18secondswithreturnvalue0请按任意键继续...xudarui2xuruidaProcessexitedafter6.52secondswithreturnvalue0请按任意键继续..・图2-4程序设计题5的运行结果6.消除类游戏1)解题思路2)代码:#include<stdio.h>intmain(void){intline,raw,count=l,flag=0;scanf("%d%d”,&line,&raw);intchess[100][100];intcheck[100][100]={0};〃定义一个检查数组check,初始化为0,以实现当出现可消除的数字时将对应check数组的值置为1,从而得以消除intj=0,k=0;〃将棋盘存入数组中for(inti=0;i<line;i++){for(intj=0;j<raw;j++)scanf("%d〃,&chess[i][j]);I〃行遍历,当出现三个以上连续相同的数字时用循环将check数组对应的值置为1for(inti=0;i<line;i++){count=l;flag=chess[i][0];for(j=l;j<=raw;j++){if(flag==chess[i][j])count++;else{if(count>=3){while(count){check[i][j-count]=l;count―;))count=l;flag=chess[i][j];〃列遍历,当出现三个以上连续相同的数字时用循环将check数组对应的值置为1for(inti=0;i<raw;i++){flag=chess[0][i];count=l;for(j=l;j<=line;j++){if(flag==chess[j][i])count++;else{if(count>=3){while(count){check[j-count][i]=l;count―;}count=1;flag=chess[j][i];printf('\n\n");〃格式化输出一一当check的值为1时输出0,否则输出棋盘中数字for(inti=0;i<line;i++){for(intj=0;j<raw;j++){if(check[i][j]==D{printf("0");if(j<raw-l)printf("");else{printfchess[i][j]);
if(j<raw-l)printfC*");printf(〃\n");return0;3)测试项目测试输入输出1443144430431111300004341243402442224400022333999200000041115524000552334566634000023566723060718596818090848577708000043527803020845437805430843143111143412442220000Processexitedafter3.631secondswithreturnvalue0请按任意键继续...
2723339994111552Processexitedafter9.225secondswithreturnvalue0请按任意键继续..・63214443210006321444321000Processexitedafter4.851secondswithreturnvalue0请按任意键继续...图2-5程序设计题6的运行结果10.n阶顺转方阵1)解题思路分析如何存入效组:当向右输出时e不变列增加;向下输出时^增加列不兖;向左脸出时行不变列3;当向上输出时行题少列增加;并且当做完这四个动作后方阵变小,对应循环终止值要减小按咯式输出敕组,开决定何时换行结束2)代码#include<stdio.h>intmain(){inti,j,m,base=l,n;inta[10]E1O]={1};scanf&n);for(m=0;m<n/2;m++){〃当做完这四个动作后方阵变小,对应循环终止值要减小for(i=m;i<=n-l-m;i++)〃当向右输出时行不变列增加a[m][i]=base++;for(j=m+l;j++)〃向下输出时行增加列不变a[j][n-l-m]=base++;for(i=n-l-m;i>m;i-)〃向左输出时行不变列减少a[n-l-m][i]=base++;for(j=n-l-m;j>m;j-)〃当向上输出时行减少列增加a[j][m]=base++;if(n%2==l)〃到最后一个值时若行数为奇数要单独输出a[(n-l)/2][(n-l)/2]=base;Ifor(i=0;i<n;i++){for(j=0;j<n;j++){printf(〃%2d〃,a[i][j]);if(j!=(n-l))printf(z,");
return0;3)测试(为方便检验,按对齐格式输出)456745673458236911oProcessexitedafter0.4249secondswithreturnvalue0请按任意键继续Processexitedafter0.4249secondswithreturnvalue0请按任意键继续...123416171819152425201423222113121110Processexitedafter0.5162Processexitedafter0.5162请按任意键继续..•secondswithreturnvalue0612 3 4 5612 3 4 5 62021 22 23 24 71932 33 34 25 81831 36 35 26 91730 29 28 27 101615 14 13 12 11Processexitedafter0.4998secondswithreturnvalue0请按任意键继续...图2-6程序设计题10的运行结果11.迷宫问题1)解题思路:开始2)代码:#include<stdio.h>definephix+moveX[i]>=0ttdefineph2x+moveX[i]<position_xdefineph3y+moveY[i]>=0defineph4y+moveY[i]<position_ydefineph5road[x+moveX[i]][y+moveY[i]]==0defineph6map[x+moveX[i]][y+moveY[i]]==lttdefineph7road[x+moveX[i]][y+moveY[i]]=ldefineph8search(x+moveX[i],y+moveY[i])defineph9road[x+moveX[i]][y+moveY[i]]=0〃宏定义运算表达式intmap[20][20]={};introad[20][20]={};voidsearch(int,int);intmoveX[4]={l,0,0,-1};intmoveY[4]={0,1,-1,0);〃定义在x和y方向的移动动作,即二者结合可以进行四个方向的移动,从而可以搜寻四个方向的路径intposition_x,position_y,num=0;〃定义当前的位置和路径序号intmain(){scanf(z,%d%d,z,&position_x,&position_y);inti,j;for(i=0;i<position_x;i++){for(j=0;j<position_y;j++)scanf&map[i][j]);"/将迷宫图存入数组中search(0,0);〃调用迷宫进行查找路径return0;)voidsearch(intx,inty){inti,j;if(x==position_x-1&&y==position_y-1){〃当已经查找到迷宫右下角时,输出已经查找到的路径num++;〃标记已经找到的路径序号printf(级d\n”,num);for(i=0;i<position_x;i++){for(j=0;j<position_y;j++){//输出已经存储在road中的路径printf("%d”,road[i][j]);if(j<position_y-l)printfC");}printf("\n");}return;〃输出完成后进行下一次查找路径}else{road[0][0]=1;for(i=0;i<4;i++){if(phl&&ph2&&ph3&&ph4&&ph5&&ph6){〃当迷宫地图上下一步是1,即可以走并满足不与己找到的路径重复时时继续执行ph7;〃标记自己已经走过的迷宫格为1ph8;〃递归进行下一步查找ph9;3)测试:(直接在截图中展示,为方便观测,添加了分隔符)10000000001011011110111001101010011100101111011110000000001111000000000100000000010000000001001110000111101111000000000111000000000TOC\o"1-5"\h\z1 0 0 0 0 0 1 1 1 01 0 0 0 0 1 1 0 1 01 0 0 1 1 1 0 0 1 01 1 1 1 0 0 0 0 1 00000000011310000000001 0 0 0 0 1 1 1 1 01 0 0 0 0 1 0 0 1 01 0 0 1 1 1 0 0 1 01 1 1 1 0 0 0 0 1 00000000011Processexitedafter2.896secondswithreturnvalue0请按任意键继续.•.・00000011001011001110001110001000100011Processexitedafter6.095secondswithreturnvalue0请按任意键继续....图2-7程序设计题11的运行结果4小结通过本节对数组的问题的解决,我意识到了自己对于算法改进方面的不足。在程序调试中,我一直对数组s的内容明明没有被改变,但是在调试时却一直有数组内容被修改的问题感到困惑不解,在对观察变量的下标范围进行改变后,才意识到问题所在。在程序修改替换一题中,标记数组法是降低算法时间复杂度的重要方法。尽管在处理文本去重的改进中较为顺利,但是在约瑟夫问题中却遇到了困难,由于一开始对约瑟夫问题的算法没有理解透彻,以致于我在标记数组后的下一步循环报数过程中处理得不顺利。在程序设计中,我在位运算方面掌握能力的欠缺导致处理二进制输出这一题时的处理方法不够高级。而针对成绩输入与查找方面,我认为在把相同成绩的人的名字按顺序输出这方面耗费了大量的编程时间。最终,通过添加了一行代码才解决了始终无法交换成绩相同的人的名字的代码中的漏洞。消除类游戏让我建立了利用标记数组法解决问题的观念。在最初写代码时,由于需要进行行遍历和列遍历来进行消除,导致在进行行遍历后列遍历无法正常进行。因为此时原来的游戏棋盘已经被改变。而解决这一问题的有效手段便是另外定义一个检查数组,通过标记对应元素的方法实现消除功能。N阶顺转方阵在掌握算法后并不难以解决。而在最后一题一一迷宫问题中,在开始时我已经有了向各个方向查找,存储路径的想法,但是却忽略了当路走不通时回溯和路径重复的问题,导致写代码时总是无法正确输出结果。最后在查找相关的迷宫问题算法后才得到了解决,同时又借鉴了其将查找功能封装为函数和递归的算法。总之在这次实践中,我掌握了标记数组法,空间换时间等方法,但在递归,封装函数,调试查找漏洞,确定算法上还尚待提高。3结构与联合实验1表达式求值的程序验证1)分析表达式求值过程:首先,和优先级最高,左结合,“一”优先级次之,右结合。同时,先计算括号中表达式。第一问,指针自增后指向结构数组中的第二个元素,故(++p)->x=100;第二问,指针自增后指向结构数组中的第二个元素,故p->c='B';第三问,指针自增后指向结构数组中的第二个元素也即数组v,而p-〉t是指向了数组V的第一个元素,故*p-〉t为X;第四问,指针自增后指向结构数组中的第二个元素,而p->t是指向了数组V的第一个元素,故*p->t为X;第五问,指针指向了第一个元素的数组U的第一个元素,接着自增指向数组U中的第二个元素也就是字符'V';第六问,指针指向第一个元素中的数组U的第一个元素,*p->t的结果是U,然后自增得到V。2)编程代码:#include<stdio.h>charu□="UVWXYZ",v口="xyz";structTIintx;charc;char*t;}a[]={{ll,'A',u},{100,'B',v}},*p=a;intmain(void)intflag=0;scanf &flag);if(flag=l)printf (++p)->x);elseif(flag=2)printf(p++,p->c));elseif(flag==3)printf("%c〃,(*p++->t,*p->t));elseif(flag==4)printf(zz%c,,»*(++p)->t);elseif(flag=5)printf*++p->t);elseif(flag==6)printf(,z%cz/,++(*p->t));return0;)3)截图验证□IC:\Users\2O140\Desktop\Operate\±蜘验\7第七牡振0201222\期期正.exe1100Processexitedafter0.5224secondswithreturnvalue0请按任意键继续...[3C:\Users\20140\Desktop\Operate\±tn^验\7第七①^120201222\的蜀正.exe3rocessexitedafter0.3654secondswithreturnvalue0请按任意键继续...□iC:\Users\20140\Desktop\Operate\Jt^l^^\7§5±;;X±Vl20201222\gJy^iiE.exeJKProcessexitedafter0.4984secondswithreturnvalue0请按任意键继续...[1C:\Users\20140\Desktop\Operate\Jz■验\7第七5ct股0201222\助^ffi.exe4xProcessexitedafter1.08secondswithreturnvalue0请按任意键继续...dC:\Users\20140\Desktop\OperateVt^j£^\7S5-t^±fl20201222\影蟋正.exe5Processexitedafter0.5008secondswithreturnvalue0请按任意键继续...3C:\Users\20140\Desktop\OperateUzyU^\7^-b^LtVl20201222\g^^iiE.exe3roeessexitedafter1.336secondswithreturnvalue0请按任意键继续...2源程序修改替换1)代码修改与截图验证:#include<stdio.h>#include<stdlib.h>structs_listIintdata;structs_list*next;);voidcreate_list(structs_list*headp,int*p);〃此处改为voidcreate_list(structs_list**headp,int*p);intmain(void)(structs_list*head=NULL,*p;ints[100];for(inti=0;;i++)(scanf &s[i]);〃此处根据测试需求改为输入数据if(s[i]==0)break;)create_list(head,s);〃此处改为createlist(Ahead,s);p=head;while(p)printfp->data);p=p->next;)printf('\n");return0;)voidcreate_list(structs_listCC:\Users\20140\De$lrtop\Operate\±ei5E4ft\7fl|-t;XJteU020136920CC:\Users\20140\De$lrtop\Operate\±ei5E4ft\7fl|-t;XJteU0201369203 6 9 2rocessexitedafter5.564secondsvithreturnvalue0育按任意键继续...{ 〃此处改为structs_list2)代码替换(后进先出)2)代码替换(后进先出)#include<stdio.h>structs_list*loc_head=NULL,*tail;if(p[0]==0);else{loc_head=(structs_list*)malloc(sizeof(structs_list));loc_head->data=*p++;tail=loc_head;while(*p){tail->next=(structs_list*)malloc(sizeof(structs_list));tail=tail->next;tail->data=*p++;}tail->next=NULL;)*headp=1oc_head;#include<stdlib.h>structs_listtintdata;structs_list*next;);voidcreate_list(structs_list**headp,int*p);intmain(void)(structs_list*head=NULL,*p;ints[100];for(inti=0;;i++){scanf&s[i]);if(s[i]==0)break;)create_list(&
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 公共数据授权运营法律机制研究
- 夏季健康饮食指南
- 护理教育学教案
- 天天来刷牙健康教案课件
- 人事操作流程规范化管理
- 颐和园介绍英文介绍课件
- 婴儿出院护理常规
- 超声医生岗位竞聘
- 药房调剂差错培训
- 音标课件与美术作品对小学生的教
- 安保工作月度总结
- 开业美容项目活动方案
- 2025年技术玻璃制品行业市场调研报告
- 2025至2030高纯氯化钾行业产业运行态势及投资规划深度研究报告
- 2025年吉林省中考数学试卷真题(含答案详解)
- 2025年中国自由锻件行业发展运行现状及投资潜力预测报告
- 医学美容技术专业教学标准(高等职业教育专科)2025修订
- QGDW11970.7-2023输变电工程水土保持技术规程第7部分水土保持设施质量检验及评定
- 变电站创优工程汇报
- 党课课件含讲稿:以作风建设新成效激发干事创业新作为
- 2025年度职业技能鉴定国家题库维修电工高级技师复习题库及答案(完整版)
评论
0/150
提交评论