一、定义结构体
例如:
struct student
{
int xuehao;
char name[30];
char xingbie;
float chengji;
}
struct student a={001,"Houge",'M',99};
当我们在程序的开头定义好这样一个结构体以后,在执行程序的时候,就可以定义这个结构体所对应的变量了。比如定义一个结构体变量a。当定义某一个变量是属于这个结构体变量的时候,其实就是代表变量a中包含了xuehao,name,xingbie,chengji这四个要素了。当我们给一个结构体变量赋上值以后,我们要表示这个结构体变量的要素的时候,就是这样表示:a.xuehao=001;a.name="Houge";a.xingbie='M';a.chengji=99;
当然,上面的形式还可以简化一下,写成这样:
struct student
{
int xuehao;
char name[30];
char xingbie;
float chengji;
}a={001,"Houge",'M',99};
明白结构体的基本知识以后,我们来看一道题:
例:输入两个学生的学号、姓名和成绩,输出成绩较高者的学号、姓名和成绩。若二者相等,则输出两个学生的全部信息。
#include<stdio.h>
struct student
{
int xuehao;
char name[30];
float chengji;
}a,b;
int main()
{
printf("请输入第一个学生的学号、姓名和成绩:\n");
scanf("%d,%s,%f",&a.xuehao,a.name,&a.chengji);
printf("请输入第二个学生的学号、姓名和成绩:\n");
scanf("%d,%s,%f",&b.xuehao,b.name,&b.chengji);
printf("成绩较高者的信息如下:\n");
if(a.chengji>b.chengji)
{
printf("%d\t%s\t%f\n",a.xuehao,a.name,a.chengji);
}
else if(a.chengji<b.chengji)
{
printf("%d\t%s\t%f\n",b.xuehao,b.name,b.chengji);
}
else
{
printf("%d\t%s\t%f\n",a.xuehao,a.name,a.chengji);
printf("%d\t%s\t%f\n",b.xuehao,b.name,b.chengji);
}
return 0;
}
注意:如果是把某一个字符串输入到某个数组里,是没有“&”符号的。
二、结构体数组
例如:
struct student
{
int xuehao;
char name[30];
float chengji;
}xuesheng[3]={{001,"HouBoShi",99},{002,"ShaPaoZi",20},{003,"ShaLeBaJi",90}};
上面我们定义的xuesheng[3]这个数组是结构体型。意思就是以下三个变量都是结构体型的:
- xuesheng[0].xuehao=001; xuesheng[0].name="HouBoShi"; xuesheng[0].chengji=99;
- xuesheng[1].xuehao=002; xuesheng[1].name="ShaPaoZi"; xuesheng[1].chengji=20;
- xuesheng[2].xuehao=003; xuesheng[2].name="ShaLeBaJi"; xuesheng[2].chengji=90;
明白这些以后,我们来看一到练习:
例:有三名学生的3项信息:学号、姓名和成绩。请编程按成绩由高到低输出各学生的信息。信息为:001,HouBouShi,99; 002,ShaPaoZi,20; 003,ShaLaBaJi,90。
这题我们可以用选择排序的方法来做。需要注意的是,必须定义一个临时的结构体变量。
#include<stdio.h>
struct student
{
int xuehao;
char name[30];
float chengji;
}xuesheng[3]={{001,"HouBoShi",99},{002,"ShaPaoZi",20},{003,"ShaLeBaJi",90}};
int main()
{
struct student linshi;
int i,j;
for(i=0;i<2;i++)
{
for(j=i+1;j<3;j++)
{
if(xuesheng[j].chengji>xuesheng[i].chengji)
{
linshi=xuesheng[i];
xuesheng[i]=xuesheng[j];
xuesheng[j]=linshi;
}
}
}
printf("排序后的各学生信息如下:\n");
for(i=0;i<3;i++)
{
printf("%d\t%s\t%f\n",xuesheng[i].xuehao,xuesheng[i].name,xuesheng[i].chengji);
}
return 0;
}
三、使用结构体变量做函数参数
例:键盘输入五名学生的信息(包括学号、姓名和2门课程的成绩),并输出平均分最高的学生的信息。
#include<stdio.h>
struct student
{
int xuehao;
char name[30];
float fen1;
float fen2;
}sheng[5];
int main()
{
//因为max()函数返回的结果是结构体信息,并且赋值给了一个结构体,所以它是结构体型。
struct student max(struct student a[]);
struct student xueba;//定义一个新的结构体变量 xueba
int i;
for(i=0;i<=4;i++)
{
printf("请输入第%d名学生的学号、姓名和2门成绩:\n",i+1);
scanf("%d,%s,%f,%f",&sheng[i].xuehao,sheng[i].name,&sheng[i].fen1,&sheng[i].fen2);
}
//只需在括号里输入结构体数组的名字,就能自动判断这个数组里所有变量的平均分,
//并且选出平均分最大的那个变量 。然后将这个变量的所有信息都赋值到xueba这个新的结构体变量。
xueba=max(sheng);
printf("平均分最高的学生的信息如下:\n");
printf("学号:%d\n姓名:%s\n2门成绩:%f,%f\n",xueba.xuehao,xueba.name,xueba.fen1,xueba.fen2);
return 0;
}
struct student max(struct student a[])
{
float pingjunfen[5];
int i,zuigao;
for(i=0;i<=4;i++)
{
pingjunfen[i]=(a[i].fen1+a[i].fen2)/2;
}
for(zuigao=0,i=1;i<=4;i++)
{
if(pingjunfen[zuigao]<pingjunfen[i])
{
zuigao=i;
}
}
return(a[zuigao]);
}
四、结构体变量与指针变量
例1:把一个学生的信息(包括学号、姓名、性别3项信息)放在一个结构体变量中,然后输出这个学生的信息。
#include<stdio.h>
struct student
{
int xuehao;
char name[30];
char xingbie;
}a={001,"Houge",'M'};
int main()
{
struct student *p;//定义一个结构体的指针
p=&a;//让指针与定义号的结构体变量相关联
printf("学号:%d\n姓名:%s\n性别:%c\n",(*p).xuehao,(*p).name,(*p).xingbie);
//还可以写成这个形式:printf("学号:%d\n姓名:%s\n性别:%c\n",p->xuehao,p->name,p->xingbie);
return 0;
}
例2:有三名学生的3项信息:学号、姓名和成绩。请编程按成绩由高到低输出各学生的信息。
#include<stdio.h>
struct student
{
int xuehao;
char name[30];
float chengji;
}xuesheng[3]={{001,"HouBoShi",99},{002,"ShaPaoZi",20},{003,"ShaLeBaJi",90}};
int main()
{
struct student linshi,*p;//定义结构体指针
p=&xuesheng[0];//让指针与结构体变量的第一个元素相关联
//所以 p+1=&xuesheng[1],p+2=&xuesheng[2],p+i=&xuesheng[i],p+j=&xuesheng[j]
int i,j;
for(i=0;i<2;i++)
{
for(j=i+1;j<3;j++)
{
if((*(p+j)).chengji>(*(p+i)).chengji)
{
linshi=*(p+i);
*(p+i)=*(p+j);
*(p+j)=linshi;
}
}
}
printf("排序后的各学生信息如下:\n");
for(i=0;i<3;i++)
{
printf("%d\t%s\t%f\n",(*(p+i)).xuehao,(*(p+i)).name,(*(p+i)).chengji);
}
return 0;
}