c语言定义一个描述学生基本信息的结构体类型,包括姓名,学号,C语言课程成绩。并定义一个结构体数组。输入若干学生的基本信息;编写函数print(),输出全体学生记录信息;编写函数search(), 按学号检索指定学生信息并返回, 由主函数打印到屏幕上;编写函数modify(), 修改指定学号的学生的成绩;编写函数sort(), 按照学生学号或者成绩对结构体数组排序;编写函数insert(), 插入一条新的学生信息;编写函数delete(), 删除指定学号的学生信息;再改为从文件加载记录数据,用户修改(增加、删除、修改)后数据保存到文件
时间: 2024-02-26 14:52:46 浏览: 112
使用结构体数组,利用函数实现按学生学号和姓名的查询操作.c
好的,我会根据你的要求回答问题。以下是回答:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STUDENTS 100
typedef struct {
char name[20];
int id;
float score;
} Student;
Student students[MAX_STUDENTS];
int num_students = 0;
void print() {
printf("姓名\t学号\t成绩\n");
for (int i = 0; i < num_students; i++) {
printf("%s\t%d\t%.2f\n", students[i].name, students[i].id, students[i].score);
}
}
Student* search(int id) {
for (int i = 0; i < num_students; i++) {
if (students[i].id == id) {
return &students[i];
}
}
return NULL;
}
void modify(int id, float score) {
Student* student = search(id);
if (student != NULL) {
student->score = score;
}
}
int cmp_id(const void* a, const void* b) {
return ((Student*)a)->id - ((Student*)b)->id;
}
int cmp_score(const void* a, const void* b) {
if (((Student*)a)->score < ((Student*)b)->score) {
return 1;
} else if (((Student*)a)->score > ((Student*)b)->score) {
return -1;
} else {
return 0;
}
}
void sort(int mode) {
if (mode == 1) {
qsort(students, num_students, sizeof(Student), cmp_id);
} else {
qsort(students, num_students, sizeof(Student), cmp_score);
}
}
void insert(char* name, int id, float score) {
if (num_students < MAX_STUDENTS) {
strcpy(students[num_students].name, name);
students[num_students].id = id;
students[num_students].score = score;
num_students++;
}
}
void delete(int id) {
int i, j;
for (i = 0; i < num_students; i++) {
if (students[i].id == id) {
break;
}
}
if (i < num_students) {
for (j = i; j < num_students - 1; j++) {
students[j] = students[j + 1];
}
num_students--;
}
}
void load(char* filename) {
FILE *fp;
fp = fopen(filename, "r");
if (fp != NULL) {
while (fscanf(fp, "%s %d %f", students[num_students].name, &students[num_students].id, &students[num_students].score) == 3) {
num_students++;
if (num_students >= MAX_STUDENTS) {
break;
}
}
fclose(fp);
}
}
void save(char* filename) {
FILE *fp;
fp = fopen(filename, "w");
if (fp != NULL) {
for (int i = 0; i < num_students; i++) {
fprintf(fp, "%s %d %f\n", students[i].name, students[i].id, students[i].score);
}
fclose(fp);
}
}
int main() {
load("students.txt");
print();
Student* s = search(1001);
if (s != NULL) {
printf("学生信息: %s %d %.2f\n", s->name, s->id, s->score);
} else {
printf("未找到指定学生\n");
}
modify(1001, 89.5);
sort(2);
print();
insert("李四", 1004, 78.5);
delete(1002);
print();
save("students.txt");
return 0;
}
```
这是一个实现你所描述的问题的C语言程序。程序首先定义了一个结构体类型 `Student`,包含了学生的基本信息。然后定义了一个结构体数组 `students` 用于存储所有学生的信息。 `num_students` 存储了当前已经输入的学生数量,初始值为0。
程序实现了 `print()` 函数,用于输出所有学生的信息; `search()` 函数,用于按照学号检索指定学生的信息并返回; `modify()` 函数,用于修改指定学号的学生的成绩; `sort()` 函数,用于按照学号或者成绩对结构体数组排序; `insert()` 函数,用于插入一条新的学生信息; `delete()` 函数,用于删除指定学号的学生信息。
程序还实现了 `load()` 函数,从文件中加载记录数据; `save()` 函数,将修改后的数据保存到文件。这样,用户可以在程序退出后,再次运行程序,可以从文件中加载记录数据,继续进行修改操作,同时修改后的数据也可以保存到文件中。
注意,程序中的 `load()` 和 `save()` 函数只是一个简单的实现,没有进行错误处理等。在实际应用中,需要进行更严格的错误处理和数据校验。
阅读全文