69,371
社区成员
发帖
与我相关
我的任务
分享
0005 stuA 80 20 10
0008 stuB 10 9 90.5
0003 stuC 50.5 48 56
0009 stuD 12 4 8
0001 stuE 4 8 59
#define NUMMAX 10 //最多有NUMMAX个学生
#include <stdio.h>
#include <stdlib.h>
struct stuStruct {
int stuNumber; //学号
char stuName[20]; //名字
float math; //数学成绩
float english; //英语成绩
float c; //c语言成绩
}student[NUMMAX];
int loser[NUMMAX]; //超过两门不及格的学生在"data.in"中的学号
int row[NUMMAX][1]; //记录学号在"data.in"中对应的行号
//查找超过两门不及格学生的学号,返回超过两门不及格的人数
int findLosers(struct stuStruct student[NUMMAX])
{
int number; //第number个学生
int num_failed; //不及格科目的数量
int i = 0;
for (number = 0; student[number].stuNumber != 0; number++)//"data.in"中的学生学号都不为0,为0说明无数据
{
if (number == NUMMAX)
break;
num_failed = 0;//初始化 不及格科目的数量
if (student[number].math < 60)
num_failed++;
if (student[number].english < 60)
num_failed++;
if (student[number].c < 60)
num_failed++;
if (num_failed >2) //如果不及格的科目数量大于2,就把这个学生的学号记录到Loser[]中
{
loser[i++] = student[number].stuNumber;
}
}
printf("\n共有%d名学生超过两门不及格\n", i);
return i; //返回超过两门课不及格的学生数量
}
//用快速排序,将超过两门不及格的学生的学号进行排序
int partition(int loser[], int p, int r)
{
int x = loser[r];
int i = p - 1;
int j, temp;
for (j = p; j < r; j++)
{
if(loser[j] <= x)
{
i++;
temp = loser[i];
loser[i] = loser[j];
loser[j] = temp;
}
}
temp = loser[i + 1];
loser[i + 1] = loser[r];
loser[r] = temp;
return i + 1;
}
void quicksort(int loser[], int p, int r)
{
int q;
if (p < r)
{
q = partition(loser, p, r );
quicksort(loser, p, q-1);
quicksort(loser, q+1, r);
}
}
int main()
{
int i;
int number = 0; //第number行的学生
int total; //超过两门不及格的学生的总数
//读取文件
FILE *fp;
if ((fp = fopen("data.in", "r")) == NULL)
{
printf("cannot open this file\n");
exit(0);
}
printf("\"data.in\"中的学生信息是:\n\n");
printf("学号\t姓名\t数学\t英语\tC语言\t\n");
while(!feof(fp))
{
fscanf(fp, "%d %s %f %f %f\n", &student[number].stuNumber, &student[number].stuName, &student[number].math,
&student[number].english, &student[number].c);
row[student[number].stuNumber][0] = number; //row[学号][0] = 行号
printf("%d\t%s\t%3.1f\t%3.1f\t%3.1f\n",
student[number].stuNumber, student[number].stuName, student[number].math,
student[number].english, student[number].c);
number++;
}
//先查找出超过两门不及格的学生的学号, 并将返回值赋给total
total = findLosers(student);
//再对这些学号进行排序
quicksort(loser, 0, total - 1);
//将这些学生的信息打印出来
printf("\n他们是:\n\n");
printf("学号\t姓名\t数学\t英语\tC语言\t\n");
for (i = 0; i < total; i++)
{
printf("%d\t%s\t%3.1f\t%3.1f\t%3.1f\n",
student[row[loser[i]][0]].stuNumber, student[row[loser[i]][0]].stuName, student[row[loser[i]][0]].math,
student[row[loser[i]][0]].english, student[row[loser[i]][0]].c);
}
fclose(fp);
return 0;
}
"data.in"中的学生信息是:
学号 姓名 数学 英语 C语言
5 stuA 80.0 20.0 10.0
8 stuB 10.0 9.0 90.5
3 stuC 50.5 48.0 56.0
9 stuD 12.0 4.0 8.0
1 stuE 4.0 8.0 59.0
共有3名学生超过两门不及格
他们是:
学号 姓名 数学 英语 C语言
1 stuE 4.0 8.0 59.0
3 stuC 50.5 48.0 56.0
9 stuD 12.0 4.0 8.0
请按任意键继续. . .