功能需求
設計“通訊錄管理系統”使其具有數據插入、修改、刪除、顯示和查詢等功能。需求如下:
(1)數據包括人名、工作單位、電話號碼和E-mail地址
(2)可對記錄中的姓名和電話號碼進行修改
(3)可增加或刪除記錄
(4)可顯示所有保存的記錄
(5)可按人名或電話號碼進行查詢
//開發工具:EditPlus 編譯工具:MinGW 原文件編碼:GBK
#include <stdio.h>
#include <string.h>
#define CONTACTCOUNT 100 //通訊錄可存聯繫人最大數
struct Contact {
char name[30]; //人名
char workUnit[120]; //工作單位
char phoneNumber[20]; //電話號碼
char email[50]; //E-mail地址
};
static struct Contact contacts[CONTACTCOUNT]; //通訊錄本體
//函數申明
void safe_flush(FILE *);
void addContact();
void findContact();
void showAllContact();
void delAllContact();
void save2File();
void read4File();
int main(int argc, char * argv[]) {
printf("********************************************************\n");
printf("=============== 歡迎使用 通訊錄管理系統 ================\n");
printf("********************************************************\n");
read4File();
int index, r;
while (1) {
printf("\n請選擇您要操作的功能?\n");
printf("1、添加聯繫人\n");
printf("2、查找聯繫人\n");
printf("3、查看所有聯繫人\n");
printf("4、刪除所有聯繫人\n");
printf("5、保存到文件\n");
printf("6、退出系統\n");
printf("\n輸入序號回車即可:\n");
r = scanf("%d", &index);
safe_flush(stdin);
if (r == 0) {
printf("請輸入正確的功能序號!\n\n");
continue;
}
switch (index) {
case 1:
addContact();
break;
case 2:
findContact();
break;
case 3:
showAllContact();
break;
case 4:
delAllContact();
break;
case 5:
save2File();
break;
case 6:
goto exit;
break;
default:
printf("請輸入正確的功能序號!\n\n\n");
break;
}
}
exit: printf("\n謝謝您的使用,再見!\n\n");
return 0;
}
//添加聯繫人
void addContact() {
int ic = 0;
for (; ic < CONTACTCOUNT; ic++) {
struct Contact contact = contacts[ic];
int len = strlen(contact.name);
if (len == 0)
break;
}
printf("請輸入姓名:");
gets(contacts[ic].name);
printf("請輸入工作單位:");
gets(contacts[ic].workUnit);
printf("請輸入電話號碼:");
gets(contacts[ic].phoneNumber);
printf("請輸入E-mail地址:");
gets(contacts[ic].email);
}
//按條件查找聯繫人
void findContact() {
printf("按以下方式查找聯繫人:\n");
printf("1、按姓名查找\n");
printf("2、按電話號碼查找\n\n");
printf("輸入序號回車即可\n");
int index, r;
r = scanf("%d", &index);
safe_flush(stdin);
if (r == 0 || (index != 1 && index != 2)) {
printf("請輸入正確的查找功能序號!\n\n");
return;
}
printf("請輸入查詢關鍵字:\n");
char fname[30];
gets(fname);
int ct = 0;
printf("========================================\n");
int oindex = -1;
for (int i = 0; i < CONTACTCOUNT; i++) {
struct Contact contact = contacts[i];
int len = strlen(contact.name);
if (len == 0)
continue;
char * str;
char * ret;
if (index == 1) {
str = contact.name;
ret = strstr(str, fname);
} else if (index == 2) {
str = contact.phoneNumber;
ret = strstr(str, fname);
}
if (ret != NULL) {
printf("姓名:%s\n", contact.name);
printf("工作單位:%s\n", contact.workUnit);
printf("電話號碼:%s\n", contact.phoneNumber);
printf("E-mail地址:%s\n\n", contact.email);
ct++;
oindex = i;
}
}
if (ct == 0) {
printf("通訊錄不存在此聯繫人!!!\n");
}
printf("============查找聯繫人已顯示============\n\n");
if (ct == 1) {
printf("對此聯繫人可進行如下操作:\n");
printf("1、編輯此聯繫人\n");
printf("2、刪除此聯繫人\n");
printf("3、無其他操作\n\n");
printf("輸入序號回車即可:\n");
r = scanf("%d", &index);
safe_flush(stdin);
if (r == 0 || (index != 1 && index != 2 && index != 3)) {
printf("您輸入的操作序號不正確!\n\n");
return;
}
if (index == 3) {
return;
}
if (index == 1) { //編輯
printf("請輸入新的姓名,爲空則不改變:\n");
char name[30];
gets(name);
int len = strlen(name);
if (len > 0)
strcpy(contacts[oindex].name, name);
printf("請輸入新的工作單位,爲空則不改變:\n");
char workUnit[120];
gets(workUnit);
len = strlen(workUnit);
if (len > 0)
strcpy(contacts[oindex].workUnit, workUnit);
printf("請輸入新的電話號碼,爲空則不改變:\n");
char phoneNumber[20];
gets(phoneNumber);
len = strlen(phoneNumber);
if (len > 0)
strcpy(contacts[oindex].phoneNumber, phoneNumber);
printf("請輸入新的E-mail地址,爲空則不改變:\n");
char email[50];
gets(email);
len = strlen(email);
if (len > 0)
strcpy(contacts[oindex].email, email);
} else if (index == 2) { //刪除
struct Contact contact;
contacts[oindex] = contact;
}
} else if (ct > 1) {
printf("******請詳細查詢條件,查詢到單條信息纔可以(編輯、刪除)******\n\n");
}
}
//顯示所有聯繫人
void showAllContact() {
printf("========================================\n");
for (int i = 0; i < CONTACTCOUNT; i++) {
struct Contact contact = contacts[i];
int len = strlen(contact.name);
if (len == 0)
continue;
printf("姓名:%s\n", contact.name);
printf("工作單位:%s\n", contact.workUnit);
printf("電話號碼:%s\n", contact.phoneNumber);
printf("E-mail地址:%s\n\n", contact.email);
}
printf("============全部聯繫人已顯示============\n");
}
//刪除所有聯繫人
void delAllContact() {
printf("******您確定刪除所有聯繫人嗎?(y/n)******\n");
char yn;
scanf("%s", &yn);
if (yn == 'y') {
memset(&contacts, 0, sizeof(contacts));
remove("contacts.csv");
printf("刪除所有聯繫人 完畢\n");
}
}
//保存聯繫人到文件
void save2File() {
FILE * fp = fopen("contacts.csv", "w+");
for (int i = 0; i < CONTACTCOUNT; i++) {
struct Contact contact = contacts[i];
int len = strlen(contact.name);
if (len == 0)
continue;
char tstr[220];
memset(tstr, 0, sizeof(tstr));
strcat(tstr, contact.name);
strcat(tstr, ",");
strcat(tstr, contact.workUnit);
strcat(tstr, ",");
strcat(tstr, contact.phoneNumber);
strcat(tstr, ",");
strcat(tstr, contact.email);
fputs(tstr, fp);
fputs("\n", fp);
}
fclose(fp);
if (fp != NULL) {
printf("!!!保存到文件成功!!!\n");
}
}
//從文件讀取聯繫人
void read4File() {
FILE * fp = fopen("contacts.csv", "r");
if (fp == NULL)
return;
char buff[220];
int i = 0;
while (fgets(buff, 220, fp)) {
int len = strlen(buff);
if (len == 0)
continue;
char ptr[strlen(buff) + 1];
int i, j = 0;
for (i = 0; buff[i] != '\0'; i++) {
if (buff[i] != '\t' && buff[i] != '\n')
ptr[j++] = buff[i];
}
ptr[j] = '\0';
const char s[2] = ",";
char * token;
token = strtok(ptr, s);
len = strlen(token);
if (len == 0)
continue;
strcpy(contacts[i].name, token);
token = strtok(NULL, s);
strcpy(contacts[i].workUnit, token);
token = strtok(NULL, s);
strcpy(contacts[i].phoneNumber, token);
token = strtok(NULL, s);
strcpy(contacts[i].email, token);
i++;
}
fclose(fp);
}
//清空輸入流緩存
void safe_flush(FILE * fp) {
int ch;
while ((ch = fgetc(fp)) != EOF && ch != '\n');
}