11.18(通讯录)

本文详细介绍了使用C语言实现的一个基础通讯录功能,包括添加、删除、搜索、修改和排序等操作,同时提到了动态内存管理的应用,如动态分配和释放内存。
摘要由CSDN通过智能技术生成

通讯录改版

//.h
#pragma once

#define MAX 100
#define MAXNAME 20
#define MAXSEX 5
#define MAXADDR 30
#define MAXTELE 12
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<assert.h>
#include<windows.h>

typedef struct peoinfo
{
	char name[MAXNAME];
	int age;
	char tele[MAXNAME];
	char sex[MAXSEX];
	char address[MAXADDR];
}peoinfo;
typedef struct contact
{
	peoinfo data[MAX];
	int count;
	int capacity;

}contact;

//菜单
void menu();
//初始化
void init(contact* pc);
//添加联系人
void add(contact* pc);
//删除联系人
void del(contact* pc);
//展示
void show(contact* pc);
//查找
void search(contact* pc);
//修改联系人
void modify(contact* cp);
//排序
void sort(contact* pc);
//fun.c
#define  _CRT_SECURE_NO_WARNINGS 1

#include".h"
void menu()
{
	printf("******************************************\n");		
	printf("******************************************\n");		
	printf("*****************0.add********************\n");		
	printf("*****************1.del********************\n");		
	printf("*****************2.search*****************\n");		
	printf("*****************3.modify*****************\n");		
	printf("*****************4.show*******************\n");		
	printf("*****************5.sort*******************\n");		
	printf("*****************6.exit*******************\n");		
	printf("******************************************\n");		
	printf("******************************************\n");		
}
void init(contact* pc)
{
	assert(pc);
	pc->count = 0;
	memset(pc->data, 0, sizeof(pc->data));//sizeof用来表示pc中data域的字节数目
}


void add(contact* pc)
{
	assert(pc);
	if (pc->count == MAX)
	{
		printf("通讯录已满!\n");
	}
	//判断是否满,为什么是MAX而不是MAX-1?因为count时刻指的是最后一位联系人的下一位
	printf("开始添加联系人:>\n");
	printf("姓名:");
	scanf("%s", pc->data[pc->count].name);
	printf("年龄:");
	scanf("%d", &pc->data[pc->count].age);
	printf("电话:");
	scanf("%s", pc->data[pc->count].tele);
	printf("性别:");
	scanf("%s", pc->data[pc->count].sex);
	printf("地址:");
	scanf("%s", pc->data[pc->count].address);
	pc->count++;
	printf("添加成功!\n");
}

static int findbyname(contact* pc, char name[])
{
	int i = 0;
	for (i = 0; i < pc->count; i++)
	{
		int ret = strcmp(name, pc->data[i].name);
		if (ret == 0)
		{
			return i;
		}
	}
	return -1;
}
void del(contact* pc)
{
	assert(pc);
	if (pc->count == 0)
	{
		printf("通讯录为空!\n");
		return;
	}
	//开始删除
	char name[100] = { 0 };
	printf("请输入要删除的联系人:\n");
	scanf("%s", name);
	int ret = findbyname(pc, name);
	if (ret == -1)
	{
		printf("通讯录中查无此人\n");
		return;
	}

	for (int i = ret; i < pc->count - 1; i++)
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->count--;
	printf("删除成功!\n");
	return;

}


void show(contact* pc)
{
	int i = 0;
	for (i = 0; i < pc->count; i++)
	{
		printf("%-20s\t%-3s\t%-12s\t%-5s\t%-30s\t\n", "姓名", "年龄", "电话", "性别", "地址");
		printf("%-20s\t%-3d\t%-12s\t%-5s\t%-30s\t\n", pc->data[i].name, 
													pc->data[i].age, 
													pc->data[i].tele, 
													pc->data[i].sex, 
													pc->data[i].address);
	}
}


void search(contact* pc)
{
	assert(pc);
	if (pc->count == 0)
	{
		printf("通讯录为空!\n");
		return;
	}
	
	char name[MAXNAME] = { 0 };
	printf("请输入要查找的联系人:\n");
	scanf("%s", name);
	int ret = findbyname(pc, name);
	if (ret == -1)
	{
		printf("通讯录中查无此人\n");
		return;
	}
	else
	{
		int i = ret;
		printf("%-20s\t%-3s\t%-12s\t%-5s\t%-30s\t\n", "姓名", "年龄", "电话", "性别", "地址");

		printf("%-20s\t%-3d\t%-12s\t%-5s\t%-30s\n", 
										pc->data[i].name,
										pc->data[i].age, 
										pc->data[i].tele,
										pc->data[i].sex, 
										pc->data[i].address);
	}

	return;
}

void modify(contact* pc)
{
	assert(pc);
	if (pc->count == 0)
	{
		printf("通讯录为空!\n");
		return;
	}
	char name[MAXNAME] = { 0 };
	printf("请输入要修改的联系人:\n");
	scanf("%s", name);
	int ret = findbyname(pc, name);
	if (ret == -1)
	{
		printf("通讯录中查无此人\n");
		return;
	}
	else
	{
		printf("确有此人\n");
		printf("开始修改联系人:>\n");
		printf("姓名:");
		scanf("%s", pc->data[pc->count].name);
		printf("年龄:");
		scanf("%d", &pc->data[pc->count].age);
		printf("电话:");
		scanf("%s", pc->data[pc->count].tele);
		printf("性别:");
		scanf("%s", pc->data[pc->count].sex);
		printf("地址:");
		scanf("%s", pc->data[pc->count].address);
		int i = ret;
		printf("%-20s\t%-3s\t%-12s\t%-5s\t%-30s\t\n", "姓名", "年龄", "电话", "性别", "地址");
		printf("%-20s\t%-3d\t%-12s\t%-5s\t%-30s\n",
			pc->data[i].name,
			pc->data[i].age,
			pc->data[i].tele,
			pc->data[i].sex,
			pc->data[i].address);
		
		printf("修改成功!\n");
	}
}

int cmp_name(const void* e1, const void* e2)
{
	return strcmp(((peoinfo*)e1)->name , ((peoinfo*)e2)->name);
}

void sort(contact* pc)
{
	assert(pc);
	printf("排序中....\n");

	qsort(pc->data, pc->count, sizeof(peoinfo), cmp_name);
	printf("排序成功!\n");
}


//test.c

#define  _CRT_SECURE_NO_WARNINGS 1
#include".h"
int main()
{
	contact con;
	init(&con);
	int input = 0;
	do
	{
		printf("欢迎使用本通讯录\n");
	
		menu();
		printf("请开始您的操作\n");
		scanf("%d", &input);
		switch (input)
		{
		case 0:
			add(&con);
			break;
		case 1:
			del(&con);
			break;
		case 2:
			search(&con);
			break;
		case 3:
			modify(&con);
			break;
		case 4:
			show(&con);
			break;
		case 5:
			sort(&con);
			break;
		case 6:
			printf("退出通讯录\n");
			break;
		default:
			printf("输入错误,请重新输入\n");
			break;
		};
	
	} while(input!=6);
	return 0;
}





11.19更新

 改通讯录,用了动态内存管理,更灵活


枚举

联合

判断当前计算机的大小端存储

我的理解:
共用同一块内存,取啥时按照啥的类型来取;
往往大小是最大的那个类型的大小,但也不一定,联合也存在对齐现象。


位段

计算机网络中会用


动态内存管理

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


int main()
{
 //代码1
 int num = 0;
 scanf("%d", &num);
 int arr[num] = {0};
 //代码2
 int* ptr = NULL;
 ptr = (int*)malloc(num*sizeof(int));
 if(NULL != ptr)//判断ptr指针是否为空
 {
 int i = 0;
 for(i=0; i<num; i++)
 {
 *(ptr+i) = 0;
 }
 }
 free(ptr);//释放ptr所指向的动态内存
 ptr = NULL;//是否有必要?
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值