C語言實現通訊錄項目

一、通訊錄功能

????????實現一個可以存放100個人的信息的通訊錄(這里采用靜態版本),每個人的信息有姓名、性別、年齡、電話、地址等。

????????通訊錄可以執行的操作有添加聯系人信息、刪除指定聯系人、查找指定聯系人信息、修改指定聯系人信息、顯示聯系人信息、根據聯系人的某些信息(年齡、姓名、電話等)對聯系人進行排序等。

二、代碼

1、測試文件(test.c)

#include "contact.h"
int main()
{int input = 0;Contact con;//創建一個通訊錄對象,內部可以存放100個人的信息ConInit(&con);//初始化通訊錄,一定不能放在循環內部do{int (*p[])(Contact*) = { Add, Del, Search, Modify, Show, Sort };menu();printf("請選擇:");scanf("%d", &input);if (input >= 1 && input <= 6)p[input - 1](&con);else if (input == 0)printf("退出通訊錄\n");elseprintf("輸入錯誤,請重新輸入0~6之間的整數\n");} while (input);return 0;
}

2、通訊錄具體實現(contact.c)

#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");
}//初始化通訊錄
void ConInit(Contact* pc)
{assert(pc);pc->count = 0;memset(pc->data, 0, sizeof(pc->data));
}//查找指定聯系人
int FindByName(Contact* pc, char name[])
{for (int i = 0; i < pc->count; i++)if (0 == strcmp(name, pc->data[i].name))return i;//找到了返回下標return -1;//沒找到返回-1
}//打印聯系人信息
void Print(Contact* pc, int i)
{printf("    %-10s  %-10s  %-10s  %-10s     %-10s\n",pc->data[i].name,pc->data[i].sex,pc->data[i].age,pc->data[i].phone,pc->data[i].address);
}//刪除、查找、修改公共信息
int PubInfor(Contact* pc, int n)
{char name[NAME] = { 0 };const char* arr[] = {"", "", "刪除", "查找", "修改"};//用2個空字符串占位int pos = 0;while (1){printf("請輸入要%s聯系人姓名:", (DEL == n) ? arr[DEL] : ((SEARCH == n) ? arr[SEARCH] : arr[MODIFY]));scanf("%s", name);pos = FindByName(pc, name);if (-1 == pos)printf("待%s聯系人的信息不存在\n", (DEL == n) ? arr[DEL] : ((SEARCH == n) ? arr[SEARCH] : arr[MODIFY]));elsebreak;}return pos;
}//錄入信息
void EnterInfor(Contact* pc, int x)
{int num = -1;const char* arr[] = { "姓名", "性別", "年齡", "電話", "地址" };char* pch[] = { pc->data[x].name, pc->data[x].sex, pc->data[x].age, pc->data[x].phone, pc->data[x].address };while (1){num++;printf("請輸入%s:", arr[num]);scanf("%s", pch[num]);if (4 == num)break;}
}//添加聯系人信息
void Add(Contact* pc)
{assert(pc && (pc->count <= CON));//通訊錄滿,不能增加,空指針不能增加EnterInfor(pc, pc->count);pc->count++;printf("添加成功\n");Show(pc);
}//刪除指定聯系人
void Del(Contact* pc)
{assert(pc && (pc->count != 0));//空通訊錄不能刪int pos = PubInfor(pc, DEL);for (int i = pos; i < pc->count - 1; i++)pc->data[i] = pc->data[i + 1];pc->count--;printf("刪除成功\n");Show(pc);
}//查找指定聯系人信息
void Search(Contact* pc)
{assert(pc && (pc->count != 0));int pos = PubInfor(pc, SEARCH);printf("該聯系人的信息如下\n");printf("    %-10s  %-10s  %-10s  %-10s      %-10s\n", "姓名", "性別", "年齡", "電話", "地址");Print(pc, pos);
}//修改指定聯系人信息
void Modify(Contact* pc)
{assert(pc && (pc->count != 0));int pos = PubInfor(pc, MODIFY);printf("該聯系人的信息如下\n");printf("    %-10s  %-10s  %-10s  %-10s      %-10s\n", "姓名", "性別", "年齡", "電話", "地址");Print(pc, pos);printf("請輸入修改后的信息\n");EnterInfor(pc, pos);printf("修改成功\n");Show(pc);
}//顯示聯系人信息
void Show(const Contact* pc)
{assert(pc);printf("                         通訊錄聯系人的信息如下                         \n");printf("    %-10s  %-10s  %-10s  %-10s      %-10s\n", "姓名", "性別", "年齡", "電話", "地址");for (int i = 0; i < pc->count; i++)Print(pc, i);
}//qsort()函數姓名比較基準
int CmpByName(const void* s1, const void* s2)
{return strcmp(((People*)s1)->name, ((People*)s2)->name);
}//qsort()函數性別比較基準
int CmpBySex(const void* s1, const void* s2)
{return strcmp(((People*)s1)->sex, ((People*)s2)->sex);
}//qsort()函數年齡比較基準
int CmpByAge(const void* s1, const void* s2)
{return strcmp(((People*)s1)->age, ((People*)s2)->age);
}//qsort()函數電話比較基準
int CmpByPhone(const void* s1, const void* s2)
{return strcmp(((People*)s1)->phone, ((People*)s2)->phone);
}//qsort()函數地址比較基準
int CmpByAddress(const void* s1, const void* s2)
{return strcmp(((People*)s1)->address, ((People*)s2)->address);
}//根據聯系人信息對聯系人進行排序
void Sort(Contact* pc)
{assert(pc && (pc->count != 0));printf("*********************************\n");printf("***** 1. name      2. sex   *****\n");printf("***** 3. age       4. phone *****\n");printf("***** 5. address   0. exit  *****\n");printf("*********************************\n");int input = 0;do{int (*p[])(const void*, const void*) = { CmpByName, CmpBySex, CmpByAge, CmpByPhone, CmpByAddress };printf("請選擇排序基準:");scanf("%d", &input);if (input >= 1 && input <= 5){qsort(pc->data, pc->count, sizeof(People), *(p)[input - 1]);break;}else if (0 == input)printf("退出排序\n");elseprintf("輸入錯誤,請重新輸入0~5之間的整數\n");} while (input);if (input != 0){const char* arr[] = { "姓名", "性別", "年齡", "電話", "地址" };printf("按照%s排序成功\n", arr[input - 1]);Show(pc);}
}

3、頭文件(contact.h)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>#define NAME 20
#define SEX 5
#define AGE 3
#define PHONE 12
#define ADDRESS 30
#define CON 100enum CONTACT
{EXIT, ADD, DEL, SEARCH, MODIFY, SHOW, SORT
};typedef struct People
{char name[NAME];       //姓名char sex[SEX];         //性別char age[AGE];         //年齡char phone[PHONE];     //電話char address[ADDRESS]; //地址
}People;typedef struct Contact
{People data[CON];  //創建一個可以存儲信息的結構體數組size_t count;      //count記錄通訊錄中的人員個數
}Contact;void menu();//菜單
void ConInit(Contact* pc);//初始化通訊錄
int FindByName(Contact* pc, char name[]);//查找指定聯系人
void Print(Contact* pc, int i);//打印聯系人信息
int PubInfor(Contact* pc, int n);//刪除、查找、修改公共信息
void EnterInfor(Contact* pc, int x);//錄入信息
void Add(Contact* pc);//添加聯系人信息
void Del(Contact* pc);//刪除指定聯系人
void Search(Contact* pc);//查找指定聯系人信息
void Modify(Contact* pc);//修改指定聯系人信息
void Show(const Contact* pc);//顯示聯系人信息
int CmpByName(const void* s1, const void* s2);//qsort()函數姓名比較基準
int CmpBySex(const void* s1, const void* s2);//qsort()函數性別比較基準
int CmpByAge(const void* s1, const void* s2);//qsort()函數年齡比較基準
int CmpByPhone(const void* s1, const void* s2);//qsort()函數電話比較基準
int CmpByAddress(const void* s1, const void* s2);//qsort()函數地址比較基準
void Sort(Contact* pc);//根據聯系人信息對聯系人進行排序

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/70702.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/70702.shtml
英文地址,請注明出處:http://en.pswp.cn/web/70702.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

HO3D_v3(handposeX-json 格式)數據集-release >> DataBall

注意&#xff1a; 1)為了方便使用&#xff0c;按照 handposeX json 自定義格式存儲 2)使用常見依賴庫進行調用,降低數據集使用難度。 3)部分數據集獲取請加入&#xff1a;DataBall-X數據球(free) 4)完整數據集獲取請加入&#xff1a;DataBall-X數據球(vip) HO3D 數據集官方…

Java線程池入門04

1. 提交任務的兩種方式 executorsubmit 2. executor executor位于Executor接口中 public interface Executor {void executor(Runnable command); }executor提交的是無返回值的任務 下面是一個具體的例子 package LearnThreadPool; import java.util.concurrent.ExecutorSe…

2025-02-26 學習記錄--C/C++-C語言 整數格式說明符

合抱之木&#xff0c;生于毫末&#xff1b;九層之臺&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; C語言 整數格式說明符 【例如 】&#x1f380; &#xff1a;在 C 語言中&#xff0c;%ld 是 printf 或 scanf 等格式化輸入輸出函…

【QT 一 | 信號和槽】

Qt5基本模塊 Qt Creator 中的快捷鍵 ? 注釋&#xff1a;ctrl / ? 運?&#xff1a;ctrl R ? 編譯&#xff1a;ctrl B ? 字體縮放&#xff1a;ctrl 鼠標滑輪 ? 查找&#xff1a;ctrl F ? 整行移動&#xff1a;ctrl shift ?/? ? 幫助?檔&#xff1a;F1 ? 自動…

集成學習方法之隨機森林

隨機森林是一種集成學習算法&#xff0c;它基于決策樹模型&#xff0c;通過構建多個決策樹并將它們的預測結果進行組合&#xff0c;以提高模型的準確性和穩定性。以下是隨機森林的詳細介紹&#xff1a; 原理 隨機森林通過從原始訓練數據中有放回地隨機抽樣&#xff0c;生成多…

react 中,使用antd layout布局中的sider 做sider的展開和收起功能

一 話不多說&#xff0c;先展示效果&#xff1a; 展開時&#xff1a; 收起時&#xff1a; 二、實現代碼如下 react 文件 import React, {useState} from react; import {Layout} from antd; import styles from "./index.module.less"; // 這個是樣式文件&#…

【Java 基礎】-- Java 接口中的 @Public 和 @FunctionalInterface 注解詳解

目錄 Java 接口中的 Public 和 FunctionalInterface 注解詳解 1. 概述 2. Public 注解的作用 3. Public 注解的使用 3.1 基本使用方式 3.2 應用于類和方法 4. FunctionalInterface 注解的作用 4.1 主要作用 4.2 FunctionalInterface 使用示例 4.3 允許默認方法 5. Pu…

go語言環境下載與配置(Windows)

下載 Go下載 - Go語言中文網 - Golang中文社區 建議在D盤中創建文件夾安裝到 D 盤 &#xff0c;方便進行管理&#xff0c;然后進行傻瓜式安裝。 安裝 驗證安裝 go version 安裝成功 配置環境變量 winE --> 右擊此電腦 --> 選擇屬性 --> 高級系統設置 --> 點擊…

nss刷題5(misc)

[HUBUCTF 2022 新生賽]最簡單的misc 打開后是一張圖片&#xff0c;沒有其他東西&#xff0c;分離不出來&#xff0c;看看lsb&#xff0c;紅綠藍都是0&#xff0c;看到頭是png&#xff0c;重新保存為png&#xff0c;得到一張二維碼 掃碼得到flag [羊城杯 2021]簽到題 是個動圖…

OkHttp、Retrofit、RxJava:一文講清楚

一、okHttp的同步和異步請求 Call 是 OkHttp 的核心接口&#xff0c;代表一個已準備好執行的 HTTP 請求。它支持 同步 和 異步 兩種模式&#xff1a; enqueue——>okHttp異步 OkHttpClient client new OkHttpClient();Request request new Request.Builder().url("…

Redis分布式緩存面試題

為什么使用分布式緩存&#xff1f; 1. 提升性能 降低延遲&#xff1a;將數據緩存在離應用更近的地方&#xff0c;減少數據訪問時間。減輕數據庫壓力&#xff1a;緩存頻繁訪問的數據&#xff0c;減少對后端數據庫的請求&#xff0c;提升系統響應速度。 2. 擴展性 水平擴展&a…

基于阿里云PAI平臺快速部署DeepSeek大模型實戰指南

一、DeepSeek大模型&#xff1a;企業級AI應用的新標桿 1.1 為什么選擇DeepSeek&#xff1f; 近期&#xff0c;DeepSeek系列模型憑借其接近GPT-4的性能和開源策略&#xff0c;成為全球開發者關注的焦點。在多項國際評測中&#xff0c;DeepSeek-R1模型在推理能力、多語言支持和…

C++---了解STL

上節學習了模板&#xff0c;那么就得談到C的標準模板庫STL。 C98&#xff1a;以模板方式重寫了C標準庫&#xff0c;引入了STL(標準模板庫)。 1.概念 STL(Standard template Libarary)標準模板庫&#xff1a;是C標準庫的重要組成部分&#xff0c;不僅是一個可復用的組件庫&am…

分享幾款比較常用的接口測試工具

首先&#xff0c;什么是接口呢&#xff1f; 接口一般來說有兩種&#xff0c;一種是程序內部的接口&#xff0c;一種是系統對外的接口。 系統對外的接口&#xff1a;比如你要從別的網站或服務器上獲取資源或信息&#xff0c;別人肯定不會把數據庫共享給你&#xff0c;他只能給你…

Qt layout

文章目錄 Qt layout**關鍵機制****驗證示例****常見誤區****最佳實踐****總結**關鍵點總結&#xff1a;示例代碼說明&#xff1a;結論&#xff1a; Qt layout 在 Qt 中&#xff0c;當調用 widget->setLayout(layout) 時&#xff0c;layout 的父對象會被自動設置為該 widget…

flutter: table calendar筆記

pub dev&#xff1a;table_calendar 3.2.0 我來詳細解釋 TableCalendar 是如何根據不同的 CalendarFormat 來顯示界面的。主要邏輯在 CalendarCore 中實現。 核心邏輯分為以下幾個部分&#xff1a; 頁面數量計算 - _getPageCount 方法根據不同格式計算總頁數&#xff1a; in…

【C++】各個版本新的特性和改進

C 語言自從其誕生以來&#xff0c;經歷了多個版本的更新&#xff0c;每個版本都引入了新的特性和改進&#xff0c;目的是提升語言的表達能力、性能、安全性以及開發效率。下面是各個主要版本&#xff08;從 C98 到 C20&#xff09;的一些關鍵特性。 C98 (1998年) ISO C 標準化…

C++模板與STL七日斬:從工業編程到高效數據管理(工業項目)

模板如何提升工業代碼復用性 實戰項目&#xff1a;創建通用【工業設備容器】模板類 類模板的定義與實例化模板參數默認值 #include <iostream> #include <string> using namespace std;template <typename T string> class IndustrialContainer { priva…

sh腳本把服務器B,服務器C目錄的文件下載到服務器A目錄,添加開機自啟動并且一小時執行一次腳本

腳本邏輯 第一次會下載,第二次比較如果有就不下載 文件已存在&#xff1a; 如果目標目錄中已經存在同名文件&#xff0c;rsync 會比較源文件和目標文件的大小和修改時間。 如果源文件和目標文件的大小和修改時間完全相同&#xff0c;rsync 會跳過該文件&#xff0c;不會重新下載…

云手機如何進行經緯度修改

云手機如何進行經緯度修改 云手機修改經緯度的方法因不同服務商和操作方式有所差異&#xff0c;以下是綜合多個來源的常用方法及注意事項&#xff1a; 通過ADB命令注入GPS數據&#xff08;適用于技術用戶&#xff09; 1.連接云手機 使用ADB工具連接云手機服務器&#xff0c;…