作业要求
代码实现
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#define MAX_STUDENTS 100
#define MAX_NAME_LENGTH 50
#define MAX_ID_LENGTH 10
#define NUM_COURSES 6
struct Student {
char name[MAX_NAME_LENGTH];
char id[MAX_ID_LENGTH];
int english;
int sports;
int math;
int c_programming;
int physics;
int linear_algebra;
};
struct Student students[MAX_STUDENTS];
int numStudents = 0;
void displayMenu() {
printf("**************************************************\n");
printf("* 学生程序管理系统,请选择系统功能 *\n");
printf("**************************************************\n");
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("*9:按分数段统计学生信息。 *\n");
printf("*0:退出系统。 *\n");
printf("**************************************************\n");
}
//1录入学生信息函数,不变
void addStudent() {
int num;
printf("请输入学生个数: ");
scanf("%d", &num);
if (numStudents + num > MAX_STUDENTS) {
printf("无法添加这么多学生,最大学生数为:%d\n", MAX_STUDENTS);
return;
}
for (int i = 0; i < num; i++) {
printf("请输入第%d个学生的信息:\n", numStudents + 1);
printf("学号:");
scanf("%s", students[numStudents].id);
printf("姓名:");
scanf("%s", students[numStudents].name);
printf("大学英语、体育、高等数学、C语言程序设计、大学物理、线性代数成绩:");
scanf("%d %d %d %d %d %d", &students[numStudents].english, &students[numStudents].sports, &students[numStudents].math, &students[numStudents].c_programming, &students[numStudents].physics, &students[numStudents].linear_algebra);
numStudents++;
}
printf("学生信息录入成功!\n");
}
// 其他功能函数的定义..
// 2按学号查询学生信息函数
void searchById() {
char searchId[5];
printf("请输入要查询的学生学号:");
scanf("%s", searchId);
for (int i = 0; i < numStudents; i++) {
if (strcmp(students[i].id, searchId) == 0) {
printf("找到学生信息:\n");
printf("姓名:%s\n", students[i].name);
printf("学号:%s\n", students[i].id);
printf("大学英语:%d\n", students[i].english);
printf("体育:%d\n", students[i].sports);
printf("高等数学:%d\n", students[i].math);
printf("C语言程序设计:%d\n", students[i].c_programming);
printf("大学物理:%d\n", students[i].physics);
printf("线性代数:%d\n", students[i].linear_algebra);
return;
}
}
printf("未找到该学生信息。\n");
}
// 3按姓名查询学生信息函数
void searchByName() {
char searchName[50];
printf("请输入要查询的学生姓名:");
scanf("%s", searchName);
int found = 0;
for (int i = 0; i < numStudents; i++) {
if (strcmp(students[i].name, searchName) == 0) {
printf("找到学生信息:\n");
printf("姓名:%s\n", students[i].name);
printf("学号:%s\n", students[i].id);
printf("大学英语:%d\n", students[i].english);
printf("体育:%d\n", students[i].sports);
printf("高等数学:%d\n", students[i].math);
printf("C语言程序设计:%d\n", students[i].c_programming);
printf("大学物理:%d\n", students[i].physics);
printf("线性代数:%d\n", students[i].linear_algebra);
found = 1;
}
}
if (!found) {
printf("未找到该学生信息。\n");
}
}
// 5按学号删除学生信息函数
void deleteById() {
char deleteId[5];
printf("请输入要删除的学生学号:");
scanf("%s", deleteId);
int found = 0;
for (int i = 0; i < numStudents; i++) {
if (strcmp(students[i].id, deleteId) == 0) {
found = 1;
for (int j = i; j < numStudents - 1; j++) {
students[j] = students[j + 1];
}
numStudents--;
printf("学生信息删除成功!\n");
break;
}
}
if (!found) {
printf("未找到该学生信息,无法删除。\n");
}
}
// 6按学号修改学生信息函数
void modifyById() {
char modifyId[5];
printf("请输入要修改信息的学生学号:");
scanf("%s", modifyId);
for (int i = 0; i < numStudents; i++) {
if (strcmp(students[i].id, modifyId) == 0) {
printf("请输入新的学生信息:\n");
printf("学号: ");
scanf("%s", students[i].id);
printf("姓名: ");
scanf("%s", students[i].name);
printf("大学英语、体育、高等数学、C语言程序设计、大学物理、线性代数成绩: ");
scanf("%d %d %d %d %d %d", &students[i].english, &students[i].sports, &students[i].math, &students[i].c_programming, &students[i].physics, &students[i].linear_algebra);
printf("学生信息修改成功!\n");
return;
}
}
printf("未找到该学生信息,无法修改。\n");
}
// 7显示所有学生信息函数
void displayAllStudents() {
if (numStudents == 0) {
printf("当前没有学生信息。\n");
} else {
printf("所有学生信息如下:\n");
for (int i = 0; i < numStudents; i++) {
printf("姓名:%s 学号:%s\n", students[i].name, students[i].id);
}
}
}
//8 按照六门课程成绩排序并显示学生信息
void sortByCourseScore(int courseIndex) {
struct Student temp;
for (int i = 0; i < numStudents - 1; i++) {
for (int j = 0; j < numStudents - i - 1; j++) {
int scoreJ = 0, scoreJPlus = 0;
// Get the appropriate score based on the course index
switch(courseIndex) {
case 1: scoreJ = students[j].english; scoreJPlus = students[j+1].english; break;
case 2: scoreJ = students[j].sports; scoreJPlus = students[j+1].sports; break;
case 3: scoreJ = students[j].math; scoreJPlus = students[j+1].math; break;
case 4: scoreJ = students[j].c_programming; scoreJPlus = students[j+1].c_programming; break;
case 5: scoreJ = students[j].physics; scoreJPlus = students[j+1].physics; break;
case 6: scoreJ = students[j].linear_algebra; scoreJPlus = students[j+1].linear_algebra; break;
}
if (scoreJ < scoreJPlus) {
temp = students[j];
students[j] = students[j+1];
students[j+1] = temp;
}
}
}
printf("按课程成绩排序后的学生信息如下:\n");
for (int i = 0; i < numStudents; i++) {
printf("姓名:%s 学号:%s ", students[i].name, students[i].id);
switch(courseIndex) {
case 1: printf("大学英语:%d\n", students[i].english); break;
case 2: printf("体育:%d\n", students[i].sports); break;
case 3: printf("高等数学:%d\n", students[i].math); break;
case 4: printf("C语言程序设计:%d\n", students[i].c_programming); break;
case 5: printf("大学物理:%d\n", students[i].physics); break;
case 6: printf("线性代数:%d\n", students[i].linear_algebra); break;
}
}
}
//9:分数段统计学生信息
void countScoreRange(int courseIndex) {
int range[5] = {0}; // 分数段计数器,分别用来记录不同段的人数
for (int i = 0; i < numStudents; i++) {
int score = 0;
// Get the appropriate score based on the course index
switch(courseIndex) {
case 1: score = students[i].english; break;
case 2: score = students[i].sports; break;
case 3: score = students[i].math; break;
case 4: score = students[i].c_programming; break;
case 5: score = students[i].physics; break;
case 6: score = students[i].linear_algebra; break;
}
if (score >= 0 && score < 60) {
range[0]++;
} else if (score >= 60 && score < 70) {
range[1]++;
} else if (score >= 70 && score < 80) {
range[2]++;
} else if (score >= 80 && score < 90) {
range[3]++;
} else if (score >= 90 && score <= 100) {
range[4]++;
}
}
printf("课程%d成绩分布如下:\n", courseIndex);
printf("0-59分:%d人\n", range[0]);
printf("60-69分:%d人\n", range[1]);
printf("70-79分:%d人\n", range[2]);
printf("80-89分:%d人\n", range[3]);
printf("90-100分:%d人\n", range[4]);
}
int main() {
int choice;
do {
displayMenu();
printf("请输入对应的数字来选择功能: ");
scanf("%d", &choice);
switch (choice) {
case 1:
addStudent();
// 调用录入学生信息的函数
break;
case 2:
searchById();
// 调用按学号查询的函数
break;
case 3:
searchByName();
// 调用按姓名查询的函数
break;
case 4:
addStudent();
// 调用添加学生信息的函数
break;
case 5:
deleteById();
// 调用按学号删除的函数
break;
case 6:
modifyById();
// 调用按学号修改的函数
break;
case 7:
displayAllStudents();
// 调用显示所有学生信息的函数
break;
case 8:{
int courseChoice;
printf("请选择要排序的课程:\n");
printf("1: 大学英语\n");
printf("2: 体育\n");
printf("3: 高等数学\n");
printf("4: C语言程序设计\n");
printf("5: 大学物理\n");
printf("6: 线性代数\n");
scanf("%d", &courseChoice);
sortByCourseScore(courseChoice);
// 调用按课程排序并显示学生信息的函数
break;}
case 9:
{int course;
printf("请输入要统计的课程编号:");
scanf("%d", &course);
if (course < 1 || course > NUM_COURSES) {
printf("无效的课程编号\n");
} else {
countScoreRange(course - 1);
}
// 调用按分数段统计学生信息的函数
break;}
case 0:
printf("感谢使用,再见!\n");
break;
default:
printf("无效的选项,请重新输入。\n");
}
} while (choice != 0);
return 0;
}
-
结构体(Structures):我们使用结构体来定义学生(Student)的数据结构,并在其中存储学生的姓名、学号和成绩等信息。
-
数组(Arrays):我们使用数组来存储学生信息,以及用于统计分数段的人数。通过使用数组,我们可以在同一个数据结构中存储多个学生的信息。
-
输入输出函数(Input/Output Functions):我们使用
printf
和scanf
函数来进行控制台的输入和输出操作,以便与用户进行交互并显示学生信息。 -
条件语句(Conditional Statements):我们使用条件语句(如
if
语句)来根据用户的选择执行不同的功能。通过判断条件的真假,我们可以决定程序的执行路径。 -
循环语句(Loop Statements):我们使用循环语句(如
for
和do-while
循环)来处理多个学生的输入和显示所有学生的信息。通过循环,我们可以重复执行相同的代码块。 -
选择语句(Switch Statements):我们使用选择语句(
switch
语句)来根据用户的选择执行不同的功能。通过switch
语句,我们可以根据用户输入的选项进行选择性的操作。 -
函数(Functions):我们使用函数来划分和组织代码,实现特定的功能。通过将代码逻辑封装在函数中,我们可以提高代码的可读性和可维护性。
-
宏定义(Macro Definition):我们使用宏定义来定义常量,例如最大学生数量和课程数量。通过宏定义,我们可以方便地在代码中使用常量,并提高代码的可维护性。
对于一个初学者想要完成上述编程任务,需要掌握以下的基础知识,并注意以下几点:
C语言基础:需要熟悉C语言的基本语法、变量、数据类型、运算符、流程控制语句(如条件语句和循环语句)、函数等基础知识。
结构体:了解如何定义和使用结构体,以便存储和操作学生的信息。
数组:熟悉如何定义和使用数组,以存储多个学生的信息和实现其他功能,如成绩统计。
输入输出:了解如何使用printf和scanf函数进行控制台的输入和输出,以便与用户进行交互和显示学生信息。
函数:理解如何编写和调用函数,以便实现不同的功能,并将代码逻辑划分为可重用的模块。
宏定义:了解如何定义和使用宏,以便在代码中定义常量,并提高代码的可维护性。
代码的组织和结构化:在编写代码时,要注意将代码组织为逻辑清晰、结构化的函数,每个函数负责完成特定的功能,使代码更易于理解和维护。
错误处理和输入验证:在输入和操作数据时,需要考虑边界情况和错误处理,例如输入验证和错误消息输出,以保证程序的健壮性。
编程实践:建议以迭代的方式逐步实现功能,先实现基本功能,然后逐步添加其他功能和改进。同时,进行适量的调试和测试,以确保代码的正确性。
学习资源:使用适合初学者的学习资源,如教程、书籍、在线课程和编程练习,以帮助加深对C语言和编程概念的理解。
编程历程:
错误提示a label can only be part of a statement and a declaration is not a statement
原因:case:内多个语句未加大括号
错误提示为'NUM_COURSES' undeclared (first use in this function)
原因:使用变量NUM_COURSES
之前没有进行声明或定义
注意事项:
理解问题需求:在开始编程之前,确保完全理解问题的需求和功能。这有助于明确目标,并避免在编程过程中出现混乱和困惑。
小步前进:建议以小步前进的方式逐渐实现功能,不要试图一次性完成所有的功能。先实现基本功能,然后逐步添加其他功能和改进,这样更容易掌握和理解。
调试和测试:在编程过程中,经常进行调试和测试,以确保代码的正确性和功能的预期。使用调试工具和打印语句来帮助定位和解决问题。
学习和提问:积极学习和提问。如果遇到困难或有疑问,应及时寻求帮助和解答,可以通过学习资源、论坛、社区或寻求他人的建议来加快学习进度。
最重要的是保持耐心和持续的学习态度,不断练习和实践,通过不断编程来提升自己的编程技能和理解能力。