1、实验二 基本数据类型、运算符及表达式 1. 分析以下程序,判断输出结果,然后上机运行程序验证结果。(1)# include main( ) int sum = 1 ; sum = sum +100 ;printf(SUM = %dn, sum);输出结果为:101(2) 改正后的程序为:# include main( ) char ch1 , ch2 ; ch1 = b ;/不能把字符串b赋给字符变量 ch2 = ch1 - 32 ; printf(%c %d %c %dn, ch2,ch2,ch1,ch1);(3)# include main( ) int a = 10 , b =3 ; p
2、rintf(%dn, (a = a - 1 , b + a , b + 2);输出结果为5,(a = a - 1 , b + a , b + 2)作为一个逗号表达式。(4)# include main( )int a = 5 , b = 3 , c = 4 ; a *= a += 3; b = +c ; c = b+ ;a = b + c ; printf(n%d,%d,%d, a , b , c);输出结果为:11,7,5(5)程序改正为:# include main( ) int a = 1 , b = 2 , c = 3 , logic ;logic = a + b c & b = b
3、+ c | b = c;printf(logic = %dn, logic);logic =!(a c) +b!=1 & (a + c)/2 ;printf(logic = %dn, logic);输出结果为:logic = 0logic = 0logic = 12. 以下程序可能有多处错误,请改正并调试运行程序。(1)# include # include HIGH 10/改为:#include HIGH 10main( )int a = 5 ; /可再定义一个变量bHIGH *= HIGH ; /HIGH是宏名,不能被赋值,可改为:b=HIGH*HIGH;printf(n%d,%d, a
4、, HIGH); /输出a,b的值 改正后的程序为:# include # define HIGH 10main( )int a = 5 ,b; b = HIGH*HIGH ; printf(n%d,%d, a , b); 输出结果为:5,100(2)此程序功能为将输入的华氏温度转换成摄氏温度,公式为c = 5 / 9 (f32 )。# include main( ) float c , f; scanf(%f, f);/输入时,变量要用&取地址 c = (5 / 9) (F 32); /5/9是为0的,要变成实数。F没有定义,定义的是f printf( F= %f , C = % fn, f
5、 , c);/多了一个左括号 改正后的程序为:# include void main( ) float c,f;scanf(%f, &f);c=(5.0/9)*(f-32);printf(F= %f,C = %fn,f,c);(3)此程序功能是求:y = 。# include # include main( ) int a ; double x , y ;Scanf(%d%f, &a , &x);/scanf不能大写,x的类型是double,格式化字符应该用%ldy = SIN(sqr(ax) + LN(a + x);/sin函数不能大写,sqr应该为sqrt,ax应为a*a,LN不是有效的函
6、数名,要求自然对数用的是log(),另外括号不匹配printf( Y= %f n, y);/y的类型是double,格式化字符应该用%ld 程序改正后为:# include # include main( ) int a ;double x , y ;scanf(%d%lf, &a , &x);/scanf不能大写y = sin(sqrt(a*x) + log(a + x);/sin函数不能大写,ax应为a*a,LN不是有效的函数名,要求自然对数用的是log(),另外括号不匹配printf( Y= %lf n, y);3. 此程序用于说明数据类型转换,调试运行该程序,然后回答下列问题。此程序中
7、定义了哪几种数据类型的变量?指出程序中哪处为自动类型转换,哪处为强制类型转换。变量c按字符形式输出后,该字符是什么?它是ASCII码字符吗?对变量x的输出结果给予解释。#include main() int w,x; float f1,f2=1.23456789E9; char c=227; unsigned int y=65535; w=23.4567; f1=(float)w; x=y; printf(w=%d,f1=%f,f2=%fn,w,f1,f2); printf(c=%c,y=%u,x=%dn,c,y,x);分析:(1)程序中定义了int ,float ,char unsigned
8、 四种数据类型的变量。(2)f1=(float)w;这一句是强制类型转换,w=23.4567;x=y;用的是自动类型转换(3)变量C按字符输出的是?,不是ASCII字符。(4)结果的解释略实验三 顺序结构程序设计1.分析以下程序,判断输出结果,然后上机调试验证结果。(1)main() int a , b ; char c , d ; scanf ( %d%d , &a , &b ) ; scanf ( %c%c , &c , &d ) ; printf(%d,%d,%c,%cn,a,b,c,d); 运行时输入:34 56ab再次运行时,输入:34,56,a,b 看一看运行结果。程序改正为:#i
9、nclude /头文件一定要包含void main() int a , b ; char c , d ; scanf ( %d%d , &a , &b ) ; scanf ( %c%c , &c , &d ) ; printf(%d,%d,%c,%cn,a,b,c,d); 分析:当输出为34 56ab时,第一个scanf语句中的a,b变量接收了34和56两个数值,字符ab由第二个scanf语句的变量c,d接收。(2)改正后的程序为:#include void main( ) int x=34 ; float y=45.98 ;printf (%6d,%6.2f , x , y ); (3)#i
10、nclude void main()printf(n);printf(%10s%10sn,china,Beijing);printf(%-10s%-10sn,china,Beijing); printf(%10.3sn,china); 分析:%10s 输出时右对齐,%-10s输出时左对齐,%10.3s表示输出时只输出3个字符(4)#include void main() int k=-1; printf(k=%dn , k); printf(k=%on , k);printf(k=%xn , k);printf(k=%un , k); 分析:计算机在做运算的时候,是用补码参与运算的。int 型
11、的数据在VC里是用四个字节表示的。变成补码后再做相应格式的输出。(5)main() int a , c; unsigned d; float b , e; a = 3.5 +3/2; b = 23 ; c = xe0; d = - 1; e = 2.555555555; printf ( n %d , %f , %x , %u , %f , a , b , c , d , e ); 分析:和上题一样,是个补码的应用。(6) #include main() int i=97;char ch=a; putchar(i) ;putchar(n) ; putchar(ch) ; 分析:输出aa(7)#
12、includemain() int ch;ch=getchar(); putchar(ch);分析:从键盘上接收一个字符,显示一个。2以下程序可能有多处错误,请改正并上机调试。(1)输入三角形的三条边的长,求三角形的面积(假设输入的三边长能构成一个三角形)。 main( ) float a,b,c,s,area;/应该定义成double型 scanf(%f,%f,%f,&a,&b,&c); s=1/2*(a+b+c);/1/2 的值是0,要变成实数area=sqrt(s*(s-a)*(s-b)*s-c);/括号不匹配。用了数据函数sqrt要包含math.h头文件printf(a=%7.2fnb
13、=%7.2fnc=%7.2fnarea=%7.2fn,a,b,c,area);改正后的程序为:#include#includevoid main() double a,b,c,s,area; scanf(%lf,%lf,%lf,&a,&b,&c); s=1.0/2*(a+b+c); area=sqrt(s*(s-a)*(s-b)*(s-c); printf(a=%7.2lfnb=%7.2lfnc=%7.2lfnarea=%7.2lfn,a,b,c,area);(2)从键盘输入圆的半径的值,计算圆的周长和面积。 main() float r,c,area; scanf(%f,&r) c=2r*P
14、I;/2*r area=r*r*PI;/PI要定义成宏再用。 printf(r=%fn,r); printf(c=%.2fn,c); printf(area=%10.2fn,area); 改正后的程序为:#define PI 3.14159#includevoid main() float r,c,area; scanf(%f,&r); c=2*r*PI; area=r*r*PI; printf(r=%fn,r); printf(c=%.2fn,c); printf(area=%10.2fn,area);(3) 略(4)略3编程题(1)编程序计算平面上任意两点之间的距离。#include#in
15、cludevoid main() float x1,y1,x2,y2,c;printf(请输入第一个点的座标:);scanf(%f,%f,&x1,&y1);printf(请输入第二个点的座标:);scanf(%f,%f,&x2,&y2);c=sqrt(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);printf(两点距离为:%f,c);(2)从键盘上输入一个小写字母,用大写字母输出。#includevoid main() char c;scanf(%c,&c);c-=32;printf(%c,c);#includevoid main() char c;getchar(c);c-=
16、32;putchar(c);(分别用getchar()和scanf() 输入,用putchar()和printf()输出)实验四:选择结构程序设计 参考答案1.分析以下程序,判断输出结果,然后上机调试验证结果.(1)输出结果为:2,2,2分析:因为j+|k+的左边为真,所以不管右边的表达式的值为真还是为假,结果都是为真,所以不会执行 k+这个表达式.k的值不会加1.同理,i+会执行.所以i的值会加1.(2)输出结果为:1,0,7分析:同上,还是考查的逻辑运算符的运算规则的知识点.(3)输出结果为:3分析:ok1的值是1,非0即为真.!ok1即为假.所以x-就不会执行,会执行else下面的语句,
17、再按照同样的分析 进行.(4)输出结果为:#&分析:a的值为2,a0为真,真值即为1,所以从case 1:入口进行,同理bscanf(%d,&year);第二处错误:if(year%4=0&year%100!=0)OR(year%400=0)-if(year%4=0&year%100!=0)|(year%400=0)第三处错误:if(leap=1)-if(leap=1)3.在横线处给程序填空(1)输入4个整数,按大小顺序输出#include void main() int a,b,c,d,t; scanf(%d,%d,%d,%d,&a,&b,&c,&d); if(ab) t=a;a=b;b=t
18、; if(bc) t=b;b=c;c=t; if(cd) t=c;c=d;d=t; if(ab) t=a;a=b;b=t; if(bc) t=b;b=c;c=t; if(ab) t=a;a=b;b=t; printf(%d,%d,%d,%d,a,b,c,d); (2)将字母换成小写#includevoid main() char c; scanf(%c,&c); if(c=A&c=Z) c=c+32; printf(%c,c);4.(1)编写一个程序,求一元二次方程ax2+bx+c=0的根#includevoid main() float a,b,c,x1,x2,disc; printf(pl
19、ease input a,b,c:); scanf(%f,%f,%f,&a,&b,&c); disc=sqrt(b*b-4*a*c); if(disc0) printf(this is two diffent gen:x1=%f,x2=%f,(-b+sqrt(disc)/(2*a),(-b-sqrt(disc)/(2*a); (2)给出一个百分制的成绩,要求输出成绩等级A,B,C,D,E.90分以上的为A,8089分的为B,7079分的为C,6069分的为D,60分以下的为E.#includevoid main() int score; printf(请输入百分制成绩:); scanf(%d,
20、&score); if(score=90) printf(等级:An); else if(score=80) printf(等级:Bn); else if(score=70) printf(等级:Cn); else if(score=60) printf(等级:Dn); else printf(等级:En);(3)编程序:用scanf()函数给x赋值,分别为x-1,-1=x1三种情况,求y的值.#includevoid main() float x,y; printf(请输入x的值:); scanf(%f,&x); if(x-1) y=1; else if(x1) y=2*x+9; else
21、y=5*x*x-3; printf(x=%f,y=%fn,x,y);实验五:循环结构程序设计 参考答案1.分析以下程序,画出控制流程图,判断输出结果,然后上机调试结果并回答问题.(1)程序改正后为:#includevoid main()int x=567;do printf(%c,x%10+0);while(x/=10);以上程序输出结果为:765,实现的功能为:把一个整数反序输出.(2)#includevoid main()int i;for(i=0;i5;+i)if(i=3) continue;printf(%d,i);以上程序输出结果为:0124,循环执行了5次.但只输出四次i的值,原因
22、是当i=3的时候,执行continue语句,跳过下面的语句,转而去执行下一次循环.(3)程序输出结果为:10012345678910分析:10的输出是由于第一个for循环后面有个分号,下面的printf语句就不再是它的循环体了.所以等到10次循环完了后,再执行printf语句,这时的i已经变成了10.而第二行的输出是由于第二个for的循环体是printf语句.所以printf语句执行了10次,每次输出一个值.(4)程序输出结果为:6分析:for(;) for语句里面的三个表达式都缺省,只要第二个表达式缺省就构成了死循环.这是个知识点.(5)程序输出结果省略.2.以下程序可能有多处错误,请改正并
23、上机调试.改正后的程序如下:#includevoid main()int i=0,j=10,k=2,s=0;for(;)/只能有两个分号,表示三个表达式都缺省.i+=k;if(ij)/后面不能有分号.printf(%dn,s);break;/少了一个花括号.s+=i;/应该在if语句的外面.3.在横线处给程序填空.(1)求1!+2!+3!+.+10!#includevoid main()int i=1;long int t=1,sum=0;do t=t*i;sum=sum+t;i+;while(i=10);/循环10次.每次循环sum累加i!printf(sum=%d,sum);(2)打印九九
24、表#includevoid main()int i,j;for(i=1;i=9;i+)printf(%4d,i);printf(n);for(i=1;i=36;i+)printf(%c,-);printf(n);for(i=1;i=9;i+)for(j=1;j=9;j+)if(ji) printf(%8c, );elseprintf(%d*%d=%-4d,i,j,i*j);printf(n);(3)求Fibonacci数列1,1,2,3,5,8.的前N(N为偶数)项.#includevoid main()long int f1,f2;int i,n;scanf(%d,&n);f1=f2=1;p
25、rintf(n);/先换行for(i=1;i=n;i+)printf(%12ld%12ld,f1,f2);if(!(i%2)/每输出两次换行,每次输出2项,也就是每次输出四项了再换行.printf(n);f1=f2+f1;/让下一次for循环输出的f1的值是前两个数的和f2=f2+f1;/让下一次for循环输出的f2的值是前两个数的和4.编程题(1)输入一行字符,分别统计出其中的英文字母,空格,数字和其他字符的个数.#include#includevoid main()char str100;static int i,sum4;printf(请从键盘输入一行字符:);gets(str);for
26、(i=0;i=a&stri=A&stri=1&stri=9)sum2+;elsesum3+;printf(英文字母个数为:%d,空格为:%d,数字为:%d,其他字符为:%d,sum0,sum1,sum2,sum3);(2)求100300之间的全部素数,并且每行输出5个数.#include#includevoid main() int i,j,n,flag=1,sum=0; for(i=100;i=300;i+) for(j=2;j=sqrt(i);j+)if(i%j=0)flag=0;break;elseflag=1;if(flag=1) if(+sum%5=0) printf(%4dn,i)
27、;else printf(%4d,i); (3)分别用三种循环语句完成计算10!/用for循环#includevoid main()long int i,t=1,sum=0;for(i=1;i=10;i+)sum+=t*=i;printf(10!=%ld,sum);/用while循环#includevoid main()long int i=1,t=1,sum=0;while(i=10)sum+=t*=i+;printf(10!=%ld,sum);/用do.while循环#includevoid main()long int i=1,t=1,sum=0;dosum+=t*=i+;while(i
28、=10);printf(10!=%ld,sum);(4).打印所有的水仙花数.所谓水仙花数指一个三位数,其各位数字的立方和等于该数本身.例如:153=1*1*1+5*5*5+3*3*3.153即是一个水仙花数.#includevoid main()int i;for(i=100;i=999;i+)if(i=(i/100)*(i/100)*(i/100)+(i/10%10)*(i/10%10)*(i/10%10)+(i%10)*(i%10)*(i%10)printf(%4d,i);(5).求序列2/1+3/2+5/3+8/5+.的前20项之和.#includevoid main()float m
29、=2,n,t,sum=0;for(n=1;n=20;n+)t=n;sum+=m/n;n=m;m=m+t;printf(sum=%f,sum);实验六 函数与编译预处理1.void main()float a,b,c;scanf(%f%f,&a,&b);c=add(a,b);printf(sum is %fn,c);float add(float x,float y)float z;z=x+y;return(z);/错误的地方,(1)没有包含头文件 (2)函数定义应该在函数调用的前面.更正后的程序:#includefloat add(float x,float y)float z;z=x+y;r
30、eturn(z);void main()float a,b,c;scanf(%f%f,&a,&b);c=add(a,b);printf(sum is %fn,c);2.void main()int a=3,b=6;printf(a=%d,b=%dn,a,b);exchange1(a,b);printf(:a=%d,b=%dn,a,b);void exchange1(int x,int y)int t;t=x;x=y;y=t;printf(x=%d,y=%dn,x,y);/错误的地方,(1)没有包含头文件 (2)函数定义应该在函数调用的前面.更正后的程序:#includevoid exchang
31、e1(int x,int y)int t;t=x;x=y;y=t;printf(x=%d,y=%dn,x,y);void main()int a=3,b=6;printf(a=%d,b=%dn,a,b);exchange1(a,b);printf(a=%d,b=%dn,a,b);3.long int fac(int n)long int p;int i;p=1;for(i=1;i=n;i+)p=p*i;return(p);int cmn(int m,int n)int x;x=fac(m)/(fac(n)*fac(m-n);return(x);void main()int m,n,c;scan
32、f(%d%d,&m,&n);c=cmn(m,n);printf(c=%dn,c);/应该加个#include 头文件4.int a=7,b=9;void main()int i,a=5,x=80,y=60;for(i=1;ib?a:b);程序更正:#includeint a=7,b=9;void main()int i,a=5,x=80,y=60;int max(int a,int b);int sum(int x,int y);for(i=1;ib?a:b);5.调试运行以下程序.#includeint fun(int a)int b=0;static int c=2;b+=c;c+=1;r
33、eturn(a+b-c);void main()int a=3,i;for(i=0;i3;i+) printf(%4d,fun(a);6.略7.略8.#include#define DEBUGvoid main()int a=14,b=15,temp;temp=a/b;#ifdef DEBUGprintf(a=%d,b=%d,a,b);#endifprintf(temp=%dn,temp);程序结果为:a=14,b=15,temp=0(1)第二行中,宏定义是可以没有具体的值的,在这里只是定义了一个宏名.DEBUG没有值.(2)第79行为:#ifdef DEBUGprintf(a=%d,b=%d
34、,a,b);#endif会被编译,因为种种原因DEBUG已经被定义过.(3)如将第2行删除,程序运行结果为:temp=0 因为没有定义DEBUG,所以原来第79行的程序没有执行.(4)第9行不能删除,因为#ifdef 和 #endif必须成对出现.9.编程题#includelong int fac(int n)long int p;int i;p=1;for(i=1;i=n;i+)p=p*i;return(p);void main()int m,n,c;scanf(%d%d,&m,&n);c=fac(n)/(fac(n-m)*fac(m);printf(c=%d,c);实验七 数组2 (1)求最大偏差,填空如下:average = sum/count;n-2;datecount+datacount+1+datacount+2;max=sum;highiff=max-average;highiff