重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
#define _CRT_SECURE_NO_DEPRECATE//WARNINGS,为了使用经典输入输出函数所需的声明
#include#include//为了使用自己定义的头文件,如果没有自定义头文件,可以不写这一句
#include"ownfunctions.h"//导入自己的头文件
#define length 30//班级的学生数量,当实际需要时随时更改
typedef struct student//学生节点定义
{char num[10];//以字符串的形式存储学号
char name[10];//存储学生的姓名
int math;//数学成绩
int pro;//专业课成绩
int tag;//tag=0表示该学生信息无效,=1表示有效
}Stu;//用Stu 代替 struct student
void addStu(Stu *class);
void delStu(Stu *class, int j);
void changeStu(Stu *class, int j);
void showStu(Stu *class, int j);
int findStu(Stu *class ,int k);//返回class中第k个有效的学生下标
int length_of_class(Stu *class);//返回class的有效学生数
int main(void)
{welcome();//打印出欢迎页面
showmenu();//展示菜单选项
Stu class[length];//创建班级数组
int i;
for (i = 0; i< length; i++)//置学生位为“无效”
{class[i].tag = 0;//tag = 0表示无效,tag =1 表示有效
}
int key;
key = menu();//调用菜单功能选择函数
int j;//用来标记需要删除或展示的学生是班级排位中的第几个学生
while (key)//在key不为0时,一直循环执行菜单功能
{switch (key)
{case 1:printf("its menu1 :增加一个学生的信息\n");
addStu(class);//班级未满时,向第一个tag=0的位置增加一个学生
break;
case 2:printf("its menu2 :删除一个学生的信息\n");
j = getstu(); //选择第j个学生
delStu(class, j); //当选择的j合理时,令该位置的学生信息无效
break;
case 3:printf("its menu3 :修改一个学生的信息\n");
j = getstu();
changeStu(class, j);//当选择的j合理时,修改该学生的信息
break;
case 4:printf("its menu4 :展示学生信息\n");
j = choosemenu();//从函数获得菜单选项,1或者2
showStu(class, j);//j=1时展示全部学生信息,j=2选择展示某一个学生的信息
break;
default:break;
}
showmenu();//再次显示菜单
key = menu();
}
_exit();
return 0;
}
//以下为自定义函数部分
void addStu(Stu *class)
{int i = 0;
while (class[i].tag == 1 && i< length)
i++;//寻找第一个tag 不为1 的i
if (i == length)
{printf("班级已满,添加失败\n");
return;
}
//以下为输入学生信息功能
class[i].tag = 1;
printf("输入第%d个学生的名字\n", i + 1);
scanf("%s", class[i].name);
printf("输入第%d个学生的学号\n", i + 1);
scanf("%s", class[i].num);
printf("输入第%d个学生的数学成绩\n", i + 1);
scanf("%d", &class[i].math);
printf("输入第%d个学生的专业成绩\n", i + 1);
scanf("%d", &class[i].pro);
//展示刚输入的学生信息
printf("\n第%d个学生的名字是%s\n", i + 1, class[i].name);
printf("第%d个学生的学号是%s\n", i + 1, class[i].num);
printf("第%d个学生的数学成绩是%d\n", i + 1, class[i].math);
printf("第%d个学生的专业成绩是%d\n\n", i + 1, class[i].pro);
printf("第%d个学生的信息已录入\n", i + 1);
}
void delStu(Stu *class, int j)
{int a;
a = length_of_class(class);
if (j >a || j< 1)//在此处判断j是否合理
{printf("您选择的学生不合理,返回上一级菜单\n");
return;
}
int i = findStu(class,j);//找到第j个tag=1的学生
//先展示第j个学生的信息
if (i == -1)
{printf("查找学生失败,返回上一级菜单\n");
return;
}
printf("第%d个学生的名字:%s\n", j, class[i].name);
printf("第%d个学生的学号:%s\n", j, class[i].num);
printf("第%d个学生的数学成绩:%d\n", j, class[i].math);
printf("第%d个学生的专业成绩:%d\n", j, class[i].pro);
//令该学生的信息无效
class[i].tag = 0;
printf("第%d个学生的信息已删除\n", j);
}
void changeStu(Stu *class, int j)
{int a;
a = length_of_class(class);
if (j >a || j< 1)//在此处判断j是否合理
{printf("您选择的学生不合理,返回上一级菜单\n");
return;
}
int i = findStu(class, j);//找到第j个tag=1的学生
if (i == -1)
{printf("查找学生失败,返回上一级菜单\n");
return;
}
//先展示第j个学生的信息
printf("第%d个学生的名字:%s\n", j, class[i].name);
printf("第%d个学生的学号:%s\n", j, class[i].num);
printf("第%d个学生的数学成绩:%d\n", j, class[i].math);
printf("第%d个学生的专业成绩:%d\n", j, class[i].pro);
//修改第j个学生的信息
printf("输入第%d个学生的名字\n", j);
scanf("%s", class[i].name);
printf("输入第%d个学生的学号\n", j);
scanf("%s", class[i].num);
printf("输入第%d个学生的数学成绩\n", j);
scanf("%d", &class[i].math);
printf("输入第%d个学生的专业成绩\n", j);
scanf("%d", &class[i].pro);
//展示修改后的学生信息
printf("第%d个学生的名字是%s\n", j, class[i].name);
printf("第%d个学生的学号是%s\n", j, class[i].num);
printf("第%d个学生的数学成绩是%d\n", j, class[i].math);
printf("第%d个学生的专业成绩是%d\n", j, class[i].pro);
printf("第%d个学生的信息已重新录入\n\n", j);
}
void showStu(Stu *class, int j)
{if (j != 1 && j != 2)
{printf("选择菜单项有误,返回上一级功能\n");
return;
}
int i;
int k = 0;
if (j == 1)//展示全部学生的信息
{for (i = 0; i< length; i++)//遍历整个班级
{ if (class[i].tag == 1)//打印出所有有效的学生信息
{ k++;
printf("第%d个学生的信息如下:\n",k);
printf("第%d个学生的姓名:%s\n", k,class[i].name);
printf("第%d个学生的学号:%s\n", k, class[i].num);
printf("第%d个学生的数学成绩:%d\n", k, class[i].math);
printf("第%d个学生的专业成绩:%d\n", k, class[i].pro);
}
}
printf("全部学生的信息已打印完毕\n");
}
else//选择展示一个学生的信息
{printf("您希望展示第几位学生的信息:\n");
scanf("%d", &k);
while (k< 1 || k >length)
{ printf("您选择的学生不合理,请重新选择:\n");
scanf("%d", &k);
getchar();
}
//在此处寻找第k个tag=1的学生
i = findStu(class,k);
if (i == -1)
{ printf("查找学生失败,返回上一级菜单\n");
return;
}
//打印学生信息
printf("第%d个学生的信息如下:\n", k);
printf("第%d个学生的姓名:%s\n", k, class[i].name);
printf("第%d个学生的学号:%s\n", k, class[i].num);
printf("第%d个学生的数学成绩:%d\n", k, class[i].math);
printf("第%d个学生的专业成绩:%d\n", k, class[i].pro);
}
}
int findStu(Stu *class ,int k)//找到class中第k个tag=1的下标值,并返回
{int i=0, j=0;
//先求出class中有几个tag=1的学生,当k不合理时返回上一级菜单
for (i = 0; i< length; i++)
{if (class[i].tag == 1)j++;
}
if (k >j || k< 1)
{printf("选择的学生不合理,返回上一级菜单\n");
return -1;
}
i = -1; j = 0;
//求出第k个tag=1的i
while (j< k)
{i++;
if (class[i].tag == 1)
{ j++;
}
}
return i;
}
int length_of_class(Stu *class)
{int i ,j;
j = 0;
for (i = 0; i< length; i++)
{if (class[i].tag == 1)
{ j++;
}
}
return j;
}
#pragma once//IDE自动添加的语句
#includeextern length;//令main代码处定义的变量的使用范围扩展至此处
int menu(void);
void _exit(void);
void welcome(void);
void printstar(void);
void showmenu(void);
int getstu(void);
int choosemenu(void);
int menu()//可以限制用户输入只能是0~4的整数,提高程序的健壮性。
//个人认为所有程序的用户输入部分都应该做到这点,但是为了更简洁的展示程序功能,本程序没有这样做
{int key;
scanf("%d", &key);
while (key< 0 || key>4)//判断key是否是属于0~4的整数
{printf("请输入合法的菜单选项");
scanf("%d", &key);
getchar();//当输入字母时,吸收回车键
}
return key;
}
void printstar(void)
{printf("************************************\n");
}
void _exit(void)
{printstar();
printf("\n\t感谢使用本系统\t再见\n\n");
printstar();
}
void welcome(void)
{printstar();
printf("\t欢迎使用成绩管理系统\n");
printstar();
}
void showmenu(void)
{printf("\t请输入数字0~4执行相应功能\n");
printf("\t0 退出系统\n\t1 增加一个学生的信息\n");
printf("\t2 删除一个学生的信息\n\t3 修改一个学生的信息 \n");
printf("\t4 查看一个学生的信息\n\t请勿输入其他内容\n\n\n");
}
int getstu(void)
{int j;
printf("您想处理第几个学生的信息?\n");
scanf("%d", &j);
return j;
}
int choosemenu(void)
{printf("输入数字1或2来选择功能\n");
printf("1:显示整个班级的学生信息\n");
printf("2:显示某个学生的信息\n");
int key;
scanf("%d", &key);
while (key< 1 || key>2)//判断key是否是属于1~2的整数
{printf("请输入合法的菜单选项");
scanf("%d", &key);
getchar();//当输入字母时,吸收回车键
}
return key;
}
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
创新互联公司专注于企业成都营销网站建设、网站重做改版、镇平网站定制设计、自适应品牌网站建设、H5响应式网站、商城网站定制开发、集团公司官网建设、成都外贸网站制作、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为镇平等各大城市提供网站开发制作服务。