本帖最后由 evenzhu1989 于 2015-6-1 19:23 编辑
这是我做基础测试题遇到的最难的题,代码是在如意大师的“通讯录”基础上修改而来,现在将代码贴出来,希望和同学们可以一起交流和讨论
- /*
- 9、 编写一个学生管理系统程序,用来记录学生的信息(包括姓名、年龄、性别、学号、分数),提供增加、删除、查询学生信息的入口。(C语言)
- */
- #include <stdio.h>
- #include <string.h>
- //定义宏
- #define N 100 //定义通讯录容量
- #define NAMELEN 22
- #define AGELEN 16
- #define SEXLEN 4
- #define STUNUMLEN 22
- #define SCORELEN 16
- #define NUMLEN 12
- //定义部分
- //定义学生的结构体
- typedef struct
- {
- //学生姓名
- char name[NAMELEN];
- //学生年龄
- char age[AGELEN];
- //学生性别
- char sex[SEXLEN];
- //学生学号
- char stuNum[STUNUMLEN];
- //分数
- char score[SCORELEN];
- }Student;
- //存储所有学生的数组
- Student students[N];//能够存储100个学生
- //定义学生的个数
- int totalStudentCount=0;
- //接收用户输入的编号
- int fno;
- //定义数据文件保存位置
- char *filePath="telbook.data";
- //**************函数的声明部分***************
- int valifateInput(int num,int min, int max);
- //添加学生
- void doAdd();
- //删除学生
- void doDelete();
- //修改学生
- void doUpdate();
- //显示学生
- void doList();
- //搜索学生
- void doSearchByName();
- //通讯里初始化
- void init();
- //将数组写入文件
- void writeFile();
- int main(int argc, const char * argv[]) {
- init();
- printf("学生信息初始化完成");
- while (1) {
- printf("\n");
- //软件的界面
- printf("**************************\n");
- printf("** 欢迎使用学生信息管理系统 **\n");
- printf("****** 1、添加学生 ******\n");
- printf("****** 2、删除学生 ******\n");
- printf("****** 3、修改学生 ******\n");
- printf("****** 4、查看所有学生 ***\n");
- printf("****** 5、查询学生 ******\n");
- printf("****** 6、退出系统 ********\n");
- printf("**************************\n");
- //提示用户选择序号
- printf("请选择1-6之间的功能编号:\n");
- scanf("%d",&fno);
- //判断编号是否合法
- valifateInput(fno, 1, 6);
- switch (fno) {
- case 1:
- //添加
- doAdd();
- break;
- case 2:
- //删除
- doDelete();
- break;
- case 3:
- //修改
- doUpdate();
- break;
- case 4:
- //显示所有学生
- doList();
- break;
- case 5:
- //查找
- doSearchByName();
- break;
- case 6:
- //退出
- printf("系统已经退出!\n");
- return 0;
- break;
- default:
- break;
- }
- }
- return 0;
- }
- //验证输入是否合法,1非法0正确
- int valifateInput(int num,int min, int max)
- {
- if (num<min || num>max) {
- printf("非法输入!");
- return 1;
- }
- return 0;
- }
- //添加学生
- void doAdd()
- {
- printf("您选择的是添加学生,你按提示操作:\n");
- //提示用户输入学生姓名
- printf("请输入学生姓名:(*注意学生姓名不能有空格)\n");
- //接收学生姓名
- scanf("%s",students[totalStudentCount].name);
- //提示用户输入学生年龄
- printf("请输入学生年龄:(*注意学生年龄不能有空格)\n");
- //接收学生年龄
- scanf("%s",students[totalStudentCount].age);
- //提示输入学生性别
- printf("请输入学生性别:(*注意学生性别不能有空格)\n");
- //接收学生性别
- scanf("%s",students[totalStudentCount].sex);
- //提示输入学生学号
- printf("请输入学生学号:(*注意学生学号不能有空格)\n");
- //接收学生学号
- scanf("%s",students[totalStudentCount].stuNum);
- //提示输入学生分数
- printf("请输入学生分数:(*注意学生分数不能有空格)\n");
- //接收学生分数
- scanf("%s",students[totalStudentCount].score);
- //提示是否确认添加
- int flag;
- printf("您确认要添加吗?1、确认 0、取消\n");
- scanf("%d",&flag);
- if (flag) {
- //学生+1
- totalStudentCount++;
- //把学生写入文件
- writeFile();
- }
- }
- //删除学生
- void doDelete()
- {
- printf("您选择的是删除学生,你按提示操作:\n");
- doList();//将所有学生显示出来供删除
- //提示用户输入一个学生编号
- int no;
- printf("请输入要删除学生编号:\n");
- scanf("%d",&no);
- //判断输入的编号是否合法
- if (valifateInput(no,1, totalStudentCount)) {
- return ;
- }
- //提示用户再次确认删除
- int flag;
- printf("删除学生后数据将无法恢复,您确认要删除吗?1、确认 0、取消\n");
- scanf("%d",&flag);
- if (flag) {
- //开始删除学生
- //删除的学生是最后一个学生
- if (no==totalStudentCount) {
- totalStudentCount--;
- }else //删除的学生不是最后一个学生
- {
- for (int i=no; i<totalStudentCount; i++) {
- //将后一个元素的移动和覆盖到前一个元素,得到删除的效果
- students[no-1]=students[no];
- }
- //学生少一个
- totalStudentCount--;
- }
- //将数组同步到文件中
- writeFile();
- }
- }
- //修改学生
- void doUpdate()
- {
- printf("您选择的是修改学生,你按提示操作:\n");
- doList();//展示所有学生信息供修改
- //提示用户输入一个学生编号
- int no;
- printf("请输入要删除学生编号:\n");
- scanf("%d",&no);
- //判断输入的编号是否合法
- if (valifateInput(no,1, totalStudentCount)) {
- return ;
- }
- //输入新的学生信息
- char newname[NAMELEN];
- char newage[AGELEN];
- char newsex[SEXLEN];
- char newstuNum[STUNUMLEN];
- char newscore[SCORELEN];
- //提示用户输入学生姓名
- printf("请输入学生姓名:(*注意学生姓名不能有空格)\n");
- //接收学生姓名
- scanf("%s",newname);
- //提示用户输入学生年龄
- printf("请输入学生年龄:(*注意学生年龄不能有空格)\n");
- //接收学生年龄
- scanf("%s",newage);
- //提示输入学生性别
- printf("请输入学生性别:(*注意学生性别不能有空格)\n");
- //接收学生性别
- scanf("%s",newsex);
- //提示输入学生学号
- printf("请输入学生学号:(*注意学生学号不能有空格)\n");
- //接收学生学号
- scanf("%s",newstuNum);
- //提示输入学生分数
- printf("请输入学生分数:(*注意学生分数不能有空格)\n");
- //接收学生分数
- scanf("%s",newscore);
- //让用户确认更新
- int flag;
- printf("确认修改后信息将永久修改,确认修改吗?1、确认 0、取消\n");
- scanf("%d",&flag);
- if (flag) {
- //更新数组
- strcpy(students[no-1].name, newname);
- strcpy(students[no-1].age, newage);
- strcpy(students[no-1].sex, newsex);
- strcpy(students[no-1].stuNum, newstuNum);
- strcpy(students[no-1].score, newscore);
- //写入文件
- writeFile();
- }
- }
- //显示学生
- void doList()
- {
- printf("显示所有学生,学生如下:\n");
- //判断学生信息是否为空
- if (totalStudentCount==0) {
- printf("学生信息为空,请添加!");
- }
- else
- {
- //输出格式
- printf("编号\t 姓名\t 年龄\t 性别\t 学号\t 分数\t\n");
- //不为空,遍历学生数组
- for (int i=0; i<totalStudentCount; i++) {
- printf("%d\t %s\t %s\t %s\t %s\t %s\t\n",i+1,students[i].name,students[i].age,students[i].sex,students[i].stuNum,students[i].score);
- }
- }
- }
- //搜索学生
- void doSearchByName()
- {
- printf("您选择的是搜索学生,你按提示操作:\n");
- char name1[NAMELEN];
- //提示用户输入要搜索的学生姓名
- printf("请输入要查找的学生姓名:\n");
- scanf("%s",name1);
- //按照姓名进行查找
- int i;
- for (i = 0; i<totalStudentCount; i++) {
- //比较两个字符串是否相等
- if(strcmp(students[i].name, name1)==0)
- {
- //打印出姓名对应的电话号码
- //printf("您搜索的学生%s的电话是%s:\n",name1,contacts[i].telNum);
- printf("您搜索的学生信息是:\n");
- printf("姓名\t 年龄\t 性别\t 学号\t 分数\t\n");
- printf("%s\t %s\t %s\t %s\t %s\t\n",students[i].name,students[i].age,students[i].sex,students[i].stuNum,students[i].score);
- break;//循环停止
- }
- }
- //当i与totalStudentCount相等时,表示遍历完后没找到此人
- if (i==totalStudentCount) {
- printf("查无此人!\n");
- }
-
- }
复制代码
|
|