C程序设计第三版谭浩强习题答案全下mai陈策提供huan.docx
- 文档编号:9697254
- 上传时间:2023-05-20
- 格式:DOCX
- 页数:126
- 大小:46.18KB
C程序设计第三版谭浩强习题答案全下mai陈策提供huan.docx
《C程序设计第三版谭浩强习题答案全下mai陈策提供huan.docx》由会员分享,可在线阅读,更多相关《C程序设计第三版谭浩强习题答案全下mai陈策提供huan.docx(126页珍藏版)》请在冰点文库上搜索。
C程序设计第三版谭浩强习题答案全下mai陈策提供huan
第9章预处理命令
9.1定义一个代参数的宏,使两个参数的值互换,并写出程序,输入两个数作为使用宏时的实参。
输出已交换后的两个值。
解:
#defineSWAP(a,b)t=b;b=a;a=t
main()
{inta,b,t;
printf(“Inputtwointegersa,b:
”);
scanf(“%d,%d,”*a,*b);
SWAP(a,b);
printf(“Now,a=%d,b=%d\n”,a,b);
}
运行结果如下:
Inputtwointegersa,b:
3,4↙
Now,a=4,b=3
9.2输入两个整数,求它们相除的余数。
用带参的宏来实现,编程序。
解:
#defineSURPLUS(a,b)a%b
main()
{inta,b;
printf(“Inputtwointegersa,b:
”);
scanf(“%d,%d”,&a,&b);
printf(“Rememberis%d\n”,SURPLUS(a,b));
}
运行结果如下:
Inputtwointegersa,b:
60,13↙
Rememberis8
9.3
三角形的面积为:
area=
其中s=(a+b+c),a,b,c为三角形的三边。
定义两个带参的宏,一个用来求s,另一个用来求area。
写程序,在程序中用带实参的宏名来求面积area。
解:
#include
#defineS(a,b,c)(a+b+c)/2
#defineAREA(a,b,c)sqrt(S(a,b,c)*(S(a,b,c)-a)*(S(a,b,c)-b)*(S(a,b,c)-c))
main()
{floata,b,c;
printf(“Inputa,b,c:
”);
scanf(“%f,%f,%f”,&a,&b,&c);
if(a+b>c&&a+c>b&&b+c>a)
printf(“area:
%8.2f.\n”,AREA(a,b,c));
else
printf(“Itisnotatriangle!
”);
}
运行结果:
①Inputa,b,c:
3,4,5↙
area:
6.00
②Inputa,b,c:
12,3,5↙
Itisnotatriangle!
9.4给年份year定义一个宏,以判断该年份是否为闰年。
提示:
宏名可定义为LEAP_YEAR,形参为y,即定义宏的形式为:
#defineLEAP_YEAR(y)(读者设计的字符串)
在程序中用以下语句输出结果:
if(LEAP_YEAR(year))printf(“%disaLeapyear”,year);
elseprintf(“%disnotaleapyear”,year);
解:
#defineLEAP_YEAR(y)(y%4==0)&&(y%100!
=0)||(y%400=0)
main()
{
intyear;
printf(“\nInputyear:
”);
scanf(“%d”,&year);
if(LEAP_YEAR(year))
printf(“%disaleapyear.\n”,year);
else
printf(“%disnotaleapyear.\n”,year);
}
运行结果:
①Inputyear:
1990↙
1990isnotaleapyear.
②Inputyear:
2000↙
2000isaleapyear.
9.5请分析以下一组宏所定义的输出格式:
#defineNLputchar(‘\n’)
#definePR(format,value)printf(“value=%format\t”,(value))
#definePRINT(f,x1)PR(f,x1);NL
#definePRINT(f,x1,x2)PR(f,x1);PRINT(f,x2)
如果在程序中有以下的宏引用:
PR(d,x);
PRINT1(d,x);
PRINT2(d,x1,x2);
写出宏展开后的情况,并写出应输出的结果,设x=5,x1=3,x2=8。
解:
展开后为:
printf(“value=%format\t”,x);
printf(“value=%format\t”,x);putchar(‘\n’);
printf(“value=%format\t”,x1);printf(“value=%format\t”,x2);putchar(‘\n’);
如果运行以下程序:
#include
#defineNLputchar(‘\n’)
#definePR(format,value)printf(“value=%format\t”,(value))
#definePRINT1(f,x1)PR(f,x1);NL
#definePRINT2(f,x1,x2)PR(f,x1);PRINT1(f,x2)
main()
{floatx=5.0,x1=3.0,x2=8.0;
chard;
PR(d,x);
PRINT1(d,x)
PRINT2(d,x1,x2);
}
输出结果如下:
value=5.000000ormatvalue=5.000000ormat
value=3.000000ormatvalue=8.000000ormat
通过本习题可以看到:
如果用TurboC,则不能用这种方法将输出格式和输出项都作为参数。
在宏替换时对字符串中的字符不予替换,一律保留原状。
9.6请设计输出实数的格式。
实数用“6.2f”格式输出。
解:
#definePRprintf
#defineNL“\n”
#defineFs“%f”
#defineF“%6.2f”
#defineF1FNL
#defineF2F“\t”FNL
#defineF3F“\t”F“\t”FNL
main()
{floata,b,c;
PR(“Inputthreefloatingnumbersa,b,c:
\n”);
scanf(Fs,&a);
scanf(Fs,&b);
scanf(Fs,&c);
PR(NL);
PR(“Outputonefloatingnumberseachline:
\n”);
PR(F1,a);
PR(F1,b);
PR(F1,c);
PR(NL);
PR(“Outputtwofloatingnumbers:
\n”);
PR(F2,a,b);
PR(F1,c);
PR(NL);
PR(“Outputthreefloatingnumbers:
\n”);
PR(F3,a,b,c);
}
运行情况如下:
Inputthreefloatingnumbera,b,c:
2.45.99.1↙
Outputonefloatingnumbereachline:
2.40
5.90
9.10
Outputtwofloatingnumbers:
5.90
9.10
Outputthreefloatingnumbers:
2.405.909.10
9.7分别用函数和带参的宏,从3个数中找出最大数。
解:
(1)用函数实现
main()
{
inta,b,c;
printf(“Enterthreeintegers:
”);
scanf(“%d,%d,%d”,&a,&b,&c);
printf(“max=%d\n”,max(a,b,c));
}
max(intx,inty,intz)
{intt;
t=(x>y?
x:
y);
return(t>z?
t:
z);
}
运行结果:
Inputthreeintegers:
12,34,9↙
max=34
(2)用带参的宏实现
#defineMAX(a,b)((a)>(b)?
(a):
(b))
main()
{
inta,b,c;
printf(“Inputthreeintegers:
”);
scanf(“%d,%d,%d”,&a,&b,&c);
printf(“max=%d\n”,MAX(MAX(a,b),c));
}
运行结果:
Inputthreeintegers:
12,34,9↙
max=34
9.8试述“文件包含”和程序文件的连接(link)的概念,二者有何不同?
解:
“文件包含”是事先将程序中需要用到的信息分别存放在不同的“头文件”中(文件后缀为.h),用户在编写程序时,利用#include命令将该头文件的内容包含进来,成为程序的一部分。
特别应当注意的是,该头文件与它所在的源文件共同组成一个文件模块(而不是两个文件模块)。
在编译时它是作为一个文件进行编译的。
连接则与此不同,它的作用是将多个目标文件连接起来。
如果有两个或多个源程序文件,应先对它们分别进行编译,得到两个或多个目标文件(后缀为.obj),在连接阶段,把这些目标文件与系统提供的函数库等文件连接成一个可执行的文件(后缀为.exe)。
9.9用条件编译法实现以下功能:
输入一行电报文字,可以任选两种输出:
一为原文输出;一为将字母变成其下一字母(如’a’变成’b’……’z’变成’a’。
非字母的字符不变)。
用#define命令来控制是否要译成密码。
例如:
#defineCHANGE1
则输入密码。
若改为
#defineCHANGE0
则不译成密码,按原码输出。
解:
#include“stdio.h”
#defineMAX80
#defineCHANGE1
main()
{
charstr[MAX];
inti;
printf(“Inputtext:
\n”);
gets(str);
#if(CHANGE)
{for(i=0;i {if(str[i]! =’\0’) if(str[i]>=’a’&&str[i]<=’z’||str[i]=’A’&&str[i]=’Z’) str[i]+=1; elseif(str[i]==’z’||str[i]==’Z’) str[i]-=25; } } #endif printf(“Output: \n%s”,str); } 运行结果: Inputtext: ALazyBrownFoxJumpsOverADog.↙ Output: BMbazCspxoGpyKvnqtPwfsBEph. 如果想输出原文,可以将程序第3行改为: #defineCHANGE0 修改后在运行: Inputtext: ALazyBrownFoxJumpsOverADog.↙ Output: ALazyBrownFoxJumpsOverADog. 第九章编译预处理 9.1 #defineSWAP(a,b)t=b;b=a;a=t main() { inta,b,t; printf("请输入两个整数a,b: "); scanf("%d,%d",&a,&b); SWAP(a,b); printf("交换结果为: a=%d,b=%d\n",a,b); } 9.2 #defineSURPLUS(a,b)((a)%(b)) main() { inta,b; printf("请输入两个整数a,b: "); scanf("%d,%d",&a,&b); printf("a,b相除的余数为: %d\n",SURPLUS(a,b)); } 9.3 #include #definS(a,b,c)((a+b+c)/2) #defineAREA(a,b,c)(sqrt(S(a,b,c)*(S(a,b,c)-a)*(S(a,b,c)-b)*(s(a,b,c)- c))) main() { floata,b,c; printf("请输入三角形的三条边: "); scanf("%f,%f,%f",&a,&b,&c); if(a+b>c&&a+c>b&&b+c>a) printf("其面积为: %8.2f.\n",AREA(a,b,c)); else printf("不能构成三角形! "); } 9.4 #defineLEAP_YEAR(y)(y%4==0)&&(y%100! =0)||(y%400==0) main() { intyear; printf("\n请输入某一年: "); scanf("%d",&year); if(LEAP_YEAR(year)) printf("%d是闰年.\n",year); else printf("%d不是闰年.\n",year); } 9.5解: 展开后: printf("&#118alue=%format\t",x); printf("&#118alue=%format\t",x);putchar('\n'); printf("&#118alue=%format\t");printf("&#118alue=%format\t",x2);putchar('\n'); 输出结果: &#118alue=5.000000ormat&#118alue=5.000000ormat &#118alue=3.000000ormat&#118alue=8.000000ormat 9.8 main() { inta,b,c; printf("请输入三个整数: "); scanf("%d,%d,%d",&a,&b,&c); printf("三个之中最大值为: %d\n",max(a,b,c)); } max(x,y,z) intx,y,z; { intt; t=(x>y? x: y); return(t>z? t: z); } 9.10 #include #defineMAX80 #defineCHANGE1 main() { charstr[MAX]; inti; printf("请输入文本行: \n"); scanf("%s",str); #if(CHANGE) { for(i=0;i{ if(str[i]! ='\0' if(str[i]>='a'&&str[i]<'z'||str[i]>='A'&&str[i]<'Z') str[i]+=1; elseif(str[i]=='z'||str[i]=='Z') str[i]-=25; } } #endif printf("输出电码为: \n%s",str); } 第10章指针 10.1输入3个整数,按由小到大的顺序输出。 解: main() {intn1,n2,n3; int*p1,*p2,*p3; printf(“Inputthreeintegersn1,n2,n3: ”); scanf(“%d,%d,%d”,&n1,&n2,&n3); p1=&n1; p2=&n2; p3=&n3; if(n1>n2)swap(p1,p2); if(n1>n3)swap(p1,p3); if(n1>n3)swap(p2,p3); printf(“Now,theorderis: %d,%d,%d\n”,n1,n2,n3); } swap(int*p1,int*p2) {intp; p=*p1;*p1=*p2;*p2=p; } 运行结果 Inputthreeintegersn1,n2,n3: 34,21,25↙ Now,theorderis: 21,25,34 10.2输入3个字符串,按由小到打的顺序输出。 解: main() {char*str1[20],*str2[20],*str3[20]; charswap(); printf(“Inputthreelines\n”); gets(str1); gets(str2); gets(str3); if(strcmp(str1,str2)>0)swap(str1,str2); if(strcmp(str1,str3)>0)swap(str1,str3); if(strcmp(str2,str3)>0)swap(str2,str3); pritnf(“Now,theorderis: \n”); printf(“%s\n%s\n%s\n”,str1,str2,str3); } charswap(char*p1,char*p2)/*交换两个字符串*/ {char*p[20]; strcpy(p,p1);strcpy(p1,p2);strcpy(p2,p); } 运行结果: Inputthreelines: Istudyveryhard.↙ Clanguageisveryinteresting.↙ Heisaprofessor.↙ Now,theorderis: Clanguageisveryinteresting. Heisaprofessor. Istudyveryhard. 10.3输入10个整数,将其中最小的数与第一个数对换,把最大的一个数与最后一个对换。 写3个函数: (1)输入10个数; (2)进行处理;(3)输出10个数。 解: main() {intnumber[10]; input(number);/*调用输入10个数的函数*/ max_min_value(number);/*调用交换函数*/ output(number);/*调用输出函数*/ } input(intnumber[10])/*输入10个数的函数*/ {inti; print(“Input10number: ”); for(i=0;i<10;i++) scanf(“%d”,&number[i]); } max_min_value(intarray[10])/*交换函数*/ {int*max,*min,*p,*array_end; array_end=array+10; max=min=array; for(p=array+1;p if(*p>*max)max=p;/*将大数地址赋给max*/ elseif(*p<*min)min=p;/*将小数地址赋给min*/ *p=array[0];array[0]=*min;min=*p;/*将最小数与第一个数交换*/ *p=array[9];array[9]=*max;max=*p;/*将最大数与第最后一个数交换*/ return; } output(intarray[10])/*输出函数*/ {int*p; printf(“Now,theyare: ”); for(p=array;p<=array+9;p++) printf(“%d”,*p); } 运行结果: Input10numbers: 322456781983644296↙ Now,theyare: 124567832636442998 10.4有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成前面m个数。 写一函数实现以上功能,在主函数中输入n个整数,并输出调整后的n个数。 解: main() {intnumber[20],n,m,I;/*共有多少个数*/ printf(“Howmanynumbers? ”); scanf(“%d”,&n); printf(“Input%dnumbers: \n”,n);/*输入n个数*/ for(i=0;i scanf(“%d”,&number[i]); printf(“Howmanyplaceyouwanttomove? ”);/*后移多少个位置*/ scanf(“%d”,&m);/*调用move函数*/ move(number,n,m); printf(“Now,theyare: \n”); for(i=0;i printf(“%d”,number[i]); } move(intarray[20],intn,intm)/*循环后移一次的函数*/ {int*p,array_end; array_end=*(array+n-1); for(p=array+n-1;p>array;p--) *p=*(p-1); *array=array_end; m--; if(m>0)move(array,n,m);/*递归调用,当循环次数m减至0时,停止调用*/ } 运行结果: Howmanynumber? 8↙ Input8numbers: 1243656782711↙ Howmanyplaceyouwanttomove? 4↙ Now,theyare: 7271112436567 10.5有一字符串,包含n个字符。 写一个函数,将此字符串中从第m个字符开始的全部字符复制成为另一个字符串。 解: main() {intm; char*str1[20],*str2[20]; printf(“inputstring: ”); gets(str1); printf(“Whichcharacterthatbegintocopy? ”); scanf(“%d”,&m); if(strlen(str1) printf(“inputerror! ”); else {copystr(str1,str2,m); printf(“result: %s”,str2); } } copystr(char*p1,char*p2,intm)/*字符串部分复制函数*/ {intn; n=0; while(n {n++; p1++; } while(*p1! =’\0’) {*p2=*p1; p
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序设计 第三 版谭浩强 习题 答案 mai 提供 huan
![提示](https://static.bingdoc.com/images/bang_tan.gif)