一.什么是结构体
在c语言中,可以用结构体来存放一组不同类型的数据。结构体是一种集合,它里面包含了多个变量或数组,它们的类型可以相同,也可以不同,每个这样的变量或数组都 称为结构体的成员。
结构体和数组类似,也是一组数据的集合,整体使用没有太大的意义,数组使用下标[]来获取单个元素,而结构体使用点号.来获取单个成员。
例如:
#include<stdio.h>
int main()
{
struct{
char *name;//姓名
int num;//学号
int age;//年龄
char group;//所在小组
float score;//成绩
}stul;
//给结构体成员赋值
stul.name="Tom";
stul.num=12;
stul.age=18;
stul.group='A';
stul.score=136.5;
//读取结构体成员的值
printf("%s的学号是%d,年龄是%d,在%c组,今年的成绩是%.f!\n",stul.name,stul.num,stul.age,stul.group,stul.score);
return 0;
}
运行结果是:
除了可以对成员进行逐一赋值,也可以定义时整体赋值:
#include<stdio.h>
int main()
{
struct stu{
char *name;//姓名
int num;//学号
int age;//年龄
char group;//所在小组
float score;//成绩
}stu1={"Tom",12,18,'A',136.5};
//读取结构体成员的值
printf("%s的学号是%d,年龄是%d,在%c组,今年的成绩是%.f!\n",stu1.name,stu1.num,stu1.age,stu1.group,stu1.score);
return 0;
}
运行结果如下:
如图,运行结果是一样的。
二.结构体数组
结构体数组是指数组中的每个元素都是一个结构体。
在C语言中,定义结构体数组和定义结构体变量的方法类似,结构体数组在定义时也可以初始化,当对数组中全部元素赋值时,也可以不给出数组长度;
结构体数组的使用也很简单,例如,获取 Wang ming 的成绩:
class[4].score;
修改 Li ping 的学习小组:
class[0].group = 'B';
例如:
计算全班学生的总成绩、平均成绩、140分以下的人数:
#include<stdio.h>
struct{
char *name;//姓名
int num;//学号
int age;//年龄
char group;//所在小组
float score;//成绩
}class[]={
{"Li ping",5,18,'C',145.0},
{"Zhang ping",4,19,'A',130.5},
{"He fang",1,18,'A',148.5},
{"Cheng ling",2,17,'F',139.0},
{"Wang ming",3,17,'B',144.5}
};
int main()
{
int i,num_140=0;
float sum=0;
for(i=0;i<5;i++)
{
sum +=class[i].score;
if(class[i].score<140)
num_140++;
}
printf("sum=%.2f\naverage=%.2f\nnum_140=%d\n", sum, sum/5, num_140);
return 0;
}
运行结果如下:
三.枚举
枚举(Enum)类型能够列出所有可能的取值,并给它们取一个名字。
Enum是一个新的关键字,专门用来定义枚举类型;
枚举类型的定义形式为:
enum typeName{ valueName1, valueName2, valueName3, ...... };
例如,列出一个星期有几天:
enum week{ Mon, Tues, Wed, Thurs, Fri, Sat, Sun };
枚举值默认从 0 开始,往后逐个加1递增,可以只给第一个值赋值,同时也可以在定义枚举类型的时候定义变量:
enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun };
enum week a = Mon, b = Wed, c = Sat;
或:
enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } a = Mon, b = Wed, c = Sat;
enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } a = Mon, b = Wed, c = Sat;
例如:
判断用户输入的是星期几:
#include <stdio.h>
int main(){
enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } day;
scanf("%d", &day);
switch(day){
case Mon: puts("Monday"); break;
case Tues: puts("Tuesday"); break;
case Wed: puts("Wednesday"); break;
case Thurs: puts("Thursday"); break;
case Fri: puts("Friday"); break;
case Sat: puts("Saturday"); break;
case Sun: puts("Sunday"); break;
default: puts("Error!");
}
return 0;
}
例如输入五,结果如下:
注意:
(1) 枚举列表中的 Mon、Tues、Wed 这些标识符的作用范围是全局的(严格来说是 main() 函数内部),不能再定义与它们名字相同的变量。
(2) Mon、Tues、Wed 等都是常量,不能对它们赋值,只能将它们的值赋给其他的变量。