[信息与通信]C语言程序设计汇编.doc
C语言程序设计汇编分支、循环结构一、程序分析题1阅读程序,写出运行结果。 main() int a10, b4,C3; if(ab) ab; if(aC) aC; printf("d,d,dn", a,b,c); 【解】程序中,第一个if语句if(a<b)ab,当a<b时,让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() int x=100, a10, b20, Ok15,Ok20; if(ab)if(b!15)if(!Ok1) x1; else if(ok2) x10; else x-l; printf("dn",x); 【解】程序预置变量x的值为100,a的值为10,b的值为20,ok1为5,Ok2为0。程序中给出的if语句可以写成更结构化的形式如下: if(ab) if(b!15) if(!Ok1) x1; else if(Ok2) x10; else xl; 由于条件ab成立,并且条件b!=15也成立,而ok1不等于0,执行else后的语句。又因ok2等于0,执行else后的语句赋-1给x。所以程序输出一l。= 3阅读下列程序,写出程序的输出结果。 main() int y9; for(; y0; y-) if(y3=0) printf(”d”,-y);continue; 【解】循环前,变量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):C 5( F32)9【解】利用公式:C5(F32)9,输入F氏温度,计算并输出对应的C氏温度,程序要引入两个变量,分别用于存储F氏温度和C氏温度,计算时应采用浮点型,包括公式中的常数也应写成浮点数,不能采用整型和把常数写成整数。因采用整型编写,公式中的除运算变成整除,会得出与实际要求不一致的结果。程序如下: include <stdio.h> main() float f,c;/*变量定义*/ printf(”输入F氏温度”); scanf(”f,f); c 5.0*(f32.0)9.0; printf(”对应的C氏温度6.2fn”,c); = 2编一个程序,输入一个整数,输出其符号(若0,输出1;若0输出-1)。 【解】程序可用if语句判断输入数的符号,并控制输出1或-l。程序如下: include<stdio.h> main() int c;*变量定义* printf("输入一个整数"); scanf(” d”, c); if(C0) printf("1n"); else printf("-ln"); =3编一个程序,输入X的值,按下列公式计算并输出y的值。 X(Xl) y 2xl(lx10) 3X-11(10X)【解】输入x,按公式计算y。这可用一个嵌套的if语句分段判断并计算出y的值。然后输出y值。程序如下: includestdioh main() int x,y;*变量定义* printf(”输入一个整数”); scanf(”d”,x); if( xl) yX; else if(x10)y2*xl; else y3*X11; printf(”y%d n”, y); = 4编一个程序,输入三个单精度数,输出其中最小数。【解】设最小数存于变量min中,为求三个数中的最小数,可分以下多步完成,先预置min为x,然后分别将其余两个数逐一与min比较,当它们中的某个值比存于min中的值更小时,就用它们更新min。写出程序如下: include<stdio.h> main() float X,y,Z,min;/*变量定义*/ printf("输入三个单精度浮点数"); scanf("%f%f%f", &x,&y,&Z); min x; if(min>y) min y; if(min>Z) minZ; printf("浮点数%f,%f,%f中的最小值是%fn",X,y,Z,min); = 5编一个程序,求出所有各位数字的立方和等于1099的3位数。【解】找出所有各位数字的立方和等于1l99的3位整数。 3位整数是100至999范围内的整数,设分别用a,b,c存储3位数的百位、十位和个位的数字,程序用三重循环求出a,b,c的立方和为1099的3位数a*100+b*10c。程序如下: include <stdio.h> main() int a,b, c;/*变量定义*/ for(a1; a<=9;a+) for(b0; b<=9; b+) for(c0;c<9;c+) if(a*a*a+b*b*b+c*c*c=1099) printf("%dn",(10*ab)*10c); 若用一个变量i表示3位数,循环体将3位数变量i分拆出它的百位、十位和个位共3个数字,然后判这三个数字的立方和是否是1099,若是就输出该变量的值。程序如下: include<stdio.h> main() int i,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个计数器的值。程序如下: # include<stdio.h> main() int i,d,n,z,p;/*变量定义*/ nZp0; for(i1;i<=10;i+) print(" 输入第%d个整数", i); scanf("%d",&d); if(d<0)n+; else if(d>0)p+; else z+; printf("负数有%d个,正数有%d个,零有%d个。n",n,p,z); = 7编程序,按下列公式计算e的值(精度为1e6): e1+1/1!+1/2!+1/3!+1/n!+ 【解】按e的幂级数展开式计算e的值。这是典型的求级数和计算问题。通常采用逐项计算,并累计的方法。计算新的项时,可用上一轮循环计算出的项,这能提高程序的效率。循环直至当前项的值小于精度要求结束。程序如下: # include<stdio.h> main() double e,t,i;/*变量定义*/ e0.0;t=1.0;i1.0; while(t>1.0e-6) e+t; t/= i; i+= 1.0; printf(”e%.6fn”, e); = 8编程序,按下列公式计算y的值(精度为1e6): y=1/r*r+1【解】按所给公式计算数列的和。类似上一小题的解,逐项计算并累计。程序如下: # include<stdio.h> main() double y,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的十进制数值及其对应字符。【解】显示ASCII代码为十六进制0x20至ox6f的字符的十进制代码值与其字符。程序可用一个循环,让变量i顺序地取0X20至OX6f的值,并逐一输出其十进制代码和对应的字符,程序如下: # include<stdio.h> main() int i,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) 用输循环实现的程序 # include<stdio.h> main() /*用for循环*/ int i,k0; for(il;i<=100;i+) if(k+%5=0) /*每行五个*/ printf("n"); printf("%3d*%3d%5d",i,i,i*i); printf("n"); (2) 用while循环实现的程序 # include<stdio.h> main() /*用 while循环*/ int i,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循环实现的程序 # include<stdio.h> main() /*用do-while循环*/ int i, k0 ; i=1; do if(k+%5=0) /*每行五个*/ printf("n"); printf("%3d*%3d%5d",i,i,i*i); 1+; while(<=100); printf("n"); 数组一、 程序分析题 1阅读程序,写出程序运行结果。, main() static int a39,7,5,3,l,2,4,6,8; int i,j,sl0,s20; for(i0; i<3;i+) for(j0;j<3;j+) if(ij) s1s1aij; if(i+j 2) s2s2aij; printf("%dn%dn", sl,s2); 【解】已知数组。共有3行3列席一行依次是9,7,5;每二行是3,1,2;第三行是4,6,8。程序引用数组元素的游标变量是i和j,外循环控制变量i是数组的行下桥,内循环控制变量j是数组的列下标。循环体的工作是将数组的某些元素累计到sl,某些元素累计到S2。将行下标i和列下标j相同的元素累计到sl,sla00al1a22。将行下标i与列下标j的和为 2的元素累计到 s2,s2a02alla20。所以sl是18,s2是10。程序输出: 18 10= 2说明下列程序的功能。 main() int i,j; float a33,b33,x; for(i0;i<3;i+) for(j0;j<3 ;j+) scanf("%f",&x); aij x; for(i0;i<3;i+) for(j0;j<3;j+) bjiaij; for(i=0;i<3;i+) printf("n"); for(j0;j<3;j+) printf("%f",bij); printf("n"); 【解】程序第一段两重循环,实现按行顺序输入数组a的全部元素的值。程序第二段两重循环是将数组a转置复制到数组b。程序第三段两重循环实现按行输出数组b的全部元素。所以程序的功能是按行顺序输入3*3二维数组的全部元素,然后按列顺序输出。= 3写出下列程序的运行结果。 main() static char a'*','*','*','*','*','*'; int i,j,k; for( i0;i<5;i+) printf("n") for(j 0;j<i;j+) printf("%c",''); for(j0;j<5 ;j+)printf("%c",ak); printf( "n"); 【解】程序的外循环控制循环五次,每次开始先输出一个换行符,共输出5行信息。对于i(自0开始计算)行,先输出i个空白符,接着输出字符数组a中的五个字符,由于a中的五个字符都是字符。,所以输出五个*字符。这样程序是输出以下形式的图案: * * * * * * * * * * * * * * * * * * * * * * * * *=4说明下列程序的功能。 main() int i,j ; float a33,b33,c33,x; for(i0;i<3;i+) for(j=0;j<3;j+) scanf("%f", &x); aij= x; for(i0;i<3;i+) for(j0;j<3;j+) scanf("%f",&x);bijx; for(i0; i<3; i+) for(j0;j<3;j+) cijaij bij ; for(i0; i<3;i+) printf("n"); for(j0;j<3;j+) printf("%f", cij); printf("n"); 【解】程序第一段的功能是按行顺序输入数组a 的元素。程序第二段的功能是按行顺序输入数组b的元素。程序第三段的功能是顺序累加数组a和数组b的对应元素,并将和存于数组C的对应元素中。最后,按行顺序输出数组C的全部元素。二、程序设计题1编程序,输入单精度型一维数组 a10 ,计算并输出 a数组中所有元素的平均值。【解】为了计算数组元素的平均值,首先要累计它的全部元素的和,然后除以数组元素的个数,即得数组元素的平均值。写成C程序如下: # include<stdio.h> main() int i, n10; float s,a10 ; printf("Enter %d numbers! n", n); for( i=0;i< n; i+) scanf("%f",&s); ai= s; for(s=0.0,i=0;i<n;i+) s+= ai ; s /n; printf("平均值是%.2fn", s); =2编程序,输入10个整数存入一维数组,再按逆序重新存放后再输出。【解】将数组的元素逆序重新存放,就是将数组的首尾对应元素两两交换。简单地可用两个游标变量i和j,i是前端元素的下标,j是后端元素的下标,交换以这两个变量值为下标的数组元素。开始时,i的值为0,j的值为末元素的下标。每次交换后,i增1,j减1。继续交换的条件是i<j。程序如下: # include<stdio.h> main() int a10, i,j,t,n10; printf("Enter %d numbers! n", n); for(i0;i<n;i+) scanf("%d",&ai ); for(i=0,jn-1;i<j;i+,j-) t ai; aiaj ;aj t; for(i0; i<n; i+) printf("%dt", ai); printf("n"); = 3编程序,输入两个字符串(<40个字符) ,连接后输出(不准用系统函数) 。【解】将字符串s2连接到字符串s1的计算过程可分两个步骤完成。首先找到字符串s1的末尾,然后参照字符串s2,将字符串s2的全部有效字符逐一复制到字符串s1,最后在字符串s1的末尾接上字符率结束标记符。完整程序如下: # include<stdio.h> # define N 40 main() char s1N ,s2N; int i,j; printf("Enter stringl!n"); scanf("%s",s1); printf("Enter string2! n"); scanf("%s", s2); for(i0; sli!'0' ; i+) ; for(j0;s2j!'0' ;i+,j+) soisj ; s1i'0' printf("sl%sn" ,sl); =4编程序按下列公式计算S的值(其中X1、X2、Xn由键盘输入): s(xi-x0)(xi-x0) (其中x0是X1、x2、Xn的平均值) 【解】输入数组x的n个元素的值,按公式计算。程序首先输入n,设n<100,然后输入n个数据,接着求它们的平均值,最后按计算公式求出s,并输出。程序如下: # include<stdio.h> # define N 100 main() double xN+1, s; int i,n; do printf("Enter n(<100)"); scanf("%d", &n); while(<=0|n>=100); for(i=1; i<=n;i+) scanf("%lf", &s);xis; for(s0.0,i1;i<=n; i+) s+=xi ; x0 s/n; for(s0.0, i=1;i<= n;i+) s+=(xi-x0)*(xix0); printf("s=%fn", s); = 5输入一个3X5的整数矩阵,输出其中最大值、最小值和它们的下标。【解】输入一个二维数组,寻找二维数组的最大值和最小值。其中寻找最大值和最小值的工作可用两重循环实现,即按行按列考察二维数组的元素。程序如下: # include<stdio.h> main() int a35, i,j,t,n3, m5, min,max, minrow, mincol, maxrow, maxcol; printf("Enter %d*%d numbers !n" , n,m); for(i0; i<n;i+) )for( j0;j<m;j+) scanf("%d", &t); aij t; minmax=a00; minrowmincolmaxrow=maxcol=0; for(i0;i<n;i+) for(j0;j<m; j+) if( aij> max ) max= aij ;maxrow= i;maxcol=j ; if( aij<min) minaij ; minrow= i; mincolj ; printf("MAXa%d%d %d MIN a%d%d %d n", maxrow,maxcol,max,minrow,mincol,min) ; =6输入一个字符串,将其中的所有大写字母改为小写字母,而所有小写字母全部改为大写字母,然后输出。【解】程序先输入字符率,然后顺序考察输入字符串中的字符,当发现是大写字母时,将它改写成对应的小写字母,而当它是小写字母时,就将它改写成对应的大写字母。若变量ch中的字符是大写字母,则与它对应的小写字母的表达式可以写成ch- 'A''a' ;类似地,若变量ch中的字符是小写字母,则与它对应的大写字母的表达式可以写成ch'a''A' 。完整程序如下: # include<stdio.h> # define N 200 main() char sN ; int i; printf(" Enter string! n"); scanf ("%s" ,s); for(i0; si!'0';i+) if(si >='A'&&si <='Z' ) sisi -'x''a' ; else if(si >='a'&& si <='z') si si'a' 'A' ; printf("s%sn", s); =7设某班50名学生的三科成绩表如下: 课程一 课程二 课程三 . . .试编一个程序,输入这50个学生的三科成绩,计算并输出每科成绩的平均分。【解】程序定义一个50行3列的二维数组,用于存储全班学生的成绩。程序顺序输入各个学生的三科成绩,然后按列的顺序,累计各科总分,并计算平均分。完整程序如下: # include<stdio.h> # define N 50 # define M 3 main() int scoreNM, i,j,t; double aM; printf("Enter scores!n"); for(i0;i< N; i+) for(j0;j<M;j+) scanf("%d",&t);scoreijt; for(j0;j<M;j+)aj0.0; for(j0;j< M;j+) for(i0;i< N; i+) aj+= scoreij; aj/ N; for(j0;j<M;j+) printf("课程%d的平均分是%.2fn", j+1,aj); =8编一个程序,输入一个整型数据,输出每位数字,其间用远号分隔。例如,输入整数为2345,则输出应为: 2, 3, 4, 5。【解】程序的主要工作是从输入整数分拆出它的十进制整数的各位数字,将分拆出来的各位数字存于数组中,然后将这些数字自高位到低位的顺序逐位输出。要将一个整数按十进制数的要求分拆,需用一个循环,每次循环求出被分拆数除以10的余数的办法来求出它的个位,每分拆出一位就将被分拆的数除以10。循环过程直至被分拆的数为0结束。完整程序如下: # include<stdio.h> main() int a20,i,base10; int n; printf("Enter a number! n"); scanf("%d", &n);/*整数输入*/ i0;/*对n进行分拆,各位数字自低位到高位存于数组 a*/ do ai+n% base; n/ base; while(n) ;for(i-;i>=0;i-)/*自高位到低位输出*/ printf("%d%c",ai, i? ',' :'n'); =9编一个程序,输入一个字符串,将其中所有的大写英文字母的代码+3,小写英文字母的代码-3。然后输出加密后的字符串。【解】程序的主要工作是输入字符串,并顺序考察输入字符率中的字符,分别对其中大小写英文字母完成问题要求的更改,而跳过不是英文字母的字符。完整程序如下: # include<stdio.h> # define N 200 main() char sN; int i; printf("Enter string! n"); scanf("%s", s); for(i0;si !'0' i+) if(si >='A' && si<='Z') si+=3; else if(si>='a'&& si<='z' ) si-=3; printf("s%sn",s); =10编一个程序,将按第9题中加密的字符率(从键盘输入)解密后输出。【解】本问题编写的程序是完成上一程序的逆操作。同样是顺序考察输入字符串,对满足要求的字符作恢复更改。要求是当字符减3后是大写英文字母时,则对其作减3处理的替换;当字符加3后是小写英文字母时,则对它作加3的处理。如此做法是有错误的,程序未考虑原先不是英文字母,而未被加3或减3处理,但对它减3或加3后是英文字母时,将被下面的程序转换成英