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;y {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 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语言程序设计第三版谭浩强课后习题答案完整版



