您好,欢迎访问三七文档
当前位置:首页 > 高等教育 > 习题/试题 > 高级语言程序设计第6章参考答案
11.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。参考程序代码:#includestdio.hf1(inta,intb)/*求最大公约数*/{intx,i;for(i=1;i=(a=b?a:b);i++){if(a%i==0&&b%i==0){x=i;}}printf(\n最大公约数为:%d\n,x);}f2(inta,intb)/*求最小公倍数*/{inti,x;for(i=((ab)?a:b);i=a*b;i++){if(i%a==0&&i%b==0){x=i;break;}}printf(\n最小公倍数为:%d\n,x);}voidmain()2{inta,b;printf(\n请输入两个数:\n);printf(a=);scanf(%d,&a);printf(b=);scanf(%d,&b);f1(a,b);f2(a,b);}运行结果:2.编写一个函数,其功能是对于给定的一个时间数(秒为单位),以“时:分:秒”的格式输出。参考程序代码:#includestdio.hprint_time(longsecond){inthour,minute;hour=(second/3600)%24;second%=3600;minute=second/60;second%=60;printf(%d:%d%ld\n,hour,minute,second);}voidmain(){longs;printf(请输入秒数:);scanf(%ld,&s);print_time(s);}运行结果:3.编写一个判断素数的函数,在主函数输入一个整数,输出是否是素数的信息。分析:素数指的是是指该数除了1和本身,不再有其他因子。考虑到完全平方数的因素,只需请输入秒数:72782:1:18请输入两个数:a=4b=16最大公约数为:4最小公倍数为:163要考察从2到该数的平方根这个区间,如果该区间中没有因子,则该数是素数,否则不是素数。参考程序代码:#includestdio.h#includemath.hf(intx)/*判断x是否素数*/{inti,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);}voidmain(){inta;printf(请输入一个整数:\n);scanf(%d,&a);f(a);}运行结果:4.C语言中在函数之间进行数据传递的方法除了通过返回值和全局变量外,还可以采用哪种方式?请以求两个数中的较大者为例,分别编程实现。分析:函数之间传递数据的方法一般有三种方式:a)通过返回值b)通过全局变量c)通过函数调用的实参代码请自行实现。5.用递归算法求下列函数的值。请输入一个整数:7该数是素数4注意选择好合适的参数类型和返回值类型。在main()函数中,输入下列三组数据:(a)n=0,x=7;(b)n=1,x=2;(c)n=3,x=4求出相应的函数值。分析:该函数为分段函数,当n1时为勒让德多项式,可以利用函数的递归调用求其值。参考程序代码:#includestdio.hdoublepn(doublex,intn){if(n==0)return1;if(n==1)returnx;return1.0*((2*n-1)*x-pn(x,n-1)-(n-1)*pn(x,n-2))/n;}main(){doublepn(doublex,intn);doublex;intn;printf(\n请输入参数x与n\n);printf(x=);scanf(%lf,&x);printf(\nn=);scanf(%d,&n);printf(函数值为:%lf\n,pn(x,n));}运行结果:6.写一个函数,输入一个十六进制数,输出相应的十进制数。参考程序代码:#includestdio.h#includestring.hinttranslat(charc){if(c='9'&&c='0')returnc-'0';if(c='a'&&c='f')returnc-87;if(c='A'&&c='F')returnc-55;p(n,x)=*x-()1x((2x-1)*p(n-1,x)*x-(n-1)*p(n-2,x))/n(n=0)(n=1)(n1)请输入参数x与n:x=7n=0函数值为:1.000000请输入参数x与n:x=2n=1函数值为:2.000000请输入参数x与n:x=4n=3函数值为:2.8333335return-1;//其他字符返回-1}intHtoi(char*str){inti,stat,n=0;intlength=strlen(str);if(length==0)return0;for(i=0;ilength;i++){stat=translat(str[i]);//防错处理if(stat=0)n=n*16+stat;}returnn;}voidmain(){charHex[20];printf(输入十六进制数:);gets(Hex);printf(相应的十进制数为:%d,Htoi(Hex));}运行结果:7.输入一个整数,将它逆序输出。要求定义并调用函数reverse(number),它的功能是返回number的逆序数。例如,reverse(12345)的返回值是54321。参考程序代码:#includestdio.hreverse(intnumber){printf(\n该数的逆序数为:\n);while(number0){//num大于0就不停循环printf(%d,number%10);//输出个位number/=10;//除以10}printf(\n);}voidmain(){输入十六进制数:10相应的十进制数为:166intnum;printf(\n请输入您的数据:\n);scanf(%d,&num);reverse(num);}运行结果:8.编写一个函数,找出任一整数的全部因子。参考程序代码:#includestdio.hf(intx)/*找出x的所有因子*/{inti;printf(\n该数的所有因子为:\n);for(i=1;i=x;i++){if(x%i==0){printf(%d,i);}}}voidmain(){inta;printf(请输入一个整数:\n);scanf(%d,&a);f(a);}运行结果:9.用递归法将一个整数n转换成字符串。例如,输入483,应输出字符串“483”。N的位数不确定,可以是任意位数的整数。参考程序代码:请输入一个整数:10该数的所有因子为:12510请输入您的数据:12345该数的逆序数为:543217#includestdio.hvoidconvert(n)intn;{inti;if((i=n/10)!=0)convert(i);putchar(n%10+'0');}main(){intnumber;printf(\n输入整数:);scanf(%d,&number);printf(\n输出是:);if(number0){putchar('-');number=-number;}convert(number);}运行结果:10.给出年、月、日,计算该日是该年的第几天。分析:主函数接收从键盘输入的日期,并调用sum_day和leap函数计算天数。其N-S图见图。sum_day计算输入日期的天数。leap函数返回是否是闰年的信息。参考程序代码:输入整数:2345输出是:2345输入日期调用sum_day函数,计算机天数days调用leap函数,判断是否闰年是闰年&&月份=3天数days加1输出天数8#includestdio.hstaticintday_tab[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};intsum_day(month,day)intmonth,day;{inti;for(i=1;imonth;i++)day+=day_tab[i];return(day);}intleap(year)intyear;{intleap;leap=year%4==0&&year%100!=0||year%400==0;return(leap);}main(){intyear,month,day;intdays;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(是该年的%d天.\n,days);}运行结果:11.编写一个C语言源程序,里面只有一句代码“inta=0”或“inta;a=0;”(注意:源文件中没有main函数)。分别进行编译看能不能通过编译,并思考这是为什么。提示:C语言以函数为程序的基本单位。分析:大家已经知道C程序由函数组成。换而言之,C语言是一种面向过程的编程语言,过程亦即函数。这意味着C程序中的任何有效语句必须放在函数中。请输入日期(年,月,日)2008,11,262008年11月26日是该年的331天。9inta;a=0;中的第一个语句为声明语句,可以通过编译;但是第二个语句为赋值语句,因此其不能通过编译;inta=0;为声明,并非有效语句,因此可以通过编译。12.汉诺塔问题是一个古老的数学问题。经典汉诺塔问题是三柱的,它起源于印度。意思是:第一个柱(A柱)上有n个碟子,从底向上碟子大小依次减小,目标是通过第二个柱(B柱)把所有碟子移到第三个柱(C柱)上,但不能把大的碟子放到小的碟子上面。提示:解决三柱汉诺塔问题的经典算法是递归算法,先考虑把A柱上面的n-1个碟子通过C柱移到B柱上,然后把A柱剩下的一个碟子移到C柱上,最后用三柱汉诺塔经典算法把B柱上所有的碟子(n-1)个通过A柱移到C柱上。参考程序代码:intcount=0;voidmove(chara,charc){printf(No%-3d:%c---%c,count,a,c);if(count%5==0)printf(\n);}voidHanoi(intn,chara,charb,charc){if(n==1){count++;move(a,c);}else{Hanoi(n-1,a,c,b);count++;move(a,c);Hanoi(n-1,b,a,c);}}voidmain(){intn;chara='A',b='B',c='C';clrscr();printf(Plseaseinputn:);scanf(%d,&n);Hanoi(n,a,b,c);getch();}
本文标题:高级语言程序设计第6章参考答案
链接地址:https://www.777doc.com/doc-1938091 .html