学习记录2024/12/25;用C语言实现通讯录功能

ops/2024/12/27 20:27:54/

test.c(测试逻辑)

#define _CRT_SECURE_NO_WARNINGS
#include "contact.h"int main()
{int input = 0;Contact con;InitContact(&con);void (*function[])(Contact*) = { AddContact,DelContact,SearchContact,ModifyContact,ShowContact,SortContact };do{menu();if (scanf("%d", &input) == 1){if (input > 0 && input <= 6){function[input - 1](&con);}else if (input == 0){printf("退出程序\n");}else{printf("输入错误\n");}}else{printf("输入错误\n");while (getchar() != '\n');input = -1;}} while (input);return 0;
}

contact.c(功能实现)

#define _CRT_SECURE_NO_WARNINGS
#include "contact.h"void menu(void)
{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");
}void InitContact(Contact* con)
{memset(con, 0, sizeof(Contact));
}void AddContact(Contact* con)
{assert(con);if (con->count <= MAX){printf("请输入姓名 -> ");scanf("%s", con->contacts[con->count].name);printf("请输入性别 -> ");scanf("%s", con->contacts[con->count].sex);printf("请输入年龄 -> ");scanf("%d", &con->contacts[con->count].age);printf("请输入电话 -> ");scanf("%11s", con->contacts[con->count].tele);printf("请输入地址 -> ");scanf("%s", con->contacts[con->count].address);con->count++;}else{printf("通讯录已满\n");}
}void ShowContact(Contact* con)
{assert(con);if (con->count > 0){printf("%-8s\t%-4s\t%-4s\t%-11s\t%-25s\n", "姓名", "性别", "年龄", "电话", "地址");int i = 0;for (i = 0; i < con->count; i++){printf("%-8s\t%-4s\t%-4d\t%-11s\t%-25s\n",  con->contacts[i].name,con->contacts[i].sex,con->contacts[i].age,con->contacts[i].tele,con->contacts[i].address);}}else{printf("通讯录为空\n");}
}static int Search(Contact* con, char* str)
{assert(con);int i = 0;for (i = 0; i < con->count; i++){if ((strcmp(str, con->contacts[i].name) == 0) || (strcmp(str, con->contacts[i].tele) == 0)){return i;}}return -1;
}void DelContact(Contact* con)
{assert(con);if (con->count > 0){int ret = 0;int i = 0;char tmp_str[NAME_max] = { 0 };printf("请输入姓名或电话:>");scanf("%s", tmp_str);ret = Search(con, tmp_str);if (ret == -1){printf("没有这个人\n");}else {for (i = ret; i < con->count - 1; i++){con->contacts[i] = con->contacts[i + 1];}con->count--;printf("删除成功\n");}}else{printf("联系人为空\n");}
}void SearchContact(Contact* con)
{assert(con);if (con->count > 0){int ret = 0;char tmp_str[NAME_max] = { 0 };printf("请输入姓名或电话:>");scanf("%s", tmp_str);ret = Search(con, tmp_str);if (ret == -1){printf("没有这个人\n");}else{printf("%-8s\t%-4s\t%-4s\t%-11s\t%-25s\n", "姓名", "性别", "年龄", "电话", "地址");printf("%-8s\t%-4s\t%-4d\t%-11s\t%-25s\n", con->contacts[ret].name,con->contacts[ret].sex,con->contacts[ret].age,con->contacts[ret].tele,con->contacts[ret].address);}}else{printf("联系人为空\n");}
}void ModifyContact(Contact* con)
{assert(con);if (con->count > 0){int ret = 0;char tmp_str[NAME_max] = { 0 };printf("请输入姓名或电话:>");scanf("%s", tmp_str);ret = Search(con, tmp_str);if (ret == -1){printf("没有这个人\n");}else{char input = 0;do{printf("%-8s\t%-4s\t%-4s\t%-11s\t%-25s\n", "姓名", "性别", "年龄", "电话", "地址");printf("%-8s\t%-4s\t%-4d\t%-11s\t%-25s\n", con->contacts[ret].name,con->contacts[ret].sex,con->contacts[ret].age,con->contacts[ret].tele,con->contacts[ret].address);printf("           请选择要修改的信息:\n");printf("******************************************\n");printf("******   1.姓名           2.性别    ******\n");printf("******   3.年龄           4.电话    ******\n");printf("******   5.地址           6.全部    ******\n");printf("******            0.取消            ******\n");printf("******************************************\n");while ((input = getchar()) == '\n');switch (input){case '1':printf("修改姓名为:> ");scanf("%s", con->contacts[ret].name);break;case '2':printf("修改性别为:> ");scanf("%s", con->contacts[ret].sex);break;case '3':printf("修改年龄为:> ");scanf("%d", &con->contacts[ret].age);break;case '4':printf("修改电话为:> ");scanf("%11s", con->contacts[ret].tele);break;case '5':printf("修改地址为:> ");scanf("%s", con->contacts[ret].address);break;case '6':printf("修改姓名为:> ");scanf("%s", con->contacts[ret].name);printf("修改性别为:> ");scanf("%s", con->contacts[ret].sex);printf("修改年龄为:> ");scanf("%d", &con->contacts[ret].age);printf("修改电话为:> ");scanf("%11s", con->contacts[ret].tele);printf("修改地址为:> ");scanf("%s", con->contacts[ret].address);break;case '0':printf("取消\n");break;default:printf("输入错误\n");break;}if (input >= '1' && input <= '6'){printf("%-8s\t%-4s\t%-4s\t%-11s\t%-25s\n", "姓名", "性别", "年龄", "电话", "地址");printf("%-8s\t%-4s\t%-4d\t%-11s\t%-25s\n", con->contacts[ret].name,con->contacts[ret].sex,con->contacts[ret].age,con->contacts[ret].tele,con->contacts[ret].address);printf("修改成功!\n");}} while (input < '0' || input>'6');}}else{printf("联系人为空\n");}
}//根据姓名排序
static int cmp_by_name(const void* e1, const void* e2)
{return strcmp(((PeoInfor*)e1)->name, ((PeoInfor*)e2)->name);
}
//根据年龄排序
static int cmp_by_age(const void* e1, const void* e2)
{return ((PeoInfor*)e1)->age - ((PeoInfor*)e2)->age;
}
void SortContact(Contact* con)
{int input = 0;int (*cmp)(const void*, const void*);int (*ArrFun[])(const void*, const void*) = { cmp_by_name , cmp_by_age };do{printf("******************************************\n");printf("******        1.根据姓名排序        ******\n");printf("******        2.根据年龄排序        ******\n");printf("******        0.    取消            ******\n");printf("******************************************\n");if (scanf("%d", &input) == 1){if (input == 1 || input == 2){cmp = ArrFun[input - 1];qsort(con->contacts, con->count, sizeof(con->contacts[0]), cmp);printf("排序完成!\n");}else if (input == 0){printf("取消排序\n");}else{printf("输入错误\n");}}else{printf("输入错误\n");while (getchar() != '\n');input = -1;}} while (input < 0 || input > 2);
}

contact.h(声明部分)

#pragma once
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <stdlib.h>
#include <stddef.h>
#define MAX 100
#define NAME_max 20
#define TELE_max 12
#define SEX_max 10
#define ADDRESS_max 30typedef struct PeopleInformation
{int age;char name[NAME_max];char tele[TELE_max];char sex[SEX_max];char address[ADDRESS_max];
}PeoInfor;typedef struct Contact
{PeoInfor contacts[MAX];size_t count;
}Contact;//打印菜单
void menu(void);//初始化通讯录
void InitContact(Contact* con);//添加联系人
void AddContact(Contact* con);//查看联系人
void ShowContact(Contact* con);//查找联系人
void SearchContact(Contact* con);//删除联系人
void DelContact(Contact* con);//修改联系人
void ModifyContact(Contact* con);//通讯录排序
void SortContact(Contact* con);


http://www.ppmy.cn/ops/145470.html

相关文章

Torch.gather

1.官方文档 2.使用要点 输入index的shape等于输出value的shape输入index的索引值仅替换该index中对应dim的index值最终输出为替换index后在原tensor中的值 最终输出的shape和index的shape相同 根据dim的值 选择将index[i,j,k]这个结果替换input[i,j,k]里面对应的i or j or…

R语言的数据类型

标题&#xff1a;《探索R语言数据类型的奥秘》 引言&#xff1a; 在统计学和数据分析的世界里&#xff0c;R语言无疑是一颗璀璨的明星。它以其强大的数据处理能力和丰富的图形展示功能而受到广泛欢迎。然而&#xff0c;要熟练掌握并高效使用R语言&#xff0c;深入了解其数据类…

典型常见的基于知识蒸馏的目标检测方法总结一

总结来源&#xff1a;TPAMI 2023: When Object Detection Meets Knowledge Distillation: A Survey 收录的方法 [4] NeurIPS 2017: Learning efficient object detection models with knowledge distillation 三种知识蒸馏损失&#xff1a; 第一种&#xff1a;分类子任务的交…

CultureLLM 与 CulturePark:增强大语言模型对多元文化的理解

本文介绍团队刚刚在加拿大温哥华召开的顶会NeurIPS 2024上发表的两篇系列工作&#xff1a;CultureLLM 和CulturePark。此项研究以生成文化数据并训练文化专有模型为主要手段&#xff0c;旨在提升已有基础模型的多文化理解能力&#xff0c;使得其在认知、偏见、价值观、在线教育…

STL源码剖析(侯捷版本) —— 第四章 序列式容器(三)

传送门 STL源码剖析(侯捷版本) —— 第一章 STL 概论与版本简介 STL源码剖析(侯捷版本) —— 第二章 空間配置器 allocator STL源码剖析(侯捷版本) —— 第三章 迭代器(Iterators)与Traits编程技巧在C STL中的应用 STL源码剖析(侯捷版本) —— 第四章 序列式容器&#xff08…

1847. 最近的房间

1847. 最近的房间 题目链接&#xff1a;1847. 最近的房间 代码如下&#xff1a; class Solution { public:vector<int> closestRoom(vector<vector<int>>& rooms, vector<vector<int>>& queries){sort(rooms.begin(), rooms.end(), […

Ubuntu系统下 npm install -g tauri 报错问题处理

处理在安装 Tauri 时遇到的问题&#xff0c;可以按照以下步骤进行操作 npm install -g taurinpm warn deprecated inflight1.0.6: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async …

ChatGPT与Postman协作完成接口测试(三)

如果想要完善接口测试用例&#xff0c;可以依据笔者前面使用的方法&#xff0c;让ChatGPT继续完善测试用例&#xff0c;如关键字过长、特殊字符等接口测试用例。限于篇幅&#xff0c;这里不考虑这些内容。S_PM_WebTours.json文件就是最终的Postman接口测试用例脚本。 接下来笔者…