[Asm] 纯文本查看 复制代码
/*
/*
以本班同学的具体数据为背景,设计一个本班同学通讯录
实现以下功能:
1) 通讯录编辑(添加、删除);
2) 按不同的项进行查找;
3) 对已存在的通讯录按不同的项排序;
4) 将通讯录写入文件;
5) 从文件读入通讯录。
备注:通讯录至少应该有以下数据项:姓名,地址,电话,邮编,E-mail。
*/
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define NAME_LEN 40
#define ADDRESS_LEN 60
#define E_LEN 30
#define MAX 1000
//*****************声明*********************//
void menu();
void InitContact(struct Contact* ps);
void Add(struct Contact* p);
void Del(struct Contact* p);
void Moidfy(struct Contact* p);
void Search(struct Contact* p);
void Sort(struct Contact* p);
int FindValue(struct Contact* p, char* name);
void Show(struct Contact* p);
int SaveFILE(struct Contact* p);
//***************联系人信息*****************//
struct people
{
char name[NAME_LEN]; //姓名
char address[ADDRESS_LEN]; //地址
int telephone_num; //电话
int Postal; //邮编
char E_mail[E_LEN]; //E-mail
};
//***************通讯录类型*****************//
struct Contact
{
struct people data[MAX]; //存放1000个信息
int size; //记录当前结构体内已经有的元素个数
};
int main()
{
unsigned int input = 0;
struct Contact con;//创建通讯录,里面包含1000个元素的数和size
InitContact(&con);//初始化通讯录
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1: Add(&con);
break;
case 2: Del(&con);
break;
case 3: Search(&con);
break;
case 4: Moidfy(&con);
break;
case 5: Show(&con);
break;
case 6: Sort(&con);
break;
case 0: {
SaveFILE(&con);
printf("退出通讯录\n");
break; }
default: printf("选择错误\n");
break;
}
} while (input);
return 0;
}
void menu()
{
printf("\n");
printf("---------------------------------\n");
printf("** 1. 添加联系人 **\n");
printf("** 2. 删除联系人 **\n");
printf("** 3. 查找联系人 **\n");
printf("** 4. 修改联系人 **\n");
printf("** 5. 显示所有联系人 **\n");
printf("** 6. 按姓名排序联系人 **\n");
printf("** 0. exit **\n");
printf("---------------------------------\n");
}
//***************初始化通讯录***************//
void InitContact(struct Contact* ps)
{
memset(ps->data, 0, sizeof(ps->data));
ps->size = 0;//通讯录最初只有0个元素
}
//**************添加联系人信息**************//
void Add(struct Contact *p)
{
if (p->size >= MAX)
printf("通讯录已满,无法增加\n");
else
{
printf("请输入姓名:>");
scanf("%s", p->data[p->size].name);
printf("请输入住址:>");
scanf("%s", p->data[p->size].address);
printf("请输入电话:>");
scanf_s("%d", &p->data[p->size].telephone_num);
printf("请输入邮编:>");
scanf("%d", &p->data[p->size].Postal);
printf("请输入E-mail:>");
scanf("%s", p->data[p->size].E_mail);
p->size++;
printf("添加成功\n");
}
}
//**************删除联系人信息**************//
void Del(struct Contact* p)
{
char name[NAME_LEN];
int temp = 0;//用来确认是否删除
if (p->size <= 0) {
printf("通讯录中没有联系人,请添加!\n");
}
else
{
printf("查找:");
scanf("%s", name);
int flag = FindValue(p, name);
if (flag == -1)
{
printf("联系人不存在!\n");
}
else
{
printf("确认删除?\n 1确认\n 2取消\n");
scanf("%d", temp);
if (temp == '1')
{
for (int i = 0; i < p->size - 1; i++)
{
p->data[i] = p->data[i + 1];
}
p->size--;
printf("删除成功!\n");
}
}
}
}
//**************修改联系人信息**************//
void Moidfy(struct Contact* p)
{
float get;
char name[NAME_LEN];
if (p->size <= 0) {
printf("通讯录中没有联系人,请添加!\n");
}
else
{
printf("查找:");
scanf("%s", name);
int flag = FindValue(p, name);
if (flag == -1)
printf("联系人不存在!\n");
else
printf("输入0退出修改,否则继续:>");
scanf("%f", &get);
if (get != 0)
{
printf("请输入姓名:>");
scanf("%s", p->data[flag].name);
printf("请输入住址:>");
scanf("%s", p->data[flag].address);
printf("请输入电话:>");
scanf_s("%d", &p->data[flag].telephone_num);
printf("请输入邮编:>");
scanf("%d", &p->data[flag].Postal);
printf("请输入E-mail:>");
scanf("%s", p->data[flag].E_mail);
printf("修改成功!");
}
}
}
//**************查找联系人信息**************//
void Search(struct Contact* p)
{
char name[NAME_LEN];
printf("查找:");
scanf("%s", name);
int flag = FindValue(p, name);
if (flag == -1)
{
printf("联系人不存在!\n");
}
else
{
printf("\t姓名:>");
printf("%s\n", p->data[flag].name);
printf("\t住址:>");
printf("%s\n", p->data[flag].address);
printf("\t电话:>");
printf("%d\n", p->data[flag].telephone_num);
printf("\t邮编:>");
printf("%d\n", p->data[flag].Postal);
printf("\tE-mail:>");
printf("%s\n", p->data[flag].E_mail);
}
}
//****************排序并显示****************//
void Sort(struct Contact *p)
{
if (p->size <= 0) {
printf("通讯录中没有联系人,请添加!\n");
}
else
{
int i, j;
for (i = 0; i < p->size - 1; i++)
{
for (j = 0; j < p->size - i - 1; j++)
{
if (strcmp(p->data[j].name, (p->data[j + 1]).name) > 0)
{
struct people temp;
temp = p->data[j];
p->data[j] = p->data[j + 1];
p->data[j + 1] = temp;
}
}
}
printf("排序成功!\n");
for (i = 0; i < p->size; i++)
{
printf("\t%s\n", *(p->data[i].name));
}
}
}
//*****************按姓名查找****************//
int FindValue(struct Contact* p, char* name)
{
int i = 0;
for (i = 0; i < p->size; i++)
{
if (strcmp(p->data[i].name, name) == 0)
return i;
}
return -1;
}
//***************显示通讯录*****************//
void Show(struct Contact* p)
{
FILE* fp = NULL;
fp = fopen("contact.txt", "r"); //可修改通讯录保存路径
if (NULL == fp)
{
printf("打开文件失败……\n");
exit(1);
}
for (int i = 0; i < p->size; i++)
{
fscanf(fp, "%-z10s%-10s%-10d%-10d%-10s\n ",
p->data[i].name,
p->data[i].address,
p->data[i].telephone_num,
p->data[i].Postal,
p->data[i].E_mail);
}
fclose(fp);
fp = NULL;
for (int i = 0; i < p->size; i++)
{
printf("%-10s%-10s%-10d%-10d%-10s\n ",
p->data[i].name,
p->data[i].address,
p->data[i].telephone_num,
p->data[i].Postal,
p->data[i].E_mail);
}
}
//****************保存通讯录*****************//
int SaveFILE(struct Contact *p)
{
FILE* fp = NULL;
fp = fopen("contact.txt", "a"); //可修改通讯录保存路径
if (NULL == fp)
{
printf("打开文件失败……\n");
exit(-1);
}
for (int i = 0; i < p->size; i++)
{
fprintf(fp, "%-10s%-10s%-10d%-10d%-10s\n ",
p->data[i].name,
p->data[i].address,
p->data[i].telephone_num,
p->data[i].Postal,
p->data[i].E_mail );
}
fclose(fp);
fp = NULL;
return 0;}