请问这个C程序怎么写?输入30个学生5门课程的成绩,按照每个学生的平均分由高到低排序。

2024-11-01 20:18:55
推荐回答(2个)
回答(1):

#include "stdio.h"
#include "conio.h"
#include "stdlib.h"
#include "windows.h"
#include "string.h"

void Error();
void Input();
void Find();
void Output();
void Paixu();

struct node
{
int code;
char name[20];
char sex[3];
int age;
int chinese,english,computer,math,total;
float average;

};

struct node student[100],temp,New;

void MainMenu()
{
int cho;

printf("\n\t学员信息管理系统\n");
printf("*******************************\n");
printf("=\t【1】输入数据 =\n");
printf("=\t【2】查找数据 =\n");
printf("=\t【3】输出数据 =\n");
printf("=\t【4】排序数据 =\n");
printf("=\t【5】退出 =\n");
printf("*******************************\n");

printf("\n请输入你的选择(1-5):");
scanf("%d",&cho);

switch(cho)
{
case 1:
system("cls");
Input();
break;
case 2:Find();break;
case 3:Output();break;
case 4:Paixu();break;
case 5:exit(0);break;
default:Error();break;
}

}

void Paixu()//排序数据
{
int i,j;
//按平均分数的高低排序
for(i=0;i<=3;i++)
{
for(j=i+1;j<=4;j++)
{
if(student[i].average{
temp=student[i];
student[i]=student[j];
student[j]=temp;
}
}
}
printf("数据按平均分高低排列的情况如下:\n");
Output();
}

void Output()//输出数据
{
int i;
system("cls");

printf("数据的情况如下:\n");
for(i=0;i<=4;i++)
{
//输出每个成员变量的值
printf("\n******************************\n");
printf("\t学号:%d\n",student[i].code);
printf("\t姓名:%s\n",student[i].name);
printf("\t年龄:%d\n",student[i].age);
printf("\t英文成绩:%d\n",student[i].english);
printf("\t国文成绩:%d\n",student[i].chinese);
printf("\t计算机成绩:%d\n",student[i].computer);
printf("\t数学成绩:%d\n",student[i].math);
printf("\t总成绩:%d\n",student[i].total);
printf("\t平均成绩:%.2f\n",student[i].average);
}
printf("\n按任意键返回主界面......");
fflush(stdin);
getch();
system("cls");
MainMenu();
}

void Find()//查找数据
{
int n,m,i;
char ch,k[20];

system("cls");
lab1:printf("按学号查找(按1):\n");
printf("按姓名查找(按2):\n");
printf("请选择:");
scanf("%d",&n);

switch(n)
{
case 1:
printf("请输入学号:");
scanf("%d",&m);
if(m=student[i].code)
{
printf("******************************\n");
printf("\t学号:%d\n",student[i].code);
printf("\t姓名:%s\n",student[i].name);
printf("\t年龄:%d\n",student[i].age);
printf("\t英文成绩:%d\n",student[i].english);
printf("\t国文成绩:%d\n",student[i].chinese);
printf("\t计算机成绩:%d\n",student[i].computer);
printf("\t数学成绩:%d\n",student[i].math);
printf("\t总成绩:%d\n",student[i].total);
printf("\t平均成绩:%.2f\n",student[i].average);
printf("******************************\n");
}
break;
case 2:
printf("请输入姓名:");
scanf("%s",&k);
if(strcmp(k,student[i].name==0))
{
printf("******************************\n");
printf("\t学号:%d\n",student[i].code);
printf("\t姓名:%s\n",student[i].name);
printf("\t年龄:%d\n",student[i].age);
printf("\t英文成绩:%d\n",student[i].english);
printf("\t国文成绩:%d\n",student[i].chinese);
printf("\t计算机成绩:%d\n",student[i].computer);
printf("\t数学成绩:%d\n",student[i].math);
printf("\t总成绩:%d\n",student[i].total);
printf("\t平均成绩:%.2f\n",student[i].average);
printf("******************************\n");
}
break;
default:
printf("该选择有误,选择只有(1或2),重新选择:");
goto lab1;
break;
}
printf("\n是否继续查找(y/n):");
lab2:fflush(stdin);
ch=getchar();
if(ch=='y'||ch=='Y')
{
system("cls");
goto lab1;
}
else if(ch=='n'||ch=='N')
{
printf("谢谢你的使用!\n");
}
else
{
printf("\n只许输入y/n字符,重输:");
goto lab2;
}

printf("\n按任意键返回主界面......");
fflush(stdin);
getch();
system("cls");
MainMenu();

}

void Input()//插入数据
{
int i;

for(i=0;i<=4;i++)
{
printf("\n请输入第%d位学员的学号:",i+1);
scanf("%d",&student[i].code);
fflush(stdin);

printf("请输入第%d位学员的姓名:",i+1);
gets(student[i].name);
fflush(stdin);

printf("请输入第%d位学员的性别:",i+1);
gets(student[i].sex);
fflush(stdin);

printf("请输入第%d位学员的年龄:",i+1);
scanf("%d",&student[i].age);
fflush(stdin);

printf("请输入第%d位学员的英文成绩:",i+1);
scanf("%d",&student[i].english);

printf("请输入第%d位学员的国文成绩:",i+1);
scanf("%d",&student[i].chinese);

printf("请输入第%d位学员的计算机成绩:",i+1);
scanf("%d",&student[i].computer);

printf("请输入第%d位学员的数学成绩:",i+1);
scanf("%d",&student[i].math);

student[i].total=student[i].english+student[i].chinese+student[i].computer+student[i].math;
student[i].average=(float)student[i].total/4;
printf("第%d位学员的总成绩为:%d\n",i+1,student[i].total);
printf("第%d位学员的平均成绩为:%.2f\n",i+1,student[i].average);

}

printf("\n按任意键返回主界面......");
fflush(stdin);
getch();
system("cls");
MainMenu();

}

void Error()
{
printf("\n输入错误,请输入(1-7)的整数:");
printf("\n按任意键结束......");
fflush(stdin);
getch();
system("cls");
MainMenu();
}

void main()
{
printf("\n\n\t\t*欢迎使用信息管理系统*");
printf("\n\t\t按任意键继续......");
fflush(stdin);
getch();
system("cls");

MainMenu();
}

回答(2):

//按照你的说法,写的,希望采纳, 人数可以修改 COUNT 后面的值为 30
#define _CRT_SECURE_NO_WARNINGS
#include 
#include 
#include 
#define COUNT 4
typedef struct _student//定义了学生类型的结构体, 其中包含name, 成绩数组,0-4存放五门课程, 5存放平均分数 
{
char name[20];
int  score[6];
}Student;

//打印函数
void printf_stu(Student * stu, int len);
//排序函数
void sort_stu(Student * stu, int len);
//交换函数
void swap_stu(Student * stu1, Student * stu2);

void main()
{
//创建结构体类型的数组, 个数 COUNT 控制
Student stu[COUNT];
//内存清空
memset(stu, 0, sizeof(stu));
int sum = 0;
//开始循环
for (int i = 0; i < COUNT; i++)
{
//输入学生姓名
printf("input name of %d : ", i + 1);
scanf("%s", stu[i].name);
//输入五门课程成绩
for (int j = 0; j < 5; j++)
{
printf("input score (0 -- 100) of %d : ", j + 1);
scanf("%d", &(stu[i].score[j]));
//求和
sum += stu[i].score[j];
}
//求平均分
stu[i].score[5] = sum / 5;
printf("\n");
}
printf_stu(stu, COUNT);
sort_stu(stu, COUNT);
printf("排序之后 : \n");
printf_stu(stu, COUNT);
system("pause");
}

void printf_stu(Student * stu, int len)
{
//判断
if (NULL == stu)
{
return;
}
//循环打印
for (int i = 0; i < len; i++)
{
//打印姓名
printf("name : %s\n", stu[i].name);
printf("score :");
//打印五门课程成绩
for (int j = 0; j < 5; j++)
{
printf("%3d", stu[i].score[j]);
}
printf("\n");
//打印平均分数
printf("avg is : %d\n\n", stu[i].score[5]);
}
}

void sort_stu(Student * stu, int len)
{
if (NULL == stu)
{
return;
}
//冒泡排序数组
for (int i = 0; i < len; i++)
{
for (int j = 0; j < len - 1 - i; j++)
{
//依据平均分数进行排序
if (stu[j].score[5] < stu[j + 1].score[5])
{
swap_stu(&stu[j], &stu[j + 1]);
}
}
}
}

//交换函数
void swap_stu(Student * stu1, Student * stu2)
{
if (NULL == stu1 || NULL == stu2)
{
return;
}
//中间变量
Student temp;
memset(&temp, 0, sizeof(Student));
//先拷贝姓名
strcpy(temp.name, stu1->name);
//再依次拷贝每科成绩
for (int i = 0; i < 6; i++)
{
temp.score[i] = stu1->score[i];
}

strcpy(stu1->name, stu2->name);
for (int i = 0; i < 6; i++)
{
stu1->score[i] = stu2->score[i];
}

strcpy(stu2->name, temp.name);
for (int i = 0; i < 6; i++)
{
stu2->score[i] = temp.score[i];
}
return;
}