《[信息与通信]C语言程序设计汇编.doc》由会员分享,可在线阅读,更多相关《[信息与通信]C语言程序设计汇编.doc(33页珍藏版)》请在三一办公上搜索。
1、C语言程序设计汇编分支、循环结构一、程序分析题1阅读程序,写出运行结果。main()inta10,b4,C3;if(ab) ab;if(aC) aC;printf(d,d,dn,a,b,c);【解】程序中,第一个if语句if(ab)ab,当ab时,让b值置a,该语句确保a的值不比b小。同样第二个if语句if(ac)ac,当ac时,让c值置a,使a的值不比c小。实际;情况是a本来就比b和c都大,所以a的值没有变,程序输出a、b和c的原来值:10,4,3。=2阅读下列程序,写出程序的输出结果。main()intx=100,a10,b20,Ok15,Ok20;if(ab)if(b!15)if(!Ok
2、1)x1;elseif(ok2)x10;elsex-l;printf(dn,x);【解】程序预置变量x的值为100,a的值为10,b的值为20,ok1为5,Ok2为0。程序中给出的if语句可以写成更结构化的形式如下:if(ab)if(b!15)if(!Ok1)x1;elseif(Ok2)x10;elsexl; 由于条件ab成立,并且条件b!=15也成立,而ok1不等于0,执行else后的语句。又因ok2等于0,执行else后的语句赋-1给x。所以程序输出一l。=3阅读下列程序,写出程序的输出结果。 main()inty9;for(;y0;y-)if(y3=0)printf(”d”,-y);co
3、ntinue; 【解】循环前,变量y的值为9,其中的循环语句在y大于0情况下循环,每次循环后y的值减1。循环体是当y能被3整除时输出表达式-y,输出的是减1后的y值。这样,第一次循环因y为9,能被3整除,输出8,y也变成8。又经两次循环,y的值变为6,又让y减1变成5,并输出5;又经两次循环,y的值变成3,让y减至变成2,输出2;再经两次循环后,y的值变成0,结束循环。所以程序输出852。二、程序设计题1编一个程序,输入华氏温度(F),按下列公式计算并输出对应的摄氏温度(C):C5(F32)9【解】利用公式:C5(F32)9,输入F氏温度,计算并输出对应的C氏温度,程序要引入两个变量,分别用于
4、存储F氏温度和C氏温度,计算时应采用浮点型,包括公式中的常数也应写成浮点数,不能采用整型和把常数写成整数。因采用整型编写,公式中的除运算变成整除,会得出与实际要求不一致的结果。程序如下:includemain()floatf,c;/*变量定义*/printf(”输入F氏温度”);scanf(”f,f);c5.0*(f32.0)9.0;printf(”对应的C氏温度6.2fn”,c);=2编一个程序,输入一个整数,输出其符号(若0,输出1;若0输出-1)。【解】程序可用if语句判断输入数的符号,并控制输出1或-l。程序如下:includemain()intc;*变量定义*printf(输入一个整
5、数);scanf(”d”,c);if(C0)printf(1n);elseprintf(-ln);=3编一个程序,输入X的值,按下列公式计算并输出y的值。X(Xl)y2xl(lx10)3X-11(10X)【解】输入x,按公式计算y。这可用一个嵌套的if语句分段判断并计算出y的值。然后输出y值。程序如下:includestdiohmain()intx,y;*变量定义*printf(”输入一个整数”);scanf(”d”,x);if(xl)yX;elseif(x10)y2*xl;elsey3*X11;printf(”y%dn”,y);=4编一个程序,输入三个单精度数,输出其中最小数。【解】设最小数
6、存于变量min中,为求三个数中的最小数,可分以下多步完成,先预置min为x,然后分别将其余两个数逐一与min比较,当它们中的某个值比存于min中的值更小时,就用它们更新min。写出程序如下:includemain()floatX,y,Z,min;/*变量定义*/printf(输入三个单精度浮点数);scanf(%f%f%f,&x,&y,&Z);minx;if(miny)miny;if(minZ)minZ;printf(浮点数%f,%f,%f中的最小值是%fn,X,y,Z,min);=5编一个程序,求出所有各位数字的立方和等于1099的3位数。【解】找出所有各位数字的立方和等于1l99的3位整数
7、。3位整数是100至999范围内的整数,设分别用a,b,c存储3位数的百位、十位和个位的数字,程序用三重循环求出a,b,c的立方和为1099的3位数a*100+b*10c。程序如下:includemain()inta,b,c;/*变量定义*/for(a1;a=9;a+)for(b0;b=9;b+)for(c0;c9;c+)if(a*a*a+b*b*b+c*c*c=1099)printf(%dn,(10*ab)*10c);若用一个变量i表示3位数,循环体将3位数变量i分拆出它的百位、十位和个位共3个数字,然后判这三个数字的立方和是否是1099,若是就输出该变量的值。程序如下:includemai
8、n()inti,a,b,c;/*变量定义*/for(i100;i=999;i+)ai/100;b(i%100)/10;/*或b(i/10)%l0*/c=i%10;if(a*a*a+b*b*b+c*c*c=1099)printf(%dn,i);=6编一个程序,输入10个整数,统计并输出其中正数、负数和零的个数。【解】输入10个整数,统计其中正数、负数和零的个数。程序引入3个计数器变量,用于统计大于以小于0和等于0的整数的个数。开始时,这3个计数器都置0,然后用循环逐一输入10个整数,并判定当前输入的整数是大于0,或小于0,或等于0,并按判定结果累加相应计数器。最后,程序输出这3个计数器的值。程序
9、如下:#includemain()inti,d,n,z,p;/*变量定义*/nZp0;for(i1;i=10;i+)print(输入第%d个整数,i);scanf(%d,&d);if(d0)p+;elsez+;printf(负数有%d个,正数有%d个,零有%d个。n,n,p,z);=7编程序,按下列公式计算e的值(精度为1e6):e1+1/1!+1/2!+1/3!+1/n!+【解】按e的幂级数展开式计算e的值。这是典型的求级数和计算问题。通常采用逐项计算,并累计的方法。计算新的项时,可用上一轮循环计算出的项,这能提高程序的效率。循环直至当前项的值小于精度要求结束。程序如下:#includema
10、in()doublee,t,i;/*变量定义*/e0.0;t=1.0;i1.0;while(t1.0e-6)e+t;t/=i;i+=1.0;printf(”e%.6fn”,e);=8编程序,按下列公式计算y的值(精度为1e6):y=1/r*r+1【解】按所给公式计算数列的和。类似上一小题的解,逐项计算并累计。程序如下:#includemain()doubley,r,t;/*变量定义*/y0.0;r1.0;while(t=1.0/(r*r+1.0)=1.0e-6)y+=t;r+=1.0;printf(y=%.6fn,y);=9编一个程序显示ASCII代码0x20至ox6f的十进制数值及其对应字符
11、。【解】显示ASCII代码为十六进制0x20至ox6f的字符的十进制代码值与其字符。程序可用一个循环,让变量i顺序地取0X20至OX6f的值,并逐一输出其十进制代码和对应的字符,程序如下:#includemain()inti,k0;for(i=0x20;i=0x6f;i+)if(k+%10=O)/*每行十个*/printf(n);printf(%3d(%C),i,i);printf(n);=10用三种循环语句分别编写程序显示1至100的平方值。【解】用三种循环语句分别编写显示1至100的平方值的程序。直接写出3个程序如下:(1)用输循环实现的程序#includemain()/*用for循环*/
12、inti,k0;for(il;i=100;i+)if(k+%5=0)/*每行五个*/printf(n);printf(%3d*%3d%5d,i,i,i*i);printf(n);(2)用while循环实现的程序#includemain()/*用while循环*/inti,k=0;i=1;while(=100)if(k+%5=0)/*每行五个*/printf(n);printf(%3d*%3d%5d,i,i,i*i);1+;printf(n);(3)用do-while循环实现的程序#includemain()/*用do-while循环*/inti,k0;i=1;doif(k+%5=0)/*每行五
13、个*/printf(n);printf(%3d*%3d%5d,i,i,i*i);1+;while(=100);printf(n);数组一、程序分析题1阅读程序,写出程序运行结果。,main()staticinta39,7,5,3,l,2,4,6,8;inti,j,sl0,s20;for(i0;i3;i+)for(j0;j3;j+)if(ij)s1s1aij;if(i+j2)s2s2aij;printf(%dn%dn,sl,s2);【解】已知数组。共有3行3列席一行依次是9,7,5;每二行是3,1,2;第三行是4,6,8。程序引用数组元素的游标变量是i和j,外循环控制变量i是数组的行下桥,内循环
14、控制变量j是数组的列下标。循环体的工作是将数组的某些元素累计到sl,某些元素累计到S2。将行下标i和列下标j相同的元素累计到sl,sla00al1a22。将行下标i与列下标j的和为2的元素累计到s2,s2a02alla20。所以sl是18,s2是10。程序输出:1810=2说明下列程序的功能。main()inti,j;floata33,b33,x;for(i0;i3;i+)for(j0;j3;j+)scanf(%f,&x);aijx;for(i0;i3;i+)for(j0;j3;j+)bjiaij;for(i=0;i3;i+)printf(n);for(j0;j3;j+)printf(%f,b
15、ij);printf(n);【解】程序第一段两重循环,实现按行顺序输入数组a的全部元素的值。程序第二段两重循环是将数组a转置复制到数组b。程序第三段两重循环实现按行输出数组b的全部元素。所以程序的功能是按行顺序输入3*3二维数组的全部元素,然后按列顺序输出。=3写出下列程序的运行结果。main()staticchara*,*,*,*,*,*;inti,j,k;for(i0;i5;i+)printf(n)for(j0;ji;j+)printf(%c,);for(j0;j5;j+)printf(%c,ak);printf(n);【解】程序的外循环控制循环五次,每次开始先输出一个换行符,共输出5行信
16、息。对于i(自0开始计算)行,先输出i个空白符,接着输出字符数组a中的五个字符,由于a中的五个字符都是字符。,所以输出五个*字符。这样程序是输出以下形式的图案:*=4说明下列程序的功能。main()inti,j;floata33,b33,c33,x;for(i0;i3;i+)for(j=0;j3;j+)scanf(%f,&x);aij=x;for(i0;i3;i+)for(j0;j3;j+)scanf(%f,&x);bijx;for(i0;i3;i+)for(j0;j3;j+)cijaijbij;for(i0;i3;i+)printf(n);for(j0;j3;j+)printf(%f,cij
17、);printf(n);【解】程序第一段的功能是按行顺序输入数组a的元素。程序第二段的功能是按行顺序输入数组b的元素。程序第三段的功能是顺序累加数组a和数组b的对应元素,并将和存于数组C的对应元素中。最后,按行顺序输出数组C的全部元素。二、程序设计题1编程序,输入单精度型一维数组a10,计算并输出a数组中所有元素的平均值。【解】为了计算数组元素的平均值,首先要累计它的全部元素的和,然后除以数组元素的个数,即得数组元素的平均值。写成C程序如下:#includemain()inti,n10;floats,a10;printf(Enter%dnumbers!n,n);for(i=0;in;i+)sc
18、anf(%f,&s);ai=s;for(s=0.0,i=0;in;i+)s+=ai;s/n;printf(平均值是%.2fn,s);=2编程序,输入10个整数存入一维数组,再按逆序重新存放后再输出。【解】将数组的元素逆序重新存放,就是将数组的首尾对应元素两两交换。简单地可用两个游标变量i和j,i是前端元素的下标,j是后端元素的下标,交换以这两个变量值为下标的数组元素。开始时,i的值为0,j的值为末元素的下标。每次交换后,i增1,j减1。继续交换的条件是ij。程序如下:#includemain()inta10,i,j,t,n10;printf(Enter%dnumbers!n,n);for(i0
19、;in;i+)scanf(%d,&ai);for(i=0,jn-1;ij;i+,j-)tai;aiaj;ajt;for(i0;in;i+)printf(%dt,ai);printf(n);=3编程序,输入两个字符串(40个字符),连接后输出(不准用系统函数)。【解】将字符串s2连接到字符串s1的计算过程可分两个步骤完成。首先找到字符串s1的末尾,然后参照字符串s2,将字符串s2的全部有效字符逐一复制到字符串s1,最后在字符串s1的末尾接上字符率结束标记符。完整程序如下:#include#defineN40main()chars1N,s2N;inti,j;printf(Enterstringl!
20、n);scanf(%s,s1);printf(Enterstring2!n);scanf(%s,s2);for(i0;sli!0;i+);for(j0;s2j!0;i+,j+)soisj;s1i0printf(sl%sn,sl);=4编程序按下列公式计算S的值(其中X1、X2、Xn由键盘输入):s(xi-x0)(xi-x0)(其中x0是X1、x2、Xn的平均值)【解】输入数组x的n个元素的值,按公式计算。程序首先输入n,设n100,然后输入n个数据,接着求它们的平均值,最后按计算公式求出s,并输出。程序如下:#include#defineN100main()doublexN+1,s;inti,
21、n;doprintf(Entern(100);scanf(%d,&n);while(=100);for(i=1;i=n;i+)scanf(%lf,&s);xis;for(s0.0,i1;i=n;i+)s+=xi;x0s/n;for(s0.0,i=1;i=n;i+)s+=(xi-x0)*(xix0);printf(s=%fn,s);=5输入一个3X5的整数矩阵,输出其中最大值、最小值和它们的下标。【解】输入一个二维数组,寻找二维数组的最大值和最小值。其中寻找最大值和最小值的工作可用两重循环实现,即按行按列考察二维数组的元素。程序如下:#includemain()inta35,i,j,t,n3,m
22、5,min,max,minrow,mincol,maxrow,maxcol;printf(Enter%d*%dnumbers!n,n,m);for(i0;in;i+))for(j0;jm;j+)scanf(%d,&t);aijt;minmax=a00;minrowmincolmaxrow=maxcol=0;for(i0;in;i+)for(j0;jmax)max=aij;maxrow=i;maxcol=j;if(aijmin)minaij;minrow=i;mincolj;printf(MAXa%d%d%dMINa%d%d%dn,maxrow,maxcol,max,minrow,mincol,
23、min);=6输入一个字符串,将其中的所有大写字母改为小写字母,而所有小写字母全部改为大写字母,然后输出。【解】程序先输入字符率,然后顺序考察输入字符串中的字符,当发现是大写字母时,将它改写成对应的小写字母,而当它是小写字母时,就将它改写成对应的大写字母。若变量ch中的字符是大写字母,则与它对应的小写字母的表达式可以写成ch-Aa;类似地,若变量ch中的字符是小写字母,则与它对应的大写字母的表达式可以写成chaA。完整程序如下:#include#defineN200main()charsN;inti;printf(Enterstring!n);scanf(%s,s);for(i0;si!0;i
24、+)if(si=A&si=a&si=z)sisiaA;printf(s%sn,s);=7设某班50名学生的三科成绩表如下:课程一课程二课程三.试编一个程序,输入这50个学生的三科成绩,计算并输出每科成绩的平均分。【解】程序定义一个50行3列的二维数组,用于存储全班学生的成绩。程序顺序输入各个学生的三科成绩,然后按列的顺序,累计各科总分,并计算平均分。完整程序如下:#include#defineN50#defineM3main()intscoreNM,i,j,t;doubleaM;printf(Enterscores!n);for(i0;iN;i+)for(j0;jM;j+)scanf(%d,&
25、t);scoreijt;for(j0;jM;j+)aj0.0;for(j0;jM;j+)for(i0;iN;i+)aj+=scoreij;aj/N;for(j0;jM;j+)printf(课程%d的平均分是%.2fn,j+1,aj);=8编一个程序,输入一个整型数据,输出每位数字,其间用远号分隔。例如,输入整数为2345,则输出应为:2,3,4,5。【解】程序的主要工作是从输入整数分拆出它的十进制整数的各位数字,将分拆出来的各位数字存于数组中,然后将这些数字自高位到低位的顺序逐位输出。要将一个整数按十进制数的要求分拆,需用一个循环,每次循环求出被分拆数除以10的余数的办法来求出它的个位,每分拆
26、出一位就将被分拆的数除以10。循环过程直至被分拆的数为0结束。完整程序如下:#includemain()inta20,i,base10;intn;printf(Enteranumber!n);scanf(%d,&n);/*整数输入*/i0;/*对n进行分拆,各位数字自低位到高位存于数组a*/doai+n%base;n/base;while(n);for(i-;i=0;i-)/*自高位到低位输出*/printf(%d%c,ai,i?,:n);=9编一个程序,输入一个字符串,将其中所有的大写英文字母的代码+3,小写英文字母的代码-3。然后输出加密后的字符串。【解】程序的主要工作是输入字符串,并顺序
27、考察输入字符率中的字符,分别对其中大小写英文字母完成问题要求的更改,而跳过不是英文字母的字符。完整程序如下:#include#defineN200main()charsN;inti;printf(Enterstring!n);scanf(%s,s);for(i0;si!0;i+)if(si=A&si=a&si=z)si-=3;printf(s%sn,s);=10编一个程序,将按第9题中加密的字符率(从键盘输入)解密后输出。【解】本问题编写的程序是完成上一程序的逆操作。同样是顺序考察输入字符串,对满足要求的字符作恢复更改。要求是当字符减3后是大写英文字母时,则对其作减3处理的替换;当字符加3后是小写英文字母时,则对它作加3的处理。如此做法是有错误的,程序未考虑原先不是英文字母,而未被加3或减3处理,但对它减3或加3后是英文字母时,将被下面的程序转换成英