C进阶_动态版通讯录_增删查改

news/2024/12/13 4:45:21/

真正的程序员不接受团队开发的理念,除非他自己是头头。

你的一个程序有时正常有时不正常,而你已经完全遵循编程的规则,为什么?事实上我认为相信只要遵循别人所说就能得到想当然的结果的人其实是个傻瓜。

疯狂的程序员决不是靠狂妄和拼命的程序员,而是能够脚踏实地,持续努力的程序员,一个程序员真正做到这两点,技术上去后,唯一能限制他的只有想象力,到那个时候才算“疯狂的程序员”,这种程序员,才能令对手无比恐惧。

永不放弃,永不放弃又有两个原则,第一个原则是永不放弃,第二个原则就是:当你想放弃时回头看第一个原则。

如果调试一个程序让你很苦恼,千万不要放弃,成功永远在拐角之后,除非你走到拐角,否则你永远不知道你离他多远,所以,请记住,坚持不懈,直到成功。

越有故事的人越有软肋。而这一生所有的软肋,几乎都跟某个人有关。年少时不知愁,无情者亦无畏。阅历逐渐丰厚,感情中的伤痕帮我们慢慢长成了成熟的模样。渐渐发现,身上总有某处,不敢轻易碰触,疼。

所有的道理都是相通的,我们所做的并非是创造性的工作,所有的问题前人都曾经解决,所以我们更是无所畏惧,更何况我们不只有书店,而且有互联网,动动手脚就能找到需要的。

——————————————————————————————

又更新博客了~

其实类似小项目我在之前就做过,那时候做的是航班信息管理系统。

航班信息管理系统_C语言小项目_课程设计_大作业_工业废气的博客-CSDN博客

今天是动态版通讯录小项目。和航班信息管理系统本质一样,都是增删查改。

动态版通讯录代码仓库地址Contact_2023_2_5/Contact_2023_2_5 · superverybest/C语言代码 - 码云 - 开源中国 (gitee.com)

直接上代码:

contact.h

#pragma once#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <stdlib.h>#define MAX 100
#define NAME_MAX 20
#define SEX_MAX 5
#define ADDR_MAX 30
#define TELE_MAX 12#define DEFAULT_SZ 3
#define INC_SZ 2typedef struct PeoInfo
{char name[NAME_MAX];int age;char sex[SEX_MAX];char addr[ADDR_MAX];char tele[TELE_MAX];
}PeoInfo;typedef struct Contact
{PeoInfo* data;int sz;int capacity;
}Contact;void InitContact(Contact* pc);void DestroyContact(Contact* pc);void AddContact(Contact* pc);void DelContact(Contact* pc);void ShowContact(const Contact* pc);void SearchContact(const Contact* pc);void ModifyContact(Contact* pc);void SaveContact(Contact* pc);void LoadContact(Contact* pc);

test.c

#define _CRT_SECURE_NO_WARNINGS 1#include "contact.h"void menu()
{printf("************************************\n");printf("******  1. add    2. del      ******\n");printf("******  3. search 4. modify   ******\n");printf("******  5. show   6. sort     ******\n");printf("******  0. exit               ******\n");printf("************************************\n");
}enum Option
{EXIT,ADD, DEL, SEARCH,MODIFY,SHOW,SORT
};int main()
{int input = 0;Contact con;InitContact(&con);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 SHOW:ShowContact(&con);break;case SORT://break;case EXIT:SaveContact(&con);DestroyContact(&con);printf("退出通讯录\n");break;default:printf("选择错误\n");break;}} while (input);return 0;
}

contact.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"void InitContact(Contact* pc)
{assert(pc);pc->sz = 0;PeoInfo* ptr = (PeoInfo*)calloc(DEFAULT_SZ, sizeof(PeoInfo));if (ptr == NULL){perror("InitContact::calloc");return;}pc->data = ptr;pc->capacity = DEFAULT_SZ;LoadContact(pc);
}void DestroyContact(Contact* pc)
{free(pc->data);pc->data = NULL;pc->capacity = 0;pc->sz = 0;pc = NULL;
}void check_capacity(Contact* pc)
{if (pc->sz == pc->capacity){PeoInfo* ptr = (PeoInfo*)realloc(pc->data, (pc->capacity + INC_SZ) * sizeof(PeoInfo));if (ptr == NULL){perror("check_capacity::realloc");return;}pc->data = ptr;pc->capacity += INC_SZ;printf("增容成功\n");}
}void AddContact(Contact* pc)
{assert(pc);check_capacity(pc);printf("请输入名字:>");scanf("%s", pc->data[pc->sz].name);printf("请输入年龄:>");scanf("%d", &(pc->data[pc->sz].age));printf("请输入性别:>");scanf("%s", pc->data[pc->sz].sex);printf("请输入地址:>");scanf("%s", pc->data[pc->sz].addr);printf("请输入电话:>");scanf("%s", pc->data[pc->sz].tele);pc->sz++;
}void ShowContact(const Contact* pc)
{assert(pc);int i = 0;printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\n", "名字", "年龄", "性别", "地址", "电话");for (i = 0; i < pc->sz; i++){printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\n", pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].addr,pc->data[i].tele);}
}int FindByName(const Contact* pc, char name[])
{assert(pc);int i = 0;for (i = 0; i < pc->sz; i++){if (strcmp(pc->data[i].name, name) == 0){return i;}}return -1;
}void DelContact(Contact* pc)
{assert(pc);char name[NAME_MAX] = { 0 };if (pc->sz == 0){printf("通讯录为空,无法删除\n");return;}printf("请输入要删除的人的名字:>");scanf("%s", name);int ret = FindByName(pc, name);if (-1 == ret){printf("要删除的人不存在\n");return;}int i = 0;for (i = ret; i < pc->sz - 1; i++){pc->data[i] = pc->data[i + 1];}pc->sz--;printf("删除成功\n");
}void SearchContact(const Contact* pc)
{assert(pc);char name[NAME_MAX] = { 0 };printf("请输入要查找人的名字:>");scanf("%s", name);int pos = FindByName(pc, name);if (-1 == pos){printf("要查找的人不存在\n");return;}printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\n", "名字", "年龄", "性别", "地址", "电话");printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\n", pc->data[pos].name,pc->data[pos].age,pc->data[pos].sex,pc->data[pos].addr,pc->data[pos].tele);
}void ModifyContact(Contact* pc)
{assert(pc);char name[NAME_MAX] = { 0 };printf("请输入要修改人的名字:>");scanf("%s", name);int pos = FindByName(pc, name);if (-1 == pos){printf("要修改的人不存在\n");return;}printf("请输入名字:>");scanf("%s", pc->data[pos].name);printf("请输入年龄:>");scanf("%d", &(pc->data[pos].age));printf("请输入性别:>");scanf("%s", pc->data[pos].sex);printf("请输入地址:>");scanf("%s", pc->data[pos].addr);printf("请输入电话:>");scanf("%s", pc->data[pos].tele);printf("修改完成\n");
}void SaveContact(Contact* pc)
{FILE* pf = fopen("contact.txt", "wb");if (NULL == pf){perror("SaveContact");}else{int i = 0;for (i = 0; i < pc->sz; i++){fwrite(pc->data + i, sizeof(PeoInfo), 1, pf);}fclose(pf);pf = NULL;printf("保存成功\n");}
}void LoadContact(Contact* pc)
{FILE* pf = fopen("contact.txt", "rb");if (pf == NULL){perror("LoadContact");}else{PeoInfo tmp = { 0 };int i = 0;while (fread(&tmp, sizeof(PeoInfo), 1, pf)){check_capacity(pc);pc->data[i] = tmp;pc->sz++;i++;}fclose(pf);pf = NULL;}
}

 

 


http://www.ppmy.cn/news/22707.html

相关文章

【C++学习】基础语法(二)

在C语言中&#xff0c;为了增强代码的复用性、提高性能提出了宏&#xff0c;但宏也存在着调试不方便、没有类型的安全检查、代码可读性差及可维护性差的缺陷。在C中&#xff0c;引入内联函数实现宏定义的功能&#xff08;宏函数&#xff09;&#xff0c;并针对宏定义的缺陷进行…

网络编程-TCP流套接字

专栏简介: JavaEE从入门到进阶 题目来源: leetcode,牛客,剑指offer. 创作目标: 记录学习JavaEE学习历程 希望在提升自己的同时,帮助他人,,与大家一起共同进步,互相成长. 学历代表过去,能力代表现在,学习能力代表未来! 目录 1.Java 流套接字编程模型 2.SeverSocket API 3.So…

【算法基础】冒泡排序解析

作者&#xff1a;柒号华仔 个人主页&#xff1a;欢迎访问我的主页 个人信条&#xff1a;星光不问赶路人,岁月不负有心人。 个人方向&#xff1a;专注于5G领域&#xff0c;同时兼顾其他网络协议&#xff0c;编解码协议&#xff0c;C/C&#xff0c;linux等&#xff0c;感兴趣的小…

【C语言】详细介绍qsort和模拟实现qsort

&#x1f680;write in front&#x1f680; &#x1f4dd;个人主页&#xff1a;认真写博客的夏目浅石. &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd; &#x1f4e3;系列专栏&#xff1a;凡人修C传 &#x1f4ac;总结&#xff1a;希望你看完之后&…

【TypeScript】TS 看这一篇就够了

文章目录&#x1f9d1;‍&#x1f4bb;TypeScript基本概念TypeScript 是什么&#xff1f;为什么要有typescript安装编译 TS 的工具包编译并运行 TS 代码创建基于TS的vue项目&#x1f9d1;‍&#x1f4bb;TypeScript基础类型注解TypeScript类型概述TypeScript原始数据类型数组类…

SSM整合配置

SSM整合配置1. module结构2. pom.xml3. resources3.1 jdbc.properties&#xff1a;4. config4.1 SpringConfig&#xff1a;4.2 JdbcConfig&#xff1a;4.3 MybatisConfig&#xff1a;4.4 SpringMvcConfig&#xff1a;4.5 ServletInitializer&#xff1a;★1. module结构 SSM整…

【数据结构基础】图 - 最小生成树(Prim Kruskal)

Kruskal算法是从最小权重边着手&#xff0c;将森林里的树逐渐合并&#xff1b;prim算法是从顶点出发&#xff0c;在根结点的基础上建起一棵树。最小生成树相关名词连通图: 在无向图中&#xff0c;若任意两个顶点vivi与vjvj都有路径相通&#xff0c;则称该无向图为连通图。强连通…

【Web开发】Python实现Web服务器(CentOS下运行Flask)

文章目录1、简介2、安装2.1 安装Centos2.2 安装python2.3 安装虚拟环境2.4 修改国内源2.5 安装flask库3、测试3.1 flask官方例子结语1、简介 CentOS 大家应该很熟悉了&#xff0c;英文全称&#xff1a;Community Enterprise Operating System&#xff08;社区企业操作系统&…