用c语言写一个程序,提供的功能有:学生的学号、姓名、各门课程成绩的录入、修改;计算每个学生的总分和平均分;按学号和姓名查询学生成绩;按学号或总分进行排序区,并给出名次;输出成绩总表;数据存盘和读取。
时间: 2024-04-04 18:32:30 浏览: 16
好的,这是一个比较复杂的程序,需要涉及到数据结构、文件读写等方面的知识。以下是一个简单的实现思路,仅供参考:
1. 定义一个结构体,包含学生的学号、姓名、各门课程成绩、总分和平均分等信息。
2. 使用动态内存分配,定义一个数组,存储所有学生的信息。
3. 实现数据的录入和修改功能。可以通过循环遍历数组,依次录入或修改每个学生的信息。
4. 实现总分和平均分的计算。可以在录入或修改时实时计算,也可以在输出成绩总表时统一计算。
5. 实现按学号和姓名查询学生成绩。可以使用顺序查找或二分查找等算法,根据学号或姓名查找对应的学生信息。
6. 实现按学号或总分进行排序区,并给出名次。可以使用快速排序或归并排序等算法,对学生信息进行排序,然后输出排名信息。
7. 实现输出成绩总表功能。可以将所有学生的信息按一定格式输出到控制台或文件中。
8. 实现数据存盘和读取功能。可以使用文件读写等操作,将学生信息保存到文件中,或从文件中读取学生信息。
需要注意的是,本程序中涉及到的一些操作可能会有较高的复杂性,例如内存管理、算法实现、文件读写等。因此,建议在实现前先进行充分的思考和规划,并使用适当的调试手段进行测试和验证。
相关问题
用c语言写一组代码,提供的功能有:学生的学号、姓名、各门课程成绩的录入、修改;计算每个学生的总分和平均分;按学号和姓名查询学生成绩;按学号或总分进行排序区,并给出名次;输出成绩总表;数据存盘和读取。
好的,以下是一个简单的实现。代码中使用了动态内存分配、文件读写等功能,请注意代码的复杂性和安全性。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义学生结构体
typedef struct {
char id[10]; // 学号
char name[20]; // 姓名
float score[3]; // 各门课程成绩
float total_score; // 总分
float avg_score; // 平均分
} student;
// 定义全局变量
student *students; // 学生数组
int num_students = 0; // 学生人数
// 函数声明
void input_students(); // 录入学生信息
void modify_students(); // 修改学生信息
void calculate_score(); // 计算学生成绩
void search_by_id(); // 按学号查询学生信息
void search_by_name(); // 按姓名查询学生信息
void sort_by_id(); // 按学号排序
void sort_by_score(); // 按总分排序
void output_students(); // 输出成绩总表
void save_students(); // 数据存盘
void load_students(); // 数据读取
int main() {
// 加载数据
load_students();
// 显示菜单
int choice;
while (1) {
printf("1. 录入学生信息\n");
printf("2. 修改学生信息\n");
printf("3. 计算学生成绩\n");
printf("4. 按学号查询学生信息\n");
printf("5. 按姓名查询学生信息\n");
printf("6. 按学号排序\n");
printf("7. 按总分排序\n");
printf("8. 输出成绩总表\n");
printf("0. 退出程序\n");
printf("请输入选项:");
scanf("%d", &choice);
switch (choice) {
case 1:
input_students();
break;
case 2:
modify_students();
break;
case 3:
calculate_score();
break;
case 4:
search_by_id();
break;
case 5:
search_by_name();
break;
case 6:
sort_by_id();
break;
case 7:
sort_by_score();
break;
case 8:
output_students();
break;
case 0:
save_students(); // 保存数据
printf("程序已退出。\n");
return 0;
default:
printf("无效选项,请重新输入。\n");
break;
}
}
}
// 录入学生信息
void input_students() {
// 获取学生人数
int n;
printf("请输入学生人数:");
scanf("%d", &n);
// 分配内存
students = (student*) realloc(students, (num_students + n) * sizeof(student));
// 录入学生信息
for (int i = num_students; i < num_students + n; i++) {
student s;
printf("请输入第%d个学生的学号、姓名、各门课程成绩:", i + 1);
scanf("%s %s %f %f %f", s.id, s.name, &s.score[0], &s.score[1], &s.score[2]);
s.total_score = s.score[0] + s.score[1] + s.score[2];
s.avg_score = s.total_score / 3.0;
students[i] = s;
}
num_students += n;
printf("学生信息录入成功。\n");
}
// 修改学生信息
void modify_students() {
// 获取学生学号
char id[10];
printf("请输入要修改学生的学号:");
scanf("%s", id);
// 查找学生
int index = -1;
for (int i = 0; i < num_students; i++) {
if (strcmp(students[i].id, id) == 0) {
index = i;
break;
}
}
// 修改学生信息
if (index >= 0) {
student s;
printf("请输入新的学生信息(学号、姓名、各门课程成绩):");
scanf("%s %s %f %f %f", s.id, s.name, &s.score[0], &s.score[1], &s.score[2]);
s.total_score = s.score[0] + s.score[1] + s.score[2];
s.avg_score = s.total_score / 3.0;
students[index] = s;
printf("学生信息修改成功。\n");
} else {
printf("未找到该学生。\n");
}
}
// 计算学生成绩
void calculate_score() {
// 计算每个学生的总分和平均分
for (int i = 0; i < num_students; i++) {
students[i].total_score = students[i].score[0] + students[i].score[1] + students[i].score[2];
students[i].avg_score = students[i].total_score / 3.0;
}
printf("学生成绩计算完成。\n");
}
// 按学号查询学生信息
void search_by_id() {
// 获取学生学号
char id[10];
printf("请输入要查询学生的学号:");
scanf("%s", id);
// 查找学生
int index = -1;
for (int i = 0; i < num_students; i++) {
if (strcmp(students[i].id, id) == 0) {
index = i;
break;
}
}
// 输出学生信息
if (index >= 0) {
printf("学号:%s,姓名:%s,各门课程成绩:%f %f %f,总分:%f,平均分:%f\n",
students[index].id, students[index].name, students[index].score[0],
students[index].score[1], students[index].score[2], students[index].total_score,
students[index].avg_score);
} else {
printf("未找到该学生。\n");
}
}
// 按姓名查询学生信息
void search_by_name() {
// 获取学生姓名
char name[20];
printf("请输入要查询学生的姓名:");
scanf("%s", name);
// 查找学生
int count = 0;
for (int i = 0; i < num_students; i++) {
if (strcmp(students[i].name, name) == 0) {
printf("第%d个学生,学号:%s,姓名:%s,各门课程成绩:%f %f %f,总分:%f,平均分:%f\n",
i + 1, students[i].id, students[i].name, students[i].score[0],
students[i].score[1], students[i].score[2], students[i].total_score,
students[i].avg_score);
count++;
}
}
if (count == 0) {
printf("未找到该学生。\n");
}
}
// 按学号排序
void sort_by_id() {
// 冒泡排序
for (int i = 0; i < num_students - 1; i++) {
for (int j = 0; j < num_students - i - 1; j++) {
if (strcmp(students[j].id, students[j+1].id) > 0) {
student temp = students[j];
students[j] = students[j+1];
students[j+1] = temp;
}
}
}
printf("学生信息按学号排序完成。\n");
}
// 按总分排序
void sort_by_score() {
// 冒泡排序
for (int i = 0; i < num_students - 1; i++) {
for (int j = 0; j < num_students - i - 1; j++) {
if (students[j].total_score < students[j+1].total_score) {
student temp = students[j];
students[j] = students[j+1];
students[j+1] = temp;
}
}
}
// 输出排名信息
printf("学生成绩排名如下:\n");
for (int i = 0; i < num_students; i++) {
printf("第%d名,学号:%s,姓名:%s,总分:%f\n", i + 1, students[i].id,
students[i].name, students[i].total_score);
}
}
// 输出成绩总表
void output_students() {
// 输出表头
printf("学号\t姓名\t课程1\t课程2\t课程3\t总分\t平均分\n");
// 输出学生信息
for (int i = 0; i < num_students; i++) {
printf("%s\t%s\t%f\t%f\t%f\t%f\t%f\n", students[i].id, students[i].name,
students[i].score[0], students[i].score[1], students[i].score[2],
students[i].total_score, students[i].avg_score);
}
printf("学生信息输出完成。\n");
}
// 数据存盘
void save_students() {
FILE *fp = fopen("students.dat", "wb");
if (fp == NULL) {
printf("数据存储失败。\n");
return;
}
fwrite(&num_students, sizeof(int), 1, fp); // 存储学生人数
fwrite(students, sizeof(student), num_students, fp); // 存储学生信息
fclose(fp);
printf("数据存储成功。\n");
}
// 数据读取
void load_students() {
FILE *fp = fopen("students.dat", "rb");
if (fp == NULL) {
printf("未找到数据文件,新建空数据。\n");
return;
}
fread(&num_students, sizeof(int), 1, fp); // 读取学生人数
students = (student*) malloc(num_students * sizeof(student)); // 分配内存
fread(students, sizeof(student), num_students, fp); // 读取学生信息
fclose(fp);
printf("数据读取成功。\n");
}
```
C语言编写一个录入和修改学生信息的程序,包含学生姓名、学号、各科成绩并按课程排序显示学生信息
好的,下面是代码实现:
```c
#include <stdio.h>
#include <string.h>
#define MAX_SUBJECTS 5 // 最多支持 5 科目
struct student {
char name[20];
char id[15];
float scores[MAX_SUBJECTS];
};
int main() {
struct student stu[100];
int n, m, i, j, k;
char choice;
float temp;
printf("请输入学生人数:");
scanf("%d", &n);
for (i = 0; i < n; i++) {
printf("请输入第 %d 个学生的姓名和学号:", i + 1);
scanf("%s %s", stu[i].name, stu[i].id);
for (j = 0; j < MAX_SUBJECTS; j++) {
printf("请输入 %s 的第 %d 科成绩:", stu[i].name, j + 1);
scanf("%f", &stu[i].scores[j]);
}
}
for (;;) { // 无限循环,直到用户选择退出
printf("\n请选择要进行的操作:\n");
printf("1. 显示所有学生信息\n");
printf("2. 修改学生成绩\n");
printf("3. 退出程序\n");
fflush(stdin); // 刷新输入缓冲区,避免影响下一次输入
scanf("%c", &choice);
switch (choice) {
case '1':
// 冒泡排序,按照第一科成绩从高到低排序
for (i = 0; i < n - 1; i++) {
for (j = 0; j < n - i - 1; j++) {
if (stu[j].scores[0] < stu[j + 1].scores[0]) {
struct student temp_stu = stu[j];
stu[j] = stu[j + 1];
stu[j + 1] = temp_stu;
}
}
}
printf("\n学生信息如下:\n");
for (i = 0; i < n; i++) {
printf("姓名:%s,学号:%s,成绩:", stu[i].name, stu[i].id);
for (j = 0; j < MAX_SUBJECTS; j++) {
printf("%.2f ", stu[i].scores[j]);
}
printf("\n");
}
break;
case '2':
printf("\n请输入要修改成绩的学生姓名和科目序号:");
scanf("%s %d", stu[n].name, &m);
for (i = 0; i < n; i++) {
if (strcmp(stu[i].name, stu[n].name) == 0) {
printf("请输入新的成绩:");
scanf("%f", &temp);
stu[i].scores[m - 1] = temp;
printf("修改成功!\n");
break;
}
}
if (i == n) {
printf("没有找到该学生!\n");
}
break;
case '3':
printf("\n谢谢使用!\n");
return 0;
default:
printf("\n输入有误,请重新输入!\n");
}
}
}
```
代码中使用了一个结构体 `struct student` 来存储每一个学生的信息,包括姓名、学号和各科成绩。首先,用户需要输入学生人数和每个学生的信息,然后进入一个无限循环,用户可以选择显示所有学生信息、修改学生成绩或退出程序。如果用户选择显示所有学生信息,程序会按照第一科成绩从高到低排序后输出所有学生的信息;如果用户选择修改学生成绩,程序会要求输入要修改成绩的学生姓名和科目序号,然后修改对应学生和科目的成绩。
需要注意的是,用户输入选择操作时,需要用 `fflush(stdin)` 刷新输入缓冲区,避免影响下一次输入。同时,为了避免用户输入错误的操作,可以使用 `default` 分支来提示用户重新输入。