用结构体变量和函数实现第一个通讯录

目录

一、头文件

二、主程序

1.初始化通讯录

2.函数

(1)增

(2)辅助函数——find_name

(3)删

​(4)查

​(5)改​编辑

(6)插入

(7)打印通讯录

(8)注意

三、总结


一、头文件

需要自己写一个头文件,用于创建结构体变量

主函数部分: 

用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");
};

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值