目录
- 需求分析
- 问题分析
- 开发阶段
需求分析
总体需求
学员信息管理系统支持以下功能
- 增加学员信息功能
- 删除学员信息功能
- 查询学员信息功能
- 修改学员信息功能
- 输出所有学员信息功能
- 退出系统
其他需求
- 学员信息需求
- 学号4位数字
- 姓名不能超过20个字符
- 地址不能超过30个字符
- 手机号码必须为11位数字
- 成绩在0-100之间
- 初始状态系统保持2名学员信息
- 必要的信息提示
- 例如:姓名长度不正确、手机号码长度不正确等。
问题分析
全局变量
Char students[50][200]; //存储50个学员信息,每一行代表一个学员信息,每个信息项之间用”$“隔开
int stu_num; //当前已经存储的学员的个数
功能模块划分
功能模块分析
开发阶段
阶段划分
第一阶段
实现界面搭建和数据初始化
实现效果
难点分析
1.变量和函数的定义
2.初始化函数init()
3.输出学员信息的listStu()函数
第二阶段
实现输入学员信息
实现效果
变量和函数的定义
每项信息的存储
Flag用来标识前一项信息是否录入正确,本项信息是否录入完成。
整数转换成字符数组函数:sprintf(字符数组,”%d”,整数)
每项操作完成后返回主菜单
第三阶段
实现按照学号删除学员信息
实现效果
删除成功提示删除成功。
删除失败提示未找到该学员。
变量和函数的定义
getStuRowByNo()函数的实现
deleteByNo()函数的实现
删除原理:二维数组类似表格,删除所在行即把这一行之后的数据依次覆盖前一行的数据。注意:删除一行数据后,需要把stu_num变量减去1。
第四阶段
格式化显示学员信息
实现效果
变量和函数的定义
修改listStu()函数。增加数据数据格式转换函数analyse()。
analyse()函数的实现
功能:解析学员信息
实现:
修改listStu()函数
第五阶段
根据学号查找学生信息
实现效果
变量和函数的定义
queryByNo()函数的实现
功能:根据学号,查找学员信息并显示
第六阶段
修改学员信息
实现效果
变量和函数的定义
modifyInfoByNo()函数的实现
功能:根据学号,修改该学员信息。如果存在该学员,则调用新增学生信息,覆盖之前的信息。
综合案例参考代码
带登录功能,数据字典使用结构体数组。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//学生信息结构体
struct Student{
int id;//学号
char name[20];//姓名
int age;//年龄
char gender[10];//性别
char classes[20];//班级
};
/*自定义函数声明*/
void init();
void login();
void menuAdmin();
void menuGuest();
void addStudent();
void deleteStudentById();
void modifyStudentById();
void getStudentById();
void listStudent();
int getStudentPos(int id);
/*数据字典:全局变量*/
struct Student list[50];//定义结构体数组
int stu_num=3; //当前已经存储的学员的个数
/*主调函数*/
int main(){
init();//数据初始化
login();//登录
return 0;
}
/*登录函数*/
void login(){
char name[20];//账号
char pwd[20];//密码
printf("\t请输入账号:");
scanf("%s",&name);
printf("\t请输入密码:");
scanf("%s",&pwd);
if(strcmp("admin",name)==0&&strcmp("123",pwd)==0){//管理员登录
menuAdmin();
}else{//游客登录
menuGuest();
}
}
/*后台菜单函数*/
void menuAdmin(){
int option;//用户的选择
printf("\t******************\n");
printf("\t|学员信息管理系统|\n");
printf("\t******************\n");
printf("\t1.输入学生资料\n");
printf("\t2.删除学生资料\n");
printf("\t3.查找学生资料\n");
printf("\t4.修改学生资料\n");
printf("\t5.输出学生资料\n");
printf("\t0.退出系统\n");
printf("\t******************\n");
printf("\t请选择操作:");
scanf("%d",&option);
switch(option){
case 1:
addStudent();//添加学生
menuAdmin();//递归
break;
case 2:
deleteStudentById();//删除学生信息
menuAdmin();//递归
break;
case 3:
getStudentById();//根据学号查询学生信息
menuAdmin();//递归
break;
case 4:
modifyStudentById();//编辑学生信息
menuAdmin();//递归
break;
case 5:
listStudent();//查询全部学生信息
menuAdmin();//递归
break;
case 0:printf("\t>>>感谢使用学生信息管理系统!\n");break;
default :printf("\t***输入错误!***\n");menuAdmin();//递归
}
}
/*前台菜单函数*/
void menuGuest(){
int option;//用户的选择
printf("\t******************\n");
printf("\t|学员信息管理系统|\n");
printf("\t******************\n");
printf("\t1.查找学生资料\n");
printf("\t2.输出学生资料\n");
printf("\t0.退出系统\n");
printf("\t******************\n");
printf("\t请选择操作:");
scanf("%d",&option);
switch(option){
case 1:
getStudentById();//根据学号查询学生信息
menuGuest();
break;
case 2:
listStudent();//查询全部学生信息
menuGuest();
break;
case 0:printf("\t>>>感谢使用学生信息管理系统!\n");break;
default :printf("\t***输入错误!***\n");menuGuest();
}
}
/*数据初始化*/
void init(){
struct Student zs; /* 声明 zs,类型为 Student */
struct Student ls; /* 声明 ls,类型为 Student */
struct Student ww; /* 声明 ww,类型为 Student */
/* zs 初始化 */
zs.id=2016001;
strcpy(zs.name, "张三");
zs.age=21;
strcpy(zs.gender, "男");
strcpy(zs.classes, "软件工程1班");
/* ls 初始化 */
ls.id=2016002;
strcpy(ls.name, "李四");
ls.age=18;
strcpy(ls.gender, "女");
strcpy(ls.classes, "软件工程2班");
/* ww 初始化 */
ww.id=2016048;
strcpy(ww.name, "王五");
ww.age=23;
strcpy(ww.gender, "男");
strcpy(ww.classes, "软件工程3班");
//结构体数组初始化
list[0]=zs;
list[1]=ls;
list[2]=ww;
}
/*输入学生信息*/
void addStudent(){
printf("\t>>>请输入学生资料:\n");
struct Student student;
//从控制台输入学生信息
int id;
char name[50];
int age;
char gender[3];
char classes[50];
printf("\t请输入学号:");
scanf("%d",&id);
student.id=id;
printf("\t请输入姓名:");
scanf("%s",name);
strcpy(student.name, name);
printf("\t请输入年龄:");
scanf("%d",&age);
student.age=age;
printf("\t请输入性别:");
scanf("%s",gender);
strcpy(student.gender, gender);
printf("\t请输入班级:");
scanf("%s",classes);
strcpy(student.classes, classes);
//把结构体添加到结构体数组中
list[stu_num]=student;
stu_num++;//学生数量增加1个
}
/*删除学生信息*/
void deleteStudentById(){
printf("\t>>>删除学生资料,请输入学号:");
int id,i;
scanf("%d",&id);
int pos=getStudentPos(id);//获取位置
if(pos==-1){//未找到提示
printf("\n\t********查无此人,请确认学号后再输入********\n");
return;//结束当前函数
}else{//删除
for(i=pos;i<stu_num;i++){
list[i]=list[i+1];
}
stu_num--;//学生人数减少一个
printf("\n\t********删除学号为%d的学生成功!********\n\n",id);
}
}
/*根据学号查询学生结构体变量在数组中的位置*/
int getStudentPos(int id){
int pos=-1;//位置
int flag=0;//是否找到:0表示查无此人;1表示找到
int i;
//查找学生位置
for(i=0;i<stu_num;i++){
if(list[i].id==id){
pos=i;//找到该学生在结构体数组中的位置
flag=1;
break;
}
}
return pos;
}
/*修改学生信息*/
void modifyStudentById(){
printf("\t>>>修改学生资料,请输入学号:");
int id;
scanf("%d",&id);
int pos=getStudentPos(id);//获取位置
if(pos==-1){//未找到提示
printf("\n\t********查无此人,请确认学号后再输入********\n");
return;//结束当前函数
}else{
//从控制台输入学生信息
char name[50];
int age;
char gender[3];
char classes[50];
printf("\t请输入新的姓名:");
scanf("%s",name);
strcpy(list[pos].name, name);
printf("\t请输入新的年龄:");
scanf("%d",&age);
list[pos].age=age;
printf("\t请输入新的性别:");
scanf("%s",gender);
strcpy(list[pos].gender, gender);
printf("\t请输入新的班级:");
scanf("%s",classes);
strcpy(list[pos].classes, classes);
printf("\n\t********修改学生信息成功!********\n\n");
}
}
/*查询学生信息*/
void getStudentById(){
printf("\t>>>查找学生资料,请输入学号:");
int id;
scanf("%d",&id);
int pos=getStudentPos(id);//获取位置
if(pos==-1){//未找到提示
printf("\n\t********查无此人,请确认学号后再输入********\n");
return;//结束当前函数
}else{
//输出学生信息
printf("%d\t%s\t%d\t%s\t%s\n", list[pos].id,list[pos].name,list[pos].age,list[pos].gender,list[pos].classes);
}
}
/*查询全部学生信息*/
void listStudent(){
printf("\t>>>学生资料列表:\n");
int i;
printf("学号\t姓名\t年龄\t性别\t班级\n");
for(i=0;i<stu_num;i++){
/* 输出学生列表信息 */
printf( "%d\t%s\t%d\t%s\t%s\n", list[i].id,list[i].name,list[i].age,list[i].gender,list[i].classes);
}
printf("\n");
}