1.定义和使用结构体变量
1.1 建立结构体类型
声明一个结构体类型的一般形式为:
struct 结构体名
{
成员列表
}
花括号内是该结构体所包括的子项,成为结构体的成员,下例中的num、name、score等都是成员。对各成员都应进行声明,即
类型名 成员名;
1.2 定义结构体类型变量
建立了结构体类型以后,它只相当于一个模型,并没有定义变量,其中并无具体的数据,系统对之也不分配存储单元。为了能在程序中使用结构体类型的数据,应当定义结构体类型的变量,并在其中存放具体的数据。共有三种方法:
- 先声明结构体类型,再定义该类型的变量
struct Student student1, student2
- 在声明类型的同时定义变量
声明类型个定义变量放在一起进行,能够直接看到结构体中的结构,在写小程序时用此方式比较方便。
struct Student
{
int num;
char name[20];
int score;
}student1,student2;
- 不指定类型名而直接定义结构体类型变量
指定一个无名结构体类型,它没有名字,显然不能再以此结构体类型去定义其他变量。
struct
{
int num;
char name[20];
int score;
}student1,student2;
1.3 结构体变量的初始化和引用
在定义结构体变量时可以对它的成员初始化。初始化列表是用花括号括起来的一些常量,这些常量依次赋给结构体变量中的成员。注意:是对结构体变量初始化,而不是对结构体类型初始化。
struct Student
{
int num;
char name[20];
char sex;
float score;
}a={10532,"pual",'M',100};
此外,也可以引用结构体变量中成员的值,引用方式为:
结构体变量名 . 成员名
注意:不能企图输出结构体变量名达到输出结构体变量所有成员的值。只能对结构体变量中的各个成员分别进行输入输出。
printf("%s\n",student1); //错误
如果成员本身又属于一个结构体类型,则要用若干成员运算符,一级一级地找到最低一级的成员。只能对最低级的成员进行赋值或存取以及运算。
1.4 结构体应用举例
输入两个学生的学号、姓名和成绩,输出成绩较高的学生的学号、姓名和成绩。
#include<stdio.h>
struct Date //时间,练习用
{
int year;
int month;
int day;
};
struct Student
{
int num;
char name[20];
float score;
struct Date in;
};
int main()
{
struct Student student1;
struct Student student2;
student1.in.year=student2.in.year=2019;
student1.in.month=student2.in.month=3;
student1.in.day=student2.in.day=10;
//在student1.name前面没有&号,因为name是数组名,本身就代表地址,不能画蛇添足再加一个&
printf("请输入学生1信息:");
scanf("%d%s%f",&student1.num,student1.name,&student1.score);
printf("请输入学生2信息:");
scanf("%d%s%f",&student2.num,student2.name,&student2.score);
if(student1.score > student2.score)
printf("num:%d name:%s score:%.1f\n",student1.num,student1.name,student1.score);
else if(student1.score < student2.score)
printf("num:%d name:%s score:%.1f\n",student2.num,student2.name,student2.score);
else
{
printf("num:%d name:%s score:%.1f\n",student1.num,student1.name,student1.score);
printf("num:%d name:%s score:%.1f\n",student2.num,student2.name,student2.score);
}
printf("入学时间:\n");
printf("student1:\n year:%d,month:%d,day:%d \n",student1.in.year,student1.in.month,student1.in.day);
printf("student2:\n year:%d,month:%d,day:%d \n",student2.in.year,student2.in.month,student2.in.day);
return 0;
}
2.使用结构体数组
2.1 定义结构体数组
- 定义结构体数组的一般形式是两种形式:
struct 结构体名
{
成员列表
} 数组名[数组长度]
struct Person
{
char name[20];
int count
}leader[3];
也可以先声明一个结构体类型(如struct Person),然后再用此类型定义结构体数组
结构体类型 数组名[数组长度]
struct Person leader[3];
- 对结构体数组初始化的形式是在定义数组的后面加上:
= { 初值列表 }
struct Person leader[3]={"Li",3,"zhang",4,"Bi",100};
2.2 结构体数组应用举例
- 有n个学生信息(包括学号、姓名、成绩),要求按照成绩的高低顺序输出各学生的信息。
#include<stdio.h>
struct Info
{
int num;
char name[20];
int score;
};
int main()
{
struct Info stu[5]={{1,"li",78},{2,"bi",100},{3,"sun",44},{4,"qi",90},{5,"zhou",88}};
struct Info temp;
const int n=5;
int i,j,k;
int flag=0;
for(i=0;i<n-1;i++)
{
flag=0; //表示本趟冒泡是否发生了交换
for(j=i;j<n;j++) //一趟冒泡过程
{
if(stu[j].score < stu[j+1].score) //若为逆序
{
temp=stu[j];
stu[j]=stu[j+1];
stu[j+1]=temp;
flag=1;
}
}
if(flag==0) //本趟遍历未发生交换
break;
}
for(k=0;k<n;k++)
printf("%d %s %d \n",stu[k].num,stu[k].name,stu[k].score);
return 0;
}
- 从键盘输入一组学生信息(学号、姓名、高考英语成绩、高考数学成绩、高考语文成绩),计算每个学生3门课程的平均成绩,并按照平均成绩由高到低排序。(输入以三门课的成绩都为0结束)
#include<stdio.h>
#define n 100
struct Info
{
int num;
char name[20];
int english;
int math;
int chinese;
int average;
};
int main()
{
struct Info stu[n];
struct Info temp;
int i,j;
int count=0;
int flag=0;
for(i=0;i<n;i++)
{
scanf("%d%s%d%d%d",&stu[i].num,stu[i].name,&stu[i].chinese,&stu[i].math,&stu[i].english);
if(stu[i].chinese==0&&stu[i].math==0&&stu[i].english==0)
break;
else
count+=1;
}
for(i=0;i<count;i++)
stu[i].average=(stu[i].chinese+stu[i].math+stu[i].english)/3;
for(i=0;i<count-1;i++)
{
flag=0;
for(j=i;j<count;j++)
{
if(stu[j].average<stu[j+1].average)
{
temp=stu[j];
stu[j]=stu[j+1];
stu[j+1]=temp;
flag=1;
}
}
if(flag==0)
break;
}
for(i=0;i<count;i++)
printf("%d %s\n",stu[i].num,stu[i].name);
return 0;
}