一、前言
熬过指针,小白我学到了结构体了,不过在B站大学学了枚举和共用体,然后自己 打了“通讯录“的代码
二、一些注意点
打开VS,关闭sld,这样才可以使用scanf
1.头文件
代码如下:
#include<stdio.h>
#include<string.h>
#define max 100
#define max_name 20
#define max_sex 5
#define max_tale 12
#define max_add 30
enum Option
{
EXIT, //0
ADD, //1
DEL, //2
SEARCH, //3
MODIFY, //4
SHOW, //5
};
struct Peoinfo
{
char name[max_name];
int age;
char sex[max_sex];
char tale[max_tale];
char add[max_add];
};
struct Contact
{
struct Peoinfo data[max];
int size; //记录当前已经有的元素个数
};
void Initcontact(struct Contact* ps);
void Addcontact(struct Contact* ps);
void Showcontact(struct Contact* ps);
void Delcontact(struct Contact* ps);
void Searchcontact(const struct Contact* ps);
void Modifycontact(struct Contact* ps);
2.源文件
1、调用函数
代码如下:
#include"contact.h"
void Initcontact(struct Contact* ps)
{
memset(ps->data, 0, sizeof(ps->data));
ps->size = 0;//设置通讯录最初只有0个元素
}
void Addcontact(struct Contact* ps)
{
if (ps->size == max)
{
printf("通讯录已经满了\n");
}
else
{
printf("请输入联系人姓名:\n");
scanf("%s", ps->data[ps->size].name);
printf("请输入联系人年龄:\n");
scanf_s("%d", &(ps->data[ps->size].age));
printf("请输入联系人性别:\n");
scanf("%s", ps->data[ps->size].sex);
printf("请输入联系人电话:\n");
scanf("%s", ps->data[ps->size].tale);
printf("请输入联系人地址:\n");
scanf("%s", ps->data[ps->size].add);
ps->size++;
printf("添加成功\n");
}
}
void Showcontact(struct Contact* ps)
{
if (ps->size == 0)
printf("通讯录为空\n");
else
{
//先打打印表头
printf("%20s\t%4s\t%5s\t%12s\t%20s\t", "name", "age", "sex", "tale", "add");
printf("\n");
for (int i = 0; i < ps->size; i++)
{
printf("%20s\t%4d\t%5s\t%12s\t%20s\n", ps->data[i].name, ps->data[i].age,
ps->data[i].sex, ps->data[i].tale, ps->data[i].add);
}
}
}
void Delcontact(struct Contact* ps)
{
char name[max_name];
printf("请输入要删除的名字:>");
scanf("%s", name);
//删除指定联系人,先要找到名字所在的位置(查找)
int pos = FindByname(ps, name);
if (pos==-1)
{
printf("要删除的人不存在\n");
}
else //删除
{
int j = 0;
for (j = pos; j < ps->size-1; j++)
{
ps->data[j] = ps->data[j + 1];
}
ps->size--;
printf("删除成功\n");
}
}
void Searchcontact(struct Contact* ps)
{
char name[max_name];
printf("请输入要查找的名字:>");
scanf("%s", name);
int p = FindByname(ps, name);
if (p == -1)
{
printf("该联系人不存在\n");
}
else
{
printf("%20s\t%4s\t%5s\t%12s\t%20s\t", "name", "age", "sex", "tale", "add");
printf("\n");
printf("%20s\t%4d\t%5s\t%12s\t%20s\n", ps->data[p].name, ps->data[p].age,
ps->data[p].sex, ps->data[p].tale, ps->data[p].add);
}
}
void Modifycontact(struct Contact* ps)
{
char name[max_name];
printf("请输入要修改的联系人:\n");
scanf("%s", name);
int y = FindByname(ps, name);
if (y == -1)
{
printf("该联系人不存在\n");
}
else
{
printf("请输入联系人姓名:\n");
scanf("%s", ps->data[y].name);
printf("请输入联系人年龄:\n");
scanf_s("%d", &(ps->data[y].age));
printf("请输入联系人性别:\n");
scanf("%s", ps->data[y].sex);
printf("请输入联系人电话:\n");
scanf("%s", ps->data[y].tale);
printf("请输入联系人地址:\n");
scanf("%s", ps->data[y].add);
printf("修改成功\n");
}
}
static int FindByname(const struct Contact* ps, char name[max_name])
{
int i = 0;
for (i = 0; i < ps->size; i++)
{
if (0 == strcmp(ps->data[i].name, name))
{
return i;
}
}
}
2、主函数
#include"contact.h"
#define max 1000
void menu()
{
printf("下面为你可执行的操作:\n");
printf("1.输入联系人信息\n");
printf("2.删除指定联系人信息\n");
printf("3.查找某联系人的信息\n");
printf("4.修改某联系人的信息\n");
printf("5.输出联系人信息\n");
printf("0.退出\n");
}
int main()
{
int input = 0;
struct Contact con;//包含1000个元素的数组和size
//初始化通讯录
Initcontact(&con);
do
{
menu();
printf("选择:>");
scanf_s("%d", &input);
switch (input)
{
case ADD: //添加信息
Addcontact(&con);
break;
case DEL: //删除指定联系人信息
Delcontact(&con);
break;
case MODIFY: //修改某联系人信息
Modifycontact(&con);
break;
case SEARCH: //查找指定联系人信息
Searchcontact(&con);
break;
case SHOW: //输出信息
Showcontact(&con);
break;
case EXIT: //退出通讯录
printf("退出通讯录\n");
break;
}
} while (input);
return 0;
}
总结
文章总结:
1、自己完成这段长长的代码不容易呀,花了我近2天的时间,虽然过程遇到好多问题,不过在老师和网络的帮助下,结果成功完成这个代码,我真的好开心,不得不说B站老师好厉害呀。
然后希望有位大佬能帮我解决这个问题:
为什么会这样呢?要如何改变源代码才不会发生这个问题。