宏名可以定义为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(\ }
请设计输出实数的格式,包括:⑴一行输出一个实数;⑵一行内输出两个实数;⑶一行内输出三个实数。实数用\格式输出。
#define PR1(x) printf(\
#define PR2(x) printf(\
#define PR3(x) printf(\ main()
{float a;scanf(\ PR1(a);PR2(a);PR3(a); }
设计所需的各种各样的输出格式(包括整数、实属、字符串等),用一个文件名\,把信息都放到这个文件内,另编一个程序文件,用命令#include \以确保能使用这些格式。 分别用函数和带参的宏,从三个数中找出最大的数。 #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(\ }
用条件编译方法实现以下功能:
输入一行电报文字,可以任选两种输出,一为原文输出;一为将字母变成其下一字母(如’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); }
第十章 指针
输入三个整数,按由小到大的顺序输出。 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(\ }
输入三个字符串,按由小到大的顺序输出 #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);} for(p=q;p 输入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(\ } 有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 有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(\ 有一字符串,包含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); } 写一函数,求一个字符串的长度。在主函数种输入字符串,并输出其长度。 第十一章 11.1定义一个结构体变量(包括年、月、日)。计算该日在本年中是第几天,注意闰年问题。 解:Struct {int year; int month; int day; }date; main() {int days; printf(“Input year,month,day:”); scanf(“%d,%D,%d”,&,&,&; switch {case 1: days=; break; case 2: days=+31; break; case 3: days=+59; break; case 4: days=+90; break; case 5: days=+120; break; case 6: days=+31; break; case 7: days=+181; break; case 8: days=+212; break; case 9: days=+243; break; case 10: days=+273; break; case 11: days=+304; break; case 12: days=+334; break; } if(%4==0&&0!=0||@0==0)&&>=3)days+=1; printf(“\\n%d/%d is the %dth day in%d.”,,,days,date,year); } 写一个函数days,实现上面的计算。由主函数将年、月、日传递给days 函数,计算后将日数传回主函数输出。 解:struct y_m_d {int year: int month; int day; }date; intdays(struct y_m_d date1) {int sum; switch {case 1:sum=; break; case 2:sum=+31; break; case 3:sum=+59; break; case 4:sum=+90; break; case 5:sum=+120; break; case 6:sum=+151; break; case 7:sum=+181; break; case 8:sum=+212; break; case 9:sum=+243; break case 10:sum=+243; break case 11:sum=+243; break case 12:sum=+243; break } }; 编写一个函数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”); } 在上题的基础上,编写一个函数input,用来输入5个学生的数据记录。 解: #define N 5 struct student {char num[6]; char name[8]; int score[4] }stu[N]; input(struct student stu[]) {int I,j; for(I=0;I {printf(“input scores 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++); scanf(“%d”, &stu[i].score[j]);} } printf(“\\n”); } } 有10个学生,每个学生的数据包括学号、姓名、3门课的成绩,从键盘输入10个学生的数据,要求打印出3门课的总平均成绩,以及最高分的学生的数据(包括学号、姓名、3门课成绩) 解:#define N 10 struct student {char num[6] char name[8] int score[4] float avr; }stu[N]; main() {int I,j,max,maxi,sum; float average; for(I=0;I {printf(“\\nInput scores 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]); } } average=0; max=0; maxi=0; for(i=0;i<3;i++) {sum=0; for(j=0;j<3;j++) sum+=stu[i].score[j]; stu[i].avr=sum/; average+=stu[i].avr; if(sum>max) {max=sum; maxi=I; } } average/=N; printf(“NO. name score1 score2 score3 average\\n”); for(I=0;I {printf(“%5ss”,stu[i].num, stu[i].name); for(j=0;j<3;j++) printf(“?”,stu[i].score[j]); printf(“%\\n”,stu[i].avr); } printf(“average=%\\n”,average); printf(“The highest score is:%s,score total:%d.”stu[maxi].name,max); } 编写一个函数new,对n个字符开辟连续的存储空间,此函数应返回一个指针,指向字符串开始的空间。New(n)表示分配n个字节的内存空间。 解:new函数如下: #define NULL 0 #define NEWSIZE 1000 char newbuf[NEWSIZE]; char *newp=newbuf; char *new(int n) {if (newp+n<=newbuf+ NEWSIZE) { newp= newp+n; return(newp-n); } else return(NULL); } 写一函数free,将上题用new函数占用的空间释放。Free(p)表示将p指向的单元以后的内存段释放。 解: #define Null o #define NEWSIZE 1000 char newbuf[NEWSIZE]; char *newp=newbuf; free(char *p) {if((p>=newbuf)&&(p 已有a、b亮光链表,每个链表中的结点包括学好、成绩。要求把两个链表合并,按学号升序排列。 解: #include<> #define NULL 0 #define LENsizeof(struct student) strut student {long num; int scor; struct student *next }; struct student listA,listB; int n,sum=0; main() {struct student *creat(void); struct student *insert(struct student *,struct student *); void print(struct student *); stuct student *ahead , *bhead,*abh; printf(“\\ninput list a:\\n”); ahead=creat(); sum=sum+|n; abh=insert(ahead,bhead); print(abh); } struct student *creat(void) {struct student *p1,*p2,*head; n=0; p1=p2=(struct student *)malloc(LEN); printf(“input number&scores of student:\\n”); printf(“if number Is 0,stop inputing.\\n”); scanf(“%ld,%d”,&p1->num,&p1->score); head=NULL; while(p1->num!=0) {n=n+1; if(n==1)head=p1; else p2->next =p1; p2=p1; p1=(struct student *)malloc(LEN); scanf(“%ld,,%d”,&p1->num,&p1->score); } p2->next=NULL; return(head); } struct student *insert(struct student *ah,struct student *bh) {struct student *pa1 , *pa2,*pb1,*pb2; pa2=pa1=ah; pb2=pb1=bh; do {while((pb1->num>pa1->num)&&(pa1->next!=NULL)) {pa2=pa1; pa1=pa1->next; } if(pb->num<=pa1->num) {if(ah=pa1) ah=pb1; else pa2->next=pb1; pb1=pb1->next; pb2->next=pa1; pa2=pb2; pb2=pb1; } } while((pa1->next!=NULL)||(pa1==NULL&&pb1!=NULL)); if((pb1->num>pa1->num)&&(pa1->next==NULl)) ap1->next=pb1; return(ah); } void print(struct student *head) {struct student *p; printf(“%ld%d\\n”,p->num,p->score); p=p->next; while(p!=NULL); } 13个人围成一圈,从第1个人开始顺序报号1、2、3。凡报到“3”者退出圈子。找出最后留在圈子中的人原来的序号。 解: #define N 13 struct person {int number; int nextop; }link[N+1]; main() {int I,count,h; for(I=1;I<=N;I++) {if(I==N) link[i].nextp=1; else link[i].nextp=I+1; link[i].number=I; } printf(“\\n”); count=0; h=N; printf(“sequence that person2 leave the circle:\\n”); while(count while(I!=3) {h=link[h].nextp; if(link[h].number) I++; } printf(“M”,link[h].number); link[h].number=0;