实现一个单门课程成绩管理系统。进入系统时,用户可选择身份:1.教师;2学生。以教师身份进入后,如果上次已保存了数据,可将文件中数据读取出来,并允许修改或添加新数据。如果为第一次录入(之前无保存的数据),则允许教师录入相关数据。具体功能包括:可录入或修改课程信息,包括:课程编号、课程名称;可录入、修改、删除学生(数量不限)成绩,成绩项目包含两项:平时成绩、final成绩,并按照各50%比例自动算出总成绩;学生基本信息包括学号、姓名;示例如下:请录入“C++编程”课程成绩学号:201901姓名:张三平时成绩:60final成绩:80信息显示功能,可显示课程编号、课程名称、所有学生的成绩单。成绩单格式如下:学号 姓名 平时成绩 final成绩 总成绩信息统计功能,可显示总成绩、平时成绩、final成绩的最高分、最低分、平均分、在每个分数段(60分以下为一个分数段,60分以上每10分为一个分数段)的分布情况等。(选做1)能够将上述数据保存在文件中,二进制、文本文件均可。可读取上述文件。以学生身份进入后,如果已保存了成绩数据,可将文件中数据读取出来,并允许查询。如果尚无保存数据,提示尚无成绩信息。具体功能包括:信息显示功能,可显示课程编号、课程名称、所有学生的成绩单。信息统计功能,可显示总成绩、平时成绩、final成绩的最高分、最低分、平均分、在每个分数段(60分以下为一个分数段,60分以上每10分为一个分数段)的分布情况等。信息查询功能,输入学号或者姓名,均能进行该学生的成绩查询,并给出该学生总成绩、平时成绩、final成绩在全班的排名。(选做2)选做3:增加教师身份的密码保护功能,具体要求如下:教师身份需要密码保护。选择教师身份进入系统后,必须输入密码;密码验证无误后,才可进入后续过程。教师的密码经过加密后,存储在一个密码文件中。教师的初始密码为“123456”,首次进入系统时,要求用户修改密码。在后续使用中,允许修改教师密码。密码修改后,更新密码文件。特选输入密码或修改密码时,密码本身不显示出来,而是以掩码“*”显示。
基于new bing部分指引作答:
以下是一个简单的C++代码示例,实现了你描述的单门课程成绩管理系统的功能。由于篇幅限制,代码并未完全实现所有的选做功能,但提供了一个基本的框架,你可以根据需要进行扩展和完善。
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <fstream>
using namespace std;
struct Student {
string studentID;
string name;
double dailyGrade;
double finalGrade;
double totalGrade;
};
struct Course {
string courseID;
string courseName;
vector<Student> students;
};
vector<Course> courses;
const string dataFileName = "data.bin";
void teacherMenu();
void studentMenu();
void displayCourseInfo(const Course& course);
void displayAllGrades();
void displayGradeDistribution();
void addOrUpdateCourse();
void addOrUpdateStudentGrades();
void deleteStudentGrades();
void calculateTotalGrade(Student& student);
void saveDataToFile();
void loadDataFromFile();
void loginMenu() {
int choice;
while (true) {
cout << "请选择您的身份:\n";
cout << "1. 教师\n";
cout << "2. 学生\n";
cout << "0. 退出\n";
cout << "请输入您的选择: ";
cin >> choice;
switch (choice) {
case 1:
teacherMenu();
break;
case 2:
studentMenu();
break;
case 0:
return;
default:
cout << "无效的选择。\n";
break;
}
}
}
void teacherMenu() {
int choice;
while (true) {
cout << "\n教师菜单\n";
cout << "1. 录入或修改课程信息\n";
cout << "2. 录入或修改学生成绩\n";
cout << "3. 删除学生成绩\n";
cout << "4. 显示课程和学生成绩信息\n";
cout << "5. 显示成绩统计信息\n";
cout << "6. 保存数据到文件\n";
cout << "0. 退出\n";
cout << "请输入您的选择: ";
cin >> choice;
switch (choice) {
case 1:
addOrUpdateCourse();
break;
case 2:
addOrUpdateStudentGrades();
break;
case 3:
deleteStudentGrades();
break;
case 4:
displayAllGrades();
break;
case 5:
displayGradeDistribution();
break;
case 6:
saveDataToFile();
break;
case 0:
return;
default:
cout << "无效的选择。\n";
break;
}
}
}
void studentMenu() {
int choice;
while (true) {
cout << "\n学生菜单\n";
cout << "1. 显示课程和学生成绩信息\n";
cout << "2. 显示成绩统计信息\n";
cout << "0. 退出\n";
cout << "请输入您的选择: ";
cin >> choice;
switch (choice) {
case 1:
displayAllGrades();
break;
case 2:
displayGradeDistribution();
break;
case 0:
return;
default:
cout << "无效的选择。\n";
break;
}
}
}
void displayCourseInfo(const Course& course) {
cout << "课程编号: " << course.courseID << endl;
cout << "课程名称: " << course.courseName << endl;
}
void displayAllGrades() {
if (courses.empty()) {
cout << "没有课程信息。\n";
return;
}
for (const Course& course : courses) {
displayCourseInfo(course);
cout << "学号\t姓名\t平时成绩\tFinal成绩\t总成绩\n";
for (const Student& student : course.students) {
cout << student.studentID << "\t" << student.name << "\t"
<< student.dailyGrade << "\t\t" << student.finalGrade << "\t\t"
<< student.totalGrade << endl;
}
cout << endl;
}
}
void displayGradeDistribution() {
if (courses.empty()) {
cout << "没有课程信息。\n";
return;
}
int numStudents = 0;
double totalTotalGrade = 0;
double totalDailyGrade = 0;
double totalFinalGrade = 0;
int gradeCounts[11] = { 0 };
for (const Course& course : courses) {
for (const Student& student : course.students) {
numStudents++;
totalTotalGrade += student.totalGrade;
totalDailyGrade += student.dailyGrade;
totalFinalGrade += student.finalGrade;
int gradeRange = static_cast<int>(student.totalGrade) / 10;
if (gradeRange >= 0 && gradeRange <= 10) {
gradeCounts[gradeRange]++;
}
}
}
double averageTotalGrade = totalTotalGrade / numStudents;
double averageDailyGrade = totalDailyGrade / numStudents;
double averageFinalGrade = totalFinalGrade / numStudents;
cout << "成绩统计信息\n";
cout << "学生总人数: " << numStudents << endl;
cout << "平均总成绩: " << averageTotalGrade << endl;
cout << "平均平时成绩: " << averageDailyGrade << endl;
cout << "平均Final成绩: " << averageFinalGrade << endl;
cout << "总成绩分布情况:\n";
cout << "分数段\t人数" << endl;
for (int i = 0; i <= 10; i++) {
int lowerBound = i * 10;
int upperBound = lowerBound + 9;
if (i == 10) {
upperBound = 100;
}
cout << lowerBound << "-" << upperBound << "\t" << gradeCounts[i] << endl;
}
}
void addOrUpdateCourse() {
Course course;
cout << "请输入课程编号: ";
cin >> course.courseID;
cout << "请输入课程名称: ";
cin >> course.courseName;
bool found = false;
for (Course& existingCourse : courses) {
if (existingCourse.courseID == course.courseID) {
existingCourse = course;
found = true;
break;
}
}
if (!found) {
courses.push_back(course);
}
cout << "课程信息已保存。\n";
}
void addOrUpdateStudentGrades() {
if (courses.empty()) {
cout << "没有课程信息。\n";
return;
}
string courseID;
cout << "请输入课程编号: ";
cin >> courseID;
Course* course = nullptr;
for (Course& existingCourse : courses) {
if (existingCourse.courseID == courseID) {
course = &existingCourse;
break;
}
}
if (course == nullptr) {
cout << "找不到课程。\n";
return;
}
Student student;
cout << "请输入学号: ";
cin >> student.studentID;
cout << "请输入姓名: ";
cin >> student.name;
cout << "请输入平时成绩: ";
cin >> student.dailyGrade;
cout << "请输入Final成绩: ";
cin >> student.finalGrade;
calculateTotalGrade(student);
bool found = false;
for (Student& existingStudent : course->students) {
if (existingStudent.studentID == student.studentID) {
existingStudent = student;
found = true;
break;
}
}
if (!found) {
course->students.push_back(student);
}
cout << "学生成绩已保存。\n";
}
void deleteStudentGrades() {
if (courses.empty()) {
cout << "没有课程信息。\n";
return;
}
string courseID;
cout << "请输入课程编号: ";
cin >> courseID;
Course* course = nullptr;
for (Course& existingCourse : courses) {
if (existingCourse.courseID == courseID) {
course = &existingCourse;
break;
}
}
if (course == nullptr) {
cout << "找不到课程。\n";
return;
}
string studentID;
cout << "请输入要删除成绩的学生学号: ";
cin >> studentID;
auto it = remove_if(course->students.begin(), course->students.end(),
[&](const Student& student) {
return student.studentID == studentID;
});
if (it != course->students.end()) {
course->students.erase(it, course->students.end());
cout << "学生成绩已删除。\n";
}
else {
cout << "找不到学生。\n";
}
}
void calculateTotalGrade(Student& student) {
student.totalGrade = (student.dailyGrade + student.finalGrade) / 2.0;
}
void saveDataToFile() {
ofstream dataFile(dataFileName, ios::binary);
if (!dataFile) {
cout << "无法保存数据到文件。\n";
return;
}
int numCourses = courses.size();
dataFile.write(reinterpret_cast<const char*>(&numCourses), sizeof(int));
for (const Course& course : courses) {
int courseIDLength = course.courseID.length();
dataFile.write(reinterpret_cast<const char*>(&courseIDLength), sizeof(int));
dataFile.write(course.courseID.c_str(), courseIDLength);
int courseNameLength = course.courseName.length();
dataFile.write(reinterpret_cast<const char*>(&courseNameLength), sizeof(int));
dataFile.write(course.courseName.c_str(), courseNameLength);
int numStudents = course.students.size();
dataFile.write(reinterpret_cast<const char*>(&numStudents), sizeof(int));
for (const Student& student : course.students) {
int studentIDLength = student.studentID.length();
dataFile.write(reinterpret_cast<const char*>(&studentIDLength), sizeof(int));
dataFile.write(student.studentID.c_str(), studentIDLength);
int nameLength = student.name.length();
dataFile.write(reinterpret_cast<const char*>(&nameLength), sizeof(int));
dataFile.write(student.name.c_str(), nameLength);
dataFile.write(reinterpret_cast<const char*>(&student.dailyGrade), sizeof(double));
dataFile.write(reinterpret_cast<const char*>(&student.finalGrade), sizeof(double));
dataFile.write(reinterpret_cast<const char*>(&student.totalGrade), sizeof(double));
}
}
dataFile.close();
cout << "数据已保存到文件。\n";
}
void loadDataFromFile() {
ifstream dataFile(dataFileName, ios::binary);
if (!dataFile) {
cout << "无法从文件加载数据。\n";
return;
}
courses.clear();
int numCourses;
dataFile.read(reinterpret_cast<char*>(&numCourses), sizeof(int));
for (int i = 0; i < numCourses; i++) {
Course course;
int courseIDLength;
dataFile.read(reinterpret_cast<char*>(&courseIDLength), sizeof(int));
course.courseID.resize(courseIDLength);
dataFile.read(&course.courseID[0], courseIDLength);
int courseNameLength;
dataFile.read(reinterpret_cast<char*>(&courseNameLength), sizeof(int));
course.courseName.resize(courseNameLength);
dataFile.read(&course.courseName[0], courseNameLength);
int numStudents;
dataFile.read(reinterpret_cast<char*>(&numStudents), sizeof(int));
for (int j = 0; j < numStudents; j++) {
Student student;
int studentIDLength;
dataFile.read(reinterpret_cast<char*>(&studentIDLength), sizeof(int));
student.studentID.resize(studentIDLength);
dataFile.read(&student.studentID[0], studentIDLength);
int nameLength;
dataFile.read(reinterpret_cast<char*>(&nameLength), sizeof(int));
student.name.resize(nameLength);
dataFile.read(&student.name[0], nameLength);
dataFile.read(reinterpret_cast<char*>(&student.dailyGrade), sizeof(double));
dataFile.read(reinterpret_cast<char*>(&student.finalGrade), sizeof(double));
dataFile.read(reinterpret_cast<char*>(&student.totalGrade), sizeof(double));
course.students.push_back(student);
}
courses.push_back(course);
}
dataFile.close();
cout << "数据已从文件加载。\n";
}
int main() {
loadDataFromFile();
loginMenu();
saveDataToFile();
return 0;
}
来自GPT的回答:
```bash
实现一个单门课程成绩管理系统需要编写一定的代码逻辑和数据存储功能。这个系统比较复杂,无法在单个回答中完全实现。我将为你提供一个基本的代码框架和思路,你可以根据这个框架进一步完善和实现系统。
下面是一个示例的C++代码框架,用于实现教师和学生的成绩管理系统:
cpp
Copy code
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
// 定义学生类
class Student {
private:
std::string studentID;
std::string name;
double regularScore;
double finalScore;
double totalScore;
public:
// 构造函数
Student(std::string id, std::string n) {
studentID = id;
name = n;
regularScore = 0.0;
finalScore = 0.0;
totalScore = 0.0;
}
// 设置平时成绩
void setRegularScore(double score) {
regularScore = score;
}
// 设置Final成绩
void setFinalScore(double score) {
finalScore = score;
}
// 计算总成绩
void calculateTotalScore() {
totalScore = 0.5 * regularScore + 0.5 * finalScore;
}
// 获取学生ID
std::string getStudentID() {
return studentID;
}
// 获取学生姓名
std::string getName() {
return name;
}
// 获取平时成绩
double getRegularScore() {
return regularScore;
}
// 获取Final成绩
double getFinalScore() {
return finalScore;
}
// 获取总成绩
double getTotalScore() {
return totalScore;
}
};
// 定义课程类
class Course {
private:
std::string courseCode;
std::string courseName;
std::vector<Student> students;
public:
// 构造函数
Course(std::string code, std::string name) {
courseCode = code;
courseName = name;
}
// 添加学生
void addStudent(Student student) {
students.push_back(student);
}
// 获取学生数量
int getStudentCount() {
return students.size();
}
// 获取指定索引的学生
Student& getStudent(int index) {
return students[index];
}
// 根据学生ID查找学生
Student* findStudentByID(std::string studentID) {
for (auto& student : students) {
if (student.getStudentID() == studentID) {
return &student;
}
}
return nullptr;
}
// 根据学生姓名查找学生
Student* findStudentByName(std::string name) {
for (auto& student : students) {
if (student.getName() == name) {
return &student;
}
}
return nullptr;
}
// 计算成绩统计信息
void calculateStatistics() {
// TODO: 实现成绩统计逻辑
}
};
// 主函数
int main() {
// TODO: 实现系统入口逻辑
return 0;
}
上述代码框架定义了 Student 学生类和 Course 课程类,提供了一些基本的操作函数。你可以在此基础上进一步扩展和完善,根据需要添加更多功能和数据存储。
关于数据存储,你可以使用文件来保存课程和学生的信息。可以选择将数据保存为文本文件,每行表示一个学生的成绩记录,或者使用二进制文件进行存储,具体取决于你的需求和喜好。你可以使用文件输入/输出操作来实现数据的读取和存储,如 std::ifstream 和 std::ofstream。
对于教师密码保护功能,你可以在代码中添加相应的逻辑来实现。可以将密码保存在一个密码文件中,使用加密算法对密码进行加密。在教师登录时,验证输入的密码与存储的密码是否匹配。
请根据这个代码框架和具体要求进行进一步开发和完善。这是一个较为复杂的项目,可能需要你具备一定的编程基础和实践经验。如果你在具体实现过程中遇到问题,欢迎随时提问。
```
下面是一个简单的参考示例,你可以根据你的要求在此基础上进行修改完善:
class Student:
def __init__(self, id, name):
self.id = id
self.name = name
self.ordinary_score = 0
self.final_score = 0
self.total_score = 0
class Course:
def __init__(self, id, name):
self.id = id
self.name = name
self.students = []
class ScoreManagementSystem:
def __init__(self):
self.courses = {}
self.teacher_password = "123456"
def login(self, identity):
if identity == "teacher":
password = input("请输入教师密码:")
if password == self.teacher_password:
print("登录成功!")
return True
else:
print("密码错误!")
return False
elif identity == "student":
print("学生登录中...")
return True
else:
print("请输入正确的身份!")
return False
def add_course(self, course):
self.courses[course.id] = course
def add_student_to_course(self, student, course):
course.students.append(student)
def update_student_score(self, student, ordinary_score, final_score):
student.ordinary_score = ordinary_score
student.final_score = final_score
student.total_score = (ordinary_score + final_score) / 2
def get_student_score_report(self, student):
report = f"学号:{student.id},姓名:{student.name},平时成绩:{student.ordinary_score},final成绩:{student.final_score},总成绩:{student.total_score}\n"
return report
def get_course_score_report(self, course):
report = f"课程编号:{course.id},课程名称:{course.name}\n"
for student in course.students:
report += self.get_student_score_report(student)
return report
def get_score_statistic(self):
ordinary_score_min = float("inf")
ordinary_score_max = float("-inf")
final_score_min = float("inf")
final_score_max = float("-inf")
total_score_min = float("inf")
total_score_max = float("-inf")
count = 0
for course in self.courses.values():
for student in course.students:
count += 1
ordinary_score_min = min(ordinary_score_min, student.ordinary_score)
ordinary_score_max = max(ordinary_score_max, student.ordinary_score)
final_score_min = min(final_score_min, student.final_score)
final_score_max = max(final_score_max, student.final_score)
total_score_min = min(total_score_min, student.total_score)
total_score_max = max(total_score_max, student.total_score)
ordinary_score_avg = count / 2 * int(count / 2) / count if count > 0 else 0
#未完待续,如有帮助,恭请采纳
代码块:
#include <stdio.h>
#include <stdlib.h>
void aver_fcourse(int *s[4], int n); //定义函数1
void two_fail(int *s[4], int m, int n); //定义函数2
void high_score(int *s[4], int m, int n); //定义函数3
int main()
{
int *stu_score[4], i, j;
for (i=0; i<4; i++){
stu_score[i]=(int *)malloc(3*sizeof(int)); //给学生成绩分配动态空间
printf("Please enter No.%d student score: ", i+1); //输入学生成绩
for (j=0; j<5; scanf("%d", *(stu_score+i)+j), j++);
}
aver_fcourse(stu_score, 4); //调用函数1
two_fail(stu_score, 4, 5); //调用函数2
high_score(stu_score, 4, 5); //调用函数3
return 0;
}
//函数1
void aver_fcourse(int *s[4], int n)
{
int i;
float sum;
for (i=0, sum=0; i<n; sum+=*s[i++]);
printf("The first course average score: %.2f\n", sum/n);
}
//函数2
void two_fail(int *s[4], int m, int n)
{
int i, j, k, cc;
float sum;
for (i=0; i<m; i++){
for (j=0, cc=0; j<n; *(*(s+i)+j)<60 ? cc++, j++ : j++);
if (cc>=2){
printf("No.%d student is fail. Score: ", i+1);
for (k=0, sum=0; k<n; printf("%d ", *(*(s+i)+k)), sum+=*(*(s+i)+k), k++);
printf("\nAverage=%.2f\n", sum/n);
}
}
}
//函数3
void high_score(int *s[4], int m, int n)
{
int i, j, cc;
float sum, aver;
for (i=0; i<m; i++){
for (j=0, cc=0, sum=0; j<n; sum+=*(*(s+i)+j), *(*(s+i)+j)>85 ? cc++, j++ : j++);
aver=sum/n;
if (aver>90||cc==5)
printf("No.%d student is high score.\n", i+1);
}
}