C语言程序设计之小系统

发布于:2025-02-10 ⋅ 阅读:(101) ⋅ 点赞:(0)


🌟 嗨,我是LucianaiB

🌍 总有人间一两风,填我十万八千梦。

🚀 路漫漫其修远兮,吾将上下而求索。


目录

  1. 系统说明
    1.1 系统概述
    1.2 功能模块
  2. 总体设计
  3. 详细设计
    3.1 程序中使用的函数
    3.2各类问题的详细设计
    3.3.1可逆素数
    3.3.2计算数字总和
    3.3.3各位数字之和排序
    3.3.4字符串中的最大整数
    3.3.5字符串解压
    3.3.6输出指定图形
    3.3.7计算学生信息操作之最高分
    3.3.8字符串反转
  4. 系统测试
    4.1 菜单显示
    4.2计算数字总和
    4.3 各位数字之和排序
    4.4字符串中的最大整数
    4.5字符串解压
    4.6输出指定图形
    4.7计算学生信息操作之最高分
    4.8字符串反转
  5. 总结
  6. 附录

1系统说明

1.1系统概述

本系统是一个综合管理系统,旨在将本学期学习的各类小程序整合在一起,提供一个用户友好的界面,方便用户选择并解决不同类别的问题。系统通过菜单展示可用的功能,用户可以根据自己的需求选择相应的类别,系统将显示具体的问题内容并提供解答。

1.2功能模块

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

2总体设计

本系统有以下8个功能模块,其调用关系如下:

在这里插入图片描述

旨在提供一个综合管理平台,方便用户选择并解决不同类别的问题。各模块之间的调用关系如下:

  1. 可逆素数模块:该模块负责计算指定区间内的可逆素数的个数。用户输入两个正整数作为区间的起始值和结束值,系统将遍历该区间内的所有整数,判断其是否为素数,并检查其反转数是否也是素数。此模块的输出为可逆素数的数量。
  2. 计算数字总和模块:此模块用于计算给定非负整数N的所有数字的总和,并以英语单词形式输出每个数字。用户输入一个非负整数,系统将逐位提取数字并累加,最后将结果转换为英文形式输出。
  3. 各位数字之和排序模块:该模块根据各位数字之和对输入的正整数进行排序。用户输入一组正整数,系统将计算每个数字的各位数字之和,并根据该和进行排序,最终输出排序后的结果。
  4. 字符串中的最大整数模块:此模块从用户输入的字符串中找出最大的正整数。用户输入一个字符串,系统将遍历字符串,提取其中的数字并找出最大值,若没有数字则输出“none”。
  5. 字符串解压模块:该模块负责将压缩后的字符串解压为原始字符串。用户输入一个压缩格式的字符串,系统将解析该字符串并输出解压后的结果。
  6. 输出指定图形模块:此模块根据用户输入的行数输出一个直角三角形。用户输入一个正整数n,系统将根据该值输出n行的直角三角形,形成特定的图形结构。
  7. 计算学生信息操作之最高分模块:该模块用于计算每个学生的总分,并输出总分最高的学生的信息。用户输入学生人数及每个学生的学号、姓名和三门课程成绩,系统将计算每个学生的总分并找出最高分的学生。
  8. 字符串反转模块:此模块负责将输入的字符串进行反转。用户输入一个字符串,系统将输出该字符串的反转结果。

3详细设计

3.1程序中使用的函数

主函数: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()

3.2 各类问题的详细设计

3.2.1 可逆素数

算法
1.初始化:
创建一个计数器 count,用于记录可逆素数的个数。
输入两个正整数 start 和 end,表示要检查的区间。
2.遍历区间:
对于每个整数 i 从 start 到 end:
检查 i 是否为素数。
如果 i 是素数,计算其反转数 reversedNum。
检查 reversedNum 是否为素数。
如果 reversedNum 也是素数,则:
增加 count。
3.输出结果:
输出可逆素数的数量。
流程图

在这里插入图片描述

3.2.2计算数字总和

算法
1.初始化:
创建一个变量 sum,用于记录数字的总和,初始值为 0。
输入一个非负整数 N。
2.遍历数字的每一位:
将 N 转换为字符串,以便逐位访问。
对于字符串中的每个字符 digit:
如果 digit 是数字,将其转换为整数并加到 sum 上。
3.输出结果:
输出 sum 的值。
流程图

在这里插入图片描述

3.2.3各位数字之和排序

算法
1.输入数据:
输入一个整数 n,表示要排序的数字个数。
输入 n 个正整数,存储在数组 arr 中。
2.计算各位数字之和:
创建一个数组 digitSums,用于存储每个数字的各位数字之和。
对于数组中的每个数字 num:
计算 num 的各位数字之和,并将结果存储在 digitSums 中。
3.排序:
使用选择排序法或其他排序算法,根据 digitSums 对 arr 进行排序。
4.输出结果:
输出排序后的数组 arr。
流程图
在这里插入图片描述

3.2.4字符串中的最大整数

算法
1.初始化:
创建一个变量 maxNum,用于记录最大整数,初始值为 -1。
创建一个变量 currentNum,用于记录当前数字的字符串。
2.输入字符串:
输入一个字符串,直到遇到特定的结束符(例如 #)。
3.遍历字符串:
对字符串中的每个字符进行遍历:
如果字符是数字,将其添加到 currentNum。
如果字符不是数字且 currentNum 不为空:
将 currentNum 转换为整数,更新 maxNum(如果 currentNum 大于 maxNum)。
清空 currentNum。
4.处理最后一个数字:
如果 currentNum 不为空,进行最后一次检查并更新 maxNum。
5.输出结果:
如果 maxNum 仍为 -1,输出 “none”;否则输出 maxNum。
流程图
在这里插入图片描述

3.2.5字符串解压

算法
1.初始化:
创建一个空字符串 result,用于存储解压后的结果。创建一个变量 i,用于遍历输入字符串。
2.输入字符串:
输入一个压缩格式的字符串,格式为 number[string],表示 string 重复 number 次。
3.遍历字符串:
对字符串中的每个字符进行遍历:
如果字符是数字,解析出完整的数字 count。
如果字符是左括号 [,记录当前的 result 和 count,并开始新的子字符串。
如果字符是右括号 ],将当前子字符串重复 count 次并添加到 result 中。
如果字符是字母,将其添加到当前的子字符串中。
流程图

在这里插入图片描述

3.2.6输出指定图形

算法
1.输入参数:
输入一个整数 n,表示图形的边长。
2.绘制图形:
使用嵌套循环:
外层循环控制行数,从 1 到 n。
内层循环控制列数,从 1 到 n。
在每一行中输出 *,形成正方形的边。
3.输出结果:
输出绘制的图形。
流程图

在这里插入图片描述

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

算法
1.初始化:
创建一个变量 maxScore,用于记录最高分,初始值为 -1。
创建一个变量 n,表示学生人数。
2.输入学生人数:
输入一个整数 n,表示学生的数量。
3.输入学生分数:
使用循环遍历每个学生:
输入每个学生的分数 score。
如果 score 大于 maxScore,则更新 maxScore。
4.输出结果:
输出最高分 maxScore。
流程图
在这里插入图片描述

3.2.8字符串反转

算法
1.初始化:
创建一个空字符串 reversedString,用于存储反转后的结果。
获取输入字符串的长度 n。
2.遍历字符串:
从字符串的最后一个字符开始,逐个向前遍历到第一个字符。
在每次遍历中,将当前字符添加到 reversedString。
3.输出结果:
输出反转后的字符串 reversedString。
流程图
在这里插入图片描述

4系统测试

4.1菜单显示

在这里插入图片描述

以上是菜单功能的介绍,您可以根据需要选择相应的功能

4.2计算数字总和在这里插入图片描述

成功在范围 1001 到 9999 内,可逆素数的数量为 204。

4.3各位数字之和排序

在这里插入图片描述

数字总和:9 数字总和的英文表示:nine 计算成功。

4.4. 字符串中的最大整数

在这里插入图片描述

• 123 的各位数字之和为 1 + 2 + 3 = 6
• 423 的各位数字之和为 4 + 2 + 3 = 9
• 485 的各位数字之和为 4 + 8 + 5 = 17
根据各位数字之和进行排序,结果为: 排序后的数字: 123 423 485

4.5字符串解压

在这里插入图片描述

选择了“字符串解压”功能,并成功输入了压缩字符串 3a5bx。

4.6输出指定图形

在这里插入图片描述

• 第一行输出 1
• 第二行输出 2 和 4
• 第三行输出 3、6 和 9
成功符合要求。

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

在这里插入图片描述

  1. 计算每个学生的总分:
    • Zhangling: 89 + 78 + 95 = 262
    • Wangli: 85 + 87 + 99 = 271
    • Fangfang: 85 + 68 + 76 = 229
  2. 找出最高分:
    • 最高分为 271,对应的学生为 Wangli。
    并且成功输出。

4.8字符串反转在这里插入图片描述

选择了“字符串反转”功能,并输入了要反转的字符串 fasdfasdfsadfsdaf。

5 总 结

在进行课程设计的过程中,我深刻体会到系统思维的重要性。设计一个完整的系统不仅仅是编写代码,更是对需求分析、用户体验和功能实现的全面考虑。在项目初期,我花费了大量时间进行需求调研,确保系统能够满足用户的实际需求。
在开发过程中,遇到了一些技术难题,比如数据结构的选择和算法的优化。这让我意识到,扎实的基础知识是解决问题的关键。同时,团队协作也至关重要,及时的沟通和反馈能够有效提高工作效率。
通过这次课程设计,我学会了如何将理论知识应用于实践,积累了宝贵的项目经验。未来,我会更加注重项目管理和时间规划,以提高整体开发效率。总之,这次经历让我对软件开发有了更深刻的理解,也为我今后的学习和工作打下了良好的基础。

附录:

 #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;
}

嗨,我是LucianaiB。如果你觉得我的分享有价值,不妨通过以下方式表达你的支持:👍 点赞来表达你的喜爱,📁 关注以获取我的最新消息,💬 评论与我交流你的见解。我会继续努力,为你带来更多精彩和实用的内容。

点击这里👉LucianaiB ,获取最新动态,⚡️ 让信息传递更加迅速。


网站公告

今日签到

点亮在社区的每一天
去签到