9.1定义和使用结构体变量
9.1.1用户建立结构体类型
首先说一下什么是结构体类型,就是把咱们之前学过的,系统提供的变量,来一个复合打包。
比如
int a; char b; float c; double d; long long e;
现在我打包起来
struct student { int a; char b; float c; double d; long long e; }
为什么这样做呢,我们一般解决实际问题是,很多不同类型数据都存在相关练习。比如我描述一个人,可以从年龄,性别,学历,工作,四个角度去描述一个人,这四个不同变量类型。往往存在一定的联系。那我们把这些数据打包,组成一个组合数据,这样我们就能够用一个数据表示所有的情况,是不是很方便,精炼。
用户自己建立有不同类型数据组成的组合型数据结构,称之为结构体
一般形式:
struct 结构体名
{成员表列};
结构体名也叫“结构体标记”。成员列表也成为“域表“;
域表元素的命名规则: 类型名 成员名;
可以同时建立多个结构体,并且一个结构体可以是另外一个结构体的成员。
struct Date { int month; int day; int year; }; struct student { int num; char name[20]; char sex; int age; struct Date birthday; char addr[30]; }
9.1.2 定义结构体类型变量
这里我们学习如何在程序中使用结构体变量;总的包括,定义结构体变量,然后初始化,最后能存取数值。这里我先讲解如何定义;
1.先声明结构体类型,再定义该类型的变量
struct Date { int month; int day; int year; }; struct student { int num; char name[20]; char sex; int age; struct Date birthday; char addr[30]; }//先声明结构体类型 struct student student1,student 2;//然后定义该类型的变量。
定义了两个变量,定义的类型式没有储存空间的,只有定义变量才有储存空间。
现在变量student 1,student 2;的结构如下图。
2.在声明类型的同时定义变量
struct Date { int month; int day; int year; }; struct student { int num; char name[20]; char sex; int age; struct Date birthday; char addr[30]; } student 1,student 2;
一般形式:
struct 结构体名
{
成员列表
}变量名列表;
3.不指定类型名而直接定义结构体类型变量
一般形式:
struct
{
成员列表
}变量名列表;
这种方法的局限性在于,他只能定义变量名列表的变量,由于没有变量名,所以不能定义其他变量为此结构体了。
注意:
a.结构体类型和结构体变量完全是两个不同的概念;
b.结构体中的成员名比如num,和程序中的num完全是不同的概念。名字相同,但是表达的意义是不相同的。
c.结构体中的成是可以当作普通变量去使用的,可以运算,赋值等等,怎么引用,一般是结构变量名.成员名
9.1.3结构体变量的初始化和引用
看个例子;
/*把一个学生的信息(学号,姓名,性别,住址)放在一个结构体中,然后输出这个学生的信息*/ #include <stdio.h> int main() { struct student { long int num; char name [20]; char sex; char addr[20]; }a={10100,"wu mingda",'M',"XIN DE BAN DAO"}; printf("NO.:%1d\nname:%s\nsex:%c\naddr:%s\n",a.num,a.name,a.sex,a.addr); }
从上面的例子咱们可以看出,如何初始化一个结构体变量。
a={10100,"wu mingda",'M',"XIN DE BAN DAO"}; 如果想对某一起其中的元素单独初始化也可以(C99以上),如下: ={.num=1};//{a.name=1};也行 /*把一个学生的信息(学号,姓名,性别,住址)放在一个结构体中,然后输出这个学生的信息*/ #include <stdio.h> int main() { struct student { long int num; char name [20]; char sex; char addr[20]; }a={.num=1};//{a.name=1};也行 printf("NO.:%1d\nname:%s\nsex:%c\naddr:%s\n",a.num,a.name,a.sex,a.addr); } 其他元素没有被初始化的元素首先就是,数值型=0;字符型=\0;指针型:NULL;
如何引用结构体变量名字
结构体变量名.成员名
. 是成员运算符,优先级最高。
赋值:a.num=10010;同类型结构体变量的可以相互赋值; 可以进行各种运算; 可以引用结构体变量的地址:&student1; 也可以引用结构体变量成员名的地址:&student1.num; 如果成员本身就是一个结构体,如何引用呢; student1.num; student1.birthday.month; 注意结构体变量只能一个一个输出: printf("NO.:%1d\nname:%s\nsex:%c\naddr:%s\n",a.num,a.name,a.sex,a.addr); 不能一次性输出,一次性读入: printf("%s\n",student1); scanf("%d,%s,%c,%s",%student1);
在看一个例题
输入两个学生的相关信息,输出成绩较高的那个人相关信息 #include <stdio.h> 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\n",student1.num,student1.name,student1.score); else if(student1.score<student2.score) printf("%d %s %6.2f\n",student2.num,student2.name,student2.score); else { printf("%d %s %6.2f\n",student1.num,student1.name,student1.score); printf("%d %s %6.2f\n",student2.num,student2.name,student2.score); } return 0; }
9.2使用结构体数组
9.2.1定义结构体数组
/*有三个候选人,每个选民只能投票一人,要求编一个统计票数的程序,先后输入被选人的名字 ,最后输出各人的的票结果*/ #include <stdio.h> #include <string.h> struct person { char name[20]; int count; }leader[3]={"Li",0,"zhang",0,"sun",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(字符串1,字符串2); 意思就是让两个字符串进行比较 ;如果两个比较等价;那么输出得结果就是0; 小于;那么输出的结果就是一个负整数; 大于;;;;;输出的结果就是一个正整数; 那么你坑定会问 ;怎么进行比较的呢; 首先自左向右进行比较;通过ascall 1)完全相同; 说明字符串完全相等; 2)有不同 以第一对为准; 3)如果两个字符串都是英语都是英文;大写小于小写;在英文字典在后面得位置为大;*/ } printf("\nResult:\n"); for(i=0;i<3;i++) printf("%5s:%d\n",leader[i].name,leader[i].count); return 0; }
定义结构体数组的一般形式:
struct 结构体名
{
成员表列
} 数组名[数组长度];
或者
先声明定义一个结构体类型 ;
结构体类型 数组名[数组长度];
例如
struct person { char name[20]; int count; }leader[3]={"Li",0,"zhang",0,"sun",0};初始化1 或者: struct person { char name[20]; int count; }; struct person leader[3]={"Li",0,"zhang",0,"sun",0};初始化2 初始化就是在定义的变量后面直接加上初始化表列;
9.2.2 结构体数组的应用举例
/*有n个学生的信息(包括学号,姓名,成绩),要求按照成绩的高低 顺序输出各个学生的信息*/ #include <stdio.h> struct student { int num; char name[20]; float score; } ;// int main() { struct student stu[5]={ {10101,"zhang",78 },{10103,"wang",98.5},{10106,"Li",86},{10108,"ling",73.5},{10110,"sun",100}};// struct student temp; const int n=5; int i,j,k; printf("the order is:\n"); for(i=0;i<n-1;i++) { k=i; for(j=i+1;j<n;j++) if(stu[j].score>stu[k].score) k=j; temp=stu[k];stu[k]=stu[i];stu[i]=temp; } for(i=0;i<n;i++) printf("%6d %8s %6.2f\n",stu[i].num,stu[i].name,stu[i].score); printf("\n"); return 0; }