02 结构体

一、结构体

1、结构体的声明与定义
  • (1)先声明结构体变量,再定义该类型变量
struct Student{
    int num;
    char name[20];
};

struct Student SU;//定义结构体变量SU

*(2)声明类型的同时定义变量

struct Student{
    int num;
    char name[20];
}student1,student2;
2、结构体变量的初始化和引用

(1)在定义结构体变量时可以对它初始化

struct Student{
    int num;
    char name[20];
    char sex;
    char age;
    char addr[30];
}student1={10001,"Li Lin",'M',22,"Beijing Road"};

struct Student student2={.name="Zhang Fang"};//C99标准允许对某一成员初始化

(2)结构体成员的引用
结构体变量的地址主要作函数参数,传递结构体变量的地址。
student1.成员名表示访问结构体的成员。

//结构体变量访问成员
student1.count=100;
student1.name="ZhangSan";

//结构体指针访问成员
su->count=90;
su->name="LiSi";
3、结构体嵌套
//声明一个结构体类型struct Date
struct Date{
    int year;   //年
    int month;  //月
    int day;    //日
};

//声明一个结构体类型struct Student
struct Student{
    int num;
    char name[20];
    char sex;
    char age;
    struct Date Birthday;
    char addr[30];
};

结构体大小,需注意字节对齐:

4、结构体数组

结构体数组每个数组元素都是一个结构体类型的数据,它们分别包括各个成员项。
选举投票统计为例:

#include <stdio.h>
#include <string.h>

//声明一个struct Person结构体类型并定义一个结构体数组
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++;
            }
            else printf("%s 不是候选人 \n",leader_name);
        }
    }
    printf("result:\n");
    for(i=0;i<3;i++)
    {
        printf("%5s: %d\n",leader[i].name,leader[i].count++);
    }
}

5、结构体指针

一个结构体变量的起始地址就是这个结构体变量的指针。
指向结构体对象的指针变量既可指向结构体变量,也可指向结构体数组中的元素,指针变量的基类必须与结构体变量的类型相同。

(1)指向结构体变量的指针

struct Student *su;,定义结构体指针变量su,su可以指向struct Student类型的变量或数组元素。
su->成员名等价于(*su).成员名,括号不可省,运算符“.”优先于“*”。

#include <stdio.h>
#include <string.h>

//声明一个结构体类型struct Student
struct Student{
    long num;
    float score;
    char name[20];
    char sex;
};

struct Student SU;  //定义struct Student类型变量SU
struct Student *su; //定义struct Student类型指针变量su

int main()
{
    su=&SU; //结构体指针su指向结构体变量SU
    SU.num=10000;//对结构体成员变量赋值
    strcpy(SU.name,"Li Lin"); //用字符串复制函数给SU.name赋值
    SU.sex='M';
    SU.score=90.5;
    printf("No:%ld\nname:%s\nsex:%c\nscore:%5.2lf\n\n",SU.num,SU.name,SU.sex, SU.score);
    printf("No:%ld\nname:%s\nsex:%c\nscore:%5.2lf\n",(*su).num,(*su).name,(*su).sex,(*su).score);
   
    return 0;
}

(2)指向结构体数组的指针

  • 有三个学生信息,放在结构体数组中,输出全部学生信息:
    a.声明结构体类型struct Student,并定义结构体数组,同时初始化;
    b.定义一个指向struct Student类型数据的指针变量su;
    c.使su指向结构体数组的首元素,输出它指向的元素中的有关信息;
    d.使su指向结构体数组下一个元素,输出它指向的元素中的有关信息;
    e.再使su指向结构体数组下一个元素,输出它指向的元素中的有关信息;
#include <stdio.h>
#include <string.h>

//声明一个结构体类型struct Student  32字节
struct Student{
    int num;
    char name[20];
    char sex;
    int age;
};

struct Student STU[3]={{10001,"Li Lin",'M',18},{10002,"Zhang Shan",'M',20},{10003,"Wang Min",'F',21}};//定义结构体数组并初始化
struct Student *su; //定义struct Student类型指针变量su

int main()
{
    printf("No      Name          sex age\n");
    for (su=STU;su<STU+3;su++)//循环遍历结构体地址
    {
        printf("%5d  %-16s%-2c %-2d\n",su->num,su->name,su->sex,su->age);
    }
  return 0;
}

6、结构体变量和结构体变量的指针作函数参数

将一个结构体变量的值传递给另一个函数有3个方法:
a.用结构体变量的成员作参数;
b.用结构体变量作参数;
c.用指向结构体变量(或数组元素)的指针作实参。

有N个结构体变量,内含学生学号、姓名和3门课程成绩,要求输出成绩最高的学生的信息,包括学号、姓名、3门课程成绩和平均成绩。

思路:将N个学生的数据表示为结构体数组,封装三个函数。
input函数输入数据和求学生平均成绩;
max函数找平均成绩最高的学生;
print函数输出成绩最高学生的信息。
主函数中先后调用这三个函数,用指向结构体变量的指针作实参。

#include <stdio.h>

#define N  3   //学生数量

//声明一个结构体类型struct Student
struct Student{
    int num;    //学号
    double score[3]; //3门课平均成绩
    float aver; //平均成绩
    char name[20];  //姓名
};

//函数声明
void input(struct Student stu[]);
struct Student max(struct Student stu[]);
void print(struct Student stu);

int main()
{
    //定义结构体数组和指针
    struct Student stu[N];
    struct Student *su;
    su=stu;

    input(su);
    print(max(su));

    return 0;
}

void input(struct Student stu[])
{
    int i;
    printf("请输入各学生的的信息:学号 姓名 3门课程成绩\n");
    for(i=0;i<N;i++)
    {
        scanf("%d %s %lf %lf %lf",&stu[i].num,stu[i].name,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);//输入数据
        stu[i].aver=(stu[i].score[0]+stu[i].score[1]+stu[i].score[2])/3.0;  //求平均成绩
    }
}

struct Student max(struct Student stu[])
{
    int i,m=0;  //m存放成绩最高的学生在数组中的序号
    for(i=0;i<N;i++)
    {
        if(stu[i].aver>stu[m].aver) //找出平均成绩最高的学生在数组中的序号
        {
            m=i;
        }
    }
    return stu[m];
}

void print(struct Student stu)
{
    printf("\n成绩最高的学生是:\n");
    printf("学号:%d\n姓名:%s\n3门课成绩:%5.1f %5.1f %5.1f\n平均成绩:%6.2f\n",stu.num,stu.name,stu.score[0],stu.score[1],stu.score[2],stu.aver);
}

posted @ 2023-10-03 12:45  EternalH  阅读(116)  评论(0)    收藏  举报