程序设计基础作业与实验参考答案_第1页
程序设计基础作业与实验参考答案_第2页
程序设计基础作业与实验参考答案_第3页
程序设计基础作业与实验参考答案_第4页
程序设计基础作业与实验参考答案_第5页
已阅读5页,还剩95页未读 继续免费阅读

下载本文档

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

文档简介

程序设计基础

实验与习题参考答案

(最终版)2016年12月14日注:未经全面测试,仅供参考,发现错误,请及时修正!目录TOC\o"1-5"\h\z\o"CurrentDocument"第二章 1\o"CurrentDocument"第三章 3\o"CurrentDocument"第四章 7\o"CurrentDocument"第五章 16第六章 22\o"CurrentDocument"第七章 46\o"CurrentDocument"第八章 71\o"CurrentDocument"第九章 83\o"CurrentDocument"第十章 85\o"CurrentDocument"第十一章 91\o"CurrentDocument"第十二章 97\o"CurrentDocument"第十三章 99第二章用赋值表达式表示下列计算。注意整数除法,改善为1.0*x(1)y=xa+bC(2)x=(In(1)y=xa+bC(2)x=(Inyla+d2-e26)512(3)sinX FaX成cos——2(4)R= (4)11 1-+一+-R\ R? &(5)(2x)2y=pow(x,(a+pow(b,c)))x=pow(log(sqrt(a+d*d))-exp(26),5.0/2.0)y=sin(X)/(a*X)+fabs(cos(3.14159265*X/2.0))R=1.0/(1.0/R1+1.0/R2+1.0/R3)y=x/(1+x/(3+(2*x*2*x)/(5+pow(2*x,3)/(7+4*x*4*x))))编程序,输入一个字符,然后顺序输出该字符的前驱字符、该字符本身、它的后继字符。#include'*stdio.hnvoidmain()(charcln;scanf(H%c'\&cln);if(cln>33&&cln<126)(printf("%c,%c,%c\n,,,cln-1,cln,cln+1);)else(printf("三个字符不都是可显示字符\n");2.6编写程序,输入两个整数,分别求它们的和、差、积、商、余数并输出include,,stdio.hnvoidmain()(inta,b;intHe,Cha,Ji;intYu;floatShang;printf(M\nInputTwoIntTypeNumber:\nM);scanf(n%d%dH,&a,&b);He=a+b;Cha=a-b;Ji=a*b;Yu=a%b;Shang=float(a)/float(b);printf(MResultIs:%d,%d,%d,%f,%d\n'\He,Cha,Ji,Shang,Yu);}2.9已知摄氏温度(C)与华氏温度(下)的转换关系是:C=|(F-32)编写一个摄氏温度(t)与华氏温度(下)进行转换的程序,输入摄氏温度,输出华氏温度。#includenstdio.hnvoidmain()(floatC,F;printf("请输入摄氏温度:\nH);scanf(u%f;&C);F=9.0*C/5+32;printf(MF=%AnM,F);第三章编写程序,输入一个字母,若其为小写,将其转换成相应的大写字母,然后输出。#include”sldio.h”voidmain()(charcl,c2;printf("请输入一个字母:\nM);cl=getchar();if((cl>=,a')&&(cl<='z,))〃注意这个判断的形式,直接用字符进行判断{c2=cl-32;printf("%c\n”,c2);)elseif((cl>=A)&&(clv=Z))〃考虑问题要全面,如果输入的是大写字母就直接输出。printf(M%c\nM,cl);elseprintf("输入的不是字母!\n");)编写程序,判断给定的3位数是否为Armstrong数,Armstrong数是指其值等于它本身每位数字立方和的数,如153就是一个Armstrong数。153=13+53+33#include<stdio.h>voidmain(void)(intInData;inta,b,c;printf(MInputaNumber:");scanf(*'%dM,&InData);a=InData/100;b=(InData-l00*a)/l0;c=InData%10;if(InData==a*a*a+b*b*b4-c*c*c)printf("%d是Armstrong数\n”,InData);elseprintf("%d不是Armstrong数\n",InData);)编写程序,读入一个点的坐标X,Y,计算InX+lnK当X、y在第一象限sinX+cosY当X、y在第二象限乙一<e2x+e3y当X、y在第三象限tan(x+y)当X、y在第四象限#includeMstdio.hn#includenmath.hnvoidmain()(floatx,y,z;printf("输入两个数)scanf(H%f%f',&x,&y);if(x>()&&y>0)//x,y轴上的点不属于任何一个象限printf("%f\n",log(x)+log(y));if(x<0&&y>0)printf("%f\n”,sin(x)+sin(y));if(x<0&&y<0)printf(M%f\nM,exp(2*x)+exp(3*y));if(x>0&&y<0)printf(M%f\nM,tan(x+y));)编程序,输入一个整数,判断它能否被3、5、7整除,并输出如下信息。(1)能同时被3、5、7整除;(2)能同时被两个数整除,并指明是被哪两个数整除;(3)能被一个数整除,并指明是哪个数;(4)不能被所有3个数整除。#include"stdio.h"voidmain()(intn;inta,b,c;printf("pleaseinputn:");scanf(,"%d",&n);a=b=c=0;if(n%3==0)a=l;if(n%5==0)b=l;if(n%7==0)c=l;switch(a+b+c)(case3:printf(M3,5,7n);break;case2:if(a==O)prinlf(“5,7”);if(b==O)printf(H3,7M);if(c==O)printf(,,3,5,');break;case1:if(a==l)printf(nonly3n);if(b==l)printf(Honly5M);if(c==1)printf(Honly7n);break;default:printf(nnevercanbe!M);3.20编程序,当输入数值月份时,显示相应英文月份名称。例如当输入1时输出January,当输入5时输出May,等等。参考答案:#includeHstdio.hMvoidmain(){intx;printf(MPleaseinputthenumber:**);scanf(M%dM,&x);switch(x){case1:printf(nJAN\nn);break;case2:printf(nFEB\nH);break;case3:printf("MAR\nM);break;case4:printf(nAPR\nH);break;case5:printf("MAY\n”);break;case6:printf(MJUN\nH);break;case7:printf(,,JUL\nM);break;case8:printf(,,AUG\nn);break;case9:printf(MSEP\nM);break;case10:printf(MOCT\nn);break;case11:printf(nNOV\nH);break;case12:printf(nDEC\nn);break;default:printf("Wrongnumber!\nn);)第四章4.3利用展开式计算ex,到第100项;到余项小于10-8(考虑当0<x<l;x<0;x>l时各应该如何计算)。#include<stdio.h>voidmain(void){inti;floatp=1.0,sum=1.0,x;printf("输入x的值\n");scanf(n%f,,&x);for(i=l;i<=100;i++){p=p*x/i;sum+=p;}printf("到第100项的结果为:%f\n”,sum);)到余项小于10-8#include<stdio.h>#defineesp1e-8voidmain(void){inti;floatp=1.0,sum=1.0,x;printf("输入x的值\n”);scanf(n%r,&x);for(i=l;fabs(p)>=esp;i++){〃要先判断出它是递增的还是递减的p=p*x/i;sum+=p;}printf(”到余项小于10-8的结果为:%l\n”,sum);)4.13编写程序,打印所有小于100的可以被11整除的自然数。#includeMstdio.hHvoidmain()inti=0,n=100;fdr(i=1;i<100;i++)4.16编写程序,打印所有3位的Armstrong数。Armstrong数是指其值等于它本身每位数字立方和的数,如153就是一个Armstrong数。153=13+53+33#include<stdio.h>voidmain(void)(inta,b,c,k=100;while(k<999)〃直接限制成三位数,四位数五位数都可以同理参考。(a=k/100;b=(k-100*a)/10;c=k%10;if(k==a*a*a+b*b*b+c*c*c)printf("结果是:%d\n”,k);k++;4.19编程序,打印下图形式的数字金字塔。11211232112343211234543211234567890987654321参考答案:#include"stdio.h"voidmain()(inti,j,k,l;for(i=l;i<=10;i++)(forO=l;j<=10・i;j++)〃打印空格printf(n”);for(k=l;k<=i;k++){if(k==10) //或者是printf(',%2d',,k%10)printf(n%2dM,k-10);elseprintf(',%2d,;k);}for(l=i-l;l>O;l-)printf(n%2dn,l);printf(,,\nn);4.20斐波纳契序列问题。有一对小兔子,出生一个月后变成大兔子开始怀孕;两个月后,生出一对小兔子,这时共有两对兔子(一对大兔子,一对小兔子),同时大兔子又再次怀孕;三个月后,以前出生的小兔子变成大兔子,以前怀孕的大兔子又生出一对小兔子,这时共有三对兔子(两对大兔子,一对小兔子),所有大兔子又全部怀孕;四个月后,以前出生的小兔子变成大兔子,以前怀孕的大兔子又各生出一对小兔子,这时共有五对兔子(三对大兔子,两对小兔子),所有大兔子又全部怀孕;五个月后,以前出生的小兔子变成大兔子,以前怀孕的大兔子又各生出一对小兔子,这时共有八对兔子(五对大兔子,三对小兔子),所有大兔子又全部怀孕;假设在兔子的生养过程中没有死亡。编程序,输入n,计算n个月后,有多少对兔子,并输出。参考答案:#include"stdio.h"voidmain()(intx,y,z;inti;intn;printf(Mpleaseinputn:");scanf("%d”,&n);x=0;〃大兔子对数y=l;〃小兔子对数for(i=l;i<=n;i++)(z=x;x=x+y;〃兔崽子全部长成大兔子y=z;〃本来有多少对大兔子,就生出多少对小兔子。}printf(Mthetotlenumberis%d\n”,x+y);〃大兔子加小兔子个数4.23求解非线性方程f(x)=0的牛顿迭代法的迭代公式是:xgn+1nf,(xn)编写程序,用此方法求方程f(x)=x〃+x3+l=0在x°=-l附近的根。#include"stdio.h"#include"math.h"#defineeps1e-6doublef(floatx)]returnpow(x,41)+pow(x,3)+l;Idoubleff(floatx)(return41*pow(x,40)+3*x*x;)voidmain()(doublex0,xl;x0=0.0;xl=-1.0;do{x0=xl;xl=x0-f(x0)/ff(x0);}while(fabs(xO-xl)>eps);printf(Mx=%f\nM,xO);)4.29棋盘麦粒#include,,stdio.hn#includewmath.hwvoidmain()(doublev,i,n,r,w;〃数据会溢出,所以是double型i=l;n=64;r=l;w=0;fbr(i=l;i<=n;i++)(w=w+r;r=2*r;

v=w/1.4e8;printf(M%e\nM,v);)4.6编程序,打印斐波纳契序列前20项。斐波纳契序列是第1、2两项为1,以后每项为前两项之和,如下:1,1、2、3、5、8、13>22、 #includenstdio.hMintmain(intargc,char*argvf])(inti;intFi=l,Se=l;intCu;printf(,,%8d%8d,,,Fi,Se);for(i=3;i<=20;i++)(Cu=Fi+Se;printf("%8d”,Cu);if(i%5==0){)Fi=Se;Se=Cu;}return0;)4.20编程序,打印图4.52字符图形的左侧三分之一部分。ABCDEFGHIBCDEFGHIACDEFGIHABDEFGHIABCEFGHIABCDABBBABCDEFGHIBCDEFGHIACDEFGIHABDEFGHIABCEFGHIABCDABBBCCCCCDDDDDDD

EEEEEEEEEBCDEFGHIACDEFGHIABDEFGHIABCEFGHIABCDFGHIABCDEFGHIABCDEEFGIHABCDDEFGIHABCCDEFGIHABBCDEFGHIAABCDEFGHIFFFFFFFFFEEEEEEEEEFGHIABCDEEFGIHABCDDEFGIHABCCDEFGIHABBCDEFGHIAABCDEFGHIFFFFFFFFFEEEEEEEEEDDDDDDDCCCCCBBBFGHIABCDEFFGHIABCDEEFGHIABCDDEFGHIABCCDEFGHIABBCDEFGHIA图4.52字符图形#include"stdio.h"intmain(intargc,char*argv[])(chari;intj;charPrintChar;for(i=,A*;i<='F';i++)(for(j=0;j<9;j++)(PrintChar=((i+j)-'A')%9+'A';printf(H%cM,PrintChar);}printf(,'\nH);)for(i=,E,;i>='A';i-)(for(j=0;j<9;j++)(PrintChar=((i+j)-,A,)%9+'A,;printf(n%cPrintChar);)printf(n\nM);)return0;}4.29古印度有一位十分好玩的国王要奖励为他发明国际象棋的宰相达依尔,问他要什么。达依尔回答:“陛下,只要在国际象棋棋盘的第一个格子中放一粒麦子,第二个格子中放两粒麦子,第三个格子中放四粒麦子,第四个格子中放八粒麦子, 如此下去,以后每个格子中都放它前一个格子中麦子数的两倍,这样放满棋盘的64个格子为止即可。”.国王觉得这很容易,于是开始奖赏,没想到一袋麦子很快就用完了,下一袋也很快就用完了,最后一算全印度的麦子全部用上也不够。请编程序计算所需麦子的体积(一立方米麦子约1.4X1()8粒)。#include"stdio.h"#includeHmath.hMvoidmain()(doublev,i,n,r,w;i=l;n=64;r=l;w=0;for(i=l;i<=n;i++)(w=w+r;r=2*r;)v=w/1.4e8;printf(H%e\nH,v);)P22_45.(习题集)判断给定字符序列中(与)、[与]、{与}是否配对(个数相等).include“stdio.h"//因为没有相交要求,所以直接计数就行了intmain(intargc,char*argv[])(charInChar;InChar=,A';inti,j,k;i=0;j=0;k=0;do(scanf(,,%c,,,&InChar);if(InChar=='(')i++;if(InChar==')')i—;if(InChar=='[,)j++;if(InChar=-J,)j-sif(InChar=='{,)k++;if(InChar=='}')k—;}while(InChar!='#');if(i==0)printf")配对\n");elseprintf("()不配对\n");if(j==O)printf(”[]配对\n");elseprintf("口不配对\n");if(k==O)printf("{}配对\n");elseprintf("{}不配对\n");return0;}P23_50(1)(习题集).读入n和x,输出序列的前n项和直到余项小于KT11Sh(x)=x+x3/3!+x5/5!+x7/7!+...+x2n+7(2n+l)!#include"stdio.h"includenmath.h"intmain(intargc,char*argv[])(intn;floatx;inti;printf("输入n:\nH);scanf(H%dM,&n);printf("输入x:\iT);scanf(n%f;&x);floatRes=x;floatTemp=x;;for(i=l;i<=n;i++)(Temp=Temp*x*x/((2*i)*(2*i+1));if(fabs(Temp)<1e-8){break;}Res=Res+Temp;)printf("计算结果为:%f\n”,Res);return0;}P23_50(6)(习题集).读入n和x,输出序列的前n项和直到余项小于arth(x)=x+x3/3+x75+x7/7+...+x2,,+l/(2n+l)#include"stdio.h"#include"math.h"intmain(intargc,char*argv[])(intn;floatx;inti;printf("输入n:\nH);scanf(n%dH,&n);printf("输入x:\nn);scanf(n%F,&x);floatRes=x;floatTempl=x;floatTemp=x;;for(i=l;i<=n;i++){Temp1=Templ*x*x;Temp=Templ/(2*i+l);if(fabs(Temp)<1e-8){break;)Res=Res+Temp;)printf("计算结果为:%f\n”,Res);return0;1P24_51(2)(习题集).用展开式计算圆周率PI到IO-精度,PI/2=(2/l)X(2/3)X(4/3)X(4/5)X(6/5)X(6/7)X(8/7)....(2n/2n-l)X(2n/2n+l)......#includeMstdio.hM#include"math.h"intmain(intargc,char*argv[J)(inti;floatTempP=0;floatTempC=l;i=l;while(fabs(TempC-TempP)>=1e-5)//float型的函数做余项,不要直接判等为零,算的是两项的差值是否小于特定值。(TempP=TempC;TempC=TempP*(2*i)*(2*i)/(2*i-1)/(2*i+1);i++;)printf("计算结果为:%.6f\n",TempC);return0;第五章5.1编程序计算,、 p2(x)+5x.一、y(X)=1vf =•p(X+2)p(x+5)-vx其中,、f(ux0.3,u)+〃/2

n(u»= #include"stdio.h"includeMmath.h"floatf(floatv,floatw){return(w+v)/(7*v);)floatp(floatu)(return(f(0.3*u,u)+u/2)/(2*u);}floaty(floatx)(return(p(x)*p(x)+5*x)*p(x+2)/(p(x+5)-sqrt(x));)voidmain()(floatx;floatResult;printf(n\nlnputx:\nH);scanf(n%r,&x);Result=y(x);printf(M\nTheresultis:%f\nM,Result);)5.2编写程序,输入实数a、b、c的值,计算并输出以下算式的值。4.25(〃+b)+ln(a+b+飞a+b+ )t a+bT= j 4.25+ln(c+Vc4--)

c#include"math.h"include,rstdio.h"floatT_ABC(floata,floatb,floatc)(floatResult;Result=(4.25*(a+b)+log(a+b+sqrt(a+b)+1.0/(a+b)))/(4.25+log(c+sqrt(c)+1.0/c));returnResult;)voidmain()(floatx,y,z;floatT;printf(nInputa,b,c\nH);scanf(n%f%f%f',&x,&y,&z);T=T_ABC(x,y,z);printf(MResult:%f\n';T);}P24.54(习题集).编写程序,当1.0、2.0、3.0、….20.0时,计算如下函数到10层嵌套。F(x)=l+l/(l+l/(l+l/(l+....+l/(l+l/x)...)))#include"stdio.h"intmain(intargc,char*argv[J)(floatTempResult;for(floatx=1.0;x<=20.0;x++)(TempResult=x;for(inti=0;i<10;i++)(TempResult=1+1/TempResult;printf(“第%2d步:结果:%10.6AnM,i,TempResult);}printf("x=%10.6f,Result:%l0.6f\n\n\nM,x,TempResult);}return0;}编程序,输入m、n的值,计算并输出:m!(m-n)!n!#include"stdio.h"intfac(intn){intp=l;for(;n>l;n-)p=p*n;returnp;}main(){intm,n,t;floatf;printf(Minputm,n\n");scanf(*'%d%dw,&m,&n);if(m<n){t=m;m=n;n=t;)printf(,'f=%5.2f\n,\(float)fac(m)/(fac(m-n)*fac(n)));}分别编写函数,计算复数的加法、减法、乘法、除法,复数z表示成z=a+ib.#include<stdio.h>#include<stdlib.h>doubleRealPJmageP;voidadd(doublea,doubleb,doublec,doubled)/*求和*/{RealP=a+c;ImageP=b+d;)voidsub(doublea,doubleb,doublec,doubled)/*求差*/(RealP=a-c;ImageP=b-d;)voidproduct(doublea,doubleb,doublec,doubled)/*求乘积*/(RealP=a*c-b*d;ImageP=b*c+a*d;)voiddivi(doublea,doubleb,doublec,doubled)/*除法*/(doubleTempi;doubleTemp2;doubleTemp3;Templ=a*c+b*d;Temp2=b*c-a*d;Temp3=c*c+d*d;RealP=Temp1/Temp3;ImageP=Temp2/Temp3;}intmain()(doublea,b,c,d;//inti,n;intchoose;puts("Thisprogramisaboutthecalculationoftwocomplexes.H);/*菜单*/puts(Ml:Do+oftwocomplexes0);puts(M2:Do-oftwocomplexes");puts(M3:Do*oftwocomplexes");puts(M4:Do/oftwocomplexes11);puts("5:Exit");while(l)/*循环计算*/(while(l)/*输入格式检测,并输入第一个复数*/{puts(nPleaseinputtherealpartandvirtualpartoffirstdigit:");if(scanf(,,%If%lf',&a,&b)==2)break;fflush(stdin);}while(l)/*输入格式检测,并输入第二个复数*/{puts(nPleaseinputtherealpartandvirtualpartofseconddigit:'1);if(scanf(M%lf%ir,&c,&d)==2)break;fflush(stdin);}while(l)/*菜单选择*/{puts(nInputyourchoose:(l-5)M);if(scanf(,"%d",&choose)==1)break;fflush(stdin);)switch(choose)(add(a,b,c,d);puts(uThesumoftwodigitsis:'1);/*显示相加的结果*/printf(ImageP>=O?,,%lf+%lfi\n":M%lf%lfi\n,\RealP,ImageP);break;sub(a,b,c,d);puts(nThesuboftwodigitsis:'1);/*显示相减的结果*/printf(ImageP>=O?,'%lf+%lfi\n',:',%lf%lfi\n'\ReaIP,ImageP);break;product(a,b,c,d);puts(HTheproductoftwodigitsis:1');/*显示相乘的结果*/printf(ImageP>=O?,'%lf+%lfi\n,':,,%lf%lfi\n,\RealPJmageP);break;divi(a,b,c,d);puts(nThedivisionoftwodigitsis:'1);/*显示相乘的结果*/printf(ImageP>=O?"%lf+%lfi\n":',%lf%lfi\n,\RealP,ImageP);break;default:return0;)}//system(upauseM);return0;)分别编写函数,检测一个字符是否空格、数字、元音字母includeMstdio.hM#include"math.h"voidcheck(charch)(if(ch==*printf(M%cisablank",ch);elseif(ch>='0,&&ch<='9,)printf(n%cisanumber",ch);elseif(ch=='a,||ch=='A,||ch==,o,||ch=='O,||ch=='e,||ch=='E|||ch==,i,||ch==,r||ch=='u'||ch==,U1)printf(H%cisayuanyin",ch);elseprintf(n%cisaotherchar'*,ch);}main(){charch;printf(ninputachar\nn);scanf(H%ch'\&ch);check(ch);)编写一个函数f(n),求任意4位正整数n的逆序数。例如,当n=2345时,函数值为5432o#include"stdafx.h"#include“sldio.h"intf(intn)(intQianW,BaiW,ShiW,GeW;intResult;intTemp;Temp=n;GeW=Temp%10;Temp=Temp/10;ShiW二Temp%10;Temp=Temp/10;BaiW=Temp%10;QianW=Temp/10;Result=1000*GeW+100*ShiW+10*BaiW+QianW;returnResult;)voidmain()(intInData;printf(MInputdata:\nw);scanf(M%dH,&InData);printf(nTheResultis:%d\nH,f(InData));6.1编写函数,把给定的整数数组中的。元素全部移到后面,且所有非0元素的顺序不变。#include<stdio.h>#defineN10voidMoveZero(intInArray[],intEleMents)(inti,j,k;intTemp;for(i=EleMents-2;i>=0;i—)(if(InArray[i]==0)(for(j=i;j<EleMents-l;j++)(Temp=InArray[j];InArray[j]=InArray[j+1];InArray[j+1]=Temp;}))printf("移动后结果:\n");for(k=0;k<EleMents;k++)(printfC%・5d”JnArray[k]);)printf(H\nM);}voidmain(void)(intm;intAnyArray[N];printf("输入%(1个整数:\nn,N);for(m=0;m<N;m++)(scanf("%d",&AnyArray[m]);)MoveZero(AnyArray,N);6.6编函数,把整数组中值相同的元素删除得只剩一个;并把剩余元素全部串到前边。include,,stdio.hnvoidDeleteSameEls(intArr[],intElNum)(inti;intCurElNum;intj;intk;CurElNum=EINum;for(i=0;i<CurEINum;i+4-)(for(j=i+l;j<CurElNum;j+4-)(if(Arr[j]==Arr[i]){for(k=j;k<(CurE!Num-1);k++)(Arr[k]=Arr[k+l];1Arr[CurElNum-l]=-9999;CurElNum—;printf(Mi=%dj=%d:M,ij);for(intm=O;m<ElNum;m++)(printf(M%2dH,Arr[m]);}printf(H\nM);j--;})intmain(intargc,char*argv[])(intTestArr[1000];intRealArrElNum;printf("输入数组元素数(小于1000):");scanfC^d'\&RealArrElNum);printf("输入数组元素:”);for(intl=O;l<RealArrElNum;l++)scanf("%d",&TestArr[l]);)printf("原始数据:");for(intn=O;n<RealArrElNum;n++)(printf("%3d”,TestAnlnD;)printf(H\n\nM);DeleteSameEls(TestArr,RealArrElNum);printf(”\n删后数据:”);for(intm=0;m<RealArrElNum;m+4-)(printfC%3dM,TestAir[m]);}printf(M\nH);return0;)6.8编写函数判断任意给定的二维整数组(100x100)中是否有相同元素include“stdio.h"#defineRealRow100#defineColumn100intOutArr[Column*RealRow];intCounter=0;boolIsHaveSameEle(intInArray[][Column],introw)(inti,j;intkJ;boolflag=false;for(i=0;i<row;i++)(for(j=0;j<Column;j++)(intkey=InArray[i][j];boolHaveSame;HaveSame=false;for(k=i;k<row;k++)if(HaveSame)(break;if(k==i)(1=3+1;}else(1=0;}for(l;l<Column;l++)(if(InArray[k][l]==key)(flag=true;if(!HaveSame){boolTempFlag=false;for(intTemp=0;Teinp<Counter;Temp4-+){if(OutArr[Temp]==key)(TempFlag=true;break;}}if(!TempFlag){OutArr[Counter]=key;Counter++;HaveSame=true;break;}})}}}}returnflag;voidmain(void)(intAnArray[RealRow][Column];intm,n;printf("?fl!jA%dX%d的二维数组:\n",RealRow,Column);fbr(m=0;m<RealRow;m++){fbr(n=0;n<Column;n++)(scanf("%d'',&AnArray[m][n]);})if(IsHaveSameEle(AnArray,RealRow))(printf("有%d个相同的元素如下:\nM,Counter);fbr(intp=0;p<Counter;p++)(printf(n%dn,OutArr[p]);)printfC'\nH);)else(printf("无相同的元素!\n");}1编写函数,把矩阵A转置A3并存入A中。#include"stdio.h"#defineRealRow 4#definecolumn 3voidToTranspose(intInMatrix[][column],introw){intTempMatrixPlcolumn][RealRow];inti,j;for(i=0;i<row;i++)(for(j=0;j<column;j++){TempMatrixP[j][i]=InMatrix[i][j];)intTempArray[RealRow*column];intcounter=0;for(i=0;i<column;i++)(for(j=0;j<row;j++)(TempAiray[counter]=TempMatrixP[i][j];counter++;counter=0;for(i=0;i<row;i++)(fbr(j=0;j<column;j++)(InMatrix[i][j]=TempArray[counter];counter++;)))voidmain(void)(intAnyMatrix[RealRow][column];intm,n;intCalCounter;CalCounter=0;printf("输入%(1X%d的矩阵:\nM,RealRow,column);for(m=0;m<RealRow;m++)(fbr(n=0;n<column;n++)(scanf(H%dn,&AnyMatrix[m][n]);)}ToTranspose(AnyMatrix,RealRow);printf("输出转置后的%dX%d的矩阵如下:\n",column,RealRow);for(m=0;m<RealRow;m++)fbr(n=0;n<column;n++){printf(M%-4dM,AnyMatrix[m][n]);CalCounter++;if(CalCounter%RealRow==0)(printfCVn**);))))编写函数,找出给定二维整数组A中的所有鞍点。若一个数组元素A[iJ]正好是矩阵A第i行的最小值,第j列的最大值,则称其为A的一个鞍点。include"stdio.h"#defineRealRow 3#definecolumn 4voidFindAnPoint(intInArray[][column],introw)(intij;intAnPoints=0;intTempAnPoints[RealRow*column][3];for(i=0;i<RealRow;i++)(fbr(j=0;j<column;j++)(intkey;key=InArray[i][j];boolRowMini;boolColumnMax;RowMini=true;ColumnMax=true;for(intm=0;m<column;m4-+){if(InArray[i][m]<key)(RowMini=false;break;)}for(intn=0;n<RealRow;n++)(if(InArray[n][j]>key)(ColumnMax=false;break;if(RowMini&&CoiumnMax){TempAnPoints[AnPointsJ[OJ=key;TempAnPoints[AnPoints][1]=i+l;TempAnPoints[AnPoints][2]=j+l;AnPoints++;}))if(AnPoints>0)(printf("\n%d个鞍点及其下标如下;\n",AnPoints);printf("%-6s%-6s%-6s%-6s\n"J序号","鞍点","行","列");for(intp=0;p<AnPoints;p++)(printf(,,%-6d%-6d%-6d%-6du,p+1,TempAnPoints[p][0],TempAnPoints[p][1],TempAnPoints旧⑵);primf(“\n");))else(printf(*'\n无鞍点\n");)}voidmain(void)(intAnyArray[RealRow][column];intx,y;printf("输入%(1X%d的二维数组:\n",RealRow,column);for(x=0;x<RealRow;x++)fbr(y=0;y<column;y++)scanf("%d",&AnyArray[x][y]);)]FindAnPoint(AnyArray,RealRow);6.18数组A未排序;今有一个索引数组B保存A的下标。编程序,不改变数组A,只改变数组B完成对A的排序。如下图所示:ABAB1011057273535284844541抖三序前升,序后#include<stdio.h>voidmain(){inta[5]={10,7,5,8,4);intb[5]={1,2,3,4,5);inti,j,k,r;for(i=0;i<4;i++)(k=i;for(j=i+l;j<5;j++)(if(a[b[j]-l]<a[b[k]-l])(k=j;))if(k!=i)(r=b[i];b[i]=b[k];b[k]=r;)}for(i=0;i<5;i++))printf("\n");)6.20设整数集合M定义如下:1)1EM;2)若xGM,贝!|2x+lGM,3x+lGM;3)没有别的整数属于集合M.编程序按递增顺序生成并输出集合M的前30项。再编一个函数,对任意给定整数z,判断它是否属于集合M。参考答案:13479101315192122272831391347910131519212227283139⑴编程序按递增顺序生成并输出集合M的前30项。#include<stdio.h>voidmain(){intcount;intn;inti;inta[30];a[0]=l;count=l;n=2;while(count<=30)(fbr(i=0;i<=count-1;i++)if((n==a[i]*2+l)||(n=a[i]*3+l)){count++;a[count-l]=n;break;)n++;)for(i=0;i<30;i++)printf(n%4dH,a[i]);}(2)再编一个函数,对任意给定整数z,判断它是否属于集合Mo#include<stdio.h>intfun(intm)(intresult1=0,result2=0;if(m==l)return1;if(m>l)(inta=(m-l)%2,b=(m-l)%3;if(a==O)resultl=fun((m-1)/2);if(b==O)result2=fun((m-1)/3);return(resultl||result2);}elsereturn0;}voidmain(){intdata;scanf(n%d",&data);if(fun(data)==l)printf(Hyes\nH);elseprintf(,,no\nH);}第(2)题的另一种解法#include"stdio.h"voidOut_M_N(intOutput_Nums)〃输出集合中排序后的数据(intArrRes[10000];〃最多可输出10000个M集合中的数据intij,k;ArrRes[0]=l;i=j=0;k=l;while(k<Output_Nums)(if((2*ArrRes[i]+l)<(3*ArrRes|j]+1))(ArrRes[k]=2*ArrRes[i]+1;i++;)elseif((2*ArrRes[i]+1)==(3*ArrRes[j]+1))(ArrRes[k]=2*ArrRes[i]+1;i++;j++;)else(ArrRes[k]=3*ArrRes[j]+1;j++;)k++;)for(intm=0;m<Output_Nums;m4-+)(if(m%10==0){printf(n\n");)printf(M%-8dM,ArrRes[m]);voidDelete_OneElement(intArr[],intDelete_Num,intArr_Nums)〃删除数组中的元素(for(inti=Delete_Num;i<Arr_Nums-l;i++)(Arr[i]=Arr[i+lJ;}}boolIslnclude(intZ)〃判断是否属于集合M(intTempArr[100]={0};intCurrent_Nums=1;TempArr[O]=Z;if(Z==1)returntrue;while(Current_Nums!=O)intPre_2_Value;intPre_3_Value;Pre_2_Value=(TempArr[0]-1)%2;Pre_3_Value=(TempArr[0]-1)%3;if((Pre_2_Value!=0)&&(Pre__3_Value!=0)&&(Current_Nums==l))returnfalse;elseif((Pre_2_Value!=0)&&(Pre_3_Value!=0)&&(Current_Nums>1)){Delete_OneElement(TempArr,0,Current_Nums);Current_Nums—;continue;〃从头开始判断数组中的元素}if(Pre_2_Value==0){intTemp_2;Temp_2=(TempArr[0]-1)/2;if(Temp_2==l)returntrue;elseif(Temp_2>l)(TempArr[Current_Nums]=Temp_2;Current_Nums++;if(Pre_3_Value==0)(intTemp_3;Temp_3=(TempArr[0]-1)/3;if(Temp_3==l)returntrue;elseif(Temp_3>l){TempArr[Current_Nums]=Temp_3;Current_Nums++;})Delete_OneEiement(TempArr,0,Current_Nums);Current_Nums-;)returnfalse;)intmain(intargc,char*argvf])intTestNum;TestNum=O;while(TestNum!=-1)(printf(n输入要判断的数(输入・1退出)\n");scanf("%d”,&TeslNum);if(TestNum==-l)break;printf("下面是M集合的前%(1项\0”维§1?41101);Out_M_N(TestNum);printf(,'\nn);if(IsInclude(TestNum))printf(n%d属于集合M\n\n'\TestNum);elseprintf(*'%d不属于集合M\n\n\TestNum);)return0;)6.22判断一个字符序列中(与)、[与]、{与}是否配对且互不相交。注:程序未做全面测试,仅供参考。#include"string.h"#defineSZ500voidInitStack(int*StackTop)(*StackTop=0;)boolIsStackEmpty(int*StackTop)(if((*StackTop)==0)(returntrue;)else(returnfalse;))boolPushStack(charCharStack[],charInChar,int*StackTop,intStackSize)if((*StackTop)>(StackSize-1))printf("栈满,压人失败!\n“);returnfalse;}else{CharStack[*StackTop]=InChar;*StackTop=*StackTop+1;returntrue;))boolPopStack(charCharStack[j,char*PopChar,int*StackTop)〃出栈并删除枝顶元素(if((*StackTop)<=0)(printf("栈空,弹出失败!\n");returnfalse;)else(StackTop=*StackTop-1;PopChar=CharStack[*StackTop];returntrue;))boolGetTopEleMentOfStack(charCharStack[],char*TopCharOfStackjnt*StackTop)〃只获取栈顶元素,不改变栈顶(if((*StackTop)<=0)(printf("栈空,获取栈顶元素失败!\n");returnfalse;)else(TopCharOfStack=CharStack[*StackTop-1];returntrue;))〃目前能判断两种情况:1.返回值为true,配对且互不相交;2.返回值为false,不配对或相交//特殊情况:默认要判断的字符串至少有一个括号成分,如果字符串不包含任何括号成分,则〃视为配对且不相交,函数返值为true,但会有具体提示信息boolIsPaAndNotInt(char*TheString)(intStackSize=SZ;charCharStack[SZ];intStackTop=0;boolIsPairingAndNotIntersecting=true;boolHaveBracketEle=false;intStringLenth;StringLenth=strlen(TheString);InilStack(&StackTop);for(inti=O;i<StringLenth;i++)(if(TheString[i]==*(,||TheString[i]==*[l|TheString[i]==,{,)(HaveBracketEle=true;if(!PushStack(CharStack,TheString[i],&StackTop,StackSize))(returnfalse;})elseif(TheString[i]=-),)(HaveBracketEle=true;if(IsStackEmpty(&StackTop))〃栈空(printf("有()不配对,缺少(。\nH);returnfalse;}charTempTopStackChar;GetTopEleMentOfStack(CharStack,&TempTopStackChar,&StackTop);if(TempTopStackChar!='(')〃栈不空但不配对或相交{if(TempTopStackChar=='[')(printf("可能有口与()相交或)不配对,缺少(,如([)]\n");returnfalse;)if(TempTopStackChar==,{*)printf("可能有{}与()相交或)不配对,缺少(,如⑴}\n");returnfalse;))else//暂时配对(PopStack(CharStack,&TempTopStackChar,&StackTop);)}elseif(TheString[i]==']'){HaveBracketEle=true;if(IsStackEmpty(&StackTop))〃栈空(printf("有口不配对,缺少[。\n");returnfalse;)charTempTopStackChar;GetTopEleMentOfStack(CharStack,&TempTopStackChar,&StackTop);if(TempTopStackChar!='[')〃栈不空但不配对或相交(if(TempTopStackChar=="(')(printf("可能有()与口相交或]不配对,缺少[,如[(])\n)returnfalse;)if(TempTopStackChar=='{')(printf("可能有{}与口相交或]不配对,缺少[,如[{]}♦");returnfalse;else//暂时配对(PopStack(CharStack,&TempTopStackChar,&StackTop);)}elseif(TheString[i]=='}'){HaveBracketEle=true;if(IsStackEmpty(&StackTop))〃栈空(printf("有{}不配对,缺少{。\n");returnfalse;}charTempTopStackChar;GetTopEleMentOfStack(CharStack,&TempTopStackChar,&StackTop);if(TempTopStackChar!=,{')〃栈不空但不配对或相交{if(TempTopStackCha『='(')Iprintf("可能有()与{}相交或}不配对,缺少{,如{⑴\n");returnfalse;)if(TempTopStackChar=='[')(printf("可能有口与{}相交或}不配对,缺少{,如{[}]\n");returnfalse;)}else//暂时配对{PopStack(CharStack,&TempTopStackChar,&StackTop);)))if(!IsStackEmpty(&StackTop))(printf("有括号不配对,可能缺少)、]或}\n");returnfalse;)if(HaveBracketEle&&IsPairingAndNotIntersecting){printf("括号配对且互不相交。\n");returntrue;)if(!HaveBracketEle)(printf("字符串不包含任何括号成分。\n");returntrue;))voidmain()(charTestString[SZ];charWiUContinue=Y;〃为N表示不再判断下一个字符串while(WillContinue!='N'&&WillContinue!='n')(printf(M\n请输入一个字符串:");scanf(H%sM,TestString);IsPaAndNotlnt(TestString);printf("\n继续判断下一个字符串吗(Y/N)?:");getchar();scanfC^c';&WillContinue);printf(,'\nH);})编写函数strchange,把给定的字符串反序。#includeHstring.hMinclude"stdio.h"#defineLen1000boolStrChange(charInString[])(intStrLen=strlen(InString);intMid;inti;Mid=StrLen/2;for(i=0;i<Mid;i++)(charTempCh;TempCh=InString[i];InString[i]=InString[StrLen-i-1];InString[StrLen-i-1]=TempCh;)returntrue;)voidmain(void)(charAnyString[Len];printfCn输入字符串:”);scanf(H%sM,AnyString);StrChange(AnyString);printf("\n字符串反序后结果:\n%s\n",AnyString);)编写函数strcat,把给定的两个字符串连接起来。#includeMstring.hM#include"stdio.h"#defineLen1100#defineLen2100#defineLen1000intStrCat(charInString1[],charInString2[],charResString[]){intStrLen1,StrLen2,ResLen;inti;StrLen1=strlen(InString1);StrLen2=strlen(InString2);ResLen=StrLen1+StrLen2;for(i=0;i<StrLen1;i++)|ResString[i]=InStringl[i];)for(i=0;i<StrLen2;i++)(ResString[StrLenl+i]=InString2[i];)ResString[ResLen]='\O';returnResLen;voidmain(void)(charString1[Len1];charString2[Len2];charCatStringlLen];printf(H\n输入第一个字符串:\n");scanf("%s”,Stringl);printf(H\n输入第二个字符串:\n");scanf(,'%s,,,String2);StrCat(Stringl,String2,CatString);printf("\n连接后结果:\n%s\n",CatString);)整理名字表。编写程序,输入任意顺序的名字表,将其按字典顺序排序并输出。#include<stdio.h>#include<string.h>#defineN5boolNameSort(charInName[][20],intCount)(inti,j,k;charTempi20];for(i=0;i<Count;i++)(k=i;for(j=i+1;j<Count;j++){if(strcmp(InName|j],InName[k])<0){k=j;}}if(k!=i){strcpy(Temp,InName[i]);strcpy(InName[i],InName[k]);strcpy(InName[k],Temp);})printf("\n名字排序后:\nH);for(i=0;i<Count;i++)(puts(InName[i]);}returntrue;voidmain()(charAnyName[N][20J;printf("\n输入%(1个名字:\n",N);for(inti=0;i<N;i++)(gets(AnyName[i]);NameSort(AnyName,N);)约瑟夫(Josephus)问题古代某法官要判决n个犯人死刑,他有一条荒唐的逻辑,将犯人首尾相接排成圆圈,然后从第s个人开始数起,每数到第m个犯人,则拉出来处决;然后再数m个,数到的犯人再处决;...;但剩下的最后一个犯人可以赦免。编程序,给出处决顺序,并告知哪一个人活下来。#include"stdio.h',voidJhus(intnjnts,intm,intFan[])(inti;intTempN;intTempOut;intTempCount=l;TempOut=s;TempN=n;while(TempN>l)(TempOut=(m+TempOut-1)%TempN;if(TempN==n)TempOut—;printf("第%d个被处决的:%d\n*',TempCount,FanfTempOut]);TempN—;TempCount++;for(i=TempOut;i<TempN;i++){Fan[i]=Fan[i+l];}}printf("活下来的人是:%d\nH,Fan[0]);1intmain(intargc,char*argv[])(inta[]={l23,4,5,6,7,8,9,1011J2,13};Jhus(13,4,3,a);return0;1P63_21(习题集).编写函数,用“逐步增加递增子序列”法对整形数组进行排序#include"stdio.h"voidAddSort(intArr[],intElNum)inti,j,k,r;for(i=l;i<ElNum;i++){while((Arr|j]>Arr[i])&&(j>=0))(j=j-h}r=Arr[i];for(k=i-1;k>=j+1;k-)(Arr|k+l]=Arr[k];)Arr|j+l]=r;)intmain(intargc,char*argv[])(intTestArr|1000];intRealArrElNum;printf("输入数组元素数(小于1000):”);scanf("%d”,&RealArrElNum);printf("输入数组元素:”);for(intl=O;l<RealArrElNum;l++)(scanf(,'%d,,,&TestArr[l]);)printf("原始数据:");for(intn=O;n<RealArrElNum;n++)(printf(H%3dM,TestArr[n]);)printf(M\n\nM);AddSort(TestArr,RealArrElNum);printf("\n排序数据:");for(intm=0;m<RealArrElNum;m4-4-)(printf(M%3d,,,TestArr[m]);)printf(M\nM);return0;第七章下述程序执行后,输出结果是什么?#include<stdio.h>char*p[2][3]={“abc”,“defgh”Jijkl”,“mnopqr”Jsluvw”,“xyz”};main()(printf(M%c\nH,***(p+l));printf(,,%c\n,,,**p[O]);printf(M%c\nM,(*(*(p+1)+1))[4]);printf(M%c\nM,*(p[l][2]+2));printf("%s\n,,,**(p+l));)参考答案:mawzmnopqr编写函数,求给定字符串的长度#include"stdio.h"#include"string.h"intlength(char*str)(inti=0;while(str[i]!='\0')i++;returni;)voidmain()(chars[20];printf("输入\n");gets(s);printf("串长=%3小11"Jength(s));}7.27编写比较两个字符串si、s2大小的程序。当sl>s2时,输出1;当sl<s2时,输出-1;当sl==s2时,输出0。参考答案:#include"stdio.h"intstr_cmp(char*str1,char*str2)while(*strl!='\0,&&*str2!='\0')(if(*strl>*str2)return1;elseif(*strl<*str2)return-1;strl++;str2++;);if(*strl==,\0,&&*str2==,\0,)return0;elseif(*strl!-\0,)return1;elsereturn-1;voidmain()(charsl[100],s2[100];printf(Mpleaseinputthefirststring:°);scanf(H%sM,sl);printf(n\nn);printf(Mpleaseinputthesecondstring:1');scanf(',%s",s2);printf(M\nM);printf(Mtheresultis:%du,str_cmp(s1,s2));printf(,,\nM);)编写函数,分别求给定字符串中的大写字母、小写字母、空格数字、其他字符的数目#include"stdio.h"voidcountchar(char*p)(ints[5]={0,0,0,0,0);while(*p!-\0!)(if(*p>=,A'&&*p<='Z,)s[0]++;elseif(*p>-a,&&*p<='z')s[l]+

温馨提示

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

评论

0/150

提交评论