《小猫猫大课堂》三轮4——自定义类型(位段,枚举,联合)(内含通讯录)
- 游戏开发
- 2025-08-20 08:03:01

宝子,你不点个赞吗?不评个论吗?不收个藏吗?
最后的最后,关注我,关注我,关注我,你会看到更多有趣的博客哦!!!
喵喵喵,你对我真的很重要。
目录
前言
位段
枚举
联合(共用体)
通讯录
0.源码(解说见后)
1.创建文件
2.打印菜单,明确功能
3.创建通讯录
4.初始化通讯录和添加联系人
5.展示通讯录
6.删除指定联系人
7.查找指定联系人
8.修改指定联系人
9.联系人排序
10.删除所有联系人
总结
前言
闹腾太久了,累了,小喵想静静,想抱抱自己。
位段
位段的声明和结构(结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。)是类似的,有两个不同:
1.位段的成员必须是 int、char,unsigned int 或signed int 。(同类型)
2.位段的成员名后边有一个冒号和一个数字。
位段的位是二进制位 struct A { int _a:2;//两个比特位 int _b:5; int _c:10;//10个比特位 int _d:30;//单个成员不能超过32,因为一个整形32个比特位 }; int main() { printf("%d\n", sizeof(struct A));//结果是8 return 0; }和结构体一样,该怎么用,一样用,只是位段更节省空间
位段的内存分配:
1. 位段的成员可以是 int unsigned int signed int 或者是 char (属于整形家族)类型
2. 位段的空间上是按照需要以4个字节( int )或者1个字节( char )的方式来开辟的。
3. 位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段。
位段的跨平台问题:(不同平台,写不同代码,这也是结构体的又是,它可以跨平台)
1. int 位段被当成有符号数还是无符号数是不确定的。
2. 位段中最大位的数目不能确定。(16位机器最大16,32位机器最大32,写成27,在16位机 器会出问题。
3. 位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义。
4. 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是 舍弃剩余的位还是利用,这是不确定的。
枚举
枚举顾名思义就是一一列举。 把可能的取值一一列举
enum Day//星期 { Mon, Tues, Wed, Thur, Fri, Sat, Sun }; enum Sex//性别 { MALE, FEMALE, SECRET }; enum Color//颜色 { RED, GREEN, BLUE };以上定义的 enum Day , enum Sex , enum Color 都是枚举类型。 {}中的内容是枚举类型的可能取值,也叫 枚举常量。
这些可能取值都是有值的,默认从0开始,一次递增1,当然在定义的时候也可以赋初值。
enum Color//颜色 { RED, //0 GREEN, //1 BLUE //2 }; enum Color//颜色 { RED=1, GREEN=2, BLUE=4 };枚举的优点:
1. 增加代码的可读性和可维护性
2. 和#define定义的标识符比较枚举有类型检查,更加严谨。
3. 防止了命名污染(封装)
4. 便于调试
5. 使用方便,一次可以定义多个常量
现实生活中,我们能用枚举就用枚举。
enum Color//颜色 { RED=1, GREEN=2, BLUE=4 }; enum Color clr = GREEN;//只能拿枚举常量给枚举变量赋值,才不会出现类型的差异。 clr = 5; //ok??联合(共用体)
联合也是一种特殊的自定义类型 这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体)。(成员不能同时一起用空间)
联合的特点:
联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联 合至少得有能力保存最大的那个成员)
联合大小的计算:
联合的大小至少是最大成员的大小。当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。通讯录 0.源码(解说见后) //Contact.h #pragma once #define MAX 1000 #define NAME_MAX 20 #define SEX_MAX 5 #define ADDR_MAX 30 #define TELE_MAX 12 #include<stdio.h> #include<string.h> #include<assert.h> #include<stdlib.h> //人的信息 typedef struct PeoInfo { char name[NAME_MAX]; int age; char sex[SEX_MAX]; char addr[ADDR_MAX]; char tele[TELE_MAX]; }PeoInfo; struct contact { struct PeoInfo data[NAME_MAX]; int sz;//记录当前已经有的元素个数 }; typedef struct Contact { PeoInfo data[1000];//存放人的信息 int sz;//当前已存放信息的个数 }Contact; //初始化通讯录 void InitContact(Contact* pc); //增加联系人 void AddContact(Contact*pc); //删除指定联系人 void DelContact(Contact* pc); //显示通讯录 void ShowContact(const Contact* pc); //查找指定联系人 void SearchContact(Contact* pc); //修改指定联系人 void ModifyContact(Contact* pc); //联系人排序 void SortContact(Contact* pc); //删除所有联系人 void DeaContact(Contact* pc); //Contact.c #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<string.h> #include"contact.h" void InitContact(Contact* pc) { assert(pc); pc->sz = 0; memset(pc->data, 0, sizeof(pc->data)); } void AddContact(Contact* pc) { assert(pc); if (pc->sz == 1000) { printf("通讯录已满,无法添加\n"); return; } //增加一个人的信息 printf("请输入名字:>"); scanf("%s", pc->data[pc->sz].name); printf("请输入年龄:>"); scanf("%d", &(pc->data[pc->sz].age)); printf("请输入性别:>"); scanf("%s", pc->data[pc->sz].sex); printf("请输入地址:>"); scanf("%s", pc->data[pc->sz].addr); printf("请输入电话:>"); scanf("%s", pc->data[pc->sz].tele); pc->sz++; } void ShowContact(const Contact* pc) { assert(pc); int i = 0; printf("%-20s\t%-4s\t%-5s\t%-20s\t%-15s\n", "名字", "年龄", "性别", "地址", "电话"); for (i = 0; i < pc->sz; i++) { printf("%-20s\t%-4d\t%-5s\t%-20s\t%-15s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].addr, pc->data[i].tele); } } int FindByName(const Contact* pc, char name[]) { assert(pc); int i = 0; for (i = 0; i < pc->sz; i++) { if (strcmp(pc->data[i].name, name) == 0) { return i; } } return -1; } void DelContact(Contact* pc) { assert(pc); char name[NAME_MAX] = { 0 }; if (pc->sz == 0) { printf("通讯录为空,无法删除"); return; } //删除 //找出要删除的人 printf("请输入要删除的人的名字;>"); scanf("%s", name); int ret=FindByName(pc, name); if (-1 == ret) { printf("要删除的人不存在\n"); return; } int i = 0; int del = 0; for (i = 0; i < pc->sz; i++) { if (strcmp(pc->data[i].name, name) == 0) { del = i; break; } } //删除 for (i = del; i < pc->sz; i++) { pc->data[i] = pc->data[i + 1]; } pc->sz--; printf("删除成功\n"); } void SearchContact(const Contact* pc) { assert(pc); char name[NAME_MAX] = { 0 }; printf("请输入要查找人的名字:>"); scanf("%s", name); int pos = FindByName(pc, name); if (-1 == pos) { printf("要查找的人不存在\n"); return; } //打印信息 printf("%-20s\t%-4s\t%-5s\t%-20s\t%-15s\n", "名字", "年龄", "性别", "地址", "电话"); printf("%-20s\t%-4d\t%-5s\t%-20s\t%-15s\n", pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex, pc->data[pos].addr, pc->data[pos].tele); } void ModifyContact(Contact* pc) { assert(pc); char name[NAME_MAX] = { 0 }; printf("请输入要删除的人的名字;>"); scanf("%s", name); int pos = FindByName(pc, name); if (-1 == pos) { printf("要删除的人不存在\n"); return; } printf("请输入名字:>"); scanf("%s", pc->data[pos].name); printf("请输入年龄:>"); scanf("%d", &(pc->data[pos].age)); printf("请输入性别:>"); scanf("%s", pc->data[pos].sex); printf("请输入地址:>"); scanf("%s", pc->data[pos].addr); printf("请输入电话:>"); scanf("%s", pc->data[pos].tele); printf("修改完成\n"); } //排序函数 //1.按照姓名进行排序 int Conpare_ByName(const void* e1, const void* e2) { return strcmp(((struct PeoInfo*)e1)->name, ((struct PeoInfo*)e2)->name); } //2.按照年龄进行排序 int Conpare_ByAge(const void* e1, const void* e2) { return ((struct PeoInfo*)e1)->age - ((struct PeoInfo*)e2)->age; } //3.按照住址进行排序 int Conpare_ByAddress(const void* e1, const void* e2) { return strcmp(((struct PeoInfo*)e1)->addr, ((struct PeoInfo*)e2)->addr); } void SortContact(Contact* pc) { assert(pc); printf("请选择你想排序的方式:\n"); printf("1.姓名\n2.年龄\n3.住址\n"); int input = 0; scanf("%d", &input); switch (input) { case 1: qsort(pc->data, pc->sz, sizeof(pc->data[0]), Conpare_ByName); printf("排序成功\n"); break; case 2: qsort(pc->data, pc->sz, sizeof(pc->data[0]), Conpare_ByAge); printf("排序成功\n"); break; case 3: qsort(pc->data, pc->sz, sizeof(pc->data[0]), Conpare_ByAddress); printf("排序成功\n"); break; } } void DeaContact(Contact* pc) { assert(pc); memset(pc->data, 0, sizeof(pc->data)); pc->sz == 0; printf("清空成功!\n"); } //teat.c #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include"contact.h" void menu() { printf("*********************************\n"); printf("***** 1.add 2.del ******\n"); printf("***** 3.search 4.modify ******\n"); printf("***** 5.show 6.sort ******\n"); printf("***** 7.dea 0.exit ******\n"); printf("*********************************\n"); } int main() { int input = 0; //创建通讯录 PeoInfo data[1000]; int sz=05l; Contact con; //初始化通讯录 InitContact(&con); do { menu(); printf("请选择->"); scanf("%d", &input); switch (input) { case 1: AddContact(&con); break; case 2: DelContact(&con); break; case 3: SearchContact(&con); break; case 4: ModifyContact(&con); break; case 5: ShowContact(&con); break; case 6: SortContact(&con); break; case 7: DeaContact(&con); break; case 0: printf("退出游戏"); break; default: printf("选择错误"); break; } } while (input); return 0; }
1.创建文件
test.c——测试通讯录
contact.c——通讯录的实现
contact.h——函数的声明
2.打印菜单,明确功能 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include"contact.h" void menu() { printf("*********************************\n"); printf("***** 1.add 2.del ******\n"); printf("***** 3.search 4.modify ******\n"); printf("***** 5.show 6.sort ******\n"); printf("***** 7.sort 0.exit ******\n"); printf("*********************************\n"); } int main() { int input = 0; do { menu(); printf("请选择->"); scanf("%d", &input); switch (input) { case 1: break; case 2: break; case 3: break; case 4: break; case 5: break; case 6: break; case 7: break; case 0: printf("退出游戏"); break; default: printf("选择错误"); break; } } while (input); return 0; }
3.创建通讯录 //头文件 #pragma once //人的信息 typedef struct PeoInfo { char name[20]; int age; char sex[5]; char addr[30]; char tele[12]; }PeoInfo; typedef struct Contact { PeoInfo data[1000];//存放人的信息 int sz;//当前已存放信息的个数 }Contact;
4.初始化通讯录和添加联系人
test.c
//Contact.c #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include"contact.h" void InitContact(Contact* pc) { pc->sz = 0; memset(pc->data, 0, sizeof(pc->data)); } AddContact(Contact* pc) { if (pc->sz == 1000) { printf("通讯录已满,无法添加\n"); return; } //增加一个人的信息 printf("请输入名字:>"); scanf("%s", pc->data[pc->sz].name); printf("请输入年龄:>"); scanf("%d", &(pc->data[pc->sz].age)); printf("请输入性别:>"); scanf("%s", pc->data[pc->sz].sex); printf("请输入地址:>"); scanf("%s", pc->data[pc->sz].addr); printf("请输入电话:>"); scanf("%s", pc->data[pc->sz].tele); pc->sz++; } 5.展示通讯录
test.c
头文件声明
//Contact.c(实现) void ShowContact(Contact* pc) { int i = 0; for (i = 0; i < pc->sz; i++) { printf("%s\t%d\t%s\t%s\t%s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].addr, pc->data[i].tele); } }阶段性测试(输入数据可使用中文)
数据右对齐
void ShowContact(Contact* pc) { int i = 0; for (i = 0; i < pc->sz; i++) { printf("%20s\t%4d\t%5s\t%20s\t%15s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].addr, pc->data[i].tele); } }数据左对齐
void ShowContact(Contact* pc) { int i = 0; for (i = 0; i < pc->sz; i++) { printf("%-20s\t%-4d\t%-5s\t%-20s\t%-15s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].addr, pc->data[i].tele); } }加表头明确数据
void ShowContact(Contact* pc) { int i = 0; printf("%-20s\t%-4s\t%-5s\t%-20s\t%-15s\n", "名字", "年龄", "性别", "地址", "电话"); for (i = 0; i < pc->sz; i++) { printf("%-20s\t%-4d\t%-5s\t%-20s\t%-15s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].addr, pc->data[i].tele); } } 6.删除指定联系人先声明(Contact.h)
引用删除的子程序(test.h)
Contact.c
void DelContact(Contact* pc) { char name[NAME_MAX] = { 0 }; if (pc->sz == 0) { printf("通讯录为空,无法删除"); return; } //删除 //找出要删除的人 printf("请输入要删除的人的名字;>"); scanf("%s", name); int i = 0; int del = 0; for (i = 0; i < pc->sz; i++) { if (strcmp(pc->data[i].name, name) == 0) { del = i; break; } } //删除 for (i = del; i < pc->sz; i++) { pc->data[i] = pc->data[i + 1]; } pc->sz--; printf("删除成功\n"); }阶段性测试:
如果删除的联系人不存在,要做出提示
应该先找出需删除的联系人,判断其是否存在。
int FindByName(const Contact* pc, char name[]) { int i = 0; for (i = 0; i < pc->sz; i++) { if (strcmp(pc->data[i].name, name) == 0) { return i; } } return -1; } void DelContact(Contact* pc) { char name[NAME_MAX] = { 0 }; if (pc->sz == 0) { printf("通讯录为空,无法删除"); return; } //删除 //找出要删除的人 printf("请输入要删除的人的名字;>"); scanf("%s", name); int ret=FindByName(pc, name); if (-1 == ret) { printf("要删除的人不存在\n"); return; } int i = 0; int del = 0; for (i = 0; i < pc->sz; i++) { if (strcmp(pc->data[i].name, name) == 0) { del = i; break; } } //删除 for (i = del; i < pc->sz; i++) { pc->data[i] = pc->data[i + 1]; } pc->sz--; printf("删除成功\n"); }阶段性测试(判断代码实现效果)
7.查找指定联系人
记得声明和引用哈
void SearchContact(const Contact* pc) { char name[NAME_MAX] = { 0 }; printf("请输入要查找人的名字:>"); scanf("%s", name); int pos = FindByName(pc, name); if (-1 == pos) { printf("要查找的人不存在\n"); return; } //打印信息 printf("%-20s\t%-4s\t%-5s\t%-20s\t%-15s\n", "名字", "年龄", "性别", "地址", "电话"); printf("%-20s\t%-4d\t%-5s\t%-20s\t%-15s\n", pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex, pc->data[pos].addr, pc->data[pos].tele); }阶段性测试
8.修改指定联系人
记得声明和引用哈
void ModifyContact(Contact* pc) { assert(pc); char name[NAME_MAX] = { 0 }; printf("请输入要删除的人的名字;>"); scanf("%s", name); int pos = FindByName(pc, name); if (-1 == pos) { printf("要删除的人不存在\n"); return; } printf("请输入名字:>"); scanf("%s", pc->data[pos].name); printf("请输入年龄:>"); scanf("%d", &(pc->data[pos].age)); printf("请输入性别:>"); scanf("%s", pc->data[pos].sex); printf("请输入地址:>"); scanf("%s", pc->data[pos].addr); printf("请输入电话:>"); scanf("%s", pc->data[pos].tele); printf("修改完成"); }阶段性测试:
9.联系人排序
记得声明和引用哈
//排序函数 //1.按照姓名进行排序 int Conpare_ByName(const void* e1, const void* e2) { return strcmp(((struct PeoInfo*)e1)->name, ((struct PeoInfo*)e2)->name); } //2.按照年龄进行排序 int Conpare_ByAge(const void* e1, const void* e2) { return ((struct PeoInfo*)e1)->age - ((struct PeoInfo*)e2)->age; } //3.按照住址进行排序 int Conpare_ByAddress(const void* e1, const void* e2) { return strcmp(((struct PeoInfo*)e1)->addr, ((struct PeoInfo*)e2)->addr); } void SortContact(Contact* pc) { assert(pc); printf("请选择你想排序的方式:\n"); printf("1.姓名\n2.年龄\n3.住址\n"); int input = 0; scanf("%d", &input); switch (input) { case 1: qsort(pc->data, pc->sz, sizeof(pc->data[0]), Conpare_ByName); printf("排序成功\n"); break; case 2: qsort(pc->data, pc->sz, sizeof(pc->data[0]), Conpare_ByAge); printf("排序成功\n"); break; case 3: qsort(pc->data, pc->sz, sizeof(pc->data[0]), Conpare_ByAddress); printf("排序成功\n"); break; } }10.删除所有联系人
记得声明和引用哈
void DeaContact(Contact* pc) { assert(pc); memset(pc->data, 0, sizeof(pc->data)); pc->sz == 0; printf("清空成功!\n"); }总结
即使结束也是开始,来,我们干了这碗鸡汤。
宝子,你不点个赞吗?不评个论吗?不收个藏吗?
最后的最后,关注我,关注我,关注我,你会看到更多有趣的博客哦!!!
喵喵喵,你对我真的很重要。
《小猫猫大课堂》三轮4——自定义类型(位段,枚举,联合)(内含通讯录)由讯客互联游戏开发栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“《小猫猫大课堂》三轮4——自定义类型(位段,枚举,联合)(内含通讯录)”
下一篇
Java文档搜索引擎