一個簡易的通信錄的實現

此次依舊是按照一個正經的工程的來進行搭建

第一步固然是先建立對應的頭文件,函數實現文件,測試文件。ide


主函數


#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"
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");
}

int main()
{
    int input = 0;

    Contact con;//建立通信錄
    //存放1000人的信息
    //包含計數用的size

    //初始化通信錄
    InitContact(&con);
    int sz = sizeof(con.date) / sizeof(con.date[0]);

    do
    {
        menu();
        printf("請選擇:>\n");
        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:
            printf("退出通信錄\n");
            break;
        default:
            printf("非法輸入,請從新輸入\n");
            break;
        }
    } while (input);
    return 0;
}

這個通信錄裏包含增刪查改以及排序的功能,主要用到告終構體,由於咱們在通信錄裏存進一我的的信息要有,姓名,年齡,電話,住址,性別。因此建立一個結構體類型,叫聯繫人信息,裏面包含以上信息函數


頭文件


typedef struct PeoInfo
{
    int age;
    char name[MAX_NAME];
    char sex[MAX_SEX];
    char tele[MAX_TELE];
    char addr[MAX_ADDR];
}PeoInfo;

而後咱們再建立一個結構體,裏面包含若干聯繫人信息,而且有一個數字可以記錄聯繫人的個數,以下測試

typedef struct Contact
{
    PeoInfo date[MAX];//可以存儲1000個好友信息
    int size;
}Contact;

這些都在頭文件中,固然還定義了各類細節的東西,其中會有註釋
頭文件以下code

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAX 1000
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_TELE 12
#define MAX_ADDR 30

typedef struct PeoInfo
{
    int age;
    char name[MAX_NAME];
    char sex[MAX_SEX];
    char tele[MAX_TELE];
    char addr[MAX_ADDR];
}PeoInfo;

typedef struct Contact
{
    PeoInfo date[MAX];//可以存儲1000個好友信息
    int size;
}Contact;

enum Option
{
    EXIT,   //0
    ADD,    //1
    DEL,    //2
    SEARCH, //3
    MODIFY, //4
    SHOW,   //5
    SORT    //6
};

void InitContact (Contact*);//初始化通信錄

void AddContact (Contact*);//添加一位聯繫人

void ShowContact (const Contact*);//打印通信錄

void DelContact (Contact*);//刪除一位聯繫人

void SearchContact (const Contact*);//查找一位聯繫人

void ModifyContact (Contact*);//修改一位聯繫人

void SortContact (Contact*);//對聯繫人排序

包含了全局變量的聲明,還有函數的聲明,還有一個比較有意思的點,運用了枚舉法,將主函數中的switch中的選項代替,這樣就能更清晰的看到每個選擇對應的意思了,不用再閱讀的時候還要上去看菜單排序


函數實現部分


#define _CRT_SECURE_NO_WARNINGS 1

#include "contact.h"

/*查找功能
找到了返回下標,沒找到返回-1
計入static使得該函數只能在這個源文件內部使用,避免與其餘源文件內部產生衝突*/
 static int find_by_name(Contact* ps, char name[MAX_NAME])
{
    int i = 0;
    for (i = 0; i < ps->size; i++)
    {
        if (0 == strcmp(name, ps->date->name))
        {
            return i;
        }
    }
    return -1;
}

//通信錄的初始化
void InitContact (Contact* ps)
{
    //使用內存修改函數
    memset(ps->date, 0, sizeof(ps->date));
    ps->size = 0;
}

//增長一位好友信息
void AddContact(Contact* ps)
{
    if (ps->size>=MAX)
    {
        printf("通信錄已滿\n");
    }
    else
    {
        printf("請輸入姓名:");
        scanf("%s", ps->date[ps->size].name);
        printf("請輸入性別:");
        scanf("%s", ps->date[ps->size].sex);
        printf("請輸入年齡:");
        scanf("%d", &(ps->date[ps->size].age));
        printf("請輸入電話:");
        scanf("%s", ps->date[ps->size].tele);   
        printf("請輸入住址:");
        scanf("%s", ps->date[ps->size].addr);

        ps->size++;
    }
    printf("添加成功\n\a");
}

//打印通信錄中的信息
void ShowContact(const Contact* ps)
{
    if (ps->size == 0)
    {
        printf("通信錄爲空\n");
    }
    else
    {
        printf("%-20s\t%-10s\t%-5s\t%-20s\t%-20s\n", "姓名", "性別", "年齡", "電話", "住址");
        int i = 0;
        for (i = 0; i < ps->size; i++)
        {
            printf("%-20s\t%-10s\t%-5d\t%-20s\t%-20s\n",
                ps->date[i].name,
                ps->date[i].sex,
                ps->date[i].age,
                ps->date[i].tele,
                ps->date[i].addr);
        }
    }
}

//刪除一位制定聯繫人
void DelContact(Contact* ps)
{
    char name[MAX_NAME];
    printf("請輸入須要刪除的聯繫人:\n");
    scanf("%s", name);
    //先要找到須要刪除的聯繫人
    int pos = find_by_name(ps, name);
    if (pos==-1)
    {
        printf("不存在該聯繫人\n");
    }
    else
    {
        //刪除數據
        int j = 0;
        for (j = pos; j < ps->size - 1; j++)
        {
            ps->date[j] = ps->date[j + 1];
        }
        ps->size--;
        printf("刪除成功\n\a");
    }
}

//查找一位聯繫人
void SearchContact(const Contact* ps)
{
    printf("請輸入一位聯繫人信息進行查找:");
    char name[MAX_NAME];
    scanf("%s", name);
    int pos = find_by_name(ps, name);
    if (-1 == pos)
    {
        printf("不存在該聯繫人\n\a");
    }
    else
    {
        printf("%-20s\t%-10s\t%-5s\t%-20s\t%-20s\n", "姓名", "性別", "年齡", "電話", "住址");
        printf("%-20s\t%-10s\t%-5d\t%-20s\t%-20s\n",
                ps->date[pos].name,
                ps->date[pos].sex,
                ps->date[pos].age,
                ps->date[pos].tele,
                ps->date[pos].addr);

    }
}

//修改一位聯繫人的信息
void  ModifyContact(Contact* ps)
{
    char name[MAX_NAME];
    printf("請輸入想要修改的聯繫人:");
    scanf("%s", name);
    int pos = find_by_name(ps, name);
    if (-1 == pos)
    {
        printf("不存在該聯繫人\a\n");
    }
    else
    {
        printf("請輸入姓名:");
        scanf("%s", ps->date[pos].name);
        printf("請輸入性別:");
        scanf("%s", ps->date[pos].sex);
        printf("請輸入年齡:");
        scanf("%d", &(ps->date[pos].age));
        printf("請輸入電話:");
        scanf("%s", ps->date[pos].tele);
        printf("請輸入住址:");
        scanf("%s", ps->date[pos].addr);
    }
    printf("修改爲功\a\n");
}

//對聯繫人進行排序
static int cmp_by_name(const void* e1, const void* e2)
{
    return strcmp(((Contact*)e1)->date->name, ((Contact*)e2)->date->name);
}
void SortContact(Contact* ps)
{
    qsort(ps, ps->size,sizeof(ps->date[0]) , cmp_by_name);
    ShowContact(ps);
}

其中排序的函數所有由本人獨立完成,其他的都是在老師的指導下,理解,完成的,而後對於qsort函數有了更深的理解,對於參數也有了更深的理解,其實本身寫的時候仍是試探了好幾遍,參數改來改去,按照姓名首字母排序,最終完成。
目前的不足就是在程序退出以後,信息就會丟失,就像是一個一次性的通信錄,並不具有實用性,目前尚未相關的知識可以支撐我作出一個能存儲在電腦上信息的通信錄,不事後期應該會學到。內存

相關文章
相關標籤/搜索