C语言程序设计(第二版)习题参考答案1 下载本文

内容发布更新时间 : 2024/11/17 14:33:56星期一 下面是文章的全部内容请认真阅读。

double fact(double x,int n); void main() {

double x,y; int n;

printf(“Input x n:\\n”);

scanf(“%lf%d”,&x,&n); y=fact(x,n);

printf(“%f\\n”,y); }

double fact(double x,int n) {

int i;

double t=1;

for(i=1;i<=n;i++) t=t*x; return t; }

8.输入平面上p1(x1,x2)、p2(x2,y2)两点坐标,计算两点间的距离输出。要求定义一个函数计算平面上两点间的距离。

解:#include

#include

double f(double,double,double,double); void main() {

double x1,x2,y1,y2,d;

printf(“Input (x1,y1),(x2,y2):\\n”);

scanf(“(%lf,%lf),(%lf,%lf)”,&x1,&y1,&x2,&y2); d=f(x1,y1,x2,y2); printf(“%f\\n”,d); }

double f(double x1,double y1,double x2,double y2) {

double d;

d=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); return d; }

9.在主函数中输出1!+2!+3!+?+10!的值。要求将计算阶乘的运算写成函数。

解:#include

int fact(int k) {

int i,res=1;

for(i=1; i<=k; i++) res=res*i; return res ; }

void main( ) {

int n,sum=0;

for(n=1;n<=10;n++)

35

sum+=fact(n);

printf(“1!+2!+3!+?+10!=%d\\n”,sum); }

10.编写函数int digit(int n,int k),函数返回n中从右边开始的第k位数字的值。如:digit(231456,3)=4;digit(1456,5)=0。

解:#include #include

int digit(int n,int k) { long s;

if (log10(n)+1

else s=n/(int)pow(10,k-1); return s; }

void main() {

int n,k;

printf(\输入整数n和k:\\n\

scanf(\ printf(\ }

*11.输入正整数a、b,输出a、b之间所有回文数。要求定义一个函数判断正整数n是否是回文数。回文数是指正整数n的逆序数与原数相等。如121、2332、55等都是回文数。

解:#include int huiwen(int n) { int k=0,m=n;

while(m!=0) // 将n的逆序数放入k中 { k=k*10+m; m=m/10; }

if(n==k) return 1; // n与k相同则n是回文数 else return 0; }

void main() { int a,b,i;

printf(\输入整数a和b:\\n\ scanf(\

printf(“%d、%d之间所有回文数:\\n”,a,b); for(i=a;i<=b;i++)

if(huiwen(i)==1) printf(\ printf(“\\n”); }

-3-n-1-212.定义函数main(),输入正整数n,当精度e分别取值为10、10、10、??、10时,分别计算并输出下列算式的值,直到最后一项的绝对值小于精度e,以比较不同精度下算出的结果。要求调用函数cal(e)计算下列算式的值。

s?1?111???.....2!3!4!

解:#include #include

double jiecheng(int a) { double f;

36

if(a==1) f=1;

else f=a*jiecheng(a-1);

return f;

}

double cal(double e) { double s=0,t; int i=1;

t=1/jiecheng(i); while(t>=e)

{ t=1/jiecheng(i); s=s+t; i++; }

return s; }

void main() { int n,e; double p;

printf(\输入正整数n:\\n\ scanf(\

for(e=10;e<=pow(10,n);e=e*10) { p=cal(1.0/e);

printf(\ } }

*13.年份信息查询程序,输入年份,查询相应的信息。采用菜单选择功能,输入1或2其功能分别是:闰年信息查询、元旦是星期几信息查询,输入3程序结束。

要求根据结构化程序设计方法,把问题分解成四个子问题(1)输入年份,判断输入数据的合法性。(2)判断是否闰年。(3)计算元旦是星期几。(4)输出文字形式的星期几。然后再把这些子问题组合起来,完成整个大问题的求解 (仿照书上例6.7) 。 其中元旦是星期几的计算公式:

w=(y+(y-1)/4-(y-1)/100+(y-1)/400)%7; w值0~6,分别表示星期天、星期1,?星期六。

解:#include int legal(int y);

void leapyear(int y);

int judgeweeknumber(int y); void judgeweekchinese(int y);

void main() {

int number,week,year; printf(“功能菜单:”);

printf(“1.闰年信息查询 2.元旦是星期几信息查 3. 程序结束\\n”); printf(“请输入年份:\\n”); scanf(“%d”,&year);

printf(“请选择功能:\\n”); scanf(“%d”,&number); if(number==1)

{ year=legal(year); leapyear(year);

}

if(number==2)

{ week=judgeweeknumber(year);

37

judgeweekchinese(week); }

if(number==3) return;

}

int legal(int y) { if(y<0) do {

printf(“请重新输入一个年份:”); scanf(“%d”,&y);

} while(y<0); return y; }

void leapyear(int y) {

if(y%4==0&&y0!=0||y@0==0) printf(“%d是闰年\\n”,y); else

printf(“%d不是闰年\\n”,y);

}

int judgeweeknumber(int y) { int week;

week=(y+(y-1)/4-(y-1)/100+(y-1)/400)%7;

return week; }

void judgeweekchinese(int week) { switch(week)

{ case 0: printf(“星期天”); break; case 1: printf(“星期一”); break; case 2: printf(“星期二”); break; case 3: printf(“星期三”); break; case 4: printf(“星期四”); break; case 5: printf(“星期五”); break; case 6: printf(“星期六”); break; } }

*14.输入n、x,计算xn 输出。要求定义一个递归函数计算xn 。

解:#include

double mypow(double x,int n) {

double y=1; if (n>0)

return(x*mypow(x,n-1)); else

if (n<0) return(1/x*mypow(x,n+1)); else return 1; }

void main() { double x; int n;

printf(“请输入x n:\\n”); scanf(\

printf(\}

*15.数列的第1、2项为1,此后各项为前两项之和。编制求数列中任何一项值的递归

38

函数。

解:此数列为1、1、2、3、5、8、13 ??。

#include int f(int n)

{ if (n==1||n==2) return (1); else

return (f(n-1)+f(n-2)); }

void main() { int n;

while(scanf(\

printf(\数列第%d项为:%d\ }

习 题 5

一、单项选择题

1.下列能正确定义一维数组a的语句是( )。

A.int a(10); B.int n=10,a[n]; C.int n;scanf(\,&n); D.#define n 10

int a[n]; int a[n];

2.若有定义语句“int a[10];”则下列对a中数组元素正确引用的是( )。

A.a[10/2–5] B.a[10] C.a[4.5] D.a(1)

3.能对一维数组正确初始化的语句是( )。

A.int a[6]={6*1}; B.int a[6]={1,,,3}; C.int a[6]={}; D.int a[6]=(0,0,0);

4.以下能正确定义二维数组的语句为( )。

A.int a[][]; B.int a[][4]; C.int a[3][]; D.int a[3][4];

5.若有数组定义语句“int a[4][5];”,则对a中数组元素的正确引用是( )。

A.a[4][1] B.a[2,1] C.a[4][5] D.a[4–1][5–5]

6.以下能对二维数组a进行正确初始化的语句为( )。

A.int a[2][]={{1},{4,5}}; B.int a[2][3]={1,2,3,4,5,6,7}; C.int a[][]={1,2,3,4,5,6}; D.int a[][3]={1,2,3,4,5};

7.下列对字符数组s的初始化不正确的是( )。

A.char s[5]=\; B.char s[5]={'a','b','c','d','e'}; C.char s[5]=\; D.char s[]=\;

8. 下列程序段的运行结果为( )。

char s[]=\A.ab0 B.ab C.Abcd

9.下列数组s中所存放字符串的长度为( )。

char s[]=\

D.ab cd

A.9 B.10 C.11 D.18

10.有数组定义语句“char a[20];”,则正确的输入语句为( )。

A.scanf(\,&a); B.scanf(\,a[]); C.gets(a[20]); D.gets(a);

11.下面程序执行后的正确输出项是( )。

39