E4B9A0E9A298E58F82E88083E7AD94E6A1882.docx
《E4B9A0E9A298E58F82E88083E7AD94E6A1882.docx》由会员分享,可在线阅读,更多相关《E4B9A0E9A298E58F82E88083E7AD94E6A1882.docx(55页珍藏版)》请在冰点文库上搜索。
E4B9A0E9A298E58F82E88083E7AD94E6A1882
习题参考答案
习题1
一、选择题
1、B2、C3、B4、D5、A6、B7、C
二、填空题
1、源程序文件c2、obj3、可执行文件exe
4、机器语言汇编语言高级语言
三、解答题
略
四、编程题
1、
main()
{
printf(“Hello!
WelcometoChina!
”);
}
2、
main()
{intx;
printf(“x=%d”,x);
}
习题2
一、选择题
1、C 2、A 3、B 4、D 5、A
6、D 7、B 8、B9、B 10、D
11、D12、B13、A14、B15、C
二、填空题
1、整型、实型、字符型
2、用户标识符、关键字标识符
3、存储单元、符号地址、内存地址
4、十、十六、八
5、double(双精度型)
6、8
7、5.500000
8、a=-32768
9、+0017,021,0x11
三、写程序运行结果
3257
3257
7.88,-345.12,7.8765,-345.1230
7.87654e+00,-3.5e+02
a,97,141,61
1234,2322,4d2
CHINESE,CHI
四、scanf函数的使用
a=3b=7
8.571.82
Aa
五、用scanf函数输入数据
1020Aa1.5-3.75123.45,67.8
注意,其中123.45可以是任意实数,因为该值将被跳过,不用于赋值。
习题3
一、选择题
1.C2.B3.D4.D
二、填空题
基本概念题
1.2
2.2
3.1
阅读程序写出运行结果题
4.1.00
5.1,0,1
6.6,11,9,10
三、写出下面表达式运算后a的值,设原来a=12。
(1)24
(2)10(3)60(4)0(5)0(6)0
习题4
一、选择题
1、B2、D3、B4、D5、A6、C
二、填空题
1、1,0,12、1,2,3
3、ch1>=′A′&&ch1<=′Z′ch1=ch1-32;
三、编程题
1、从键盘输入三个数,然后按照由小到大的顺序输出。
要求,设三个数放在变量a、b、c中,最后仍然按照a、b、c的顺序输出。
#include
main()
{inta,b,c,t;
scanf(“%d,%d,%d”,&a,&b,&c);
if(a>b){t=a;a=b;b=t;}
if(a>c){t=a;a=c;c=t;}
if(b>c){t=b;b=c;c=t;}
printf(“%d,%d,%d\n”,a,b,c);
}
2、编写程序根据以下的函数关系,对输入的x值输出相应的y值。
x
y
2x(x+2)
-12x
X<=-1
x-1
#include
main()
{intx,y;
scanf(“%d”,&x);
if(x<=-1)
y=x-1;
elseif(x<=2)
y=2*x;
elseif(x<=10)
y=x*(x+2);
printf(“y=%d\n”,y);
}
3、求一元二次方程ax2+bx+c=0的解。
#include
main()
{floata,b,c,d,disc,x1,x2,realpart,imagpart;
scanf(“%f,%f,%f”,&a,&b,&c);
if(fabs(a)<=1e-6)
Printf(isnotaquadratic);
else
{disc=b*b-4*a*c;
if(fabs(disc)<=1e-6)
printf(“hastwoequalroots:
%8.4\n”,-b/(2*a));
elseif(disc>1e-6)
{x1=(-b+sqrt(disc))/(2*a);
x2=(-b-sqrt(disc))/(2*a);
printf(“hasdistinctrealroots:
%8.4fand%8.4f\n”,x1,x2);
}
else
{realpart=-b/(2*a);
imagpart=sqrt(-disc)/(2*a);
printf(“hascomplexroots:
\n”);
printf(“%8.4f+%8.4fi\n”,realpart,imagpart);
printf(“%8.4f-%8.4fi\n”,realpart,imagpart);
}
}
}
4、假设工资税率如下,其中s代表工资,r代表税率:
s<500r=0%
500<=s<1000r=5%
1000<=s<2000r=8%
2000<=s<3000r=10%
3000<=sr=15%
编一程序实现从键盘输入一个工资数,输出实发工资数。
要求使用switch语句。
main()
{intsalarly,r,g;
scanf(“%d”,&salarly);
if(salary>=3000)r=0.15;
g=salary/500;
switch(g)
{1:
r=0.05;
2:
3:
r=0.08;
4:
5:
r=0.10;
}
salary=salary*(1-r);
printf(“%d\n”,salary);
}
习题5
一、选择题
1、A2、C3、C4、D5、A6、A
7、A8、B9、C10、B11、B12、D
二、填空题
1、break
2、[1]n<=999或n<1000[2]n%10
3、[1]x>=0或x>=0.0[2]x4、[1]i<10[2]j%3!
=0
5、[1]t=1[2]n<=i
6、[1]n[2]flag=1[3]n—
7、[1]j
8、[1]sum三、编程题
1、
#include
main()
{intm,n,p,r,temp;
printf(“Pleaseinputm,n:
”);
do
{scanf(“%d%d”,&m,&n);
}while(m<=0||n<=0);
if(n{temp=n;n=m;m=temp;}/*确保大数放到n中*/
p=n*m;/*保留n和m的乘积到p中,以便求最小公倍数*/
while(m!
=0)/*求n和m的最大公约数*/
{r=n%m;n=m;m=r;}
printf(“最大公约数为:
%d\n”,n);
printf(“最小公倍数为:
%d\n”,p/n);
}
2、
#include
main()
{charc;
intletter=0,space=0,digit=0,other=0;
printf(“Pleaseinputalinecharacter:
”);
while((c=getchar())!
=’\n’)
{if(c>=’a’&&c<=’z’||c>=’A’&&c<=’Z’)letter++;
elseif(c==‘’)space++;
elseif(c>=’0’&&c<=’9’)digit++;
elseother++;
}
printf(“Letteris%d,Spaceis%d,Digitis%d,Otheris%d,”,letter,space,digit,other);
}
3、
main()
{intm,s,i;
for(m=2;m<1000;m++)
{s=0;
for(i=1;iif((m%i)==0)s=s+i;
if(s==m)
{printf(“%ditsfactorsare”,m);
for(i=1;iif(m%i==0)printf(“%d,”,i);
printf(“\n”);
}
}
}
4、
main()
{inti,a,min,max;
scanf(“%d”,&a);
min=a;max=a;
for(i=2;i<=100;i++)
{scanf(“%d”,&a);
if(aif(a>max)max=a;
}
printf(“Max=%d,Min=%d\n”,max,min);
}
5、
#include
#defineN20
main()
{inti,t;
floata=2,b=1,s=0;
for(i=1;i<=N;i++)
{s=s+a/b;
t=a;
a=a+b;/*将前一项的分子与分母之和作为下一项的分子*/
b=t;/*将前一项的分子作为下一项的分母*/
}
printf(“Sum=%f\n”,s);
}
6、问题分析:
设王先生的岁数是x,他夫人的岁数是y,可得到如下方程组:
这是一个非线性方程组的求解,无法手算求解,可以用穷举法求解。
考虑到实际可能,x、y可以在20—100范围内取值,逐一穷兴出x、y所有可能的取值判断是否满足上述方程组,若满足,这一组解就是要求的解。
程序如下:
main()
{intx,y;
for(x=20;x<=100;x++)
for(y=20;y<=100;y++)
if(x*x+y==1053&&x+y*y==873)
printf(“x=%dy=%d\n”,x,y);
}
7、
main()
{
longintk,g,s=0;
printf("Pleaseinputaninteger:
");
scanf("%ld",&k);
do
{g=k%10;
printf("%2d",g);
k=k/10;
}while(k!
=0);
}
8、
(1)
main()
{inti,j;
for(i=1;i<=9;i++)
{for(j=i;j<=9;j++)
printf("%d*%d=%2d",i,j,i*j);
printf("\n");
}
}
(2)
main()
{inti,j,k;
for(i=1;i<=9;i++)
{
for(k=1;k
printf("");
for(j=i;j<=9;j++)
printf("%d*%d=%2d",i,j,i*j);
printf("\n");
}
}
9、
#include
main()
{inti=0;
longs,n,j,x;
for(j=100;j<=999;j++)
{s=0;x=j;
while(x>0)/*求原数j的反序数*/
{s=s*10+x%10;
x=x/10;
}
if(s==j)/*判断反序数s与原数j是否相等*/
{i++;printf("%4ld",j);
if(i%10==0)printf("\n");/*每行输出10个回文数*/
}
}
}
10、
#include
main()
{intx,y,z;
for(x=1;x<20;x++)
for(y=1;y<33;y++)
for(z=3;z<100;z+=3)
{if((x*5+y*3+z/3)==100&&x+y+z==100)
printf(“公鸡有%d只,母鸡有%d只,小鸡有%d只\n”,x,y,z);
}
}
11、
#include
#include
main()
{intn=1;doublex,sum=0,term=1.0;
scanf(“%lf”,&x);
while(fabs(term)>=1e-6)
{sum+=term;
term*=-x*x/(n*(n+1));
n=n+2;
}
printf(“cos(%lf)=%lf,%lf\n”,x,sum,cos(x));
}
12、
问题分析:
用迭代法求平方根的算法如下:
(1)设定一个x的初值x0;
(2)用上述公式求出x的下一个值x1;
(3)再将x1代入上述公式,求出x的下一个值x2;
(4)如此继续下去,直到前后两次求出的x值(xn+1和xn)满足
。
为便于程序处理,令x的初值x0=a/2(也可以是其他值),求出x1。
程序实现如下:
#include
main()
{floata,x0,x1;
printf(“Pleaseinputapositivenumber:
”);
scanf(“%f”,&a);/*输入a的值*/
x0=a/2;
x1=(x0+a/x0)/2;
do
{x0=x1;
x1=(x0+a/x0)/2;
}while(fabs(x1-x0)>=1e-5);
printf(“Thesquarerootof%fis%f,thetruerootis%f\n”,a,x1,sqrt(a));
}
13、
程序如下:
#include
main()
{floatx,x0,f,f1;
x=1.5;
do
{x0=x;
f=((2*x0-4)*x0+3)*x0-6;
f1=(6*x0-8)*x0+3;
x=x0-f/f1;/*进行牛顿迭代*/
}
while(fabs(x-x0)>=1e-5);
printf(“Therootis%f\n”,x);
}
14、
#include
#include
#defineepsilon0.00001/*定义要求的精度*/
floatf(floatx)/*求函数值*/
{return(2*x*x*x-4*x*x+3*x-6);
}
main()
{floata,b,x;
scanf("%f%f",&a,&b);/*输入求根区间*/
if(f(a)*f(b)>=0)/*判断是否符合二分法使用的条件*/
{printf("不满足二分法使用条件,退出!
");exit(0);}
do
{x=(a+b)/2;
if(f(x)*f(b)<0)/*如果成立,则根在区间的右半部分*/
a=x;
else/*否则根在左半部分*/
b=x;}
while(fabs(b-a)>=epsilon);/*判断是否达到精度要求,如果没达到,继续循环*/
x=(b+a)/2;/*取最后的小区间中点作为根的近似值*/
printf("x=%f\n",x);/*输出函数的近似根*/
}
习题6
一、选择题
1.D2.D3.D4.D5.A6.C
二、填空题
阅读程序写出运行结果题
1.第一行:
143
第二行:
258
2.第一行:
124
第二行:
357
第三行:
689
三、编程题
1.#include
main()
{
charstr1[20],str2[10];
inti=0,j=0;
gets(str1);
gets(str2)’
while(str1[i]!
=’\0’)i++;
while(str2[j]!
=’\0’)str1[i++]=str2[j++];
str1[i]=’\0’;
puts(str1);
}
2.#defineM4
#defineN5
#include
main()
{
inti,j,m;
inta[M][N],pp[N];
for(j=0;j{
m=a[0][j];/*将m值设为每一列的第一行元素的值*/
for(i=0;iif(a[i][j]pp[j]=m;/*将每一列的最小值m存入pp数组*/
}
for(j=0;jprintf(“%d”,pp[j]);
}
3.#include
voidfind(inta[5][5])
{inti,j,row,col,sum1,sum2;
for(i=0;i<5;i++)
for(j=0;j<5;j++)
{sum1=sum2=0;
for(col=0;col<5;col++)
sum1+=a[i][col];
for(row=0;row<5;row++)
sum2+=a[row][j];
if(sum1==sum2)
printf(“a[%d][%d]:
%d\n”,i,j,a[i][j]);
}
}
main()
{inti,j,a[5][5]={{2,8,1,9,4},{5,7,1,3,0},{7,1,7,5,2},{3,2,2,1,5},{0,2,1,6,8}};
for(i=0;i<5;i++)
{for(j=0;j<5;j++)
printf(“%4d”,a[i][j]);
printf(“\n”);
find(a);
}
5.#include
#defineN10
voidcrl(inta[])
{inti,j,max=0,min=0,temp;
for(i=1;iif(a[min]>a[i])min=i;
temp=a[min];
j=min;
while(j>0)
{a[j]=a[j-1];
j--;
}
a[0]=temp;
for(i=1;iif(a[max]temp=a[max];
j=max;
while(j{a[j]=a[j+1];
j++;
}
a[N-1]=temp;
}
main()
{inta[N]={8,5,6,9,4,1,-1,7,3,2};
inti;
crl(a);
for(i=0;iprintf(“\n”);
}
6.#include
#include
intReplace_string(charline[],charstr1[],charstr2[])
{inti=0,j,loc;
chartemp[80];
while(i<=strlen(line)-strlen(str2))
{j=0;loc=i;
while(str1[j]==line[loc]&&str1[j]!
=’\0’)
{loc++;j++;}
if(str1[j]==’\0’)
{strcpy(temp,&line[loc]);
strcpy(&line[i],str2);
i+=strlen(str2);
strcpy(&line[i],temp);
return1;
}
elsei++;
}
return0;
}
习题7
一、选择题
1.A 2.A 3.D 4.C 5.A
6.C 7.B 8.C 9.B 10.D
二、填空题
1.a=0,b=7
2.110
3.20
4.abc,ABC,bc,BC,c,C,
5.14
6.len++p++
三、编程题
1、编写一个程序,将字符串computer赋给一个字符数组,然后从第一个字母开始间隔地输出该字符串,请用指针完成。
main()
{charch[20]="computer",*p=ch;
inti;
for(i=0;iprintf("%c",*(p+i));
}
2、输入3个字符串,按由小到大的顺序输出。
main()
{charstr1[20],str2[20],str3[20];
char*p[1],*p1,*p2;
printf("Inputthreelindes:
\n");
gets(str1);gets(str2);gets(str3);
p1=str1;p2=str2;
if(strcmp(str1,str2)>0)
{strcpy(p,p1);strcpy(p1,p2);strcpy(p2,p);}
p1=str1;p2=str3;
if(strcmp(str1,str3)>0)
{strcpy(p,p1);strcpy(p1,p2);strcpy(p2,p);}
p1=str2;p2=str3;
if(strcmp(str2,str3)>0)
{strcpy(p,p1);strcpy(p1,p2);strcpy(p2,p);}
printf("Now,theorderis:
\n");
printf("%s\n%s\n%s\n",str1,str2,str3);
}
注意:
因为指针变量p在使用前必须赋初值,否则编译时会产生Warning错误“Possibleuseof‘p’beforedefinitioninfunctionmain”,所以本程序把p定义为指针数组*p[20]的形式,无须赋初值便可使用。
还要注意,此时的p数组元素是需要两个字节的指针类型,而不是占用一个字节的字符类型,所以在进行字符串复制时,一个p数组元素将存放两个字符。
另外,数组名为常量,不能用于strcpy函数中。
3、求一个3×3矩阵主对角线元素之和。
main()
{inta[3][3],*p,i,s=0;
for(i=0;i<3;i++)
scanf("%d%d%d"