嗨嗨嗨嗨嘿 2021-12-13 22:30 采纳率: 50%
浏览 43
已结题

在这个成绩管理系统内怎样在显示成绩的时候显示平均分,怎样对每个人的成绩按照总分排序,怎样显示成绩最高学生的信息。快

#include<stdio.h>

#include<stdlib.h>

#include<conio.h>

#include<dos.h>

#include<string.h>

#define LEN sizeof(struct student)

#define FORMAT "%-8d%-15s%-12.1lf%-12.1lf%-12.1lf%-12.1lf\n"

#define DATA stu[i].num,stu[i].name,stu[i].elec,stu[i].expe,stu[i].requ,stu[i].sum

float Felec,Fexpe,Frequ;

struct student/定义学生成绩结构体/

{

int num;/学号/

char name[15];/姓名/

double elec;/选修课/

double expe;/实验课/

double requ;/必修课/

double aver;/平均分/

double sum;/总分/

};

struct student stu[50];/定义结构体数组/

void in();/录入学生成绩信息/

void show();/显示学生信息/

void order();/按总分排序/

void del();/删除学生成绩信息/

void modify();/修改学生成绩信息/

void menu();/主菜单/

void insert();/插入学生信息/

void total();/计算总人数/

void search();/查找学生信息/

void sorte();/学生成绩排序/

void main()/主函数/

{

int n;

menu();

scanf("%d",&n);/输入选择功能的编号/

while(n)

{

switch(n)

{

case 1:

in();

break;

case 2:

search();

break;

case 3:

del();

break;

case 4:

modify();

break;

case 5:

insert();

break;

    case 6:

        sorte();

        break;

case 7:

order();

break;

case 8:

total();

break;

default:break;

}

getch();

menu();/执行完功能再次显示菜单界面/

scanf("%d",&n);

}

}

void in()/录入学生信息/

{

int i,m=0;/m是记录的条数/

char ch[2];

FILE *fp;/定义文件指针/

if((fp=fopen("data","ab+"))==NULL)/打开指定文件/

{

printf("不能打开!\n");

return;

}

while(!feof(fp))

{

if(fread(&stu[m] ,LEN,1,fp)==1)

m++;/统计当前记录条数/

}

fclose(fp);

if(m==0)

printf("无成绩!\n");

else

{

system("cls");

show();/调用show函数,显示原有信息/

}

if((fp=fopen("data","wb"))==NULL)

{

printf("不能打开\n");

return;

}

for(i=0;i<m;i++)

fwrite(&stu[i] ,LEN,1,fp);/向指定的磁盘文件写入信息/

printf("请输入(y/n):");

scanf("%s",ch);

while(strcmp(ch,"Y")==0||strcmp(ch,"y")==0)/判断是否要录入新信息/

{

printf("学号:") ;

scanf("%d",&stu[m].num);/输入学生学号/

for(i=0;i<m;i++)

if(stu[i].num==stu[m].num)

{

printf("学号存在请按任意键继续!");

getch();

fclose(fp);

return;

}

printf("姓名:");

scanf("%s",stu[m].name);/输入学生姓名/

printf("选修课:");

scanf("%lf",&stu[m].elec);/输入选修课成绩/

printf("实验课:");

scanf("%lf",&stu[m].expe);/输入实验课成绩/

printf("必修课:");

scanf("%lf",&stu[m].requ);/输入必修课成绩/

stu[m].sum=stu[m].elec+stu[m].expe+stu[m].requ;/计算出总成绩/

if(fwrite(&stu[m],LEN,1,fp)!=1)/将新录入的信息写入指定的磁盘文件/

{

printf("无法保存!");

getch();

}

else

{

printf("%s 保存!\n",stu[m].name);

m++;

}

printf("是否继续(y/n):");/询问是否继续/

scanf("%s",ch);

}

fclose(fp);

printf("完成!\n");

}

void show()

{

FILE *fp;

int i,m=0;

fp=fopen("data","ab+");

while(!feof(fp))

{

if(fread(&stu[m] ,LEN,1,fp)==1)

m++;

}

fclose(fp);

printf("学号 姓名 选修课 实验课 必修课 总分 平均分\t\n");

for(i=0;i<m;i++)

{

printf(FORMAT,DATA);/将信息按指定格式打印/

}

}

void menu()/自定义函数实现菜单功能/

{

system("cls");

printf("\n\n\n\n\n");

printf("\t\t|---------------------成绩管理系统-------------------|\n");

printf("\t\t|\t 0. 退出 |\n");

printf("\t\t|\t 1. 录入成绩 |\n");

printf("\t\t|\t 2. 查询成绩 |\n");

printf("\t\t|\t 3. 删除成绩 |\n");

printf("\t\t|\t 4. 修改成绩 |\n");

printf("\t\t|\t 5. 插入成绩 |\n");

printf("\t\t|\t 6. 成绩排序 |\n");

printf("\t\t|\t 7. 成绩保存 |\n");

printf("\t\t|\t 8. 成绩统计 |\n");

printf("\t\t|----------------------------------------------------|\n\n");

printf("\t\t\t请输入数字(0-8):");

}

void order()/自定义排序函数/

{

FILE *fp;

struct student t;

int i=0,j=0,m=0;

if((fp=fopen("data","ab+"))==NULL)

{

printf("不能打开!\n");

return;

}

while(!feof(fp))

if(fread(&stu[m] ,LEN,1,fp)==1)

m++;

fclose(fp);

if(m==0)

{

printf("无成绩保存!\n");

return;

}

for(i=0;i<m-1;i++)

for(j=i+1;j<m;j++)/双重循环实现成绩比较并交换/

if(stu[i].sum<stu[j].sum)

{

t=stu[i];

stu[i]=stu[j];

stu[j]=t;

}

if((fp=fopen("data","wb"))==NULL)

{

printf("不能打开!\n");

return;

}

for(i=0;i<m;i++)/将重新排好序的内容重新写入指定的磁盘文件中/

if(fwrite(&stu[i] ,LEN,1,fp)!=1)

{

printf("%s 无法保存!\n");

getch();

}

fclose(fp);

printf("保存成功\n");

}

void del()/自定义删除函数/

{

FILE *fp;

int snum,i,j,m=0;

char ch[2];

if((fp=fopen("data","ab+"))==NULL)

{

printf("不能打开!\n");

return;

}

while(!feof(fp))

if(fread(&stu[m],LEN,1,fp)==1)

m++;

fclose(fp);

if(m==0)

{

printf("无成绩删除!\n");

return;

}

printf("请输入学号:");

scanf("%d",&snum);

for(i=0;i<m;i++)

if(snum==stu[i].num)

break;

if(i==m)

{

printf("找不到");

getchar();

return;

}

printf("找到学生,删除?(y/n)");

scanf("%s",ch);

if(strcmp(ch,"Y")==0||strcmp(ch,"y")==0)/判断是否要进行删除/

{

for(j=i;j<m;j++)

stu[j]=stu[j+1];/将后一个记录移到前一个记录的位置/

m--;/记录的总个数减1/

printf("删除成功!\n");

}

if((fp=fopen("data","wb"))==NULL)

{

printf("不能打开!\n");

return;

}

for(j=0;j<m;j++)/将更改后的记录重新写入指定的磁盘文件中/

if(fwrite(&stu[j] ,LEN,1,fp)!=1)

{

printf("无法保存!\n");

getch();

}

fclose(fp);

}

void search()/自定义查找函数/

{

FILE *fp;

int snum,i,m=0;

char ch[2];

if((fp=fopen("data","ab+"))==NULL)

{

printf("不能打开!\n");

return;

}

while(!feof(fp))

if(fread(&stu[m],LEN,1,fp)==1)

m++;

fclose(fp);

if(m==0)

{

printf("无成绩查询!\n");

return;

}

printf("请输入学号:");

scanf("%d",&snum);

for(i=0;i<m;i++)

if(snum==stu[i].num)/查找输入的学号是否在记录中/

{

printf("查找到学生,显示?(y/n)");

scanf("%s",ch);

if(strcmp(ch,"Y")==0||strcmp(ch,"y")==0)

{

printf("学号 姓名 选修课 实验课 必修课 总分 平均分\t\n");

printf(FORMAT,DATA);/将查找出的结果按指定格式输出/

break;

}

else

return;

}

if(i==m)

printf("没有找到该学生!\n");/未找到要查找的信息/

}

void modify()/自定义修改函数/

{

FILE *fp;

int i,j,m=0,snum;

if((fp=fopen("data","ab+"))==NULL)

{

printf("不能打开!\n");

return;

}

while(!feof(fp))

if(fread(&stu[m],LEN,1,fp)==1)

m++;

if(m==0)

{

printf("无成绩修改!\n");

fclose(fp);

return;

}

printf("请输入你想修改的学生的学号!\n");

scanf("%d",&snum);

for(i=0;i<m;i++)

if(snum==stu[i].num)/检索记录中是否有要修改的信息/

break;

if(i<m)

{

printf("找到学生!你可以修改!\n");

printf("姓名:\n");

scanf("%s",stu[i].name);/输入名字/

printf("\n选修课:");

scanf("%lf",&stu[i].elec);/输入选修课成绩/

printf("\n实验课:");

scanf("%lf",&stu[i].expe);/输入实验课成绩/

printf("\n必修课:");

scanf("%lf",&stu[i].requ);/输入必修课成绩/

stu[i].sum=stu[i].elec+stu[i].expe+stu[i].requ;

}

else

{

printf("没有找到!");

getchar();

return;

}

if((fp=fopen("data","wb"))==NULL)

{

printf("不能打开!\n");

return;

}

for(j=0;j<m;j++)/将新修改的信息写入指定的磁盘文件中/

if(fwrite(&stu[j] ,LEN,1,fp)!=1)

{

printf("无法保存!");

getch();

}

fclose(fp);

}

void insert()/自定义插入函数/

{

FILE *fp;

int i,j,k,m=0,snum;

if((fp=fopen("data","ab+"))==NULL)

{

printf("不能打开!\n");

return;

}

while(!feof(fp))

if(fread(&stu[m],LEN,1,fp)==1)

m++;

if(m==0)

{

printf("无成绩插入!\n");

fclose(fp);

return;

}

printf("请输入你想插入的位置!(输入学号)\n");

scanf("%d",&snum);/输入要插入的位置/

for(i=0;i<m;i++)

if(snum==stu[i].num)

break;

for(j=m-1;j>i;j--)

stu[j+1]=stu[j];/从最后一条记录开始均向后移一位/

printf("现在请输入新的信息.\n");

printf("学号:");

scanf("%d",&stu[i+1].num);

for(k=0;k<m;k++)

if(stu[k].num==stu[i+1].num&&k!=i+1)

{

printf("学号存在,请按任意键继续!");

getch();

fclose(fp);

return;

}

printf("姓名:\n");

scanf("%s",stu[i+1].name);

printf("\n选修课:");

scanf("%lf",&stu[i+1].elec);

printf("\n实验课:");

scanf("%lf",&stu[i+1].expe);

printf("\n必修课:");

scanf("%lf",&stu[i+1].requ);

stu[i+1].sum=stu[i+1].elec+stu[i+1].expe+stu[i+1].requ;

if((fp=fopen("data","wb"))==NULL)

{

printf("不能打开!\n");

return;

}

for(k=0;k<=m;k++)

if(fwrite(&stu[k] ,LEN,1,fp)!=1)/将修改后的记录写入磁盘文件中/

{

printf("无法保存!");

getch();

}

fclose(fp);

}

void sorte()

{

}

void total()

{

FILE *fp;

int m=0;

if((fp=fopen("data","ab+"))==NULL)

{

printf("不能打开!\n");

return;

}

while(!feof(fp))

if(fread(&stu[m],LEN,1,fp)==1)

m++;/统计记录个数即学生个数/

if(m==0)

{

printf("无成绩统计!\n");

fclose(fp);

return;

}

printf("班级学生数%d\n",m);/将统计的个数输出/

fclose(fp);

}

  • 写回答

2条回答 默认 最新

  • 关注

    排序参考:

    
    #include "stdio.h"
    
    #define N 100
    struct student{
        int id;
        char name[20];
        int kaoqun;
        int biaoxian;
        int zuoye;
        int biji;
        int sum;
    }stud[N],t;
    
    int main()
    {
        int i,j;
        for(i=0;i<N;i++){
            printf("请输入第%d个学生信息\n",i+1);
            scanf("%d %s",&stud[i].id,&stud[i].name);
            fflush(stdin);
            scanf("%d %d %d %d",&stud[i].kaoqun,&stud[i].biaoxian,&stud[i].zuoye,&stud[i].biji);
            stud[i].sum = stud[i].kaoqun*0.3+stud[i].biaoxian*0.3+stud[i].zuoye*0.3+stud[i].biji*0.1;
        }
        
        //排序
        
        for (i = 0; i < N - 1; i++){
            for (j = 0; j < N - 1 - i; j++){ //按成绩对学生信息进行排序
                if (stud[j].sum > stud[j + 1].sum){ //整型数字的比较
                    t = stud[j];
                    stud[j] = stud[j + 1];
                    stud[j + 1] = t;
                }
            }
        }
        //打印
        printf("学号\t姓名\t考勤\t表现\t作业\t笔记\t总分\t\n");
        for (i = 0; i < N; i++){
            printf("%d\t", stud[i].id);
            printf("%s\t", stud[i].name);
            printf("%d\t", stud[i].kaoqun);
            printf("%d\t", stud[i].biaoxian);
            printf("%d\t", stud[i].zuoye);
            printf("%d\t", stud[i].biji);
            printf("%d \n", stud[i].sum);
        }
        
        return 1;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 9月30日
  • 已采纳回答 9月22日
  • 创建了问题 12月13日

悬赏问题

  • ¥15 乌班图ip地址配置及远程SSH
  • ¥15 怎么让点阵屏显示静态爱心,用keiluVision5写出让点阵屏显示静态爱心的代码,越快越好
  • ¥15 PSPICE制作一个加法器
  • ¥15 javaweb项目无法正常跳转
  • ¥15 VMBox虚拟机无法访问
  • ¥15 skd显示找不到头文件
  • ¥15 机器视觉中图片中长度与真实长度的关系
  • ¥15 fastreport table 怎么只让每页的最下面和最顶部有横线
  • ¥15 R语言卸载之后无法重装,显示电脑存在下载某些较大二进制文件行为,怎么办
  • ¥15 java 的protected权限 ,问题在注释里