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

C語言實(shí)現(xiàn)制作通訊錄(新手推薦)

 更新時(shí)間:2022年09月22日 16:43:48   作者:游動(dòng)的木魚  
本文推薦給C語言學(xué)習(xí)到結(jié)構(gòu)體的新手們,供其練習(xí)。這篇文章主要是利用C語言制作一個(gè)簡單的通訊錄功能,感興趣的小伙伴可以跟隨小編一起了解一下

一、本通訊錄要實(shí)現(xiàn)的功能

通訊錄可以用來存儲(chǔ)1000個(gè)人的信息,每個(gè)人的信息包括:姓名、性別、年齡、電話、住址

通訊錄可執(zhí)行的操作如下:

  • 添加聯(lián)系人信息
  • 刪除指定聯(lián)系人信息
  • 查找指定聯(lián)系人信息
  • 修改指定聯(lián)系人信息
  • 顯示所有聯(lián)系人信息
  • 清空所有聯(lián)系人
  • 以名字排序所有聯(lián)系人

二、通訊錄初步準(zhǔn)備:

1.創(chuàng)建一個(gè).c文件,編寫主函數(shù)main;

2.再創(chuàng)建一個(gè).c文件,用于集中存放1中的.c文件所使用到的自定義函數(shù);

3.創(chuàng)建一個(gè).h頭文件,用于申明1中的.c文件所使用到的函數(shù)。

如下圖: 

三、程序編寫

下文將介紹程序的編寫思路:

步驟1、首先根據(jù)通訊錄所包含的信息要求,在頭文件中構(gòu)造結(jié)構(gòu)體PeoIfo,即通訊錄要求包含的信息;再構(gòu)造結(jié)構(gòu)體contact用于儲(chǔ)存多個(gè)聯(lián)系人。(注:本段代碼使用#define是因?yàn)檎麄€(gè)程序中會(huì)多次用到這些數(shù)值,通過#define的方式若后期要修改值,不需要通篇去修改。)

#define MAX 100
#define nameMAX 20
#define sexMAX 10
#define telMAX 20
#define adrMAX 20
 
struct PeoIfo
{
    char name[nameMAX];
    char sex[sexMAX];
    int age;
    char tel[telMAX];
    char adr[adrMAX];
};
 
struct contact
{
    struct PeoIfo data[MAX];
    int sz;
};

步驟2、在第一個(gè).c文件中寫主函數(shù)main(),對(duì)步驟1中所構(gòu)造的結(jié)構(gòu)體進(jìn)行初始化,初始化函數(shù)次數(shù)命名為InitContact(&con)。(注:此處段代碼需要引用頭文件“contact.h”)

#include"contact.h"
 
int main() {
 
    int input = 0;
    struct contact con;
    //初始化
    InitContact(&con);
 
 
 
    return 0;
}

步驟3、在頭文件中申明初始化函數(shù)

//初始化
void InitContact(struct contact* pc);

步驟4、再另外一個(gè).c文件中編寫該初始化函數(shù),使其實(shí)現(xiàn)初始化功能。

//初始化
void InitContact(struct contact* pc)
{
    pc->sz = 0;
    memset(pc->data, 0, MAX * sizeof(struct PeoIfo));
 
}

步驟5、回到主函數(shù)main()中。編寫程序菜單menu(),再編寫Switch語句,對(duì)應(yīng)菜單中的選項(xiàng)。此處以1.add為例,1.add選項(xiàng)為增加聯(lián)系人。

#include"contact.h"
void menu()
{
    printf("*****************************\n");
    printf("****1.add       2.del    ****\n");
    printf("****3.search    4.modify ****\n");
    printf("****5.show      6.empty  ****\n");
    printf("****7.sort      0.exit   ****\n");
    printf("*****************************\n");
}
int main() {
 
    int input = 0;
    struct contact con;
    //初始化
    InitContact(&con);
 
    do
    {
        menu();
        printf("請(qǐng)選擇:");
        scanf("%d", &input);
        switch (input)
        {
        case 1:
            add(&con);
            break;
        case 2:
            del(&con);
            break;
        case 3:
            search(&con);
            break;
        case 4:
            modify(&con);
            break;
        case 5:
            show(&con);
            break;
        case 6:
            InitContact(&con);//直接給他初始化不就清空了。
            break;
        case 7:
            Sort(&con);
            break;
        case 0:
            printf("已退出通訊錄。\n");
            break;
        default:
            printf("輸入錯(cuò)誤,請(qǐng)重新輸入:\n");
            break;
        }
    } while (input);
 
    return 0;
}

步驟6、在.h頭文件中申明函數(shù)

//添加聯(lián)系人
void add(struct contact* pc);

步驟7、在另外一個(gè).c文件中,對(duì)add函數(shù)編寫,使其達(dá)到添加聯(lián)系人的功能。此處介紹一下

pc->data[pc->sz].name的含義,pc->data[i],對(duì)data中的第i個(gè)聯(lián)系人的結(jié)構(gòu)體PeoIfo進(jìn)行解引用,.name便是指該聯(lián)系人的姓名。該段代碼末尾pc->sz++,是指聯(lián)系人+1。

//添加聯(lián)系人
void add(struct contact* pc)
{
    if (pc->sz >= MAX)
    {
        printf("通訊錄已滿。\n");
        return;
    }
    printf("請(qǐng)輸入姓名\n");
    scanf("%s", pc->data[pc->sz].name);
    printf("請(qǐng)輸入性別\n");
    scanf("%s", pc->data[pc->sz].sex);
    printf("請(qǐng)輸入年齡\n");
    scanf("%d", &(pc->data[pc->sz].age));
    printf("請(qǐng)輸入電話\n");
    scanf("%s", pc->data[pc->sz].tel);
    printf("請(qǐng)輸入住址\n");
    scanf("%s", pc->data[pc->sz].adr);
    pc->sz++;    
}

步驟8、同理重復(fù)步驟6、7,實(shí)現(xiàn)剩余的刪除、查找等功能。此處不一一贅述,讀者在學(xué)會(huì)add的編寫之后,建議獨(dú)自進(jìn)行其他功能的函數(shù)實(shí)現(xiàn)思考。

四、完整程序

1、主函數(shù)所在的.c文件原碼

#include"contact.h"
void menu()
{
    printf("*****************************\n");
    printf("****1.add       2.del    ****\n");
    printf("****3.search    4.modify ****\n");
    printf("****5.show      6.empty  ****\n");
    printf("****7.sort      0.exit   ****\n");
    printf("*****************************\n");
}
int main() {
 
    int input = 0;
    struct contact con;
    //初始化
    InitContact(&con);
 
    do
    {
        menu();
        printf("請(qǐng)選擇:");
        scanf("%d", &input);
        switch (input)
        {
        case 1:
            add(&con);
            break;
        case 2:
            del(&con);
            break;
        case 3:
            search(&con);
            break;
        case 4:
            modify(&con);
            break;
        case 5:
            show(&con);
            break;
        case 6:
            InitContact(&con);//直接給他初始化不就清空了。
            break;
        case 7:
            Sort(&con);
            break;
        case 0:
            printf("已退出通訊錄。\n");
            break;
        default:
            printf("輸入錯(cuò)誤,請(qǐng)重新輸入:\n");
            break;
        }
    } while (input);
 
    return 0;
}

2、.h頭文件原碼

#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<stdlib.h>
 
 
#define MAX 100
#define nameMAX 20
#define sexMAX 10
#define telMAX 20
#define adrMAX 20
 
 
struct PeoIfo
{
    char name[nameMAX];
    char sex[sexMAX];
    int age;
    char tel[telMAX];
    char adr[adrMAX];
};
 
struct contact
{
    struct PeoIfo data[MAX];
    int sz;
};
 
//初始化
void InitContact(struct contact* pc);
//添加聯(lián)系人
void add(struct contact* pc);
//刪除聯(lián)系人
void del(struct contact* pc);
//查找聯(lián)系人
void search(struct contact* pc);
//修改聯(lián)系人
void modify(struct contact* pc);
//展示通訊錄
void show(struct contact* pc);
//清空通訊錄
void empty(struct contact* pc);
//按姓名排序
void Sort(struct contact* pc);

3、自定義函數(shù)所在的.c文件原碼

#include"contact.h"
 
//打印項(xiàng)目
void pri()
{
    
    printf("%-15s\t%-10s\t%-10s\t%-10s\t%-20s\n", "姓名", "性別", "年齡", "電話", "住址");
}
 
//查找聯(lián)系人的位置
int FindPOS(const struct contact* pc,char name[])
{
    int i = 0;
    for (i = 0; i < pc->sz; i++)
    {
        if (0==strcmp(pc->data[i].name, name) )
        {
            return i;
        }
    }
    return -1;
}
//初始化
void InitContact(struct contact* pc)
{
    pc->sz = 0;
    memset(pc->data, 0, MAX * sizeof(struct PeoIfo));
 
}
 
//添加聯(lián)系人
void add(struct contact* pc)
{
    if (pc->sz >= MAX)
    {
        printf("通訊錄已滿。\n");
        return;
    }
    printf("請(qǐng)輸入姓名\n");
    scanf("%s", pc->data[pc->sz].name);
    printf("請(qǐng)輸入性別\n");
    scanf("%s", pc->data[pc->sz].sex);
    printf("請(qǐng)輸入年齡\n");
    scanf("%d", &(pc->data[pc->sz].age));
    printf("請(qǐng)輸入電話\n");
    scanf("%s", pc->data[pc->sz].tel);
    printf("請(qǐng)輸入住址\n");
    scanf("%s", pc->data[pc->sz].adr);
    pc->sz++;    
}
 
//刪除聯(lián)系人
void del(struct contact* pc)
{
    printf("請(qǐng)輸入要?jiǎng)h除的聯(lián)系人姓名:\n");
    char delname[nameMAX];
    scanf("%s", &delname);
    int ret=FindPOS(pc, delname);
    if (-1 == ret)
    {
        printf("要?jiǎng)h除的聯(lián)系人不存在\n");
    }
    else
    {
        int i = 0;
        for (i = ret; i < pc->sz - 1; i++)
        {
            pc->data[ret] = pc->data[ret + 1];
        }
        pc->sz--;
        printf("刪除成功\n");
    }
}
 
//查找聯(lián)系人
void search(struct contact* pc)
{
    char sechname[nameMAX];
    printf("請(qǐng)輸入要找的聯(lián)系人:\n");
    scanf("%s", &sechname);
    int ret = FindPOS(pc, sechname);
    if (-1 == ret)
    {
        printf("找不到聯(lián)系人\n");
        return;
    }
    pri();
    printf("%-15s\t%-10s\t%-10d\t%-10s\t%-20s\n",
            pc->data[ret].name,
            pc->data[ret].sex,
            pc->data[ret].age,
            pc->data[ret].tel,
            pc->data[ret].adr);
}
 
 
//修改聯(lián)系人
void modify(struct contact* pc)
{
    printf("請(qǐng)輸入要修改的聯(lián)系人姓名:\n");
    char moname[nameMAX];
    scanf("%s", &moname);
    int ret = FindPOS(pc, moname);
    if (-1 == ret)
    {
        printf("沒有找到聯(lián)系人\n");  
    }
    else
    {
        printf("請(qǐng)輸入姓名\n");
        scanf("%s", pc->data[ret].name);
        printf("請(qǐng)輸入性別\n");
        scanf("%s", pc->data[ret].sex);
        printf("請(qǐng)輸入年齡\n");
        scanf("%d", &(pc->data[ret].age));
        printf("請(qǐng)輸入電話\n");
        scanf("%s", pc->data[ret].tel);
        printf("請(qǐng)輸入住址\n");
        scanf("%s", pc->data[ret].adr);
    }
 
}
 
 
//展示通訊錄
void show(struct contact* pc)
{
    pri();
    int i = 0;
    for (i = 0; i < pc->sz; i++)
    {
        printf("%-15s\t%-10s\t%-10d\t%-10s\t%-20s\n",
            pc->data[i].name,
            pc->data[i].sex,
            pc->data[i].age,
            pc->data[i].tel,
            pc->data[i].adr);
    }
 
}
 
 
//按姓名排序
int compare(void* s1, void* s2)
{
    return strcmp(((struct PeoIfo*)s1)->name, ((struct PeoIfo*)s2)->name);
}
void Sort(struct contact* pc)
{
    qsort(pc->data, pc->sz, sizeof(struct PeoIfo), compare);
}

以上就是C語言實(shí)現(xiàn)制作通訊錄(新手推薦)的詳細(xì)內(nèi)容,更多關(guān)于C語言通訊錄的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C語言?超詳細(xì)順序表的模擬實(shí)現(xiàn)實(shí)例建議收藏

    C語言?超詳細(xì)順序表的模擬實(shí)現(xiàn)實(shí)例建議收藏

    程序中經(jīng)常需要將一組數(shù)據(jù)元素作為整體管理和使用,需要?jiǎng)?chuàng)建這種元素組,用變量記錄它們,傳進(jìn)傳出函數(shù)等。一組數(shù)據(jù)中包含的元素個(gè)數(shù)可能發(fā)生變化,順序表則是將元素順序地存放在一塊連續(xù)的存儲(chǔ)區(qū)里,元素間的順序關(guān)系由它們的存儲(chǔ)順序自然表示
    2022-03-03
  • C/C++淺析鄰接表拓?fù)渑判蛩惴ǖ膶?shí)現(xiàn)

    C/C++淺析鄰接表拓?fù)渑判蛩惴ǖ膶?shí)現(xiàn)

    這篇文章主要介紹了C/C++對(duì)于鄰接表拓?fù)渑判蛩惴ǖ膶?shí)現(xiàn),鄰接表是圖的一種鏈?zhǔn)酱鎯?chǔ)方法,其數(shù)據(jù)結(jié)構(gòu)包括兩部分:節(jié)點(diǎn)和鄰接點(diǎn)
    2022-07-07
  • C++?Qt開發(fā)之使用QNetworkAccessManager實(shí)現(xiàn)Web網(wǎng)頁訪問

    C++?Qt開發(fā)之使用QNetworkAccessManager實(shí)現(xiàn)Web網(wǎng)頁訪問

    Qt?是一個(gè)跨平臺(tái)C++圖形界面開發(fā)庫,利用Qt可以快速開發(fā)跨平臺(tái)窗體應(yīng)用程序,本文主要介紹了如何運(yùn)用QNetworkAccessManager組件實(shí)現(xiàn)Web網(wǎng)頁訪問,需要的可以參考下
    2024-03-03
  • 如何在TC2.0中調(diào)用匯編程序

    如何在TC2.0中調(diào)用匯編程序

    本篇文章介紹了,如何在TC2.0中調(diào)用匯編程序的解決方法。需要的朋友參考下
    2013-05-05
  • 在C++中反射調(diào)用.NET的方法(一)

    在C++中反射調(diào)用.NET的方法(一)

    為什么要在C++中調(diào)用.NET呢?接下來通過本文給大家介紹在C++中反射調(diào)用.NET的方法(一),需要的朋友參考下吧
    2017-02-02
  • C語言細(xì)致講解線程同步的集中方式

    C語言細(xì)致講解線程同步的集中方式

    多線程中的線程同步可以使用,CreateThread,CreateMutex 互斥鎖實(shí)現(xiàn)線程同步,通過臨界區(qū)實(shí)現(xiàn)線程同步,Semaphore 基于信號(hào)實(shí)現(xiàn)線程同步,CreateEvent 事件對(duì)象的同步,以及線程函數(shù)傳遞單一參數(shù)與多個(gè)參數(shù)的實(shí)現(xiàn)方式
    2022-05-05
  • c++11之std::async 和std::thread的區(qū)別小結(jié)

    c++11之std::async 和std::thread的區(qū)別小結(jié)

    std::async和std::thread都是C++11中提供的線程庫,它們都可以用于創(chuàng)建新線程,本文主要介紹了c++11之std::async 和std::thread的區(qū)別小結(jié),感興趣的可以了解一下
    2024-02-02
  • C語言驅(qū)動(dòng)開發(fā)之內(nèi)核解鎖與強(qiáng)刪文件

    C語言驅(qū)動(dòng)開發(fā)之內(nèi)核解鎖與強(qiáng)刪文件

    在某些時(shí)候我們的系統(tǒng)中會(huì)出現(xiàn)一些無法被正常刪除的文件,如果想要強(qiáng)制刪除則需要在驅(qū)動(dòng)層面對(duì)其進(jìn)行解鎖后才可刪掉,本文為大家介紹了內(nèi)核解鎖與強(qiáng)刪文件的方法,希望對(duì)大家有所幫助
    2023-06-06
  • C++實(shí)現(xiàn)二叉樹基本操作詳解

    C++實(shí)現(xiàn)二叉樹基本操作詳解

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)二叉樹基本操作,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • C++獲取硬件參數(shù)的示例詳解

    C++獲取硬件參數(shù)的示例詳解

    這篇文章主要為大家詳細(xì)介紹了如何使用C++獲取硬件參數(shù),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-11-11

最新評(píng)論

图木舒克市| 贡嘎县| 横峰县| 诏安县| 澎湖县| 鸡西市| 阜阳市| 丹凤县| 隆昌县| 连江县| 宝山区| 田林县| 凭祥市| 通山县| 沽源县| 军事| 宜宾市| 睢宁县| 江达县| 涞源县| 封开县| 鸡泽县| 仪征市| 马龙县| 安塞县| 藁城市| 牡丹江市| 阳春市| 尼勒克县| 崇义县| 铜梁县| 洛南县| 永安市| 忻州市| 且末县| 普定县| 尼木县| 商城县| 芜湖市| 盐亭县| 临清市|