最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言實現(xiàn)簡單的通訊錄管理系統(tǒng)

 更新時間:2022年06月15日 10:00:42   作者:今天也要寫bug、  
這篇文章主要為大家詳細介紹了C語言實現(xiàn)通訊錄管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了C語言實現(xiàn)通訊錄管理系統(tǒng)的具體代碼,供大家參考,具體內(nèi)容如下

要實現(xiàn)一個通訊錄管理系統(tǒng),需要用到結(jié)構(gòu)體、指針、文件操作、動態(tài)管理等內(nèi)容。

效果展示:

實現(xiàn)思路

通訊錄中的聯(lián)系人包括姓名、年齡、性別、電話、住址,因此可以定義一個結(jié)構(gòu)體PeoInfo來存儲這些信息。

同時,由于通訊錄需要記錄當(dāng)前的大小,以此來方便我們對通訊錄realloc進行擴容,所以需要定義通訊錄結(jié)構(gòu)體Contact來保存這些信息,其中該結(jié)構(gòu)體中可以嵌套一個PeoInfo類型的指針。

當(dāng)定義完結(jié)構(gòu)體以后,就可以對定義的結(jié)構(gòu)體進行增刪查改,其中可以先使用malloc對通訊錄結(jié)構(gòu)體進行初始化,然后再完成添加、刪除、查找、修改、保存、排序、清空等一系列函數(shù)。

在保存時,需要用到文件指針將數(shù)據(jù)保存到文件中,因此在一開始當(dāng)前目錄下需要一個相應(yīng)的文件。
同時在初始化時,也要將文件中的數(shù)據(jù)讀取到我們的結(jié)構(gòu)體指針指向的內(nèi)容中。
在這里使用contact.txt文件來保存信息:

為了方便,我們將函數(shù)聲明,函數(shù)實現(xiàn),以及游戲的實現(xiàn)放到三個不同文件里:

contact.h內(nèi)容

#pragma once
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<errno.h>

#define MAX_NAME 10//名字的大小
#define MAX_SEX 5//性別大小
#define MAX_TELE 15//電話大小
#define MAX_ADDR 30//地址大小
#define DEFAULT_SZ 3 //通訊錄默認的大小

enum Option
{
?? ?EXIT,
?? ?ADD,
?? ?DEL,
?? ?SEARCH,
?? ?MODIFY,
?? ?SHOW,
?? ?SORT,
?? ?SAVE,
?? ?CLEAR
};
struct PeoInfo
{
?? ?char name[MAX_NAME];
?? ?int age;
?? ?char sex[MAX_SEX];
?? ?char tele[MAX_TELE];
?? ?char addr[MAX_ADDR];
};

//通訊錄類型
struct Contact
{
?? ?struct PeoInfo* data;//存放信息
?? ?int size;//記錄當(dāng)前已經(jīng)有的元素個數(shù)
?? ?int capacity;//當(dāng)前通訊錄的最大容量
};

//初始化通訊錄
void InitContact(struct Contact* ps);

//增加通訊錄內(nèi)容
void AddContact(struct Contact* ps);

//打印通訊錄信息
void ShowContact(const struct Contact* ps);

//刪除通訊錄信息
void DelContact(struct Contact* ps);

//查找通訊錄信息
void SearchContact(const struct Contact* ps);

//修改指定聯(lián)系人
void ModifyContact(struct Contact* ps);

//按姓名排序
void SortContact(struct Contact* ps);

//釋放動態(tài)開辟的內(nèi)存
void DestroyContact(struct Contact* ps);

//保存通訊錄
void SaveContact(struct Contact* ps);

//加載文件中的信息到通訊錄
void LoadContact(struct Contact* ps);

//清空通訊錄
void ClearContact(struct Contact* ps);

這個文件中主要包括結(jié)構(gòu)體的創(chuàng)建,以及各種函數(shù)的聲明。

contact.c內(nèi)容

#include"contact.h"

void InitContact(struct Contact* ps)
{
?? ?ps ->data =(struct PeoInfo*) malloc(DEFAULT_SZ * sizeof(struct PeoInfo));
?? ?if (ps->data == NULL)
?? ?{
?? ??? ?printf("空間開辟失敗");
?? ??? ?return;
?? ?}
?? ?ps->size = 0;
?? ?ps->capacity = DEFAULT_SZ;
?? ?//把文件中存放的信息加載到通訊錄中
?? ?LoadContact(ps);
}
void CheckCapacity(struct Contact* ps)
{
?? ?if (ps->size == ps->capacity)
?? ?{
?? ??? ?struct PeoInfo* ptr = (struct PeoInfo*)realloc(ps->data, (ps->capacity + 5) * sizeof(struct PeoInfo));
?? ??? ?if (ptr != NULL)
?? ??? ?{
?? ??? ??? ?ps->data = ptr;
?? ??? ??? ?ps->capacity += 5;
?? ??? ?}
?? ?}
}
void LoadContact(struct Contact* ps)
{
?? ?struct PeoInfo tmp = { 0 };
?? ?FILE* pfRead = fopen("contact.txt", "rb");
?? ?if (pfRead == NULL)
?? ?{
?? ??? ?printf("文件不存在:%s\n", strerror(errno));
?? ??? ?return;
?? ?}
?? ?//讀取文件
?? ?while (fread(&tmp, sizeof(struct PeoInfo), 1, pfRead))
?? ?{
?? ??? ?CheckCapacity(ps);
?? ??? ?ps->data[ps->size] = tmp;
?? ??? ?ps->size++;
?? ?}
?? ?fclose(pfRead);
?? ?pfRead = NULL;
}


void AddContact(struct Contact* ps)
{
?? ?//檢測當(dāng)前通訊錄的容量,如果滿了則增容
?? ?CheckCapacity(ps);
?? ?printf("請輸入名字->");
?? ?scanf("%s", ps->data[ps->size].name);
?? ?printf("請輸入年齡->");
?? ?scanf("%d", &(ps->data[ps->size].age));
?? ?printf("請輸入性別->");
?? ?scanf("%s", ps->data[ps->size].sex);
?? ?printf("請輸入電話->");
?? ?scanf("%s", ps->data[ps->size].tele);
?? ?printf("請輸入地址->");
?? ?scanf("%s", ps->data[ps->size].addr);
?? ?
?? ?ps->size++;
?? ?printf("添加成功\n");
?? ?
}

void ShowContact(const struct Contact* ps)
{
?? ?if (ps->size == 0)
?? ?{
?? ??? ?printf("通訊錄為空\n");

?? ?}
?? ?else
?? ?{
?? ??? ?int i = 0;
?? ??? ?printf("%-10s\t%-4s\t%-5s\t%-12s\t%-20s\n", "名字", "年齡", "性別", "電話", "地址");
?? ??? ?{
?? ??? ??? ?for (i = 0; i < ps->size; i++)//打印每個通訊錄元素
?? ??? ??? ?{
?? ??? ??? ??? ?printf("%-10s\t%-4d\t%-5s\t%-12s\t%-20s\n",?
?? ??? ??? ??? ??? ?ps->data[i].name, ps->data[i].age, ps->data[i].sex,?
?? ??? ??? ??? ??? ?ps->data[i].tele, ps->data[i].addr);
?? ??? ??? ?}
?? ??? ?}
?? ?}
}
//查找聯(lián)系人位置
int FindByName(const struct Contact* ps, char name[MAX_NAME])
{
?? ?//查找要刪除人的位置
?? ?int i = 0;
?? ?for (i = 0; i < ps->size; i++)
?? ?{
?? ??? ?if (0 == strcmp(ps->data[i].name, name))
?? ??? ?{
?? ??? ??? ?return i;//找到返回下標(biāo)
?? ??? ?}
?? ?}
?? ?return -1;//找不到返回-1
}

void DelContact(struct Contact* ps)
{
?? ?char name[MAX_NAME];
?? ?printf("請輸入要刪除人的名字:->");
?? ?scanf("%s", name);
?? ?//查找要刪除人的位置
?? ?int pos=FindByName(ps, name);//找到返回名字所在的下標(biāo),找不到返回-1
?? ?
?? ?if (pos==-1)
?? ?{
?? ??? ?printf("聯(lián)系人不存在\n");
?? ?}
?? ?else
?? ?{
?? ??? ?//刪除
?? ??? ?int j = 0;
?? ??? ?for (j = pos; j < ps->size-1; j++)
?? ??? ?{
?? ??? ??? ?ps->data[j] = ps->data[j + 1];
?? ??? ?}
?? ??? ?ps->size--;
?? ??? ?printf("刪除成功\n");
?? ?}

}

void SearchContact(const struct Contact* ps)
{
?? ?char name[MAX_NAME];
?? ?printf("請輸入要查找人的名字:->");
?? ?scanf("%s", name);
?? ?int pos = FindByName(ps, name);//找到返回名字所在的下標(biāo),找不到返回-1
?? ?if (pos == -1)
?? ?{
?? ??? ?printf("聯(lián)系人不存在\n");
?? ?}
?? ?else
?? ?{
?? ??? ?printf("%-10s\t%-4s\t%-5s\t%-12s\t%-20s\n", "名字", "年齡", "性別", "電話", "地址");?? ??? ?
?? ??? ?printf("%-10s\t%-4d\t%-5s\t%-12s\t%-20s\n",
?? ??? ? ps->data[pos].name, ps->data[pos].age, ps->data[pos].sex,
?? ??? ? ps->data[pos].tele, ps->data[pos].addr);
?? ??? ??? ?
?? ?}?? ??? ?
}

void ModifyContact(struct Contact* ps)
{
?? ?char name[MAX_NAME];
?? ?printf("請輸入要修改人的名字:->");
?? ?scanf("%s", name);
?? ?int pos = FindByName(ps, name);//找到返回名字所在的下標(biāo),找不到返回-1
?? ?if (pos == -1)
?? ?{
?? ??? ?printf("聯(lián)系人不存在\n");
?? ?}
?? ?else
?? ?{
?? ??? ?printf("請輸入名字->");
?? ??? ?scanf("%s", ps->data[pos].name);
?? ??? ?printf("請輸入年齡->");
?? ??? ?scanf("%d", &(ps->data[pos].age));
?? ??? ?printf("請輸入性別->");
?? ??? ?scanf("%s", ps->data[pos].sex);
?? ??? ?printf("請輸入電話->");
?? ??? ?scanf("%s", ps->data[pos].tele);
?? ??? ?printf("請輸入地址->");
?? ??? ?scanf("%s", ps->data[pos].addr);

?? ??? ?printf("修改完成\n");
?? ?}
}

void SortContact(struct Contact* ps)
{
?? ?for (int i = 0; i < ps->size - 1; ++i)
?? ?{
?? ??? ?for (int j = 0; j < ps->size - i - 1; ++j)
?? ??? ?{
?? ??? ??? ?if (strcmp(ps->data[j].name, ps->data[j + 1].name) > 0)
?? ??? ??? ?{
?? ??? ??? ??? ?struct PeoInfo tmp = ps->data[j];
?? ??? ??? ??? ?ps->data[j] = ps->data[j + 1];
?? ??? ??? ??? ?ps->data[j + 1] = tmp;
?? ??? ??? ?}
?? ??? ?}
?? ?}
?? ?printf("按姓名排序成功\n");
}

//釋放動態(tài)開辟的空間
void DestroyContact(struct Contact* ps)
{
?? ?free(ps->data);
?? ?ps->data=NULL;
}


void SaveContact(struct Contact* ps)
{
?? ?FILE* pfWrite = fopen("contact.txt", "wb");
?? ?if (pfWrite == NULL)
?? ?{
?? ??? ?printf("%s\n", strerror(errno));
?? ??? ?return;
?? ?}
?? ?//將通訊錄的信息寫入文件
?? ?int i = 0;
?? ?for (i = 0; i < ps->size; i++)
?? ?{
?? ??? ?fwrite(&(ps->data[i]), sizeof(struct PeoInfo), 1, pfWrite);
?? ?}
?? ?printf("保存成功\n");
?? ?fclose(pfWrite);
?? ?pfWrite = NULL;
}

void ClearContact(struct Contact* ps)
{
?? ?printf("確定要清空通訊錄嗎?<Y/N> :>");
?? ?char ch;
?? ?getchar();//清空緩存區(qū)里面的\n
?? ?scanf("%c", &ch);
?? ?if (ch == 'Y' || ch == 'y')
?? ?{
?? ??? ?ps->size = 0;
?? ??? ?memset(ps->data, 0, sizeof(ps->data));
?? ??? ?printf("清空成功\n");
?? ?}
?? ?else
?? ?{
?? ??? ?printf("取消清空\n");
?? ?}
?? ?
}

在這個文件中我們將聲明的函數(shù)進行了定義,用到的方法都比較簡單。

test.c內(nèi)容

#include"contact.h"
void menu()
{
?? ?printf("**************************************************\n");
?? ?printf("****1.添加聯(lián)系人 ? ? ? ?2.刪除聯(lián)系人**************\n");
?? ?printf("****3.查找聯(lián)系人 ? ? ? ?4.修改聯(lián)系人*************\n");
?? ?printf("****5.展示所有聯(lián)系人 ? ?6.按姓名排序聯(lián)系人********\n");
?? ?printf("****7.保存通訊錄 ? ? ? ?8.清空通訊錄*************\n");
?? ?printf("**************0.退出通訊錄************************\n");
?? ?printf("**************************************************\n");
}


int main()
{
?? ?int input = 0;
?? ?//創(chuàng)建通訊錄
?? ?int size = 0;
?? ?struct Contact con;//con是通訊錄
?? ?//初始化通訊錄
?? ?InitContact(&con);

?? ?do
?? ?{
?? ??? ?menu();
?? ??? ?printf("請選擇->");
?? ??? ?scanf("%d", &input);
?? ??? ?switch (input)
?? ??? ?{
?? ??? ?case ADD:
?? ??? ??? ?AddContact(&con);
?? ??? ??? ?system("pause");
?? ??? ??? ?system("cls");
?? ??? ??? ?break;
?? ??? ?case DEL:
?? ??? ??? ?DelContact(&con);
?? ??? ??? ?system("pause");
?? ??? ??? ?system("cls");
?? ??? ??? ?break;
?? ??? ?case SEARCH:
?? ??? ??? ?SearchContact(&con);
?? ??? ??? ?system("pause");
?? ??? ??? ?system("cls");
?? ??? ??? ?break;
?? ??? ?case MODIFY:
?? ??? ??? ?ModifyContact(&con);
?? ??? ??? ?system("pause");
?? ??? ??? ?system("cls");
?? ??? ??? ?break;
?? ??? ?case SHOW:
?? ??? ??? ?ShowContact(&con);
?? ??? ??? ?system("pause");
?? ??? ??? ?system("cls");
?? ??? ??? ?break;
?? ??? ?case SORT:
?? ??? ??? ?SortContact(&con);
?? ??? ??? ?system("pause");
?? ??? ??? ?system("cls");
?? ??? ??? ?break;
?? ??? ?case SAVE:
?? ??? ??? ?SaveContact(&con);
?? ??? ??? ?system("pause");
?? ??? ??? ?system("cls");
?? ??? ??? ?break;
?? ??? ?case CLEAR:
?? ??? ??? ?ClearContact(&con);
?? ??? ??? ?system("pause");
?? ??? ??? ?system("cls");
?? ??? ??? ?break;
?? ??? ?case EXIT:
?? ??? ??? ?SaveContact(&con);
?? ??? ??? ?//釋放動態(tài)開辟的內(nèi)存
?? ??? ??? ?DestroyContact(&con);
?? ??? ??? ?break;
?? ??? ?default:
?? ??? ??? ?printf("選擇錯誤\n");
?? ??? ??? ?break;
?? ??? ?}
?? ?} while (input);
}

在這個文件中將對菜單進行打印,同時進行函數(shù)的調(diào)用。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C語言應(yīng)用領(lǐng)域分析

    C語言應(yīng)用領(lǐng)域分析

    在本篇文章里小編給各位分享的是關(guān)于C語言應(yīng)用領(lǐng)域分析內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2020-03-03
  • C++?STL容器與函數(shù)謂詞示例分析講解

    C++?STL容器與函數(shù)謂詞示例分析講解

    這篇文章主要介紹了C++?STL容器與函數(shù)謂詞示例,STL是“Standard?Template?Library”的縮寫,中文譯為“標(biāo)準(zhǔn)模板庫”。STL是C++標(biāo)準(zhǔn)庫的一部分,不用單獨安裝
    2022-11-11
  • MATLAB全網(wǎng)最全的colormap的使用教程詳解

    MATLAB全網(wǎng)最全的colormap的使用教程詳解

    眾所周知,MATLAB中的colormap只有少得可憐的幾種,有很多應(yīng)用在很特殊的圖形中的colormap幾乎都沒有,而每次寫代碼都要去找顏色的圖屬實太麻煩。所以本文將包全部集成了進來,終于有了這套包含200個colormap的工具函數(shù),希望對大家有所幫助
    2023-02-02
  • C++20中std::format的示例代碼

    C++20中std::format的示例代碼

    本文詳細介紹了C++20中std::format的功能、使用方法和高級應(yīng)用,包括基本用法、數(shù)字和文本的格式化、日期和時間的處理、自定義類型的格式化等,感興趣的可以了解一下
    2024-10-10
  • VC++編程獲取窗口句柄的方法小結(jié)

    VC++編程獲取窗口句柄的方法小結(jié)

    這篇文章主要介紹了VC++編程獲取窗口句柄的方法,簡單總結(jié)分析了VC++獲取窗口句柄的常見函數(shù)與使用技巧,需要的朋友可以參考下
    2017-07-07
  • C++中的最小生成樹算法超詳細教程

    C++中的最小生成樹算法超詳細教程

    這篇文章主要介紹了C++中的最小生成樹算法超詳細教程,最小生成樹的最著名的算法有兩個, 一個是Prim算法, 另一個當(dāng)然就是Kruskal算法, 接下來, 我將盡我所能的介紹這兩個算法, 也算是對自己學(xué)習(xí)的一個回顧吧,需要的朋友可以參考下
    2023-08-08
  • 講解C++中的枚舉類型以及聲明新類型的方法

    講解C++中的枚舉類型以及聲明新類型的方法

    這篇文章主要介紹了講解C++中的枚舉類型以及聲明新類型的方法,是C預(yù)言入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-09-09
  • 詳解C++中常用的四種類型轉(zhuǎn)換方式

    詳解C++中常用的四種類型轉(zhuǎn)換方式

    這篇文章主要為大家詳細介紹了C++中常用的四種類型轉(zhuǎn)換方式:static_cast<Type>、dynamic_cast<Type>、const_case<Type>和reinterpret_cast,感興趣的可以了解一下
    2022-08-08
  • 手把手帶你學(xué)習(xí)C++的運算符

    手把手帶你學(xué)習(xí)C++的運算符

    這篇文章主要為大家介紹了C++運算符,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助,希望能夠給你帶來幫助
    2021-11-11
  • Linux中利用c語言刪除某個目錄下的文件

    Linux中利用c語言刪除某個目錄下的文件

    這篇文章主要給大家介紹了Linux中利用c語言刪除某個目錄下文件的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01

最新評論

井冈山市| 龙山县| 平定县| 义马市| 嘉黎县| 尖扎县| 闵行区| 中牟县| 双牌县| 阳新县| 贵州省| 库车县| 蛟河市| 靖安县| 鸡西市| 健康| 万荣县| 湾仔区| 晋宁县| 渝中区| 县级市| 南漳县| 建湖县| 板桥市| 定安县| 嘉善县| 东乌珠穆沁旗| 临邑县| 新宁县| 阿尔山市| 新民市| 西华县| 庆城县| 隆昌县| 大连市| 齐河县| 水城县| 图木舒克市| 桦南县| 上饶县| 三台县|