-
定义
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
-
定义
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; }
-
- 定义
union ch { int a; char b; double c; char d[10]; };
-
简单的例子:
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 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 */
案例描述
一共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;
}
案例描述
一共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;
}