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.
drd/学籍管理系统8.cpp

153 lines
5.0 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义学生结构体,使用字符串数组来存储学号、班级和姓名
struct Student {
char id[20];
char clas[20];
char name[20];
double score1;
double score2;
double score3;
double score; // 用于存储总成绩,方便后续排序等操作
};
// 交换两个学生结构体的函数
void swap(struct Student *a, struct Student *b) {
struct Student temp = *a;
*a = *b;
*b = temp;
}
// 计算学生总成绩的函数
void calculateScore(struct Student *s) {
s->score = s->score1 + s->score2 + s->score3;
}
// 录入学生信息的函数
void inputStudents(struct Student students[], int *num_students) {
char choice[10];
do {
struct Student new_student;
printf("Id ");
scanf("%s", new_student.id);
printf("class ");
scanf("%s", new_student.clas);
printf("name ");
scanf("%s", new_student.name);
printf("score1 ");
scanf("%lf", &new_student.score1);
printf("score2 ");
scanf("%lf", &new_student.score2);
printf("score3 ");
scanf("%lf", &new_student.score3);
calculateScore(&new_student);
students[*num_students] = new_student;
(*num_students)++;
printf("continue?\n");
scanf("%s", choice);
} while (strcmp(choice, "yes") == 0);
}
void outputStudents(struct Student students[], int num_students) {
for (int i = 0; i < num_students; i++) {
printf("%s,%s,%s,%.1lf,%.1lf,%.1lf,%.1lf\n", students[i].id, students[i].clas, students[i].name,
students[i].score1, students[i].score2, students[i].score3, students[i].score);
}
}
// 根据学号或姓名删除学生信息的函数
void deleteStudents(struct Student students[], int *num_students, char target[20]) {
int found = 0;
for (int i = 0; i < *num_students; i++) {
if (strcmp(students[i].id, target) == 0 || strcmp(students[i].name, target) == 0) {
found = 1;
for (int j = i; j < *num_students - 1; j++) {
students[j] = students[j + 1];
}
(*num_students)--;
i--; // 因为删除元素后,当前位置元素改变了,需要重新检查当前位置
}
}
if (!found) {
// 如果没找到要删除的学生,原样输出所有学生信息
outputStudents(students, *num_students);
} else {
outputStudents(students, *num_students);
}
}
// 根据学号或班级查询学生信息的函数
void selectStudents(struct Student students[], int num_students, char target[20]) {
int found = 0;
for (int i = 0; i < num_students; i++) {
if (strcmp(students[i].id, target) == 0 || strcmp(students[i].clas, target) == 0) {
found = 1;
printf("%s,%s,%s,%.1lf,%.1lf,%.1lf,%.1lf\n", students[i].id, students[i].clas, students[i].name,
students[i].score1, students[i].score2, students[i].score3, students[i].score);
}
}
if (!found) {
printf("there is no eligible student\n");
}
}
// 按照班级从小到大,同一班级内总成绩从大到小排序学生信息的函数
void orderStudents(struct Student students[], int num_students) {
for (int i = 0; i < num_students - 1; i++) {
for (int j = 0; j < num_students - i - 1; j++) {
if (strcmp(students[j].clas, students[j + 1].clas) > 0) {
swap(&students[j], &students[j + 1]);
} else if (strcmp(students[j].clas, students[j + 1].clas) == 0) {
if (students[j].score < students[j + 1].score) {
swap(&students[j], &students[j + 1]);
}
}
}
}
}
// 输出学生信息的函数
int main() {
struct Student students[100]; // 假设最多存储100个学生信息可根据实际情况调整大小
int num_students = 0;
int option;
while (1) {
printf("1.input\n2.delete\n3.select\n4.order\n5.output\n6.quit\nplease input your option\n");
scanf("%d", &option);
switch (option) {
case 1:
inputStudents(students, &num_students);
break;
case 2: {
char target[20];
scanf("%s", target);
deleteStudents(students, &num_students, target);
}
break;
case 3: {
char target[20];
scanf("%s", target);
selectStudents(students, num_students, target);
}
break;
case 4:
orderStudents(students, num_students);
break;
case 5:
outputStudents(students, num_students);
break;
case 6:
return 0;
default:
printf("wuxiao\n");
}
}
return 0;
}