就还蛮简单的,大家感兴趣的可以试着做下。
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.运行结果
有兴趣的可以下去玩下🧐
坚持打卡!😃