把代码贴上来,这样方便大家帮忙。
写了个保存到文件的函数void Savetofile(struct Student students[], int count),其他几个小错误修改,改动处见注释,供参考:
#include <stdio.h>
#include <stdlib.h>
#define MAX_STUDENTS 10
#define MAX_SUBJECTS 3
struct Student {
int studentID;
char name[50];
char className[50];
int scores[MAX_SUBJECTS];
float averageScore;
};
void inputStudentInfo(struct Student* student) {
printf("Enter student ID: ");
scanf("%d", &(student->studentID));
printf("Enter student name: ");
scanf("%s", student->name);
getchar(); // 修改
printf("Enter student class name: ");
scanf("%s", student->className);
getchar(); // 修改
printf("Enter scores for C Language, Advanced Math, and English:\n");
for (int i = 0; i < MAX_SUBJECTS; i++) {
scanf("%d", &(student->scores[i]));
}
}
void displayStudentInfo(struct Student student) {
printf("Student ID: %d\n", student.studentID);
printf("Student Name: %s\n", student.name);
printf("Class Name: %s\n", student.className);
printf("Scores: C Language - %d, Advanced Math - %d, English - %d\n",
student.scores[0], student.scores[1], student.scores[2]);
printf("Average Score: %.2f\n", student.averageScore);
printf("-----------------------------\n");
}
void calculateAverageScore(struct Student* student) {
int sum = 0;
for (int i = 0; i < MAX_SUBJECTS; i++) {
sum += student->scores[i];
}
student->averageScore = (float)sum / MAX_SUBJECTS;
}
void displayAllStudents(struct Student students[], int count) {
for (int i = 0; i < count; i++) {
displayStudentInfo(students[i]);
}
}
struct Student* findStudentByID(struct Student students[], int count, int studentID) {
for (int i = 0; i < count; i++) {
if (students[i].studentID == studentID) {
return &(students[i]);
}
}
return NULL;
}
int compareStudents(const void* a, const void* b) {
struct Student* studentA = (struct Student*)a;
struct Student* studentB = (struct Student*)b;
return (studentA->averageScore > studentB->averageScore) -
(studentA->averageScore < studentB->averageScore);
}
void Savetofile(struct Student students[], int count) // 修改
{
FILE* fp;
int i;
if (!count) {
printf("Record is NULL.\n");
return;
}
fp = fopen("student.txt", "w");
if (fp) {
for (i = 0; i < count; i++)
fprintf(fp, "%d %s %s %d %d %d %f\n", students[i].studentID, students[i].name, students[i].className,
students[i].scores[0], students[i].scores[1], students[i].scores[2], students[i].averageScore);
fclose(fp);
printf("Save file successfully!\n");
}
else
printf("Save file fail.\n");
return;
}
int main() {
struct Student students[MAX_STUDENTS], * studentToModify, * foundStudent, * studentToCalculate; // 修改
int studentCount = 0;
int choice, studentID, deleteIndex = -1; // 修改
while (1) {
printf("----- Student Management System -----\n");
printf("1. Add Student\n");
printf("2. Modify Student\n");
printf("3. Delete Student\n");
printf("4. Display All Students\n");
printf("5. Calculate Average Score\n");
printf("6. Find Student by ID\n");
printf("7. Sort Students by Average Score\n");
printf("8. Save to File\n");
printf("9. Exit\n");
printf("Enter your choice: ");
scanf("%d", &choice);
switch (choice) {
case 1:
if (studentCount < MAX_STUDENTS) {
printf("--- Add Student ---\n");
inputStudentInfo(&(students[studentCount]));
calculateAverageScore(&(students[studentCount]));
studentCount++;
printf("Student added successfully!\n");
}
else {
printf("Maximum number of students reached. Cannot add more students.\n");
}
break;
case 2:
printf("--- Modify Student ---\n");
printf("Enter the student ID to modify: ");
scanf("%d", &studentID);
studentToModify = findStudentByID(students,studentCount, studentID); //struct Student* 修改
if (studentToModify != NULL) {
inputStudentInfo(studentToModify);
calculateAverageScore(studentToModify);
printf("Student modified successfully!\n");
}
else {
printf("Student not found.\n");
}
break;
case 3:
printf("--- Delete Student ---\n");
printf("Enter the student ID to delete: ");
scanf("%d", &studentID);
//int deleteIndex = -1; 修改
for (int i = 0; i < studentCount; i++) {
if (students[i].studentID == studentID) {
deleteIndex = i;
break;
}
}
if (deleteIndex != -1) {
for (int i = deleteIndex; i < studentCount - 1; i++) {
students[i] = students[i + 1];
}
studentCount--;
printf("Student deleted successfully!\n");
}
else {
printf("Student not found.\n");
}
break;
case 4:
printf("--- Display All Students ---\n");
displayAllStudents(students, studentCount);
break;
case 5:
printf("--- Calculate Average Score ---\n");
printf("Enter the student ID: ");
scanf("%d", &studentID);
studentToCalculate = findStudentByID(students, studentCount, studentID); //struct Student* 修改
if (studentToCalculate != NULL) {
calculateAverageScore(studentToCalculate);
printf("Average score calculated successfully!\n");
}
else {
printf("Student not found.\n");
}
break;
case 6:
printf("--- Find Student by ID ---\n");
printf("Enter the student ID to find: ");
scanf("%d", &studentID);
foundStudent = findStudentByID(students, studentCount, studentID); //struct Student* 修改
if (foundStudent != NULL) {
displayStudentInfo(*foundStudent);
}
else {
printf("Student not found.\n");
}
break;
case 7:
printf("--- Sort Students by Average Score ---\n");
qsort(students, studentCount, sizeof(struct Student), compareStudents);
printf("Students sorted successfully!\n");
break;
case 8: // 修改
printf("--- Save to File. ---\n"); // 修改
Savetofile(students, studentCount); // 修改
break;
case 9:
printf("Exiting the program...\n");
return 0;
default:
printf("Invalid choice. Please try again.\n");
break;
}
}
}
可能存在的问题:
1.文件无法打开或创建。这可能是由于没有正确设置文件路径或文件不存在而导致的。可以使用文件操作函数,如fopen()来打开/创建文件,并检查返回值以确保文件是否成功打开或创建。同时,文件打开模式(如“w”写模式)也需要正确设置。
2.文件指针位置没有重新定位。在读写文件时,文件指针指向当前读写位置。录入信息后,需要使用fseek()或rewind()等函数将文件指针重新定位到文件开头,然后才能将数据读入或写入文件。
3.文件不是文本文件。如果数据文件不是文本文件,可能需要进行二进制文件读写操作。在这种情况下,不能使用常用的fgets()和fputs()函数进行文件读写,而必须使用fread()和fwrite()等函数。
#include <stdio.h>
#include <stdlib.h>
#define MAX_STUDENTS 10
#define MAX_SUBJECTS 3
struct Student {
int studentID;
char name[50];
char className[50];
int scores[MAX_SUBJECTS];
float averageScore;
};
void inputStudentInfo(struct Student* student) {
printf("Enter student ID: ");
scanf("%d", &(student->studentID));
printf("Enter student name: ");
scanf("%s", student->name);
printf("Enter student class name: ");
scanf("%s", student->className);
printf("Enter scores for C Language, Advanced Math, and English:\n");
for (int i = 0; i < MAX_SUBJECTS; i++) {
scanf("%d", &(student->scores[i]));
}
}
void displayStudentInfo(struct Student student) {
printf("Student ID: %d\n", student.studentID);
printf("Student Name: %s\n", student.name);
printf("Class Name: %s\n", student.className);
printf("Scores: C Language - %d, Advanced Math - %d, English - %d\n",
student.scores[0], student.scores[1], student.scores[2]);
printf("Average Score: %.2f\n", student.averageScore);
printf("-----------------------------\n");
}
void calculateAverageScore(struct Student* student) {
int sum = 0;
for (int i = 0; i < MAX_SUBJECTS; i++) {
sum += student->scores[i];
}
student->averageScore = (float)sum / MAX_SUBJECTS;
}
void displayAllStudents(struct Student students[], int count) {
for (int i = 0; i < count; i++) {
displayStudentInfo(students[i]);
}
}
struct Student* findStudentByID(struct Student students[], int count, int studentID) {
for (int i = 0; i < count; i++) {
if (students[i].studentID == studentID) {
return &(students[i]);
}
}
return NULL;
}
int compareStudents(const void* a, const void* b) {
struct Student* studentA = (struct Student*)a;
struct Student* studentB = (struct Student*)b;
return (studentA->averageScore > studentB->averageScore) -
(studentA->averageScore < studentB->averageScore);
}
int main() {
struct Student students[MAX_STUDENTS];
int studentCount = 0;
int choice, studentID;
while (1) {
;printf("----- Student Management System -----\n");
printf("1. Add Student\n");
printf("2. Modify Student\n");
printf("3. Delete Student\n");
printf("4. Display All Students\n");
printf("5. Calculate Average Score\n");
printf("6. Find Student by ID\n");
printf("7. Sort Students by Average Score\n");
printf("8. Exit\n");
printf("Enter your choice: ");
scanf("%d", &choice);
switch (choice) {
case 1:
if (studentCount < MAX_STUDENTS) {
printf("--- Add Student ---\n");
inputStudentInfo(&(students[studentCount]));
calculateAverageScore(&(students[studentCount]));
studentCount++;
printf("Student added successfully!\n");
} else {
printf("Maximum number of students reached. Cannot add more students.\n");
}
break;
case 2:
printf("--- Modify Student ---\n");
printf("Enter the student ID to modify: ");
scanf("%d", &studentID);
struct Student* studentToModify = findStudentByID(students,
studentCount, studentID);
if (studentToModify != NULL) {
inputStudentInfo(studentToModify);
calculateAverageScore(studentToModify);
printf("Student modified successfully!\n");
} else {
printf("Student not found.\n");
}
break;
case 3:
printf("--- Delete Student ---\n");
printf("Enter the student ID to delete: ");
scanf("%d", &studentID);
int deleteIndex = -1;
for (int i = 0; i < studentCount; i++) {
if (students[i].studentID == studentID) {
deleteIndex = i;
break;
}
}
if (deleteIndex != -1) {
for (int i = deleteIndex; i < studentCount - 1; i++) {
students[i] = students[i + 1];
}
studentCount--;
printf("Student deleted successfully!\n");
} else {
printf("Student not found.\n");
}
break;
case 4:
printf("--- Display All Students ---\n");
displayAllStudents(students, studentCount);
break;
case 5:
printf("--- Calculate Average Score ---\n");
printf("Enter the student ID: ");
scanf("%d", &studentID);
struct Student* studentToCalculate = findStudentByID(students,
studentCount, studentID);
if (studentToCalculate != NULL) {
calculateAverageScore(studentToCalculate);
printf("Average score calculated successfully!\n");
} else {
printf("Student not found.\n");
}
break;
case 6:
printf("--- Find Student by ID ---\n");
printf("Enter the student ID to find: ");
scanf("%d", &studentID);
struct Student* foundStudent = findStudentByID(students, studentCount,
studentID);
if (foundStudent != NULL) {
displayStudentInfo(*foundStudent);
} else {
printf("Student not found.\n");
}
break;
case 7:
printf("--- Sort Students by Average Score ---\n");
qsort(students, studentCount, sizeof(struct Student), compareStudents);
printf("Students sorted successfully!\n");
break;
case 8:
printf("Exiting the program...\n");
return 0;
default:
printf("Invalid choice. Please try again.\n");
break;
}
}
}