You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
131 lines
4.0 KiB
131 lines
4.0 KiB
1 year ago
|
#include <stdio.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <string.h>
|
||
|
|
||
|
// 定义学生信息结构体
|
||
|
typedef struct {
|
||
|
int student_id;
|
||
|
int class_num;
|
||
|
char name[20];
|
||
|
float score1;
|
||
|
float score2;
|
||
|
float score3;
|
||
|
} Student;
|
||
|
|
||
|
// 定义全局的学生信息数组
|
||
|
Student students[] = {
|
||
|
{10001, 11, "Zhang", 99.5, 88.5, 89.5},
|
||
|
{10002, 12, "Yang", 77.9, 56.5, 87.5},
|
||
|
{10003, 11, "Liang", 92.5, 99.0, 60.5},
|
||
|
{10004, 11, "Cai", 89.6, 56.9, 90.5},
|
||
|
{10005, 14, "Fu", 55.6, 67.9, 98.9},
|
||
|
{10006, 12, "Mao", 22.1, 45.9, 99.2},
|
||
|
{10007, 13, "Zhan", 35.6, 67.9, 88.0}
|
||
|
};
|
||
|
|
||
|
// 查询函数
|
||
|
void search_students(char* query) {
|
||
|
int query_type;
|
||
|
char query_value[20];
|
||
|
|
||
|
sscanf(query, "%d %[^\n]", &query_type, query_value);
|
||
|
|
||
|
if (query_type == 1) {
|
||
|
int start_class, end_class;
|
||
|
sscanf(query_value, "%d-%d", &start_class, &end_class);
|
||
|
for (int i = 0; i < sizeof(students) / sizeof(students[0]); i++) {
|
||
|
if (students[i].class_num >= start_class && students[i].class_num <= end_class) {
|
||
|
printf("%d %d %s %.1f %.1f %.1f\n", students[i].student_id, students[i].class_num,
|
||
|
students[i].name, students[i].score1, students[i].score2, students[i].score3);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else if (query_type == 2) {
|
||
|
int start_student, end_student;
|
||
|
sscanf(query_value, "%d-%d", &start_student, &end_student);
|
||
|
for (int i = 0; i < sizeof(students) / sizeof(students[0]); i++) {
|
||
|
if (students[i].student_id >= start_student && students[i].student_id <= end_student) {
|
||
|
printf("%d %d %s %.1f %.1f %.1f\n", students[i].student_id, students[i].class_num,
|
||
|
students[i].name, students[i].score1, students[i].score2, students[i].score3);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else if (query_type == 3) {
|
||
|
char name_prefix[3];
|
||
|
strncpy(name_prefix, query_value, 2);
|
||
|
name_prefix[2] = '\0';
|
||
|
for (int i = 0; i < sizeof(students) / sizeof(students[0]); i++) {
|
||
|
if (strncmp(students[i].name, name_prefix, 2) == 0) {
|
||
|
printf("%d %d %s %.1f %.1f %.1f\n", students[i].student_id, students[i].class_num,
|
||
|
students[i].name, students[i].score1, students[i].score2, students[i].score3);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else if (query_type == 4) {
|
||
|
float min_score;
|
||
|
sscanf(query_value, "%f", &min_score);
|
||
|
for (int i = 0; i < sizeof(students) / sizeof(students[0]); i++) {
|
||
|
if (students[i].score1 + students[i].score2 + students[i].score3 >= min_score) {
|
||
|
printf("%d %d %s %.1f %.1f %.1f\n", students[i].student_id, students[i].class_num,
|
||
|
students[i].name, students[i].score1, students[i].score2, students[i].score3);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else if (query_type == 5) {
|
||
|
int class_num, start_student, end_student;
|
||
|
sscanf(query_value, "%d.%d-%d", &class_num, &start_student, &end_student);
|
||
|
for (int i = 0; i < sizeof(students) / sizeof(students[0]); i++) {
|
||
|
if (students[i].class_num == class_num && students[i].student_id >= start_student
|
||
|
&& students[i].student_id <= end_student) {
|
||
|
printf("%d %d %s %.1f %.1f %.1f\n", students[i].student_id, students[i].class_num,
|
||
|
students[i].name, students[i].score1, students[i].score2, students[i].score3);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// 排序函数
|
||
|
int compare_students(const void* a, const void* b) {
|
||
|
Student* student_a = (Student*)a;
|
||
|
Student* student_b = (Student*)b;
|
||
|
|
||
|
if (student_a->class_num < student_b->class_num) {
|
||
|
return -1;
|
||
|
}
|
||
|
else if (student_a->class_num > student_b->class_num) {
|
||
|
return 1;
|
||
|
}
|
||
|
else {
|
||
|
float total_score_a = student_a->score1 + student_a->score2 + student_a->score3;
|
||
|
float total_score_b = student_b->score1 + student_b->score2 + student_b->score3;
|
||
|
|
||
|
if (total_score_a > total_score_b) {
|
||
|
return -1;
|
||
|
}
|
||
|
else if (total_score_a < total_score_b) {
|
||
|
return 1;
|
||
|
}
|
||
|
else {
|
||
|
return 0;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void sort_students(Student* students, int num_students) {
|
||
|
qsort(students, num_students, sizeof(Student), compare_students);
|
||
|
}
|
||
|
|
||
|
// 主函数
|
||
|
int main() {
|
||
|
char query[50];
|
||
|
printf("请输入查询要求:");
|
||
|
fgets(query, sizeof(query), stdin);
|
||
|
query[strcspn(query, "\n")] = '\0';
|
||
|
|
||
|
search_students(query);
|
||
|
sort_students(students, sizeof(students) / sizeof(students[0]));
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|