| number | name | sex | age | score | addr |
|---|---|---|---|---|---|
| 10010 | luxinan | M | 19 | 87.5 | Beijing |
struct Student{
int number; //学号为整型
char name[20]; //姓名为字符串
char sex; //性别为字符型
int age; //年龄为整型
float score; //成绩为实型
char addr[30]; //地址为字符串
}
上面程序指定了一个结构体类型struct Student(struct是声明结构体类型时必须使用的关键字,不能省略),声明一个结构体类型的一般形式为:
struct 结构体
{成员表列};
花括号内是该结构体所包括的子项,称为结构体的成员,上述的number,name,sex等都是成员。对各成员都应进行类型声明,即
类型名 成员名;
成员可以属于另一个结构体类型,例如:
struct Date{ //声明一个结构体类型struct Date
int month; //月
int day; //日
int year //年
}
struct Student{
int num;
char name[20];
char sex;
int age;
struct Date birthday; //成员birthday属于struct Date类型
char addr[30];
}
2、定义结构体类型变量
(1)先声明结构体类型,再定义该类型变量
struct Student student1,student2; 结构体类型名 两个结构体变量名
这种形式和定义其他类型的变量形式(如, int a,b;)是相似的。上面定义了student1和student2为struct Student类型的变量,这样student1 和 student2 就具有struct Student类型的结构。
(2)在声明类型的同时定义变量 例如:struct Student
{
int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
} student1,student2;
它的作用与第一种方法相同,但是定义struct Student 类型的同时定义两个struct Student 类型的变量student1 和 student2,这种定义方法的一般形式为
struct 结构体名
{
成员表列
}变量名表列;
(3)不指定类型名而直接定义结构体类型变量
其一般形式为
struct
{
成员表列
}变量表列;
3、结构体变量的初始化和引用
在定义结构体变量时,可以对它初始化,即赋予初始值。然后可以引用这个变量,例如输出它的成员的值。
例题1:把一个学生的信息(包括学号、姓名、性别、住址)放在一个结构体变量中,然后输出这个学生的信息。#include(1)C99标准允许对某一成员初始化,如:int main(){ struct Student{ long int num; char name[20]; char sex; char addr[20]; } a={10101,"Lu",'M',"Beijing"}; printf("NO.:%1dnname:%snsex:%cnaddr:%sn",a.num,a.name,a.sex,a.addr); return 0; } 运行结果: NO.:10101 name:Lu sex:M addr:Beijing
struct Student b={.name="Zhang san"};
".name"隐含代表结构体变量b的成员b.name。其他未被指定初始化的数值型成员被系统初始化为0,字符型成员被系统初始化为’ ’,指针型成员被系统初始化为NULL。
(2)可以引用结构体变量中的成员的值,引用方式为结构体变量名.成员名 在程序中可以对变量的成员赋值,例如: student1.num=10010;(3)如果成员本身又属一个结构体类型,则要用若干个成员运算符,一级一级地找到低的一级的成员。只能对最低级的成员进行赋值或存取以及运算。如果在结构体struct Student类型的成员中包含另一个结构体struct date类型的成员birthday,则引用成员的方法为
student1.num //结构体变量student1中的成员num student1.birthday.mounth //结构体变量student1中的成员birthday中的成员month
不能用student1.birthday来访问student1变量中的成员birthday,因为birthday本身是一个结构体成员。
(4)对结构体变量的成员可以像普通变量一样进行各种运算(根据其类型决定可以进行的运算)。例如student2.score=student1.score; //赋值运算 sum=student1.score+student2.score; //加法运算 student1.age++; //自加运算(5)同类的结构体变量可以互相赋值,如:
student1=student2;(6)可以引用结构体变量成员的地址,也可以引用结构体变量的地址。例如:
scanf("%d",&student1.score); //输入student1.score的值
printf("%o",&student1); //输出结构体变量student1的起始地址
例题2:输入两个学生的学号、姓名和成绩,输出成绩较高的学生的学号、姓名和成绩。
#include二、使用结构体数组 例题3:有三个候选人,每个选民只能投票选一人,要求编一个统计选票的程序,先后输入候选人的名字,最后输出各人得票结果。int main(){ struct Student{ int num; char name[20]; float score; }student1,student2; scanf("%d%s%f",&student1.num,&student1.name,&student1.score); scanf("%d%s%f",&student2.num,&student2.name,&student2.score); printf("The higher score is:n"); if(student1.score>student2.score){ printf("%d %s %6.2f",student1.num,student1.name,student1.score); } else if(student2.score>student1.score){ printf("%d %s %6.2f",student2.num,student2.name,student2.score); } else{ printf("%d %s %6.2f",student1.num,student1.name,student1.score); printf("%d %s %6.2f",student2.num,student2.name,student2.score); } return 0; } 运行结果: 输入: 01 zhangsan 89.1 02 lisi 90 输出: 2 lisi 90.00
#include(1)定义结构体数组的一般形式:#include struct Person{ char name[20]; int count; }leader[3]={"zhangsan",0,"lisi",0,"wangwu",0}; int main(){ int i,j; char leader_name[20]; for(i=1;i<=10;i++){ scanf("%s",leader_name); for(j=0;j<3;j++){ if(strcmp(leader_name,leader[j].name)==0) leader[j].count++; //strcmp在c语言中的意思是string compare的缩写,用于比较两个字符串并根据比较结果返回整数,基本形式为strcmp(str1,str2),若【str1=str2】,则返回零,若【str1 } } printf("nResult:n"); for(i=0;i<3;i++){ printf("%5s:%dn",leader[i].name,leader[i].count); } return 0; } 运行结果: 输入: zhangsan lisi wangwu wangwu zhangsan lisi lisi lisi zhangsan zhangsan 输出: Result: zhangsan:4 lisi:4 wangwu:2
1.struct 结构体名
{成员表列} 数组名[数组长度];
2.先声明一个结构体类型(如 struct Person),然后再用此类型定义结构体数组:
结构体类型 数组名[数组长度];
如:
struct Person leader[3];
(2)对结构体数组初始化的形式是在定义数组的后面加上:
={初值表列};
struct Person leader[3]={"zhangsan",0,"lisi",0,"wangwu",0};
例题4:有n个学生的信息(包括学号、姓名、成绩),要求按照成绩的高低顺序输出各学生的信息
#includestruct Student{ int num; char name[20]; float score; }; int main(){ struct Student stu[5]={{1001,"zhangsan",87.5},{1002,"lisi",97.3},{1003,"wangwu",78.4},{1004,"zhaoliu",98.3},{1005,"liuqi",69.5}}; struct Student temp; const int n=5; int i,j,k; printf("The order is:n"); for(i=0;i stu[k].score) k=j; } temp=stu[k];stu[k]=stu[i];stu[i]=temp; } for(i=0;i



