通过本次码代码的过程,对预处理机制以及一个工程的分块完成有了一定认识,主要需要对结构体变量的定义及使用方法和文件的操作方法能基本掌握,同时对函数的封装以及调用有了更深一步的理解
1、用于声明的头文件
#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
int main()
{
Contact pcon = { 0 };
load_contact(&pcon);
while (1)
{
int input = 0;
meun();
scanf("%d", &input);
switch (input)
{
case ADD:;
add_conatct(&pcon);
break;
case DELETE:;
dele_conatct(&pcon);
break;
case FIND:
find_conatct(&pcon);
break;
case ALTER:;
alter_conatct(&pcon);
break;
case SHOW:;
show_conatct(&pcon);
break;
case CLEAR:;
clear_conatct(&pcon);
break;
case SORT:;
sort_conatct(&pcon);
break;
case SAVE:;
save_contact(&pcon);
break;
case EXIT:;
exit(0);
break;
}
}
system("pause");
return 0;
}
2、实现声明的.c文件
#include"contact.h"
void meun()
{
printf(" ********通讯录********\n");
printf("********1、添加联系人 2、删除指定联系人*********\n");
printf("********3、查找指定联系人 4、修改指定联系人*********\n");
printf("********5、显示所有联系人 6、清空所有联系人*********\n");
printf("********7、按名字排序联系人 8、保存联系人并退出*******\n");
printf("********0、退出程序 *******\n");
printf("请选择:>");
}
void init_conatct(Pcon pcon)
{
pcon->size = 0;
pcon = (Pcon)malloc(START * sizeof(pcon->peo) + sizeof(Pcon)); //为通讯录分配动态内存
}
void add_mem(Pcon pcon)
{
if (pcon->size == 1000)
{
printf("通讯录已满!\n");
return;
}
int num = pcon->size / 10 + 1;
pcon = (Pcon)malloc(num * START * sizeof(pcon->peo) + sizeof(Pcon));
}
void load_contact(Pcon pcon)
{
char ch = ' ';
init_conatct(pcon);
char p[5] = { 0 };
FILE *fread = fopen("contact.txt", "r");
if (fopen == NULL)
{
printf("打开文件失败!\n");
exit(0);
}
ch = fgetc(fread);
while (ch!=EOF)
{
fseek(fread, -1, SEEK_CUR);
add_mem(pcon);
fscanf(fread, "%s%s%d%s%s", pcon->peo[pcon->size].name, pcon->peo[pcon->size].sex, &pcon->peo[pcon->size].age,\
pcon->peo[pcon->size].tel, pcon->peo[pcon->size].addre);//注意结构体指针变量对成员的饮用方法
//从文件里以格式化的方式读取数据到内存的函数
pcon->size++;
ch = fgetc(fread); //因为fscanf是读到上一行的'\n'截止,所以得先把'\n'读了,使fread指向下一行
ch = fgetc(fread); //判断现在fread所指向的这一行是不是空行(EOF)
}
fclose(fread);
}
void save_contact(Pcon pcon)
{
int i = 0;
FILE *fwriter = fopen("contact.txt", "w");
if (fopen == NULL)
{
printf("打开文件失败!\n");
exit(0);
}
//fprintf(fwriter, "%-4s %-4s %-4s %-8s %-8s\n", "姓名", "性别", "年龄", "电话", "住址");
while (i < pcon->size)
{
fprintf(fwriter, "%-4s %-4s %-4d %-8s %s\n", pcon->peo[i].name, pcon->peo[i].sex, pcon->peo[i].age,\
pcon->peo[i].tel, pcon->peo[i].addre);
//从内存里以格式化的方式输出数据到文件的函数
i++;
}
fclose(fwriter);
printf("联系人信息保存成功!\n");
exit(0);
}
void swap(Peo *peo1, Peo *peo2) //排序时交换两个人的信息
{
Peo temp = *peo1;
*peo1 = *peo2;
*peo2 = temp;
}
void add_conatct(Pcon pcon)
{
add_mem(pcon);
printf("请输入要插入的联系人的信息:\n");
printf("姓名:");
scanf("%s", pcon->peo[pcon->size].name);
printf("性别:");
scanf("%s", pcon->peo[pcon->size].sex);
printf("年龄:");
scanf("%d", &pcon->peo[pcon->size].age);
printf("电话:");
scanf("%s", pcon->peo[pcon->size].tel);
printf("住址:");
scanf("%s", pcon->peo[pcon->size].addre);
pcon->size++;
printf("插入成功!\n");
system("cls");
}
void dele_conatct(Pcon pcon)
{
int i = 0;
char p[10] = "";
printf("请输入要删除的联系人的姓名:\n");
scanf("%s", p);
for (i = 0; i < pcon->size; i++)
{
if (!strcmp(p, pcon->peo[i].name))
{
break;
}
}
if (i == pcon->size)
{
printf("通讯录不存在该联系人,无法删除!\n");
return;
}
while (i < (pcon->size - 1))
{
pcon->peo[i] = pcon->peo[i + 1];
i++;
}
pcon->size--;
printf("删除成功!\n");
system("cls");
}
void find_conatct(Pcon pcon)
{
int i = 0;
char p[10] = "";
printf("请输入要查找的联系人的姓名:\n");
scanf("%s", p);
for (i = 0; i < pcon->size;)
{
if (!strcmp(pcon->peo[i].name, p))
{
printf("%-6s%-6s%-6s%-16s%s\n", "姓名", "性别", "年龄", "电话", "住址");
printf("%-6s%-6s%-6d%-16s%s\n", pcon->peo[i].name, pcon->peo[i].sex, pcon->peo[i].age, \
pcon->peo[i].tel, pcon->peo[i].addre);
return;
}
i++; //因为上面循环里的判断用到i了,要是把i++写在循环条件里,那么会出错
}
printf("通讯录内不存在该联系人!\n");
return;
}
void alter_conatct(Pcon pcon)
{
int i = 0;
char p[10] = "";
printf("请输入要修改的联系人的姓名:\n");
scanf("%s", p);
for (i = 0; i < pcon->size; )
{
if (!strcmp(pcon->peo[i].name, p))
{
printf("请输入修改后的联系人的信息:\n");
printf("姓名:");
scanf("%s", pcon->peo[i].name);
printf("性别:");
scanf("%s", pcon->peo[i].sex);
printf("年龄:");
scanf("%d", &pcon->peo[i].age);
printf("电话:");
scanf("%s", pcon->peo[i].tel);
printf("住址:");
scanf("%s", pcon->peo[i].addre);
printf("修改成功!\n");
system("cls");
return;
}
i++; //因为上面循环里的判断用到i了,要是把i++写在循环条件里,那么会出错
}
printf("通讯录内不存在该联系人!\n");
system("cls");
}
void show_conatct(Pcon pcon)
{
int i = 0;
if (pcon->size == 0)
{
printf("通讯录内没有任何信息!\n");
system("cls");
return;
}
printf("%-6s%-6s%-6s%-16s%s\n", "姓名", "性别", "年龄", "电话", "住址");
for (i = 0; i < pcon->size; i++)
{
printf("%-6s%-6s%-6d%-16s%s\n", pcon->peo[i].name, pcon->peo[i].sex, pcon->peo[i].age,\
pcon->peo[i].tel, pcon->peo[i].addre);
}
}
void clear_conatct(Pcon pcon)
{
pcon->size = 0;
printf("联系人已被清空!\n");
system("cls");
}
void sort_conatct(Pcon pcon)
{
int i = 0;
int j = 0;
for (i = 0; i < pcon->size - 1; i++)
{
for (j = 0; j < pcon->size - i - 1; j++)
{
if (strcmp(pcon->peo[j].name, pcon->peo[j+1].name) > 0) //这个必须指明结果是大于0还是小于0,因为
//不指明的话,不管大于0还是小于0都会进到if
//判断语句里去
{
swap(&pcon->peo[j], &pcon->peo[j + 1]);
}
}
}
printf("排序成功!\n");
system("cls");
}
3、测试程序功能的测试文件
#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
int main()
{
Contact pcon = { 0 };
load_contact(&pcon);
while (1)
{
int input = 0;
meun();
scanf("%d", &input);
switch (input)
{
case ADD:;
add_conatct(&pcon);
break;
case DELETE:;
dele_conatct(&pcon);
break;
case FIND:
find_conatct(&pcon);
break;
case ALTER:;
alter_conatct(&pcon);
break;
case SHOW:;
show_conatct(&pcon);
break;
case CLEAR:;
clear_conatct(&pcon);
break;
case SORT:;
sort_conatct(&pcon);
break;
case SAVE:;
save_contact(&pcon);
break;
case EXIT:;
exit(0);
break;
}
}
system("pause");
return 0;
}