【hello C语言】通讯录小项目

就还蛮简单的,大家感兴趣的可以试着做下。 

1.集成开发环境

vs2019

2.必备知识

指针的使用、动态内存开辟与回收

3.分文件式书写代码

test.c文件:用来测试通讯录小项目的逻辑;

Contant.h文件:用来书写通讯录所需的函数声明;

Contant.c文件:用来书写通讯录所需的函数实现;

 

  • Contant.h:
#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
//动态实现通讯录
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>

//联系人的信息
typedef struct Person
{
	char name[20];	//姓名
	char sex[5];	//性别
	int age;		//年龄
	char tel[20];	//电话
	char address[20];//住址
}Person;

//通讯录
typedef struct Contant
{
	Person* data;	//指向内存的存储地址
	int size;		//实际存储容量
	int capacity;	//通讯录的容量
}Contant;

//初始化通讯录
void InitContant(Contant* c);

//销毁通讯录
void DestoryContant(Contant* c);

//添加联系人
void AddContant(Contant* c);

//打印通讯录
void PrintContant(Contant* c);

//删除联系人
void DelContant(Contant* c);

//查找联系人的信息
void SearchContant(Contant* c);

//修改联系人的信息
void ModifyContant(Contant* c);
  • Contant.c:
#define _CRT_SECURE_NO_WARNINGS 1

#include "Contant.h"

//初始化通讯录
void InitContant(Contant* c)
{
	assert(c);
	Person* d = (Person*)malloc(sizeof(Person) * 4);
	if (d == NULL)
		perror("InitContant::malloc");
	c->data = d;
	c->capacity = 4;
	c->size = 0;
}

//销毁通讯录
void DestoryContant(Contant* c)
{
	assert(c);
	c->capacity = c->size = 0;
	free(c->data);
	c->data = NULL;
}

//添加联系人
void AddContant(Contant* c)
{
	assert(c);
	if (c->capacity == c->size)
	{
		Person* d = (Person*)realloc(c->data, sizeof(Person) * (c->capacity + 2));
		if (d == NULL)
			perror("AddContant::malloc");
		c->data = d;
		c->capacity += 2;
		printf("扩容成功!\n");
	}
	printf("请输入姓名:");
	scanf("%s", c->data[c->size].name);
	printf("请输入性别:");
	scanf("%s", c->data[c->size].sex);
	printf("请输入年龄:");
	scanf("%d", &(c->data[c->size].age));
	printf("请输入电话:");
	scanf("%s", c->data[c->size].tel);
	printf("请输入住址:");
	scanf("%s", c->data[c->size].address);
	printf("添加成功!\n");
	c->size++;
}

//打印通讯录
void PrintContant(Contant* c)
{
	assert(c);
	if (c->size == 0)
	{
		printf("通讯录为空!\n");
		return;
	}
	printf("%-20s %-5s %-5s %-20s %-20s\n", "姓名", "性别", "年龄", "电话", "住址");
	for (int i = 0; i < c->size; i++)
	{
		printf("%-20s %-5s %-5d %-20s %-20s\n", c->data[i].name, c->data[i].sex, c->data[i].age, c->data[i].tel, c->data[i].address);
	}
	printf("打印完毕!\n");
}

//删除联系人
void DelContant(Contant* c)
{
	assert(c);
	if (c->size == 0)
	{
		printf("通讯录为空!无法删除\n");
		return;
	}
	printf("请输入要删除的联系人的姓名:");
	char name[20] = { 0 };
	scanf("%s", name);
	for (int i = 0; i < c->size; i++)
	{
		if (strcmp(c->data[i].name, name)==0)
		{
			for (int j = i; j < c->size - 1; j++)
				c->data[j] = c->data[j + 1];
		}
	}
	c->size--;
	printf("删除成功!\n");
}

//查找联系人的信息
void SearchContant(Contant* c)
{
	assert(c);
	if (c->size == 0)
	{
		printf("通讯录为空!\n");
		return;
	}
	printf("请输入要查找的联系人的姓名:");
	char name[20] = { 0 };
	scanf("%s", name);
	for (int i = 0; i < c->size; i++)
	{
		if (strcmp(c->data[i].name, name) == 0)
		{
			printf("%-20s %-5s %-5s %-20s %-20s\n", "姓名", "性别", "年龄", "电话", "住址");
			printf("%-20s %-5s %-5d %-20s %-20s\n", c->data[i].name, c->data[i].sex, c->data[i].age, c->data[i].tel, c->data[i].address);
		}
	}
	printf("查找成功!\n");
}

//修改联系人的信息
void ModifyContant(Contant* c)
{
	assert(c);
	if (c->size == 0)
	{
		printf("通讯录为空!\n");
		return;
	}
	printf("请输入要查找的联系人的姓名:");
	char name[20] = { 0 };
	scanf("%s", name);
	for (int i = 0; i < c->size; i++)
	{
		if (strcmp(c->data[i].name, name) == 0)
		{
			printf("请输入姓名:");
			scanf("%s", c->data[i].name);
			printf("请输入性别:");
			scanf("%s", c->data[i].sex);
			printf("请输入年龄:");
			scanf("%d", &(c->data[i].age));
			printf("请输入电话:");
			scanf("%s", c->data[i].tel);
			printf("请输入住址:");
			scanf("%s", c->data[i].address);
			printf("添加成功!\n");
		}
	}
	printf("修改成功!\n");
}


  • test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "Contant.h"

//菜单
menu()
{
	printf("*******************\n");
	printf("***** 1.ADD   *****\n");
	printf("***** 2.DEL   *****\n");
	printf("***** 3.SEARCH*****\n");
	printf("***** 4.MODIFY ****\n");
	printf("***** 5.SET    ****\n");
	printf("***** 6.PRINT  ****\n");
	printf("***** 0.EXIT    ***\n");
	printf("*******************\n");
}

//枚举
enum
{
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SET,
	PRINT,
};

int main()
{
	int input = 0;
	Contant c;
	InitContant(&c);
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case ADD:
			AddContant(&c);
			break;
		case DEL:
			DelContant(&c);
			break;
		case SEARCH:
			SearchContant(&c);
			break;
		case MODIFY:
			ModifyContant(&c);
			break;
		case PRINT:
			PrintContant(&c);
			break;
		case EXIT:
			DestoryContant(&c);
			break;
		default:
			printf("请重新选择:>");
			break;
		}
	} while (input);
	return 0;
}

4.运行结果

有兴趣的可以下去玩下🧐

 

 坚持打卡!😃

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

瞳绣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值