Skip to content

Latest commit

 

History

History
389 lines (326 loc) · 7.84 KB

l_05.md

File metadata and controls

389 lines (326 loc) · 7.84 KB

Lesson 5

复合类型


在这一课中,将会接触到很多自定义类型的方式
首要关注的是,这些东西本质上都为“类型”。

1. 枚举

  • 定义

    enum Animal 
    { DOG, CAT, MOUSE, BIRD, FOX, TIGER };
    //定义了一种名为Animal的数据类型
    //这种数据类型包含以上几个数据

    如何理解?

    int a = 1;
    //定义了一个数据类型为int的变量a,a的值为1
    enum Animal b = DOG;
    //定义了一个数据类型为Animal的变量b,b的值为DOG

    注意点: 定义变量时一定要加上前缀enum 此外,还可以直接在定义数据类型时定义相关的变量,例如:

    enum Animal 
    { DOG, CAT, MOUSE, BIRD, FOX, TIGER } a, b;
    //定义了两个Animal为数据类型,分别以a和b为名字的变量
  • 无命名定义

    enum
    { DOG, CAT, MOUSE, BIRD, FOX, TIGER } rua;
    //定义了一个数据类型,rua为该数据类型的一个变量

    注意点: 无命名定义后便不能再在它处新建该数据类型的变量

  • 枚举 有啥用捏

    enum Animal 
    { DOG, CAT, MOUSE, BIRD = 9, FOX, TIGER } a, b, c;
    a = DOG;
    b = CAT;
    c = FOX;
    printf("%d ", a);//思考:为什么是%d?
    printf("%d ", b);
    printf("%d ", c);
    //输出 0 1 10 

    甚至可以

    enum Animal a[3] = { DOG, CAT, FOX };
    printf("%d", a[1]);
    //输出 1

2. 结构

  • 定义

    struct Animal
    {
      int id;
      int num;
      double len;
    };

    注意点与类型特性同enum新注意点: 不可以在定义struct类型时为其“赋值”

  • struct赋值

    struct Animal cat = {1, 12, 3.0};
    struct Animal dog = {.id = 2};
    b = a;
    printf("%d ", dog.id);
    printf("%d ", dog.num);
    printf("%lf ", dog.len);
    //输出 2 12 3.0
  • struct 中的 struct

    struct staff
    {
      int id;
      COORD coord;
    }A;
    A = {1, {1,2}};
    printf("%d",A.coord.x);
  • struct 中的 数组

    struct Animal rua[]=
    {
      {1, 99, 2.0},
      {2, 33, 3.0},
    };
  • 结构体指针

    struct Animal *p = cat;
    (*p).id = 1;
    p->id = 1;
  • 结构体函数

    • (1)在函数里塞结构体

      void rua(struct Animal *a)
      {
        printf("ID=%d\n", a->id);
      }
      //以及可以让一个函数返回一个结构体,在此不再赘述。
    • (2)在结构体里塞函数

      struct Animal
      {
          char *voice;
          void (*a)(struct Animal *p);
      } fox;
      
      void talk(struct Animal *p)
      {
          puts(p->voice);
      }
      
      int main()
      {
          fox.voice = "ywwuyi";
          fox.a = talk;
          fox.a(&fox);
          return 0;
      }
    • 结构体中const使用场景

      struct Student {
        char name;    // 姓名
        int age;      // 年龄
        int score;    // 分数
      };
      
      // 将函数中的形参改为指针,可以减少内存空间,不会复制新的副本
      void printStudents(const Student* s)  // 加入const后,一旦有修改就会报错,防止误操作
      {
        // s->age = 150;
        printf("姓名:%c,年龄:%d,分数:%d\n", s->name, s->age, s->score);
      }
      
      int main() {
        // 创建结构体变量
        Student s;
        s.name = 'a';
        s.age = 15;
        s.score = 70;
      
        // 通过函数打印结构体变量信息
        printStudents(&s);
      
        system("pause");
        return 0;
      }

3. 我们联合(共用体)

  • 定义
    union ch
    {
      int a;
      char b;
      double c;
      char d[10];
    };

4. 偷懒:typedef

  • 简单的例子:

    typedef long long unsigned int rua;
    
    typedef struct WelcomeToJapariPark{
      int cat;
      int human;
      int fox;
      int beaver;
      int hippo;
    } zoo;
    struct WelcomeToJapariPark a = {······}
    zoo a ={······};

关于define

  • 定义
    #define PI 3.1415926535
    #define KF "KemonoFriends"
    #define rua (a+b)
    int main()
    {
      int a = 2, b = 1;
      printf("%d\n", rua);
      printf("%s", KF+1);
      return 0;
    }
    /*输出 
    3
    
    */
    预处理(预编译)发生在正式编译之前 无安全检查,会有副作用

案例1

案例描述

一共3名导师,每名导师带领5名学生。导师具有姓名(字符串)属性,学生具有姓名(字符串)和分数(整型随机数,范围41-100)属性。分别输出每名导师及其所带的学生的信息。

样例输出

老师姓名: Teacher_A
	学生姓名: Student_A 考试分数: 81
	学生姓名: Student_B 考试分数: 65
	学生姓名: Student_C 考试分数: 74
	学生姓名: Student_D 考试分数: 73
	学生姓名: Student_E 考试分数: 57
老师姓名: Teacher_B
	学生姓名: Student_A 考试分数: 96
	学生姓名: Student_B 考试分数: 84
	学生姓名: Student_C 考试分数: 52
	学生姓名: Student_D 考试分数: 74
	学生姓名: Student_E 考试分数: 61
老师姓名: Teacher_C
	学生姓名: Student_A 考试分数: 85
	学生姓名: Student_B 考试分数: 85
	学生姓名: Student_C 考试分数: 47
	学生姓名: Student_D 考试分数: 95
	学生姓名: Student_E 考试分数: 77

代码实现

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

struct Student {
   char name[10];
   int score;
};

struct Teacher {
   char name[11];
   struct Student sArray[5];
};

void allocateSpace(struct Teacher tArray[], int len) {
   char nameSeed[] = "A\0B\0C\0D\0E\0";  // 姓名种子 用于追加
   // 导师初始化
   for (int i = 0; i < len; i++) {
      strcpy(tArray[i].name, "Teacher_");
      strcat(tArray[i].name, nameSeed + i * 2);
      // 学生数组初始化
      for (int j = 0; j < 5; j++) {
         strcpy(tArray[i].sArray[j].name, "Student_");
         strcat(tArray[i].sArray[j].name, nameSeed + j * 2);
         tArray[i].sArray[j].score = rand() % 60 + 41;  // 41-100
      }
   }
}

void printInfo(struct Teacher tArray[], int len) {
   for (int i = 0; i < len; i++) {
      printf("teacher's name: %s\n", tArray[i].name);
      for (int j = 0; j < 5; j++) {
         printf("\tstudent's name: %s", tArray[i].sArray[j].name);
         printf("\t score: %d\n", tArray[i].sArray[j].score);
      }
   }
}

int main() {
   // 随机数种子
   srand((unsigned int)time(NULL));

   // 初始化属性
   struct Teacher tArray[3];
   int len = sizeof(tArray) / sizeof(tArray[0]);
   allocateSpace(tArray, len);

   // 输出属性
   printInfo(tArray, len);

   return 0;
}

案例2

案例描述

一共5个人,按年龄升序排列后,分别输出他们的姓名(字符串),年龄(整型),性别(字符)

样例输出

姓名:小红 年龄:19 性别:
姓名:小明 年龄:20 性别:
姓名:小刚 年龄:21 性别:
姓名:小李 年龄:22 性别:
姓名:小王 年龄:23 性别:

代码实现

#include <stdio.h>

struct Person {
   char name[3];
   int age;
   char sex;
};

void bubbleSort(struct Person person[], int len) {
   for (int i = 0; i < len - 1; i++) {
      for (int j = 0; j < len - i - 1; j++) {
         if (person[j].age > person[j + 1].age) {
            struct Person personTmp = person[j];
            person[j] = person[j + 1];
            person[j + 1] = personTmp;
         }
      }
   }
}

void printInfo(struct Person person[], int len) {
   for (int i = 0; i < len; i++) {
      printf("name:%s\tage:%d\tsex:%c\n", person[i].name, person[i].age, person[i].sex);
   }
}

int main() {
   // 初始化
   struct Person person[5] = {
       {"xw", 23, 'b'},
       {"xh", 19, 'a'},
       {"xm", 20, 'b'},
       {"xl", 22, 'a'},
       {"xg", 21, 'b'}};

   // 排序
   int len = sizeof(person) / sizeof(person[0]);
   bubbleSort(person, len);

   // 输出
   printInfo(person, len);

   return 0;
}