//本程序是笔者在学习完C Primer Plus后想到的一个独立小项目;
//代码中含有大量注释方便读者阅读;
//使用的均是C标准库(可移植程序);
//可在Linux/Mac os/Windows下运行;
//未经允许严禁抄袭以及转载;
//若对您有帮助请点赞收藏或者转发;
//源代码奉上,希望能够对您有所启发;
//C语言电子通讯录管理系统.c
//注意:需要提前创建一个名为mycontacts的记事本文件;
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#define TWL 10
#define LEN 12
#define MAXSIZE 100
typedef struct
{
char num[TWL];
char name[LEN];
char tel[LEN];
} contacts;
int print_menu(void);
void create_maillist(contacts *p, int *n);
void save_message_to_file(contacts *p, int n);
void load_message_from_file(contacts *p, int *n);
void display_message(contacts *p, int n);
void search_person(contacts *p, int n);
void search_by_num(contacts *p, int n);
void search_by_name(contacts *p, int n);
void modify_maillist(contacts *p, int n);
void add_person(contacts *p, int *n);
void delete_person(contacts *p, int *n);
void delete_by_num(contacts *p, int *n);
void delete_by_name(contacts *p, int *n);
void sort_maillist(contacts *p, int n);
void sort_by_num(contacts *p, int n);
void sort_by_name(contacts *p, int n);
int get_first(void);
void eatline(void);
char *s_gets(char *st, int n);
bool check_is_zero(int n);
int main(void)
{
int ch;
int n = 0;
bool flag = false;
contacts people[MAXSIZE];
load_message_from_file(people, &n);
while (1)
{
ch = print_menu();
switch (ch)
{
case '1':
{
create_maillist(people, &n);
save_message_to_file(people, n);
break;
}
case '2':
{
if (flag = check_is_zero(n))
{
break;
}
display_message(people, n);
break;
}
case '3':
{
if (flag = check_is_zero(n))
{
break;
}
search_person(people, n);
break;
}
case '4':
{
if (flag = check_is_zero(n))
{
break;
}
modify_maillist(people, n);
break;
}
case '5':
{
if (flag = check_is_zero(n))
{
break;
}
add_person(people, &n);
break;
}
case '6':
{
if (flag = check_is_zero(n))
{
break;
}
delete_person(people, &n);
break;
}
case '7':
{
if (flag = check_is_zero(n))
{
break;
}
sort_maillist(people, n);
break;
}
case '0':
{
break;
}
}
if ('0' == ch)
{
break;
}
printf("请按回车键继续操作..");
eatline();
printf("\n\n\n\n\n\n\n\n\n\n\n\n\n");
}
puts("欢迎再次使用!");
return 0;
}
int print_menu(void)
{
int ch;
puts("=======================================");
puts(" 欢迎进入电子通讯录管理系统");
puts(" 您可以进行如下选择:");
puts(" 1:创建新通讯录");
puts(" 2:显示通讯录中的信息");
puts(" 3:查询通讯录中的信息");
puts(" 4:修改通讯录中的信息");
puts(" 5:添加新的联系人至通讯录");
puts(" 6:删除通讯录中的信息");
puts(" 7:排序通讯录中的信息");
puts(" 0:退出当前程序");
puts("=======================================");
printf("请您输入选择:");
ch = get_first();
while (strchr("12345670", ch) == NULL)
{
printf("输入无效!请重新输入:");
ch = get_first();
}
return ch;
}
void create_maillist(contacts *p, int *n)
{
contacts temp;
*n = 0;
do
{
printf("请输入第%d个联系人的信息:\n", (*n) + 1);
printf("请输入联系人的编号(按#结束输入):");
do
{
s_gets(temp.num, TWL);
} while (strcmp(temp.num, "") == 0);
if ('#' == temp.num[0])
{
break;
}
printf("请输入联系人的姓名(按#结束输入):");
do
{
s_gets(temp.name, LEN);
} while (strcmp(temp.name, "") == 0);
if ('#' == temp.name[0])
{
break;
}
printf("请输入联系人的电话号码(按#结束输入):");
do
{
s_gets(temp.tel, LEN);
} while (strcmp(temp.tel, "") == 0);
if ('#' == temp.tel[0])
{
break;
}
++(*n);
*p = temp;
p++;
} while ((*n) < MAXSIZE);
}
void save_message_to_file(contacts *p, int n)
{
FILE *fp;
contacts *temp;
if ((fp = fopen("mycontacts.txt", "a")) == NULL)
{
fprintf(stderr, "无法添加信息至联系人目录文件!退出本程序!\n");
exit(EXIT_FAILURE);
}
for (temp = p; temp < p + n; temp++)
{
fprintf(fp, "%10s %12s %12s\n", temp->num, temp->name, temp->tel);
}
if (fclose(fp) != 0)
{
fprintf(stderr, "关闭%s文件失败!\n", "mycontacts.txt");
}
return;
}
void load_message_from_file(contacts *p, int *n)
{
FILE *fp;
contacts *temp;
if ((fp = fopen("mycontacts.txt", "r")) == NULL)
{
fprintf(stderr, "无法打开%s文件!\n", "mycontacts.txt");
exit(EXIT_FAILURE);
}
temp = p;
*n = 0;
while ((*n) < MAXSIZE)
{
if (fscanf(fp, "%9s %11s %11s", &temp->num, &temp->name, &temp->tel) == EOF)
{
break;
}
temp++;
++(*n);
}
if (fclose(fp) != 0)
{
fprintf(stderr, "关闭%s文件失败!\n", "mycontacts.txt");
}
return;
}
void display_message(contacts *p, int n)
{
contacts *temp;
puts("通讯录中信息如下:");
printf("编号 姓名 电话号码\n");
for (temp = p; temp < p + n; temp++)
{
printf("%-10s %-12s %-12s\n", temp->num, temp->name, temp->tel);
}
return;
}
void search_person(contacts *p, int n)
{
int ch;
printf("请您选择按照编号查询(h)还是按照姓名查询(m):");
ch = get_first();
while (ch != 'h' && ch != 'm')
{
printf("输入无效!请输入h或者m:");
ch = get_first();
}
if ('h' == ch)
{
search_by_num(p, n);
}
else
{
search_by_name(p, n);
}
return;
}
void search_by_num(contacts *p, int n)
{
contacts *temp;
char tempnum[TWL];
bool flag = false;
printf("请您输入需要查询联系人的编号:");
do
{
s_gets(tempnum, TWL);
} while (strcmp(tempnum, "") == 0);
for (temp = p; temp < p + n; temp++)
{
if (strcmp(tempnum, temp->num) == 0)
{
if (!flag)
{
printf("此人的信息是:\n");
printf("编号 姓名 电话号码\n");
printf("%-10s %-12s %-12s\n", temp->num, temp->name, temp->tel);
flag = true;
}
}
}
if (!flag)
{
printf("通讯录中未找到此人!\n");
}
return;
}
void search_by_name(contacts *p, int n)
{
contacts *temp;
char tempname[TWL];
bool flag = false;
printf("请您输入需要查询联系人的姓名:");
do
{
s_gets(tempname, TWL);
} while (strcmp(tempname, "") == 0);
for (temp = p; temp < p + n; temp++)
{
if (strcmp(tempname, temp->name) == 0)
{
if (!flag)
{
printf("此人的信息是:\n");
printf("编号 姓名 电话号码\n");
printf("%-10s %-12s %-12s\n", temp->num, temp->name, temp->tel);
flag = true;
}
}
}
if (!flag)
{
printf("通讯录中未找到此人!\n");
}
return;
}
void modify_maillist(contacts *p, int n)
{
int ch;
contacts *q, *find, temp;
printf("请输入您将要修改的通讯录中的联系人的原编号:");
do
{
s_gets(temp.num, TWL);
} while (strcmp(temp.num, "") == 0);
for (q = p; q < p + n; q++)
{
if (strcmp(temp.num, q->num) == 0)
{
find = q;
break;
}
}
if (p + n == q)
{
printf("通讯录中未找到此人!\n");
}
else
{
do
{
printf("请输入修改的编号:");
do
{
s_gets(temp.num, TWL);
} while (strcmp(temp.num, "") == 0);
printf("请输入修改的姓名:");
do
{
s_gets(temp.name, LEN);
} while (strcmp(temp.name, "") == 0);
printf("请输入替换的电话号码:");
do
{
s_gets(temp.tel, LEN);
} while (strcmp(temp.tel, "") == 0);
for (p = q; q < p + n; q++)
{
if ((strcmp(temp.num, q->num) == 0) && (q != find))
{
printf("您输入的编号与其他联系人重复!\n");
printf("需要重新输入吗?(y/n):");
ch = get_first();
while (ch != 'y' && ch != 'n')
{
printf("输入有误!请输入y或者n:");
ch = get_first();
}
putchar('\n');
break;
}
}
if (p + n == q)
{
*find = temp;
break;
}
} while (ch == 'y');
}
return;
}
void add_person(contacts *p, int *n)
{
int ch;
contacts *q, temp;
do
{
while (1)
{
printf("请输入新添加至通讯录的编号:");
do
{
s_gets(temp.num, TWL);
} while (strcmp(temp.num, "") == 0);
for (q = p; q < p + (*n); q++)
{
if (strcmp(temp.num, q->num) == 0)
{
break;
}
}
if (q < p + (*n))
{
printf("此编号已存在!请重新输入:");
}
else
{
break;
}
}
printf("请输入新联系人的姓名:");
do
{
s_gets(temp.name, LEN);
} while (strcmp(temp.name, "") == 0);
printf("请输入新联系人的电话号码:");
do
{
s_gets(temp.tel, LEN);
} while (strcmp(temp.tel, "") == 0);
*q = temp;
++(*n);
printf("您还想继续添加新联系人吗?(y/n):");
ch = get_first();
while (ch != 'y' && ch != 'n')
{
printf("输入无效!请重新输入:");
ch = get_first();
}
} while (ch == 'y');
return;
}
void delete_person(contacts *p, int *n)
{
int ch;
printf("您想选择查询编号(h)还是查询姓名(m)删除联系人?\n");
printf("请您输入选择:");
ch = get_first();
while (ch != 'h' && ch != 'm')
{
printf("输入无效!请输入h或者m:");
ch = get_first();
}
if ('h' == ch)
{
delete_by_num(p, n);
}
else
{
delete_by_name(p, n);
}
return;
}
void delete_by_num(contacts *p, int *n)
{
contacts *q, *k;
char tempnum[TWL];
printf("请输入需要删除的联系人的编号:");
do
{
s_gets(tempnum, TWL);
} while (strcmp(tempnum, "") == 0);
for (k = p; k < p + (*n); k++)
{
if (strcmp(tempnum, k->num) == 0)
{
break;
}
if (k < p + (*n))
{
for (q = k; q < k + (*n) - 1; q++)
{
*q = *(q + 1);
}
--(*n);
}
else
{
printf("通讯录中未找到此人!\n");
}
}
return;
}
void delete_by_name(contacts *p, int *n)
{
contacts *q, *k;
char tempname[TWL];
printf("请输入需要删除的联系人的姓名:");
do
{
s_gets(tempname, TWL);
} while (strcmp(tempname, "") == 0);
for (k = p; k < p + (*n); k++)
{
if (strcmp(tempname, k->name) == 0)
{
break;
}
if (k < p + (*n))
{
for (q = k; q < k + (*n) - 1; q++)
{
*q = *(q + 1);
}
--(*n);
}
else
{
printf("通讯录中未找到此人!\n");
}
}
return;
}
void sort_maillist(contacts *p, int n)
{
int ch;
printf("联系人按照编号排序(h)还是按照姓名排序(m)?\n");
printf("请您输入选择:");
ch = get_first();
while (ch != 'h' && ch != 'm')
{
printf("输入无效!请输入h或者m:");
ch = get_first();
}
if ('h' == ch)
{
sort_by_num(p, n);
}
else
{
sort_by_name(p, n);
}
return;
}
void sort_by_num(contacts *p, int n)
{
contacts temp;
int i, j, k, ch;
printf("您想按照升序(s)还是按照降序(j)排序?\n");
printf("请您输入选择:");
ch = get_first();
while (ch != 's' && ch != 'j')
{
printf("输入无效!请输入s或者j:");
ch = get_first();
}
if ('s' == ch)
{
for (i = 0; i < n - 1; i++)
{
k = i;
for (j = i + 1; j < n; j++)
{
if (strcmp((p + k)->name, (p + j)->name) > 0)
{
k = j;
}
if (k != i)
{
temp = *(p + k);
*(p + k) = *(p + i);
*(p + i) = temp;
}
}
}
}
else
{
for (i = 0; i < n - 1; i++)
{
k = i;
for (j = i + 1; j < n; j++)
{
if (strcmp((p + k)->name, (p + j)->name) < 0)
{
k = j;
}
if (k != i)
{
temp = *(p + k);
*(p + k) = *(p + i);
*(p + i) = temp;
}
}
}
}
return;
}
void sort_by_name(contacts *p, int n)
{
contacts temp;
int i, j, k, ch;
printf("您想按照升序(s)还是按照降序(j)排序?\n");
printf("请您输入选择:");
ch = get_first();
while (ch != 's' && ch != 'j')
{
printf("输入无效!请输入s或者j:");
ch = get_first();
}
if ('s' == ch)
{
for (i = 0; i < n - 1; i++)
{
k = i;
for (j = i + 1; j < n; j++)
{
if (strcmp((p + k)->num, (p + j)->num) > 0)
{
k = j;
}
if (k != i)
{
temp = *(p + k);
*(p + k) = *(p + i);
*(p + i) = temp;
}
}
}
}
else
{
for (i = 0; i < n - 1; i++)
{
k = i;
for (j = i + 1; j < n; j++)
{
if (strcmp((p + k)->num, (p + j)->num) < 0)
{
k = j;
}
if (k != i)
{
temp = *(p + k);
*(p + k) = *(p + i);
*(p + i) = temp;
}
}
}
}
return;
}
int get_first(void)
{
int ch;
do
{
ch = towlower(getchar());
} while (isspace(ch));
eatline();
return ch;
}
void eatline(void)
{
while (getchar() != '\n')
continue;
return;
}
char *s_gets(char *st, int n)
{
char *find;
char *ret_val;
ret_val = fgets(st, n, stdin);
if (ret_val)
{
find = strchr(st, '\n');
if (find)
{
*find = '\0';
}
else
{
while (getchar() != '\n')
continue;
}
}
return ret_val;
}
bool check_is_zero(int n)
{
bool flag = false;
if (0 == n)
{
printf("通讯录无信息!请先添加联系人的信息!\n");
flag = true;
}
return flag;
}
//-------------
//----------------------------2020年8月19日 -------------------------------