只会特定的几个人的成绩,这个要求,求大佬解 实验要求: 1)输入,修改和显示 n个学生的 m 门考试科目的成绩,计算总分和平均分。 2)分别按总分和学号进行排序。 3)输入学生的学号,显示该学生的姓名、各门课程的成绩。 4)将输入的学生成绩数据保存到文件中, 5)从文件中读出学生成绫数据,查询学生成绩。 6)程序能够进行异常处理,检查用户输入数据的有效性,在用户输入数据有错误(如类型错误)或无效时,不会中断程序的执行,程序具有一定的健壮性。”
2条回答 默认 最新
- technologist_30 2021-05-24 12:25关注
#include <stdio.h> #include <stdlib.h> #include <string.h> #define SCORESIZE 4 #define YES 14 #define NO 60 #define ERROR_VALUE 99 #define ERROR_VALUE_OUT printf("错误,没有这个选项,请认真输入!!!\n") #define ERROR_LENTH -1 #define ERROR_LENTH_OUT printf("提示:请输入正确的命令,命令有一个数字组成,请勿多输!\n") #define ERROR printf("输入错误,请重新输入!\n") /* *学生对象结构体 */ typedef struct { int no; //学号 char *name; //姓名 int score[3]; //三门课程的成绩 int sum; //总成绩 double avr; //平均成绩 }student_t; student_t stu[50]; /* *获取一个字符串,开辟字符串长度+1的内存空间 *返回开辟的内存地址 */ char * GetString() { char *p; int len = 0; p = (char *)malloc(1*sizeof(char)); while((*(p+len)=getchar()) != '\n') { ++len; p = (char *)realloc(p, (len+1)*sizeof(char)); } *(p+len) = '\0'; return p; } /* *主菜单 */ void menu() { printf("|------------------------------学员成绩管理-------------------------------|\n"); printf("| |\n"); printf("| |\n"); printf("| 1------------>录入学生信息 |\n"); printf("| |\n"); printf("| |\n"); printf("| 2------------>查看所有学员成绩信息 |\n"); printf("| |\n"); printf("| |\n"); printf("| 3------------>插入 |\n"); printf("| |\n"); printf("| |\n"); printf("| 4------------>删除 |\n"); printf("| |\n"); printf("| |\n"); printf("| 5------------>查找 |\n"); printf("| |\n"); printf("| |\n"); printf("| 0------------>退出本系统 |\n"); printf("|-------------------------------------------------------------------------|\n"); printf("^_^ 提示:请输入操作命令 > > > > > > > > > > > > > > > > > > >:"); } /* *输出stu的全部的信息 */ void output(student_t *s,int len) { int i; printf("\t\t\t\t所有成绩信息显示\n"); printf("\t\t学号\t姓名\t成绩①\t成绩②\t成绩③\t平均成绩\t总分\n"); for(i=0;i<len;i++) { printf("\t\t%d\t%s\t%d\t%d\t%d\t%.2lf\t\t%d\n",(*(s+i)).no,(*(s+i)).name, (*(s+i)).score[0],(*(s+i)).score[1],(*(s+i)).score[2],(*(s+i)).avr, (*(s+i)).sum); } } /* *获取用户输入命令 *返回一个正整数 */ int GetCommand() { char *cmd; cmd = GetString(); if(strlen(cmd) == 1) { if(*cmd == '1') { return 1; } if(*cmd == '2') { return 2; } if(*cmd == '3') { return 3; } if(*cmd == '4') { return 4; } if(*cmd == '5') { return 5; } if(*cmd == '0') { return 0; } if((*cmd == 'Y')||(*cmd == 'y')) { return YES; } if((*cmd == 'N')||(*cmd == 'n')) { return NO; } else { return ERROR_VALUE; } } return ERROR_LENTH; free(cmd); } /* *获取一个学生的信息 */ student_t input() { int i; student_t s; //获取学号 do { printf("学号:"); scanf("%d",&s.no); if(s.no>0&&s.no<=50) { break; } else { printf("错误,请输入0-50中的数字!\n"); fflush(stdin); continue; } } while(1); fflush(stdin); //获取姓名 printf("姓名:"); s.name=GetString(); for(i=0;i<3;i++) { do { printf("请输入第%d成绩:",i+1); scanf("%d",&s.score[i]); if(s.score[i]>0&&s.score[i]<=100) break; else { printf("请输入正确的学生成绩!(0-100)\n"); fflush(stdin); continue; } } while(1); } //计算平均成绩并赋值给s.avr s.sum = s.score[0]+s.score[1]+s.score[2]; s.avr=(s.sum)/3.00; return s; } /* *获取所有学生的信息 *返回输入的学生总数 */ int GetAllStudent() { int i=0,cmd; do { system("cls"); printf("请避免输入重复的学号,以免混淆!\n"); stu[i] = input(); //将获得的学生信息给stu[i] fflush(stdin); lo: printf("是否继续录入(Y/N):"); cmd = GetCommand(); switch(cmd) { case YES: i++; break; case NO: return (i+1); case ERROR_VALUE: ERROR_VALUE_OUT; goto lo; default: ERROR_LENTH_OUT; goto lo; } }while(1); return (i+1); } /* *对学生按平均成绩进行排序(冒泡) */ void sort(int len) { int i; student_t *p,temp; for(i=0;i<len-1;i++) { for(p=stu;p<stu+len-1;p++) { if((*p).sum<(*(p+1)).sum) { temp=(*p); (*p)=(*(p+1)); (*(p+1))=temp; } } } } /* *显示学员信息 *形参:学生的人数 */ void DisplayAllStudent(int len) { system("cls"); system("color 70"); printf("现有成绩信息:\n"); output(stu,len); sort(len); printf("排序后成绩信息:\n"); output(stu,len); system("pause"); } int insert(int len) { int cmd; do { system("cls"); printf("现有成绩信息:\n"); output(stu,len); printf("请避免输入重复的学号,以免混淆!\n"); stu[len] = input(); //录入信息 len++; //长度+1; sort(len); //排序 printf("插入后成绩信息:\n"); output(stu,len); fflush(stdin); lc: printf("是否继续插入(Y/N):"); cmd = GetCommand(); //获取命令 switch(cmd) { case YES: break; case NO: return len; case ERROR_VALUE: ERROR_VALUE_OUT; goto lc; default: ERROR_LENTH_OUT; goto lc; } }while(1); return len; } /* *删除学员信息,并显示删除前后所有的成绩信息 */ int del(int len) //len 学生的个数 { int cmd,n,i,j=0,statu=0; //statu 找到和未找到的标记 0未找到 do { system("cls"); printf("现有成绩信息:\n"); output(stu,len); printf("请输入要删除的学生学号:"); scanf("%d",&n); for(i=0;i<len;i++) { if(stu[i].no==n) { statu=1; for(j=i;j<len;j++) { stu[j]=stu[j+1]; } len--; } } if(statu==0) { fflush(stdin); printf("未找到任何有关该学号的信息!\n"); goto lc; } sort(len); printf("删除后成绩信息:\n"); output(stu,len); fflush(stdin); lc: printf("是否继续删除(Y/N):"); cmd = GetCommand(); switch(cmd) { case YES: break; case NO: return len; case ERROR_VALUE: ERROR_VALUE_OUT; goto lc; default: ERROR_LENTH_OUT; goto lc; } }while(1); return len; } int main(void) { int cmd,lenth=0,n,i; system("color 2B"); do { system("color 2B"); system("cls"); menu(); cmd = GetCommand(); switch(cmd) { case 1: system("color 3E"); system("cls"); printf("\t\t\t警告:录入成绩将删除原有的所有学生信息!\n"); lenth = GetAllStudent(); break; case 2: DisplayAllStudent(lenth); break; case 3: system("color 3E"); system("cls"); lenth = insert(lenth); break; case 4: system("color 3E"); system("cls"); lenth = del(lenth); break; case 5: printf("请输入要查找的学生学号:"); scanf("%d",&n); for(i=0;i<lenth;i++) { if(stu[i].no==n) { printf("\t\t学号\t姓名\t成绩①\t成绩②\t成绩③\t平均成绩\t总分\n"); printf("\t\t%d\t%s\t%d\t%d\t%d\t%.2lf\t\t%d\n",stu[i].no,stu[i].name, stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].avr,stu[i].sum); break; } } if(i>=lenth) { printf("未找到任何有关该学号的信息!\n"); } fflush(stdin); system("pause"); break; case 0: exit(0); case ERROR_LENTH: ERROR_LENTH_OUT; system("pause"); break; default: ERROR_VALUE_OUT; system("pause"); break; } } while(1); }
解决 无用评论 打赏 举报
悬赏问题
- ¥15 pic16F877a单片机的外部触发中断程序仿真失效
- ¥15 Matlab插值拟合差分微分规划图论
- ¥15 keil5 target not created
- ¥15 C/C++数据与算法请教
- ¥15 怎么找志同道合的伙伴
- ¥20 如何让程序ab.eXe自已删除干净硬盘里的本文件自己的ab.eXe文件
- ¥50 爬虫预算充足,跪巨佬
- ¥15 滑块验证码拖动问题悬赏
- ¥15 Wanted but not invoked:Actually, there were zero interactions with this moc
- ¥20 怎么驱动tb6612