void modify_student() { char id[MAX_ID_LEN]; printf("请输入要修改的学生学号:"); scanf("%s", id); int index = -1; for (int i = 0; i < student_num; i++) { if (strcmp(students[i].id, id) == 0) { index = i; break; } } if (index == -1) { printf("未找到该学生!\n"); return; } printf("请输入学生姓名:"); scanf("%s", students[index].name); for (int i = 0; i < MAX_SCORE_NUM; i++) { printf("请输入第%d门课的成绩:", i + 1); scanf("%f", &students[index].scores[i]); } printf("修改成功!\n"); } // 查询学生 void query_student() { char id[MAX_ID_LEN]; printf("请输入要查询的学生学号:"); scanf("%s", id); int index = -1; for (int i = 0; i < student_num; i++) { if (strcmp(students[i].id, id) == 0) { index = i; break; } } if (index == -1) { printf("未找到该学生!\n"); return; } printf("姓名:%s\n", students[index].name); printf("学号:%s\n", students[index].id); for (int i = 0; i < MAX_SCORE_NUM; i++) { printf("第%d门课成绩:%f\n", i + 1, students[index].scores[i]); } } // 显示学生列表 void show_student_list() { printf("学生列表:\n"); printf("姓名\t学号\t\t第一门课成绩\t第二门课成绩\t第三门课成绩\n"); for (int i = 0; i < student_num; i++) { printf("%s\t%s\t%f\t%f\t%f\n", students[i].name, students[i].id, students[i].scores[0], students[i].scores[1], students[i].scores[2]); } }
时间: 2024-04-03 14:35:42 浏览: 68
这是一个简单的学生成绩管理系统的代码,包括了三个功能:修改学生信息、查询学生信息、显示学生列表。
其中,修改学生信息功能通过输入学生的学号来查找对应的学生信息,如果找到则输入新的学生姓名和各门课程的成绩,将这些信息更新到对应的学生信息中。
查询学生信息功能同样通过输入学生的学号来查找对应的学生信息,如果找到则输出学生的姓名、学号和各门课程的成绩。
显示学生列表功能则将所有学生的信息按照一定格式输出到屏幕上,便于查看整个学生信息的概览。
相关问题
请给我一个要求用C语言编写:1.先编写一个带结构的文件,存入电脑,要求第一行从左到右的内容依次是:姓名、地址、学号,每排每列对齐,没有对齐的地方用空格补齐。2.从电脑中能够读入这个带结构的文件,并进行删增改后,重新存入电脑,3.这个文件要有纵横结构,每横表示一个记录4. 编出来的代码要能够在c的运行界面进行后续的插入、删除和修改,其中学生信息存储在students.dat文件中,每个学生信息占据一行,每个字段用空格分隔,每个字段的最大宽度为MAX_NAME_LEN,例如姓名和名字的最大宽度为10个字符。代码中实现了插入、删除和修改学生信息的功能。
好的,我可以帮你编写这个要求。以下是代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NAME_LEN 10
// 定义学生信息结构体
typedef struct {
char name[MAX_NAME_LEN + 1];
char address[MAX_NAME_LEN + 1];
char student_id[MAX_NAME_LEN + 1];
} Student;
// 定义函数声明
void print_student(Student student);
void print_file_header();
void print_file_footer();
void insert_student();
void delete_student();
void modify_student();
void save_students();
// 定义全局变量
Student students[100];
int num_students = 0;
int main(void) {
FILE *fp;
char buffer[MAX_NAME_LEN + 1];
int choice, i;
// 从文件中读取学生信息
fp = fopen("students.dat", "r");
if (fp != NULL) {
while (fscanf(fp, "%s %s %s", students[num_students].name, students[num_students].address, students[num_students].student_id) == 3) {
num_students++;
}
fclose(fp);
}
// 显示菜单,进行操作
do {
printf("\n1. 插入学生信息\n2. 删除学生信息\n3. 修改学生信息\n4. 保存学生信息\n5. 退出程序\n\n请输入操作编号:");
scanf("%d", &choice);
switch (choice) {
case 1:
insert_student();
break;
case 2:
delete_student();
break;
case 3:
modify_student();
break;
case 4:
save_students();
break;
case 5:
printf("\n程序已退出。\n\n");
break;
default:
printf("\n无效的操作编号,请重新输入。\n\n");
break;
}
} while (choice != 5);
return 0;
}
// 打印学生信息
void print_student(Student student) {
printf("%-*s%-*s%-*s\n", MAX_NAME_LEN, student.name, MAX_NAME_LEN, student.address, MAX_NAME_LEN, student.student_id);
}
// 打印表头
void print_file_header() {
printf("%-*s%-*s%-*s\n", MAX_NAME_LEN, "姓名", MAX_NAME_LEN, "地址", MAX_NAME_LEN, "学号");
}
// 打印表尾
void print_file_footer() {
printf("共 %d 条记录。\n", num_students);
}
// 插入学生信息
void insert_student() {
Student student;
int i;
// 获取学生信息
printf("\n请输入学生姓名、地址和学号,用空格分隔:");
scanf("%s %s %s", student.name, student.address, student.student_id);
// 将学生信息插入到数组中
students[num_students] = student;
num_students++;
// 显示插入后的学生信息
printf("\n插入成功,插入后的学生信息如下:\n\n");
print_file_header();
for (i = 0; i < num_students; i++) {
print_student(students[i]);
}
print_file_footer();
}
// 删除学生信息
void delete_student() {
char student_id[MAX_NAME_LEN + 1];
int i, j;
// 获取要删除的学生的学号
printf("\n请输入要删除的学生的学号:");
scanf("%s", student_id);
// 在数组中查找要删除的学生,并将其从数组中删除
for (i = 0; i < num_students; i++) {
if (strcmp(students[i].student_id, student_id) == 0) {
for (j = i; j < num_students - 1; j++) {
students[j] = students[j + 1];
}
num_students--;
printf("\n删除成功,删除后的学生信息如下:\n\n");
print_file_header();
for (j = 0; j < num_students; j++) {
print_student(students[j]);
}
print_file_footer();
return;
}
}
// 如果没有找到要删除的学生,则显示错误信息
printf("\n未找到要删除的学生。\n");
}
// 修改学生信息
void modify_student() {
char student_id[MAX_NAME_LEN + 1];
int i;
// 获取要修改的学生的学号
printf("\n请输入要修改的学生的学号:");
scanf("%s", student_id);
// 在数组中查找要修改的学生,并修改其信息
for (i = 0; i < num_students; i++) {
if (strcmp(students[i].student_id, student_id) == 0) {
printf("\n请输入学生姓名、地址和学号,用空格分隔:");
scanf("%s %s %s", students[i].name, students[i].address, students[i].student_id);
printf("\n修改成功,修改后的学生信息如下:\n\n");
print_file_header();
print_student(students[i]);
print_file_footer();
return;
}
}
// 如果没有找到要修改的学生,则显示错误信息
printf("\n未找到要修改的学生。\n");
}
// 保存学生信息到文件中
void save_students() {
FILE *fp;
int i;
// 打开文件,如果文件不存在则创建文件
fp = fopen("students.dat", "w");
if (fp == NULL) {
printf("\n无法打开文件。\n");
return;
}
// 将学生信息写入文件中
for (i = 0; i < num_students; i++) {
fprintf(fp, "%-*s%-*s%-*s\n", MAX_NAME_LEN, students[i].name, MAX_NAME_LEN, students[i].address, MAX_NAME_LEN, students[i].student_id);
}
// 关闭文件
fclose(fp);
// 显示保存成功信息
printf("\n保存成功。\n");
}
```
这段代码实现了你的要求,可以在 C 语言的运行界面中进行插入、删除和修改学生信息的操作,并将学生信息存储在 students.dat 文件中,每个学生信息占据一行,每个字段用空格分隔,每个字段的最大宽度为 MAX_NAME_LEN,例如姓名和名字的最大宽度为 10 个字符。
可以帮我用c语言编写一个学生成绩管理系统吗?具体要求如下:用链表的形式保存学生信息和成绩信息。添加:增加一个或几个学生记录 删除:删除已录入的学生记录。 修改:根据输入的学号修改某一学生记录。 查询:根据输入的学号寻找某一学生记录。 排序:按平均成绩由高到低排序并输出名次表。 显示:输出所有需要补考的学生记录
好的,我可以帮您编写这个学生成绩管理系统。以下是代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NAME_LEN 20 // 最大名字长度
#define MAX_ID_LEN 10 // 最大学号长度
#define MAX_GRADE_LEN 5 // 最大成绩长度
// 定义学生结构体
typedef struct student {
char name[MAX_NAME_LEN];
char id[MAX_ID_LEN];
float grade;
int is_makeup; // 是否需要补考,0表示不需要,1表示需要
struct student *next;
} student_t;
// 函数声明
student_t *create_student(char *name, char *id, float grade);
void add_student(student_t **head, student_t *new_student);
void delete_student(student_t **head, char *id);
void modify_student(student_t *head, char *id);
student_t *search_student(student_t *head, char *id);
void sort_students(student_t *head);
void show_makeup_students(student_t *head);
void show_all_students(student_t *head);
int main()
{
student_t *head = NULL;
// 添加学生
student_t *s1 = create_student("Tom", "10001", 80);
student_t *s2 = create_student("Jerry", "10002", 90);
student_t *s3 = create_student("Lucy", "10003", 85);
add_student(&head, s1);
add_student(&head, s2);
add_student(&head, s3);
// 删除学生
delete_student(&head, "10002");
// 修改学生
modify_student(head, "10001");
// 查询学生
student_t *s4 = search_student(head, "10003");
if (s4 != NULL) {
printf("Name: %s, ID: %s, Grade: %.2f\n", s4->name, s4->id, s4->grade);
}
// 排序
sort_students(head);
// 显示需要补考的学生
show_makeup_students(head);
// 显示所有学生
show_all_students(head);
return 0;
}
// 创建一个新学生
student_t *create_student(char *name, char *id, float grade)
{
student_t *new_student = (student_t *)malloc(sizeof(student_t));
strcpy(new_student->name, name);
strcpy(new_student->id, id);
new_student->grade = grade;
new_student->is_makeup = (grade < 60) ? 1 : 0;
new_student->next = NULL;
return new_student;
}
// 添加一个新学生
void add_student(student_t **head, student_t *new_student)
{
if (*head == NULL) {
*head = new_student;
} else {
student_t *current = *head;
while (current->next != NULL) {
current = current->next;
}
current->next = new_student;
}
}
// 删除一个学生
void delete_student(student_t **head, char *id)
{
student_t *current = *head;
student_t *previous = NULL;
while (current != NULL && strcmp(current->id, id) != 0) {
previous = current;
current = current->next;
}
if (current == NULL) {
printf("Student not found!\n");
return;
}
if (previous == NULL) {
*head = current->next;
} else {
previous->next = current->next;
}
free(current);
}
// 修改一个学生
void modify_student(student_t *head, char *id)
{
student_t *current = head;
while (current != NULL && strcmp(current->id, id) != 0) {
current = current->next;
}
if (current == NULL) {
printf("Student not found!\n");
return;
}
printf("Please input the new name: ");
scanf("%s", current->name);
printf("Please input the new grade: ");
scanf("%f", ¤t->grade);
current->is_makeup = (current->grade < 60) ? 1 : 0;
}
// 查询一个学生
student_t *search_student(student_t *head, char *id)
{
student_t *current = head;
while (current != NULL && strcmp(current->id, id) != 0) {
current = current->next;
}
if (current == NULL) {
printf("Student not found!\n");
return NULL;
} else {
return current;
}
}
// 按平均成绩由高到低排序
void sort_students(student_t *head)
{
student_t *current = head;
while (current != NULL) {
student_t *inner_current = current->next;
while (inner_current != NULL) {
if (current->grade < inner_current->grade) {
char temp_name[MAX_NAME_LEN];
char temp_id[MAX_ID_LEN];
float temp_grade = current->grade;
int temp_is_makeup = current->is_makeup;
strcpy(temp_name, current->name);
strcpy(temp_id, current->id);
current->grade = inner_current->grade;
current->is_makeup = inner_current->is_makeup;
strcpy(current->name, inner_current->name);
strcpy(current->id, inner_current->id);
inner_current->grade = temp_grade;
inner_current->is_makeup = temp_is_makeup;
strcpy(inner_current->name, temp_name);
strcpy(inner_current->id, temp_id);
}
inner_current = inner_current->next;
}
current = current->next;
}
}
// 显示需要补考的学生
void show_makeup_students(student_t *head)
{
student_t *current = head;
while (current != NULL) {
if (current->is_makeup) {
printf("Name: %s, ID: %s, Grade: %.2f\n", current->name, current->id, current->grade);
}
current = current->next;
}
}
// 显示所有学生
void show_all_students(student_t *head)
{
student_t *current = head;
while (current != NULL) {
printf("Name: %s, ID: %s, Grade: %.2f\n", current->name, current->id, current->grade);
current = current->next;
}
}
```
以上是一个简单的学生成绩管理系统,实现了添加、删除、修改、查询、排序和显示需要补考的学生等功能。您可以根据自己的实际需求进行修改和扩展。
阅读全文