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