#define _CRT_SECURE_NO_WARNINGS //VS警告
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h> //頭文件
#define Max_name 1024 //名字字節最大值
#define Max_sex 4
#define Max_number 15
#define Max_address 1024
typedef struct contact
{
char name[Max_name];
char sex[Max_sex];
int age;
char number[Max_number];
char address[Max_address];
}contact;
typedef struct person{
contact *persinInfo;
int sequence;
int capacity; //當前數組的最大容量
}person;
person addr_num;
typedef void(*Fun)(person *);
void Init(person *addr_num){
assert(addr_num !=NULL);
addr_num->sequence = 0;
addr_num->capacity = 10;
addr_num->persinInfo = (contact*)malloc(sizeof(contact)*addr_num->capacity);
for (int i = 0; i < addr_num->capacity; ++i){
memset(addr_num->persinInfo[i].name, 0, Max_name);
memset(addr_num->persinInfo[i].address, 0, Max_address);
memset(addr_num->persinInfo[i].number, 0, Max_number);
memset(addr_num->persinInfo[i].sex, 0, Max_sex);
addr_num->persinInfo[i].age = 0;
}
}
int print_menu(){
printf("**********************************\n");
printf("** 1. 添加聯繫人信息 **\n");
printf("** 2. 刪除指定聯繫人信息 **\n");
printf("** 3. 查找指定聯繫人信息 **\n");
printf("** 4. 修改指定聯繫人信息 **\n");
printf("** 5. 顯示所有聯繫人信息 **\n");
//printf("** 6. 清空所有聯繫人 **\n");
//printf("** 7. 以名字排序所有聯繫 **\n");
//printf("** 8. 保存聯繫人到文件 **\n");
//printf("** 9. 加載聯繫人 **\n");
printf("** 0. 退出 **\n");
printf("**********************************\n");
printf("請輸入你要選擇的選項:\n");
int choice = 0;
scanf("%d", &choice);
return choice;
}
void add_people(person *addr_num){
assert(addr_num != NULL);
if (addr_num->sequence >= addr_num->capacity)
{
addr_num->capacity += 10;
addr_num->persinInfo = (contact *)realloc(addr_num->persinInfo,addr_num->capacity);
}
contact *per = &addr_num->persinInfo[addr_num->sequence];
printf("請輸入你要添加的名字\n");
scanf("%s", per->name);
printf("請輸入你要添加的性別\n");
scanf("%s",per->sex);
printf("請輸入你要添加的年齡\n");
scanf("%d", &(per->age));
printf("請輸入你要添加的電話號碼\n");
scanf("%s", per->number);
printf("請輸入你要添加的地址\n");
scanf("%s", per->address);
++addr_num->sequence;
printf("添加完成\n");
}
void del_people(person *addr_num){
int choice = 0;
assert(addr_num != NULL);
if (addr_num->sequence==0)
{
printf("當前沒有人可刪,請添加後進行操作\n");
return;
}
else {
while (1){
printf("請輸入你要刪除的人的序號:\n");
scanf("%d", &choice);
if (choice <= 0 || choice > addr_num->sequence){
printf("沒有該序號,請覈對後進行選擇\n");
continue;
}
else {
contact *p = &addr_num->persinInfo[choice-1];
contact *per = &addr_num->persinInfo[addr_num->sequence - 1];
strcpy(p->name, per->name);
strcpy(p->sex, per->sex);
strcpy(p->address, per->address);
strcpy(p->number, per->number);
p->age = per->age;
--addr_num->sequence;
break;
}
}
}
printf("已經刪除\n");
}
void printf_people(person *addr_num){
assert(addr_num != NULL);
if (addr_num->sequence == 0){ printf("共有%d條記錄\n", addr_num->sequence); return; }
printf("共有%d條記錄\n", addr_num->sequence);
for (int i = 0; i < addr_num->sequence; ++i){
contact*per = &addr_num->persinInfo[i];
printf("序號[%d]\n", i+1);
printf("姓名%s 電話號碼:%s\n", per->name, per->number);
printf("性別:%s 年齡:%d 住址:%s\n",per->sex, per->age, per->address);
printf("\n");
}
printf("顯示完成\n");
}
void find_people(person *addr_num){
assert(addr_num != NULL);
int choice = 0;
char name[15];
char number[15];
int i = 0;
while (1){
printf("請輸入你要查找的類型:\n");
printf("1.姓名\n");
printf("2.電話號\n");
scanf("%d", &choice);
if (choice != 1 && choice != 2){
printf("輸入錯誤請重新輸入\n");
continue;
}
else if (choice == 1){
printf("請輸入你要找的姓名\n");
scanf("%s", name);
for (i; i < addr_num->sequence; ++i){
if (strcmp(name,&addr_num->persinInfo[i].name)==0){
printf("該人的序號爲%d\n", i+1);
printf("姓名爲:%s\n",addr_num->persinInfo[i].name);
printf("性別爲:%s\n", addr_num->persinInfo[i].sex);
printf("年齡爲:%d\n", addr_num->persinInfo[i].age);
printf("電話爲:%s\n",addr_num->persinInfo[i].number );
printf("地址爲:%s\n", addr_num->persinInfo[i].address);
return;
}
}
}
else {
printf("請輸入你要找的電話:\n");
scanf("%s", number);
for (i; i < addr_num->sequence; ++i){
if (strcmp(number, &addr_num->persinInfo[i].number) == 0){
printf("該人的序號爲%d\n", i + 1);
printf("姓名爲:%s\n", addr_num->persinInfo[i].name);
printf("性別爲:%s\n", addr_num->persinInfo[i].sex);
printf("年齡爲:%d\n", addr_num->persinInfo[i].age);
printf("電話爲:%s\n", addr_num->persinInfo[i].number);
printf("地址爲:%s\n", addr_num->persinInfo[i].address);
return;
}
}
}
printf("沒找到人,請重新覈對\n");
return ;
}
return ;
}
void modify_people(person *addr_num){
assert(addr_num != NULL);
int choice = 0;
while (1){
printf("請輸入你要修改的序號(輸入0退出)\n");
scanf("%d", &choice);
if (choice == 0){ return; }
if (choice<0 || choice>addr_num->sequence)
{
printf("沒有該序號,請覈對\n");
continue;
}
else{
printf("請輸入你要修改的值:\n");
printf("1.姓名\t2.性別\t3.年齡\t4.電話號碼\t5.地址 \n");
int choose = 0;
scanf("%d", &choose);
if (choose == 1){
printf("請輸入要修改的姓名:\n");
scanf("%s", addr_num->persinInfo[choice-1].name);
continue;
}
else if (choose == 2){
printf("請輸入要修改的性別:\n");
scanf("%s", addr_num->persinInfo[choice - 1].sex);
continue;;
}
else if (choose == 3){
printf("請輸入要修改的年齡:\n");
scanf("%d", addr_num->persinInfo[choice - 1].age);
continue;
}
else if (choose == 4){
printf("請輸入要修改的電話:\n");
scanf("%s", addr_num->persinInfo[choice - 1].number);
continue;
}
else if (choose == 5){
printf("請輸入要修改的地址:\n");
scanf("%s", addr_num->persinInfo[choice - 1].address);
continue;
}
else printf("選擇錯誤\n");
}
}
}
int main(){
Init(&addr_num);
Fun arr[] = {
NULL,
add_people,
del_people,
find_people,
modify_people,
printf_people,
};
int index = 0;
while (1){
index=print_menu();
if (index==0)
{
printf("通訊錄已結束\n");
break;
}
else if (index<0 || index>6){
printf("你輸入的有誤,請重新輸入\n");
continue;
}
system("cls");
arr[index](&addr_num);
}
system("pause");
return 0;
}
有問題的地方請指出,不會的問題請提出。