目录
一、头文件
需要自己写一个头文件,用于创建结构体变量
主函数部分:
用do{......}while;循环实现执行操作
头文件:
定义枚举常量,用单词代替整数,switch分支选择执行操作,方便代码解读。
定义结构体变量:自定义一个小的结构体类型(是类型不是变量)Peoinfo;自定义一个大的结构体类型peoinfo,用一个结构体数组data[100]存储数据,用sz记录编号,作为后续删除和插入的编号;
二、主程序
这里注意创建结构体变量最好是全局变量(我也不知道为什么,等下次再探究)接下来应该写函数来实现增删查改的功能了。
1.初始化通讯录
用库函数memset把所有结构体申请的空间以字节为单位初始化为0。
//memset(*,size_t)
这里看到所有数据被初始化为0。
到此,通讯录创建完成。
接下来,封装函数。
2.函数
(1)增
每次增加一组数据sz++,实现记录编号。
(2)辅助函数——find_name
封装一个辅助函数实现用名字查找存在通讯录的人,是实现删,查,插入的前提。
(3)删
(4)查
(5)改
(6)插入
(7)打印通讯录
(8)注意
这里函数都是对通讯录结构体进行操作,所以传参时要用址传递,用自定义类型peoinfo*类型指针接受参数,可以实现对通讯录的修改。
三、总结
用指针解引用结构体时有问题,所以用我的源代码做出的通讯录还不成熟,不能实现打印,查找等功能,问题就是解引用结构体时报错,嗯~还需要研究下。
这是代码人第一次写大型博客,如有错误和不当,请多包容,并请各位友友们指正。
把源代码放在下面。
收工!睡觉!
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include"contract.h" #include<assert.h> #define max 100 void initpeoinfo(peoinfo* pc); void addinfo(peoinfo* pc); void search(peoinfo* pc); void deleteinfo(peoinfo*pc); void insertinfo(peoinfo* pc); void modinf(peoinfo*pc); void sort_num(peoinfo* pc); void sort_age(peoinfo* pc); void swap(int *n,int *m); void showinfo(peoinfo* pc); //创建一个通讯录 peoinfo peoinfo1; int main() { //初始化通讯录 initpeoinfo(&peoinfo1); //设置好通讯录了 int input; do { menue(); scanf("%d", &input); switch (input) { case Add: addinfo(&peoinfo1); break; case Delete: deleteinfo(&peoinfo1); break; case Insert: insertinfo(&peoinfo1); break; case Search: search(&peoinfo1); break; case Sort: printf(" 8.按学号排序 9.按年龄排序 \n"); int input_sort; scanf("%d", &input_sort); switch (input) { case 8: sort_num(&peoinfo1); break; case 9: sort_age(&peoinfo1); break; default: printf("没找到对应操作。"); break; } break; case Modify: modinf(&peoinfo1); break; case Show: showinfo(&peoinfo1); break; case Exit: break; default: printf("输入错误,请重新输入"); break; } } while (input); return 0; } //初始化通讯录 void initpeoinfo(peoinfo* pc) { assert(pc); pc->sz = 0; memset(pc->data, 0, sizeof(pc->data)); } //增 void addinfo(peoinfo* pc) { assert(pc); if (pc->sz == max) { printf("通讯录已满。\n"); return; } printf("请输入你的名字:"); scanf("%s", pc->data[pc->sz].name); printf("请输入你的性别:"); scanf("%s", pc->data[pc->sz].sex); printf("请输入你的年龄:"); scanf("%d", &pc->data[pc->sz].age); printf("请输入你的学号:"); scanf("%d",&pc->data[pc->sz].num); pc->sz++; printf("增加成功\n"); return; } //辅助函数,找人,返回序列 int find_name(peoinfo* pc,char name[]) { assert(pc); for (int i = 0; i < max; i++) { if (strcmp(pc->data[i].name, name) == 0) return i; } return -1;//找不到 } //删 void deleteinfo(peoinfo*pc) { assert(pc); char name[10]; printf("请输入要删除的人的名字:"); scanf("%s", name); int n = find_name(pc, name); if (n != -1) { for (int j = n; j < max - 1; j++) pc->data[j] = pc->data[j + 1]; return; } else { printf("找不到。\n"); return; } } //查 void search(peoinfo* pc) { char name[20]; printf("请输入查找人的名字:"); scanf("%s", name); int n = find_name(pc, name); for (int i = 0; i < max; i++) { if (n == i) { printf("%5s%8s%13s%12s\n", "名字", "性别", "学号", "年龄"); printf("%5s%7s%17d%8d\n", pc->data[pc->sz].name, pc->data[pc->sz].sex, pc->data[pc->sz].num, pc->data[pc->sz].age); return; } } printf("没找到。\n"); return; } //改 void modinf(peoinfo* pc) { assert(pc); char name[20]; printf("请输入要改的人名字:"); scanf("%s", name); int i = 0; int n = find_name(pc, name); for (i = 0; i < max; i++) { if (n == i) break; else { printf("没找到。\n"); return; } }strcpy(pc->data[pc->sz].name, name); printf("请输入性别:"); scanf("%s", pc->data[pc->sz].sex); printf("请输入年龄:"); scanf("%d", &pc->data[pc->sz].age); printf("请输入学号:"); scanf("%d", &pc->data[pc->sz].num); printf("修改完成。\n"); } //插入 void insertinfo(peoinfo* pc) { assert(pc); char name[10] = { 0 }; int i; printf("请输入要插入的位置:\n"); scanf("%d", &i); i--; for (int j = pc->sz; j >= i; j--) { pc->data[j+1] = pc->data[j]; }printf("请输入要插入的人的名字:"); scanf("%s", pc->data[pc->sz].name); printf("请输入要要插入的人的性别:"); scanf("%s", pc->data[pc->sz].sex); printf("请输入要要插入的人的年龄:"); scanf("%d", &pc->data[pc->sz].age); printf("请输入要要插入的人的学号:"); scanf("%d", &pc->data[pc->sz].num); printf("插入成功。\n"); return; } //按学号排序 void sort_num(peoinfo*pc) { for (int i = 0; i < pc->sz; i++) { for (int j = 0; j < (pc->sz - i); j++) { if (pc->data[pc->sz].num > pc->data[pc->sz+1].num) swap(&pc->data[pc->sz].num, &pc->data[pc->sz+1].num); } } printf("排序完成。\n"); return; } //按年龄排序 void sort_age(peoinfo* pc) { for (int i = 0; i < pc->sz; i++) { for (int j = 0; j < (pc->sz - i); j++) { if (pc->data[pc->sz].age > pc->data[pc->sz+1].age) swap(&pc->data[pc->sz].age, &pc->data[pc->sz+1].age); } } printf("排序完成。\n"); return; } //排序函数 void swap(int* n, int* m) { int tmp = *n; *n = *m; *m = tmp; } //打印 void showinfo(peoinfo* pc) { assert(pc); int j = pc->sz; printf("%5s%8s%13s%12s\n", "名字", "性别", "学号", "年龄"); for (int i = 0; i < j; i++) { printf("%5s%7s%17d%8d\n", pc->data[pc->sz].name, pc->data[pc->sz].sex, pc->data[pc->sz].num, pc->data[pc->sz].age); } return; }
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<assert.h> #include<string.h> enum en { Exit, Add, Delete, Insert, Search, Sort, Modify, Show, }; typedef struct { char name[20]; char sex[10]; int num; int age; }PeoInfo;//小的信息类型 typedef struct { PeoInfo data[100];//个人数据 int sz;//通讯录编号 }peoinfo;//大的数据类型 void menue() { printf("请选择执行操作:\n"); printf(" \n"); printf(" 1.Add 2.Delete \n"); printf(" 3.Insert 4.Search \n"); printf(" 5.Sort 6.Change \n"); printf(" 7.Show 0.Exit \n"); printf(" \n"); printf(" \n"); printf(" \n"); };