结构体
例10.4 指向结构体数组的指针的应用
#include struct student { int num;char name[20];char sex;int age;}; struct student stu[3]={{10101,″Li Lin″,′M′,18},{10102,″Zhang Fun″,′M′,19},{10104,″WangMing″,′F′,20}}; void main() { struct student *p;
printf(″No.
Name
sex
age\n″);
for(p=stu;p<stu+3;p++)
printf(″%5d %-20s %2c %4d\n″,p->num,p->name,p->sex,p->age);
} 运行结果:
No.Name
sex
age
10101
LiLin
M
18
1010
2 Zhang Fun M
19
10104
WangMing F
20
例10.5 有一个结构体变量stu,内含学生学号、姓名和3门课程的成绩。要求在main函数中赋予值,在另一函数print中将它们输出。今用结构体变量作函数参数。 #include #include #define FORMAT ″%d\n%s\n%f\n%f\n%f\n″ struct student { int num;
char name[20];
float score[3]; };
#include #include #define FORMAT ″%d\n%s\n%f\n%f\n%f\n″ struct student { int num;
char name[20];
float score[3]; };
void main() { void print(struct student);
struct student stu;
stu.num=12345;
strcpy(stu.name,″LiLin″);
1
stu.score[0]=67.5;
stu.score[1]=89;
stu.score[2]=78.6;
print(stu); } void print(struct student stu) { printf(FORMAT,stu.num,stu.name, stu.score[0],stu.score[1],stu.score[2]);
printf(″\n″);} 运行结果: 12345 Li Li 67.500000 89.000000 78.599998 例10.6 将上题改用指向结构体变量的指针作参数。 #include struct student { int num;
char name[20];
float score[3]; }stu={12345, ″LiLi″,67.5,89,78.6}; void main() { void print(struct student *);
print(&stu); }
void print(struct student *p) { printf(FORMAT,p->num,p->name,p->score[0],p->score[1],p->score[2]);
printf(″\n″); } 运行结果: 12345 Li Li 67.500000 89.000000 78.599998 有10个学生,每个学生的数据包括学号、姓名、3门课的成绩,从键盘输入10个学生数据,要求输出3门课程总平均成绩,以及最高分的学生的数据(包括学号、姓名、3门课程总成绩、平均分数)。 10.1:# include
struct student
{ char num[6];
char name[8];
int score[3];
float avr;
}stu[10];
2
main()
{ int i,j,max=0,maxi=0,sum=0;
float average=0;
for(i=0;i<10;i++)
{ scanf(“%s%s”,stu[i].num,stu[i].name);
for(j=0;j<3;j++)
scanf(“%d”,&stu[i].score[j]);
}
for(i=0;i<10;i++)
{ sum=0;
for(j=0;j<3;j++)
sum+=stu[i].score[j];
stu[i].avr=sum/3.0;
average+=stu[i].avr;
if(sum>max) { max=sum; maxi=i; }
}
average/=10;
printf(“average=%6.2f\n”,average);
printf(“The highest is:%s,%s,%d,%f”,
stu[maxi].num,stu[maxi].name,max,stu[maxi].avr); }
指针
例9.4 输入a、b、c3个整数,按大小顺序输出。 #include void main()
{void exchange(int *q1,int *q2,int *q3); int a,b,c,*p1,*p2,*p3;
scanf(″%d,%d,%d″,&a, &b, &c);
p1=&a;p2=&b;p3=&c;
exchange (p1,p2,p3);
printf(″%d,%d,%d\n″,a,b,c);
}
void exchange(int *q1,int *q2,int *q3){ void swap(int *pt1,int *pt2);
if(*q1<*q2) swap(q1,q2);
if(*q1<*q3) swap(q1,q3);
if(*q2<*q3) swap(q2,q3);
}
void swap(int *pt1, int *pt2)
{int temp;
temp=*pt1;
*pt1=*pt2;
*pt2=temp;
score 3
}
运行情况如下:
9,0,10↙ 10,9,0
例9.10:有一个班,3个学生,各学4门课,计算总平均分数以及第n个学生的成绩。这个题目是很简单的。只是为了说明用指向数组的指针作函数参数而举的例子。用函数average求总平均成绩,用函数search找出并输出第i个学生的成绩。 #include void main()
{ void average(float *p,int n);
void search(float (*p)[4],int n);
float score[3][4]={{65,67,70,60},
average(*score,12); /*求12个分数的平均分*/
search(score,2);
/*求序号为2的学生的成绩*/ }
void average(float *p,int n) { float*p_end;
float sum=0,aver;
p_end=p+n-1;
for(;p<=p_end;p++)
sum=sum+(*p);
aver=sum/n;
printf(″average=%5.2f\n″,aver); }
void search(float (*p)[4],int n)
/ * p是指向具有4个元素的一维数组的指针 */ {int i;
printf(″the score of No.%d are:\n″,n);
for(i=0;i<4;i++)
printf(″%5.2f″,*(*(p+n)+i)); }
程序运行结果如下: average=82.25
The score of No.2 are:
90.00 99.00 100.00 98.00
例9.11: 在上题基础上,查找有一门以上课程不及格的学生,打印出他们的全部课程的成绩。
#include void main()
{void search(float (*p)[4],int n);
float score[3][4]={{65,57,70,60},
{58,87,90,81},{90,99,100,98}};
{80,87,90,81},{90,99,100,98}};
search(score,3);
}
void search(float (*p)[4],int n) {int i,j,flag;
for(j=0;j<n;j++)
{flag=0;
for(i=0;i<4;i++)
if(*(*(p+j)+i)<60) flag=1;
if(flag==1)
{ printf("No.%d fails,his scores are: \n",j+1);
for(i=0;i<4;i++)
printf(″%5.1f″,*(*(p+j)+i));
printf(″\n″);
}
}
}
程序运行结果如下:
No.1 fails, his scores are:
65.0
57.0
70.0
60.0 No.2 fails, his scores are:
58.0 87.0 90.0 81.0 例9.17:求a和b中的最大者。 #include void main()
{int max(int,int); int a,b,c;
scanf(″%d,%d″,&a,&b);
c=max(a,b); printf(″a=%d,b=%d,max=%d\n″,a,b,c);
}
int max(int x,int y) { int z;
if(x>y)z=x;
else
z=y;
return(z);
}
例9.18:有若干个学生的成绩(每个学生有4门课程),要求在用户输入学生序号以后,能输出该学生的全部成绩。用指针函数来实现。
#include void main()
{float score[][4]={{60,70,80,90},
{56,89,67,88},{34,78,90,66}};
float *search(float (*pointer)[4],int n);
float*p;
5
int i,m;
printf(″enter the number of student:″);
scanf(″%d″,&m);
printf(″The scores of No.%d are:\n″,m); p=search(score,m);
for(i=0;i<4;i++) printf(″%5.2f\t″,*(p+i));
}
float *search(float (*pointer)[4],int n) { float *pt;
pt=*(pointer+n);
return(pt);
}
运行情况如下:
enter the number of student:1↙ The scores of No. 1 are:
56.00
89.00
67.00
88.00 例9.19: 对上例中的学生,找出其中有不及格课程的学生及其学生号。#include void main()
{ float score[][4]={{60,70,80,90},
{56,89,67,88},{34,78,90,66}};
float search(float (*pointer)[4]);
float*p;
int i,j;
for(i=0;i<3;i++)
{p=search(score+i);
if(p==*(score+i))
{ printf(″No.%d scores:″,i);
for(j=0;j<4;j++)
printf(″%5.2f″,*(p+j));
printf(″\n″);}
}
}
float *search (float (*pointer)[4]) { int i;
float *pt;
pt=*(pointer+1);
for(i=0;i<4;i++)
if(*(*pointer+i)<60) pt=*pointer;
return(pt);
} 运行情况如下:
No.1 scores:56.00 89.00 67.00 88.00
No.2 scores:34.00 78.00 90.00 66.00
例9.20:将若干字符串按字母顺序(由小到大)输出。 #include #include void main()
{void sort(char *name[ ],int n);
void print(char *name[ ],int n);
char *name[ ]={"Follow me","BASIC","Great Wall″,"FORTRAN","Computer design"}; int n=5;
sort(name,n);
print(name,n);
}
void sort(char *name[ ],int n) {char *temp;
int i,j,k;
for(i=0;i<n-1;i++) {k=i;
for(j=i+1;j<n;j++)
if(strcmp(name[k],name[j])>0)k=j;
if(k!=i)
{ temp=name[i];
name[i]=name[k];
name[k]=temp;}
}
}
void print(char *name[ ],int n) { int i;
for(i=0;i<n;i++)
printf(″%s\n″,name[i]);
} 运行结果为: BASIC Computer design FORTRAN Follow me Great Wall 作业:(提交上机报告) 输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。写3个函数:①输入10个数;②进行处理;③输出10个数。 # include main()
{ void input(int number[10]);
void max_min_value(int array[10]);
7
void output(int array[10]);
int number[10]; input (number); max_min_value(number); output(number);
} void input(int number[10])
{ int i;
for(i=0;i<=9;i++)
scanf(“%d”,&number[i]); } void max_min_value(int array[10])
{ int *max,*min,*p,*array_end;
array_end=array+10;
max=min=array;