习题参考答案《C语言程序设计》第七版董汉丽 712页.docx
《习题参考答案《C语言程序设计》第七版董汉丽 712页.docx》由会员分享,可在线阅读,更多相关《习题参考答案《C语言程序设计》第七版董汉丽 712页.docx(20页珍藏版)》请在冰豆网上搜索。
习题参考答案《C语言程序设计》第七版董汉丽712页
一、简答题
1.模块化程序设计思想和划分模块的基本原则是什么?
【解答】模块化程序设计思想是把一个大的程序按功能进行分解,由于分解后的各模块较小,因此容易实现,也容易调试。
划分模块的基本原则是:
各模块都要易于理解,功能尽量单一,模块间的联系尽量少。
满足这些要求的模块具有以下优点:
(1)模块间的接口关系简单,这种程序可读性和可理解性较强。
(2)需要修改某一功能时,只涉及到一个模块,不会影响到其它模块。
(3)脱离程序的上、下文也能单独验证一个模块的正确性。
(4)扩充或建立新系统时,可充分利用已有的模块。
2.一个C语言程序由几个函数组成?
【解答】一个C语言程序由一个或多个函数组成,其中必须有一个名为main的主函数。
主函数调用其它函数,其它函数可以互相调用。
3.函数调用的规则是什么?
【解答】在一个函数中调用另一个函数必须具备的条件是:
被调用的函数必须是已经存在的函数(库函数或用户自己定义的函数)。
调用库函数时,通常在文件开头用#include命令将调用有关库函数时所需用的信息“包含”到本文件中来。
如:
标准输入输出库函数用#include,数学库函数用#include。
调用自定义函数,而且该函数与调用它的函数在同一个文件中,应在主调函数中对被调函数作声明(说明函数类型、参数类型及个数),以便编译系统对函数调用进行语法检查。
4.函数的“形参”和“实参”的概念是什么?
【解答】在定义函数时,函数名后面的括号中的变量称为“形式参数”,简称“形参”。
在调用函数时,主调函数名后面括号中的参数(也可以是一个表达式)称为“实际参数”,简称“实参”。
5.调用函数中,有几种方法可以返回1个或多个值?
【解答】函数调用中可以利用return语句返回一个值。
可以利用参数传递,全局变量得到多个返回值。
6.在函数调用中,用指针变量作为函数的参数进行传递,好处在哪里?
【解答】在函数调用中,用指针变量作为函数的参数,可以改变实参指针变量所指变量的值。
二、运行程序写结果
1.下列程序的输出结果是。
fun(intx,inty,intz)
{z=x*x+y*y;}
main()
{inta=31;
fun(5,2,a);
printf("%d",a);
}
【解答】31
2.以下程序运行后的输出结果是。
f(intb[],intm,intn)
{inti,s=0;
for(i=m;ireturns;
}
main()
{intx,a[]={1,2,3,4,5,6,7,8,9};
x=f(a,3,7);
printf("%d\n",x);
}
【解答】10
3.下列程序运行的运行结果是。
#include
voidfun(char*c,intd)
{
*c=*c+1;d=d+1;
printf("%c,%c,",*c,d);
}
main()
{
charb='a',a='A';
fun(&b,a);printf("%c,%c\n",b,a);
}
【解答】b,B,b,A
4.下列程序运行的运行结果是。
voidswap(int*a,int*b)
{int*t;
t=a;a=b;b=t;
}
main()
{
intx=3,y=5,*p=&x,*q=&y;
swap(p,q);
printf("%3d%3d\n",*p,*q);
}
【解答】35
5.下列程序运行的结果为。
main()
{inta[5]={5,10,-7,3,7},i,j,t;
sort(a);
for(i=0;i<=4;i++)
printf("%3d",a[i]);
}
sort(inta[])
{inti,j,t;
for(i=0;i<4;i++)
for(j=0;j<4-i;j++)
if(a[j]>a[j+1])
{t=a[j];a[j]=a[j+1];a[j+1]=t;}
}
【分析与提示】该程序的功能是将5个数由小到大进行排序。
【解答】-735710
6.下列程序运行的结果为。
voidswap1(intx,inty)
{intt;
t=x;x=y;y=t;
return;
}
voidswap2(int*x,int*y)
{intt;
t=*x;*x=*y;*y=t;
return;
}
main()
{intx=3,y=5;
printf("%d,%d\n",x,y);
swap1(x,y);
printf("%d,%d\n",x,y);
swap2(&x,&y) ;
printf("%d,%d\n",x,y);
}
【分析与提示】注意指针变量做函数参数时,改变形参的值就等同与改变了实参的值。
【解答】3,5
3,5
5,3
7.下列程序运行的结果为。
#include
longfib(intg)
{
switch(g)
{
Case0:
return0;
case1:
case2:
return1;
}
return(fib(g-1)+fib(g-2));
}
main()
{
longk;
k=fib(7);
printf("k=%ld\n",k);
}
【分析与提示】注意函数递归调用的条件。
【解答】k=13
8.以下程序运行后的输出结果是。
intf(intn)
{
if(n==1)return1;
elsereturnf(n-1)+1;
}
main()
{
inti,j=0;
for(i=1;i<3;i++)
j+=f(i);
printf("%d\n",j);
}
【解答】3
9.下列程序运行的结果为。
intx1=30,x2=40;
main()
{
intx3=10,x4=20;
swap(x3,x4);
swap(x2,x1);
printf("%d,%d,%d,%d\n",x3,x4,x1,x2);
}
swap(intx,inty)
{x1=x;x=y;y=x1;}
【提示】本题考查全局变量的作用范围。
【解答】10,20,40,40
10.下列程序运行的结果为。
#include
voidnum()
{
externintx,y;
inta=15,b=10;
x=a-b;y=a+b;
}
intx,y;
main()
{
inta=7,b=5;
x=a+b;y=a-b;
num();
printf("%d,%d\n",x,y);
}
【分析与提示】用extern进行外部变量说明。
【解答】5,25
三.编程题
1.已知圆的半径为R,求它的面积。
#include/*包含文件*/
#include/*包含数学库函数*/
#definePI3.14159/*宏定义*/
main()/*主函数*/
{
floatarea(float);/*函数area的原型,即函数说明*/
floatr,s;/*主函数中的局部变量定义*/
printf(“请输入半径:
\n”);
scanf(“%f”,&r);
s=area(r);/*调用area函数*/
printf(“圆的半径为:
%f\n”,r);
printf(“圆的面积为:
%f\n”,s);
}
floatarea(floata)/*定义函数area*/
{floatd;
d=PI*a*a;
return(d);/*返回计算结果*/
}
【分析与提示】本程序由主函数main()和自定义函数area()组成。
程序的前2句是文件包含语句。
第3句是宏定义语句,即用标识符PI来代替数字3.14159。
运行:
请输入半径:
1.1↙
显示:
圆的半径为:
1.1
圆的面积为:
3.801324
2.编写一个函数,输出三个数中的最大值。
【提示】在main()函数中输入数据,调用求3个数最大值函数。
intmax(intx,inty,intz)
{
intt;
if(x>=y)t=x;
elset=y;
if(treturn(t);
}
main()
{
intx,y,z;
printf("input3numbers:
");
scanf("%d%d%d",&x,&y,&z);
printf("max=%d\n",max(x,y,z));
}
3.已知某门课程10个学生的成绩,编程序求出平均成绩,用函数实现求平均成绩。
【解答】参考代码:
#include"stdio.h"
floatfun(floata[],intn)
{
inti;
floatave,s=0;
for(i=0;is+=a[i];
ave=s/n;
returnave;
}
voidmain()
{
floata[10],ave;
inti;
printf("请输入10个学生的成绩:
");
for(i=0;i<10;i++)
scanf("%f",&a[i]);
ave=fun(a,10);
printf("平均成绩为:
%5.2f\n",ave);
}
4.编写一个函数,将一个任意三位数n逆序输出。
即若n=456,则输出654。
【提示】将一个三位数n分解为个位、十位和百位分别放入c,b,a中,然后逆序输出。
intrec(intx)
{
inta,b,c;
a=x/100;
b=x%100/10;
c=x%10;
return(c*100+b*10+a);
}
main()
{
intrec(intx);
inty,z;
printf("inputanumber(100-999):
");
scanf("%d",&y);
z=rec(y);
printf("thechangednumberis:
%d\n",z);
}
5.已知e=1+1/1!
+1/2!
+1/3!
+…+1/n!
,试用公式求e的近似值,要求累加所有不小于10-6的项值。
用函数fun完成求任何数的阶乘。
【解答】参考代码:
#include"stdio.h"
doublefun(doublen)
{
doubles=1;
inti;
for(i=1;i<=n;i++)
s*=i;
returns;
}
voidmain()
{
doublee=1,t=1,i=1;
while(t>10e-6)
{
t=1.0/fun(i);
e+=t;
i++;
}
printf("%lf\n",e);
}
6.编写函数fun(),该函数的功能是:
将两个两位的正整数a,b合并形成一个整数放在c中。
合并的方式是:
将a数的十位和个位数依次放在c数的十位和千位上,b数的十位和个位数依次放在c数的百位和个位上。
例如,当a=45,b=12时,调用到该函数后,c=5142。
【解答】参考代码:
#include"stdio.h"
intfun(inta,intb)
{
intc,a1,a2,b1,b2;
a1=a/10;
a2=a%10;
b1=b/10;
b2=b%10;
c=a2*1000+b1*100+a1*10+b2;
returnc;
}
voidmain()
{
inta,b,c;
printf("请输入两个两位数:
\n");
scanf("%d%d",&a,&b);
c=fun(a,b);
printf("%d\n",c);
}
7.输入10个数,把最小数与第一个数交换,把最大数与最后数交换。
【解答】参考代码:
#include"stdio.h"
voidmain()
{
inta[10],min,max,i,index1,index2;
printf("请输入10个数:
");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
min=max=a[0];
index1=index2=0;
for(i=1;i<10;i++)
{
if(a[i]>max)
{
max=a[i];
index1=i;
}
if(a[i]{
min=a[i];
index2=i;
}
}
if(index2!
=0)
{
a[index2]=a[0];
a[0]=min;
}
if(index1!
=9)
{
a[index1]=a[9];
a[9]=max;
}
for(i=0;i<10;i++)
printf("%6d",a[i]);
printf("\n");
}
8.编写求字符串长的函数。
【提示】字符串的长度不包括'\0'在内。
参考代码:
#include
main()
{inttest();
intn;
charstr[100];
gets(str);
n=test(str);
printf("thenumbersis:
%d\n",n);
}
inttest(str)
charstr[];
{intn=0;
while(str[n]!
=’\0’)
n++;
return(n);
}
9.编写一个函数判定一个数是否是素数,要求在主函数中调用该函数,输入一个整数,输出是否是素数的信息。
【分析与提示】由主函数任意输入一个整数m,将其值传递给子函数isprime(m)由子函数判断这个数是否为素数。
参考代码:
#include
main()
{intm;
printf("Pleaseinputadatam=:
");
scanf("%d",&m);
isprime(m);
}
isprime(intn)
{
inti,k;
k=n/2;
for(i=2;i<=k;i++)
if(n%i==0)break;
if(i>=k+1)
printf("Thisisaprimenumber");
elseprintf("Thisisnotaprimenumber");
}
10.编写用指针删除字符串中空格的函数。
【提示】用指针p1指向待处理的字符串,用*p1从串头到串尾逐一走动,每走到一个字符判断其是否为空格,若不是空格,则将其保存到指针*p2中。
参考代码:
#include
voiddele(char*str)
{
char*p1,*p2;
for(p1=p2=str;*p1!
=’\0’;p1++)
if(*p1==’’)continue;
else*p2++=*p1;
*p2='\0';
}
main()
{
charstr[100];
gets(str);
dele(str);
puts(str);
}
11.编写用指针写合并两个字符串的函数。
【分析与提示】先将字符串str1从串头到串尾逐一拷贝到字符串str3中,接着将字符串str2从串头到串尾逐一拷贝到字符串str3中。
参考代码:
#include
charunitestring(char*str1,char*str2,char*str3)/*合并函数*/
{
inti=0;
while((*str1)!
=’\0’)
{*(str3+i)=*str1;
i++;
str1++;
}
while((*str2)!
=’\0’)
{*(str3+i)=*str2;
i++;
str2++;
}
*(str3+i)=’\0’;/*不能自动加入\0*/
}
main()
{
charp[50],q[50],r[100];/*r为连接后的字符串*/
printf("Pleaseenterthefirststring:
\n");
gets(p);/*输入字符串*/
printf("Pleaseenterthesecondstring:
\n");
gets(q);/*输入字符串*/
unitestring(p,q,r);
puts(r);/*输出结果*/
}
12.编写一个程序完成“菜单”功能。
提供三种选择途径:
(1)求水仙花数(narcissusnumber),找出100至999之间的所有水仙花数。
(2)求出素数(primenumber),找出2至n之间的所有素数。
(3)求Faibonacci数列前n项的值。
#include“math.h”
main()
{intm,xz;
voidnarcissus();
voidprime();
voidfaibonacci();
clrscr();
m=0;
while(m==0)
{printf(“\n\n”);
printf(“1findnarcissusnumber\n”);
printf(“2findprimenumber\n”);
printf(“3findFaibonaccinumber\n”);
printf(“othernumberexit!
\n”);
printf(“inputnumberplease!
\n”);
scanf(“%d”,&xz);
switch(xz)
{case1:
narcissus();break;
case2:
prime();break;
case3:
faibonacci();break;
default:
m=1;
}m=1;
}
}
voidnarcissus()
{intk,a,b,c,d;
for(k=100;k<1000;k++)
{a=k/100;
b=k%100/10;
c=k%10;
d=a*a*a+b*b*b+c*c*c;
if(d==k)printf(“%5d\n”,k);
}
}
voidprime()
{inti,j,k,n,m=0;
printf(“inputnplease!
\n”);
scanf(“%d”,&n);
for(i=2;i{j=sqrt(i);
for(k=2;k<=j;k++)if(i%k==0)break;
if(k>j)
{m++;
printf(“%6d”,i);
if(m%10==0)printf(“\n”);
}
}
}
voidfaibonacci()
{longf1,f2;
intk,n;
printf(“intnplease!
\n”);
scanf(“%d”,&n);
f1=1;f2=1;
for(k=1;k<=n/2;k++)
{printf(“%8d%8d”,f1,f2);
if(k%20)printf(“\n”);
f1=f1+f2;
f2=f1+f2;
}
}
【分析与提示】程序共有4个函数,其中主函数提供了主菜单,允许选择三种情况之一,否则就退出。
通过开关语句switch进行选择。
为了不断的提供菜单,用while来永远循环。
一开始给变量m赋值为0,m=0就继续循环,一旦选择了不存在的情况,则将m置1,循环就结束。