本系统是一个综合管理系统,旨在将本学期学习的各类小程序整合在一起,提供一个用户友好的界面,方便用户选择并解决不同类别的问题。系统通过菜单展示可用的功能,用户可以根据自己的需求选择相应的类别,系统将显示具体的问题内容并提供解答。
系统主要包括以下功能模块: 可逆素数: 功能:计算指定区间内的可逆素数的个数。 输入:用户输入两个正整数,表示区间的起始值和结束值。 输出:显示该区间内可逆素数的数量。 计算数字总和: 功能:计算给定非负整数N的所有数字的总和,并以英语输出每个数字。 输入:用户输入一个非负整数。 输出:以英语单词形式输出数字总和的每个数字。 各位数字之和排序: 功能:根据各位数字之和对输入的正整数进行排序。 输入:用户输入一组正整数。 输出:显示排序后的结果。 字符串中的最大整数: 功能:从输入的字符串中找出最大的正整数。 输入:用户输入一个字符串,以#结束。 输出:显示字符串中包含的最大正整数,若没有则输出“none”。 字符串解压: 功能:将压缩后的字符串解压为原始字符串。 输入:用户输入压缩后的字符串。 输出:显示解压后的字符串。 输出指定图形: 功能:根据用户输入的行数输出一个直角三角形。 输入:用户输入一个正整数n。 输出:显示按规律变化的n行直角三角形。 计算学生信息操作之最高分: 功能:计算每个学生的总分,并输出总分最高的学生的信息。 输入:用户输入学生人数及每个学生的学号、姓名和三门课程成绩。 输出:显示总分最高的学生的详细信息。 字符串反转: 功能:将输入的字符串进行反转。 输入:用户输入一个字符串。
本系统有以下8个功能模块,其调用关系如下:
旨在提供一个综合管理平台,方便用户选择并解决不同类别的问题。各模块之间的调用关系如下:
主函数:void main() 菜单函数:int displayMenu() 可逆素数函数:int reversiblePrimeCount(int start, int end) 数字求和函数:int sumOfDigits(const string& number) 各位数字之和排序函数:void sortByDigitSum() 最大整数查找函数:long long findMaxInteger(const string& input) 字符串解压函数:string decompressString(const string& compressed) 图形输出函数:void outputTriangle(int n) 最高分学生信息函数:void highestScoreStudent()
算法 1.初始化: 创建一个计数器 count,用于记录可逆素数的个数。 输入两个正整数 start 和 end,表示要检查的区间。 2.遍历区间: 对于每个整数 i 从 start 到 end: 检查 i 是否为素数。 如果 i 是素数,计算其反转数 reversedNum。 检查 reversedNum 是否为素数。 如果 reversedNum 也是素数,则: 增加 count。 3.输出结果: 输出可逆素数的数量。 流程图
算法 1.初始化: 创建一个变量 sum,用于记录数字的总和,初始值为 0。 输入一个非负整数 N。 2.遍历数字的每一位: 将 N 转换为字符串,以便逐位访问。 对于字符串中的每个字符 digit: 如果 digit 是数字,将其转换为整数并加到 sum 上。 3.输出结果: 输出 sum 的值。 流程图
算法 1.输入数据: 输入一个整数 n,表示要排序的数字个数。 输入 n 个正整数,存储在数组 arr 中。 2.计算各位数字之和: 创建一个数组 digitSums,用于存储每个数字的各位数字之和。 对于数组中的每个数字 num: 计算 num 的各位数字之和,并将结果存储在 digitSums 中。 3.排序: 使用选择排序法或其他排序算法,根据 digitSums 对 arr 进行排序。 4.输出结果: 输出排序后的数组 arr。 流程图
算法 1.初始化: 创建一个变量 maxNum,用于记录最大整数,初始值为 -1。 创建一个变量 currentNum,用于记录当前数字的字符串。 2.输入字符串: 输入一个字符串,直到遇到特定的结束符(例如 #)。 3.遍历字符串: 对字符串中的每个字符进行遍历: 如果字符是数字,将其添加到 currentNum。 如果字符不是数字且 currentNum 不为空: 将 currentNum 转换为整数,更新 maxNum(如果 currentNum 大于 maxNum)。 清空 currentNum。 4.处理最后一个数字: 如果 currentNum 不为空,进行最后一次检查并更新 maxNum。 5.输出结果: 如果 maxNum 仍为 -1,输出 “none”;否则输出 maxNum。 流程图
算法 1.初始化: 创建一个空字符串 result,用于存储解压后的结果。创建一个变量 i,用于遍历输入字符串。 2.输入字符串: 输入一个压缩格式的字符串,格式为 number[string],表示 string 重复 number 次。 3.遍历字符串: 对字符串中的每个字符进行遍历: 如果字符是数字,解析出完整的数字 count。 如果字符是左括号 [,记录当前的 result 和 count,并开始新的子字符串。 如果字符是右括号 ],将当前子字符串重复 count 次并添加到 result 中。 如果字符是字母,将其添加到当前的子字符串中。 流程图
算法 1.输入参数: 输入一个整数 n,表示图形的边长。 2.绘制图形: 使用嵌套循环: 外层循环控制行数,从 1 到 n。 内层循环控制列数,从 1 到 n。 在每一行中输出 *,形成正方形的边。 3.输出结果: 输出绘制的图形。 流程图
算法 1.初始化: 创建一个变量 maxScore,用于记录最高分,初始值为 -1。 创建一个变量 n,表示学生人数。 2.输入学生人数: 输入一个整数 n,表示学生的数量。 3.输入学生分数: 使用循环遍历每个学生: 输入每个学生的分数 score。 如果 score 大于 maxScore,则更新 maxScore。 4.输出结果: 输出最高分 maxScore。 流程图
算法 1.初始化: 创建一个空字符串 reversedString,用于存储反转后的结果。 获取输入字符串的长度 n。 2.遍历字符串: 从字符串的最后一个字符开始,逐个向前遍历到第一个字符。 在每次遍历中,将当前字符添加到 reversedString。 3.输出结果: 输出反转后的字符串 reversedString。 流程图
以上是菜单功能的介绍,您可以根据需要选择相应的功能
成功在范围 1001 到 9999 内,可逆素数的数量为 204。
数字总和:9 数字总和的英文表示:nine 计算成功。
• 123 的各位数字之和为 1 + 2 + 3 = 6 • 423 的各位数字之和为 4 + 2 + 3 = 9 • 485 的各位数字之和为 4 + 8 + 5 = 17 根据各位数字之和进行排序,结果为: 排序后的数字: 123 423 485
选择了“字符串解压”功能,并成功输入了压缩字符串 3a5bx。
• 第一行输出 1 • 第二行输出 2 和 4 • 第三行输出 3、6 和 9 成功符合要求。
选择了“字符串反转”功能,并输入了要反转的字符串 fasdfasdfsadfsdaf。
在进行课程设计的过程中,我深刻体会到系统思维的重要性。设计一个完整的系统不仅仅是编写代码,更是对需求分析、用户体验和功能实现的全面考虑。在项目初期,我花费了大量时间进行需求调研,确保系统能够满足用户的实际需求。 在开发过程中,遇到了一些技术难题,比如数据结构的选择和算法的优化。这让我意识到,扎实的基础知识是解决问题的关键。同时,团队协作也至关重要,及时的沟通和反馈能够有效提高工作效率。 通过这次课程设计,我学会了如何将理论知识应用于实践,积累了宝贵的项目经验。未来,我会更加注重项目管理和时间规划,以提高整体开发效率。总之,这次经历让我对软件开发有了更深刻的理解,也为我今后的学习和工作打下了良好的基础。
#include <stdio.h>
#include <math.h>
#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
#include <iomanip>
#include <sstream>
using namespace std;
// 学生信息结构体
struct student {
char xh[13]; // 学号
char name[21]; // 姓名
int a, b, c; // 三门课程成绩
} stu[100];
// 函数声明
int isPrime(int n);
int reverseNum(int n);
void fun1();
string digitToWord(int digit);
void fun2();
long long stringToLongLong(const string& str);
void fun4();
void fun5();
void fun6();
void fun7();
void fun8();
void fun3();
// 判断是否为素数
int isPrime(int n) {
if (n <= 1) return 0;
for (int i = 2; i <= sqrt(n); i++) {
if (n % i == 0) return 0;
}
return 1;
}
// 翻转数字
int reverseNum(int n) {
int reversed = 0;
while (n > 0) {
reversed = reversed * 10 + n % 10;
n /= 10;
}
return reversed;
}
// Fun1: 可逆素数
void fun1() {
int start, end;
printf("请输入范围的起始值和结束值(以空格分隔): ");
scanf("%d %d", &start, &end);
int count = 0;
for (int i = start; i <= end; i++) {
if (isPrime(i) && isPrime(reverseNum(i))) {
count++;
}
}
printf("可逆素数的数量: %d\n", count);
}
// Fun2: 计算数字总和
string digitToWord(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 "";
}
}
void fun2() {
string n;
printf("请输入一个数字串: ");
cin >> n;
long long sum = 0;
for (int i = 0; i < n.length(); i++) {
char c = n[i];
if (isdigit(c)) {
sum += c - '0';
}
}
stringstream ss;
ss << sum;
string sumStr = ss.str();
printf("数字总和的英文表示: ");
for (int i = 0; i < sumStr.length(); i++) {
cout << digitToWord(sumStr[i] - '0') << (i == sumStr.length() - 1 ? "" : " ");
}
cout << endl;
}
// 字符串转长整型辅助函数
long long stringToLongLong(const string& str) {
long long result = 0;
stringstream ss(str);
ss >> result;
return result;
}
// Fun3: 各位数字之和排序
void fun3() {
int sum[10], a[10];
int n, i, j, temp;
printf("请输入数字的个数(输入0结束): ");
while (~scanf("%d", &n) && n) {
for (i = 0; i < n; i++) {
sum[i] = 0;
}
printf("请输入数字: ");
for (i = 0; i < n; i++) {
scanf("%d", &a[i]);
temp = a[i];
for (j = 0;; j++) {
sum[i] += temp % 10;
temp = temp / 10;
if (temp == 0) break;
}
}
for (i = 0; i < n - 1; i++) {
for (j = i + 1; j < n; j++) {
if (sum[i] > sum[j]) {
temp = sum[i];
sum[i] = sum[j];
sum[j] = temp;
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
printf("排序后的数字: ");
for (i = 0; i < n; i++) {
if (i == 0)
printf("%d", a[i]);
else
printf(" %d", a[i]);
}
printf("\n");
printf("请输入数字的个数(输入0结束): ");
}
}
// Fun4: 字符串中的最大整数
void fun4() {
string s;
printf("请输入字符串(以#结束): ");
getline(cin, s, '#');
long long max_num = -1;
bool found = false;
string num;
for (int i = 0; i < s.length(); i++) {
char c = s[i];
if (isdigit(c)) {
num += c;
found = true;
} else {
if (!num.empty()) {
max_num = max(max_num, stringToLongLong(num));
num = "";
}
}
}
if (!num.empty()) {
max_num = max(max_num, stringToLongLong(num));
}
if (found) {
printf("字符串中的最大整数: %lld\n", max_num);
} else {
printf("none\n");
}
}
// Fun5: 字符串解压
void fun5() {
string compressed;
printf("请输入压缩字符串: ");
cin >> compressed;
string decompressed = "";
for (int i = 0; i < compressed.length(); i++) {
if (isdigit(compressed[i])) {
int count = 0;
while (i < compressed.length() && isdigit(compressed[i])) {
count = count * 10 + (compressed[i] - '0');
i++;
}
i--;
decompressed += string(count, compressed[++i]);
} else {
decompressed += compressed[i];
}
}
printf("解压后的字符串: %s\n", decompressed.c_str());
}
// Fun6: 输出指定图形
void fun6() {
int n;
printf("请输入图形的行数: ");
cin >> n;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
cout << setw(6) << left << i * j;
}
cout << endl;
}
}
// Fun7: 计算学生信息操作之最高分
void fun7() {
int n;
printf("请输入学生人数: ");
scanf("%d", &n); // 输入学生人数
int totalScores[100]; // 存储每个学生的总分
// 输入学生信息
printf("请输入每个学生的学号、姓名和三门课程成绩:\n");
for (int i = 0; i < n; i++) {
scanf("%s %s %d %d %d", stu[i].xh, stu[i].name, &stu[i].a, &stu[i].b, &stu[i].c);
}
// 计算每个学生的总分
for (int i = 0; i < n; i++) {
totalScores[i] = stu[i].a + stu[i].b + stu[i].c;
}
// 找到总分最高的学生
int maxScore = totalScores[0];
int topStudentIndex = 0;
for (int i = 1; i < n; i++) {
if (totalScores[i] > maxScore) {
maxScore = totalScores[i];
topStudentIndex = i;
}
}
// 输出总分最高的学生的信息
printf("总分最高的学生信息: %s %s %d %d %d\n", stu[topStudentIndex].xh, stu[topStudentIndex].name, stu[topStudentIndex].a, stu[topStudentIndex].b, stu[topStudentIndex].c);
}
// Fun8: 字符串反转
void fun8() {
string s;
printf("请输入要反转的字符串: ");
cin >> s; // 使用 cin 读取字符串
printf("原字符串: '%s' =>\n", s.c_str()); // 输出原字符串
// 反转字符串
int len = s.length();
int i, j;
char temp;
for (i = 0, j = len - 1; i < j; i++, j--) {
temp = s[i];
s[i] = s[j];
s[j] = temp;
}
printf("反转后的字符串: '%s'\n", s.c_str()); // 输出反转后的字符串
}
// 主函数,选择题目
int main() {
int choice;
while (true) {
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("请输入您的选择: ");
scanf("%d", &choice);
if (choice == 1) {
fun1();
} else if (choice == 2) {
fun2();
} else if (choice == 3) {
fun3();
} else if (choice == 4) {
fun4();
} else if (choice == 5) {
fun5();
} else if (choice == 6) {
fun6();
} else if (choice == 7) {
fun7();
} else if (choice == 8) {
fun8();
} else if (choice == 9) {
break;
} else {
printf("无效输入,请重新选择。\n");
}
}
return 0;
}