这个作业属于哪个课程 | 班级链接 |
---|---|
这个作业要求在哪里 | 作业链接 |
这个作业的目标 | 学会用结构体写菜单通讯录等程序 |
其他参考文献1 | 清屏函数 |
其他参考文献2 | 全局or局部变量讲解 |
作业正文 | 本篇博客 |
1.1 需求分析
- 1、对应不同功能需要使用多个函数对数据进行处理,所以首先需要制作一个菜单。
- 2、删除以及查找功能需要判断是否存在数据,所以需要额外做一个判断程序。
- 3、大致思路为结构体+指针+自定义函数+选择菜单=通讯录。
- 4、参考资料中给出了清屏函数与各类变量等资料,大概率需要使用,尽量使程序完善。
1.2 程序代码
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int g=0,max=50;
typedef struct person
{
int N;
char name[20];
char t[20];
}people;
typedef struct all
{
struct person people[50];
int x;
}all;
struct all MY_addressbook;
void caidan();
void Add(all*p);
void Delete(all*p);
void Search(all*p);
void Change(all*p);
void paixu(all*p);
int main()
{
MY_addressbook.x=0;
caidan();
return 0;
}
void menu()
{
printf("=====================通讯录=====================
");
printf("===== 界面 =====
");
printf ("人数:%d人 |剩余空间:%d人
",g,max);
for(int i=0;i<50;i++)
{
if (MY_addressbook.people[i].N!=0)
printf("编号:%d |姓名:%s |电话:%s
",MY_addressbook.people[i].N,MY_addressbook.people[i].name,MY_addressbook.people[i].t);
}
printf("操作列表:
");
printf("===== 1)排序 2)添加 3)删除 =====
");
printf("===== 4)修改 5)查找 6)退出程序=====
");
}
void caidan()
{
int a=0;
do
{
menu();
printf("请输入操作;
");
scanf("%d",&a);
switch(a)
{
case 1:
paixu(&MY_addressbook);
system("cls");
break;
case 2:
Add(&MY_addressbook);
system("cls");
break;
case 3:
Delete(&MY_addressbook);
system("cls");
break;
case 4:
Change(&MY_addressbook);
system("cls");
break;
case 5:
Search(&MY_addressbook);
system("cls");
break;
case 6:
exit(0);
break;
default :
printf("Error!!!
错误操作指令, 请重新输入
");
break;
}
}while(a);
}
void Add(all*p)
{
int m;
printf("请输入添加位置:");
scanf("%d",&m);
p->people[p->x].N=m;
if(m>50||m<=0)
{
printf("处理编号超过阈值!
");
}
else
{
printf("请输入联系人姓名:");
scanf("%s",&p->people[p->x].name);
printf("请输入联系人电话:");
scanf("%s",&p->people[p->x].t);
g++;max--;
}
p->x++;
}
int FindEntry(all*p,char *name)
{
for(int i=0;i<(p->x);i++)
{
if(strcmp(p->people[i].name,name)==0)
{
return i;
}
if(i==p->x)
{
return 1;
}
}
}
void Search(all*p)
{
int flag;
char name[10]={0};
printf("请输入你要查找联系人的姓名:");
scanf("%s",&name);
flag=FindEntry(p,name);
if(flag==1)
{
printf("查无此人!
");
}
else
{
printf("编号:%d |姓名:%s |电话:%d
",p->people[flag].N,p->people[flag].name,p->people[flag].t);
}
}
void Delete(all*p)
{
int flag;
char name[10]={0};
printf("请输入删除联系人:
");
scanf("%s",&name);
flag=FindEntry(p,name);
if(flag==1)
{
printf("此处无数据!
");
}
else
{
for(int j=flag;j<p->x;j++)
{
p->people[j]=p->people[j+1];
}
printf("删除成功!
");
g--;max++;
}
p->x--;
}
void Change(all*p)
{
int flag;
char n[10]={0};
printf("请输入修改联系人:
");
scanf("%s",&n);
flag=FindEntry(p,n);
if(flag==1)
{
printf("此处无数据!
");
}
else
{
printf("请重新输入编号:
");
scanf("%d",&p->people[flag].N);
printf("请重新输入姓名:
");
scanf("%s",&p->people[flag].name);
printf("请重新输入电话:
");
scanf("%s",&p->people[flag].t);
}
}
void paixu(all*p)
{
int i,j,k;
printf("请选择排序的方式:");
printf("1)编号排序 2)姓名排序");
scanf("%d",&k);
switch(k)
{
case 1:
for(i=0;i<(p->x-1);i++)
{
for(j=0;j<(p->x-i-1);j++)
{
if(p->people[j].N > p->people[j+1].N)
{
people q;
q=p->people[j];
p->people[j]=p->people[j+1];
p->people[j+1]=q;
}
}
}
break;
case 2:
for(i=0;i<(p->x-1);i++)
{
for(j=0;j<(p->x-i-1);j++)
{
if(strcmp(p->people[j].name,p->people[j+1].name)<0)
{
people q;
q=p->people[j];
p->people[j]=p->people[j+1];
p->people[j+1]=q;
}
}
}
break;
default :
printf("输入错误,请重试。");
break;
}
}
1.3 函数调用图与流程图
1.4 功能测试
-
添加操作
-
删除操作
- 修改操作
- 排序操作