创建一个最多包含50人的通讯录(包含姓名、性别、年龄、电话),实现以下功能:
- 录入信息:能够实现通讯数据的录入;
- 排序功能:能够按照年龄从小到大进行排序;
- 查询信息:根据输入的姓名查找并输出其相关全部信息;
- 插入信息:插入某人的信息,插入后仍然保持通讯录排好的顺序;
- 删除信息:输入某人的姓名,可以从通讯录中删除该人;
- 修改信息:可以修改某人的特定信息,如电话;
- 查看信息:查看整个通讯录的信息。
实验目的及其要求:
- 掌握结构体变量的概念与应用;
- 熟悉结构体在内存中的存储方式;
- 掌握结构体变量作为函数参数与返回值的程序设计方法;
- 熟悉结构体数组的运用。
头文件
#include <stdio.h>
#include <string.h>
全局变量定义
int n=50;
函数体声明
void menu();
struct student input();
void enter(struct student stu[]);
void sort(struct student stu[]);
void search(struct student stu[]);
void insert(struct student stu[]);
void delete1(struct student stu[]);
void revise(struct student stu[]);
void display(struct student stu[]);
结构体定义
struct student
{
char name[100];
int gender;
int age;
char telephone[100];
}stu[100];
主函数
int main()
{
while(1)
{
int ch;
menu();
printf("Please Input your choice:");
scanf("%d",&ch);
switch(ch)
{
case 1:enter(stu);break;
case 2:sort(stu);break;
case 3:search(stu);break;
case 4:insert(stu);break;
case 5:delete1(stu);break;
case 6:revise(stu);break;
case 7:display(stu);break;
case 0:return 0;
}
}
}
菜单函数
void menu()
{
printf(" ______________________________________________________________________\n");
printf("|**********************┍ -----------------------┑ *********************|\n");
printf("|********************** 欢迎使用通信管理系统 *********************|\n");
printf("|**********************┕------------------------┙ *********************|\n");
printf("|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx菜单xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|\n");
printf("|======================================================================|\n");
printf("|....... 1.录入信息 ...... 2.排序功能 .......|\n");
printf("|....... 3.查询信息 ...... 4.插入信息 .......|\n");
printf("|....... 5.删除信息 ...... 6.修改信息 .......|\n");
printf("|....... 7.查看信息 ...... 0.退出系统 .......|\n");
printf("|______________________________________________________________________|\n");
}
输入信息函数
struct student input()
{
struct student stu;
printf("input name\n");
gets(stu.name);
printf("input gender 1 or 0\n");
scanf("%d",&stu.gender);
printf("input age\n");
scanf("%d",&stu.age);
getchar();
printf("input telephone\n");
gets(stu.telephone);
return stu;
}
1、录入:通讯录使用前的信息录用函数
void enter(struct student stu[])
{
int i;
getchar();
for(i=0;i<n;i++)
{
stu[i]=input();
if(i<n)
printf("\n\nnext student\n\n\n");
}
printf("录入成功!!!!\n\n");
}
2、排:按照年龄从小到大进行排序
void sort(struct student stu[])
{
int i,j;
struct student t={0};
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
if(stu[i].age>stu[j].age)
{
t=stu[i];
stu[i]=stu[j];
stu[j]=t;
}
}
}
printf("排序成功!!!!\n\n");
}
3、查:根据输入的姓名查找并输出其相关全部信息
void search(struct student stu[])
{
int i,k,flag=0;
char name1[100];
getchar();
printf("input search's name\n");
gets(name1);
for(i=0;i<n;i++)
{
if(strcmp(stu[i].name,name1)==0)
{
k=i;
flag=1;
break;
}
}
if(flag==1)
{
printf("name gender age telephone\n");
printf("%-8s",stu[i].name);
printf("%-10d",stu[i].gender);
printf("%-7d",stu[i].age);
printf("%-15s",stu[i].telephone);
printf("\n");
printf("查询成功!!!!\n\n");
}
else
printf("未查询到该联系人的信息\n");
}
4、增:插入某人的信息,插入后仍然保持通讯录排好的顺序
void insert(struct student stu[])
{
int i;
printf("putchar message\n");
getchar();
stu[n]=input();
printf("插入成功!!!!\n\n");
n+=1;
sort(stu);
}
5、删:输入某人的姓名,可以从通讯录中删除该人
void delete1(struct student stu[])
{
int i,k,j,flag=0;
char name1[100];
getchar();
printf("input delete1's name\n");
gets(name1);
for(i=0;i<n;i++)
{
if(strcmp(stu[i].name,name1)==0)
{
k=i;
flag=1;
break;
}
}
if(flag==1)
{
for(j=k;j<n-1;j++)
{
stu[j]=stu[j+1];
}
n-=1;
printf("删除成功!!!!\n\n");
}
else
printf("删除失败!!!!\n\n");
}
6、改:可以修改某人的特定信息,如电话。
void revise(struct student stu[])
{
int i,x,k,flag=0;
char name1[100];
getchar();
printf("input revise's name\n");
gets(name1);
for(i=0;i<n;i++)
{
if(strcmp(stu[i].name,name1)==0)
{
k=i;
flag=1;
break;
}
}
if(flag==1)
{
printf("putchar revise message\n");
printf("1、name 2、gender 3、age 4、telephone\n");
scanf("\n%d",&x);
switch(x)
{
case 1:
{
printf("Please input new name:\n");
scanf("%s",&stu[k].name);
break;
}
case 2:
{
printf("Please input new gender:\n");
scanf("%d",&stu[k].gender);
break;
}
case 3:
{
printf("Please input new age:\n");
scanf("%d",&stu[k].age);
break;
}
case 4:
{
printf("Please input new telephone:\n");
scanf("%s",&stu[k].telephone);
break;
}
}
printf("修改成功!!!!\n\n");
}
else
printf("输入有误!!!!\n\n");
}
7、看:查看学生管理系统信息
void display(struct student stu[])
{
int i;
printf("name gender age telephone\n");
for(i=0;i<n;i++)
{
printf("%-8s",stu[i].name);
printf("%-10d",stu[i].gender);
printf("%-7d",stu[i].age);
printf("%-15s",stu[i].telephone);
printf("\n");
}
printf("查看完毕!!!!\n\n");
}
写的期间出现的BUG及技巧:
1、利用结构体变量作为函数的参数和返回值;
2、scanf函数缓冲区,利用getchar()或者scanf()内写上’\n'去吸收‘\n';(鸣谢xiaowu..投食的知识点)
3、利用if语句、开关变量来判断是否功能实现,避免进入死循环;
4、结构体变量定义长度,避免输出时出现乱码;
5、利用strcmp函数比较输入的信息和结构体数组信息,以此判断是否进入相应功能;
菜单设计来源于 KIN布,如有侵权,联系删除。