高级语言程序设计第6章考参答案_第1页
高级语言程序设计第6章考参答案_第2页
高级语言程序设计第6章考参答案_第3页
高级语言程序设计第6章考参答案_第4页
高级语言程序设计第6章考参答案_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1.6.3习题解答编程题1.写两个函数,分别求两个整数的最大公约数和最小公倍数,用主调函数调用这两个函数,并输出结果。两个整数由键盘输入。分析:求两个数a和b的最大公约数:设这个数为x,则x一定小于等于a和b中的较小者min(a,b)。在区间1, min(a,b)中能找到的最后一个同时被a和b整除的那个数,就是a和b的最大公约数x。求两个数a和b的最小公倍数:设这个数为x,则x一定大于等于a和b中的较大者max(a,b),而小于等于a*b。在区间max(a,b), a*b 中找到的第一个能同时整除a和b的那个数,就是a和b的最小公倍数x。参考程序代码:#include "stdio.

2、h"f1(int a, int b)/*求最大公约数*/ int x,i; for(i=1;i<=(a<=b?a:b);i+) if(a%i=0&&b%i=0) x=i; printf("n最大公约数为: %dn",x);f2(int a, int b)/*求最小公倍数*/ int i,x; for(i=(a>b)?a:b);i<=a*b;i+) if(i%a=0&&i%b=0) x=i; break; printf("n最小公倍数为: %dn",x);void main() int a,

3、b; printf("n请输入两个数:n"); printf("a=");scanf("%d", &a); printf("b=");scanf("%d", &b); f1(a, b); f2(a, b);运行结果:请输入两个数:a=4b=16最大公约数为:4最小公倍数为:162.编写一个函数,其功能是对于给定的一个时间数(秒为单位),以“时:分:秒”的格式输出。参考程序代码:#include <stdio.h>print_time(long second)int h

4、our,minute;hour=(second/3600)%24;second%=3600;minute=second/60;second%=60;printf("%d:%d%ldn", hour, minute, second);void main()long s;printf("请输入秒数:");scanf("%ld", &s);print_time(s);运行结果:请输入秒数:72782:1:183.编写一个判断素数的函数,在主函数输入一个整数,输出是否是素数的信息。分析:素数指的是是指该数除了1和本身,不再有其他因子。

5、考虑到完全平方数的因素,只需要考察从2到该数的平方根这个区间,如果该区间中没有因子,则该数是素数,否则不是素数。参考程序代码:#include "stdio.h"#include "math.h"f(int x)/*判断x是否素数*/int i,sign=0;for(i=2;i<=(int)sqrt(x);i+) if(x%i=0) +sign; break; if(sign!=0) printf("n该数不是素数n");elseprintf("n该数是素数n");void main()int a;print

6、f("请输入一个整数:n");scanf("%d",&a);f(a);运行结果:请输入一个整数:7该数是素数4. C语言中在函数之间进行数据传递的方法除了通过返回值和全局变量外,还可以采用哪种方式?请以求两个数中的较大者为例,分别编程实现。分析:函数之间传递数据的方法一般有三种方式:a) 通过返回值b) 通过全局变量c) 通过函数调用的实参代码请自行实现。5.用递归算法求下列函数的值。p(n,x)=*x-()1 x( ( 2x-1 )*p( n-1,x )*x-( n-1 )*p( n-2,x ) )/n(n=0)(n=1)(n>1)注意选

7、择好合适的参数类型和返回值类型。在main()函数中,输入下列三组数据:(a)n=0,x=7;(b)n=1,x=2;(c)n=3,x=4求出相应的函数值。分析:该函数为分段函数,当n>1时为勒让德多项式,可以利用函数的递归调用求其值。参考程序代码:#include "stdio.h"double pn(double x, int n)if(n=0) return 1;if(n=1) return x;return 1.0*(2*n-1)*x-pn(x,n-1)-(n-1)*pn(x,n-2)/n;main()double pn(double x,int n);doub

8、le x;int n;printf("n请输入参数x与nn");printf("x=");scanf("%lf",&x);printf("nn=");scanf("%d",&n);printf("函数值为: %lfn",pn(x,n);运行结果:请输入参数x与n:x=7n=0函数值为:1.000000请输入参数x与n:x=2n=1函数值为:2.000000请输入参数x与n:x=4n=3函数值为:2.8333336.写一个函数,输入一个十六进制数,输出相应的十进

9、制数。参考程序代码:#include "stdio.h" #include "string.h" int translat(char c) if(c<='9'&&c>='0') return c-'0' if(c>='a' && c<='f') return c-87; if(c>='A' && c<='F') return c-55; return -1;/其

10、他字符返回-1 int Htoi(char *str) int i,stat,n=0; int length=strlen(str); if(length=0) return 0; for(i=0;i<length;i+) stat=translat(stri);/防错处理 if(stat>=0) n=n*16+stat; return n; void main() char Hex20; printf("输入十六进制数:"); gets(Hex); printf("相应的十进制数为:%d",Htoi(Hex); 运行结果:输入十六进制数:1

11、0相应的十进制数为:167.输入一个整数,将它逆序输出。要求定义并调用函数reverse(number),它的功能是返回number的逆序数。例如,reverse(12345)的返回值是54321。参考程序代码:#include <stdio.h> reverse(int number)printf("n该数的逆序数为:n");while (number > 0) /num大于0就不停循环 printf("%d",number%10); /输出个位 number /= 10; /除以10 printf("n");vo

12、id main() int num; printf("n请输入您的数据:n");scanf("%d",&num); reverse(num);运行结果: 请输入您的数据:12345该数的逆序数为:543218.编写一个函数,找出任一整数的全部因子。参考程序代码:#include "stdio.h"f(int x)/*找出x的所有因子*/int i;printf("n该数的所有因子为:n");for(i=1;i<=x;i+)if(x%i=0)printf(" %d", i);void

13、 main()int a;printf("请输入一个整数:n");scanf("%d",&a);f(a);运行结果:请输入一个整数:10该数的所有因子为:1 2 5 109.用递归法将一个整数n转换成字符串。例如,输入483,应输出字符串“483”。N的位数不确定,可以是任意位数的整数。参考程序代码:#include "stdio.h"void convert(n)int n;int i;if(i=n/10)!=0)convert(i);putchar(n%10+'0');main()int number;pr

14、intf("n输入整数:");scanf("%d",&number);printf("n输出是:");if(number<0)putchar('-');number=-number;convert(number);运行结果:输入整数:2345输出是:234510.给出年、月、日,计算该日是该年的第几天。分析:主函数接收从键盘输入的日期,并调用sum_day和leap函数计算天数。其N-S图见图。sum_day计算输入日期的天数。leap函数返回是否是闰年的信息。输入日期调用sum_day函数,计算机天数d

15、ays调用leap函数,判断是否闰年是闰年&&月份>=3天数days加1输出天数参考程序代码:#include "stdio.h"static int day_tab13=0,31,28,31,30,31,30,31,31,30,31,30,31;int sum_day(month,day)int month,day;int i;for(i=1;i<month;i+)day+=day_tabi;return(day);int leap(year)int year;int leap;leap=year%4=0 && year%100

16、!=0 | year%400 =0;return(leap);main()int year,month,day;int days;printf("n请输入日期(年,月,日)n");scanf("%d, %d, %d", &year, &month, &day);printf("n %d年%d月%d日n", year, month, day);days=sum_day(month,day);if (leap(year)&&month>=3)days=days+1;printf("是

17、该年的%d天.n",days);运行结果:请输入日期(年,月,日)2008,11,262008年11月26日是该年的331天。11.编写一个C语言源程序,里面只有一句代码“int a=0”或“int a; a=0;”(注意:源文件中没有main函数)。分别进行编译看能不能通过编译,并思考这是为什么。提示:C语言以函数为程序的基本单位。分析:大家已经知道C程序由函数组成。换而言之,C语言是一种面向过程的编程语言,过程亦即函数。这意味着C程序中的任何有效语句必须放在函数中。int a; a=0;中的第一个语句为声明语句,可以通过编译;但是第二个语句为赋值语句,因此其不能通过编译;int

18、a=0;为声明,并非有效语句,因此可以通过编译。12汉诺塔问题是一个古老的数学问题。经典汉诺塔问题是三柱的,它起源于印度。意思是:第一个柱(A柱)上有n个碟子,从底向上碟子大小依次减小,目标是通过第二个柱(B柱)把所有碟子移到第三个柱(C柱)上,但不能把大的碟子放到小的碟子上面。提示:解决三柱汉诺塔问题的经典算法是递归算法,先考虑把A柱上面的n-1个碟子通过C柱移到B柱上,然后把A柱剩下的一个碟子移到C柱上,最后用三柱汉诺塔经典算法把B柱上所有的碟子(n-1)个通过A柱移到C柱上。参考程序代码:int count=0;void move(char a,char c) printf("No%-3d:%c->%c ",count,a,c); if(count%5=0) printf("n");void Hanoi( int n, char a, char b, char c) if (n=1) coun

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论