【小白到大牛之路8】交換機後臺管理系統之菜單選擇

實現菜單選擇功能ide

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

int main(void) {
    // 定義變量,用來表示用戶名和密碼
    char name[32];
    char password[16];
    FILE *file;  //定義了一個文件指針變量,變量名是file
    char line[128];
    char name_tmp[32];
    char password_tmp[16];
    char *ret;
    char n; //用戶選擇的菜單編號

    //打開文件
    file = fopen("users.txt", "r");   
    if (!file) {   //等效於 file == NULL  
        printf("文件打開失敗");
        return 1;
    }

    //輸入用戶名和密碼
    while (1) {
        system("cls");

        // 輸入用戶名和密碼
        printf("請輸入用戶名:");
        scanf("%s", name);
        printf("請輸入密碼:");
        scanf("%s", password);

        //從文件中讀取帳號,並進行判斷!
        while (1) {
            //讀一行
            ret = fgets(line, sizeof(line), file); //line:  "admin 123456\n"
            if (!ret) {
                break;
            }           
            sscanf(line, "%s %s", name_tmp, password_tmp);
            if (!strcmp(name, name_tmp) && !strcmp(password, password_tmp)) {
                break;
            }
        }

        if (ret) {  //用戶名和密碼匹配成功
            break;
        } else {
            printf("用戶名或密碼錯誤!\n");  
            system("pause");
            system("cls");

            fseek(file, 0, SEEK_SET); //把文件內部的位置指針設置到文件頭
        }
    }

    while (1) {
        system("cls");

        // 打印功能菜單
        printf("---交換機後臺管理---\n");
        printf("1. 建立帳號\n");
        printf("2. IP管理\n");
        printf("3. 退出\n");
        printf("請選擇: ");

        fflush(stdin);
        scanf("%c", &n);

        if (n == '1') {
            system("cls");
            printf("\n\n---建立帳號---\n\n");
            printf("待實現...\n\n");
            printf("\n\n按任意鍵返回主菜單");
            fflush(stdin);
            getchar();
        } else if (n == '2') {
            system("cls");
            printf("\n\n---IP管理---\n\n");
            printf("待實現...\n\n");
            printf("\n\n按任意鍵返回主菜單");
            fflush(stdin);
            getchar();
        } else if (n == '3') {
            system("cls");
            break;
        } else {
            system("cls");
            printf("\n\n輸入錯誤!\n\n");
            printf("\n\n按任意鍵後,請從新輸入\n\n");
            fflush(stdin);
            getchar();
        }
    }

    return 0;
}

項目優化
分析存在的問題:
1.if判斷不少
2.代碼臃腫優化

分析多種優化方案。指針

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

int main(void) {
    // 定義變量,用來表示用戶名和密碼
    char name[32];
    char password[16];
    FILE *file;  //定義了一個文件指針變量,變量名是file
    char line[128];
    char name_tmp[32];
    char password_tmp[16];
    char *ret;
    char n; //用戶選擇的菜單編號

    //打開文件
    file = fopen("users.txt", "r");   
    if (!file) {   //等效於 file == NULL  
        printf("文件打開失敗");
        return 1;
    }

    //輸入用戶名和密碼
    while (1) {
        system("cls");

        // 輸入用戶名和密碼
        printf("請輸入用戶名:");
        scanf("%s", name);
        printf("請輸入密碼:");
        scanf("%s", password);

        //從文件中讀取帳號,並進行判斷!
        while (1) {
            //讀一行
            ret = fgets(line, sizeof(line), file); //line:  "admin 123456\n"
            if (!ret) {
                break;
            }           
            sscanf(line, "%s %s", name_tmp, password_tmp);
            if (!strcmp(name, name_tmp) && !strcmp(password, password_tmp)) {
                break;
            }
        }

        if (ret) {  //用戶名和密碼匹配成功
            break;
        } else {
            printf("用戶名或密碼錯誤!\n");  
            system("pause");
            system("cls");

            fseek(file, 0, SEEK_SET); //把文件內部的位置指針設置到文件頭
        }
    }

    while (1) {
        system("cls");

        // 打印功能菜單
        printf("---交換機後臺管理---\n");
        printf("1. 建立帳號\n");
        printf("2. IP管理\n");
        printf("3. 退出\n");
        printf("請選擇: ");

        fflush(stdin);
        scanf("%c", &n);

        switch (n) {
            case '1':
                system("cls");
                printf("\n\n---建立帳號---\n\n");
                printf("待實現...\n\n");
                printf("\n\n按任意鍵返回主菜單");
                fflush(stdin);
                getchar();
                break;
            case '2':
                system("cls");
                printf("\n\n---IP管理---\n\n");
                printf("待實現...\n\n");
                printf("\n\n按任意鍵返回主菜單");
                fflush(stdin);
                getchar();
                break;
            case '3':
                system("cls");
                return 0;
            default:
                system("cls");
                printf("\n\n輸入錯誤!\n\n");
                printf("\n\n按任意鍵後,請從新輸入\n\n");
                fflush(stdin);
                getchar();
                break;
        }
    }

    return 0;
}

項目精講

1.switch的基本使用
流程圖:
switch (x) {
case 表達式1:
語句1
break;
case 表達式2:
語句2
break;
case 表達式3:
語句3
break;
default表達式1:
語句1
break;
}
【小白到大牛之路8】交換機後臺管理系統之菜單選擇code

demoblog

#include <stdio.h>

int main(void) {
    int x;

    x = 1;
    switch(x) {
        case 1:
            printf("1\n");
        case 2:
            printf("2\n");
        case 3:
            printf("3\n");
        default:
            printf("default\n");
    }

    return 0;
}

2.switch和if的選擇

switch: 用於int/char/long/long long 類型的變量,和多個特定常量的判斷處理。
(float和double類型不能夠)
if: 適用於各類邏輯判斷get

3.switch的注意事項

#include <stdio.h>

int main(void) {
    int c;
    scanf("%d", &c);

    switch(c) {
    case 1:
        int x = 0;    //錯誤!
        printf("c=1\n");
        break;
    case 2:
        printf("c=2\n");
        break;
    default:
        printf("other\n");
        break;
    }

    return 0;
}

應修改成:string

#include <stdio.h>

int main(void) {
    int c;
    scanf("%d", &c);

    switch(c) {
    case 1:
        {
            int x = 0;   //合法
        }
        printf("c=1\n");
        break;
    case 2:
        printf("c=2\n");
        break;
    default:
        printf("other\n");
        break;
    }

    return 0;
}

項目練習

練習1

獨立完成項目8.it

練習2

編寫一個程序,讓用戶輸入一個月份,而後判斷這個月有多少天。
假設2月份始終有28天。
分別用if 和switch語句實現。io

練習3

讓用戶輸入一個成績,而後判斷該成績的等級。
0-59: 不及格
60-79: 及格
80-89: 良好
90-100: 優秀
其它:非法成績
分別用if 和switch語句實現。class

相關文章
相關標籤/搜索