好文档 - 专业文书写作范文服务资料分享网站

C语言程序设计第三版谭浩强课后习题答案完整版

天下 分享 时间: 加入收藏 我要投稿 点赞

8.16写一函数,输入一个十六进制数,输出相应的十进制数。

#include\ int x; ff(shu) char shu[];

{int i=strlen(shu)-1,sum=0; for(;i>-1;i++)

{if {if(48<=shu[i]<=57) sum=sum+(shu[i]-48)*pow(16,(i-1)); else if(65<=shu[i]<=90) sum=sum+(shu[i]-55)*pow(16,(i-1)); else if(97<=shu[i]<=102) sum=sum+(shu[i]-87)*pow(16,(i-1)); {int j,i;

for(i=o-1,j=0;i>-1;i--,j++)

x[i]=(int)((unsigned long)(m/pow(10,j)))+48; return; }

main()

{unsigned long a,b;int j,i; scanf(\

for(j=0,b=a;b>0.1;j++,b/=10); pf(a,j);

puts(x);printf(\ x=1;} else x=0; return x; }

main()

{char shufu[100];int s; gets(shufu);s=ff(shufu); if(x) printf(\

else printf(\ }

8.17用递归法将一个整数n转换成字符串。例如,输入486,应输出字符串\。n的位数不确定,可以是任意位数的整数。

#include\ int x[10]; pf(m,n)

unsigned long m;int n; {int y;

if(n==0) {y=(int)(m);x[0]=y;} else {y=(unsigned long)((m-pf(m,n-1))/pow(10,n));x[n]=y;} return(y); }

main()

{unsigned long a,b;int i,j,k;char c[11]; scanf(\

for(j=0,b=a;b>0.1;j++,b/=10); pf(a,j-1);

for(i=0,k=j-1;i

#include\ char x[11]; pf(m,o)

unsigned long m;int o;

#include\

int x[10];unsigned long m; pf(n) int n; {int y;

if(n==0) {y=m;x[0]=y;}

else {y=(unsigned long)((m-pf(n-1))/pow(10,n));x[n]=y;} return(y); }

main()

{unsigned long a;int i,j,k;char c[11]; scanf(\

for(j=0,a=m;a>0.1;j++,a/=10); pf(j-1);

for(i=0,k=j-1;i

8.18给出年、月、日,计算该日是该年的第几天。 int find(x,y,z) int x,y,z;

{ int i,t,s,days=0; if(x%4==0) t=1; else t=0;

for(i=1;i

days=days+30+i%2-s; }

days=days+z; return(days); }

main()

{int year,month,date,day;

scanf(\ day=find(year,month,date);

16

printf(\TE IS THE %dth DAYS\\n\ }

第九章 编译预处理

9.1定义一个带参的宏,使两个参数的值互换,并写出程序,输入两个数作为使用宏时的实参。输出已交换后的两个值。 {float a,b,c,t,area;

scanf(\ t=SSS(a,b,c);

area=AQRT(a,b,c);

printf(\ } #define CHANGE(a,b,t) t=a;a=b;b=a main() {int c,d,s;

scanf(\ CHANGE(c,d,s);

printf(\ }

9.2输入两个整数,求他们相除的余数。用带参的宏来实现,编程序。

#define Q(a,b) a%b main() {int c,d,t;

scanf(\ t=Q(c,d);

printf(\ }

9.3三角形面积为:

其中S=(a+b+c)/2,a、b、c为三角形的三边。定义两个带参的宏S,一个用来求area,另一个宏用来求。写程序,在程序中用带实参的宏名来求面积area。 #include\

#define SSS(m,n,k) (m+n+k)/2 #define AQRT(m,n,k) sqrt(SSS(m,n,k)*(SSS(m,n,k)-m)*(SSS(m,n,k)-n)*(SSS(m,n,k)-k)) main()

{float a,b,c,s,area;

scanf(\ s=SSS(a,b,c);

area=AQRT(a,b,c);

printf(\ } 或

#include\

#define SSS(m,n,k) (m+n+k)*0.5 #define AQRT(m,n,k) sqrt(((m+n+k)/2)*((m+n+k)/2-m)*((m+n+k)/2-n)*((m+n+k)/2-k)) main()

#include\

#define SSS(m,n,k) ((m+n+k)/2) #define

AQRT(m,n,k,m,n,k,m,n,k,m,n,k,m,n,k,m,n,k,m,n,k,m,n,k,m,n,k) sqrt(SSS*(SSS-m)*(SSS-n)*(SSS-k)) main()

{float a,b,c,t,area;

scanf(\ t=SSS(a,b,c);

area=AQRT(a,b,c,a,b,c,a,b,c,a,b,c,a,b,c,a,b,c,a,b,c,a,b,c,a,b,c); printf(\ }

9.4给年份year,定义一个宏,以判别该年份是否闰年。提示:宏名可以定义为LEAP_YEAR,形参为y,既定义宏的形式为

#define LEAP_YEAR(y) (读者设计的字符串) 在程序中用以下语句输出结果:

if (LEAP_YEAR(year)) printf(\ else printf (\ #define LEAPYEAR(y) y%4 main() {int y;

scanf(\

if(LEAPYEAR(y)) printf(\ else printf(\ }

9.6请设计输出实数的格式,包括:⑴一行输出一个实数;⑵一行内输出两个实数;⑶一行内输出三个实数。实数用\格式输出。

#define PR1(x) printf(\

#define PR2(x) printf(\

#define PR3(x) printf(\ main()

{float a;scanf(\ PR1(a);PR2(a);PR3(a); }

9.7设计所需的各种各样的输出格式(包括整数、实属、字符串等),用一个文件名\,把信息都放到这个文件内,另编一个程序文件,用命令#include \以确保能使用这些格式。

17

分别用函数和带参的宏,从三个数中找出最大的数。 #define MAX(a,b,c) (a>((b>c)? b:c))? a:((b>c)? b:c) main()

{float x,y,z,t;

scanf(\ t=MAX(x,y,z); printf(\ }

9.10用条件编译方法实现以下功能:

输入一行电报文字,可以任选两种输出,一为原文输出;一为将字母变成其下一字母(如’a’变成’b’??’z’变成’a’其它字符不变)。用命令来控制是否要译成密码。例如:

#define CHANGE 1 则输出密码。若: #define CHANGE 0

则不译为密码,按原码输出。 #define CHANGE 1 main()

{char str[80],c;int i=0; gets(str);

while(str[i]!=?\\0?) {

#if CHANGE

if(str[i]==90||str[i]==122) str[i]=str[i]-25; else if(str[i]>=65&&str[i]<90||str[i]>=97&&str[i]<122) str[i]=str[i]+1; #endif i++; }

puts(str); } 或

#define CHANGE 1 main()

{char str[80],*c;int i=0; gets(str);c=str; while(*c!=?\\0?) {

#if CHANGE

if(*c==90||*c==122) *c=*c-25;

else if(*c>=65&&*c<90||*c>=97&&*c<122) *c=*c+1; #endif c++; }

puts(str);

}

第十章 指针

10.1输入三个整数,按由小到大的顺序输出。 main()

{ int a,b,c,*p1,*p2,*p3,t;

scanf(\ p1=&a;p2=&b;p3=&c; if(*p1>*p2)

{t=p1;p1=p2;p2=t;} if(*p1>*p3)

{t=p1;p1=p3;p3=t;} if(*p2>*p3)

{t=p2;p2=p3;p3=t;}

printf(\ } 或 main()

{int a,b,c,*p1,*p2,*p3,t;

scanf(\ p1=&a;p2=&b;p3=&c; if(a>b)

{t=*p1;*p1=*p2;*p2=t;} if(a>c)

{t=*p1;*p1=*p3;*p3=t;} if(b>c)

{t=*p2;*p2=*p3;*p3=t;} printf(\ }

10.2输入三个字符串,按由小到大的顺序输出 #define N 3 #define M 20 main()

{char str0[N][M],str1[M],*p,*q; int i,l,m,n; q=str0;

for(;p

l=strcmp(q,q+1); if(l>0)

{strcpy(str1,q);strcpy(q,q+1);strcpy(q+1,str1);} m=strcmp(q,q+2); if(m>0)

{strcpy(str1,q);strcpy(q,q+2);strcpy(q+2,str1);} n=strcmp(q+1,q+2); if(n>0)

{strcpy(str1,q);strcpy(q+1,q+2);strcpy(q+2,q+1);}

18

for(p=q;p

10.3输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。写三个函数;①输入10个数;②进行处理;③输出10个数。 f(x,n) int x[],n;

{int *p0,*p1,i,j,t,y; i=j=x[0];p0=p1=x; for(y=0;yi)

{i=x[y];p0=&x[y];} else if(x[y]

{j=x[y];p1=&x[y];}}

t=*p0;*p0=x[n-1];x[n-1]=t; t=*p1;*p1=x[0];x[0]=t; return; }

main()

{int a[10],u,*r; for(u=0;u<10;u++) scanf(\ f(a,10);

for(u=0,r=a;u<10;u++,r++) printf(\ printf(\ }

10.4有n个整数,使前面各数顺序向后移m个位置,最后m个数变成前面m个数,见图。写一函数:实现以上功能,在主函数中输入n个数和输出调整后的n个数。 #define N 10 void shift(p,x) float *p;int x;

{float a[N],*q,*o;int i; o=a;q=p;

for(i=0;i=q;p--) *p=*(p-x);

for(i=0;i

{float shuzhu[N],*u,*v; int h,i;u=v=shuzhu;

scanf(\ for(;u

for(u=v;u

10.5有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。 #define N 5 main()

{int i,j,k,a[N+1],*p;

for(i=0,p=a;p<=a+N;i++,p++) *p=i;

p=a+1;k=N;

for(i=0,j=1;k!=1;j++) {if(p>(a+N)) p=a+1; if(*p!=0) i++;

if((i-3)==0) {*p=0;i=0;k--;} p++; }

for(i=1;i<=N;i++) if(a[i]!=0)

printf(\

10.7有一字符串,包含n个字符。写一函数,将此字符串中从第m个字符开始的全部字符复制成为另一个字符串。 #include\ #define N 10 main()

{char a[N+1],b[N+1],*p,*q; int m; gets(a);

scanf(\ p=a+m;q=b; strcpy(q,p); puts(q); }

10.6写一函数,求一个字符串的长度。在主函数种输入字符串,并输出其长度。

19

第十一章

11.1定义一个结构体变量(包括年、月、日)。计算该日在本年中是第几天,注意闰年问题。 解:Struct {int year; int month; int day; }date; main() {int days;

printf(“Input year,month,day:”);

scanf(“%d,%D,%d”,&date.year,&date.month,&date.day); switch(date.month)

{case 1: days=date.day; break;

case 2: days=date.day+31; break; case 3: days=date.day+59; break; case 4: days=date.day+90; break; case 5: days=date.day+120; break; case 6: days=date.day+31; break;

case 7: days=date.day+181; break; case 8: days=date.day+212; break; case 9: days=date.day+243; break; case 10: days=date.day+273; break; case 11: days=date.day+304; break; case 12: days=date.day+334; break; }

if((date.year%4==0&&date.year0!=0||date.year@0==0)&&date.month>=3)days+=1; printf(“\\n%d/%d is the %dth day in%d.”,date.month,data.day,days,date,year); }

11.2写一个函数days,实现上面的计算。由主函数将年、月、日传递给days 函数,计算后将日数传回主函数输出。 解:struct y_m_d {int year: int month; int day; }date;

intdays(struct y_m_d date1) {int sum;

switch(data.month)

{case 1:sum=date1.day; break; case 2:sum=date1.day+31; break; case 3:sum=date1.day+59; break; case 4:sum=date1.day+90; break; case 5:sum=date1.day+120; break;

case 6:sum=date1.day+151; break; case 7:sum=date1.day+181; break; case 8:sum=date1.day+212; break; case 9:sum=date1.day+243; break case 10:sum=date1.day+243; break case 11:sum=date1.day+243; break case 12:sum=date1.day+243; break } };

11.3编写一个函数print,打印一个学生的成绩数,该数组中有5个学生的数据记录,每个记录包括num、name、sore[3],用主函数输入这些记录,用print函数输出这些记录。 解:

#define N 5 struct student {char num[6]; char name[8]; int score[4]; }stu[N]; main() {int I,j ;

for(I=0;I

{printf(“\\Input score of student %d:\\n”,I+1); printf(“no.:”);

scanf(“%s”,stu[i].num); printf(“name:”);

scanf(“%s”,stu[i].name); for(j=0;j<3;j++)

{printf(“score%d:”j+1);

scanf(“%d”,&stu[i].score[j]); }

printf(“\\n”); }

print(stu); }

print(struct student stu[6]) {int I,j;

printf(“%5ss”,stu[i].num,stu[i].name); for(j=0;j<3;j++)

printf(“?”,stu[i].score[j]); print(“\\n”); }

11.4在上题的基础上,编写一个函数input,用来输入5个学生的数据记录。 解:

#define N 5 struct student {char num[6];

20

C语言程序设计第三版谭浩强课后习题答案完整版

8.16写一函数,输入一个十六进制数,输出相应的十进制数。#include\intx;ff(shu)charshu[];{inti=strlen(shu)-1,sum=0;for(;i>-1;i++){if{if(48<=shu[i]<=57)sum=sum+(shu[i]-48)*pow(16,(i
推荐度:
点击下载文档文档为doc格式
1ogc78lgwy37lyd0yejc
领取福利

微信扫码领取福利

微信扫码分享