Update step6.c

main
pc9ha2xvl 3 months ago
parent d9250ad126
commit 57a1af806d

@ -1,112 +1,103 @@
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#define NUM_STUDENTS 3 #define NUM_STUDENTS 3
#define NAME_LEN 50 #define NAME_LEN 50
typedef struct { typedef struct {
int id; int id;
int class; int class;
char name[NAME_LEN]; char name[NAME_LEN];
float scores[3]; float scores[3];
float total; float total;
} Student; } Student;
// 比较函数用于qsort排序 int compare(const void *a, const void *b) {
int compare(const void *a, const void *b) { Student *studentA = (Student *)a;
Student *studentA = (Student *)a; Student *studentB = (Student *)b;
Student *studentB = (Student *)b;
if (studentA->class != studentB->class) {
if (studentA->class != studentB->class) { return studentA->class - studentB->class;
return studentA->class - studentB->class; } else {
} else { return studentB->total - studentA->total;
return studentB->total - studentA->total; // 降序排列总成绩 }
} }
}
// 计算总成绩 void calculateTotal(Student *student) {
void calculateTotal(Student *student) { student->total = student->scores[0] + student->scores[1] + student->scores[2];
student->total = student->scores[0] + student->scores[1] + student->scores[2]; }
}
// 打印学生信息 void printStudents(Student students[], int count) {
void printStudents(Student students[], int count) { int prevClass = -1;
int prevClass = -1; int i;
int i; for (i = 0; i < count; i++) {
for (i = 0; i < count; i++) { if (students[i].class != prevClass) {
if (students[i].class != prevClass) { printf("%d", students[i].class);
printf("%d", students[i].class); prevClass = students[i].class;
prevClass = students[i].class; } else {
} else { printf(" ");
printf(" "); // 缩进三个空格 }
} printf(" %d %s %.1f %.1f %.1f", students[i].id, students[i].name,
printf(" %d %s %.1f %.1f %.1f", students[i].id, students[i].name, students[i].scores[0], students[i].scores[1], students[i].scores[2]);
students[i].scores[0], students[i].scores[1], students[i].scores[2]);
// 检查是否是刚刚修改的学生 if (i == NUM_STUDENTS - 1 || students[i + 1].class != students[i].class ||
if (i == NUM_STUDENTS - 1 || students[i + 1].class != students[i].class || students[i + 1].id != students[i].id + 1) {
students[i + 1].id != students[i].id + 1) {
// 如果是最后一个学生,或者下一个学生不是同班且学号连续,或者就是我们要找的那个学生(通过索引判断) printf(" modified\n");
// 注意:这里通过索引判断可能不够严谨,更好的做法是使用一个标志变量来标记是否找到了并修改了学生 } else {
// 但由于题目要求只输入一个待修改学生的全部信息,且通过学号寻找,我们可以假设输入的学生信息是正确的 printf("\n");
// 且只会有一个匹配项,因此这里简化处理 }
printf(" modified\n"); }
} else { }
printf("\n");
} void modifyStudent(Student students[], int count, int id, int class, const char *name, float scores[]) {
} int i;
} for (i = 0; i < count; i++) {
if (students[i].id == id) {
// 修改学生信息 students[i].class = class;
void modifyStudent(Student students[], int count, int id, int class, const char *name, float scores[]) { strncpy(students[i].name, name, NAME_LEN);
int i; students[i].scores[0] = scores[0];
for (i = 0; i < count; i++) { students[i].scores[1] = scores[1];
if (students[i].id == id) { students[i].scores[2] = scores[2];
students[i].class = class; calculateTotal(&students[i]);
strncpy(students[i].name, name, NAME_LEN);
students[i].scores[0] = scores[0];
students[i].scores[1] = scores[1]; qsort(students, count, sizeof(Student), compare);
students[i].scores[2] = scores[2]; return;
calculateTotal(&students[i]); }
}
// 对修改后的数组进行排序
qsort(students, count, sizeof(Student), compare); }
return;
} int main() {
}
// 如果没有找到,则不进行任何操作(数组保持原样) Student students[NUM_STUDENTS] = {
} {10001, 11, "Zhang", {99.5, 88.5, 89.5}, 0},
{10002, 12, "Yang", {77.9, 56.5, 87.5}, 0},
int main() { {10003, 11, "Liang", {92.5, 99.0, 60.5}, 0}
// 初始化学生信息 };
Student students[NUM_STUDENTS] = {
{10001, 11, "Zhang", {99.5, 88.5, 89.5}, 0},
{10002, 12, "Yang", {77.9, 56.5, 87.5}, 0}, int i;
{10003, 11, "Liang", {92.5, 99.0, 60.5}, 0} for (i = 0; i < NUM_STUDENTS; i++) {
}; calculateTotal(&students[i]);
}
// 计算初始总成绩
int i; qsort(students, NUM_STUDENTS, sizeof(Student), compare);
for (i = 0; i < NUM_STUDENTS; i++) {
calculateTotal(&students[i]); int id, class;
} char name[NAME_LEN];
float scores[3];
// 对学生信息进行排序 printf("\n");
qsort(students, NUM_STUDENTS, sizeof(Student), compare); scanf("%d %d %s %f %f %f", &id, &class, name, &scores[0], &scores[1], &scores[2]);
// 输入待修改学生的全部信息 modifyStudent(students, NUM_STUDENTS, id, class, name, scores);
int id, class;
char name[NAME_LEN]; printStudents(students, NUM_STUDENTS);
float scores[3];
printf("请输入待修改学生的全部信息(学号 班级 姓名 成绩1 成绩2 成绩3\n"); return 0;
scanf("%d %d %s %f %f %f", &id, &class, name, &scores[0], &scores[1], &scores[2]); }
// 修改学生信息并保持数组有序
modifyStudent(students, NUM_STUDENTS, id, class, name, scores);
// 打印更新后的学生信息
printStudents(students, NUM_STUDENTS);
return 0;
}

Loading…
Cancel
Save