梅孝安C语言答案.docx
《梅孝安C语言答案.docx》由会员分享,可在线阅读,更多相关《梅孝安C语言答案.docx(64页珍藏版)》请在冰豆网上搜索。
梅孝安C语言答案
第一、二章C语言概述、算法
1.单项选择题
(1)【答】B
(2)【答】A(3)【答】C(4)【答】B(5)【答】C
2.填空题
(1)【答】①一②若干
(2)【答】分号(3)【答】函数(4)【答】将C源程序编译成目标代码
第三章数据类型及其运算
1.单项选择题
(1)【答】A
(2)【答】C(3)【答】B
(4)【答】3.6和123.45均为double型,运算结果也是double型。
本题答案为B。
(5)【答】选项A错误,以分号结尾是一个语句而不是表达式;选项B正确,是一个逗号表达式;选项C错误,因为%求模运算的两个运算数必须均为整数;选项D错误,给一个表达式(a+7)而非变量赋值是不正确的。
本题答案为B。
(6)【答】选项A的计算过程——x=1+2=3,再计算x=x*2=6;选项B的计算过程——y>2为真,x=6;选项C的计算过程——式中有两个--运算,最后y=1,x=9-1-1=7;选项D的计算过程——x=y*(int)(4.8/2)=y*2=6。
本题答案为C。
(7)【答】A、B、C、D选项各表达式的值分别是0、2、2、3。
本题答案为D。
(8)【答】m=i+++j等价于m=(i++)+j。
本题答案为A。
(9)【答】f+10=13.14159,(int)(f+10)=13,13%3=1。
本题答案为A。
(10)【答】++i返回3,j--返回4,两者不等,故n=0。
本题答案为A。
2.填空题
(1)【答】语句必须以分号结尾,而表达式结尾没有分号;语句可以出现在函数体中数据定义或声明语句后面的任何位置,而表达式只能出现在语句中规定的位置或表达式中(嵌套出现)。
(2)【答】强制类型转换
(3)【答】①c=(c>='A'&&c<='Z')?
c-'A'+'a':
c
②d=(d>='0'&&d<='9')?
d-'0':
d
③(x>y)?
x:
y
④(x>y)?
(x>z?
x:
z):
(y>z?
y:
z)或(x>y&&x>z)?
x:
(y>z?
y:
z)
(4)【答】字符串s由字符'a'、'b'、'\n'、'\\'、'\''、'\r'、'\b'等7个字符组成,故长度为7,但字符串本身有一个结束标志'\0'。
所以,s的长度为7,在内存中占用8个字节。
输出为:
8,7。
(5)【答】结果为y=6,x=6。
(6)【答】A,B,65,66
(7)【答】执行x=++i后,i=6,x=6;执行y=j++后,j=8,y=7;所以输出为:
6,8,6,7。
(8)【答】①:
1(a+2=3,c-100=-3,表达式结果=1(真))
②:
1(a>c的结果是0(假),f>4的结果是0,表达式结果=1)
③:
1(!
a的结果是0,!
f的结果是0,表达式结果=1)
④:
1(!
a&&1的结果是0,!
c||1的结果是1,表达式结果=1)
⑤:
0(!
a>2的结果是0,(!
a>2)?
3:
0的结果是0,f!
=1的结果是1,(f!
=1)?
0:
1的结果是0,表达式结果=0)
⑥:
1((1,2,3)表达式的结果是3,(3,3,3)的结果是3。
第四章顺序结构程序设计
1.单项选择题
(1)【答】D
(2)【答】B
(3)【答】scanf()函数中没有精度控制。
本题答案为D。
(4)【答】D(5)【答】D(6)【答】C(7)【答】C(8)【答】D(9)【答①B ②A(10)【答】输入的数据与scanf()函数的格式不匹配。
本题答案为D。
(11)【答】①A ②B
(12)【答】C(13)【答】C(14)【答】A(15)【答】A(16)【答】B(17)【答】D
2.填空题
(1)【答】3.141593,3.1416,3.142
(2)【答】3.500000,3.5
(3)【答】31.415920,3.141592e+001(4)【答】127,127,177,7f,127
(5)【答】127,127,177,7f,127(6)【答】c=K(7)【答】a=12,b=345
(8)【答】c=A(9)【答】n=64(10)【答】x=1.23,y=50.00
(11)【答】a=3b=7x=8.5y=71.82c1=Ac2=a↙
3.编程题
(1)编写一个程序,求出任一输入字符的ASCII码。
【解】程序如下:
#include
main()
{
charc;
printf("输入字符:
");
scanf("%c",&c);
printf("字符%c的ASCII码为%d\n",c,c);
}
(2)编写一个程序,输入一个字符,依次输出其前导字符、该字符和后续字符。
【解】程序如下:
#include
#definepi3.14159
main()
{
charc;
printf("输入一个字符:
");
scanf("%c",&c);
printf("输出结果:
%c,%c,%c\n",c-1,c,c+1);
}
(3)编写一个程序,输出任意一个十进制整数对应的八进制数和十六进制数。
【解】直接使用printf()的格式符输出八进制数和十六进制数。
程序如下:
#include
main()
{
inti;
printf("输入一个整数:
");
scanf("%d",&i);
printf("%d(10)<=>%o(8)\n",i,i);
printf("%d(10)<=>%x(16)\n\n",i,i);
}
(4)编写一个程序,从键盘输入圆锥体的半径r和高度h,计算其体积。
【解】圆锥体体积的计算公式为:
v=π×r×r×h/3
程序如下:
#include
main()
{
floatr,h,pi=3.1415,v;
printf("圆锥半径,高度:
");
scanf("%f,%f",&r,&h);
v=pi*r*r*h/3.0;
printf("圆锥体积=%g\n\n",v);
}
第五章
1.单项选择题
(1)【答】A
(2)【答】C(3)【答】选项B、C、D中的比较运算符不正确,在选项A中,a=b返回b,若b为0或空字符,则为假,否则为真。
本题答案为A。
(4)【答】B。
应改为if(x=y&&x!
=0)x+=y;(5)【答】D(6)【答】①A②A(7)【答】①D ②C(8)【答】A
2.填空题
(1)【答】x%2==0
(2)【答】a%b==0
(3)【答】a*a+b*b==c*c||a*a+c*c==b*b||b*b+c*c==a*a
(4)【答】(a+b(5)【答】k=2,执行case2分支,k++返回2,此时k=3,输出2,后跟一空格。
由于没有break语句,继续执行case3分支,k++返回3,此时k=4,输出3,由于有break语句,退出switch语句。
所以输出为:
23。
(6)【答】a>0,s变为2。
a>b为真,t=t+s=3。
所以输出为:
s=2,t=3。
(7)【答】k=2,执行case2分支,k++返回2,此时k=3,屏幕输出2,后跟一空格。
由于没有break语句,继续执行case3分支,k++返回3,此时k=4,屏幕输出3,由于没有break语句,继续执行case4分支,k++返回4,此时k=5,屏幕输出4,由于有break语句,退出switch语句。
所以输出为:
234。
(8)【答】x=0,执行外层switch语句的case0部分,y==2为真,则执行里层switch语句的case1部分,输出“*”,遇到break语句,退出里层的switch语句,由于里层的switch语句之后没有break语句,所以转而执行外层switch语句的case1部分,这时z=3,故执行里层switch语句的default部分,输出“#”,整个程序执行完毕。
所以输出为:
*#。
3.编程题
(1)编写一个程序判断用户输入的字符是数字字符、字母字符还是其他字符。
【解】在'0'到'9'之间的为数字字符,在'a'到'z'或'A'到'Z'之间的为字母字符;否则为其他字符。
程序如下:
#include
main()
{
charc;
printf("输入一个字符:
");
scanf("%c",&c);
if(c>='0'&&c<='9')
printf("\n%c是数字字符\n\n",c);
elseif((c>='a'&&c<='z')||(c>='A'&&c<='Z'))
printf("\n%c是字母字符\n\n",c);
else
printf("\n%c是其他字符\n\n",c);
}
(2)假设今天是星期日,编写一个程序,求123456天后是星期几。
【解】星期是7天一个轮回,由于今天是星期日,所以123456除以7的余数即为星期几。
程序如下:
#include
main()
{
intn=123456;
n=n%7;
printf("\n星期");
switch(n)
{
case0:
printf("天");
break;
case1:
printf("一");
break;
case2:
printf("二");
break;
case3:
printf("三");
break;
case4:
printf("四");
break;
case5:
printf("五");
break;
case6:
printf("六");
break;
}
printf("\n\n");
}
(3)编写一个程序,输入年号和月份,判断该年是否为闰年,并根据给出的月份判断是什么季节和该月有多少天?
闰年的条件是年号能被4整除但不能被100整除,或者能被400整除。
【解】直接根据闰年的定义求解,如果是闰年,2月份为29天;否则为28天,其他月份相同。
规定3~5月为春季,6~8月为夏季,9~11月为秋季,1、2和12月为冬季。
本题程序如下:
#include
main()
{
inty,m,leap,season,days;
printf("年份,月份:
");
scanf("%d,%d",&y,&m);
if((y%4==0&&y%100!
=0)||(y%400==0))
leap=1;
else
leap=0;
if(m>=3&&m<=5)
season=1;
elseif(m>=6&&m<=8)
season=2;
elseif(m>=9&&m<=11)
season=3;
else
season=4;
switch(m)
{
case1:
case3:
case5:
case7:
case8:
case10:
case12:
days=31;break;
case4:
case6:
case9:
case11:
days=30;break;
case2:
if(leap==1)
days=29;
else
days=28;
}
printf("%d年%s闰年\n",y,(leap==1?
"是":
"不是"));
printf("该季度是");
switch(season)
{
case1:
printf("春季\n");break;
case2:
printf("夏季\n");break;
case3:
printf("秋季\n");break;
case4:
printf("冬季\n");break;
}
printf("当月天数:
%d\n",days);
}
(4)报数游戏。
A、B、C、D、E、F、G、H共8人站成一排,按图4.1所示的方法从1开始报数。
问谁先报到123456?
A B C D E F G H
1→ 2→3→4→5→6→7→8
14←13←12←11←10←9
15→16→17→18→19→20→21→22
28←27←26←25←24←23
29→30→…
图4.1 游戏报数过程
【解】从图4.1中看到1到14是一个来回,再重复这一过程,所以只需对123456除以14的余数加以判断即可。
程序如下:
#include
main()
{
intn=123456,i;
i=n%14;
printf("\n报数到%d的人是",n);
switch(i)
{
case1:
printf("A");break;
case2:
case14:
printf("B");break;
case3:
case13:
printf("C");break;
case4:
case12:
printf("D");break;
case5:
case11:
printf("E");break;
case6:
case10:
printf("F");break;
case7:
case9:
printf("G");break;
case8:
printf("H");break;
}
printf("\n");
}
程序的运行结果:
报数到123456的人是D
(5)编写一个程序,求ax2+bx+c=0方程的根。
【解】先计算d=b2-4ac,再根据d是大于0、等于0还是小于0分别求根。
程序如下:
#include
#include
intfunc(floata,floatb,floatc,float*x1,float*x2)
{
floatd;
d=b*b-4*a*c;
if(d>0)
{
*x1=(-b+sqrt(d))/(2*a);
*x2=(-b-sqrt(d))/(2*a);
return2;
}
elseif(d==0)
{
*x1=(-b)/(2*a);
return1;
}
elsereturn0;
}
main()
{
floata,b,c,x1,x2,n;
printf("输入a,b,c:
");
scanf("%f,%f,%f",&a,&b,&c);
n=func(a,b,c,&x1,&x2);
if(n==2)
{
printf("两个根:
\n");
printf("\tx1=%f\n",x1);
printf("\tx2=%f\n",x2);
}
elseif(n==1)
{
printf("一个根:
\n");
printf("\tx=%f\n",x1);
}
elseprintf("没有根\n");
}
第六章
1.单项选择题
(1)【答】!
e等价于!
(e!
=0),即e==0。
本题答案为A。
(2)【答】D(3)【答】D(4)【答】A(5)【答】C(6)【答】A(7)【答】A(8)【答】B(9)【答】C
2.填空题
(1)【答】s=7
(2)【答】执行第1次循环时,i++返回1,i=2,s=3+1=4,执行else部分,i=3;执行第2次循环时,i++返回3,i=4,s=4+3=7,执行if部分;执行第3次循环时,i++返回4,i=5,s=7+4=11,执行else部分,i=6;执行第4次循环时,i++返回6,i=7,s=11+6=17,执行else部分,i=8,此时while条件不满足,退出循环。
所以输出结果为:
8。
(3)【答】使用两重循环。
本题答案为:
*
**
***
****
(4)【答】使用两重循环。
本题答案为:
1
2 2
3 3 3
4 4 4 4
5 5 5 5 5
6 6 6 6 6 6
(5)【答】使用两重循环。
本题答案为:
1
1 2 1
1 2 3 2 1
1 2 3 4 3 2 1
1 2 3 4 5 4 3 2 1
1 2 3 4 5 6 5 4 3 2 1
(6)【答】使用两重循环。
本题答案为:
*
* * *
* * * * *
* * * * * * *
* * * * *
* * *
*
3.编程题
(1)编写一个程序,求s=1-1/2+1/3-1/4…+1/99+1/100之值。
【解】使用一个for循环即可。
程序如下:
#include
main()
{
inti;
floats;
s=0;
for(i=1;i<=100;i++)
{
if(i%2==0) /*i为偶数*/
s=s-1.0/i;
else /*i为奇数*/
s=s+1.0/i;
}
printf("s=%f",s);
}
程序运行结果:
s=0.688172
(2)编写一个程序,求s=1+(1+2)+(1+2+3)+…+(1+2+3+…+n)的值。
【解】采用两层循环求解,外层i从1到n,里层从1到i。
程序如下:
#include
main()
{
inti,j,s1,s=0,n;
printf("输入n:
");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
s1=0; /*求1+…+i*/
for(j=1;j<=i;j++)
s1=s1+j;
s=s+s1;
}
printf("s=%d\n",s);
}
(3)编写一个程序,用户输入一个正整数,把它的各位数字前后颠倒一下,并输出颠倒后的结果。
【解】对于正整数n,从高位到低位依次计算出它的各位上的数字d,在计算出d后立即输出该数字,输出序列构成的数正好是n的各位数字前后颠倒的结果。
程序如下:
#include
main()
{
intn,d;
printf("输入一个正整数:
");
scanf("%d",&n);
printf("颠倒结果:
");
do
{
d=n%10;
printf("%d",d);
n=n/10;
}while(n!
=0);
printf("\n\n");
}
(4)编写一个程序,求输入的三个正整数的最小公倍数。
【解】采用穷举法求解。
输入三个整数分别为x,y和z,该最小公倍数一定是x的倍数。
程序使用while循环,倍增x查找满足s%y==0&&s%z==0条件的s。
程序如下:
#include
main()
{
intx,y,z,s;
printf("输入三个整数=>x,y,z:
");
scanf("%d,%d,%d",&x,&y,&z);
s=x;
while
(1)
{
if(s%y==0&&s%z==0)
break;
s+=x;
}
printf("最小公倍数:
%d\n",s);
}
(5)编写一个程序,求出200到300之间的数,且满足条件:
它们三个数字之积为42,三个数字之和为12。
【解】采用穷举法求解。
使用两重for循环嵌套语句,i、j、k分别表示该数的百位数、十位数、个位数,i只能是2,j和k进行循环。
程序如下:
#include
main()
{
inti,j,k;
i=2;
for(j=0;j<=9;j++)
for(k=0;k<=9;k++)
if(i*j*k==42&&i+j+k==12)
printf("i=%d,j=%d,k=%d\n",i,j,k);
}
(6)编写一个程序,求出满足下列条件的四位数:
该数是个完全平方数,且第一、三位数字之和为10,第二、四位数字之积为12。
【解】采用穷举法求解。
该数是一个四位数,其平方数只能在32到99之间,使用一个for循环即可。
程序如下:
#inc