C实验参考答案Word文档格式.docx
《C实验参考答案Word文档格式.docx》由会员分享,可在线阅读,更多相关《C实验参考答案Word文档格式.docx(34页珍藏版)》请在冰豆网上搜索。
=b+c||b==c;
logic=!
(a<
c)+b!
=1&
(a+c)/2;
logic=0
logic=1
2.以下程序可能有多处错误,请改正并调试运行程序。
#includeHIGH10//改为:
#includeHIGH10
{inta=5;
//可再定义一个变量b
HIGH*=HIGH;
//HIGH是宏名,不能被赋值,可改为:
b=HIGH*HIGH;
\n%d,%d"
a,HIGH);
//输出a,b的值
改正后的程序为:
#defineHIGH10
{inta=5,b;
b=HIGH*HIGH;
a,b);
5,100
(2)此程序功能为将输入的华氏温度转换成摄氏温度,公式为c=5/9·
(f–32)。
{floatc,f
;
scanf("
%f"
f)
//输入时,变量要用&
取地址
c=(5/9)·
(F–32)
//5/9是为0的,要变成实数。
F没有定义,定义的是f
printf(("
F=%f,C=%f\n"
f,c)
//多了一个左括号
}
voidmain()
floatc,f;
&
f);
c=(5.0/9)*(f-32);
F=%f,C=%f\n"
f,c);
(3)此程序功能是求:
y=
。
math.h>
{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
程序改正后为:
inta;
%d%lf"
x);
//scanf不能大写
y=sin(sqrt(a*x)+log(a+x));
//sin函数不能大写,ax应为a*a,LN不是有效的函数名,要求自然对数用的是log(),另外括号不匹配
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;
w=%d,f1=%f,f2=%f\n"
w,f1,f2);
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.分析以下程序,判断输出结果,然后上机调试验证结果。
main()
{inta,b;
charc,d;
scanf("
%d%d"
&
b);
%c%c"
c,&
d);
%d,%d,%c,%c\n"
a,b,c,d);
运行时输入:
3456ab<
回车>
再次运行时,输入:
34,56,a,b<
看一看运行结果。
程序改正为:
//头文件一定要包含
voidmain()
当输出为3456ab时,第一个scanf语句中的a,b变量接收了34和56两个数值,字符ab由第二个scanf语句的变量c,d接收。
(2)
{intx=34;
floaty=45.98;
printf("
%6d,%6.2f"
x,y);
voidmain()
{printf("
\n"
);
%10s%10s\n"
"
china"
Beijing"
%-10s%-10s\n"
%10.3s\n"
%10s输出时右对齐,%-10s输出时左对齐,%10.3s表示输出时只输出3个字符
intk=-1;
k=%d\n"
k);
k=%o\n"
k=%x\n"
k=%u\n"
计算机在做运算的时候,是用补码参与运算的。
int型的数据在VC里是用四个字节表示的。
变成补码后再做相应格式的输出。
(5)
{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<
stdio.h>
main()
{inti=97;
charch='
a'
putchar(i);
putchar('
\n'
);
putchar(ch);
输出
a
(7)
#include<
intch;
ch=getchar();
putchar(ch);
从键盘上接收一个字符,显示一个。
2.以下程序可能有多处错误,请改正并上机调试。
(1)输入三角形的三条边的长,求三角形的面积(假设输入的三边长能构成一个三角形)。
main()
{floata,b,c,s,area;
//应该定义成double型
%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头文件
a=%7.2f\nb=%7.2f\nc=%7.2f\narea=%7.2f\n"
a,b,c,area);
#include<
doublea,b,c,s,area;
%lf,%lf,%lf"
s=1.0/2*(a+b+c);
area=sqrt(s*(s-a)*(s-b)*(s-c));
a=%7.2lf\nb=%7.2lf\nc=%7.2lf\narea=%7.2lf\n"
(2)从键盘输入圆的半径的值,计算圆的周长和面积。
{floatr,c,area;
r)
c=2r*PI;
//2*r
area=r*r*PI;
//PI要定义成宏再用。
r=%f\n"
r);
c=%.2f\n"
c);
area=%10.2f\n"
area);
#definePI3.14159
floatr,c,area;
r);
c=2*r*PI;
(3)
略
3.编程题
(1)编程序计算平面上任意两点之间的距离。
floatx1,y1,x2,y2,c;
请输入第一个点的座标:
"
%f,%f"
x1,&
y1);
请输入第二个点的座标:
x2,&
y2);
c=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
两点距离为:
(2)从键盘上输入一个小写字母,用大写字母输出。
charc;
%c"
c-=32;
getchar(c);
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);
->
year);
第二处错误:
if((year%4=0&
year%100!
=0)OR(year%400==0))->
if((year%4==0&
=0)||(year%400==0))
第三处错误:
if(leap=1)->
if(leap==1)
3.在横线处给程序填空
(1)输入4个整数,按大小顺序输出
{inta,b,c,d,t;
%d,%d,%d,%d"
c,&
d);
if(a<
b)
{t=a;
a=b;
b=t;
if(b<
c)
{t=b;
b=c;
c=t;
if(c<
d)
{t=c;
c=d;
d=t;
}
(2)将字母换成小写
{charc;
if(c>
='
A'
c<
Z'
)c=c+32;
4.
(1)编写一个程序,求一元二次方程ax2+bx+c=0的根
{floata,b,c,x1,x2,disc;
pleaseinputa,b,c:
disc=sqrt(b*b-4*a*c);
if(disc<
0)
thisnotagenpleaseinputagain!
elseif(disc==0)
thisistwosamegen:
x1=x2=%f"
(-b)/(2*a));
elseif(disc>
thisistwodiffentgen:
x1=%f,x2=%f"
(-b+sqrt(disc))/(2*a),(-b-sqrt(disc))/(2*a));
(2)给出一个百分制的成绩,要求输出成绩等级"
A"
B"
C"
D"
E"
.90分以上的为"
80~89分的为"
70~79分的为"
60~69分的为"
60分以下的为"
.
intscore;
请输入百分制成绩:
score);
if(score>
=90)printf("
等级:
A\n"
elseif(score>
=80)printf("
B\n"
=70)printf("
C\n"
=60)printf("
D\n"
elseprintf("
E\n"
(3)编程序:
用scanf()函数给x赋值,分别为x<
-1,-1<
=x<
=1,x>
1三种情况,求y的值.
{floatx,y;
请输入x的值:
if(x<
-1)
y=1;
elseif(x<
1)
y=2*x+9;
else
y=5*x*x-3;
x=%f,y=%f\n"
x,y);
实验五:
循环结构程序设计参考答案
1.分析以下程序,画出控制流程图,判断输出结果,然后上机调试结果并回答问题.
(1)程序改正后为:
intx=567;
do
{
x%10+'
0'
}while(x/=10);
以上程序输出结果为:
765,实现的功能为:
把一个整数反序输出.
inti;
for(i=0;
i<
5;
++i)
if(i==3)continue;
i);
0124,循环执行了5次.但只输出四次i的值,原因是当i==3的时候,执行continue语句,跳过下面的语句,转而去执行下一次循环.
程序输出结果为:
10
012345678910
10的输出是由于第一个for循环后面有个分号,下面的printf语句就不再是它的循环体了.所以等到10次循环完了后,再执行printf语句,这时的i已经变成了10.
而第二行的输出是由于第二个for的循环体是printf语句.所以printf语句执行了10次,每次输出一个值.
(4)程序输出结果为:
6
for(;
)for
语句里面的三个表达式都缺省,只要第二个表达式缺省就构成了死循环.这是个知识点.
(5)程序输出结果省略.
改正后的程序如下:
inti=0,j=10,k=2,s=0;
for(;
)//只能有两个分号,表示三个表达式都缺省.
i+=k;
if(i>
j)//后面不能有分号.
{
printf("
s);
break;
}//少了一个花括号.
s+=i;
//应该在if语句的外面.
3.在横线处给程序填空.
(1)求1!
+2!
+3!
+...+10!
inti=1;
longintt=1,sum=0;
t=t*i;
sum=sum+t;
i++;
}while(i<
=10);
//循环10次.每次循环sum累加i!
sum=%d"
sum);
(2)打印九九表
inti,j;
for(i=1;
=9;
i++)
%4d"
=36;
'
-'
for(j=1;
j<
j++)
if(j<
i)
printf("
%8c"
'
else
%d*%d=%-4d"
i,j,i*j);
(3)求Fibonacci数列1,1,2,3,5,8...的前N(N为偶数)项.
longintf1,f2;
inti,n;
n);
f1=f2=1;
//先换行
=n;
%12ld%12ld"
f1,f2);
if(!
(i%2))//每输出两次换行,每次输出2项,也就是每次输出四项了再换行.
f1=f2+f1;
//让下一次for循环输出的f1的值是前两个数的和
f2=f2+f1;
//让下一次for循环输出的f2的值是前两个数的和
4.编程题
(1)输入一行字符,分别统计出其中的英文字母,空格,数字和其他字符的个数.
s