题目要求输入20名学生的学号 名字 作 业(20%)考勤(10%)和期 末(70%)成绩并在求出总分后按总分从大到小排序
我在写排序的过程中遇到了困难,请告诉我怎么写,谢谢
#include <stdio.h>
#define N 5
struct student
{
int no;
char name[20];
int kaoqing;
int zuoye;
int qimo;
};
int main(void)
{
int i, sum = 0 ;
struct student stu[N] = {0}, temp;
puts("Please enter information of student: ");
for (i = 0; i < N; i++)
{
scanf("%d %s %d %d %d", &stu[i].no, stu[i].name, &stu[i].kaoqing, &stu[i].zuoye, &stu[i].qimo);
}
for (i = 0; i < N; i++)
{
sum++;
// 考勤10%作业20%期末70%
printf(" ID=%d Name=%s check_in=%f zuoye=%f qimo=%f sum=%f\n", stu[i].no, stu[i].name, stu[i].kaoqing * 0.1, stu[i].zuoye * 0.2, stu[i].qimo * 0.7, (stu[i].kaoqing * 0.1) + (stu[i].zuoye * 0.2) + (stu[i].qimo * 0.7));
}
return 0;
}
```
总分按照你的公式计算出来,写个冒泡排序就可以了。代码如下:
#include <stdio.h>
#define N 5
struct student
{
int no;
char name[20];
int kaoqing;
int zuoye;
int qimo;
};
int main(void)
{
int i, sum = 0;
int j;
struct student stu[N] = { 0 }, temp;
double t1, t2;
puts("Please enter information of student: ");
for (i = 0; i < N; i++)
{
scanf("%d %s %d %d %d", &stu[i].no, stu[i].name, &stu[i].kaoqing, &stu[i].zuoye, &stu[i].qimo);
}
//排序
for (i = 0; i < N - 1; i++)
{
for (j = 0; j < N - 1 - i; j++)
{
t1 = stu[j].zuoye * 0.2 + stu[j].kaoqing * 0.1 + stu[j].qimo * 0.7;
t2 = stu[j+1].zuoye * 0.2 + stu[j+1].kaoqing * 0.1 + stu[j+1].qimo * 0.7;
if (t1 < t2)
{
temp = stu[j];
stu[j] = stu[j + 1];
stu[j + 1] = temp;
}
}
}
//显示结果
for (i = 0; i < N; i++)
{
printf(" ID=%d Name=%s check_in=%f zuoye=%f qimo=%f sum=%f\n", stu[i].no, stu[i].name, stu[i].kaoqing * 0.1, stu[i].zuoye * 0.2, stu[i].qimo * 0.7, (stu[i].kaoqing * 0.1) + (stu[i].zuoye * 0.2) + (stu[i].qimo * 0.7));
}
return 0;
}
大概这样,稍微改动了一下你代码不严谨的地方:
#include <stdio.h>
#define N 3
#define SCORE_TYPE float
struct student {
int no;
char name[20];
SCORE_TYPE kaoqing;
SCORE_TYPE zuoye;
SCORE_TYPE qimo;
};
int main(void) {
int i, sum = 0;
struct student stu[N] = { 0 }, temp;
puts("Please enter information of student: ");
for (i = 0; i < N; i++) {
scanf("%d %s %f %f %f", &stu[i].no, stu[i].name, &stu[i].kaoqing, &stu[i].zuoye, &stu[i].qimo);
}
// 选择排序
for (int i = 0; i < N - 1; i++) {
int index = i;
for (int j = i + 1; j < N; j++) {
// 计算出成绩
SCORE_TYPE score_i = stu[index].kaoqing * 0.1 + stu[index].zuoye * 0.2 + stu[index].qimo * 0.7;
SCORE_TYPE score_j = stu[j].kaoqing * 0.1 + stu[j].zuoye * 0.2 + stu[j].qimo * 0.7;
// 比较成绩
if (score_i < score_j) {
index = j; // 获得最大的成绩索引
}
}
// 交换
if (index != i) {
temp = stu[index];
stu[index] = stu[i];
stu[i] = temp;
}
}
for (i = 0; i < N; i++) {
sum++;
// 考勤10%作业20%期末70%
printf(" ID=%d Name=%s check_in=%f zuoye=%f qimo=%f sum=%f\n", stu[i].no, stu[i].name, stu[i].kaoqing * 0.1, stu[i].zuoye * 0.2, stu[i].qimo * 0.7, (stu[i].kaoqing * 0.1) + (stu[i].zuoye * 0.2) + (stu[i].qimo * 0.7));
}
return 0;
}