编写程序,输入 10 个学生学号、姓名、四门课程成绩。每个学生的记录包括学号、姓名、四门课程成绩和平均分等级。输出学生的平均成绩等级和不及格人数。要求定义和调用函数set_grade,根据学生成绩定义其等级, 并统计不及格人数。等级设置:0~59 为不及格,60~69 为及格,70~79 为中等,80~89 为良好,90~100 为优秀。最后,在此基础上编写一个学生综合信息管理程序,要求能够实现对学生信息的新建、输出、修改、查询等功能。
- 前言
- 多说无益上代码
- 为了能让代码正常运行,就勉为其难的贴几张图把
- 总结
前言
只解决了基本问题,不解决不合理的输入,总之就是硬写
多说无益上代码
#include <stdio.h>
#include <string.h>
struct student{
long stu_id;
char name[16];
int score[4];
char grade;
};
int k=0,n=0;
//k统计不及格学生,只能在不修改学生成绩的情况下使用
//n统计有多少个学生
void show(){//菜单
printf("-----------\n");
printf("1、添加某个学生\n");
printf("2、查询某个学生\n");
printf("3、修改某个学生\n");
printf("4、输出所有学生\n");
printf("5、输入除1-4外的任意键结束程序\n");
printf("-----------\n");
printf("请输入要执行功能的编号:");
}
void entry(struct student *stu){//新建一条学生信息
printf("请输入学号:");
scanf("%ld",&stu->stu_id);
printf("请输入姓名:");
scanf("%s",stu->name);
printf("请输入数学成绩:");
scanf("%d",&stu->score[0]);
printf("请输入语文成绩:");
scanf("%d",&stu->score[1]);
printf("请输入英语成绩:");
scanf("%d",&stu->score[2]);
printf("请输入编程成绩:");
scanf("%d",&stu->score[3]);
}
void set_grade(struct student *stu){//各科成绩平均分评级
int c=0;
for(int j=0;j<4;j++){
c+=stu->score[j];
}
c/=4;
c/=10;
if(c<6){
k++;//此处用于统计不及格人数,在修改学生成绩时也会生效,反正解决第一次的输出就行了,懒得改
}
switch(c){
case 10:
case 9:
stu->grade='A';
break;
case 8:
stu->grade='B';
break;
case 7:
stu->grade='C';
break;
case 6:
stu->grade='D';
break;
default:
stu->grade='F';
}
}
void find(struct student stu[],int n,char name[16]){
//name="\0"时输出所有学生信息,name=字符串时寻找对应的学生信息
int ok=0;
printf("------------------------------------------------------------\n");
printf("学号\t姓名\t\t数学\t英语\t语文\t编程\t等级\n");
for(int i=0;i<n;i++){
if(name[0]=='\0' || strcmp(name,stu[i].name)==0){
ok=1;
printf("%ld\t%-12s\t",stu[i].stu_id,stu[i].name);
for(int j=0;j<4;j++){
printf("%-4d\t",stu[i].score[j]);
}
printf("%2c\n",stu[i].grade);
}
}
if(!ok){
printf("找不到该学生!\n");
}
printf("------------------------------------------------------------\n");
}
int edit(struct student stu[],int n){//修改学生信息
int p=-1;
while(1){//死循环,要么找到学生退出,要么输入2退出
printf("请输入要修改的学生学号,或输入2退出:");
long id=0;
scanf("%ld",&id);
if(id==2){
return 0;
}
for(int i=0;i<n;i++){
if(id==stu[i].stu_id){
p=i;
break;
}
}
if(p!=-1){
break;
}
printf("找不到该学号\n");
}
int editgrade=0;
int xi=0;
while(1){
printf("-----------\n");
printf("1、修改学号\n");
printf("2、修改姓名\n");
printf("3、修改数学成绩\n");
printf("4、修改英语成绩\n");
printf("5、修改语文成绩\n");
printf("6、修改编程成绩\n");
printf("-----------\n");
printf("请输入要执行功能的编号:");
scanf("%d",&xi);
switch(xi){
case 1:
printf("请输入修改后的学号");
scanf("%ld",&stu[p].stu_id);
break;
case 2:
printf("请输入修改后的姓名");
scanf("%s",stu[p].name);
break;
case 3:
printf("请输入修改后的数学成绩:");
scanf("%d",&stu[p].score[0]);
editgrade+=1;
break;
case 4:
printf("请输入修改后的英语成绩:");
scanf("%d",&stu[p].score[1]);
editgrade+=1;
break;
case 5:
printf("请输入要修改后改语文成绩:");
scanf("%d",&stu[p].score[2]);
editgrade+=1;
break;
case 6:
printf("请输入要修改后的编程成绩:");
scanf("%d",&stu[p].score[3]);
editgrade+=1;
break;
default:
printf("erro");
break;
}
printf("继续修改请输入1,结束请输入0\n");
int end;
scanf("%d",&end);
if(end==0){
if(editgrade>0){
return p;
}else{
return 0;
}
}
}
}
int main(){
struct student stu[100];
for(int i=0;i<10;i++){ //此处只为满足条件,懒得一个个输,虽然调用函数也没差,但看起来很别扭
scanf("%ld%s%d%d%d%d",&stu[i].stu_id,stu[i].name,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2],&stu[i].score[3]);
set_grade(&stu[i]);
}
n+=10;
char flag[16] ="\0";//输出全部信息时使用的条件
find(stu,n,flag);
printf("不及格的有%d人\n",k);
while(1){
int select=0;
show();
scanf("%d",&select);
int three;
switch(select){
case 1://新建学生信息
entry(&stu[n++]);
set_grade(&stu[n-1]);
break;
case 2:// 根据学生姓名输出信息
printf("请输入学生姓名:");
char xm[16];
scanf("%s",xm);
find(stu,n,xm);
break;
case 3://修改学生信息
three=edit(stu,n);
if(three){
set_grade(&stu[three]);
}
break;
case 4://输出所有信息
find(stu,n,flag);
break;
default://默认结束程序
return 0;
}
}
}
为了能让代码正常运行,就勉为其难的贴几张图把
运行环境是devc的gcc4.9.2 64位
总结
写的也很乱,能实现就行,缺点难以删除