欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言示例講解動(dòng)態(tài)/文件/靜態(tài)功能版本的通訊錄實(shí)現(xiàn)

 更新時(shí)間:2022年07月27日 10:40:03   作者:whispar  
通訊錄是一個(gè)可以記錄親人、好友信息的工具,這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)通訊錄管理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

一、代碼展示

test.c

?使用枚舉類型,使得菜單部分的代碼可讀性更強(qiáng),便于理解

#define _CRT_SECURE_NO_WARNINGS
#include"contact.h"
enum Option
{
    EXIT,
    ADD,
    DEL,
    SEARCH,
    MODIFY,
    SHOW,
    SORT
};
void menu() {
    printf("*******\ 1.add     2.del    /*******\n");
    printf("*******\ 3.search  4.modify /*******\n");
    printf("*******\ 5.show    6.sort   /*******\n");
}
int main(){
    int input = 0;
    Contact con; //通訊錄
    //結(jié)構(gòu)體傳參
    InitContact(&con); //結(jié)構(gòu)體傳參
    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:
            SortContact(&con);
            break;
        case EXIT:
            SaveContact(&con);
            DestroyContact(&con);
            printf("退出通訊錄\n");
            break;
        default:
            printf("選擇錯(cuò)誤\n");
            break;
        }
    } while (input);
    return 0;
}

contact.c

?在contact.c中靜態(tài)的版本無法滿足我們的需求,因此我們在動(dòng)態(tài)的版本當(dāng)中使用realloc函數(shù)就可以做到對動(dòng)態(tài)開辟內(nèi)存大小,我們可以封裝一個(gè)函數(shù)來判斷容量是否足夠,不夠的話進(jìn)行擴(kuò)容。

?在contact.c中文件的版本可以將創(chuàng)建的數(shù)據(jù)存儲(chǔ)在本地,當(dāng)程序退出時(shí),數(shù)據(jù)依然存在,使用文件我們可以將數(shù)據(jù)直接存放在電腦的硬盤上,做到了數(shù)據(jù)的持久化。

#define _CRT_SECURE_NO_WARNINGS 1
?
#include "contact.h"
//靜態(tài)的版本
//void InitContact(Contact* pc)
//{
//  assert(pc);
//  pc->count = 0;
//  memset(pc->data, 0, sizeof(pc->data));
//}
 
void CheckCapacity(Contact* pc)
{
    if (pc->count == pc->capacity)
    {
        PeoInfo* ptr = (PeoInfo*)realloc(pc->data, (pc->capacity + INC_SZ) * sizeof(PeoInfo));
        if (ptr == NULL)
        {
            printf("AddContact::%s\n", strerror(errno));
            return;
        }
        else
            pc->data = ptr;
            pc->capacity += INC_SZ;
            printf("增容成功\n");
    }
}
void LoadContact(Contact* pc)
    FILE* pfRead = fopen("contact.txt", "rb");
    if (pfRead == NULL)
        perror("LoadContact");
        return;
    PeoInfo tmp = { 0 };
    while (fread(&tmp, sizeof(PeoInfo), 1, pfRead) == 1)
        CheckCapacity(pc);
        pc->data[pc->count] = tmp;
        pc->count++;
    fclose(pfRead);
    pfRead = NULL;
//動(dòng)態(tài)的版本
int InitContact(Contact* pc)
    assert(pc);
    pc->count = 0;
    pc->data = (PeoInfo*)calloc(DEFAULT_SZ, sizeof(PeoInfo));
    if (pc->data == NULL)
        printf("InitContact::%s\n", strerror(errno));
        return 1;
    pc->capacity = DEFAULT_SZ;
    //加載文件的信息到通訊錄中
    LoadContact(pc);
    return 0;
void DestroyContact(Contact* pc)
    free(pc->data);
    pc->data = NULL;
//void AddContact(Contact* pc)
//  if (pc->count == MAX)
//  {
//      printf("通訊錄已滿,無法添加\n");
//      return;
//  }
//  //
//  printf("請輸入名字:>");
//  scanf("%s", pc->data[pc->count].name);
//  printf("請輸入年齡:>");
//  scanf("%d", &(pc->data[pc->count].age));
//  printf("請輸入性別:>");
//  scanf("%s", pc->data[pc->count].sex);
//  printf("請輸入電話:>");
//  scanf("%s", pc->data[pc->count].tele);
//  printf("請輸入地址:>");
//  scanf("%s", pc->data[pc->count].addr);
//
//  pc->count++;
//  printf("增加成功\n");
void AddContact(Contact* pc)
    //增容
    CheckCapacity(pc);
    //
    printf("請輸入名字:>");
    scanf("%s", pc->data[pc->count].name);
    printf("請輸入年齡:>");
    scanf("%d", &(pc->data[pc->count].age));
    printf("請輸入性別:>");
    scanf("%s", pc->data[pc->count].sex);
    printf("請輸入電話:>");
    scanf("%s", pc->data[pc->count].tele);
    printf("請輸入地址:>");
    scanf("%s", pc->data[pc->count].addr);
    pc->count++;
    printf("增加成功\n");
void ShowContact(const Contact* pc)
    int i = 0;
    printf("%-20s\t%-5s\t%-5s\t%-12s\t%-30s\n", "名字", "年齡", "性別", "電話", "地址");
    for (i = 0; i < pc->count; i++)
        printf("%-20s\t%-5d\t%-5s\t%-12s\t%-30s\n", pc->data[i].name,
            pc->data[i].age,
            pc->data[i].sex,
            pc->data[i].tele,
            pc->data[i].addr);
static int FindByName(Contact* pc, char name[])
        if (0 == strcmp(pc->data[i].name, name))
            return i;
    return -1;
void DelContact(Contact* pc)
    char name[MAX_NAME] = { 0 };
    if (pc->count == 0)
        printf("通訊錄為空,沒有信息可以刪除\n");
    printf("請輸入要?jiǎng)h除人的名字:>");
    scanf("%s", name);
    //刪除
    //1. 查找
    int pos = FindByName(pc, name);
    if (pos == -1)
        printf("要?jiǎng)h除的人不存在\n");
    //2. 刪除
    for (i = pos; i < pc->count - 1; i++)
        pc->data[i] = pc->data[i + 1];
    pc->count--;
    printf("刪除成功\n");
void SearchContact(Contact* pc)
    printf("請輸入要查找人的名字:>");
        printf("要查找的人不存在\n");
    //2. 打印
    printf("%-20s\t%-5d\t%-5s\t%-12s\t%-30s\n", pc->data[pos].name,
        pc->data[pos].age,
        pc->data[pos].sex,
        pc->data[pos].tele,
        pc->data[pos].addr);
void ModifyContact(Contact* pc)
    printf("請輸入要修改人的名字:>");
        printf("要修改的人不存在\n");
    printf("要修改的人的信息已經(jīng)查找到,接下來開始修改\n");
    //2. 修改
    scanf("%s", pc->data[pos].name);
    scanf("%d", &(pc->data[pos].age));
    scanf("%s", pc->data[pos].sex);
    scanf("%s", pc->data[pos].tele);
    scanf("%s", pc->data[pos].addr);
    printf("修改成功\n");
int cmp_peo_by_name(const void* e1, const void* e2)
    return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
//按照名字來排序
void SortContact(Contact* pc)
    qsort(pc->data, pc->count, sizeof(PeoInfo), cmp_peo_by_name);
    printf("排序成功\n");
void SaveContact(const Contact* pc)
    FILE* pfWrite = fopen("contact.txt", "wb");
    if (pfWrite == NULL)
        perror("SaveContact");
    //寫文件-二進(jìn)制的形式
        fwrite(pc->data + i, sizeof(PeoInfo), 1, pfWrite);
    fclose(pfWrite);
    pfWrite = NULL;

contact.h

#pragma once
#include <string.h>
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#define DEFAULT_SZ 3
#define INC_SZ 2
#define MAX 100
#define MAX_NAME 20
#define MAX_SEX 10
#define MAX_TELE 12
#define MAX_ADDR 30
//類型的聲明
// 
//人的信息
typedef struct PeoInfo
{
    char name[MAX_NAME];
    int age;
    char sex[MAX_SEX];
    char tele[MAX_TELE];
    char addr[MAX_ADDR];
} PeoInfo;
//通訊錄
//靜態(tài)版本
//typedef struct Contact
//{
//  PeoInfo data[MAX];//存放人的信息
//  int count;//記錄當(dāng)前通訊錄中實(shí)際人的個(gè)數(shù)
//}Contact;
//動(dòng)態(tài)的版本
typedef struct Contact
{
    PeoInfo* data;//存放人的信息
    int count;//記錄當(dāng)前通訊錄中實(shí)際人的個(gè)數(shù)
    int capacity;//當(dāng)前通訊錄的容量
}Contact;
//初始化通訊錄
int InitContact(Contact* pc);
//銷毀通訊錄
void DestroyContact(Contact* pc);
//增加聯(lián)系人都通訊錄
void AddContact(Contact* pc);
//打印通訊中的信息
void ShowContact(const Contact* pc);
//刪除指定聯(lián)系人
void DelContact(Contact* pc);
//查找指定聯(lián)系人
void SearchContact(Contact* pc);
//修改指定聯(lián)系人
void ModifyContact(Contact* pc);
//排序通訊錄中內(nèi)容
//按照名字來排序
//按照年齡來排序
//...
void SortContact(Contact* pc);
//保存通訊錄的信息到文件
void SaveContact(const Contact* pc);
//加載文件的信息到通訊錄
void LoadContact(Contact* pc);

二、效果展示

靜態(tài)版本基本功能的實(shí)現(xiàn)

動(dòng)態(tài)版本擴(kuò)容功能的實(shí)現(xiàn)

文件版本保存本地功能實(shí)現(xiàn)

到此這篇關(guān)于C語言示例講解動(dòng)態(tài)/文件/靜態(tài)功能版本的通訊錄實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C語言通訊錄內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言簡單實(shí)現(xiàn)銀行ATM存取款功能

    C語言簡單實(shí)現(xiàn)銀行ATM存取款功能

    這個(gè)是大一時(shí)期寫的。大四的時(shí)候整理了一下(本人C語言學(xué)的也不太好)??隙ê芏嗖蛔愫痛嬖诼┒吹牡胤?、僅供借鑒、僅供借鑒,代碼中有大量注釋,新手看起來也沒有困難
    2021-11-11
  • C++讀取文本文件中的漢字亂碼情況原因及解決

    C++讀取文本文件中的漢字亂碼情況原因及解決

    本文介紹簡體中文Windows操作系統(tǒng)中,C++讀取文本文件中的漢字亂碼情況原因及解決,文中通過代碼和圖文給大家介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下
    2024-01-01
  • C語言淺析指針的使用

    C語言淺析指針的使用

    C語言這門課程在計(jì)算機(jī)的基礎(chǔ)教學(xué)中一直占有比較重要的地位,然而要想突破C語言的學(xué)習(xí),對指針的掌握是非常重要的,本文將具體針對指針的基礎(chǔ)做詳盡的介紹
    2022-07-07
  • C++?右值引用與?const?關(guān)鍵字詳解

    C++?右值引用與?const?關(guān)鍵字詳解

    C++中的const關(guān)鍵字的用法非常靈活,而使用const將大大改善程序的健壯性,const關(guān)鍵字是一種修飾符,這篇文章主要介紹了C++?右值引用與?const?關(guān)鍵字,需要的朋友可以參考下
    2022-10-10
  • c++自定義sort()函數(shù)的排序方法介紹

    c++自定義sort()函數(shù)的排序方法介紹

    這篇文章主要介紹了c++自定義sort()函數(shù)的排序方法介紹,文章通過圍繞主題展開詳細(xì)的內(nèi)容戒殺,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • C語言如何在指針中隱藏?cái)?shù)據(jù)詳解

    C語言如何在指針中隱藏?cái)?shù)據(jù)詳解

    這篇文章主要給大家介紹了關(guān)于C語言如何在指針中隱藏?cái)?shù)據(jù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧
    2018-12-12
  • C++判斷主機(jī)是否處于聯(lián)網(wǎng)狀態(tài)

    C++判斷主機(jī)是否處于聯(lián)網(wǎng)狀態(tài)

    這篇文章主要為大家詳細(xì)介紹了C++判斷主機(jī)是否處于聯(lián)網(wǎng)狀態(tài),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • 淺談C語言的字節(jié)對齊 #pragma pack(n)2

    淺談C語言的字節(jié)對齊 #pragma pack(n)2

    下面小編就為大家?guī)硪黄獪\談C語言的字節(jié)對齊 #pragma pack(n)2。小編覺得挺不錯(cuò)的現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-01-01
  • 淺析如何在c語言中調(diào)用Linux腳本

    淺析如何在c語言中調(diào)用Linux腳本

    如何在c語言中調(diào)用Linux腳本呢?下面小編就為大家詳細(xì)的介紹一下吧!需要的朋友可以過來參考下
    2013-08-08
  • 淺談C++的語句語法與強(qiáng)制數(shù)據(jù)類型轉(zhuǎn)換

    淺談C++的語句語法與強(qiáng)制數(shù)據(jù)類型轉(zhuǎn)換

    這篇文章主要介紹了淺談C++的語句語法與強(qiáng)制數(shù)據(jù)類型轉(zhuǎn)換,是C++入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-09-09

最新評論