用c语言以文件存储形式制作一个学生管理系统,要求可以增、删、该、查、统计学生信息
时间: 2023-05-22 07:04:52 浏览: 203
这个问题可以实现。你需要使用 C 语言的文件处理函数来进行文件的读写操作,同时使用数据结构来存储学生信息。你可以使用结构体来表示学生信息,然后将学生信息按照一定的格式写入文件中。当用户需要进行增、删、改、查操作时,你需要读取文件中的学生信息,然后通过程序进行相应的操作,最后将修改后的学生信息再次写入文件中。统计学生信息可以通过程序遍历所有学生信息进行计算。这里涉及到一些 C 语言的基础知识,你需要熟悉常用的文件处理函数、结构体的定义和使用、遍历与计算方法等。
相关问题
用c语言以链表形式制作一个学生管理系统,要求可以增、删、该、查、统计学生信息,用文件存储
以下是参考代码,供您参考:
#include <stdio.h>
#include <stdlib.h>
typedef struct student {
int id;
char name[20];
float score;
struct student *next;
} student;
// 查找学生信息
student *search(student *head, int id) {
student *p = head;
while (p != NULL) {
if (p->id == id) {
return p;
}
p = p->next;
}
return NULL;
}
// 插入学生信息
void insert(student **head, student *s) {
student *p = *head;
if (*head == NULL) {
*head = s;
} else if (s->id < p->id) {
s->next = p;
*head = s;
} else {
while (p->next != NULL && s->id > p->next->id) {
p = p->next;
}
s->next = p->next;
p->next = s;
}
}
// 删除学生信息
void del(student **head, int id) {
student *p = *head;
student *prev = NULL;
while (p != NULL) {
if (p->id == id) {
if (prev == NULL) {
*head = p->next;
} else {
prev->next = p->next;
}
free(p);
return;
}
prev = p;
p = p->next;
}
}
// 修改学生信息
void modify(student *head, int id, char *name, float score) {
student *s = search(head, id);
if (s != NULL) {
strcpy(s->name, name);
s->score = score;
}
}
// 统计学生信息
void count(student *head, float *average, int *num) {
student *p = head;
float sum = 0;
int count = 0;
while (p != NULL) {
sum += p->score;
count++;
p = p->next;
}
if (count > 0) {
*average = sum / count;
}
*num = count;
}
// 保存学生信息到文件
void save(student *head) {
FILE *fp;
fp = fopen("students.txt", "w");
student *p = head;
while (p != NULL) {
fprintf(fp, "%d %s %.2f\n", p->id, p->name, p->score);
p = p->next;
}
fclose(fp);
printf("学生信息保存成功!\n");
}
// 从文件读取学生信息
void load(student **head) {
FILE *fp;
fp = fopen("students.txt", "r");
if (fp == NULL) {
printf("找不到学生信息文件!\n");
return;
}
student *p = NULL;
student *prev = NULL;
while (!feof(fp)) {
p = (student *)malloc(sizeof(student));
if (fscanf(fp, "%d %s %f\n", &p->id, p->name, &p->score) != 3) {
free(p);
break;
}
p->next = NULL;
if (*head == NULL) {
*head = p;
} else {
prev->next = p;
}
prev = p;
}
fclose(fp);
printf("学生信息读取成功!\n");
}
int main() {
student *head = NULL;
int menu = 0;
while (menu != 6) {
printf("请选择操作:\n");
printf("1. 增加学生信息\n");
printf("2. 删除学生信息\n");
printf("3. 修改学生信息\n");
printf("4. 查找学生信息\n");
printf("5. 统计学生信息\n");
printf("6. 退出程序\n");
scanf("%d", &menu);
switch (menu) {
case 1: {
student *s = (student *)malloc(sizeof(student));
printf("请输入学生信息:\n");
printf("学号:");
scanf("%d", &s->id);
printf("姓名:");
scanf("%s", s->name);
printf("成绩:");
scanf("%f", &s->score);
s->next = NULL;
insert(&head, s);
printf("学生信息添加成功!\n");
save(head);
break;
}
case 2: {
int id;
printf("请输入要删除的学生学号:");
scanf("%d", &id);
del(&head, id);
printf("学生信息删除成功!\n");
save(head);
break;
}
case 3: {
int id;
char name[20];
float score;
printf("请输入要修改的学生学号:");
scanf("%d", &id);
printf("请输入修改后的学生姓名:");
scanf("%s", name);
printf("请输入修改后的学生成绩:");
scanf("%f", &score);
modify(head, id, name, score);
printf("学生信息修改成功!\n");
save(head);
break;
}
case 4: {
int id;
printf("请输入要查找的学生学号:");
scanf("%d", &id);
student *s = search(head, id);
if (s != NULL) {
printf("该学生信息为:%d %s %.2f\n", s->id, s->name, s->score);
} else {
printf("未找到该学生信息!\n");
}
break;
}
case 5: {
float average;
int num;
count(head, &average, &num);
printf("学生人数:%d\n", num);
printf("平均成绩:%.2f\n", average);
break;
}
case 6: {
printf("已退出程序!\n");
break;
}
default: {
printf("非法操作,请重新输入!\n");
break;
}
}
}
return 0;
}
阅读全文