C实验参考答案.docx
- 文档编号:28357069
- 上传时间:2023-07-10
- 格式:DOCX
- 页数:42
- 大小:26.67KB
C实验参考答案.docx
《C实验参考答案.docx》由会员分享,可在线阅读,更多相关《C实验参考答案.docx(42页珍藏版)》请在冰豆网上搜索。
C实验参考答案
实验二基本数据类型、运算符及表达式
1.分析以下程序,判断输出结果,然后上机运行程序验证结果。
(1)
#include
main()
{intsum=1;
sum=sum+100;
printf("SUM=%d\n",sum);
}
输出结果为:
101
(2)改正后的程序为:
#include
main()
{charch1,ch2;
ch1='b';//不能把字符串"b"赋给字符变量
ch2=ch1-32;
printf("%c%d%c%d\n",ch2,ch2,ch1,ch1);
}
(3)
#include
main()
{inta=10,b=3;
printf("%d\n",(a=a-1,b+a,b+2));
}
输出结果为5,(a=a-1,b+a,b+2)作为一个逗号表达式。
(4)
#include
main()
{
inta=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()
{
inta=1,b=2,c=3,logic;
logic=a+b>c&&b<=c;
printf("logic=%d\n",logic);
logic=a>=b+c||b==c;
printf("logic=%d\n",logic);
logic=!
(a =1&&(a+c)/2; printf("logic=%d\n",logic); } 输出结果为: logic=0 logic=0 logic=1 2.以下程序可能有多处错误,请改正并调试运行程序。 (1) #include #includeHIGH10//改为: #includeHIGH10 main() {inta=5;//可再定义一个变量b HIGH*=HIGH;//HIGH是宏名,不能被赋值,可改为: b=HIGH*HIGH; printf("\n%d,%d",a,HIGH);//输出a,b的值 } 改正后的程序为: #include #defineHIGH10 main() {inta=5,b; b=HIGH*HIGH; printf("\n%d,%d",a,b); } 输出结果为: 5,100 (2)此程序功能为将输入的华氏温度转换成摄氏温度,公式为c=5/9·(f–32)。 #include main() {floatc,f ; scanf("%f",f) ;//输入时,变量要用&取地址 c=(5/9)·(F–32) ;//5/9是为0的,要变成实数。 F没有定义,定义的是f printf(("F=%f,C=%f\n",f,c) ;//多了一个左括号 } 改正后的程序为: #include voidmain() { floatc,f; scanf("%f",&f); c=(5.0/9)*(f-32); printf("F=%f,C=%f\n",f,c); } (3)此程序功能是求: y= 。 #include #include main() {inta; doublex,y; Scanf("%d%f",&a,&x) ;//scanf不能大写,x的类型是double,格式化字符应该用%ld y=SIN(sqr(ax)+LN(a+x) ;//sin函数不能大写,sqr应该为sqrt,ax应为a*a,LN不是有效的函数名,要求自然对数用的是log(),另外括号不匹配 printf("Y=%f\n",y) ;//y的类型是double,格式化字符应该用%ld } 程序改正后为: #include #include main() { inta; doublex,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.此程序用于说明数据类型转换,调试运行该程序,然后回答下列问题。 ①此程序中定义了哪几种数据类型的变量? ②指出程序中哪处为自动类型转换,哪处为强制类型转换。 ③变量c按字符形式输出后,该字符是什么? 它是ASCII码字符吗? ④对变量x的输出结果给予解释。 #include main() { intw,x; floatf1,f2=1.23456789E9; charc=227; unsignedinty=65535; w=23.4567; f1=(float)w; x=y; printf("w=%d,f1=%f,f2=%f\n",w,f1,f2); printf("c=%c,y=%u,x=%d\n",c,y,x); } 分析: (1)程序中定义了int,float,charunsigned四种数据类型的变量。 (2)f1=(float)w;这一句是强制类型转换,w=23.4567;x=y;用的是自动类型转换 (3)变量C按字符输出的是? ,不是ASCII字符。 (4)结果的解释略 实验三顺序结构程序设计 1.分析以下程序,判断输出结果,然后上机调试验证结果。 (1) main() {inta,b;charc,d; scanf("%d%d",&a,&b); scanf("%c%c",&c,&d); printf("%d,%d,%c,%c\n",a,b,c,d); } 运行时输入: 3456ab<回车> 再次运行时,输入: 34,56,a,b<回车>看一看运行结果。 程序改正为: #include voidmain() {inta,b;charc,d; scanf("%d%d",&a,&b); scanf("%c%c",&c,&d); printf("%d,%d,%c,%c\n",a,b,c,d); } 分析: 当输出为3456ab时,第一个scanf语句中的a,b变量接收了34和56两个数值,字符ab由第二个scanf语句的变量c,d接收。 (2) 改正后的程序为: #include voidmain() {intx=34; floaty=45.98; printf("%6d,%6.2f",x,y); } (3) #include voidmain() {printf("\n"); printf("%10s%10s\n","china","Beijing"); printf("%-10s%-10s\n","china","Beijing"); printf("%10.3s\n","china"); } 分析: %10s输出时右对齐,%-10s输出时左对齐,%10.3s表示输出时只输出3个字符 (4) #include voidmain() { intk=-1; printf("k=%d\n",k); printf("k=%o\n",k); printf("k=%x\n",k); printf("k=%u\n",k); } 分析: 计算机在做运算的时候,是用补码参与运算的。 int型的数据在VC里是用四个字节表示的。 变成补码后再做相应格式的输出。 (5) main() {inta,c; unsignedd; floatb,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() {inti=97; charch='a'; putchar(i); putchar('\n'); putchar(ch); } 分析: 输出 a a (7) #include main() { intch; ch=getchar(); putchar(ch); } 分析: 从键盘上接收一个字符,显示一个。 2.以下程序可能有多处错误,请改正并上机调试。 (1)输入三角形的三条边的长,求三角形的面积(假设输入的三边长能构成一个三角形)。 main() {floata,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.2f\nb=%7.2f\nc=%7.2f\narea=%7.2f\n",a,b,c,area); } 改正后的程序为: #include #include voidmain() { doublea,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.2lf\nb=%7.2lf\nc=%7.2lf\narea=%7.2lf\n",a,b,c,area); } (2)从键盘输入圆的半径的值,计算圆的周长和面积。 main() {floatr,c,area; scanf("%f",&r) c=2r*PI;//2*r area=r*r*PI;//PI要定义成宏再用。 printf("r=%f\n",r); printf("c=%.2f\n",c); printf("area=%10.2f\n",area); } 改正后的程序为: #definePI3.14159 #include voidmain() { floatr,c,area; scanf("%f",&r); c=2*r*PI; area=r*r*PI; printf("r=%f\n",r); printf("c=%.2f\n",c); printf("area=%10.2f\n",area); } (3) 略 (4) 略 3.编程题 (1)编程序计算平面上任意两点之间的距离。 #include #include voidmain() { floatx1,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)从键盘上输入一个小写字母,用大写字母输出。 #include voidmain() { charc; scanf("%c",&c); c-=32; printf("%c",c); } #include voidmain() { charc; getchar(c); c-=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下面的语句,再按照同样的分析进行. (4)输出结果为: @#& 分析: a的值为2,a>0为真,真值即为1,所以从case1: 入口进行,同理b<10也为真,即为1.也从下面的case1: 进入.就先输出@,然后碰到break,退出这个switch后,返回上一个switch.但是没有break,所以执行case0: 后面的语句,同理会输出#,完了后再输出& (5)输出结果为: PassFail 分析: 当x值为3的时候,从case3: 入口进行,输出Pass后没有break语句,继续执行case2: 后面的语句输出Fail.到了最后就退出了switch结构.不要认为还会回去执行default语句.所以我们一般把default语句放在最后的. 2.以下程序可能有多处错误,请改正并上机调试. 第一处错误: scanf("%d",year);->scanf("%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 voidmain() {inta,b,c,d,t; scanf("%d,%d,%d,%d",&a,&b,&c,&d); if(a {t=a;a=b;b=t;} if(b {t=b;b=c;c=t;} if(c {t=c;c=d;d=t;} if(a {t=a;a=b;b=t;} if(b {t=b;b=c;c=t;} if(a {t=a;a=b;b=t;} printf("%d,%d,%d,%d",a,b,c,d); } (2)将字母换成小写 #include voidmain() {charc; scanf("%c",&c); if(c>='A'&&c<='Z')c=c+32; printf("%c",c); } 4. (1)编写一个程序,求一元二次方程ax2+bx+c=0的根 #include voidmain() {floata,b,c,x1,x2,disc; printf("pleaseinputa,b,c: "); scanf("%f,%f,%f",&a,&b,&c); disc=sqrt(b*b-4*a*c); if(disc<0) printf("thisnotagenpleaseinputagain! "); elseif(disc==0) printf("thisistwosamegen: x1=x2=%f",(-b)/(2*a)); elseif(disc>0) printf("thisistwodiffentgen: x1=%f,x2=%f",(-b+sqrt(disc))/(2*a),(-b-sqrt(disc))/(2*a)); } (2)给出一个百分制的成绩,要求输出成绩等级"A","B","C","D","E".90分以上的为"A",80~89分的为"B",70~79分的为"C",60~69分的为"D",60分以下的为"E". #include voidmain() { intscore; printf("请输入百分制成绩: "); scanf("%d",&score); if(score>=90)printf("等级: A\n"); elseif(score>=80)printf("等级: B\n"); elseif(score>=70)printf("等级: C\n"); elseif(score>=60)printf("等级: D\n"); elseprintf("等级: E\n"); } (3)编程序: 用scanf()函数给x赋值,分别为x<-1,-1<=x<=1,x>1三种情况,求y的值. #include voidmain() {floatx,y; printf("请输入x的值: "); scanf("%f",&x); if(x<-1) y=1; elseif(x<1) y=2*x+9; else y=5*x*x-3; printf("x=%f,y=%f\n",x,y); } 实验五: 循环结构程序设计参考答案 1.分析以下程序,画出控制流程图,判断输出结果,然后上机调试结果并回答问题. (1)程序改正后为: #include voidmain() { intx=567; do { printf("%c",x%10+'0'); }while(x/=10); } 以上程序输出结果为: 765,实现的功能为: 把一个整数反序输出. (2) #include voidmain() { inti; for(i=0;i<5;++i) { if(i==3)continue; printf("%d",i); } } 以上程序输出结果为: 0124,循环执行了5次.但只输出四次i的值,原因是当i==3的时候,执行continue语句,跳过下面的语句,转而去执行下一次循环. (3) 程序输出结果为: 10 012345678910 分析: 10的输出是由于第一个for循环后面有个分号,下面的printf语句就不再是它的循环体了.所以等到10次循环完了后,再执行printf语句,这时的i已经变成了10. 而第二行的输出是由于第二个for的循环体是printf语句.所以printf语句执行了10次,每次输出一个值. (4)程序输出结果为: 6 分析: for(;;)for 语句里面的三个表达式都缺省,只要第二个表达式缺省就构成了死循环.这是个知识点. (5)程序输出结果省略. 2.以下程序可能有多处错误,请改正并上机调试. 改正后的程序如下: #include voidmain() { inti=0,j=10,k=2,s=0; for(;;)//只能有两个分号,表示三个表达式都缺省. { i+=k; if(i>j)//后面不能有分号. { printf("%d\n",s); break; }//少了一个花括号. s+=i;//应该在if语句的外面. } } 3.在横线处给程序填空. (1)求1! +2! +3! +...+10! #include voidmain() { inti=1; longintt=1,sum=0; do { t=t*i; sum=sum+t; i++; }while(i<=10);//循环10次.每次循环sum累加i! printf("sum=%d",sum); } (2)打印九九表 #include voidmain() { inti,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(j printf("%8c",''); else printf("%d*%d=%-4d",i,j,i*j); printf("\n"); } } (3)求Fibonacci数列1,1,2,3,5,8...的前N(N为偶数)项. #include voidmain() { longintf1,f2; inti,n; scanf("%d",&n); f1=f2=1; printf("\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 #include
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 参考答案
![提示](https://static.bdocx.com/images/bang_tan.gif)