C07 模块化开发信息管理系统案例
目录
- 需求分析
- 问题分析
- 开发阶段
需求分析
总体需求
学员信息管理系统支持以下功能
- 增加学员信息功能
- 删除学员信息功能
- 查询学员信息功能
- 修改学员信息功能
- 输出所有学员信息功能
- 退出系统
其他需求
- 学员信息需求
- 学号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"); }
本博客文章未经许可,禁止转载和商业用途!
如有疑问,请联系: 2083967667@qq.com