还剩110页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
C语言程序设计第三版谭浩强课后习题答案完整版
1.5请参照本章例题,编写一个C程序,输出以下信息**************************VeryGood!**************************解mian{printf“**************************”;printf“\n”;printf“VeryGood!\n”;printf“\n”;printf“**************************”;}
1.6编写一个程序,输入a、b、c三个值,输出其中最大值解mian{intabcmax;printf“请输入三个数abc:\n”;scanf“%d%d%d”abc;max=a;ifmaxbmax=b;ifmaxcmax=c;printf“最大数为“%d”max;}第三章
3.6写出以下程序运行的结果main{charc1=’a’c2=’b’c3=’c’c4=’\101’c5=’\116’;printf“a%cb%c\tc%c\tabc\n”c1c2c3;printf“\t\b%c%c”c4c5;}解aaㄩbbㄩㄩㄩccㄩㄩㄩㄩㄩㄩabcAㄩN
3.7 要将China译成密码,译码规律是用原来字母后面的第4个字母代替原来的字母.例如,字母A后面第4个字母是E.E代替A因此,China应译为Glmre请编一程序,用赋初值的方法使cl、c
2、c
3、c
4、c5五个变量的值分别为,’C’、’h’、’i’、’n’、’a’,经过运算,使c
1、c
2、c
3、c
4、c5分别变为’G’、’l’、’m’、’r’、’e’,并输出解#includestdio.hmain{charc1=’C’c2=’h’c3=’i’c4=’n’c5=’a’;c1+=4;c2+=4;c3+=4;c4+=4;c5+=4;printf密码是%c%c%c%c%c\nc1c2c3c4c5;}运行结果密码是Glmre
3.9求下面算术表达式的值
(1)x+a%3*intx+y%2/4设x=
2.5a=7y=
4.7
(2)floata+b/2+intx%inty设a=2b=3x=
3.5y=
2.5
(1)
2.5
(2)
3.
53.10写出程序运行的结果main{intijmn;i=8;j=10;m=++i;n=j++;printf“%d%d%d%d”ijmn;}解9,11,9,
103.12写出下面表达式运算后a的值,设原来a=12设a和n都已定义为整型变量
(1)a+=a
(2)a-=2
(3)a*=2+3
(4)a/=a+a
(5)a%=n%=2,n的值等于5
(6)a+=a-=a*=a解124210360405060第四章4.4若a=3,b=4,c=5,x=
1.2,y=
2.4,z=-
3.6,u=51274,n=128765,c1=’a’,c2=’b’想得到以下输出格式和结果,请写出程序(包括定义变量类型和设计输出)a=_3__b=_4__c=_5x=
1.200000y=
2.400000z=-
3.600000x+y=_
3.600__y+z=-
1.20__z+x=-
2.40c1=ˊaˊ_or_97ASCIIc2=ˊbˊ_or_98ASCIImain{inta=3b=4c=5;longintu=51274n=128765;floatx=
1.2y=
2.4z=
3.6;charc1=’a’c2=’b’;printfa=%2db=%2dc=%2d\nabc;printfx=%fy=%fz=%f\nxyz;printfx+y=%
5.2fy+z=%
5.2fz+x=%
5.2f\nx+yy+zz+x;printfu=%6ldn=%9ld\nun;printf%s%s%d%s\nc1=’a’orc1ASCII;printf%s%s%d%s\nc2=’a’orc2ASCII;}4.7用scanf下面的函数输入数据,使a=3,b=7,x=
8.5,y=
71.82,c1=ˊAˊ,c2=ˊaˊ,问在键盘上如何输入?main{inta,b;floatx,y;charc1c2;scanf(a=%d_b=%d,a,b);scanf(_x=%f_y=%ex,y);scanf(_c1=%c_c2=%c,c1,c2);}a=3_b=7_x=
8.5_y=
71.82_c1=A_c2=a4.8设圆半径r=
1.5,圆柱高h=3,求圆周长、圆面积、圆球表面积、圆球体积、圆柱体积用scanf输入数据,输出计算结果,输出时要求文字说明,取小数点后两位数字请编程序main{floatrhC1SaSbVaVb;scanf%f%frh;C1=2*
3.14*r;Sa=
3.14*r*r;Sb=4*Sa;Va=4*
3.14*r*r*r/3;Vb=Sa*h;printfC1=%.2f\nC1;printfSa=%.2f\nSb=%.2f\nVa=%.2f\nVb=%.2f\nSaSbVaVb;}4.9输入一个华氏温度,要求输出摄氏温度公式为c=5F-32/9输出要求有文字说明,取位2小数main{floatFc;scanf%fF;c=5*F-32/9;printfc=%.2fc;}4.10编程序,用getchar函数读入两个字符给c
1、c2,然后分别用函数和函数输出这两个字符并思考以下问题(1)变量c
1、c2应定义为字符型或整形?抑二者皆可?(2)要求输出c1和c2值的ASCII码,应如何处理?用putchar函数还是printf函数?(3)整形变量与字符变量是否在任何情况下都可以互相代替?如char c1,c2;与int c1,c2;是否无条件的等价?#includestdio.hmain{charc1c2;c1=getchar;c2=getchar;putcharc1;putchar’\n’;putcharc2;putchar’\n’;}#includestdio.hmain{charc1c2;c1=getchar;c2=getchar;printfc1=%dc2=%d\nc1c2;printfc1=%cc2=%c\nc1c2;}第五章
5.1什么是算术运算?什么是关系运算?什么是逻辑运算?解略
5.2C语言中如何表示“真”和“假”?系统如何判断一个量的“真”和“假”?解设有一个逻辑表达式,若其结果为“真”,则以1表示;若其结果为“假”,则以0表示但是判断一个逻辑量的值时,以0代表“真”,以非0代表“假”例如35的值为“真”,系统给出35的值为
15.3写出下面各逻辑表达式的值设a=3,b=4,c=51a+bcb==c2a||b+cb-c3!ab!c||14!x=ay=b05!a+b+c-1b+c/2解
10213140515.4有3个整数a、b、c,由键盘输入,输出其中最大的数解方法一#includestdio.hmain{intabc;printf请输入3个整数;scanf%d%d%dabc;ifabifbcprintfmax=%d\nc;elseprintfmax=%d\nb;elseifacprintfmax=%d\nc;elseprintfmax=%d\na;}方法二使用条件表达式,可以使程序更加简明、清晰程序如下#includestdio.hmain{intabctempmax;printf请输入3个整数;scanf%d%d%dabc;temp=aba:b;/*将a和b中的大者存人temp中*/max=tempctemp:c;/*将a和b中的大者与c比较,取最大者*/printf3个整数的最大数是%d\n”max;}
5.5有一函数写一程序,输入x值,输出y值解#includestdio.hmain{intxy;printf输入x;scanf%dx;ifx1/*x1*/{y=x;printfx=%3dy=x=%d\nxy;}elseifx10/*1≤x-10*/{y=2*x-1;printfx=%3dy=2*x-1=%d\nxy;}else/*x≥10*/{y=3*x-11;printfx=%3dy=3*x-11=%d\nxy;}}
5.6给一个百分制成绩,要求输出等级’A’、’B’、’C’、’D’、’E’90分以上为’A’,80~90分为’B’,70~79分为’C’,60分以下为’D’解程序如下#includestdio.hmain{floatscore;chargrade;printf请输入学生成绩;scanf%fscore;whilescore100||score0{printf\n输入有误请重新输入;scanf%fscore;}switchintscore/10{case10:case9:grade=’A’;break;case8:grade=’B’;break;case7:grade=’C’;break;case6:grade=’D’;break;case5:case4:case3:case2:case1:case0:grade=’E’;}printf成绩是%
5.1f,相应的等级是%c\nscoregrade;}说明对输入的数据进行检查,如小于0或大于100,要求重新输入intscore/10的作用是将score/10的值进行强制类型转换,得到一个整型值
5.7给定一个不多于5位的正整数,要求
①求它是几位数;
②分别打印出每一位数字;
③按逆序打印出各位数字例如原数为321,应输出123解#includestdio.hmain{longintnum;intindivtenhundredthousandten_thousandplace;/*分别代表个位、十位、百位、千位、万位和位数*/printf请输入一个整数(0~99999);scanf%ldnum;ifnum9999place=5;elseifnum999place=4;elseifnum99place=3;elseifnum9place=2;elseplace=1;printfplace=%d\nplace;ten_thousand=num/10000;thousand=num/1000%10;hundred=num/100%10;ten=num%100/10;indiv=num%10;switchplace{case5:printf%d%d%d%d%dten_thousandthousandhundredtenindiv;printf\n反序数字为;;printf%d%d%d%d%d\nindivtenhundredthousandten_thousand;break;case4:printf%d%d%d%dthousandhundredtenindiv;printf\n反序数字为;printf%d%d%d%d\nindivtenhundredthousand;break;case3:printf%d%d%dhundredtenindiv;printf\n反序数字为;printf%d%d%d\nindivtenhundred;break;case2:printf%d%dtenindiv;printf\n反序数字为;printf%d%d\nindivten;break;case1:printf%dindiv;printf\n反序数字为;printf%d\nindiv;break;}}
5.8企业发放的奖金根据利润提成利润I低于或等于10万元时,奖金可提成10%;利润高于10万元,低于20万元(100000I≤200000)时,其中10万元按10%提成,高于10万元的部分,可提成
7.5%;200000I≤400000时,其中20万元仍按上述办法提成(下同),高于20万元的部分按5%提成;400000I≤600000时,高于40万元的部分按3%提成;600000〈I≤1000000时,高于60万的部分按
1.5%提成;I1000000时,超过100万元的部分按1%提成从键盘输入当月利润I,求应发放奖金总数要求1用if语句编程序;2用switch语句编程序解计算利润时,要特别注意不同利润的不同提成比例例如,利润为15万元,其中有10万元按10%的比例提成,另外5万元则按
7.5%提成1用if语句编程序#includestdio.hmain{longi;floatbonusbon1bon2bon4bon6bon10;bon1=100000*
0.1;/*利润为10万元时的奖金*/bon2=bon1+100000*
0.075;/*利润为20万元时的奖金*/bon4=bon2+200000*
0.05;/*利润为40万元时的奖金*/bon6=bon4+200000*
0.03;/*利润为60万元时的奖金*/bon10=bon6+400000*
0.015;/*利润为100万元时的奖金*/printf请输入利润i;scanf%ldi;ifi=100000bonus=i*
0.1;/*利润在10万元以内按
0.1提成奖金*/elseifi=200000bonus=bon1+i-100000*
0.075;/*利润在10万至20万元时的奖金*/elseifi=400000bonus=bon2+i-200000*
0.05;/*利润在20万至40万元时的奖金*/elseifi=600000bonus=bon4+i-400000*
0.03;/*利润在40万至60万元时的奖金*/elseifi=1000000bonus=bon6+i-600000*
0.015;/*利润在60万至100万元时的奖金*/elsebonus=bon10+i-1000000*
0.01;/*利润在100万元以上时的奖金*/printf”奖金是%
10.2f\nbonus;}此题的关键在于正确写出每一区间的奖金计算公式例如利润在10万元至20万时,奖金应由两部分组成
①利润为10万元时应得的奖金即100000ⅹ
0.1;
②10万元以上部分应得的奖金即num-100000ⅹ
0.075同理,20万~40万这个区间的奖金也应由两部分组成
①利润为20万元时应得的奖金,即100000ⅹ
0.1ⅹ10万ⅹ
0.075;
②20万元以上部分应得的奖金,即num-200000ⅹ
0.05程序中先把10万、20万、40万、60万、100万各关键点的奖金计算出来,即bon
1、bon
2、bon
4、bon
6、hon10;然后再加上各区间附加部分的奖金2用switch语句编程序输入利润i,确定相应的提成等级branch根据branch确定奖金值0奖金=i*
0.11奖金=bon1+i-105*
0.0752奖金=bon2+i-2*105*
0.0534奖金=bon4+i-4*105*
0.0356奖金=bon6+i-6*105*
0.01578910奖金=bon10+i-106*
0.01输出奖金#includestdio.hmain{longi;floatbonusbon1bon2bon4bon6bon10;intc;bon1=100000*
0.1;bon2=bon1+100000*
0.075;bon4=bon2+200000*
0.05;bon6=bon4+200000*
0.03;bon10=bon6+400000*
0.015;printf请输入利润i;scanf%ldi;c=i/100000;ifc10c=10;switchc{case0:bonus=1*
0.1;break;case1:bonus=bon1+i-100000*
0.075;break;case2:case3:bonus=bon2+i-200000*
0.05;break;case4:case5:bonus=bon4+i-400000*
0.03;break;case6:case7:case8:case9:bonus=bon6+i-600000*
0.015;break;case10:bonus=bon10+i-1000000*
0.01;}printf奖金是%
10.2fbonus;}
5.9输入4个整数,要求按由大到小的顺序输出解此题采用依次比较的方法排出其大小顺序在学习了循环和数组以后,可以有更多的排序方法#includestdio.hmain{inttabcd;printf请输入4个整数;scanf%d%d%d%dabcd;printf\na=%db=%dc=%dd=%d\nabcd;ifab{t=a;a=b;b=t;}ifac{t=a;a=c;c=t;}ifad{t=a;a=d;d=t;}ifbc{t=a;b=c;c=t;}ifbd{t=b;b=d;d=t;}ifcd{t=c;c=d;d=t;}printf排序结果如下\n;printf%d%d%d%d\nabcd;}
5.10有4个圆塔,圆心分别为2,
2、-2,
2、2,-
2、-2,-2,圆半径为1这4个塔的高度分别为10m塔以外无建筑物今输入任一点的坐标,求该点的建筑高度塔外的高度为零程序如下#includestdio.hmain{inth=10;floatx1=2y1=2x2=-2y2=2x3=-2y3=-2x4=-2y4=-2xyd1d2d3d4;printf请输入一个点xy;scanf%f%fxy;d1=x-x1*x-x1+y-y1*y-y1;/*求该点到各中心点的距离*/d2=x-x2*x-x2+y+y2*y+y2;d3=x+x3*x+x3+y-y3*y-y3;d4=x+x4*x-x4*y+y4*y+y4;ifd11d21d31d41h=0;/*判断该点是否在塔外*/printf该点高度为%d\nh;}第六章第六章 循环控制
6.1输入两个正整数m和n,求其最大公约数和最小公倍数main{longmni=1js;scanf%ld%ldmn;for;i=mi=n;i++{ifm%i==0n%i==0s=i;}ifm=nj=m;elsej=n;for;!j%m==0j%n==0;j++;printfs=%ldj=%ld\nsj;}
6.2输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数#includestdio.hmain{charc;inti=0j=0k=0l=0;whilec=getchar!=’\n’{ifc=65c=90||c=97c=122i++;elseifc=48c=57j++;elseifc==32k++;elsel++;}printfi=%dj=%dk=%dl=%d\nijkl;}
6.3求Sn=a+aa+aaa+…+aa…aaa(有n个a)之值,其中a是一个数字例如2+22+222+2222+22222(n=5),n由键盘输入#includemath.hmain{intnsum=0i=1s=2;scanf%dn;whilei=n{sum=sum+s;s=s+2*pow10i;i++;}printfsum=%d\nsum;}
6.4求,(即求1!+2!+3!+4!+5!+…+20!)main{intni=1;longsum=0s=1;scanf%dn;whilei=n{s=s*i;sum=sum+s;i++;}printfsum=%ld\nsum;}
6.5求main{doublei=1j=1k=1s1=0s2=0s3=0sum;for;i=100;i++s1=s1+i;for;j=50;j++s2=s2+j*j;for;k=10;k++s3=s3+1/k;sum=s1+s2+s3;printfsum=%f\nsum;}
6.6打印出所有水仙花数,所谓水仙花数是指一个三位数,其各位数字立方和等于该本身例如153是一个水仙花数,因为153=1^3+5^3+3^3#includemath.hmain{intx=100abc;whilex=100x1000{a=
0.01*x;b=10*
0.01*x-a;c=x-100*a-10*b;ifx==powa3+powb3+powc3printf%5dx;x++;}}
6.7一个数如果恰好等于它的因子之和,这个数就称为完数例如,6的因子为
1、
2、3,而6=1+2+3,因此6是完数编程序找出1000之内的所有完数,并按下面格式输出其因子6 its factors are
1、
2、3main{intmijs;form=6;m10000;m++{s=1;fori=2;im;i++ifm%i==0s=s+i;ifm-s==0{printf%5ditsfastorsare1m;forj=2;jm;j++ifm%j==0printf%dj;printf\n;}}}或main{intmijs;form=6;m1000;m++{s=m-1;fori=2;im;i++ifm%i==0s=s-i;ifs==0{printf%5ditsfastorsare1m;forj=2;jm;j++ifm%j==0printf%dj;printf\n;}}}
6.8有一分数序列 求出这个数列的前20项之和main{inti=1n;doubletx=1y=2ssum=0;scanf%ldn;whilei=n{s=y/x;sum=sum+s;t=y;y=y+x;x=t;i++;}printf%f\nsum;}
6.9一球从100米高度自由下落,每次落地后返回原高度的一半,再落下求它在第10次落地时共经过多少米?第10次反弹多高? main{intin;doubleh=100s=100;scanf%dn;fori=1;i=n;i++{h*=
0.5;ifi==1continue;s=2*h+s;}printfh=%fs=%f\nhs;}
6.10猴子吃桃问题猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃一个以后每天早上都吃了前一天剩下的一半零一个到第10天早上想再吃时,见只剩下一个桃子了求第一天共摘多少桃子main{inti=1sum=0;for;i=10;sum=2*sum+1i++;printfsum=%d\nsum;}
6.11用迭代法求求平方根的迭代公式为要求前后两次求出的得差的绝对值少于
0.00001#includemath.hmain{floatx0x1a;scanf%fa;x1=a/2;do{x0=x1;x1=x0+a/x0/2;}whilefabsx0-x1=
0.00001;printf%.3f\nx1;}
6.12用牛顿迭代法求方程在
1.5附近的根main{doublexy;x=
1.5;do{y=2*x*x*x-4*x*x+3*x-6;x=x-y/6*x*x-8*x+3;}whiley!=0;printfx=%.3f\nx;}
6.13用二分法求方程在-10,10之间的根main{doublex1x2y1y2;x1=-10;x2=10;do{y1=2*x1*x1*x1-4*x1*x1+3*x1-6;x1=x1-y1/6*x1*x1-8*x1+3;}whiley1!=0;do{y2=2*x2*x2*x2-4*x2*x2+3*x2-6;x2=x2-y2/6*x2*x2-8*x2+3;}whiley2!=0;printfx1=%.3fx2=%.3f\nx1x2;}
6.14打印以下图案*************************#includemath.hmain{intijk;fori=0;i=3;i++{forj=0;j=2-i;j++printf;fork=0;k=2*i;k++printf*;printf\n;}fori=0;i=2;i++{forj=0;j=i;j++printf;fork=0;k=4-2*i;k++printf*;printf\n;}}第七章第七章 数组
7.1用筛法求之内的素数main{intija
[100];fori=2;i100;i++{a[i]=i;forj=2;j=i;j++{ifjiifa[i]%j==0break;ifa[i]-j==0printf%5da[i];}}printf\n;}或#includemath.hmain{staticintijka
[98];fori=2;i100;i++{a[i]=i;k=sqrti;forj=2;j=a[i];j++ifjkifa[i]%j==0break;ifj=k+1printf%5da[i];}printf\n;}
7.2用选择法对10个整数从小到大排序main{intija
[10]t;fori=0;i10;i++scanf%da[i];forj=1;j10;j++fori=0;i=9-j;i++ifa[i]a[i+1]{t=a[i+1];a[i+1]=a[i];a[i]=t;}fori=0;i10;i++printf%5da[i];}或main{staticinta
[10]ijkt;fori=1;i11;i++scanf%da[i];forj=1;j10;j++fori=1;i=10-j;j++ifa[i]a[i+1]{t=a[i+1];a[i+1]=a[i];a[i]=t;}fori=1;i11;i++printf%da[i];printf\n;}
7.3求一个3×3矩阵对角线元素之和main{inti=0j=0a
[3]
[3]s1s2;fori=0;i3;i++forj=0;j3;j++scanf%da[i][j];s1=a
[0]
[0]+a
[1]
[1]+a
[2]
[2];s2=a
[0]
[2]+a
[1]
[1]+a
[2]
[0];printfs1=%ds2=%d\ns1s2;}或main{staticintijs1s2a
[3]
[3];fori=1;i=3;i++forj=1;j=3;j++scanf%da[i][j];s1=a
[1]
[1]+a
[2]
[2]+a
[3]
[3];s2=a
[1]
[3]+a
[2]
[2]+a
[3]
[1];printf%d%d\ns1s2;}
7.4已有一个已排好的数组今输入一个数要求按原来排序的规律将它插入数组中main{staticinta
[10]={1781723245962101};intijt;scanf%da
[9];fori=9;i0;i--ifa[i]a[i-1]{t=a[i-1];a[i-1]=a[i];a[i]=t;}fori=0;i10;i++printf%5da[i];printf\n;}或main{staticinta
[5]={14567};intitb;scanf%db;fori=0;i5;i++{ifb=a[i]{t=a[i];a[i]=b;b=t;}printf%da[i];}printf%db;}
7.5将一个数组的值按逆序重新存放,例如,原来顺序为8,6,5,4,1要求改为1,4,5,6,8main{intib
[10];fori=0;i10;i++scanf%db[i];fori=9;i-1;i--printf%5db[i];printf\n;}
7.6打印出以下杨辉三角形(要求打印出10行)11 11 2 11 3 3 11 4 6 4 11 5 10 10 5 1∶∶main{staticintmnkb
[15]
[15];b
[0]
[1]=1;form=1;m15;m++{forn=1;n=m;n++{b[m][n]=b[m-1][n-1]+b[m-1][n];printf%-5db[m][n];}printf\n;}}}或main{intijnka
[10]
[10];statica[]
[1]={{1}{1}{1}{1}{1}{1}{1}{1}{1}{1}};a
[1]
[1]=1;fork=2k11;k++fori=2;i=k;i++forj=2;j=i;j++a[i][j]=a[i-1][j-1]+a[i-1][j];fork=1;k11;k++fori=1;i=k;i++forj=1;j=i;j++printf%da[i][j];}
7.7打印“魔方阵”,所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等例如,三阶魔方阵为816357492要求打印出由1~n2的自然数构成的魔方阵解#includestdio.hmain{inta
[16]
[16]iikpmn;p=1;whilep==1/*要求阶数为1~15的商数*/{printfEnternn=1~15;scanf%dn;ifn!=0n=15n%2!=0p=0;}fori=1;i=n;i++/*初始化*/forj=1;j=n;j++a[i][j]=0;j=n/2+1;/*建立魔方阵*/a
[1][j]=1;fork=2;k=n*n;k++{i=i-1;j=j+1;ifi1jn{i=i+2;j=j-1;}else{ifi1i=n;ifjnj=1;}ifa[i][j]==0a[i][j]=k;else{i=i+2;j=j-1;a[i][j]=k;}}fori=1;i=n;i++/*输出魔方阵*/{forj=1;j=n;j++printf%4da[i][j];printf\n;}}
7.8找出一个二位数组中的鞍点,即该位置上的元素在该行上最大,在该列上最小,也可能没有鞍点main{inta
[5]
[5]b
[5]c
[5]d
[5]
[5]k=0l=0;intij;fori=0;i5;i++forj=0;j5;j++scanf%dd[i][j];fori=0;i5;i++forj=0;j5;j++a[i][j]=d[i][j];fori=0k=0;i5;i++k++forj=0;j4;j++{ifa[i][j]=a[i][j+1]b[k]=a[i][j+1]=a[i][j];elseb[k]=a[i][j+1];}forj=0l=0;j5;j++l++fori=0;i4;i++{ifa[i][j]=a[i+1][j]c[l]=a[i+1][j]=a[i][j];elsec[l]=a[i+1][j];}fori=0k=0;i5;i++k++forj=0l=0;j5;j++l++ifd[i][j]-b[k]==0{ifd[i][j]-c[l]==0printfd[%d][%d]=%d\nijd[i][j];elseprintfd[%d][%d]=%disnotandi\nijd[i][j];}}
7.9有个15数按由小到大顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数组中第几个元素的值如果该数不在数组中,则打印出无此数#includemath.hmain{staticintijma
[15]={1491321345589144233377570671703812};scanf%dm;forj=0;j15;j++printf%4da[j];printf\n;i=7;whilefabsi-78{ifma
[7]{ifa[i]-m==0{printfitisat%d\ni+1;break;}i--;}elseifma
[7]{ifa[i]-m==0{printfitisat%d\ni+1;break;}i++;}elseprintf8\n;}iffabsi-7-8==0printfThereisnot\n;}
7.10有一篇文章,共有3行文字,每行有个80字符要求分别统计出其中英文大写字母、小写字母、空格以及其它字符的个数main{intij=0k=0l=0m=0n=0;charstr0
[301]str1
[100]str2
[100]str3
[100];getsstr1;getsstr2;getsstr3;strcatstr0str1;strcatstr0str2;strcatstr0str3;fori=0;str0[i]!=’\0’;i++{ifstr0[i]=65str0[i]=90j++;elseifstr0[i]=97str0[i]=122k++;elseifstr0[i]=48str0[i]=57l++;elseifstr0[i]==32m++;elsen++;}printfDaxieXiaoxieShuziKonggeQita\n;printf%5d%7d%5d%6d%4d\njklmn;}
7.11打印以下图案* * * * ** * * * ** * * * *** * * ** * * * *main{intijk;chara
[5]
[5];fori=0;i5;i++{forj=0;j5;j++{a[i][j]=’*’;printf%ca[i][j];}printf\n;fork=1;k=i+1;k++printf\40;}printf\n;}
7.12有一行电文译文下面规律译成密码A-Z a-zB-Y b-yC-X c-x…即第一个字母变成第26个字母,第i个字母变成第(26-i+1)个字母非字母字符不变,要求编程序将密码回原文,并打印出密码和原文main{inti;charstr1
[100]str2
[100];getsstr1;fori=0;str1[i]!=’\0’;i++ifstr1[i]=65str1[i]=90str2[i]=155-str1[i];elseifstr1[i]=97str1[i]=122str2[i]=219-str1[i];elsestr2[i]=str1[i];printf%s\n%s\nstr1str2;}
7.13编一程序,将两个字符串连接起来,不要strcat函数main{intij;charstr1
[100]str2
[100]str3
[201];getsstr1;getsstr2;fori=0;str1[i]!=’\0’;i++str3[i]=str1[i];forj=0;str2[j]!=’\0’;j++str3[j+i]=str2[j];printf%s\n%s\n%s\nstr1str2str3;}
7.14编一个程序,将两个字符串S1和S2比较,如果S1S2,输出一个正数;S1=S2,输出0;S1S2,输出一个负数不要用strcpy函数两个字符串用gets函数读入输出的正数或负数的绝对值应是相比较的两个字符串相对应字符的ASCII码的差值例如,’A’与’C’相比,由于’A’’C’,应输出负数,由于’A’与’C’的码差值为2,因此应输出-2同理And和Aid比较,根据第2个字符比较结果,’n’比’i’大5,因此应输出5#includestdio.h#includestring.hmain{intiresu;chars1
[100]s2
[100];printf\ninputstring1;getss1;printf\nInputstring2;getss2;i=0;whiles1[i]==s2[i]s1[i]!=’\0’i++;ifs1[i]==’\0’s2[i]==’0’resu=0;elseresu=s1[i]-s2[i];printf\nresult%d\nresu;}
7.15编写一个程序将字符数组s2中的全部字符拷贝到字符数组s1中不用strcpy函数拷贝时,’\0’也要拷贝过去,’\0’后面的字符不拷贝解#includestdio.hmain{chars1
[80]s2
[80];inti;printfInputs2;scanf%ss2;fori=0;istrlens2;i++s1[i]=s2[i];printfs1%s\ns1;}第八章第八章 函数
1.1写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果两个整数由键盘输入maxyueshumnintmn;{inti=1t;for;i=mi=n;i++{ifm%i==0n%i==0t=i;}returnt;}minbeishumnintmn;{intj;ifm=nj=m;elsej=n;for;!j%m==0j%n==0;j++;returnj;}main{intabmaxmin;printfentertwonumberis:;scanf%d%dab;max=maxyueshuab;min=minbeishuab;printfmax=%dmin=%d\nmaxmin;}
8.2求方程的根,用三个函数分别求当b2-4ac大于
0、等于
0、和小于0时的根,并输出结果从主函数输入a、b、c的值#includemath.hfloatyishigenmnkfloatmnk;{floatx1x2;x1=-n+sqrtk/2*m;x2=-n-sqrtk/2*m;printftwoshigenisx1=%.3fandx2=%.3f\nx1x2;}floatdenggenmnfloatmn;{floatx;x=-n/2*m;printfdenggenisx=%.3f\nx;}floatxugenmnkfloatmnk;{floatxy;x=-n/2*m;y=sqrt-k/2*m;printftwoxugenisx1=%.3f+%.3fiandx2=%.3f-%.3fi\nxyxy;}main{floatabcq;printfinputabcis;scanf%f%f%fabc;printf\n;q=b*b-4*a*c;ifq0yishigenabq;elseifq==0denggenab;elsexugenabq;}
8.2写一个判断素数的函数,在主函数输入一个整数,输出是否是素数的消息psushumintm;{inti=2t;for;i=m;i++ifm%i==0imbreak;ifm-i==0t=1;elset=0;returnm;}main{intas;printfentersushuis\n;scanf%da;s=psushua;ifs==1printfaissushu\n;elseprintfsisnotsushu\n;}
8.4写一个函数,使给定的一个二维数组(3×3)转置,即行列互换intzhuangzhibintb
[3]
[3];{intijt;fori=0;i3;i++forj=0;j=ij3-i;j++{t=b[i][j];b[i][j]=b[j][i];b[j][i]=t;}}main{inta
[3]
[3];intij;fori=0;i3;i++forj=0;j3;j++scanf%da[i][j];fori=0;i3;i++{forj=0;j3;j++printf%da[i][j];printf\n;}zhuangzhia;fori=0;i3;i++{forj=0;j3;j++printf%da[i][j];printf\n;}}
8.5写一函数,使输入的一个字符串按反序存放,在主函数中输入输出字符串main{charstr0
[100];getsstr0;fanxustr0;putsstr0;}fanxustr1charstr1
[100];{intitj;charstr2
[100];strcpystr2str1;t=strlenstr1;fori=0j=t-1;j-1;i++j--str1[i]=str2[j];}
8.6写一函数,将两个字符串连接lianjieabchara
[100]b
[100];{strcatab;}main{charstr1
[100]str2
[100];getsstr1;getsstr2;lianjiestr1str2;putsstr1;}
8.7写一函数,将两个字符串中的元音字母复制到另一个字符串,然后输出fuzhiabchara
[100]b
[100];{intij=0;fori=0;a[i]!=’\0’;i++ifa[i]==97||a[i]==101||a[i]==105||a[i]==111||a[i]==117||a[i]==65||a[i]==69||a[i]==73||a[i]==85{b[j]=a[i];j++;}}main{charstr1
[100]str2
[100];getsstr1;fuzhistr1str2;putsstr2;}
8.8写一函数,输入一个四位数字,要求输出这四个数字字符,但每两个数字间空格如输入1990,应输出1_9_9_0charfbcharb
[4];{inti=0;for;i4;i++{printf;printf%cb[i];}printf\n;}main{intauvwt;charc
[4];scanf%4da;u=a*
0.001;v=
0.01*a-1000*u;w=a-1000*u-100*v*
0.1;t=a-1000*u-100*v-10*w;c
[0]=u+48;c
[1]=v+48;c
[2]=w+48;c
[3]=t+48;fc;}
8.9编写一函数,由实参传来一个字符串,统计此字符串中字母、数字、空格和其它字符的个数,在主函数中输入字符串以及输出上述结果chartongjistr0bcharstr0
[100];intb
[4];{inti;fori=0;str0[i]!=’\0’;i++{ifstr0[i]=65str0[i]=90||str0[i]=97str0[i]=122b
[0]++;elseifstr0[i]=48str0[i]=57b
[1]++;elseifstr0[i]==32b
[2]++;elseb
[3]++;}}main{charstr1
[100];staticintia
[4];getsstr1;tongjistr1a;printfzimuShuziKonggeQita\n;fori=0;i4;i++printf%-8da[i];printf\n;}
8.10写一函数,输入一行字符,将此字符串中最长的单词输出cechangstr1word0charstr1
[100]word0
[15];{inti=0j=0t=0;staticcharword1
[15];for;str1[i]!=’\0’;i++{if!str1[i]=97str1[i]=122||str1[i]=65str1[i]=90{t=j;j=0;continue;}word1[j]=str1[i];j++;ifj=tstrcpyword0word1;}}main{charstr0
[100]longword
[15];getsstr0;cechangstr0longword;putslongword;}
8.11写一函数用起泡法对输入的个字符按由小到大的顺序排列intpaixuxintx[];{intijt;forj=1;j10;j++fori=0;i=9-j;i++ifx[i]x[i+1]{t=x[i+1];x[i+1]=x[i];x[i]=t;}}main{inty
[10];inti;fori=0;i10;i++scanf%dy[i];paixuy;fori=0;i10;i++printf%5dy[i];printf\n;}
8.12用牛顿迭代法求根方程为,系数a,b,c,d由主函数输入求X在1附近的一个实根求出后由主函数输出doubleqigenstuvintstuv;{doublexy;x=1;do{y=s*x*x*x+t*x*x+u*x+v;x=x-y/3*s*x*x+2*t*x+u;}whiley!=0;returnx;}main{intabcd;doublex;scanf%d%d%d%dabcd;x=qigenabcd;printfx=%.3f\nx;}
8.13用递归方法求n阶勒让德多项式的值递归公式为floatpx0nintn;floatx0;{floaty;ifn==0||n==1ifn==1y=x0;elsey=1;elsey=2*n-1*x0*px0n-1-n-1*px0n-2/n;returny;}main{floatxy0;intai;scanf%f%dxa;y0=pxa;printfy0=%.3f\ny0;}
8.14输入10个学生5门课的成绩,分别用函数求
①每个学生平均分;
②每门课的平均分;
③找出最高分所对应的学生和课程;
④求平均分方差δ=[SXi^2]/n-SXi/n^2,为一学生的平均分floatx1
[10]x2
[5];floatppccfindxx;main{charname
[10]
[20]class
[5]
[20];floatscore
[10]
[5]ok=0max
[5];inta
[5]ij;fori=0;i10;i++getsname[i];forj=0;j5;j++getsclass[j];fori=0;i10;i++forj=0;j5;j++scanf%fscore[i][j];ppscore;ccscore;findscoremaxa;o=xxk;fori=0;i10;i++{putsname[i];printf%.3f\nx1[i];}forj=0;j5;j++{putsclass[j];printf%.3f\nx2[j];}forj=0;j5;j++{printf%.3f\nmax[j];putsname[a[j]];putsclass[j];}printfo=%.3f\no;}floatppffloatf
[10]
[5];{floatsum=0;intij;fori=0sum=0;i10;i++{forj=0;j5;j++sum=sum+f[i][j];x1[i]=sum/5;}}floatccyfloaty
[10]
[5];{floatsum=0;intij;forj=0;j5;j++{fori=0;i10;i++sum=sum+y[i][j];x1[j]=sum/10;}}floatfindzstfloatz
[10]
[5]s
[5];intt
[5];{intij;forj=0s[j]=z
[0][j];j5;j++fori=0;i10;i++ifs[j]z[i][j]{s[j]=z[i][j];t[j]=i;}}floatxxqfloatq;{floatf=0e=0;inti;fori=0;i10;i++{e=x1[i]*x1[i]+e;f=f+x1[i];}q=e/10-f/10*f/10;returnq;}
8.15写几个函数
①输个职工的姓名和职工号;
②按职工号由小到大顺序排序,姓名顺序也随之调整;
③要求输入一个职工号,用折半法找出该职工的姓名,从主函数输入要查找的职工号,输出该职工姓名#defineN10findabinta[]b[];{intijstc[N]
[2];fori=0;iN;i++{c[i]
[1]=a[i];c[i]
[1]=i;}fori=0;iN;i++forj=0;jN-i-1;j++ifc[i]
[0]c[i+1]
[0]{t=c[i]
[0];c[i]
[0]=c[i+1]
[0];c[i+1]
[0]=t;s=c[i]
[1];c[i]
[1]=c[i+1]
[1];c[i+1]
[1]=s;}fori=0;iN;i++b[i]=c[i]
[1];return;}lookforhkinth[]k;{intij;fori=0;iN;i++ifh[i]-k==0j=i;returnj;}main{intnumber[N]x[N]ijup;charname[N]
[20];fori=0;iN;i++{getsname[i];scanf%dnumber[i];}scanf%dp;findnumberx;u=lookfornumberp;fori=0;iN;i++{printf%dnumber[i];putsname[x[i]];}putsname[x[u]];}
8.16写一函数,输入一个十六进制数,输出相应的十进制数#includemath.hintx;ffshucharshu[];{inti=strlenshu-1sum=0;for;i-1;i++{if{if48=shu[i]=57sum=sum+shu[i]-48*pow16i-1;elseif65=shu[i]=90sum=sum+shu[i]-55*pow16i-1;elseif97=shu[i]=102sum=sum+shu[i]-87*pow16i-1;x=1;}elsex=0;returnx;}main{charshufu
[100];ints;getsshufu;s=ffshufu;ifxprintfsD=%d\ns;elseprintfThenumberisnotox\n;}
8.17用递归法将一个整数n转换成字符串例如,输入486,应输出字符串486n的位数不确定,可以是任意位数的整数#includemath.hintx
[10];pfmnunsignedlongm;intn;{inty;ifn==0{y=intm%10;x
[0]=y;}else{y=unsignedlongm-pfmn-1/pow10n%10;x[n]=y;}returny;}main{unsignedlongab;intijk;charc
[11];scanf%lda;forj=0b=a;b
0.1;j++b/=10;pfaj-1;fori=0k=j-1;ij;i++k--c[i]=x[k]+48;c
[10]=’\0’;putsc;}或#includemath.hcharx
[11];pfmounsignedlongm;into;{intji;fori=o-1j=0;i-1;i--j++x[i]=intunsignedlongm/pow10j%10+48;return;}main{unsignedlongab;intji;scanf%lda;forj=0b=a;b
0.1;j++b/=10;pfaj;putsx;printf%d\nj;}或#includemath.hintx
[10];unsignedlongm;pfnintn;{inty;ifn==0{y=m%10;x
[0]=y;}else{y=unsignedlongm-pfn-1/pow10n%10;x[n]=y;}returny;}main{unsignedlonga;intijk;charc
[11];scanf%ldm;forj=0a=m;a
0.1;j++a/=10;pfj-1;fori=0k=j-1;ij;i++k--c[i]=x[k]+48;c
[10]=’\0’;putsc;}
8.18给出年、月、日,计算该日是该年的第几天intfindxyzintxyz;{intitsdays=0;ifx%4==0t=1;elset=0;fori=1;iy;i++{ifi==2s=2-t;elses=0;days=days+30+i%2-s;}days=days+z;returndays;}main{intyearmonthdateday;scanf%d%d%dyearmonthdate;day=findyearmonthdate;printfTHEDATEISTHE%dthDAYS\nday;} 第九章第九章 编译预处理
9.1定义一个带参的宏,使两个参数的值互换,并写出程序,输入两个数作为使用宏时的实参输出已交换后的两个值#defineCHANGEabtt=a;a=b;b=amain{intcds;scanf%d%dcd;CHANGEcds;printfc=%dd=%d\ncd;}
9.2输入两个整数,求他们相除的余数用带参的宏来实现,编程序#defineQaba%bmain{intcdt;scanf%d%dcd;t=Qcd;printft=%d\nt;}
9.3三角形面积为其中S=a+b+c/2,a、b、c为三角形的三边定义两个带参的宏S,一个用来求area,另一个宏用来求写程序,在程序中用带实参的宏名来求面积area#includemath.h#defineSSSmnkm+n+k/2#defineAQRTmnksqrtSSSmnk*SSSmnk-m*SSSmnk-n*SSSmnk-kmain{floatabcsarea;scanf%f%f%fabc;s=SSSabc;area=AQRTabc;printfs=%.3farea=%.3f\nsarea;}或#includemath.h#defineSSSmnkm+n+k*
0.5#defineAQRTmnksqrtm+n+k/2*m+n+k/2-m*m+n+k/2-n*m+n+k/2-kmain{floatabctarea;scanf%f%f%fabc;t=SSSabc;area=AQRTabc;printft=%.3f;area=%.3f\ntarea;}或#includemath.h#defineSSSmnkm+n+k/2#defineAQRTmnkmnkmnkmnkmnkmnkmnkmnkmnksqrtSSS*SSS-m*SSS-n*SSS-kmain{floatabctarea;scanf%f%f%fabc;t=SSSabc;area=AQRTabcabcabcabcabcabcabcabcabc;printft=%.3f;area=%.3f\ntarea;}
9.4给年份year,定义一个宏,以判别该年份是否闰年提示宏名可以定义为LEAP_YEAR,形参为y,既定义宏的形式为#defineLEAP_YEARy(读者设计的字符串)在程序中用以下语句输出结果ifLEAP_YEARyearprintf%disaleapyearyear;elseprintf%disnotaleapyearyear;#defineLEAPYEARyy%4main{inty;scanf%dy;ifLEAPYEARyprintf%disanotleapyear\ny;elseprintf%disalearyear\ny;}
9.6请设计输出实数的格式,包括⑴一行输出一个实数;⑵一行内输出两个实数;⑶一行内输出三个实数实数用
6.2f格式输出#definePR1xprintf%
6.2f\nx#definePR2xprintf%
6.2f\t%
6.2f\nxx#definePR3xprintf%
6.2f\t%
6.2f\t%
6.2f\nxxxmain{floata;scanf%fa;PR1a;PR2a;PR3a;}
9.7设计所需的各种各样的输出格式(包括整数、实属、字符串等),用一个文件名fornat.h,把信息都放到这个文件内,另编一个程序文件,用命令#includefornat.h以确保能使用这些格式分别用函数和带参的宏,从三个数中找出最大的数#defineMAXabcabcb:ca:bcb:cmain{floatxyzt;scanf%f%f%fxyz;t=MAXxyz;printf%.4f\nt;}
9.10用条件编译方法实现以下功能输入一行电报文字,可以任选两种输出,一为原文输出;一为将字母变成其下一字母(如’a’变成’b’……’z’变成’a’其它字符不变)用命令来控制是否要译成密码例如#defineCHANGE1则输出密码若#defineCHANGE0则不译为密码,按原码输出#defineCHANGE1main{charstr
[80]c;inti=0;getsstr;whilestr[i]!=’\0’{#ifCHANGEifstr[i]==90||str[i]==122str[i]=str[i]-25;elseifstr[i]=65str[i]90||str[i]=97str[i]122str[i]=str[i]+1;#endifi++;}putsstr;}或#defineCHANGE1main{charstr
[80]*c;inti=0;getsstr;c=str;while*c!=’\0’{#ifCHANGEif*c==90||*c==122*c=*c-25;elseif*c=65*c90||*c=97*c122*c=*c+1;#endifc++;}putsstr;}第十章第十章 指针
10.1输入三个整数,按由小到大的顺序输出main{intabc*p1*p2*p3t;scanf%d%d%dabc;p1=a;p2=b;p3=c;if*p1*p2{t=p1;p1=p2;p2=t;}if*p1*p3{t=p1;p1=p3;p3=t;}if*p2*p3{t=p2;p2=p3;p3=t;}printf%d%d%d\n*p1*p2*p3;}或main{intabc*p1*p2*p3t;scanf%d%d%dabc;p1=a;p2=b;p3=c;ifab{t=*p1;*p1=*p2;*p2=t;}ifac{t=*p1;*p1=*p3;*p3=t;}ifbc{t=*p2;*p2=*p3;*p3=t;}printf%d%d%d\nabc;}
10.2输入三个字符串,按由小到大的顺序输出#defineN3#defineM20main{charstr0[N][M]str1[M]*p*q;intilmn;q=str0;for;pq+N;p++getsp;l=strcmpqq+1;ifl0{strcpystr1q;strcpyqq+1;strcpyq+1str1;}m=strcmpqq+2;ifm0{strcpystr1q;strcpyqq+2;strcpyq+2str1;}n=strcmpq+1q+2;ifn0{strcpystr1q;strcpyq+1q+2;strcpyq+2q+1;}forp=q;pq+N;p++putsp;}
10.3输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换写三个函数;
①输入10个数;
②进行处理;
③输出10个数fxnintx[]n;{int*p0*p1ijty;i=j=x
[0];p0=p1=x;fory=0;yn;y++{ifx[y]i{i=x[y];p0=x[y];}elseifx[y]j{j=x[y];p1=x[y];}}t=*p0;*p0=x[n-1];x[n-1]=t;t=*p1;*p1=x
[0];x
[0]=t;return;}main{inta
[10]u*r;foru=0;u10;u++scanf%da[u];fa10;foru=0r=a;u10;u++r++printf%da[u];printf\n;}
10.4有n个整数,使前面各数顺序向后移m个位置,最后m个数变成前面m个数,见图写一函数实现以上功能,在主函数中输入n个数和输出调整后的n个数#defineN10voidshiftpxfloat*p;intx;{floata[N]*q*o;inti;o=a;q=p;fori=0;ix;i++*o+i=*q+N-x+i;forp=p+N-1;p=q;p--*p=*p-x;fori=0;ix;i++*q+i=*o+i;return;}main{floatshuzhu[N]*u*v;inthi;u=v=shuzhu;scanf%fh;for;uv+N;u++scanf%fu;shiftvh;foru=v;uv+N;u++printf%.2f*u;printf\n;}
10.5有n人围成一圈,顺序排号从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位#defineN5main{intijka[N+1]*p;fori=0p=a;p=a+N;i++p++*p=i;p=a+1;k=N;fori=0j=1;k!=1;j++{ifpa+Np=a+1;if*p!=0i++;ifi-3==0{*p=0;i=0;k--;}p++;}fori=1;i=N;i++ifa[i]!=0printfThelastnumberis%d\na[i];}
10.7有一字符串,包含n个字符写一函数,将此字符串中从第m个字符开始的全部字符复制成为另一个字符串#includestdio.h#defineN10main{chara[N+1]b[N+1]*p*q;intm;getsa;scanf%dm;p=a+m;q=b;strcpyqp;putsq;}
10.6写一函数,求一个字符串的长度在主函数种输入字符串,并输出其长度第十一章11.1定义一个结构体变量(包括年、月、日)计算该日在本年中是第几天,注意闰年问题解Struct{intyear;intmonth;intday;}date;main{intdays;printf“Inputyearmonthday:”;scanf“%d%D%d”date.yeardate.monthdate.day;switchdate.month{case1:days=date.day;break;case2:days=date.day+31;break;case3:days=date.day+59;break;case4:days=date.day+90;break;case5:days=date.day+120;break;case6:days=date.day+31;break;case7:days=date.day+181;break;case8:days=date.day+212;break;case9:days=date.day+243;break;case10:days=date.day+273;break;case11:days=date.day+304;break;case12:days=date.day+334;break;}ifdate.year%4==0date.year%100!=0||date.year%400==0date.month=3days+=1;printf“\n%d/%disthe%dthdayin%d.”date.monthdata.daydaysdateyear;}
11.2写一个函数days实现上面的计算由主函数将年、月、日传递给days函数,计算后将日数传回主函数输出解structy_m_d{intyear:intmonth;intday;}date;intdaysstructy_m_ddate1{intsum;switchdata.month{case1:sum=date
1.day;break;case2:sum=date
1.day+31;break;case3:sum=date
1.day+59;break;case4:sum=date
1.day+90;break;case5:sum=date
1.day+120;break;case6:sum=date
1.day+151;break;case7:sum=date
1.day+181;break;case8:sum=date
1.day+212;break;case9:sum=date
1.day+243;breakcase10:sum=date
1.day+243;breakcase11:sum=date
1.day+243;breakcase12:sum=date
1.day+243;break}};
11.3编写一个函数print打印一个学生的成绩数,该数组中有5个学生的数据记录,每个记录包括num、name、sore
[3],用主函数输入这些记录,用print函数输出这些记录解#defineN5structstudent{charnum
[6];charname
[8];intscore
[4];}stu[N];main{intIj;forI=0;IN;I++{printf“\Inputscoreofstudent%d:\n”I+1;printf“no.:”;scanf“%s”stu[i].num;printf“name:”;scanf“%s”stu[i].name;forj=0;j3;j++{printf“score%d:”j+1;scanf“%d”stu[i].score[j];}printf“\n”;}printstu;}printstructstudentstu
[6]{intIj;printf“%5s%10s”stu[i].numstu[i].name;forj=0;j3;j++printf“%9d”stu[i].score[j];print“\n”;}
11.4在上题的基础上,编写一个函数input用来输入5个学生的数据记录解#defineN5structstudent{charnum
[6];charname
[8];intscore
[4]}stu[N];inputstructstudentstu[]{intIj;forI=0;IN;I++{printf“inputscoresofstudent%d:\n”I+1;printf“NO.:”;scanf“%s”stu[i].num;printf“name:”;scanf“%s”stu[i].name;forj=0;j3;j++{printf“score%d:”j++;scanf“%d”stu[i].score[j];}}printf“\n”;}}
11.5有10个学生,每个学生的数据包括学号、姓名、3门课的成绩,从键盘输入10个学生的数据,要求打印出3门课的总平均成绩,以及最高分的学生的数据(包括学号、姓名、3门课成绩)解#defineN10structstudent{charnum
[6]charname
[8]intscore
[4]floatavr;}stu[N];main{intIjmaxmaxisum;floataverage;forI=0;IN;I++{printf“\nInputscoresofstudent%d:\n”I+1;printf“NO.:”;scanf“%s”stu[i].num;printf“name”;scanf“%s”stu[i].name;forj=0;j3;j++{printf“score%d:”j+1;scanf“%d”stu[i].score[j];}}average=0;max=0;maxi=0;fori=0;i3;i++{sum=0;forj=0;j3;j++sum+=stu[i].score[j];stu[i].avr=sum/
3.0;average+=stu[i].avr;ifsummax{max=sum;maxi=I;}}average/=N;printf“NO.namescore1score2score3average\n”;forI=0;IN;I++{printf“%5s%10s”stu[i].numstu[i].name;forj=0;j3;j++printf“%9d”stu[i].score[j];printf“%
8.2f\n”stu[i].avr;}printf“average=%
6.2f\n”average;printf“Thehighestscoreis:%sscoretotal:%d.”stu[maxi].namemax;}
11.6编写一个函数new对n个字符开辟连续的存储空间,此函数应返回一个指针,指向字符串开始的空间Newn表示分配n个字节的内存空间解new函数如下#defineNULL0#defineNEWSIZE1000charnewbuf[NEWSIZE];char*newp=newbuf;char*newintn{ifnewp+n=newbuf+NEWSIZE{newp=newp+n;returnnewp-n;}elsereturnNULL;}
11.7写一函数free,将上题用new函数占用的空间释放Freep表示将p指向的单元以后的内存段释放解#defineNullo#defineNEWSIZE1000charnewbuf[NEWSIZE];char*newp=newbuf;freechar*p{ifp=newbufpnewbuf+NEWSIZEnewp=p;}
11.8已有a、b亮光链表,每个链表中的结点包括学好、成绩要求把两个链表合并,按学号升序排列解#includestdio.h#defineNULL0#defineLENsizeofstructstudentstrutstudent{longnum;intscor;structstudent*next};structstudentlistAlistB;intnsum=0;main{structstudent*creatvoid;structstudent*insertstructstudent*structstudent*;voidprintstructstudent*;stuctstudent*ahead*bhead*abh;printf“\ninputlista:\n”;ahead=creat;sum=sum+|n;abh=insertaheadbhead;printabh;}structstudent*creatvoid{structstudent*p1*p2*head;n=0;p1=p2=structstudent*mallocLEN;printf“inputnumberscoresofstudent:\n”;printf“ifnumberIs0stopinputing.\n”;scanf“%ld%d”p1-nump1-score;head=NULL;whilep1-num!=0{n=n+1;ifn==1head=p1;elsep2-next=p1;p2=p1;p1=structstudent*mallocLEN;scanf“%ld%d”p1-nump1-score;}p2-next=NULL;returnhead;}structstudent*insertstructstudent*ahstructstudent*bh{structstudent*pa1*pa2*pb1*pb2;pa2=pa1=ah;pb2=pb1=bh;do{whilepb1-numpa1-numpa1-next!=NULL{pa2=pa1;pa1=pa1-next;}ifpb-num=pa1-num{ifah=pa1ah=pb1;elsepa2-next=pb1;pb1=pb1-next;pb2-next=pa1;pa2=pb2;pb2=pb1;}}whilepa1-next!=NULL||pa1==NULLpb1!=NULL;ifpb1-numpa1-numpa1-next==NULlap1-next=pb1;returnah;}voidprintstructstudent*head{structstudent*p;printf“%ld%d\n”p-nump-score;p=p-next;whilep!=NULL;}
11.913个人围成一圈,从第1个人开始顺序报号
1、
2、3凡报到“3”者退出圈子找出最后留在圈子中的人原来的序号解#defineN13structperson{intnumber;intnextop;}link[N+1];main{intIcounth;forI=1;I=N;I++{ifI==Nlink[i].nextp=1;elselink[i].nextp=I+1;link[i].number=I;}printf“\n”;count=0;h=N;printf“sequencethatperson2leavethecircle:\n”;whilecountN-1{I=0;whileI!=3{h=link[h].nextp;iflink[h].numberI++;}printf“%4d”link[h].number;link[h].number=0;count++;}printf“\nThelastoneis”;forI=1;ii=N;I++iflink[i].numberprintf“%3d”lin[i].number;}
11.10有两个链表a和b设结点中包含学号、姓名从1链表中删去与b链表中有相同学号的那些结点解#defineLA4#defineLB5#defineNULL0structstudent{charnump
[6];charname
[8];structstudent*next;}A[LA]b[LB];main{structstudenta[LA]={{“101””Wang”}{“102””LI”}{“105””zhang”}{“106””Wei”}};structstudentb[LB]={{“103””Zhang”}{“104””Ma”}{“105””Chen”}{“107””Guo”}{“108””Lui”}};intIj;structstudent*p*p1*p2*pt*head1*head2;head1=a;head2=b;printf“lista:\n”;forp1=head1i=1;p1a=LA;i++{p=p1;p1-next=a+I;printf“%8s%8s\n”p1-nump1-name;p1=p1-next;}p-next=NULL;printf“\nlistb:\n”;forp2=head2I=1;p2b+LB;I++{p=p2;p2-next=b+I;printf“%8s%8s\n”p2-nump2-name;p2=pa-next;}p-next=NULL;printf“\n”;p1=head1;whilep1!=NULL{p2=head2;whilep2!=NULLstrcmpp1-nump2-num!=0p2=p2-next;ifstrcmpp1-nump2-num==0ifp1==head1head1=p1-next;elsep-next=p1-next;p=p1;p1=p1-next;}p1=hedad1;printf{“\nresult:\n”};whilep1!=NULL{printf“%7s%7s\n”p1-nump1-name;p1=p1-next;}}
11.11建立一个链表,每个结点包括学号、姓名、性别、年龄输入一个年龄,如果链表中的结点所包含的年龄等于此年龄,则将此结点删去解#defineNULL0#defineLENsizeofstructstudentstructstudent{charnum
[6];charname
[8];charsex
[2];intage;stuctstudent*next;}stu
[10];main{structstudent*p*pt*head;intIlengthiageflag=1;intfind=0;whileflag==1{printf“inputlengthoflist
(10):”;scanf“%d”length;iflength10flag=0;}forI=0;Ilenth;I++{p=structstudent*mallocLEN;ifI==0head=pt=p;elsept-next=p;pt=p;ptintf“NO:”;scanf“%s”p-num;prntf“name:”;scanf“%s”p-name;printf“sex:”;scanf“%s”p-sex;printf“age:”;scanf“%s”p-age;}p-next=NULL;p=head;printf“\nNO.namesexage\n”;whilep!=NULL{printf“%4s%8s%6s%6d\n”p-nump-namep-sexp-age;p=p-next;}printf“Inputage:”;scanf“%d”iage;pt=head;p=pt;ifpt-age==iage{p=pt-next;head=pt=p;find=1;}elsept=pt-next;whilept!=NULL{ifpt-age==iage{p-next=pt-next;find=1;}elsep=pt;pt=pt-next;}if!findprintf“Notfound%d.”iage;p=head;printf“\nNO.namesexage\n”;whilep!=NULL{printf“%4s%8s”p-nump-name;printf“%6s%6d”p-sexp-age;p=p-next;}}
11.12将一个链表按逆序排列,即将链头当链尾,链尾当链头解#defineNULL0structstu{intnum;structstu*next;}main{intlen=1lstructstu*p1*p2*head*new*newhead;p1=p2=head=structstu*mallocsizeofstrctstu;printf“inputnumber0:listend:”;scanf“%d”p1-num;whilep1-num!=o{p1=structstu*mallocsizeofstructstu;printf“inputnumbern:listend:”;scanf“%d”p1-num;ifp1-num==0p2-next=null;else{p2=next=p1;p2=p1;len++;}}p1=head;pritnf“\ntheoriginallist:\n”;do{printf“%4d”p1-num;ifp1-next!=NULLp1=p1-next;}whilep1-next!=NULL{p2=p1;p1=p1-next;}ifI==0newhead=new=p1;elsenew=nes-next=p1;p2-next=NULL;}printf\n\nThenewlistL\n;p1=newhead;forI=0l;Ilen;I++{pritf“4dp1-num”;p1=p1-next}printf“\n”;第12章12.1编写一个函数getbits,从一个16位的单元中取出某几位(即该几位保留原值,其余位为0)函数调用形式为getbitsvaluen1n2其中value为该16位单元中的数据值,n1为欲取出的起始位,n2为欲取出的结束位解main{unsingnedinta;intn1n2;printf“inputanoctalnumber:”;scanf“%o”a;printf“inputn1n2:”;scanf“%d%d”n1n2;printf“result:%o\n”getbitsan1-1n2;}getbitsunsignedvalueintn1n2{unsignedintz;z=~0;z=zn1z16-n2;returnz;;}
12.2写一个函数,对一个16位的二进制数驱除它的奇数位解main{unsignedgetbitsunsigned;unsigneinta;printf“\ninputanoctalnumber:”;scanf“%o”a;printf“result:%o\n”getbitsa;}unsignergetbitsunsignedvalue{intIjmn;unsignedintzaq;z=0;forI=1;I=15;I+=2{q=1;forj=1;j=16-I-1/2;j++q=q*2;a=value16-i;a=a15;a=a15;z=z+a*q;}returnz;}
12.3编一程序,检查一下年一所用的计算机系统的C编译在执行有移时是按照逻辑位移的原则,还有按照算术右移的原则如果是逻辑右移,请编一函数实现算术右移如果是算术右移,请编写一函数实现逻辑右移解main{intanm;a=~0;ifa5!=a{printf“\nTurboClogicalmove!\n”;m=0;}else{printf“\nTurboCarithmeticmove!\n”;m=1;}printf“inputanoctalnumber:”;scanf“%o”a;printf“howmangdigitmovethwardstheright::”;scanf“%d”n;ifm==0printf“Arithmeticrightmoveresult:%o\n”getbits1an;elseprintf“Logicalrithtmoveresult:%o”getbits2an;}getbits1unsignedvalueintn{unsignedz;z=~0;z=zn;z=~z;z=z|valuen;returnz;}egtbit2unsignedvaludintn{unsignedz;z=~1nvaluen;}
12.4编一函数用来实现左右循环移位函数名为move,调用方法为movevaluen其中value为要循环位移的数,n为位移的位数解main{unsignedmoverightunsignedint;unsignedmoveleftunsignedint;unsigneda;intn;printf“\ninputanoctalnumber:”;scanf“%o”a;printf“inputn:”;scanf“%d”n;ifn0{moverightan;printf“result:%o\n”moverightan;}else{n=-n;moveleftan;printf“result:%o\n”moveleftan;}}unsignedmoverightunsignedvalueintn{unsignedz;z=valuen|value16-n;returnz;}unsignedmoveleftunsignedvalueintn{unsignedz;z=value16-n|valuen;returnz;}
12.5设计一个函数,使给出一个数的原码,能得到该数的补码解main{unsignedinta;unsignedintgetbitsunsigned;pritf“\nInputanoctalnumber:”;scanf“%o”a;printf“result:%o\n”getbitsa;}unsignedintgetbitsunsignedvalue{unsignedintz;z=value0100000;ifz==0100000z=~value+1;elsez=value;returnz;}第十三章
13.4从键盘输入一个字符串,将其中的小写字母全部转换成大写字母,然后输出到一个磁盘文件“test”中保存输入的字符串以“!”结束解#includestdio.hmain{File*fp;Charstr
[100];IntI=0;Iffp=fopen“test””w”==NULL{printf“Cannotopenthefile\n”;exit0;}printf“Inputastring:\n”;getsstr;whilestr[i]!=’!’{ifstr[i]=’a’str[i]=’z’str[i]=str[I-32];fputcstr[i]fp;I++;}fclosefp;fp=fopen“test””r”;fgetsstrstrlenstr+1fp;printf“%s\n”str;fclosefp;}
13.5有两个磁盘文件”A”和”B”各存放一行字母,要求把这两个文件中的信息合并(按字母顺序排列),输出到一个新文件”C”中解#includestdio.hmain{FILE*fp;IntIjni1;Charc
[100]tch;Iffp=fopen“a1””r”==NULL{printf“cannotopenthefile\n”;exit0;}printf“\nfileA:\n”;forI=0;ch=fgetcfp!=EOF;I++{c[i]=ch;putcharc[i];}fclosefp;i1=I;iffp=fopen“b1””r”==NULL{printf“\ncannotipenthefile”;exit0;}printf“\nfileB:\n”;forI=i1;ch=fgencfp!=EOF;I++{c[i]=ch;putcharc[i];}fclosefp;n=I;fori=0;In;I++forj=I+1;jn;j++ifc[i]c[j]{t=c[i];c[i]=c[j];c[j]=t;printf“\nfileC:\n”;fp=fopen“c1””w”;forI=0;In;I++{putcc[i]fp;putcharc[i];}fclosefp;}
13.6有5个学生,每个学生有3门课的成绩,从键盘输入以上数据(包括学生号、姓名、三门课成绩),计算出平均成绩,将原有数据和计算出的平均分数存放在磁盘文件stud中解#includestdio.hstructstudent{charnum
[10];charname
[8];intscore
[3];floatave;}stu
[5];main{intIjsum;FILE*fp;ForI=0;I5;I++{printf“\ninputscoreofstudent%d:\n”I+1;printf“NO.:”;scanf“%s”stu[i].num;printf“name:”;scanf“%s”stu[i].name;sum=0;forj=0;j3;j++{printf“score%d:”j+1;scanf“%d”stu[i].score[j];sum+=stu[i].score[j];}stu[i].ave=sum/
3.0}fp=fopen“stud””w”;forI=0;I5;I++iffwritestu[i]sizeofstructstudent1fp!=1printf“Filewriteerror\n”;fclosefp;fp=fopen“stud””r”;forI=0;I5;I++{freadstu[i]sizeofstructstudent1fp;printf“%s%s%d%d%d%
6.2f\n”stu[i].numstu[i].namestu[i].score
[0]stu[i].score
[1]stu[i].score
[2]stu[i].ave;}}
13.7将上题stud文件中的学生数据按平均分进行排序处理,并将已排序的学生数据存入一个新文件stu-sort中解#includestdio.h#defineN10structstudent{charnum
[10];charname
[8];intscore
[3];floatave;}st[N]temp;main{FILE*fp;IntIjn;Iffp=fopen“stud””r”==NULL{printf“cannotopenthefile”;exit0;}printf“\nfile‘stud’:”;forI=0;freadst[i]sizefstructstudent1fp!=0;I++{printf“\n%8s%8s”st[i].numst[i].name;forj=0;j3;j++printf“%8d”st[i].score[j];printf“%
10.f”st[i].ave;fclosefp;n=I;forI=0;In;I++forj=I+1;jn;j++ifst[i].avest[j].ave{temp=st[i];st[i]=st[j];st[j]=temp;}printf“\nnow:”;fp=fopen“stu-sort””w”;forI=0;In;I++{fwritest[i]sizeofstructstudent1fp;printf“\n%8s%8s”st[i].numst[i].name;forj=0;j3;j++printf“%8d”st[i].score[j];printf“%
10.2f”st[i].ave;fclosefp;}
13.8将上题以排序的学生成绩文件进行插入处理插入一个学生的3门课成绩,程序先计算新插入学生的平均成绩,然后将它按平均成绩高低顺序插入,插入后建立一个新文件解#includestdio.hstructstudent{charnum
[10];charname
[8];intscore
[3];floatave;}st
[10]s;main{FILE*fp*fp1;intIjtn;printf“\nNO.:”;scanf“%s”s.num;printf“name:”;scanf“%s”s.name;printf“score1score2score3:”;scanf“%d%d%d”s.score
[0]s.score
[1]s.score
[2];s.ave=s.score
[0]+s.score
[1]+s.score
[2]/
3.0;iffp=fopen“stu_sort””r”==NULL{printf“cannotopenfile.”;exit0;}printf“originaldata:\n”;forI=0;freadst[i]sizeofstructstudent1fp!=0;I++{printf“\n%8s%8s”st[i].numst[i].name;forj=0;j3;j++printf“%8d”st[i].score[j];printf“%
10.2f”st[i].ave;}n=I;fort=0;st[t].aves.avetn;t++;printf“\nnow:\n”;fp1=fopen“sort
1.dat””w”;forI=p;jt;I++{fwritest[i]sizeofstuctstudent1fp1;print“\n%8s%8s”st[i]numst[i].name;forj=0;j3;j++ptintf“%8d”st[i].score[j];printf“%
10.2f”st[i].ave;}fwritessizeofstructstudent1fp1;printf“\n%8s%7s%7d%7d%7d%
10.2f”s.nums.names.score
[0]s.score
[1]s.score
[2]s.ave;forI=t;In;I++{fwritest[i]sizeofstructstudent1fp1;printf“\n%8s%8s”st[i].numst[i].name;forj=0;j3;j++printf“%8d”st[i].score[j];printf“
10.2f”st[i].ave;fclosefp;fclosefp1;}
13.9上题结果仍存入原有的stu_sort文件而不另建立新文件解#includestdio.hstructstudent{charnum
[10];charname
[8];intscore
[3];floatave;}st
[10]s;main{FILE*fp*fp1;intIjtn;printf“\nNO.:”;scanf“%s’s.num;printf“name:”;scanf“%s’s.name;printf“score1score2score3:”;scanf“%d%d%d”s.score
[0]+s.score
[1]+s.score
[1]s.score
[2];s.ave=s.score
[0]+s.score
[1]+s.score
[2]/
3.0;iffp=fopen“stu=sort””r”==NULL{printf“cannotopenthefile.”;exit0;}printf“originaldata:\n”;forI=0;freadst[i]sizeofstructstudent1fp!=0;I++{printf“\n%8s%8s”st[i].numst[i].name;forj=0;j3;j++printf“%8d”st[i].score[j];printf“%
10.2f”st[i].ave;}fclosefp;n=I;fort=0;st[t].aves.ave+tn;t++;ptintf“\nnow:\n”;fp=fopen“stu_sort””w”;forI=0;It;I++{fwritest[i]sizeofstructstudent1fp;printf“\n%9s%8s%8d%8d%8d%
10.2f”s.nums.names.score
[0]s.score
[1]s.score
[2]s.ave;forI=t;In;I++{fwritsr[i]sizeofstructsrudent1fp;printf“\n%8s%8s”st[i].numst[i].name;forj=0;j3;j++printf“%8d”st[i].score[j];printf“%
10.2f”st[i].ave;}fclosefp;}
13.10有一磁盘文件emploee内存放职工的数据每个职工的数据包括职工姓名、职工号、性别、年龄、住址、工资、健康状况、文化程度要求将职工名和工资的信息单独抽出来另建一个简明的职工工资文件解#includestdio.hstructemploee{charnum
[6];charname
[10];charsex
[2];intage;charaddr
[20];intsalary;charhealth
[8];charclass
[10];}en
[10];structemp{charname
[10];intsalary;}em-case
[10];main{FILE*fp1*fp2;intIj;iffp1=fopen“emploee””r”==NULL{printf“cannotopenthefile.”;exit0;}printf“\nNO.namesexageaddrsalaryhealthclass\n”;forI=0;freadem[i]sizeofstructemploee1fp1!=p;I++{printf“\n%4s%8s%4s%6s%10s%6s%10s%8s”em[i].numem[i].nameem[i].sexem[i].ageem[i].addrem[i].salaryem[i].healthem[i].class;strcpyem_case[i].nameem[i].name;em_case[i].salary=en[i].salary;}printf“\n\n*****************************************”;iffp2=fopen“emp_salary””wb”==NULL{printf“cannotopenthefile.”;exit0;}forj=0;jI;j++{iffwriteen_case[j]sizeofstructemp1fp2!=1printf“error!”;printf“\n%12s%10d”em_case[j].nameem_case[j].salary;}printf“\n*******************************************”;fclosefp1;fclosefp2;}
13.11从上题的“职工工资文件”中删区一个职工的数据,再存回原文件解#incudestdio.h#incudestring.hstructemploee{charname
[10];intsalary;}emp
[20];main{FILE*fp;intIjnflag;charname
[10];intsalary;iffp=fopen“emp_salary””rb”==NULL{printf“cannotopenfile.”;exit0;}printf“\noriginaldata:”;forI=0;feademp[i]sizeofstructemploee1fp!=0;I++printf“\n%8s%7d”emp[i].nameemp[i].salary;fclosefp;n=I;printf“\ninputnamedeleted:”;scanf“%s”name;forflag=1I=0;flagIn;I++{ifstrcmpnameemp[i].name==0{forj=I;jn-1;j++{strcmpnameemp[i].name==0{forj=I;jn-1;j++{strcpyemp[j].nameemp[j+1].name;emp[j].salary=emp[j+1].salary;}flag=0;}}if!flagn=n-1;elseprintf“\nNowthecontentoffile:\n”;fp=fopen“emp-dalary””wb”;forI=p;In;I++fwriteemp[i]sizeofstructemploee1fp;fclosefp;fp=fopen“emp_salary””r”;forI=0;freademp[i]sezeofstructemploee1fp!=0;I++printf“\n%8s%7d”emp[i].nameemp[i].salary;fclosefp;}
13.12从键盘输入若干行字符(每行长度不等),输入后把它们存储到一磁盘文件中再从该文件中读入这些数据,将其中小写字母转换成大写字母后在显示屏上输出解#includestdio.hmain{intIflag;charstr
[80]c;FILE*fp;Fp=fopen“text””w”;Flag=1;Whileflag==1{printf“\nInputstring:\n”;gesstr;fprintffp”%s”str;printf“\nContinue”;c=getchar;ifc==’N’||c==’n’flag=0;getchar;}fcolsefp;fp=fopen“text””r”;whilefscanffp”%s”str!=EOF{forI=0;str[i]!=’\0’;I++ifstr[i]=’a’str[i]=’z’str[i]-=32;printf“\n%s\n”str;}fclosefp;}第一章 C语言程序设计概述-习题答案1算法的描述有哪些基本方法?答
1、自然语言
2、专用工具2C语言程序的基本结构是怎样的?举一个例子说明答
1、C语言程序由函数构成;
2、“/*”与“*/”之间的内容构成C语言程序的注释部分;
3、用预处理命令#include、#define可以包含有关文件或预定义信息;
4、大小写字母在C语言中是有区别的;
5、除main函数和标准库函数外,用户也可以自己编写函数,应用程序一般由多个函数组成,这些函数指定实际所需要做的工作3C语言有什么特点?答
1、具有结构语言的特点,程序之间很容易实现段的共享;
2、主要结构成分为函数,函数可以在程序中被定义完成独立的任务,独立地编译代码,以实现程序的模块化;
3、运算符丰富,包含的范围很广;
4、数据类型丰富;
5、允许直接访问物理地址,即可直接对硬件进行损伤,实现汇编语言的大部分功能;
6、限制不太严格,程序设计自由度大,这样使C语言能够减少对程序员的束缚;
7、生成的目标代码质量,程序执行效率高,同时C语言编写的程序的可移植性好4★指出合法与不合法的标识符命名答AB12--√leed_3--a*b2--×8stu--×D.K.Jon--×EF3_3--√PAS--√if--×XYZ43K2--√AVE#XY--×_762--√#_DT5--×C.D--×5说明下列TurboC热键的功能答F2:源文件存盘F10:调用主菜单F4:程序运行到光标所在行(用于调试程序)Ctrl+F9:编译并链接成可执行文件Alt+F5:将窗口切换到DOS下,查看程序运行结果6说明下列TurboC方式下输入并运行下列程序,记录下运行结果
①main{printf********************\n;printfwelcomeyou\n;printfverygood\n;printf********************\n;}
②main{intabct;printfpleaseinputthreenumbers;;scanf%d%d%dabc;/*教材S是错误的*/t=maxmaxabc;printfmaxnumberis:%d\nt;}intmaxintxinty{intz;ifxyz=x;elsez=y;returnz;}答运行结果********************welcomeyouverygood********************运行结果pleaseinputthreenumbers;314/*左侧下划线内容为键盘输入*/maxnumberis:47一个C程序是由若干个函数构成的,其中有且只能有一个___函数答main8在TurboC环境下进行程序调试时,可以使用Run下拉菜单的___命令或按___键转到用户屏幕查看程序运行结果答
1、Userscreen
2、Alt+F59★C语言对标识符与关键字有些什么规定?答
1、标识符用来表示函数、类型及变量的名称,它是由字母、下划线和数字组成,但必须用字母或下划线开头
2、关键字是一种语言中规定具有特定含义的标识符,其不能作为变量或函数名来使用,用户只能根据系统的规定使用它们10C源程序输入后是如何进行保存的?答是以C为扩展名保存的纯文本文件第二章 C语言程序的基本数据类型与表达式-习题答案1★指出下列常数中哪些是符合C语法规定的答\--×101--×\--×e3--×019--√0x1e--√ab\n--√
1.e5--×2+3e4-2--×
5.2e
2.5--×2请找出下列程序中的错误,改正后写出程序运行结果
①voidmain{intxy=z=5aver;x=7AVER=x+y+z/3printfAVER=%d\naver;}
②voidmain{charc1=a;c2=b;c3=c;inta=
3.5b=Aprintfa=%db=\\end\nab;printfa%cb%c\bc%c\tabc\nc1c2c3;}答main{intxy=5z=5aver;x=7;aver=x+y+z/3;printfAVER=%d\naver;}运行结果AVER=5
②main{charc1=ac2=bc3=c;inta=3b=A;printfa=%db=\%c\\end\\nab;printfa%cb%c\bc%c\tabc\nc1c2c3;}运行结果a=3b=Aend aabccabc3写出下列赋值的结果,表格中写了数值的是要将它赋给其他类型的变量,将所有的空格填上赋值后的数据(实数保留到小数点后两位)int99 -1char h unsignedint 66 float
55.78 longint 68 答int99104665568-1charchB7D unsignedint9910466556865535float
99.
00104.
0066.
0055.
7868.00-
1.00longint99104665568-14★写出程序运行结果
①voidmain{intij;i=8j=10;printf%d%d%d%d\nij++ij++;}
②main{inta=1b=2c=30;;printf%d%d%d%d\na=b=ca=b==ca==b=ca==b==c;}注意a=b=ca=b==c之间应为逗号,教材有误答运行结果911910运行结果30100
③voidmain{inta=10b=20c=30d;d=++a=10||b--=20||c++;printf%d%d%d%d\nabcd;} 答运行结果1119301 5★写出下面表达式的值(设a=10b=4c=5d=1x=
2.5y=
3.5)⑴a%=b%=3⑵n++a+=a-=a*=a⑶floata+c/2+intx%inty⑷a*=b+c⑸++a-c+b++⑹++a-c+++b⑺abx:A⑻b++==c⑼a+b18+b=4*3a/ba%b⑽x+a%3*intx+y%2/4+sizeofint⑾aba:cdc:d⑿b++==c⒀a*=b=c=2⒁a=b==c答⑴0⑵0⑶
9.500000⑷90⑸10⑹10⑺A⑻2⑼
4.5⑽1⑾0⑿20⒀06下列每组表达式中,被执行后结果完全等价的是哪些(设a、b、m是已被赋值的整型变量)?
①m=a=44*5与m=a=44*5
②floata/b与floata/b
③inta+b与inta+b
④m%=2+a*3与m=m%2+a*3
⑤m=1+a=2+b=3与a=2b=3m=1+a+b答
①前面是赋值表达式,而后面的是一个逗号表达式,所以一定不同;
②前面的表达式中a/b结果为一整数,结果已经取整,精度可能受到影响,之后强制float后才为浮点型,后面的是先将a转换为float后再与b相除,其值保证了精度,所以不同
③因为a、b均为整数,其前后两个表达式的计算结果是一致的
④前一表达式是一算术表达式,而后者为一赋值表达式,此为一点不同;另外,前一表达式的m只被赋过一次值,后一表达式中的m曾两次被赋值,第一次赋值时与第一表达式中的值一致,第二次赋值后即不再相同
⑤前后表达式的计算结果应该是一致的a=2b=3m=67条件表达式x0x:-x的功能是什么?答如果x的值是一正数,则表达式的值为x值;如果x的值是一非正数,则表达式的值为-x其实该表达式的值即为x的绝对值,C语言中提供了一个函数fabsx即可完成此功能,该函数包含在math.h头文件中8用一个条件表达式描述从a、b、c中找出最大都赋给max.答max=abcb:ca:bcb:c;9★若x为int型变量,则执行以下语句后x的值为( )x=6;x+=x-=x*x;A.36B.-60C.60D.-24答B.10★若有以下类型说明语句charw;intx;floaty;doublez;则表达式w*x+z-y的结果为( )类型A.floatB.charC.intD.double答D.第三章 顺序结构程序设计-习题答案1变量k为float类型,调用函数scanf%dk,不能使变量k得到正确数值的原因是___答格式修饰符与变量类型不一致因为%d输入的数据类型应该为十进制整数,而k为占用4个字节的float类型变量的地址2★a=1234,b=12,c=34,则执行“printf|%3d%3d%-3d|\nabc;”后的输出是___答|12341234|分析如下
①%3d为右对齐输出变量,且指定输出变量的值宽度为3个字符位,如果变量实际位数小于3,则左端补空格,如果变量实际位数大于3,则按实际长度输出,不受限制
②%-3d为左对齐输出变量,在输出变量时,如是变量实际位数小于3,则在右端补空格,否则按实际输出3★设有“inta=255b=8;”,则“printf%x%o\nab;”输出是___答ff10
①如果“printf%X%o\nab;”则输出为FF,10说明在输出十六进制字母时,其大小写受格式修饰符的限制,如果是“%x”则输出小写,如果是“%X”则输出大写
②如果希望在输出十六进制时输出前导符0x或0X,则以上输出语句应改“printf%#x%o\nab;”为或“printf%#X%o\nab;”本条解释不必须掌握4★以下程序输出的结果是___main{inta1=1a2=0a3=2;printf%d%d%d\na1a1+a2+a3a3-a1;}答1315printf函数中用到格式符%5s,其中5表示输出字符占用5列如果字符串长度大于5,则按___输出;如果字符串长度小于5,则按___输出答
①实际
②左端补空格6★已定义变量如下inta1a2;charc1c2;若要求输入a
1、a
2、c1和c2的值,正确的输入函数调用语句是___答scanf%d%d%c%ca1a2c1c2;7输入两个整型变量a、b的值,输出下列算式以及运算结果___a+b、a-b、a*b、a/b、floata/b、a%b每个算式占一行如a=10,b=5,a+b输出为10+5=15答设inta=10b=5;以下为输出语句及结果
①printf%d+%d=%d\naba+b;10+5=15
②printf%d-%d=%d\naba-b;10-5=5
③printf%d*%d=%d\naba*b;10*5=50
④printf%d/%d=%d\naba/b;10/5=2
⑤printf%floatd/%d=%f\nabfloata/b;float10/5=
2.000000
⑥printf%d%%%d=%d\naba%b;10%5=08★输入一个非负数,计算以这个数为半径的圆周长和面积答#definePI
3.1415926main{floatrlarea;printfInputapositive:;scanf%fr;l=2*PI*r;area=PI*r*r;printfl=%f\tarea=%f\nlarea;}9输入任意一个3位数,将其各位数字反序输出(例如输入123,输出321)答main{intxy;printfInputanumber100-999:;scanf%dx;y=100*x%10+10*x/10%10+x/100;/*注意分析此处算法*/printf%d---%d\nxy;}10★输入任意大小的3个整数,判断其中是否有两个奇数一个偶数若是则输出YES,不是则输出NOT(要求用条件表达式进行判断,不使用if语句)答main{intxyzoddcount=0; /*奇数数计数变量*/printfInputxyz:;scanf%d%d%dxyz;x%2==1oddcount++:0;y%2==1oddcount++:0;z%2==1oddcount++:0;oddcount==2printfYES:printfNOT;}11求前驱字符和后继字符输入一个字符,找出它的前驱字符和后继字符,并按ASCII码值,按从大到小的顺序输出这3个字符及其对应的ASCII码值答本题考查同学们对字符类型数据的认识,如果在ASCII范围内则即可以显示为字符,又可以显示为整数值;无论是否能够显示为字符,字符类型数据是可能参与数值运算的,切记main{charc;printfInputcharacter:;scanf%cc;printf%c-----%d\nc-1c-1;printf%c-----%d\ncc;printf%c-----%d\nc+1c+1;getch;/*为便于调试程序,运行至此程序停顿,此时可以看到运行结果,按任意键程序真难得结束并返回到编辑环境*/}12★输入三角形的边长,求三角形面积(面积=sqrtss-as-bs-cs=a+b+c/2)答#includemath.h/*由于程序中使用了开平方函数sqrt所以需要包含数学头文件*/main{floatabcsarea;intok=0;printfInputabc:;scanf%f%f%fabc;a+bcok++:0;/*以下3条语句为判断是否输入的数据是否构成封闭三角形*/a+cbok++:0;b+caok++:0;ok==3s=a+b+c/2area=sqrts*s-a*s-b*s-cprintfarea=%farea:printferror;getch;}第四章 选择结构程序设计-习题答案1★设x、t均为int型变量,则执行语句“x=10;t=xx10;”后,t的值为___答02★假定所有变量均已正确定义,则程序段inta=0y=10;ifa=0y--;elseifa0y++;elsey+=y;运行后y的值是___;答203★能表述20x30或x-100的C语言表达式是___答x20x30||+x-1004★若有定义语句“inta=25b=14c=19;”,则以下语句执行结果是___ifa=25b=2cprintf***a+b=%da-b=%d***\na+ba-b;elseprintf***a=%db=%dc=%d***\nabc;答***a=25b=14c=19***5★假定i和j为int型变量,则执行以下语句后i的值是___inti=1;switchi{case1:{forj=0;j9;j++i+=j;break;}case2:{forj=1;j10;j++i+=j;break;}case3:i++;}答37分析执行了case1:和case3:中的代码同时case1:语句中的{ }是可以取消的6★以下两条if语句可合并成一条if语句,即___ifa=bx=1;elsey=2;ifabprintf***y=%d\ny;elseprintf***x=%d\nx;答ifa=bprintf***x=%d\nx=1;elseprintf***y=%d\ny=2;7★输入两个字符,若这两个字符的序号(ASCII码)之差为偶数,则输出它们的后继字符,否则输出它们的前驱字符答main{charab;printfInputtwochatacterab:;scanf%c%cab;ifa-b/2==0printf%c%ca+1b+1;elseprintf%c%ca-1b-1;}8★输入整数a和b,如果a能被b整除,就输出算式和商,否则输出算式、整数商和余数答main{intab;printfInputtwointegernumbersab:;scanf%d%dab;ifb!=0a%b==0printf%d/%d=%daba/b;elseprintf%d/%d=%d......%daba/ba%b;}9输入某个点A的平面坐标xy,判断(输出)A点是在圆内、圆外还是在圆周上,其中圆心坐标为22,半径为1答includemath.hmain{floatxyd;printfInputxy:;scanf%f%fxy;d=sqrtx-2*x-2+y-2*y-2;ifd1printfoutside;elseifd1printfinside;elseprintfinside;}10★输入年号和月份,输出这一年该月的天数(一个年份,先判断是否闰年)答main{intymdf;printfInputyearandmonthy-m:;scanf%d-%dym;f=y%4==0y/100!=0||y/400==0;ifm==2d=28+f;/*依据是否闰年决定2月份的实际天数,若是闰年,则f=1,d即为29天*/elsed=31-m==4+m==6+m==9+m==11;/*m==4时其值为1,则本月为30天,典型算法,重要啊*/printf%d-%dis%ddays.\nymd;}11★请将以下语句改写成switch语句(a0)ifa30m=1;elseifa40m=2;elseifa50m=3;elseifa60m=4;elsem=5答switcha/10{case1:case2:case3:m=1;break;case4:m=2;break;case5:m=3;break;case6:m=4;break;default:m=5;}12有一函数x-1-5x0y=xx=0x+10x8编写一程序,要求输入x的值,输出y的值分别用不嵌套的if语句,嵌套的if语句,switch语句编写答使用不嵌套的if语句程序如下main{floatxy;printfInputx:;scanf%fx;ifx-5x0y=x-1;ifx==0y=0;ifx0x8y=x+1;printfy=%f\ny;} 使用嵌套的if语句程序如下main{floatxy;scanf%fx;ifx-5x8ifx0y=x-1;elseifx==0y=0:elsey=x+1;printfy=%f\ny;}mainfloatxy;scanf%fx;ifx8ifx0y=x+1;elseifx==0y=0;elseifx-5y=x-1;printfy=%f\ny;}使用多分支语句程序如下main{floatxy;intm;printfInputx:;scanf%fx;ifx-5x8ifx0m=-1;elseifx==0m=0:elsem=1;switchm{case-1:y=x-1;break;case0:y=0;break;case1:y=x+1;break;}printfy=%f\ny;}以下为假设对int类型的变量进行处理,但毕竟不算完美main{intxy;printfInputx:;scanf%dx;switchx{case-4:case-3:case-2:case-1:y=x-1;break;case0:y=0;break;case1:case2:case3:case4:case5:case6:case7:y=x+1;break;}printfy=%d\ny;}第五章 循环结构程序设计-习题答案1★输入n个整数,求这n个数之中的偶数平均值,并输出答main{intnixsum=0count=0;printfInputn:;scanf%dn;fori=0;in;i++{printfInput[%d]:i+1;scanf%dx;ifx%2==0{sum+=x;count++;}}printfAverageis:%f\nfloatsum/count;getch;}2★输入一串字符,直到输入一个星号(*)为止,统计(输出)其中的字母个数和数字字符个数答#includestdio.hmain{charch;intcharcnt=0numcnt=0;whilech=getchar!=*{ifch=ach=z||ch=Ach=Zcharcnt++;ifch=0ch=9numcnt++;}printfCharactersnumber:%d\nDigitsnumber:%d\ncharcntnumcnt;getch;}3★从键盘输入一个正整数n,计算该数的各位数字之和并输出例如,输入数是5246,则计算5+2+4+6=17并输出答#includestdio.hmain{intnisum=0count=0;printfInputn:;scanf%dn;whilen/10!=0{count++;sum+=n%10;printf%d+n%10;n/=10;}printf=%dsum+n;getch;}4★输入一个字符串,将其中的大写字母改为小写字母,小写字母改为大写字母,然后输出答#includestdio.hmain{charch;printfInputstring:;whilech=getchar!=\n{ifch=ach=zprintf%cch-32;ifch=Ach=Zprintf%cch+32;}getch;}5设某县2000年工业总产值为200亿元,如果该县预计平均年工业总产值增长率为
4.5%,那么多少年后该县年工业总产值将超500亿元答main{floatx=200;intn=0;do{x*=1+
0.045;n++;}whilex500;printfn=%dn;getch;}6★输出1~999中能被3整除,而且至少有一位数字是5的所有数字答main{intxyflag;forx=1;x1000;x++{flag=0;y=x;ify%3==0 /*余数为0说明该数能够被3整除*/{whiley%10!=0{ify%10==5flag=1; /*依个位、十位、百位顺序判断是否余数为5*/y/=10;}ifflag==1printf%d\tx;}}getch;}7求爱因斯坦数学题有一条长阶,若每步跨2阶,则最后剩1阶,若每步跨3阶,则最后剩2阶,若每步跨5阶,则最后剩4阶每步跨6阶,则最后剩5阶每步跨7阶,最后正好1阶答main{intx=0flag=0;while1{x++;ifx%2==1ifx%3==2ifx%5==4ifx%6==5ifx%7==0{printf%dx;break;}}getch;}8输入一个3位数,判断是否是一个“水仙花数”水仙花数是指3位数的各位数字的立方和等于这个3位数本身例如,153=1*1*1+5*5*5+3*3*3答main{intxabc;printfInputnumber:;scanf%dx;a=x/100; /*变量a中记录x的百位数字*/b=x/10%10; /*变量b中记录x的十位数字*/c=x%10; /*变量c中记录x的个位数字*/ifa*a*a+b*b*b+c*c*c==x{printf%d=%d*%d*%d+%d*%d*%d+%d*%d*%d\nxaaabbbccc;printfYES;}elseprintfNOT;getch;}9★计算斐波那契分数序列前n项之和(n是某个常数,波那契分数序列为2/1,3/2,5/3,8/5,...)答main{intin=10;floatf1=1f2=2fsum=0;fori=0;in;i++{sum+=f2/f1;f=f1+f2;f1=f2;f2=f;}printftotal=%d\nsum=%fnsum;getch;}10输入一个正整数,各输出n行的正(倒)三角形宝塔图案答main{intnij;printfInputn:;scanf%dn;fori=0;in;i++{forj=i+1;jn;j++printf;forj=0;j2*i+1;j++printf*;printf\n;}fori=0;in-1;i++{forj=0;ji+1;j++printf;forj=2*i-1;jn+1;j++printf*;printf\n;}getch;}11★输出九九乘法表答main{intij;fori=1;i=9;i++{forj=1;j=i;j++printf%d*%d=%-3djii*j;printf\n;}getch;}12输入一串字符,直到输入一个星号为止,统计(输出)其中的正整数和负整数个数以及所有正整数的平均值和所有负整数的平均值答#includestdio.h#includemath.hmain{charch;intx=0y=1f=0pcnt=0ncnt=0;floatpsum=0nsum=0;whilech=getchar!=*{ifch==-{ifx!=0{iff==1{x=-x;nsum+=x;ncnt++;}else{psum+=x;pcnt++;}printf%d\nx;}f=1;x=0;y=1;continue;}elseifch=0ch=9{x=10*x+ch-0;y=10*y;ifx!=010*xyf=0;continue;}else{ifx!=0{iff==1{x=-x;nsum+=x;ncnt++;}else{psum+=x;pcnt++;}printf%d\nx;}f=0;x=0;y=1;continue;}}ifx!=0{iff==1{x=-x;nsum+=x;ncnt++;}else{psum+=x;pcnt++;}printf%d\nx;}printf\n---------\n;printfPlus:\n;printfCount=%d\npcnt;printfAverage=%f\npsum/pcnt;printf-------\n;printfNegative:\n;printfCount=%d\npcnt;printfAverage=%f\nnsum/ncnt;getch;}13一个整数等于该数所有因子之和,则称该数是一个完数例如,6和28都是完数因为6=1+2+3,28=1+2+4+7+14输出3位数中所有的完数答main{intk1k2k3k4k5k6k7k8k9k10;intians;fora=100;a=999;a++{n=0;/*n累计因子的个数*/s=a;/*s存放未求出的因子之和初值为被测数本身*/fori=1;ia;i++ifa%i==0/*由i到a循环检测i是否为a的因子*/{n++;/*找到一个因子*/s=s-i;/*减去已找到的因子*/switchn/*将找到的因子赋绐k1k
2...*/{case1:k1=i;break;case2:k2=i;break;case3:k3=i;break;case4:k4=i;break;case5:k5=i;break;case6:k6=i;break;case7:k7=i;break;case8:k8=i;break;case9:k9=i;break;case10:k10=i;break;}}ifs==0/*已经找到全部因子*/{printf%dItsfactorsarea;ifn1printf%d%dk1k2;/*n1表示a至少有2个因子*/ifn2printf%dk3;/*注意以下if的用法追加的方法*/ifn3printf%dk4;ifn4printf%dk5;ifn5printf%dk6;ifn6printf%dk7;ifn7printf%dk8;ifn8printf%dk9;ifn9printf%dk10;printf\n;}}getch;}14★编写程序按下列公式计算e的值(精度为1e-6)e=1+1/1!+1/2!+1/3!...+1/n!答main{inti;doublee=0t=1;fori=1;t
0.000001;i++{forj=1;j=i;j++t*=j;t=1/t;e+=t;}printfe=%f\ne;getch;}15用二分法求方程2x3-4x2+3x=0在-1010附近的根二分法先找到a、b,使fa、fb异号,说明在区间ab内一定有零点,然后求f[a+b/2],现在假设fa0,fb0,ab,如果f[a+b2]=0,该点就是零点,如果f[a+b/2]0,则在区间a+b/2b内有零点,按上述方法再求该区间中点的函数值,通过每次把fx的零点所有小区间收缩一半的方法,使区间的两个端点逐步迫近函数的零点,以求得零点的近似值,该值即是方程的根)答#includemath.hmain{doublexfxfafba=-10b=10z=
0.0001;fa=2*a*a*a-4*a*a+3*a;fb=2*b*b*b-4*b*b+3*b;iffa*fb0{do{x=a+b/2;fx=2*x*x*x-4*x*x+3*x;iffx0{a=x;fa=2*a*a*a-4*a*a+3*a;}else{b=x;fb=2*b*b*b-4*b*b+3*b;}}whilefabsfa-fbz;printfTherootis:%lf\nx;}getch;}第六章 函数与编译预处理-习题答案1★写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果两个整数由键盘输入答main{unsignedintmnpq;for;;{printfmn=;scanf%d%dmn;ifm0||n0{printfTheend.\n;break;}p=funpmn;q=funqmn;printfp%d%d=%d\nq%d%d=%d\nmnpmnq;}}intfunpintmintn{inti;ifmn{i=m;m=n;n=i;}fori=m;i0;i--ifm%i==0n%i==0returni;}intfunqintmintn{inti;ifmn{i=m;m=n;n=i;}fori=m;i=m*n;i+=mifi%n==0returni;}2★编写一个函数,由参数传入一个字符串,统计此字串中字母、数字和其他字符的个数,在主函数中输入字符串并显示统计结果答未制作函数,主要利用了选择语句结构#includestdio.hmain{inticzm=0sz=0kg=0qt=0;printfInputastring:;whilec=getchar!=\nifc==kg++;elseifc47c58sz++;elseifc=Ac=Z||c=ac=zzm++;elseqt++;printfam=%dsz=%dkg=%dqt=%d\nzmszkgqt;} 制作函数,利用函数调用#includestdio.hintanalyscharch;main{intizm=0sz=0qt=0c;printfInputastring:;whilec=getchar!=\n{i=analysc;switchi{case1:zm++;break;case2:sz++;break;case3:qt++;}}printfzm=%dsz=%dqt=%d\nzmszqt;}intanalyscharch{ifch=Ach=Z||ch=ach=zreturn1;ifch47ch58return2;return3;}3★按照第5章第8题的要求编写判断水仙花数的函数,从主函数输入正整数n,在主函数中调用判断水仙花数的函数,找出n以内所有的水仙花数【输入一个3位数,判断是否是一个“水仙花数”水仙花数是指3位数的各位数字的立方和等于这个3位数本身例如,153=1*1*1+5*5*5+3*3*3】答main{intxif;printfInputnumber:;scanf%dx;fori=0;i=x;i++{f=0;f=funi;iff==1printf%d\ti;}getch;}intfunintx{intabc;a=x/100;b=x/10%10;c=x%10;ifa*a*a+b*b*b+c*c*c==xreturn1;elsereturn0;}4★定义一个宏,实现将两个数互换,并写出程序,输入两个数作为使用参数,并显示结果答#definefaba=a+bb=a-ba=a-bmain{intxy;printfInputxy:;scanf%d%dxy;printf%d%dxy;fxy;printf--%d%d\nxy;getch;}5已知二阶Fibonacci数列0若n=0Fibn=1若n=1Fibn-1+Fibn-2其它情况定义递归函数求Fibn答main{intin;printfInputn:;scanf%dn;fori=0;i=n;i++printf%d\tfibi;getch;}intfibintn{ifn==0return0;elseifn==1return1;elsereturnfibn-1+fibn-2;}6定义函数求F=n+m!+n!,m、n均为任意正整数要求使用递归调用答longintfintx;main{intimn;longintsum;printfInputmn:;scanf%d%dmn;sum=fn+m+fn;printf%ldsum;getch;}longintfintx{intij;ifx==0||x==1return1;elsereturnx*fx-1;}7★定义一个函数完成第5章第11题的功能【输出九九乘法表】答main{fun;getch;}fun{intij;fori=1;i=9;i++{forj=1;j=i;j++printf%d*%d=%-3djii*j;printf\n;}}8如果有两个数,每一个数的所有约数(除了它本身以外)的和正好等于对方,则称这两个数为互满数,求出30000以内所有的互满数,并显示输出,求一个数它的所有约数(除了它本身以处)的和,用函数实现答main{intxy;forx=1;x30000;x++{fory=1;yx;y++{iffacsumx==yfacsumy==x{printf%d%d\txy;}}}getch;}facsumintn{intisum=0;fori=1;in;i++{ifn%i==0sum+=i;}returnsum;}9编写以下函数
①输入职工的姓名和职工号;
②按职工号由小到大排序,姓名顺序也随之调整;
③输入一个职工号,找出该职工的姓名在主函数中调用这些函数答 10★设计程序完成下列计算已经y=fxn/fx+
2.3n+fx-
3.2n+3其中fxn=1-x2/2!+x4/4-...+-1nx2n/2n!n≥0当 x=
5.6n=7时,求y要求通过嵌套调用完成计算答#includestdio.hfloatffloatxintn;floatf1floatxintm;floatf2intm;main{floatx=
5.6y;intn=7i;y=1+fxn/fx+
2.3n+fx-
3.2n+3;printfy=%f\n\ny;}floatffloatxintn{floatsum=
0.0;inti;fori=1;i=n;i++{sum+=f1-1i*f1x2*i/f22*i;}returnsum;}floatf1floatxintm{inti;floaty=
1.0;fori=1;i=m;i++{y*=x;}returny;}floatf2intm{inti;floaty=1;fori=1;i=m;i++{y*=i;}returny;}第七章 数 组-习题答案1★以下各题中,选择一个正确的答案
1、能正确对一维数组a中所有元素进行初始化的是 A.inta
[5]={}B.inta[]={0}C.inta
[5]=00000D.inta
[5]={0}
2、有说明intk=3a
[10];则下列可以正确引用数组元素的表达式是A.a[k]B.a
[10]C.a
[13]D.a[3*5]
3、有定义intd[]
[3]={123456};执行语句printf%cd
[1]
[0]+A;结果是 A.AB.BC.DD.E
4、有定义charc=Ach
[20]={abc\0d\0};若执行printf%sch;结果是A.abcB.abcC.abcdD.abc\0d
5、对数组进行初始化 charcarr[]={student}barr[]=student;则正确的是 A.carr与barr长度相同 B.carr比barr长C.carr与barr相同D.carr比barr短答
1、BD
2、A
3、D
4、B
5、D2★阅读下列程序,写出程序的执行结果
1、#includestdio.h#includestring.hvoidmain{intijtempd
[4]
[4]={{1234}{5678}{4321}{1234}};fori=0;i4;i++forj=0;ji;j++ifd[i][j]d[j][i]d[j][i]=d[i][j];fori=0;i4;i++{printf\n;forj=0;j4;j++ifj=iprintf%6dd[i][j];elseprintf%c;}}
2、若输入十进制数3291时,下列程序输出为#includestdio.hvoidmain{intidmn;chars
[8];scanf%dn;i=0;/*i是用来存放转换后的数组元素下标*/do{m=n/8;d=n%8;s[i]=0+d;i++;n=m;}whilen!=0;fori--;i=0;i--putchars[i];/*反向输出字符*/}答
1、
15446782342、63333★程序填空在___处填写合适的语句,完善下列程序
1、从键盘输入一个数,将其插入到一个升序数组中,保持数组仍然按升序排列#includestdio.hvoidmain{intdatatempk;staticinta
[9]={-1024810152550};printf\nEnteradata:;scanf%ddata;______
①_____;fork=8;____
②____;k--ifa[k]a[k-1]{______
③______;a[k]=a[k-1];a[k-1]=temp;}else______
④______;fork=0;__
⑤__;k++printf%7da[k];}
2、从键盘输入一串英文字符(不含空格与其他字符),统计每个字符的个数,并输出字母及相应的个数#includestring.h#includestdio.h/*本行代码教材中应该加上,因为程序中有putchar*/voidmain{inti=0c
[52]={0}m=0;charstr
[80];printfInputastring:;scanf___
①___str;whilestr[i]{ifstr[i]=A____
②___c[str[i]-A]++;ifstr[i]=astr[i]=z_____
③____;i++;}fori=0;i26;i++ifc[i]{ifm%8==0putchar\n;m++;printf%c:%-di+Ac[i];}fori=0;i26;i++ifc[i+26]{ifm%8==0putchar\n;m++;printf%c:%-d____
④___c[i+26];}}答
1、
①a
[8]=data
②k=1
③temp=a[k]
④break
⑤k=
82、
①%s
②str[i]=Z
③c[str[i]-a+26]++
④i+A4★求一组成绩的平均分数以及高于平均分的成绩,设给定的成绩为908592778062答main{intscore
[6]={908592778062};intisum=0;floataver;fori=0;i6;i++sum+=score[i];aver=sum/
6.0;printf\nAverage:%f\naver;printfHighscore:;fori=0;i6;i++ifscore[i]averprintf%d\tscore[i];}5★编写程序,输入一组整数,将它们排序后由小到大输出【提示】假设为具有10个元素的正整数数组;外层循环从数组的第一个元素开始选取;内层循环从外层循环选定的元素下一个元素开始选取,依次与外层循环选定的元素进行比较,将小者放入外层循环选定的元素中答#defineN10main{inta[N]ijt;fori=0;iN;i++ /*提示并为数组元素赋值*/{printf\nInputa[%d]:i;scanf%da[i];}fori=0;iN;i++ /*外层选定待比较元素位置*/{forj=i+1;jN;j++ /*选定后续需要比较之元素位置*/{ifa[i]a[j]{t=a[i];a[i]=a[j];a[j]=t;}}printf%d\ta[i]; /*输出已更新为较小值之外层选定元素*/}}6从键盘输入一个4×4整数矩阵,以主对角线\为对称轴,将左下角元素中较大元素代替右上角对应元素,将右上角含对角线元素输出【提示】a
[0]
[0]a
[0]
[1]a
[0]
[2]a
[0]
[3]a
[1]
[0]a
[1]
[1]a
[1]
[2]a
[1]
[3]a
[2]
[0]a
[2]
[1]a
[2]
[2]a
[2]
[3]a
[3]
[0]a
[3]
[1]a
[3]
[2]a
[3]
[3]答#defineM4main{inta;intijkt;printfInputintegernumber:\n;fori=0;iM;i++/*用两层循环为二维数组元素赋值*/forj=0;jM;j++{printfa[%d][%d]=ij;scanf%da[i][j];}fori=0;iM;i++/*用两层循环将数组以矩阵形式在屏幕输出*/{forj=0;jM;j++{printf%d\ta[i][j];}printf\n;}printf-----------\n;/*分隔线*/fori=0;iM;i++/*选定矩阵待处理的当前行*/{forj=0;jM;j++/*将左下角元素中较大元素代替右上角对应元素*/{ifa[j][i]a[i][j]{t=a[j][i];a[j][i]=a[i][j];a[i][j]=t;}}forj=i;jM;j++/*将函对角线的右上角元素输出*//*本循环为将第i行第i列开始的右侧元素输出*/{printf%d\ta[i][j];}printf\n;fork=0;ki+1;k++printf\t;/*保证显示数据正确位置*/}getch;}【运行结果】a
[0]
[0]=1a
[0]
[1]=2a
[0]
[2]=3a
[0]
[3]=4a
[1]
[0]=5a
[1]
[1]=6a
[1]
[2]=7a
[1]
[3]=8a
[2]
[0]=9a
[2]
[1]=10a
[2]
[2]=11a
[2]
[3]=12a
[3]
[0]=13a
[3]
[1]=14a
[3]
[2]=15a
[3]
[3]=1612345678910111213141516-----------15913610141115167通过键盘给3×4的二维数组输入数据,然后分别按行和按列输出数组元素答#defineM3#defineN4main{inta[N]ij;printfInputintegernumber:\n;fori=0;iM;i++/*外层选定数组元素左维*/forj=0;jN;j++/*内层选定数组元素右维*/{printfa[%d][%d]=ij;/*提示输出元素位置*/scanf%da[i][j]; /*为指定元素赋值*/}printf\nOutbyrow:\n; /*按行输出数组元素值*/fori=0;iM;i++forj=0;jN;j++printf%da[i][j];printf\nOutbycollum:\n;/*按列输出数组元素值*/fori=0;iN;i++forj=0;jM;j++printf%da[j][i];getch;}【运行结果】Inputintegernumber:a
[0]
[0]=1a
[0]
[1]=2a
[0]
[2]=3a
[0]
[3]=4a
[1]
[0]=5a
[1]
[1]=6a
[1]
[2]=7a
[1]
[3]=8a
[2]
[0]=9a
[2]
[1]=10a
[2]
[2]=11a
[2]
[3]=12Outbyrow:123456789101112Outbycollum:1592610371148128编写程序,将两个字符串连接起来,不要使用strcat函数答#includestring.hmain{charstr1
[80]str2
[80];inti=0l1;printfInputstr1:;getsstr1; /*若换成scanf%sstr1;后面应该增加fflushstdin;函数语句*/printfInputstr2:;getsstr2;l1=strlenstr1;/*计算字符串1的长度*/whilestr2[i]{str1[l1+i]=str2[i];i++;}str1[l1+i]=\0;/*字符串连接后,不能忘记追加一个字符串结束符*/putsstr1;/*可换成语句printf%sstr1;*/getch;}9输入一行字符串,统计该字符串中字符对ab的个数答#includestring.hmain{charstr
[80];inti=0count=0;printfInputstring:;getsstr;whilestr[i]{ifstr[i]==astr[i+1]==b{count++;i+=2;/*如果在当前i的位置找到一对,则i越过b个字母*/}elsei++; /*如果在当前i的位置未找到,则i指向下一个字母*/}printf%dcount;getch;}10从键盘输入10个字符串,找出一个最长的字符串答#includestring.hmain{charstr
[10]
[80];/*设置二维字符数组,每一维可以记录最大79个字符的字符串*/intilenk
[10]n=0max=0;printfInput10strings:\n;fori=0;i10;i++ /*向str数组输入10个字符串*/{printfString%d=i+1;getsstr[i];len=strlenstr[i];/*计算输入之字符串之长度*/iflenmax{max=len;n=0;k[n]=i;}/*记录最长字符串的长度、个数、在数组位置行*/elseiflen==maxk[++n]=i;/*与已记录最大长度相同时,记录其在数组中位置行*/}ifn==0/*此时说明只有一个最大长度字符串,是str[k
[0]*/{printfThelongeststringisString%d:k
[0]+1;/*输出其序号*/putsstr[k
[0]];}else/*此时说明有不止一个最大长度字符串时需要处理的复合语句*/{printfNotonlyone!\n;fori=0;i=n;i++/*分别输出各序号、字符串*/{printfTheseareString%d:k[i]+1;putsstr[k[i]];}}getch;} 11已知数组a中有m个按升序排列的元素,数组b中有n个按降序排列的元素,编程将a与b中的所有元素按降序存入数组c中【提示】将a中的元素最大值与b中元素最大值相比,将最大值存入c数组中,然后调整c、a或b元素指针地址,依次重复前序工作,即可答#defineM3#defineN7main{inti=0j=0n=0c[M+N]a
[3]={1027543}b
[7]={30021017396553413};intmaxamaxb;do{maxa=a[M-i-1];maxb=b[j];ifmaxamaxb{c[n++]=maxa;/*将a中最大元素赋值给c数组当前元素,并调整c新元素位置*/i++;/*调整a中元素位置*/}else{c[n++]=maxb;/*将a中最大元素赋值给c数组当前元素,并调整c新元素位置*/j++;/*调整b中元素位置*/}printf%dc[n-1];/*打印输出c中新赋值元素数据*/}whilenM+N;/*未为数组c赋值结束时继续以上步骤--执行循环体*/getch;}第八章 指 针-习题答案1★选择题
1、若函数f定义如下 voidfchar*dchar*s;{while*d++=*s++;}函数f的功能是A.串比较B.串复制C.求串长 D.串反向
2、有定义intarr
[10]={0123456789}*pi=2;若执行语句p=arr;pritnf%d*p+i;输出结果为A.0 B.2C.3D.1★
3、有定义inttd[]
[3]={123456};以下几种方法中,不能正确表示i行j列元素的是 A.td[i][j]B.*td[i]+jC.**td+i+j D.*td+i-j 本题不要求掌握答
1、B
2、B
3、D2★写出下列程序的运行结果
1、voidmain{inta*p1*p2;a=10;p1=a;p2=p1;printfTheValueis%d||%d||%d\na*p1*p2;*p1=11;printfTheValueis%d||%d||%d\na*p1*p2;}
2、若输入字符串program时,写出下列程序输出结果#includestdio.hvoidmain{charstr
[80];voidprocharchar*stcharch;scanf%sstr;procharstrr;putsstr;}voidprocharchar*strcharch{char*p;forp=str;*p!=\0;p++if*p==ch{*str=*p;*str++;str++;}*str=\0;}答
1、TheValueis10||10||10TheValueis11||11||
112、ss3★填空题
1、下面程序完成从键盘输入两个字符串a和b,再将a和b的对应位置字符中的较大者存放在数组c中,填空完善该程序#includestdio.h#includestring.hvoidmain{intk=0;chara
[80]b
[80]c
[80]={\0}*p*q;p=a;q=b;getsa;getsb;while_____
①_____{if____
②____c[k]=*p;elsec[k]=*q;p++;______
③______;k++;}/*本题教材有误,少了此处的右大括号*/if*p!=0strcatcp;elsestrcatcq;putsc;}
2、以下程序从键盘输入10个不相同的数到数组a中,再输入一个数到x中,在a中查找与x值相同的元素所在的位置,填空完善该程序#includestdio.hvoidmain{inta
[11]xi;printfInput10integers:\n;fori=1;___
①___;i++scanf%d____
②___;printfInputx:;scanf%dx;*a=x;i=10;whilex!=*a+i_____
③_____if_____
④_____printf%6dspositionis:%3d\nxi;elseprintf%6dNotbefound!\nx;/*bee应为be,教材有误,小case*/}答
1、
①*p!=\0*q!=\0
②*p*q
③q++
2、
①i11
②a[i]
③i--;
④i04编写函数fun,函数的功能是,从字符串中删除指定的字符同一字母的大、小写按不同字符处理例如,程序执行时输入字符串为turbocandborlandc++,从键盘输入字符n,则输出后变为turbocadborladc++如果输入的字符在字符串中不存在,则字符串照原样输出【提示】答#includestring.hmain{chars
[80]*pstr=schdel;printfInputsourcestring:;getspstr;printfCharacteryouwantdelete:;scanf%cchdel;funpstrchdel;printfAfterdeleted:;putspstr;getch;}intfunchar*scharch{intij;fori=0j=0;s[i];i++ifs[i]!=chs[j++]=s[i];s[j]=0;}5编程将从键盘输入的每个单词的第一个字母转换为大写字母,输入时各单词必须用空格隔开,用“.”结束输入【提示】答【解法一】#includestdio.hintfunchar*p;main{inti=0;charchstr
[80];printfInputstringendby.:\n;whilech=getchar!=.str[i++]=ch;str[i++]=.;str[i]=\0;funstr;putsstr;getch;}intfunchar*p{intflag=1;while*p!=\0{if*p==flag=1;if*p=a*p=zflag==1{*p-=32;flag=0;}p++;}}【解法二】#includestdio.hmain{intflag=1;charch;printfInputstringendby.:\n;do{ch=getchar;flag=funchflag;putcharch;}whilech!=.;printf\n;}funchar*cintf{if*c==return1;else{iff*c=z*c=a*c-=32;return0;}}6从键盘输入8个数,用选择法按由大到小的顺序排列并输出,要求用指针实现【提示】答#includestdio.h#includestring.hmain{intdata
[80]i*p1*p2temp;p1=data;printfInput8numbers:;fori=0;i8;i++scanf%dp1++;forp1=data;p1data+8-1;p1++forp2=p1+1;p2data+8;p2++if*p1*p2{temp=*p1;*p1=*p2;*p2=temp;}fori=0p1=data;i8;i++p1++printf%6d*p1;getch;}7从键盘输入一个字符串,编写一个函数,将此字符串中从第m个字符开始的n个字符复制成另一个字符串答#includestring.h#includestdio.hmain{charstr1
[80]str2
[80];intmnlen;printfInputstring:;len=strlengetsstr1;printfInputmn:;scanf%d%dmn;ifmlen||nlen-m{printfmnerror!;exit0;}elsefunstr1str2mn;putsstr2;getch;}funchar*schar*pintxinty{inti;fori=0;iy;i++p[i]=*s+x+i-1;}8输入8个整数,将其中最大的数与第一个数对换,最小的数与最后一个数对换答main{inta
[8]i*pmaxmint;max=min=0;p=a;printfInput8numbers:;fori=0;i8;i++scanf%da[i];fori=1;i8;i++if*p+i*p+minmin=i;ifmin!=7{t=*p+7;*p+7=*p+min;*p+min=t;}fori=1;i8;i++if*p+i*p+maxmax=i;ifmax!=0{t=*p+0;*p+0=*p+max;*p+max=t;}forp=a;pa+8;p++printf%d\t*p;getch;}9输入n个整数排序并输出要求将排序单独写成一个函数,n个整数在主函数中输入,排序结果在主函数中输出,用指针实现【仍有问题】答#includestdio.hsortint**pintn{int*tij;fori=0;in-1;i++{forj=i+1;jn;j++{if**p+i**p+j{t=*p+i;*p+i=*p+j;*p+j=t;}}}}main{inti=0n**p;printfPleaseinputcountofnumbers:\n;scanf%dn;fori=0;in;i++{printfThe%dnumber:i+1;scanf%d*p+i;}printf\nTheresultis:\n;sortpn;fori=0;in;i++{printf%d**p+i;}getch;} 10输入一个字符串,内含数字和非数字字符,如gs423cd1567896df12345,将其中连接的数字作为一个整数,依次存放到数组a中,例如,423放入a
[0],156放入a
[1],…统计其共有多少个整数,并输出这些数答未做#includestring.hmain{charstr
[10]
[80];/*设置二维字符数组,每一维可以记录最大79个字符的字符串*/intilenk
[10]n=0max=0;printfInput10strings:\n;fori=0;i10;i++ /*向str数组输入10个字符串*/{printfString%d=i+1;getsstr[i];len=strlenstr[i];/*计算输入之字符串之长度*/iflenmax{max=len;n=0;k[n]=i;}/*记录最长字符串的长度、个数、在数组位置行*/elseiflen==maxk[++n]=i;/*与已记录最大长度相同时,记录其在数组中位置行*/}ifn==0/*此时说明只有一个最大长度字符串,是str[k
[0]*/{printfThelongeststringisString%d:k
[0]+1;/*输出其序号*/putsstr[k
[0]];}else/*此时说明有不止一个最大长度字符串时需要处理的复合语句*/{printfNotonlyone!\n;fori=0;i=n;i++/*分别输出各序号、字符串*/{printfTheseareString%d:k[i]+1;putsstr[k[i]];}}getch;}OVER。