实际运用情况:有许多信息是由多个不同类型的数据组合在一起的,这些不同类型的数据是相互联系组成一个有机的整体,我们引出了一种新的构造类型数据——结构体;
结构体的作用:结构体和数组一样,也是一种构造型数据类型;是用户自己定义的新数据类型。
在结构体中可以包含若干个不同数据类型和不同意义的数据项,从而使这些数据组合起来反应某一信息。(在某些层面上和JAVA中的类有几分相像)结构体是一种自定义的数据类型,是创建变量的模板,不占用内存空间;结构体变量才包含了实实在在的数据,需要内存空间来存储
情形一:
struct 结构体名
{
变量类型 成员变量名;
变量类型 成员变量名;
—— —— ——
}变量名
情形二: (结构体名为空)
struct
{
变量类型 成员变量名;
变量类型 成员变量名;
—— —— ——
}变量名
省略结构体名,称为无名结构体,这种情况一般出现在函数内部;
情形一二区别是情形二结构体名为空,后面就没法用该结构体定义新的变量;
#include <stdio.h>
#include <stdlib.h>
#define N 20
int main(int argc, char *argv[]) {
//声明结构体
struct a
{
int age;
char name[N];
}e1,e2;
struct a e3;
printf("请输入学员1年龄:");
scanf("%d",&e1.age);
printf("请输入学员1姓名:");
scanf("%s",&e1.name);
printf("请输入学员2年龄:");
scanf("%d",&e2.age);
printf("请输入学员2姓名:");
scanf("%s",&e2.name);
printf("请输入学员3年龄:");
scanf("%d",&e3.age);
return 0;
}
情形三:
struct 结构体名
{
变量类型 成员变量名;
变量类型 成员变量名;
—— —— ——
}
main函数中: struct 结构体名 声明变量名;
#include <stdio.h>
#include <stdlib.h>
#define N 20
struct a
{
int age;
char name[N];
};
int main(int argc, char *argv[]) {
struct a e1, e2;
printf("请输入学员1年龄:");
scanf("%d",&e1.age);
printf("请输入学员1姓名:");
scanf("%s",&e1.name);
printf("请输入学员2年龄:");
scanf("%d",&e2.age);
printf("请输入学员2姓名:");
scanf("%s",&e2.name);
return 0;
}
情形四:结构体的套接;
无论结构体嵌套了多少个结构体,都是从最外层依次通过 “.” 来调用最内层的结构体。
成员本身又属于一个结构体类型,则要用若干个成员运算符一级一级的找到最低一级,只能对最低一级成员进行赋值或存取以及运算。
嵌套最内层的结构体声明变量需要在其母结构体中声明
#include <stdio.h>
#include <stdlib.h>
#define N 20
//声明结构体
struct a
{
int age;
char name[N];
struct b
{
char h_1[N];
}q;
struct b q_1;
};
int main(int argc, char *argv[]) {
struct a e1, e2;
printf("请输入学员1所在的班级:");
scanf("%s",e1.q.h_1);
printf("请输入学员1所在的小组:");
scanf("%s",e1.q_1.h_1);
printf("请输入学员1年龄:");
scanf("%d",&e1.age);
printf("请输入学员1姓名:");
scanf("%s",&e1.name);
printf("请输入学员2所在的班级:");
scanf("%s",e2.q.h_1);
printf("请输入学员2所在的小组:");
scanf("%s",e2.q_1.h_1);
printf("请输入学员2年龄:");
scanf("%d",&e2.age);
printf("请输入学员2姓名:");
scanf("%s",&e2.name);
return 0;
}
情形五:结构体数组结合结构体嵌套;
数组,顾名思义就是存储多个相同数据类型的变量,结构体中的数组一般运用也是存储多个变量名,方便多组数据对结构体的套用;
详解见代码:
#include <stdio.h>
#include <stdlib.h>
#define N 20
//结构体数组问题
//实现求两个小组的平均成绩,以及及格人数;
struct a
{
int age;
char name[N];
struct b
{
int h_1[3];
}q[2];
};
int main(int argc, char *argv[]) {
struct a e1;
printf("请输入学员1年龄:");
scanf("%d",&e1.age);
printf("请输入学员1姓名:");
scanf("%s",&e1.name);
printf("请输入学员1班级两个组的成绩:\n");
int i,j;
for(i=0;i<2;i++){
printf("第%d组:",i+1);
for(j=0;j<3;j++){
scanf("%d",&e1.q[i].h_1[j]);
}
}
int m,n,s;
float avg[2]={0,0};
int sum[2]={0,0};
for(m=0;m<2;m++){
for(n=0;n<3;n++){
avg[m]+=e1.q[m].h_1[n];
if(e1.q[m].h_1[n]>=60){
sum[m]++;
}
}
avg[m]/=3;
printf("第%d组的平均成绩: %.2lf",m+1,avg[m]);
printf(" 及格人数:%d \n",sum[m]);
}
return 0;
}
情形六:结构体指针
个人理解:当定义一个较大的结构体数组时,用结构体指针对变量名操作较方便,基本用法与我们平时用的指针相同。
指针类型:struct 结构体名 *p;
然后通过指针调用结构体中某一量;
代码如下:
#include <stdio.h>
#include <stdlib.h>
#define N 20
struct a{
char *name;
int age;
char *group;
float score;
}q[] = {
{"刘虎",20,"三组",90},
{"李洋", 18, "五组", 85.5},
};
void avg(struct a *p, int l);
int main(int argc, char *argv[]){
int l = sizeof(q) / sizeof(struct a);
avg(q, l);
return 0;
}
void avg(struct a *p, int l){
int i, num = 0;
float sum = 0;
for(i=0; i<l; i++){
sum+=(p+i)->score;
if((p+i)->score>=90){
num++;
printf("优秀学生:%s\n",(*(p+i)).name);
}
}
sum/=2;
printf("两人的平均成绩:%.2lf\n",sum);
printf("优秀人数:%d",num);
}