通讯录文件版本

简介: 文件版本的通讯录,可以保存

1.contact.c

include"contact.h"

void checkcapity(contact* p);

void loadcontact(contact* p)//将文件中的内容加载进入

{

   person tmp = { 0 };

   FILE* pfread = fopen("data.txt", "rb");

   if (pfread == NULL)

   {

       perror("loadcontact::fopen");

       return;

   }

   while (fread(&tmp, sizeof(person), 1, pfread))

   {

       checkcapity(p);

       p->data[p->sz] = tmp;

       p->sz++;

   }

   fclose(pfread);

   pfread = NULL;

}

void init(contact* p)

{

   p->data = (person)malloc(3sizeof(person));

   if (p->data == NULL)

   {

       return;

   }

   p->sz = 0;

   p->capity = 3;

   loadcontact(p);

}

void checkcapity(contact* p)

{

   if (p->sz == p->capity)//空间已满 要扩容

   {

       struct person* ptr = (struct person*)realloc(p->data, (p->capity + 2) * sizeof(struct person));//addcap代表增大2个容量

       if (ptr != NULL)

       {

           p->data = ptr;

           p->capity = p->capity + 2;//将容量扩大到5 str不需要销毁 它并没有开辟动态空间

           printf("扩容成功\n");

       }

   }

}

void addcontact(contact* p)//增加通讯录成员

{

   checkcapity(p);

   printf("请输入名字:>");

   scanf("%s", p->data[p->sz].name);

   printf("请输入年龄:>");

   scanf("%d", &p->data[p->sz].age);

   printf("请输入性别:>");

   scanf("%s", p->data[p->sz].sex);

   printf("请输入电话:>");

   scanf("%s", p->data[p->sz].tele);

   printf("请输入地址:>");

   scanf("%s", p->data[p->sz].addr);

   p->sz++;

   printf("增加成功\n");

}

int find(contact* p, char name[])

{

   int i = 0;

   for (i = 0; i < p->sz; i++)

   {

       if (strcmp(name, p->data[i].name) == 0)

       {

           return i;

       }

   }

   return -1;

}

void delcontact(contact* p)//删除通讯录成员

{

   if (p->sz == 0)

   {

       printf("没有数据可以删除\n");

       return;

   }

   char name[20];

   printf("请删除输入名字:>");

   scanf("%s", name);

   int ret = find(p, name);

   if (ret == -1)

   {

       printf("没找到\n");

       return;

   }

   else

   {

       int i = 0;

       for (i = 0; i < p->sz - 1; i++)//数据到达倒数第二个就会把倒数第一个数传过来

       {

           p->data[i] = p->data[i + 1];

       }

       p->sz--;//一共有两个倒数第一个的数的值 故删去最后一个数

   }

}

void searchcontact(const contact* p)//查找通讯录成员

{

   char name[20];

   printf("输入要查找的名字:>");

   scanf("%s", name);

   int ret = find(p, name);

   if (ret == -1)

   {

       printf("没找到\n");

       return;

   }

   else

   {

       printf("%20s\t %5s\t %5s\t %20s\t %20s\n", "名字", "年龄", "性别", "电话", "地址");

       printf("%20s\t", p->data[ret].name);

       printf("%5d\t", p->data[ret].age);

       printf("%5s\t", p->data[ret].sex);

       printf("%20s\t", p->data[ret].tele);

       printf("%20s\n", p->data[ret].addr);

   }

}

void modifycontact(contact* p)//修改通讯录成员

{

   char name[20];

   printf("输入名字:>");

   scanf("%s", name);

   int ret = find(p, name);

   if (ret == -1)

   {

       printf("没找到该成员\n");

   }

   else

   {

       printf("请输修改入名字:>");

       scanf("%s", p->data[ret].name);

       printf("请输入修改年龄:>");

       scanf("%d", &p->data[ret].age);

       printf("请输入修改性别:>");

       scanf("%s", p->data[ret].sex);

       printf("请输入修改电话:>");

       scanf("%s", p->data[ret].tele);

       printf("请输入修改地址:>");

       scanf("%s", p->data[ret].addr);

   }

}

void printcontact(contact* p)//输出所有成员

{

   int i = 0;

   printf("%20s\t %5s\t %5s\t %20s\t %20s\n", "名字", "年龄", "性别", "电话", "地址");

   for (i = 0; i < p->sz; i++)

   {

       printf("%20s\t", p->data[i].name);

       printf("%5d\t", p->data[i].age);

       printf("%5s\t", p->data[i].sex);

       printf("%20s\t", p->data[i].tele);

       printf("%20s\n", p->data[i].addr);

   }

}

int cmp(const void* e1, const void* e2)

{

   return ((struct person)e1)->age - ((struct person)e2)->age;

}

void sortcontact(contact* p)//将结构体成员排序

{

   qsort(p->data, p->sz, sizeof(struct person), cmp);

}

void savecontact(contact* p)

{

   FILE* pf = fopen("data.txt", "wb");//创建文件

   if (pf == NULL)

   {

       perror("savecontact::fopen");

       return;

   }

   int i = 0;

   for (i = 0; i < p->sz; i++)//将内容写入文件

   {

       fwrite(p->data + i, sizeof(person), 1, pf);

   }

fclose(pf);//关闭文件
pf = NULL;

}

void destory(contact* p)

{

   free(p->data);

   p->data = NULL;

   p->capity = 0;

   p->sz = 0;

}

2.contact.h

define _CRT_SECURE_NO_WARNINGS

define      cap 3//动态内存空间的初始容量

define   addcap 2//增大的容量

include

include

include

typedef struct person

{

   char name[20];

   int age;

   char sex[20];

   char tele[20];

   char addr[20];

}person;

typedef struct contact

{

   person* data;//指向动态内存空间 用来存放联系人信息

   int sz;//当前记录的个数

   int capity;//动态内存的容量

}contact;

void init(contact* p);

void addcontact(contact* p);

void delcontact(contact* p);

void searchcontact(const contact* p);//这里我们只是寻找数据 不修改 用const修饰结构体本身内容不能被修改 起到保护数据的作用

void modifycontact(contact* p);

void printcontact(contact* p);

void sortcontact(contact* p);

void destory(contact* p);

void loadcontact(contact* p);

void savecontact(contact* p);

3.test.c

include"contact.h"

void menu()

{

   printf("1.add       2.del\n");

   printf("3.search    4.modify\n");     printf("5.sort      6.print\n");     printf("0.ex\n");

}

enum day

{

   ex,

   add,

   del,

   search,

   modify,

   sort,

   print

};

int main()

{

   contact  con;

   init(&con);

   int input = 0;

   do

   {

       menu();

       printf("请输入数字:>");

       scanf("%d", &input);

       switch (input)

       {

       case add:

           addcontact(&con);

           break;

       case del:

           delcontact(&con);

           break;

       case search:

           searchcontact(&con);//虽然查找不需要改变结构体本身的内容 但为了提高效率 依旧使用取地址

           break;

       case modify:

           modifycontact(&con);

           break;

       case sort:

           sortcontact(&con);

           break;

       case print:

           printcontact(&con);

           break;

       case ex:

           savecontact(&con);

           printf("结束");

           destory(&con);//销毁内存

           break;

default:
        printf("输入错误 重新输入");
        break;
    }
} while (input);
return 0;

}

目录
相关文章
|
9天前
|
数据采集 人工智能 安全
|
4天前
|
机器学习/深度学习 人工智能 前端开发
构建AI智能体:七十、小树成林,聚沙成塔:随机森林与大模型的协同进化
随机森林是一种基于决策树的集成学习算法,通过构建多棵决策树并结合它们的预测结果来提高准确性和稳定性。其核心思想包括两个随机性:Bootstrap采样(每棵树使用不同的训练子集)和特征随机选择(每棵树分裂时只考虑部分特征)。这种方法能有效处理大规模高维数据,避免过拟合,并评估特征重要性。随机森林的超参数如树的数量、最大深度等可通过网格搜索优化。该算法兼具强大预测能力和工程化优势,是机器学习中的常用基础模型。
307 164
|
3天前
|
机器学习/深度学习 自然语言处理 机器人
阿里云百炼大模型赋能|打造企业级电话智能体与智能呼叫中心完整方案
畅信达基于阿里云百炼大模型推出MVB2000V5智能呼叫中心方案,融合LLM与MRCP+WebSocket技术,实现语音识别率超95%、低延迟交互。通过电话智能体与座席助手协同,自动化处理80%咨询,降本增效显著,适配金融、电商、医疗等多行业场景。
318 155
|
12天前
|
SQL 自然语言处理 调度
Agent Skills 的一次工程实践
**本文采用 Agent Skills 实现整体智能体**,开发框架采用 AgentScope,模型使用 **qwen3-max**。Agent Skills 是 Anthropic 新推出的一种有别于mcp server的一种开发方式,用于为 AI **引入可共享的专业技能**。经验封装到**可发现、可复用的能力单元**中,每个技能以文件夹形式存在,包含特定任务的指导性说明(SKILL.md 文件)、脚本代码和资源等 。大模型可以根据需要动态加载这些技能,从而扩展自身的功能。目前不少国内外的一些框架也开始支持此种的开发方式,详细介绍如下。
873 6
|
5天前
|
机器学习/深度学习 人工智能 前端开发
构建AI智能体:六十九、Bootstrap采样在大模型评估中的应用:从置信区间到模型稳定性
Bootstrap采样是一种通过有放回重抽样来评估模型性能的统计方法。它通过从原始数据集中随机抽取样本形成多个Bootstrap数据集,计算统计量(如均值、标准差)的分布,适用于小样本和非参数场景。该方法能估计标准误、构建置信区间,并量化模型不确定性,但对计算资源要求较高。Bootstrap特别适合评估大模型的泛化能力和稳定性,在集成学习、假设检验等领域也有广泛应用。与传统方法相比,Bootstrap不依赖分布假设,在非正态数据中表现更稳健。
260 113

热门文章

最新文章