黑馬程序員----C語言學習筆記之學習總結《通訊錄》程序實現

------Java培訓、Android培訓、iOS培訓、.Net培訓--------
《通訊錄》功能展示
跟着視頻自學了一個星期C語言,今天終於搞定了,花了四個小時終於把這個小程序搞定了,也許還有很多bug,不過目前重大bug都搞定了,希望大家多多指出我的錯誤,或者不合適的地方,共同學習

1、操作界面及框架
1)引入頭文件
2)進行必要地宏定義
3)定義文件名稱變量、聯繫人數組、聯繫人結構體
4)定義函數、並進行函數聲明
5)編寫循環控制程序
6)顯示操作界面
7)根據選擇編號執行不同的函數
2、代碼實現

主要有三個文件:Contact.h、Contact.c 和main.c

1)Contact.h主要用來聲明要用到的函數和全局變量
//
//  Contact.h
//  ContactDemo
//
//  Created by amos on 10/2/15.
//  Copyright (c) 2015 augmentum. All rights reserved.
//

#ifndef ContactDemo_Contact_h
#define ContactDemo_Contact_h

//定義聯繫人姓名最大長度
#define NAME_LEN 25

//定義聯繫人電話號碼最大長度
#define PHONE_NUMBER_LEN 12

//定義聯繫人列表長度
#define LIST_LEN 100

//聲明聯繫人保存的文件名
char *filePath;

//聲明聯繫人的總個數
int totalContacts;

/**
 *  定義通訊錄結構體
 */

typedef struct {
    int num; //編號
    char name[NAME_LEN]; //姓名
    char phoneNumber[PHONE_NUMBER_LEN]; //電話號碼
    
} Contact;


//定義聯繫人列表
Contact list[LIST_LEN];

/**
 *  增加聯繫人
 */
void doAdd();

/**
 *  根據姓名刪除聯繫人,num用於指定要刪除的聯繫人編號
 */
void doDelete(char name[]);

/**
 *  修改聯繫人
 */
void doUpdateByName(char name[]);

/**
 *  根據姓名查詢聯繫人,返回聯繫人的編號
 */
int doSearchByName(char name[]);

/**
 *  顯示功能選項
 */
void doShowMenu();

/**
 *  退出系統
 */
void doExitSystem();

/**
 *  選擇功能
 */
void doSwitchFunction(char operation);

/**
 *  寫入聯繫人信息到文件中
 *  num用於指定要刪除的聯繫人編號

 */
void doWriteToFile(Contact list[], int num);

/**
 *  從文件中獲取所有聯繫人信息到聯繫人列表中
 */
void doGetAllInfo();

#endif

2)Contact.c 文件主要用來實現聲明的函數和初始化全局變量

//
//  Contact.c
//  ContactDemo
//
//  Created by amos on 10/2/15.
//  Copyright (c) 2015 augmentum. All rights reserved.
//

#include <stdio.h>
#include <string.h>
#include "Contact.h"

//定義並初始化聯繫人保存的文件名
char *filePath = "contactList.data";

//定義並初始化聯繫人的總個數
int totalContacts = 0;


/**
 *  增加聯繫人
 */
void doAdd(){
    
    printf("增加聯繫人!\n");
    
    printf("請輸入聯繫人姓名(不要有空格):");
    scanf("%s", list[totalContacts].name);
    printf("請輸入聯繫人電話號碼(不要有空格):");
    scanf("%s", list[totalContacts].phoneNumber);

    //自動給該聯繫人編號
    list[totalContacts].num = totalContacts;
    
    totalContacts++;
    doWriteToFile(list, -2);
}

/**
 *  刪除聯繫人
 */
void doDelete(char name[]){
    //修改之前先打印該聯繫人的信息
    int num = doSearchByName(name);
    
    if (-1 == num) {
        return;
    }
    
    printf("確定要刪除嗎(y/n)");
    
    char ch = getchar();
    
    while (ch == '\n') {
        ch = getchar();
    }
    getchar();
    //如果輸入了Y那麼執行刪除
    if ('y' == ch || 'Y' == ch) {
        doWriteToFile(list, num);
    }
}
/**
 *  修改聯繫人
 */
void doUpdateByName(char name[]){
    //修改之前先打印該聯繫人的信息
    int num = doSearchByName(name);
    
    if (-1 == num) {
        return;
    }
    
    printf("請輸入聯繫人姓名(不要有空格):");
    scanf("%s", list[num].name);
    printf("請輸入聯繫人電話號碼(不要有空格):");
    scanf("%s", list[num].phoneNumber);
    doWriteToFile(list, -2);
}
/**
 *  根據姓名查詢聯繫人,返回聯繫人的編號
 */
int doSearchByName(char name[]){
    int num = -1;
    doGetAllInfo();
    
    if (0 == totalContacts) {
        printf("沒有該聯繫人....");
        return -1;
    }

    
    for (int i = 0; i < totalContacts; i++) {
        if (strcmp(list[i].name, name) == 0) {
            num = i;
            printf("編號\t|\t姓名\t|\t電話號碼\n");
            printf("%d\t|\t%s\t|\t%s\n", list[i].num, list[i].name, list[i].phoneNumber);
            break;
        }
    }
    
    if (-1 == num) {
        printf("沒有該聯繫人....");
    }
    
    return num;
}

/**
 *  顯示所有聯繫人的信息
 */
void doShowAllInfo(){
    
    //顯示信息之前,先從文件中獲取所有聯繫人的信息
    doGetAllInfo();
    
    if (0 == totalContacts) {
        printf("暫無聯繫人,請添加聯繫人....");
        return;
    }
    
    printf("編號\t|\t姓名\t|\t電話號碼\n");
    for (int i = 0; i < totalContacts; i++) {
        printf("%d\t|\t%s\t|\t%s\n", list[i].num, list[i].name, list[i].phoneNumber);
    }
}

/**
 *  顯示功能選項
 */
void doShowMenu(){
    
    //打印菜單
    printf("\n\n*****************菜 單******************\n");
    printf("****    1、顯示所有聯繫人信息          ****\n");
    printf("****    2、根據名字查詢聯繫人信息       ****\n");
    printf("****    3、修改聯繫人信息             ****\n");
    printf("****    4、增加聯繫人                ****\n");
    printf("****    5、刪除聯繫人                ****\n");
    printf("****    6、退出系統                  ****\n");
    printf("\n請選擇用數字選擇功能:");
}

/**
 *  退出系統
 */
void doExitSystem(){
    printf("正在退出系統.......");
    exit(0);
}

/**
 *  選擇功能:根據用戶輸入的選項調用相應的功能
 */
void doSwitchFunction(char operation){
    char name[NAME_LEN];
    switch (operation) {
        case '1':
            doShowAllInfo();
            break;
        case '2':
            
            printf("請輸入要查詢的聯繫人姓名(不要有空格):");
            scanf("%s", name);
            doSearchByName(name);
            break;
        case '3':
            printf("請輸入要更新的聯繫人姓名(不要有空格):");
            scanf("%s", name);
            doUpdateByName(name);
            break;
        case '4':
            doAdd();
            break;
        case '5':
            printf("請輸入要刪除的聯繫人姓名(不要有空格):");
            scanf("%s", name);
            doDelete(name);
            break;
        case '6':
            doExitSystem();
            break;
        case '\n':
            break;
        default:
            printf("\n請輸入1~6 之間的數字選擇功能!\n");
    }
}

/**
 *  寫入聯繫人信息到文件中
 */
void doWriteToFile(Contact list[], int num){
    
    //以二進制的方式寫入到文件中
    FILE *fp = fopen(filePath, "wb");
    
    //每次寫入一個contact信息,每次寫1塊
    //1、先把聯繫人個數寫入到文件中
    
    
    //2、依次寫入聯繫人信息
    //如果num不等於-2說明是來自於刪除操作,此時要更新每個聯繫人的編號
    if (num != -2) {
        int tempCount = totalContacts--;//刪除一個聯繫人,因此總個數減1
        fwrite(&totalContacts, sizeof(tempCount), 1, fp);
        totalContacts = 0;    //將totalContacts重置,用於重新編號
        
        for (int i = 0 ; i < tempCount; i++) {
            
            if(num == i)//不再保存要刪除的聯繫人
            {
                continue;
            }
            
            list[i].num = totalContacts;//更新聯繫人編號
            fwrite(&list[i], sizeof(Contact), 1, fp);
        }
        printf("刪除成功!");
    }
    else{
        fwrite(&totalContacts, sizeof(totalContacts), 1, fp);
        for (int i = 0 ; i < totalContacts; i++) {
            
            fwrite(&list[i], sizeof(Contact), 1, fp);
        }
        printf("保存成功!");
    }
    
    fclose(fp);
    
}
/**
 *  從文件中獲取所有聯繫人信息到聯繫人列表中
 */
void doGetAllInfo(){
    FILE *fp = fopen(filePath, "r");
    
    if (NULL == fp) {
        totalContacts = 0;
        return;
    }
    //先讀取出聯繫人總個數
    fread(&totalContacts, sizeof(totalContacts), 1, fp);
    
    if (0 == totalContacts) {
        return;
    }
    //再依次取出聯繫人信息
    for (int i = 0; i < totalContacts; i++) {
        fread(&list[i], sizeof(Contact), 1, fp);
    }
    fclose(fp);
}

3) 以下是《通訊錄》的功能展示部分


1、菜單顯示

*****************菜 單******************
****    1、顯示所有聯繫人信息         ****
****    2、根據名字查詢聯繫人信息      ****
****    3、修改聯繫人信息            ****
****    4、增加聯繫人               ****
****    5、刪除聯繫人               ****
****    6、退出系統                 ****

2、顯示所有聯繫人信息
      請選擇用數字選擇功能:1

      暫無聯繫人,請添加聯繫人....

3、添加聯繫人
請選擇用數字選擇功能:4
增加聯繫人!
請輸入聯繫人姓名(不要有空格):Amos
請輸入聯繫人電話號碼(不要有空格):45646

保存成功!

4、根據名字查詢聯繫人
請選擇用數字選擇功能:2
請輸入要查詢的聯繫人姓名(不要有空格):Amos
編號 | 姓名 | 電話號碼

0 | Amos | 123123

5、更新聯繫人信息
請選擇用數字選擇功能:3
請輸入要更新的聯繫人姓名(不要有空格):Amos
編號 | 姓名 | 電話號碼
0 | Amos | 123123
請輸入聯繫人姓名(不要有空格):AmosLi
請輸入聯繫人電話號碼(不要有空格):33333
保存成功!
【再次查詢所有聯繫人信息】

請選擇用數字選擇功能:1
編號 | 姓名 | 電話號碼

0 | AmosLi | 33333

6、刪除聯繫人

請選擇用數字選擇功能:5
請輸入要刪除的聯繫人姓名(不要有空格):AmosLi
編號 | 姓名 | 電話號碼
0 | AmosLi | 33333
確定要刪除嗎(y/n)y
刪除成功!
【刪除成功後再次查詢所有聯繫人信息】
請選擇用數字選擇功能:1

暫無聯繫人,請添加聯繫人....

7、退出系統
請選擇用數字選擇功能:6

正在退出系統.......

8.總結

做這個小程序真的考察了很多知識,感覺自己還是不夠熟悉。除了開頭的菜單設計是參照老師的,後面的代碼都是自己想的,有可能沒老師的好,不過好歹完全是自己搞的,忙了一天,也是很開心了。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章