在 C++ 编程学习过程中,将所学知识应用到实际项目里是提升编程能力的有效途径。今天,我们就来构建一个综合管理系统,这个系统集成了多个实用功能模块,能帮助我们解决不同类别的问题。通过这个项目,我们不仅能巩固 C++ 的基础语法,还能学习如何进行系统设计与功能整合。
这个综合管理系统包含以下几个主要功能模块:
// 判断一个数是否为素数
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;
}