C语言小项目动态通讯录-创新互联
项目思路
标题名称:C语言小项目动态通讯录-创新互联
文章链接:http://myzitong.com/article/dojidd.html
我们要创建一个通讯录,总体来说他是动态增长的,可以节约空间,能够存储数据在文件中
墨玉ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为创新互联的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:18980820575(备注:SSL证书合作)期待与您的合作!从小点来分一个通讯录中每个人的各项信息大致包括
1.姓名
2.年龄
3.性别
4.电话号码
5.地址
当然如果需要额外的信息也可以多额外设置函数实现
然后通讯录的功能应该包括:增删查改显示保存这几项基本的功能
大体思路是这样,然后开始实现项目
1.我们创建3个文件 test.c 用来测试,显示整个功能 contact.c 主要用来实现所需函数
contact.h头文件来声明函数
//这个主要是大致的流程和用来测试
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"
//总体思路
// 1.创建的每个人信息包括
// 姓名
// 性别
// 年龄
// 电话号码
// 地址
//
//2.可以增删查改
enum
{EXIT, //0
ADD, //1 设置枚举只是为了让代码可读性更高
DEL,
SEA,
MOD,
SHO,
SOR,
};
void menu()
{//打印一个菜单供选择
printf("***************1.增添联系人**************************\n");
printf("***************2.删除联系人**************************\n");
printf("***************3.查找联系人**************************\n");
printf("***************4.修改联系人信息**********************\n");
printf("***************5.查看当前联系人列表******************\n");
printf("***************6.排列联系人列表**********************\n");
printf("***************0.保存当前信息并退出通讯录************\n");
}
void test()
{menu();
int input = 0;
do
{printf("请输入你的选择\n");
scanf("%d", &input);
switch (input)
{//实现各个函数
case ADD:
AddContact(&con);
break;
case DEL:
DelContact(&con);
break;
case SEA:
SearchContact(&con);
break;
case MOD:
ModifyContact(&con);
break;
case SHO:
ShowContact(&con);
break;
case SOR:
SortContact(&con);
break;
case EXIT:
SaveContact(&con);
break;
}
} while (input);
}
int main()
{//1.要初始化通讯录
InitContact(&con);
test();
return 0;
}
contact.h //这个主要是声明函数
#define MAX_NAME 15
#define MAX_SEX 8
#define MAX_TELE 15
#define MAX_ARRD 10
#include#include#include#includetypedef struct PeoInfo
{char name[MAX_NAME];
char sex[MAX_SEX];
int age;
char tele[MAX_TELE];
char addr[MAX_ARRD];
}Peoinfo;
//只创建一个存放学生信息的还不够 我们在应用时还需要知道当前学生的数量
//并且我们创作的这个通讯录应该是动态增长(能够节省空间)的,所以需要设定容量
typedef struct Contact
{Peoinfo* data;//利用指针再去开辟动态空间 也可以利用柔性数组
int size;
int capacity;
}Contact;
Contact con;
void InitContact(Contact* ps);
void AddContact(Contact* ps);
void DelContact(Contact* ps);
void SearchContact(Contact* ps);
void ShowContact(Contact* ps);
void SortContact(Contact* ps);
void SaveContact(Contact* ps);
void Checkfull(Contact* ps);
void ModifyContact(Contact* ps);
contact.c //主要来实现函数功能
#include "contact.h" //包含头文件
void InitContact(Contact* ps)
{ps->size = 0;
ps->capacity = 3;
ps->data = (Peoinfo*)malloc(sizeof(Peoinfo) * 3); //初始化
//读入存在文件中的数据
FILE* pf = fopen("contact.txt", "rb");
if (!pf)
{perror("InitContact");
return;
}
//开始读入 利用fread的返回值 能判断是否读取完整数据
//需要创建一个变量
Peoinfo tmp = {0 };
while (fread(&tmp, sizeof(Peoinfo), 1, pf) != 0)
{Checkfull(&con); //每次都要判断读入时容量是否满了
ps->data[ps->size] = tmp;
(ps->size)++;
}
fclose(pf);
pf = NULL;
}
void Checkfull(Contact* ps)
{if (ps->size == ps->capacity)
{//需要扩容
Peoinfo* ptr = (Peoinfo*)realloc(ps->data,sizeof(Peoinfo) * (ps->size + 2));//扩充两个人
if (ptr)
{ ps->data = ptr;
(ps->capacity) += 2;
}
}
//如果没有满员,则不需要做任何事
}
void AddContact(Contact* ps)
{//添加之前要检查当前容量是否已经满了
Checkfull(&con);
//增加联系人的各项信息
printf("请输入联系人的姓名\n");
scanf("%s", ps->data[ps->size].name);
printf("请输入联系人的年龄\n");
scanf("%d", &(ps->data[ps->size].age));
printf("请输入联系人的性别\n");
scanf("%s", ps->data[ps->size].sex);
printf("请输入联系人的电话号码\n");
scanf("%s", ps->data[ps->size].tele);
printf("请输入联系人的地址\n");
scanf("%s", ps->data[ps->size].addr);
printf("添加成功\n");
(ps->size)++;
}
int Search(char* names)
{int i = 0; //遍历
for (i = 0; i< con.size; i++)
{if (strcmp(con.data[i].name, names) == 0)
{ return i;
}
}
return -1;
}
void SearchContact(Contact* ps)
{//再设置一个函数查找
//如果找到了就返回下标,如果没有找到就返回-1
printf("请输入你要查找的联系人的姓名\n");
char names[MAX_NAME];
scanf("%s", names);
int ret = Search(names);
if (ret == -1)
{printf("找不到此人\n");
}
else
{//要把这个人的信息全部都打印出来所以我们先实现show函数
printf("%-15s\t%-5s\t%-5d\t%-15s\t%-10s\n",
ps->data[ret].name,
ps->data[ret].sex,
ps->data[ret].age,
ps->data[ret].tele,
ps->data[ret].addr);
}
}
void DelContact(Contact* ps)
{printf("请输入你需要删除的联系人的名字\n");
char names[MAX_NAME];
scanf("%s", names);
//首先需要查找到联系人,那我们优先完成查找函数
int ret = Search(names);
if (ret == -1)
{printf("找不到你要删除的这个联系人\n");
}
else
{//删除思路:把删除人之后的每一位联系人向前移一位,最后再把size减一即可
int i = 0;
for (i = ret; i< ps->size-1; i++)
{ ps->data[i] = ps->data[i + 1];
}
(ps->size)--;
printf("删除成功\n");
}
}
void ShowContact(Contact* ps)
{//开始时需要判断一下 是否有人
if (ps->size == 0)
{printf("目前还没有联系人\n");
}
//左对齐
else
{printf("%-15s\t%-5s\t%-5s\t%-15s\t%-10s\n", "姓名", "年龄", "性别", "电话", "地址");
for (int i = 0; i< ps->size; i++)
{ //打印每个人的各项信息
printf("%-15s\t%-5s\t%-5d\t%-15s\t%-10s\n",
ps->data[i].name,
ps->data[i].sex,
ps->data[i].age,
ps->data[i].tele,
ps->data[i].addr);
}
}
}
int com_by_name(void* e1, void* e2)
{return strcmp((char*)e1, (char*)e2);
}
void SortContact(Contact* ps)
{//利用qsort函数来排序 我上一篇文章有详细的讲解
//我们这里就按姓名分类,其他也是同理可以得到
qsort(ps->data, ps->size, sizeof(Peoinfo), com_by_name);
printf("排序成功\n");
ShowContact(ps);
}
void SaveContact(Contact* ps)
{int i = 0;
//写入一个文件中
FILE* pf = fopen("contact.txt", "wb");//以二进制的形式写入
if (!pf)
{perror("SaveContact");//错误时,能够打印错误的信息
return;
}
else
{for (i = 0; i< ps->size; i++)
{ fwrite(&(ps->data[i]), sizeof(Peoinfo), 1, pf);
}
}
fclose(pf);
pf = NULL;
}
void ModifyContact(Contact* ps)
{printf("请输入你要修改的联系人姓名\n");
char names[MAX_NAME];
scanf("%s", names);
int ret = Search(names);
if (ret == -1)
{printf("找不到你要修改的联系人\n");
}
else
{printf("请输入联系人的姓名\n");
scanf("%s", ps->data[ret].name);
printf("请输入联系人的年龄\n");
scanf("%d", &(ps->data[ret].age));
printf("请输入联系人的性别\n");
scanf("%s", ps->data[ret].sex);
printf("请输入联系人的电话号码\n");
scanf("%s", ps->data[ret].tele);
printf("请输入联系人的地址\n");
scanf("%s", ps->data[ret].addr);
printf("修改成功\n");
}
到这里项目就完成了,虽然看起来有很多行,但是找清楚思路后很好写
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
标题名称:C语言小项目动态通讯录-创新互联
文章链接:http://myzitong.com/article/dojidd.html