第34567章C语言设计 习题答案.docx
《第34567章C语言设计 习题答案.docx》由会员分享,可在线阅读,更多相关《第34567章C语言设计 习题答案.docx(24页珍藏版)》请在冰豆网上搜索。
![第34567章C语言设计 习题答案.docx](https://file1.bdocx.com/fileroot1/2023-1/31/d0cd05a1-4c27-498e-9c28-db638ab93170/d0cd05a1-4c27-498e-9c28-db638ab931701.gif)
第34567章C语言设计习题答案
第三章习题答案
1.掌握算法必须要掌握的五个特性:
a)有穷性。
算法执行步骤的次数有限,能在有限时间内完成。
b)确切性。
每一步操作的执行步骤、执行结果确定,不能有二义性。
c)有效性。
算法中的每一步操作都是可执行的,即算法的每一步都能通过手工或机器在有限时间内完成。
d)必须有零个或多个输入。
e)必须有一个或多个输出。
2.算法是指令的有限序列,是求解问题显式的一步一步进行的过程。
为程序编写提供依据。
程序是用C语言单词将算法表达出来的过程。
算法是程序的灵魂。
3.数据类型总体分为三类:
a)对象类型。
对象类型的基本类型又分为整型、浮点型、字符型。
b)函数类型。
c)不完全类型。
4.整型可分为:
a)有符号整数。
它又包括shortint、int、longint、longlongint。
b)无符号整数。
它又包括unsignedshortint、unsignedint、unsignedlongint、unsignedlonglongint。
不同数据类型数据的值域范围不同。
5.合法的标识符有:
scanf、x、x1、_y、_y2x、printf、main
合法标识符由英文字母、数字、下划线组成,且第一个字符只能是英文字母或下划线。
关键词不能成为合法标识符。
6.略
7.18.567的内存示意图如下:
0
10000011
10010100100010010011011
8.变量名:
x数据对象:
3
存储地址:
&x存储单元:
8(在VS2005中)
9.0x13B1:
十六进制int型字面值;
3e3:
十进制int型字面值;
‘d’:
字符型字面值;
“myuniversity”:
字符串型字面值;
99:
十进制int型字面值;
023:
八进制int型字面值;
1.3e-4:
double型浮点型字面值;
33U:
十进制unsignedint型字面值;
034L:
八进制longint型字面值;
0x34UL:
十六进制unsignedlongint型字面值;
30.23L:
十进制longdouble型字面值;
30.23F:
十进制float型字面值;
10.\?
:
?
\’:
’\”:
”\\:
\
\233:
表示八进制int型整数233
\x2f:
表示十六进制int型整数2f。
11.ASCII码其实就是编号,给每个常用字符(英文字母,各种符号)编号,ASCII规定了127个字符。
这几个字符的编码是a(97)、A(65)、0(48)
12.转换说明由以下成员组成:
a)0个或多个标识符,指定对齐方式、填充字符、正负数的标识及前缀;
b)最小宽度说明,指定数据显示的最小宽度。
c)精度说明,指定小数位数。
d)长度修正说明符,确定参数类型。
e)转换操作符,确定转换之后的数据类型。
13.%08d:
输出十进制整数,最小宽度为8位,不足8位则用0填充;
%8.4d:
输出十进制整数,最小宽度为8位,精度为4;
%-8.4d:
输出十进制整数,左对齐显示数据,最小宽度为8位,精度为4;
%9d:
输出十进制整数,最小宽度为9位。
第四章习题答案
1.有效表达式有:
(2)(3)(5)。
其值的类型均为浮点型。
f==0无效,两个进行比较的数的类型不相同。
f%2为无效表达式,%符号只能用于整数。
2.j++=++j非有效表达式。
j++为右值,右值不能放在“=”的左面;
j++&++j是有效表达式,若j为0,则有效表达式的值为1。
3.(3)和(5)发生类型转换时会丢失精度
4.源码:
10000000000000000000000001101111
反码:
111111*********11111111110010000
补码:
111111*********11111111110010001
5.源码:
00000000000000000000111100100100
反码:
00000000000000000000111100100100
补码:
00000000000000000000111100100100
6.2.5
7.4.5
8.
(1)24
(2)10(3)60
(4)0(5)0(6)0
9.
(1)0
(2)1(3)1(题目中有个y未定义)
(4)1
11.-2147483647(题目中变量x多个F)
12.在VS2005中,原题目中表达式的值分别为:
4、4、4、8
第五章习题答案
1.写出与“if(!
e)”等价的表达式。
if(0==e)
2.程序补充,并画出流程图。
(1)j=k/11,0!
=k%11
(2)流程图如下:
图5-1 do-while循环结构示意图
3.使用for语句改写后的代码为:
#include
#include
int main(void)
{
int i=0,j,k;
/*for语句重写上例代码*/
for(k=316;0!
=k%11;)
{
++i;
k=316–13*i;
j=k/11;
}//for
printf("316=13*%d+11*%d",i,j);
system("PAUSE");
return 0;
}
流程图如下:
图5-2 for循环结构示意图
4.使用while语句改写后的代码为:
#include
#include
int main(void)
{
int i=0,j,k=316;
/*while语句重写上例代码*/
while(0!
=k%11)
{
++i;
k=316–13*i;
j=k/11;
}//while
printf("316=13*%d+11*%d",i,j);
system("PAUSE");
return 0;
}
流程图如下:
图5-2 for循环结构示意图
5.11次
6.0
7.程序代码如下:
(见习题与实验手册)
#include
#include
intmain(void)
{
inti,j,k,tmp;
for(i=1;i<=9;i++)
{
for(j=0;j<=9;j++)
{
for(k=0;k<=9;k++)
{
tmp=i*100+j*10+k;
if(tmp==i*i*i+j*j*j+k*k*k)
printf("%d",tmp);
}//for
}//for
}//for
printf("\n");
system("PAUSE");
return0;
}
8.
(1)该程序的功能是:
计算级数
的前10项和(即n=10时的s的值)。
(2)流程图:
图5-4 习题8的流程图
9.程序代码如下所示:
#include
#include
intmain()
{
inti,j,k;
for(i=1;i<=9;++i)
{
for(j=1;j<=i;++j)
{
printf("%d*%d=%d\t",j,i,i*j);
}//for
printf("\n");
}//for
system("PAUSE");
return0;
}
10.
(1)for循环程序代码如下所示:
#include
#include
#include
intmain()
{
doublepi=0;
intn=1,t=1;
//当新加的项>1e-8时才加入
for(;fabs(1.0*t/n)>1e-8;t*=-1,n+=2)
{
pi+=1.0*t/n;
}//for
printf("PI=%.7f\n",4.0*pi);
system("PAUSE");
return0;
}
(2)while循环程序代码如下所示:
#include
#include
intmain()
{
doublepi=0;
intn=1,t=1;
//当新加的项>1e-8时才加入
while(fabs(1.0*t/n)>1e-8)
{
pi+=1.0*t/n;
t*=-1;
n+=2;
}//while
printf("PI=%.7f\n",4.0*pi);
system("PAUSE");
return0;
}
(3)do-while循环程序代码如下所示:
#include
#include
intmain()
{
doublepi=0;
intn=1,t=1;
//当新加的项>1e-8时才加入
do
{
pi+=1.0*t/n;
t*=-1;
n+=2;
}while(fabs(1.0*t/n)>1e-8);
printf("PI=%.7f\n",4.0*pi);
system("PAUSE");
return0;
}
第六章习题答案
1.
(1)*q的等价表达式是:
x
(2)x代表3在内存中的存储单元所存储的数据;*q代表指针q指向的哪个单元(即x)的存储数据;q代表指针变量q在内存中的存储单元所存储的数据(即变量x的地址);&x表示变量x在内存中的存储地址值;&q表示指针变量q在内存中的存储地址值。
2.
(1)*q的等价表达式:
y、**q2等
(2)*q2的等价表达式:
q、&x等
(3)**q2的等价表达式:
*q、y等
(4)q2的等价表达式:
&q等
3.
(1)对于p1:
const修饰p1,则p1的值不能改变,即p1不能指向其它元素,且必须在定义时初始化。
(2)对于p2:
const修饰*p2,则*p2的值不能改变。
(3)对于p3:
const既修饰p3,又修饰*p3,则p3和*p3的值都不能改变,且必须在定义时初始化p3。
4.*p的结果不可知。
由于p是double型指针变量,即与*p“捆绑”的是一块占8个字节的内存单元(在VS2005中);而在初始化时,令p指向变量x的存储首地址,则实际上与*p“捆绑”在一起的是以变量x的存储空间首地址为首地址的连续的8个字节的存储空间(在VS2005中),则*p的值应该是这8个字节所存储的数据;但是变量x只占据4个字节的内存存储空间,故其余4个字节存储空间的数据不明,即*p的结果不可知。
5.*p的结果是double型变量x的前4个字节存储空间所存储的数据。
由于p是int型指针变量,即与*p“捆绑”的是一块占4个字节的内存单元(在VS2005中);而在初始化时,令p指向double型变量x的存储首地址,则实际上与*p“捆绑”在一起的是以变量x的存储空间首地址为首地址的连续的4个字节的存储空间(在VS2005中),则*p的值应该是这4个字节所存储的数据,即*p的结果为double型变量x在内存中前4个字节所存储的数据。
6.p+1的值是:
0x0000001E。
由于p是一个int型指针变量,即与*p“捆绑”在一起的是4个字节单元,则p+1指向变量x的内存地址的下4个字节的存储首地址。
7.p+1的值是:
0x00000022。
由于p是一个double型指针变量,即与*p“捆绑”在一起的是8个字节单元,则p+1指向变量x的内存地址的下8个字节的存储首地址。
8.
(1)p1==p2的值为0。
由于p1指向变量x的存储空间首地址,p2指向变量y的存储空间首地址,即指针变量p1和p2的值分别是变量x和变量y的存储空间首地址,显然p1!
=p2。
(2)若要使p1==(p2+1),则在内存空间中,必须要求变量x的存储空间在物理位置上位于变量y的存储空间的下一单位字节处(此处8个字节为一个单位)。
9.
(1)p3的等价表达式:
&p2等
(2)*p3的等价表达式:
p2、&p1等
(3)**p3的等价表达式:
*p2、p1、&x等
(4)***p3的等价表达式:
**p2、*p1、x等
10.等价表达式有:
scanf(“%d”,p);、scanf(“%d”,&(*p));、scanf(“%d”,*(&p));
11.语句“int*p=0;”只是定义了一个指针,且使该指针不指向任何空间,即p不指向任何内存空间,则输入的时候不能使用p指向的地址来接收数据。
12.语句“int*p=0;”只是定义了一个指针,且使该指针不指向任何空间,即p不指向任何内存空间,则输出的时候不能使用p指向的地址空间来引用数据。
第七章习题答案
1.请声明一个10个元素的一维整型数组,并用{1,2,4,5,6,7,8,9,10}初始化。
答:
inta[10]={1,2,4,5,6,7,8,9,10};
2.请声明一个10行10列的浮点型二维数组,并用{1,2,4,5,6,7,8,9,10}初始化第一行的10个元素。
答:
floata[10][10]={1,2,4,5,6,7,8,9,10}
3.请编程找出一维数组中的最大数。
答:
#include
#include
#include
#defineSIZE10
intmain(void)
{
inta[SIZE];
inti;
intmax=INT_MIN;
for(i=0;i{
printf("请输入%d个整数(输完一个回一次车):
",i+1);
scanf("%d",&a[i]);
}
for(i=0;i{
if(max{
max=a[i];
}
}
printf("数组a中的最大数为:
%d\n",max);
system("PAUSE");
return0;
}
4.请编程找出二维数组中的最小数。
答:
#include
#include
#include
#defineROW3
#defineCOL4
intmain(void)
{
inta[ROW][COL];
inti;
intmin=INT_MAX;
printf("请输入%d个数!
\n",ROW*COL);
for(i=0;i{
printf("请输入%d行第%d列个整数(输完一个回一次车):
",i/COL+1,i%COL+1);
scanf("%d",&a[i/COL][i%COL]);
}
for(i=0;i{
if(min>a[i/COL][i%COL])
{
min=a[i/COL][i%COL];
}
}
printf("数组a中的最小数为:
%d\n",min);
system("PAUSE");
return0;
}
5.请编程求出二维整型数组中所有元素的平均值。
答:
#include
#include
#include
#defineROW3
#defineCOL4
intmain(void)
{
inta[ROW][COL];
inti;
intsum=0;
floataverage=0;
printf("请输入%d个数!
\n",ROW*COL);
for(i=0;i{
printf("请输入%d行第%d列个整数(输完一个回一次车):
",i/COL+1,i%COL+1);
scanf("%d",&a[i/COL][i%COL]);
}
for(i=0;i{
sum+=a[i/COL][i%COL];
}
average=(sum*1.0)/(ROW*COL);
printf("数组a中的整数的平均值为:
%d\n",average);
system("PAUSE");
return0;
}
6.请编程对一维整型数组中的元素进行排序(从小到大或从大到小)。
答:
#include
#include
#include
#defineSIZE10
intmain(void)
{
inta[SIZE],temp;
inti=0,j=0;
intmax=INT_MIN;
/*输入*/
for(i=0;i{
printf("请输入%d个整数(输完一个回一次车):
",i+1);
scanf("%d",&a[i]);
}
/*排序*/
for(i=0;i{
for(j=0;j{
if(a[j]>a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
/*输出*/
printf("排序后的结果为:
");
for(i=0;i{
printf("%d",a[i]);
}
printf("\n");
system("PAUSE");
return0;
}
7.声明一个10个元素的字符型数组(设为s),并用分别用”abcd”、{‘a’,‘b’,‘c’,‘d’,‘\0’}初始化它。
编程将s中的值在屏幕上输出。
答:
#include
#include
#defineLEN100
intmain(void)
{
chars1[LEN]="abcd";
chars2[LEN]={'a','b','c','d','\0'};
printf("%s\n",s1);
printf("%s\n",s2);
system("PAUSE");
return0;
}
8.编程判断两个存储在字符型数组中的字符串字面值是否相等。
答:
#include
#include
#include
#defineLEN100
intmain(void)
{
chars1[LEN]="abce";
chars2[LEN]={'a','b','c','d','\0'};
ints1_Len=strlen(s1);
ints2_Len=strlen(s2);
inti=0,count=0;
if(s1_Len!
=s2_Len)
{
printf("s1和s2不相等!
");
}
else/*s1_Len等于s2_Len*/
{
for(i=0;i{
if(s1[i]==s2[i])
{
count++;/*count记录相等的字符个数*/
}
else
{
break;
}
}
if(count==s1_Len)/*如果相等的字符个数与字符串长度相同*/
{
printf("s1和s2相等.\n");
}
else
{
printf("s1和s2不相等.\n");
}
}
system("PAUSE");
return0;
}
9.编程将存储在一个字符型数组中的字符串字面值复制到另一个字符型数组中。
注意:
’\0’也得复制过去。
#include
#include
#include
#defineLEN100
intmain(void)
{
chars1[LEN]="abce";
chars2[LEN];
ints1_Len=strlen(s1);
inti=0;
for(i=0;i{
s2[i]=s1[i];
}
s2[s1_Len]='\0';
printf("%s\n",s2);
system("PAUSE");
return0;
}
10.编程找出二维整型数组中的鞍点元素(该元素是在所在行是最大的元素,在所在列是最小的的元素)。
答:
#include
#include
#include
#defineROW3
#defineCOL4
intmain(void)
{
inta[ROW][COL];
inti=0,j=0,k=0,col=0;
intmax=0,min=0;
intcount=0;/*鞍点的个数*/
printf("请输入%d个数!
\n",ROW*COL);
for(i=0;i{
printf("请输入%d行第%d列个整数(输完一个回一次车):
",i/COL+1,i%COL+1);
scanf("%d",&a[i/COL][i%COL]);
}
for(i=0;i{
max=INT_MIN;
for(j=0;j
|
|
|
|
|
|