C 語言初學教材 - 第五章 使用區域變數的帳號管理程式 範例程式

範例程式碼



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
#include <stdio.h>
#include <string.h>
 
#define SIZE 100
#define LEN 20
 
enum state {EXIT, RUN, WRONG_NAME, WRONG_CODE, Y, N};
 
// 函數原型的宣告
int manage(int counter, char id[][LEN], char code[][LEN]);
void printList(char id[][LEN], char code[][LEN]);
void si(char id[][LEN], char code[][LEN]);
int ssearch(char array[][LEN], int size, char *target);
int di(int counter, char id[][LEN], char code[][LEN]);
int so(char id[][LEN], char code[][LEN]);
void ssort(char array[][LEN], char code[][LEN], int size);
 
int main(void)
{
    // 宣告預設的帳號及密碼
    char userID[SIZE][LEN];
    char userCODE[SIZE][LEN];
     
    // 宣告暫存使用者輸入的帳號及密碼
    char inputName[LEN];
    char inputCode[LEN];
     
    // 宣告暫存新註冊的帳號及密碼
    char newName[LEN];
    char newCode[LEN];
     
    // 宣告暫存成功登入的帳號及密碼
    char whoName[LEN];
    char whoCode[LEN];
     
    // 宣告狀態變數、迴圈變數及陣列索引值變數
    int state, i, j, k;
    int counter;
     
    // administrator 為預設的管理者帳號, 0000 為其密碼
    strcpy(userID[0], "administrator");
    strcpy(userCODE[0], "0000");
     
    for (i = 1; i < SIZE; i++) {
        strcpy(userID[i], "");
        strcpy(userCODE[i], "");
    }
     
    counter = 1;
    while (1) {
        state = WRONG_NAME;
         
        printf("login: ");
        scanf("%s", inputName);
         
        // "exit" 為內建指令,用來離開迴圈
        if (!strcmp(inputName, "exit")) {
            state = EXIT;
            printf("\n\n您將要離開本登入程式....\n\n");
            break;
        }
         
        // "new" 為內建指令,用來新建帳號密碼
        if (!strcmp(inputName, "new")) {
            state = RUN;
             
            printf("\n請輸入新的註冊帳號: ");
            scanf("%s", newName);
            printf("請輸入新的登入密碼: ");
            scanf("%s", newCode);
             
            strcpy(userID[counter], newName);
            strcpy(userCODE[counter], newCode);
            counter++;
             
            printf("\n新的帳號、密碼已建立,請重新登入....\n");
            continue;
        }
 
        // 從陣列中判斷是否有使用者輸入的帳號,若有才再繼續要求輸入密碼
        for (i = 0; i < SIZE; i++) {
            if (!strcmp(inputName, userID[i])) {
                printf("password: ");
                scanf("%s", inputCode);
                 
                if (i == 0 && !strcmp(inputCode, userCODE[i])) {
                    counter = manage(counter, userID, userCODE);
                    printf("\n\n");
                    state = RUN;
                    break;
                }
                 
                if (!strcmp(inputCode, userCODE[i])) {
                    strcpy(whoName, inputName);
                    strcpy(whoCode, inputCode);
                     
                    printf("\n\n哈囉, %s , 歡迎使用本登入程式...\n\n", whoName);
                    state = RUN;
                    break;
                }
                else {
                    state = WRONG_CODE;
                    break;
                }
            }
        }
         
        // 判斷目前狀態,顯示提示訊息
        if (state == RUN) {
            continue;
        }
        else if (state == WRONG_NAME) {
            printf("\n\n沒有這名使用者喔!請重新登入....\n\n");
            continue;
        }
        else if (state == WRONG_CODE) {
            printf("\n\n密碼錯誤,請重新登入....\n\n");
            continue;
        }
    }
     
    printf("\n\n程式即將關閉,所有建立的資料都會消失....\n\n");
     
    return 0;
}
 
int manage(int counter, char id[][LEN], char code[][LEN])
{
    // 宣告接收管理模式指令
    char instruction[LEN];
     
    printf("\n\n您成功以管理員模式登入....\n");
    printf("將入帳號管理模式,請在提示符號 # 後輸入指令\n");
                     
    while (1) {
        printf("\n# ");
        scanf("%s", instruction);
                         
        // exit 為離開管理模式的指令
        if (!strcmp(instruction, "exit")) {
            return counter;
        }
                         
        // list 為列印使用者列表的指令
        if (!strcmp(instruction, "list")) {
            printList(id, code);
            continue;
        }
                         
        // search 為查詢帳號指令
        if (!strcmp(instruction, "search")) {
            si(id, code);
            continue;
        }
                         
        // delete 為刪除帳號指令
        if (!strcmp(instruction, "delete")) {
            counter = di(counter, id, code);
            continue;
        }
                         
        // sort 為排序指令
        if (!strcmp(instruction, "sort")) {
            counter = so(id, code);
            continue;
        }
    }              
}
 
void printList(char id[][LEN], char code[][LEN])
{
    int i;
     
    printf("\n以下為所有註冊使用者的帳號及密碼\n");
    printf("\n帳號 - 密碼\n");
     
    for (i = 0; i < SIZE; i++) {
        if (id[i][0] == '\0') {
            continue;
        }
                                 
        printf("%s - %s\n", id[i], code[i]);
    }
}
 
void si(char id[][LEN], char code[][LEN])
{
    char searchname[LEN];
    int index;
                             
    printf("\n請輸入要查找的帳號: ");
    scanf("%s", searchname);
    index = ssearch(id, SIZE, searchname);                       
                             
    if (index != -1) {
        printf("\n帳號 %s 已經註冊,密碼是 %s\n", id[index], code[index]);
    }
    else {
        printf("\n還沒有 %s 的帳號註冊唷!\n", searchname);
    }
}
 
int ssearch(char array[][LEN], int size, char *target)
{
    int i;
     
    for (i = 0; i < size; i++) {
        if (!strcmp(array[i], target)) {
            return i;
        }
    }
     
    return -1;
}
 
int di(int counter, char id[][LEN], char code[][LEN])
{
    char deletename[LEN];
    int index;
                             
    printf("\n請輸入要刪除的帳號: ");
    scanf("%s", deletename);
    index = ssearch(id, SIZE, deletename);
                             
    if (index != -1) {
        for (index; index < SIZE; index++) {
            strcpy(id[index], id[index + 1]);
            strcpy(code[index], code[index + 1]);
        }
                                 
        printf("\n%s 的帳號資料已刪除\n", deletename);
        return counter--;
    }
    else {
        printf("\n%s 的帳號資料不存在,無法刪除\n", deletename);
        return counter;
    }
}
 
int so(char id[][LEN], char code[][LEN])
{
    ssort(id, code, SIZE);
    printf("\n資料已排序完成\n");
    return 1;
}
 
void ssort(char array[][LEN], char code[][LEN], int size)
{
    int i, j;
    char tempa[LEN], tempb[LEN];
     
    for (i = 0; i < size - 1; i++) {
        for (j = 1; j < size; j++) {
            if (array[j - 1][0] > array[j][0]) {
                strcpy(tempa, array[j - 1]);
                strcpy(tempb, code[j - 1]);
                strcpy(array[j - 1], array[j]);
                strcpy(code[j - 1], code[j]);
                strcpy(array[j], tempa);
                strcpy(code[j], tempb);
            }
        }
    }
}
 
/* 《程式語言教學誌》的範例程式
    檔名:ncf2.c
    功能:使用區域變數規劃帳號管理程式
    作者:張凱慶
    時間:西元2010年7月 */


程式說明及編譯執行,請繼續參考




沒有留言: