设计要求
问题描述
纸质的通讯录系统已经不能满足大家的要求,容易丢失、查找困难等问题是纸质通讯录所不能克服的缺点。“学生通讯管理系统”是为了帮助老师、同学,或者其他一些需要使用通讯录的人员进行管理和分析的一种应用程序。
需求分析
- 输入数据建立通讯录
- 查询通讯录系统中满足要求的信息
- 插入新的通讯录信息
- 删除不需要的通讯录信息
- 查看所有通讯录信息
概要设计
主界面设计
为了实现学生通讯录管理系统各功能的管理,设计一个含有多个菜单项的主控菜单子程序以链接系统的各项子功能,方便用户使用本系统。本系统主控菜单运行界面如图所示。
存储结构设计
本系统主要采用链表结构类型来表示存储在“学生通讯录管理系统”中的信息。其中,链表结点由四个分量构成;通讯录成员学号、通讯录成员姓名、通讯录成员电话号码、指向该结构体的指针。
系统功能设计
本系统设置了5个子功能菜单,5个子功能的设计描述如下。
- 建立通讯录系统。可以一次输入多个成员通讯录的信息,建立通讯录。
- 插入通讯记录。每次可以插入一个成员通讯录的信息。如果要连续插入多个成员通讯录信息必须多次选择该功能。
- 查询通讯记录。可以按两种方式查询所需要的通讯录成员记录,一是按学号查询,二是按姓名查询。
- 删除通讯记录。可以对通讯录中不再需要的信息进行删除。
- 显示通讯录系统。可以查看通讯录中所有的通讯录成员记录。
程序代码
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
typedef struct student //定义学生结点
{
char name[20]; //姓名
int num; //学号
char phone[20]; //电话
struct student *next;
}stud;
void Menu() //菜单
{
printf("\n\n\n");
printf("***********************班级通讯录管理系统***********************\n\n");
printf(" 1.建立通讯录 \n\n");
printf(" 2.添加通讯录 \n\n");
printf(" 3.删除通讯录 \n\n");
printf(" 4.查询通讯录 \n\n");
printf(" 5.显示通讯录 \n\n");
printf(" 0.退出系统 \n\n");
printf("****************************************************************\n");
}
void Init(stud *H) //初始化
{
H->next=NULL;
}
void Input(stud *H) //输入
{
int n;
stud *p, *q;
p=H;
while(p->next)
{
p=p->next; //p指向链表的最后一个结点
}
while(true)
{
q=(stud *)malloc(sizeof(stud)); //申请空间
q->next = NULL;
printf("请输入学生信息:\n");
printf("姓名:"); scanf("%s", &q->name); printf("\n");
printf("学号:"); scanf("%d", &q->num); printf("\n");
printf("电话:"); scanf("%s", &q->phone); printf("\n");
p->next=q;
p=q;
// system("cls"); //清屏
printf("是否接着输入:1(继续)/0(结束)\n");
scanf("%d", &n);
if(n==0) break;
}
}
void Output(stud *H) //显示输出
{
// system("cls");
stud *p;
p = H->next;
if(!p)
{
printf("\n没有学生记录!!!\n");
return ;
}
printf("姓名 学号 电话\n");
while(p) //输出学生记录
{
printf("%s %d %s\n", p->name, p->num,p->phone);
p=p->next;
}
}
void Findm(stud *H) //查询姓名
{
// system("cls");
char str[20];
bool f=false;
stud *p;
p=H->next;
printf("请输入姓名:\n");
scanf("%s", str);
if(!p)
{
printf("没有符合条件的学生记录!\n");
return ;
}
printf("姓名 学号 电话\n");
while(p)
{
if(strcmp(str, p->name)==0) //找到了一条符合条件的记录
{
f=true;
printf("%s %d %s\n",
p->name, p->num,p->phone);
}
p=p->next;
}
if(!f)
{
printf("没有符合条件的学生记录!\n");
}
}
void Findh(stud *H) //查询学号
{
// system("cls");
char str;
bool f=false;
stud *p;
p=H->next;
printf("请输入学号:\n");
scanf("%d", str);
if(!p)
{
printf("没有符合条件的学生记录!\n");
return ;
}
printf("姓名 学号 电话\n");
while(p)
{
if(str==p->num) //找到了一条符合条件的记录
{
f=true;
printf("%s %d %s\n",
p->name, p->num, p->phone);
}
p=p->next;
}
if(!f)
{
printf("没有符合条件的学生记录!\n");
}
}
void Find(stud *H) //查询
{
int select;
// system("cls");
printf("*************************查询**************************************\n\n");
printf(" 1.按姓名 \n\n");
printf(" 2.按学号 \n\n");
printf(" 0.退出 \n\n");
printf("*******************************************************************\n\n");
while(true)
{
printf("请选择(0-2)");
scanf("%d",&select);
if(select>=0&&select<3) break;
}
switch(select)
{
// case 0: return 0; break;
case 1: Findm(H); break;
case 2: Findh(H); break;
}
}
void Del(stud *H)//删除学生信息
{
char str[20];
printf("\n请输入要删除记录的姓名:\n");
scanf("%s", str);
stud *p, *q;
p=H;
q=H->next;
bool flag=false;
while(q)
{
if(strcmp(q->name, str)==0)
{
flag=true;
p->next=q->next;
q=p->next;break;
}
p=q;
q=q->next;
}
printf("\n删除成功!!\n");
printf("\n\n删除成功后的学生通讯信息:\n");
Output(H);
}
void Add(stud *H) //添加学生信息
{
int n;
stud *p, *q;
p=H;
while(p->next) //p指向链表的最后一个结点
{
p=p->next;
}
while(true)
{
q=(stud *)malloc(sizeof(stud)); //申请空间
q->next = NULL;
printf("\n请输入添加学生的信息:\n");
printf("姓名:"); scanf("%s", &q->name); printf("\n");
printf("学号:"); scanf("%d", &q->num); printf("\n");
printf("电话:"); scanf("%s", &q->phone); printf("\n");
p->next=q;
p=q;
// system("cls"); //清屏
printf("是否继续添加:1(继续)/0(结束)\n");
scanf("%d", &n);
if(n==0) break;
}
printf("\n添加成功!\n");
printf("\n\n添加成功后的学生通讯信息:\n");
Output(H);
}
int main()
{
stud *H;
H = (stud *)malloc(sizeof(stud)); //注意,申请空间的时候最好是在主函数中申请
Init(H); //初始化,申请一个头结点
bool flag;
int select, m;
while(true)
{
Menu();
printf("请输入(0-5):\n");
flag=true;
while(flag)
{
flag=false;
scanf("%d", &select);
if(select<0 || select>5)
{
printf("输入不正确,请重新输入(0-5):\n");
flag=true;
}
}
switch(select)
{
case 0: return 0; break;
case 1: Input(H); break;
case 2: Add(H); break;
case 3: Del(H); break;
case 4: Find(H); break;
case 5: Output(H); break;
}
printf("\n请选择:1(继续)/0(结束)\n");
scanf("%d", &m);
if(m==0) return 0;
// system("cls"); //清屏
}
return 0;
}
微信公众号