习题参考答案与分析1文档格式.docx
《习题参考答案与分析1文档格式.docx》由会员分享,可在线阅读,更多相关《习题参考答案与分析1文档格式.docx(35页珍藏版)》请在冰豆网上搜索。
160为十进制数,0xffff为十六进制数,011为八进制数,0L表示长整数
C选项中:
01为八进制数,32768u为无符号整数,0617为八进制数,0x163为十六进制数
D选项中:
0x48a为十六进制数,0205为八进制数,0x0为十六进制数,-256为负数。
5.A(考查整型常数的表示方法)
6.A(考查无符号字符型的表示范围)
参见书中第25页的表2.2
7.D
这个题本身是有错的,D选项应该是少了一个单撇号,A选项的错误解释见24页
8.D
考查不同类型整数尾符的表示方法,前三个既可表示成整数,也可以理解为长整型,只有D才明确地由尾符L表示为长整型了。
9.B
(考查字符与整型数之间的转换,说明字符在内存中是以整型数的形式存放的)
参见P319页的“附录C:
ASCII代码表”
字符B的ASCII码值为66,字符E的ASCII码值为69,字符a的ASCII码值为97,字符A的ASCII码值为65,
所以,c2-c1=69-66=3,c2+’a’-‘A’=69+97-65=101,但由于按照%c的格式输出,所以ASCII码值101对应的字符为e。
10.C(考查不同数制型数据的转换与表示)
printf语句中的%d,意味着需要按照十进制整数形式打印出结果。
u=010为八进制数,转化为十进制数为
=8
v=0x10为十六进制数,转化为十进制数为
=16
w=10本身就是十进制数
11.C(同第9题)
12.B
这个题向我们展示这样一个道理,当我们向计算机表示不同进制数据时,我们必须按要求写上前导符,如0开头啊,0X开头什么的,但计算机向我们表示各种进制时是没有前导符的,除非我们自己设置。
k=15为十进制数,而在printf语句中,需要将该数分别用十进制数,八进制数以及十六进制数表示。
13.C(考查宏定义常数)
参见第28页“
(1)宏定义”相关内容
14.A(考符符号定义常数)
参见第28页“
(2)const定义”相关内容
15.B(考查scanf的数据输入)
参见第35页的一句话“当一个scanf()函数中包含若干个输入项或几个scanf()函数连续出现时,可以依次输入几个数据,各数据之间只能用空格、制表符或回车符分隔,其他符号都不能作为分隔符”。
选项B中,各数据是用逗号分隔的,所以错误。
16.B(考查点与第15题相同)
17.A(考查点与第15题相同)
18.B(考查点与第15题相同)
二填空题
1.2个字节,1个字节
“C”是字符串常量,由第25页的一句话“一个含有n个字符的字符串常量要占用n+1个字节的存储空间”,因此“C”占用的存储空间为1+1=2个字节
‘C’是字符常量,占用1个字节
2.#define标识符字符串
3.unsignedint,double,char
参见第22页“3.基本数据类型的扩展”
4.10,8,16
5.4
参见第23页的表2.2
6.stdio.h
7.0,%s
8.5.0,4,c=3
9.a=1,b=2
三编程题
1.将100按不同进制输出
#include<
stdio.h>
voidmain()
{
inta=100;
printf("
%o,%d,%x\n"
a,a,a);
}
本题考查的是对整数的不同输出格式控制。
2.输入一个实数,按不同的格式输出。
floata;
scanf("
%f"
&
a);
%.2f,%.2e\n"
本题考查的是对实数的不同输出格式控制,但本题有点小问题,作者没有搞清楚什么是有效数字,应该改为保留两位小数。
3.按不同形式输出一个字符。
charch1='
a'
ch2='
;
%c,%d,%o,%x\n"
ch1,ch1,ch1,ch1);
ch2,ch2,ch2,ch2);
本题没什么意义,只需要用一个变量就可以了,考查的是对字符型数据的不同格式输出。
第三章习题解答(陈勇)
一、选择题
1.C,考查运算符运算规则
2.DC,考查C语言中的数据类型自动转换
3.A,这种题可以给两个变量任意赋个整数,然后代入表达式计算,根据计算结果来选择。
4.C,这种题将a,b分别赋值为5,7和7,5根据结果选择。
5.C,考查运算符运算特点
6.C,A、B中第二个赋值号左侧不是一个变量,而是一个表达式,右侧的值不可能赋给一个表达式;
D中第二个赋值号左侧是常量7,一个变量的值不可能赋给一个常量。
7.C,sqrt函数返回值是double类型。
8.B,--、++的赋值特点
9.A,复合赋值运算符的特点
10.C,强制类型转换
11.B,同9题
12.D,同第6题
13.D,同9题
14.C,同第9题
15.C,给两变量代入两个值算一下即可。
16.A,B中%两侧必须是整数,C中2不能赋给a*3,D中强制类型转换错误
17.A,同9题
18.C,“/”两侧为整型数时,计算结果也是整型数。
19.B,那个赋值表达式可以改写为:
a=2+(c=c+(c++,c+8,++c));
其中:
(c++,c+8,++c)是一个逗号表达式,运算从左到右,表达式最后的值为最后一个表达式的计算结果,这三个互不相关,但因为++c是先+再用,c++是先用后加(这里所谓的后加是指整个表达式运算结束后再自加),所以,C初值为5,++C后变成6,原表达式变为:
a=2+(c=6+6),即a=14
20.A,printf中涉及两个逗号表达式,逗号表达式的结果为最后一个表达式的值,所以前者为a的值,后者为a+b的值。
21.B,&
&
运算符连接多个表达式时,从左向右只要有一个表达式值为0,后面表达式都不再运行。
22.A,不解释
23.C,不解释
24.D,不解释
25.C,原因同21
26.A,不解释
27.C,++,--运算规则
28.C,因为计算结果是一个整数。
二、填空题
1.double
2.2,a++*1/5相当于两个语句,a*1/5;
a++;
3.0.0,因为整型变量a的值为1。
4.666.06.7,高级别的数据类型向低级别类型变量赋值引起数据丢失。
5.5,4,c=3,scanf中的格式控制符中如果加入了其它符号,输入时必须原样输入。
6.1
7.a==0
8.0
9.6
10.x=2,y=1,这是一种不借助第三个变量交换两个变量值的方法,尽管很变态。
三、编程题
见习题答案。
不解释。
第四章程序流程控制(韩宏)
15.该程序的功能是输出1-50内能同时被2、3、7整除的数。
所以选择“D”。
17.该程序的功能是对输入的字符串中的大写字母转换成小写字母,而小写字母转换成大写字母。
所以选择“B”。
18.相当一部分同学可能会选择“D”,主要是没有注意while后的表达式a=14,也就是说第二次循环时,变量a的值是14,而不是12,所以结果是“B”。
1.从键盘输入100个整数,从中找出最大数和最小数。
编程思想:
假设最大数是max,最小数是min。
当只有一个数时,它既是最大数又是最小数,所以当输入第一个数时,它既是最大数又是最小数,以后每输入一个数,都与最大数max和最小数min进行比较,如果大于max,就赋给max;
否则如果小于min,就赋给min。
最后所有数据都比较完,max就是所有数中最大数,min就是所有数中最小数。
Voidmain()
inti,a,max,min;
scanf(”%d”,&
//输入第一个数
min=a,max=a;
//令第一个数既是最大数又是最小数
for(i=2;
i<
=100;
i++)//从第二个数开始与最大数和最小数比较
Scanf(”%d”,&
If(min>
a)min=a;
//如果比最小数还小,此数作为最小数
If(max<
a)max=a;
//如果比最大数还大,此数作为最大数
Printf(“max=%d,min=%d\n”,max,min);
2.编制程序计算4个已知数a,b,c,d的最小公倍数。
从键盘输入4个整数a,b,c,d,将其中一个(例如a)存入s中,判断s能否同时被b,c,d整除,若能整除,s就是最小公倍数;
否则,将s增加a,再继续上述的判断,直到s能被b,c,d同时整除为止。
{inta,b,c,d,s;
scanf(“%d%d%d%d%d”,&
a,&
b,&
c,&
d);
s=a;
while(!
(s%b==0&
s%c==0&
s%d==0))//如果s不能同时被b,c,d整除
s+=a;
printf(“a=%d,b=%d,c=%d,d=%d,s=%d\n”,a,b,c,d,s);
3.试编程计算1!
+2!
+…+20!
。
求n!
就是求1~n之间所有自然数的乘积,令p=1,变量i从1循环到n,则p*i就是n!
{inti;
floats=0,p=1;
for(i=1;
=20;
i++)
{p=p*i;
//求i!
s=s+p;
的累加和
printf(“%1d”,s);
4.编制程序打印出100以内的所有素数。
素数的特点是除了1和本身外,不能被其他任何整数整除。
对一个数m,只要判断它不能被2~m-1之间的任何整数整除就可以了。
{intm,i,flag;
for(m=3;
m<
m++)
{flag=1;
//变量flag是设立素数的标记
for(i=2;
m;
if(m%i==0)//如果m被2~m-1之间的任何整数整除
{flag=0;
break;
}//令flag=0,并退出内循环
if(flag)printf(“%d”,m);
//如果flag=1,则m为素数,输出m
5.编制程序用辗转相除法求a和b的最大公约数。
算法为:
将较大的数放在变量a中,较小的数放在变量b中。
然后求a除以b的余数r。
如果r为0,则除数b即为最大公约数;
否则,将b存入a,将r存入b,反复求a和b的余数r,直到余数r为0.
{intr,a,b;
scanf(“%d%d”,&
b);
if(a>
b)//若a>
b,交换a,b
{r=a;
a=b;
b=r;
}
r=a%b;
//求a除以b的余数
while(r)//余数r不为0,继续求余数r
{a=b;
printf(“%d\n”,b);
6.编制程序是用二分法求方程2x3-4x2+3x-6=0在区间[1,5]中的一个实根,并要求绝对误差不超过0.001。
算法为,假设在区间[m,n]中f(m)与f(n)异号。
先取区间的中点r,如果|f(r)|<
0.001,则r是方程的近似根;
否则,若f(r)与f(m)异号,则取新的解区间为(m,r),反之取新的解区间为(r,n)。
不断对解区间对分,直到解区间已经小于给定的误差时,取该区间的中点作为解的近似值。
math.h>
floatf(floatx){return2*x*x*x-4*x*x+3*x-6;
}//自定义函数
{floatm=1.n=5,r;
r=(m+n)/2;
//区间对分
while(fabs(f(r))>
=0.001)
{if(f(r)*f(m)>
0)m=r;
//确定新的解区间
elsen=r;
r=(m+n)/2;
//得到解的近似值
}
printf(“Answeris%6.3f\n”,(m+n)/2);
//输出解的近似值
第五章(王娟勤)
【5-1-4】
#include<
main()
inti,a[10];
for(i=9;
i>
=0;
i--)
a[i]=10-i;
//从此处可以看出下标是i的元素中放的数据是10-i
%d%d%d"
a[2],a[5],a[8]);
【5-1-9】
设已定义chars[]="
\"
abcd\\English\"
\n"
则字符串s所占的字节数是______________。
A.19B.18C.15D.14
解释:
为一个转意字符,代表一个"
,\\代表字符\,\n代表回车换行。
【5-1-10】
考察的内容是数组初始化,定义时不赋初值,第一维和第二维都不可省略,如有初始化,第一维的大小可省,但第二维的大小不能省。
【5-1-11】
string.h>
charw[][10]={"
ABCD"
"
EFGH"
IJKL"
MNOP"
},k;
for(k=1;
k<
3;
k++)
printf("
%s\n"
w[k][k]);
用%s输出时,从给出的起始地址开始输出字符,直到遇到'
\0'
程序中第一次循环时,以&
w[1][1]为起始地址,所以输出字符串"
FGH"
,第二次循环时以&
w[2][2]为起始地址,输出"
KL"
【5-1-12】
考察的内容是字符数组的初始化,用字符串和字符常量对字符数组的初始化时字符数组元素的个数不同,字符串初始化时,字符数组的元素个数等于字符串长度加1,字符常量初始化时,字符数组元素的个数与字符常量的个数相同。
【5-1-16】
chars[100];
intc,i;
%c"
c);
//将输入的1作为字符接收
%d"
i);
//将23作为整数接收
%s"
s);
//将456作为一个字符串接收,%s输入字符串时,以空格或回车做为字符串结束标志,停止接收。
%c,%d,%s\n"
c,i,s);
【5-1-18】
{charch[7]={"
65ab21"
};
inti,s=0;
for(i=0;
ch[i]>
='
0'
&
ch[i]<
9'
i+=2)
s=10*s+ch[i]-'
%d\n"
第一次循环,处理ch[0],其中存放’6’,’6’-‘0’值为6,故s的值为6
第二次循环,处理ch[2],其中存放’a’,使ch[i]>
条件为假,循环终止。
所以打印输出6.
【5-1-19】
chars[]="
12134211"
intv1=0,v2=0,v3=0,v4=0,k;
for(k=0;
s[k];
switch(s[k])
{default:
v4++;
case'
1'
:
v1++;
3'
v3++;
2'
v2++;
v1=%d,v2=%d,v3=%d,v4=%d\n"
v1,v2,v3,v4);
此题考查switch语句中default与case的顺序颠倒,而且没有break时开关语句的执行过程。
s[k]的值与case语句后面的常量表达式都不匹配时,执行default后面的语句,但default后面的语句没有break,所以会继续执行case‘1’,case‘3’,case‘2’,后面的语句;
如果s[k]的值与case后面的常量表达式值其中一个匹配,则执行其后面的语句,由于没有break,所以会顺序执行后面case中的表达式的值。
【5-1-20】
charst[20]="
hello\0!
\t\\"
%d,%d\n"
strlen(st),sizeof(st));
所有的字符串处理函数都是从给出的起始地址开始处理字符串,直到遇到'
sizeof(st)是运算数组st所占字节数,为20。
【5-2-6】
将字符数组a中下标值为偶数的元素从小到大排列,其他的元素不变。
chara[]="
clanguage"
t;
inti,j,k;
k=strlen(a);
=k-2;
i+=2)//从下标是0的元素处理起,对下标是偶数的元素排序
for(j=i+2;
j<
k;
j+=2)//取i后偶数下标元素a[j]
if(a[i]>
a[j])//a[j]与a[i]比较,如果a[i]>
a[j],则互换
{t=a[i];
a[i]=a[j];
a[j]=t;
puts(a);
printf("
);
课后编程题中1、2、3、4,补充实现两个字符串比较函数
1.求矩阵主、次对角线及四周元素之和。
程序代码:
#defineN5
{inta[N][N],i,j,s1,s2,s3;
printf("
Enterelementsofmatrixa,rowbyrow:
N;
i++)//用循环嵌套给二维数组的每个元素赋值
for(j=0;
j++)
scanf("
a[i][j]);
s1=0;
s2=0;
s3=0;
i++)//求主对角线元素和
s1+=a[i][i];
i++)//求次对角线元素和
s2+=a[i][N-1-i];
i++);
//求二维数组第0列和N-1列的和
s3=s3+a[i][0]+a[i][N-1];
for(j=1;
N-1;
j++)//求二维数组第0行和N-1行(除了本行第一和最后一个元素)的和
s3=s3+a[0][j]+a[N-1][j];
s1=%ds2=%ds3=%d\n"
s1,s2,s3);
另解:
根据主、次对角线及四周元素特点做循环。
#include<
{
{
a[i][j]=rand()%9+1;
//为了调试方便用随机数生成元素值。
%4d"
a[i][j]);
//同时输出各元素值。
}
//换行
s1=s2=s3=0;
//给累加器赋初值
i++)
if(i==j)s1+=a[i][j];
//主对角线求和
if(i+j==N-1)s2+=a[i][j];
//次对角线求和
if(i*j==0||i==N-1||j==N-1)s3+=a[i][j];
//周边元素求和
//因为三类元素有可能有重复,所以用的是三个单分支选择结构,而不能用多分支选择。
}
2.归并排序
#defineM5
#defineN4
{inta[M],b[N],c[M+N],i,ia=0,ib=0,ic=0;
Entertheelementofarraya:
M;
scanf("
a[i]);
Entertheelementofarrayb:
b[i]);
while(ia<
M&
ib<
N)//依次扫描数组a和数组b中的元素
{if(a[ia]<
=b[ib])//比较数组a和b中当前元素的值,将元素值较小的赋给c,如此直到数组a和b扫描完毕。
c[ic++]=a[ia++];
else
c[ic++]=b[ib++];
if(ia>
=M)//如果a数组中的元素已归并完,将b数组中余下部分赋给c即可。
while(ib<
N)
else//如果b数组中的元素已归并完,将a数组中余下部分赋给c即可。
while(ia<
M)
c[ic++]=a[ia++];
Matrixa:
for(i=0;
a[i]);
\nMatrixb:
pri