用 C++ 打造综合管理系统:功能实现与代码解析

文章目录

  • 系统功能概述
  • 设计与实现
    • 可逆素数模块
    • 计算数字总和模块
    • 各位数字之和排序模块
    • 字符串中的最大整数模块
    • 字符串解压模块
    • 输出指定图形模块
    • 计算学生信息操作之最高分模块
    • 字符串反转模块
    • 菜单界面与主函数
  • 总结​
    • 完整代码


在 C++ 编程学习过程中,将所学知识应用到实际项目里是提升编程能力的有效途径。今天,我们就来构建一个综合管理系统,这个系统集成了多个实用功能模块,能帮助我们解决不同类别的问题。通过这个项目,我们不仅能巩固 C++ 的基础语法,还能学习如何进行系统设计与功能整合。

系统功能概述

这个综合管理系统包含以下几个主要功能模块:​

  • 可逆素数:计算指定区间内的可逆素数的个数。用户输入两个正整数,表示区间的起始值和结束值,系统输出该区间内可逆素数的数量。​
  • 计算数字总和:计算给定非负整数 N 的所有数字的总和,并以英语输出每个数字。用户输入一个非负整数,系统以英语单词形式输出数字总和的每个数字。​
  • 各位数字之和排序:根据各位数字之和对输入的正整数进行排序。用户输入一组正整数,系统显示排序后的结果。​
  • 字符串中的最大整数:从输入的字符串中找出最大的正整数。用户输入一个字符串,以 #结束,系统显示字符串中包含的最大正整数,若没有则输出 “none”。​
  • 字符串解压:将压缩后的字符串解压为原始字符串。用户输入压缩后的字符串,系统显示解压后的字符串。​
  • 输出指定图形:根据用户输入的行数输出一个直角三角形。用户输入一个正整数 n,系统显示按规律变化的 n 行直角三角形。​
  • 计算学生信息操作之最高分:计算每个学生的总分,并输出总分最高的学生的信息。用户输入学生人数及每个学生的学号、姓名和三门课程成绩,系统显示总分最高的学生的详细信息。​
  • 字符串反转:将输入的字符串进行反转。用户输入一个字符串,系统输出反转后的字符串。

设计与实现

可逆素数模块

// 判断一个数是否为素数
bool isPrime(int num) {
    if (num < 2) return false;
    for (int i = 2; i * i <= num; ++i) {
        if (num % i == 0) return false;
    }
    return true;
}

// 反转一个数
int reverseNumber(int num) {
    int reversed = 0;
    while (num > 0) {
        reversed = reversed * 10 + num % 10;
        num /= 10;
    }
    return reversed;
}

// 计算指定区间内的可逆素数的个数
void reversiblePrimes() {
    int start, end;
    std::cout << "请输入区间的起始值和结束值:";
    std::cin >> start >> end;
    int count = 0;
    for (int i = start; i <= end; ++i) {
        if (isPrime(i) && isPrime(reverseNumber(i))) {
            ++count;
        }
    }
    std::cout << "该区间内可逆素数的数量为:" << count << std::endl;
}

在这个模块中,我们首先定义了isPrime函数来判断一个数是否为素数,通过检查从 2 到该数平方根之间的数是否能整除它来实现。

reverseNumber函数用于反转一个数,通过不断取余和乘 10 来实现。最后,reversiblePrimes函数结合这两个函数,遍历指定区间内的数,统计可逆素数的个数。

计算数字总和模块

// 将数字转换为英语单词
std::string digitToEnglish(int digit) {
    switch (digit) {
        case 0: return "zero";
        case 1: return "one";
        case 2: return "two";
        case 3: return "three";
        case 4: return "four";
        case 5: return "five";
        case 6: return "six";
        case 7: return "seven";
        case 8: return "eight";
        case 9: return "nine";
        default: return "";
    }
}

// 计算给定非负整数N的所有数字的总和,并以英语输出每个数字
void sumOfDigits() {
    int num;
    std::cout << "请输入一个非负整数:";
    std::cin >> num;
    int sum = 0;
    while (num > 0) {
        sum += num % 10;
        num /= 10;
    }
    std::string result;
    std::stringstream ss;
    ss << sum;
    std::string sumStr = ss.str();
    for (char c : sumStr) {
        result += digitToEnglish(c - '0');
        result += " ";
    }
    std::cout << result << std::endl;
}

这里,digitToEnglish函数通过switch语句将数字转换为对应的英语单词。sumOfDigits函数先计算输入整数各位数字之和,然后将和转换为字符串,再逐位将数字转换为英语单词并输出。

各位数字之和排序模块

// 计算一个数各位数字之和
int digitSum(int num) {
    int sum = 0;
    while (num > 0) {
        sum += num % 10;
        num /= 10;
    }
    return sum;
}

// 根据各位数字之和对输入的正整数进行排序
void sortByDigitSum() {
    std::vector<int> numbers;
    int num;
    std::cout << "请输入一组正整数(输入非数字字符结束):";
    while (std::cin >> num) {
        numbers.push_back(num);
    }
    std::cin.clear();
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    std::sort(numbers.begin(), numbers.end(), [](int a, int b) {
        return digitSum(a) < digitSum(b);
    });
    std::cout << "排序后的结果为:";
    for (int n : numbers) {
        std::cout << n << " ";
    }
    std::cout << std::endl;
}

digitSum函数计算一个数各位数字之和。在sortByDigitSum函数中,我们使用std::vector存储用户输入的整数,通过while循环读取输入,直到输入非数字字符。然后使用std::sort函数结合自定义的比较函数,根据各位数字之和对整数进行排序并输出。

字符串中的最大整数模块

// 从输入的字符串中找出最大的正整数
void maxIntegerInString() {
    std::string str;
    std::cout << "请输入一个字符串,以#结束:";
    std::getline(std::cin, str, '#');
    int maxNum = -1;
    int currentNum = 0;
    for (char c : str) {
        if (std::isdigit(c)) {
            currentNum = currentNum * 10 + (c - '0');
        } else {
            if (currentNum > maxNum) {
                maxNum = currentNum;
            }
            currentNum = 0;
        }
    }
    if (currentNum > maxNum) {
        maxNum = currentNum;
    }
    if (maxNum == -1) {
        std::cout << "none" << std::endl;
    } else {
        std::cout << "字符串中包含的最大正整数为:" << maxNum << std::endl;
    }
}

在这个模块中,我们遍历输入字符串,遇到数字字符时将其组合成整数,遇到非数字字符时比较当前组合的整数与已记录的最大整数,最终输出字符串中包含的最大正整数,若没有则输出 “none”。

字符串解压模块

// 字符串解压
void decompressString() {
    std::string compressed;
    std::cout << "请输入压缩后的字符串:";
    std::cin >> compressed;
    std::string decompressed;
    for (size_t i = 0; i < compressed.length(); ++i) {
        if (std::isdigit(compressed[i])) {
            int count = compressed[i] - '0';
            char c = compressed[++i];
            for (int j = 0; j < count; ++j) {
                decompressed += c;
            }
        } else {
            decompressed += compressed[i];
        }
    }
    std::cout << "解压后的字符串为:" << decompressed << std::endl;
}

decompressString函数处理压缩字符串,当遇到数字字符时,将其后面的字符重复相应次数添加到解压后的字符串中,非数字字符则直接添加,最终输出解压后的字符串。

输出指定图形模块

// 输出指定图形
void printTriangle() {
    int n;
    std::cout << "请输入一个正整数n:";
    std::cin >> n;
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= i; ++j) {
            std::cout << "*";
        }
        std::cout << std::endl;
    }
}

printTriangle函数根据用户输入的行数n,通过两层循环,内层循环控制每行输出的*数量,从而输出直角三角形。

计算学生信息操作之最高分模块

// 学生信息结构体
struct Student {
    std::string id;
    std::string name;
    int score1, score2, score3;
    int totalScore;
};

// 计算每个学生的总分,并输出总分最高的学生的信息
void highestScoreStudent() {
    int numStudents;
    std::cout << "请输入学生人数:";
    std::cin >> numStudents;
    std::vector<Student> students(numStudents);
    for (int i = 0; i < numStudents; ++i) {
        std::cout << "请输入第 " << i + 1 << " 个学生的学号、姓名和三门课程成绩:";
        std::cin >> students[i].id >> students[i].name >> students[i].score1 >> students[i].score2 >> students[i].score3;
        students[i].totalScore = students[i].score1 + students[i].score2 + students[i].score3;
    }
    int maxIndex = 0;
    for (int i = 1; i < numStudents; ++i) {
        if (students[i].totalScore > students[maxIndex].totalScore) {
            maxIndex = i;
        }
    }
    std::cout << "总分最高的学生信息:" << std::endl;
    std::cout << "学号:" << students[maxIndex].id << std::endl;
    std::cout << "姓名:" << students[maxIndex].name << std::endl;
    std::cout << "三门课程成绩:" << students[maxIndex].score1 << " " << students[maxIndex].score2 << " " << students[maxIndex].score3 << std::endl;
    std::cout << "总分:" << students[maxIndex].totalScore << std::endl;
}

这里定义了Student结构体来存储学生的学号、姓名和成绩信息。highestScoreStudent函数首先读取学生人数和每个学生的信息,计算每个学生的总分,然后通过比较找出总分最高的学生并输出其详细信息。

字符串反转模块

// 字符串反转
void reverseString() {
    std::string str;
    std::cout << "请输入一个字符串:";
    std::cin.ignore();
    std::getline(std::cin, str);
    std::reverse(str.begin(), str.end());
    std::cout << "反转后的字符串为:" << str << std::endl;
}

reverseString函数读取用户输入的字符串,使用std::reverse函数反转字符串并输出结果。

菜单界面与主函数

// 显示菜单
void showMenu() {
    std::cout << "综合管理系统菜单:" << std::endl;
    std::cout << "1. 可逆素数" << std::endl;
    std::cout << "2. 计算数字总和" << std::endl;
    std::cout << "3. 各位数字之和排序" << std::endl;
    std::cout << "4. 字符串中的最大整数" << std::endl;
    std::cout << "5. 字符串解压" << std::endl;
    std::cout << "6. 输出指定图形" << std::endl;
    std::cout << "7. 计算学生信息操作之最高分" << std::endl;
    std::cout << "8. 字符串反转" << std::endl;
    std::cout << "0. 退出" << std::endl;
    std::cout << "请输入你的选择:";
}

int main() {
    int choice;
    do {
        showMenu();
        std::cin >> choice;
        switch (choice) {
            case 1:
                reversiblePrimes();
                break;
            case 2:
                sumOfDigits();
                break;
            case 3:
                sortByDigitSum();
                break;
            case 4:
                maxIntegerInString();
                break;
            case 5:
                decompressString();
                break;
            case 6:
                printTriangle();
                break;
            case 7:
                highestScoreStudent();
                break;
            case 8:
                reverseString();
                break;
            case 0:
                std::cout << "退出系统。" << std::endl;
                break;
            default:
                std::cout << "无效的选择,请重新输入。" << std::endl;
        }
    } while (choice != 0);
    return 0;
}

showMenu函数用于显示系统菜单,main函数通过do - while循环和switch语句,根据用户的选择调用相应的功能模块,直到用户选择退出系统。

总结​

通过这个综合管理系统的开发,我们深入学习了 C++ 的各种编程技巧,包括函数定义、结构体使用、字符串处理、容器操作以及算法实现等。每个功能模块都有其独特的应用场景和实现思路,希望大家能通过学习这个项目,提升自己的 C++ 编程能力,并且能够举一反三,应用到更多实际项目中。

完整代码

#include 
#include 
#include 
#include 
#include 
#include 
#include   // 新增头文件,用于使用 std::numeric_limits

// 判断一个数是否为素数
bool isPrime(int num) {
    if (num < 2) return false;
    for (int i = 2; i * i <= num; ++i) {
        if (num % i == 0) return false;
    }
    return true;
}

// 反转一个数
int reverseNumber(int num) {
    int reversed = 0;
    while (num > 0) {
        reversed = reversed * 10 + num % 10;
        num /= 10;
    }
    return reversed;
}

// 计算指定区间内的可逆素数的个数
void reversiblePrimes() {
    int start, end;
    std::cout << "请输入区间的起始值和结束值:";
    std::cin >> start >> end;
    int count = 0;
    for (int i = start; i <= end; ++i) {
        if (isPrime(i) && isPrime(reverseNumber(i))) {
            ++count;
        }
    }
    std::cout << "该区间内可逆素数的数量为:" << count << std::endl;
}

// 将数字转换为英语单词
std::string digitToEnglish(int digit) {
    switch (digit) {
        case 0: return "zero";
        case 1: return "one";
        case 2: return "two";
        case 3: return "three";
        case 4: return "four";
        case 5: return "five";
        case 6: return "six";
        case 7: return "seven";
        case 8: return "eight";
        case 9: return "nine";
        default: return "";
    }
}

// 计算给定非负整数 N 的所有数字的总和,并以英语输出每个数字
void sumOfDigits() {
    int num;
    std::cout << "请输入一个非负整数:";
    std::cin >> num;
    int sum = 0;
    while (num > 0) {
        sum += num % 10;
        num /= 10;
    }
    std::string result;
    std::stringstream ss;
    ss << sum;
    std::string sumStr = ss.str();
    for (char c : sumStr) {
        result += digitToEnglish(c - '0');
        result += " ";
    }
    std::cout << result << std::endl;
}

// 计算一个数各位数字之和
int digitSum(int num) {
    int sum = 0;
    while (num > 0) {
        sum += num % 10;
        num /= 10;
    }
    return sum;
}

// 根据各位数字之和对输入的正整数进行排序
void sortByDigitSum() {
    std::vector<int> numbers;
    int num;
    std::cout << "请输入一组正整数(输入非数字字符结束):";
    while (std::cin >> num) {
        numbers.push_back(num);
    }
    std::cin.clear();
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    std::sort(numbers.begin(), numbers.end(), [](int a, int b) {
        return digitSum(a) < digitSum(b);
    });
    std::cout << "排序后的结果为:";
    for (int n : numbers) {
        std::cout << n << " ";
    }
    std::cout << std::endl;
}

// 从输入的字符串中找出最大的正整数
void maxIntegerInString() {
    std::string str;
    std::cout << "请输入一个字符串,以#结束:";
    std::getline(std::cin, str, '#');
    int maxNum = -1;
    int currentNum = 0;
    for (char c : str) {
        if (std::isdigit(c)) {
            currentNum = currentNum * 10 + (c - '0');
        } else {
            if (currentNum > maxNum) {
                maxNum = currentNum;
            }
            currentNum = 0;
        }
    }
    if (currentNum > maxNum) {
        maxNum = currentNum;
    }
    if (maxNum == -1) {
        std::cout << "none" << std::endl;
    } else {
        std::cout << "字符串中包含的最大正整数为:" << maxNum << std::endl;
    }
}

// 字符串解压
void decompressString() {
    std::string compressed;
    std::cout << "请输入压缩后的字符串:";
    std::cin >> compressed;
    std::string decompressed;
    for (size_t i = 0; i < compressed.length(); ++i) {
        if (std::isdigit(compressed[i])) {
            int count = compressed[i] - '0';
            char c = compressed[++i];
            for (int j = 0; j < count; ++j) {
                decompressed += c;
            }
        } else {
            decompressed += compressed[i];
        }
    }
    std::cout << "解压后的字符串为:" << decompressed << std::endl;
}

// 输出指定图形
void printTriangle() {
    int n;
    std::cout << "请输入一个正整数 n:";
    std::cin >> n;
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= i; ++j) {
            std::cout << "*";
        }
        std::cout << std::endl;
    }
}

// 学生信息结构体
struct Student {
    std::string id;
    std::string name;
    int score1, score2, score3;
    int totalScore;
};

// 计算每个学生的总分,并输出总分最高的学生的信息
void highestScoreStudent() {
    int numStudents;
    std::cout << "请输入学生人数:";
    std::cin >> numStudents;
    std::vector<Student> students(numStudents);
    for (int i = 0; i < numStudents; ++i) {
        std::cout << "请输入第 " << i + 1 << " 个学生的学号、姓名和三门课程成绩:";
        std::cin >> students[i].id >> students[i].name >> students[i].score1 >> students[i].score2 >> students[i].score3;
        students[i].totalScore = students[i].score1 + students[i].score2 + students[i].score3;
    }
    int maxIndex = 0;
    for (int i = 1; i < numStudents; ++i) {
        if (students[i].totalScore > students[maxIndex].totalScore) {
            maxIndex = i;
        }
    }
    std::cout << "总分最高的学生信息:" << std::endl;
    std::cout << "学号:" << students[maxIndex].id << std::endl;
    std::cout << "姓名:" << students[maxIndex].name << std::endl;
    std::cout << "三门课程成绩:" << students[maxIndex].score1 << " " << students[maxIndex].score2 << " " << students[maxIndex].score3 << std::endl;
    std::cout << "总分:" << students[maxIndex].totalScore << std::endl;
}

// 字符串反转
void reverseString() {
    std::string str;
    std::cout << "请输入一个字符串:";
    std::cin.ignore();
    std::getline(std::cin, str);
    std::reverse(str.begin(), str.end());
    std::cout << "反转后的字符串为:" << str << std::endl;
}

// 显示菜单
void showMenu() {
    std::cout << "综合管理系统菜单:" << std::endl;
    std::cout << "1. 可逆素数" << std::endl;
    std::cout << "2. 计算数字总和" << std::endl;
    std::cout << "3. 各位数字之和排序" << std::endl;
    std::cout << "4. 字符串中的最大整数" << std::endl;
    std::cout << "5. 字符串解压" << std::endl;
    std::cout << "6. 输出指定图形" << std::endl;
    std::cout << "7. 计算学生信息操作之最高分" << std::endl;
    std::cout << "8. 字符串反转" << std::endl;
    std::cout << "0. 退出" << std::endl;
    std::cout << "请输入你的选择:";
}

int main() {
    int choice;
    do {
        showMenu();
        std::cin >> choice;
        switch (choice) {
            case 1:
                reversiblePrimes();
                break;
            case 2:
                sumOfDigits();
                break;
            case 3:
                sortByDigitSum();
                break;
            case 4:
                maxIntegerInString();
                break;
            case 5:
                decompressString();
                break;
            case 6:
                printTriangle();
                break;
            case 7:
                highestScoreStudent();
                break;
            case 8:
                reverseString();
                break;
            case 0:
                std::cout << "退出系统。" << std::endl;
                break;
            default:
                std::cout << "无效的选择,请重新输入。" << std::endl;
        }
    } while (choice != 0);
    return 0;
}

你可能感兴趣的:(C++教程,c++,算法,学习,开发语言)