C实验参考答案.docx
《C实验参考答案.docx》由会员分享,可在线阅读,更多相关《C实验参考答案.docx(42页珍藏版)》请在冰豆网上搜索。
![C实验参考答案.docx](https://file1.bdocx.com/fileroot1/2023-7/10/53dac103-a78a-49d9-96a0-c88f04ff2409/53dac103-a78a-49d9-96a0-c88f04ff24091.gif)
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