当前位置: 首页 > news >正文

C++ 练习1

  1. 阐述g++ 有哪些常用的选项,该选项有什么作用
选项作用
-o <file>指定输出文件名(默认生成 a.out
-c仅编译生成目标文件(.o 文件),不链接
-E只进行预处理,输出预处理后的代码(展开宏、包含头文件)
-S生成汇编代码(.s 文件)
选项作用
-g生成调试信息(支持 GDB 调试)
-ggdb生成更详细的 GDB 调试信息
-Wall开启所有常见警告(未初始化变量、未使用变量等)
-Wextra启用额外警告(如函数参数未使用)
-Werror将警告视为错误,强制修复所有警告
-pedantic严格遵循 ISO C++ 标准,拒绝非标准语法
  1. 试写一个函数,计算字符串 s中最大连续相同的字符个数。例如,若s 为"aaabbbb",则返回值为4;若s为"abcde",则返回 值为1。
#include <iostream>
using namesapce std;

int max_same_char(const char* s) {
    if (s == nullptr || *s == '\0') return 0;  // 处理空指针和空字符串[4,7](@ref)
    
    int max_count = 1, current = 1;            // 初始值设为1(至少有一个字符)
    for (int i = 1; s[i] != '\0'; ++i) {       // 从第二个字符开始遍历[6,9](@ref)
        if (s[i] == s[i-1]) {
            current++;
            max_count = (current > max_count) ? current : max_count; // 更新最大值[4,8](@ref)
        } else {
            current = 1;                       // 字符变化时重置计数器[9](@ref)
        }
    }
    return max_count;
}
  1. 编写多个同名函数,实现对指定字符数组中按索引添加元素,按指定字符前添加元素和批量添加元素
#include <iostream>
using namesapce std;
// 按索引插入单个字符
void array_insert(char* arr, int& size, int index, char ch) {
    if (index < 0 || index > size) return; // 索引越界检查[6](@ref)
    if (size + 1 >= sizeof(arr)/sizeof(arr[0])) return; // 容量检查[6](@ref)

    memmove(arr + index + 1, arr + index, size - index); // 移动元素[6,10](@ref)
    arr[index] = ch;
    size++;
    arr[size] = '\0'; // 维护字符串终止符
}

// 在指定字符前插入元素
bool array_insert(char* arr, int& size, char target, char ch) {
    for (int i = 0; i < size; ++i) {
        if (arr[i] == target) {
            array_insert(arr, size, i, ch); // 复用索引插入逻辑[2,6](@ref)
            return true;
        }
    }
    return false; // 未找到目标字符
}

// 批量添加元素
void array_insert(char* arr, int& size, const char* elements) {
    int add_len = strlen(elements);
    if (size + add_len >= sizeof(arr)/sizeof(arr[0])) return; // 容量检查[10](@ref)

    memcpy(arr + size, elements, add_len); // 批量复制[5,7](@ref)
    size += add_len;
    arr[size] = '\0'; // 维护字符串终止符
}

int main() {
    char buffer[50] = "Hello";
    int length = strlen(buffer);

    // 测试索引插入
    array_insert(buffer, length, 5, '!'); // 末尾插入
    cout << buffer << std::endl; // 输出: Hello!

    // 测试字符前插入
    array_insert(buffer, length, 'e', '3'); // 在第一个'e'前插入
    cout << buffer << std::endl; // 输出: H3ello!

    // 测试批量添加
    array_insert(buffer, length, "World");
    cout << buffer << std::endl; // 输出: H3ello!World

    return 0;
}
  1. 利用今天学习的函数模板,设计一个排序算法函数,实现对任意类型的数据实现排序

    #include <iostream>
    using namesapce std;
    // 自定义交换函数模板
    template <typename T>
    void custom_swap(T& a, T& b) {
        T temp = a;
        a = b;
        b = temp;
    }
    
    // 分区函数
    template <typename T>
    int partition(T arr[], int low, int high) {
        T pivot = arr[high];  // 基准值选择优化可参考文献[3,9](@ref)
        int i = low - 1;
    
        for (int j = low; j <= high - 1; ++j) {
            if (arr[j] < pivot) {
                ++i;
                custom_swap(arr[i], arr[j]);  // 手动交换元素
            }
        }
        custom_swap(arr[i + 1], arr[high]);
        return i + 1;
    }
    
    // 快速排序主函数
    template <typename T>
    void quick_sort(T arr[], int low, int high) {
        if (low < high) {
            int pi = partition(arr, low, high);
            quick_sort(arr, low, pi - 1);
            quick_sort(arr, pi + 1, high);
        }
    }
    
    int main() {
        int nums[] = {5, 2, 9, 1, 5};
        quick_sort(nums, 0, 4);  // 排序整型数组
    
        string strs[] = {"apple", "banana"};
        quick_sort(strs, 0, 1);  // 排序字符串数组
    
        return 0;
    }
    
  2. C++编写一个可以容纳任意数据类型的链表.。

#include <iostream>
#include <memory>

template <typename T>
class LinkedList {
private:
    struct Node {
        T data;
        std::unique_ptr<Node> next;
        Node(const T& val) : data(val), next(nullptr) {}
    };

    std::unique_ptr<Node> head;
    Node* tail;

public:
    LinkedList() : head(nullptr), tail(nullptr) {}

    // 添加元素到链表尾部
    void append(const T& value) {
        auto newNode = std::make_unique<Node>(value);
        if (!head) {
            head = std::move(newNode);
            tail = head.get();
        } else {
            tail->next = std::move(newNode);
            tail = tail->next.get();
        }
    }

    // 删除指定元素
    bool remove(const T& value) {
        Node* current = head.get();
        Node* prev = nullptr;

        while (current) {
            if (current->data == value) {
                if (prev) {
                    prev->next = std::move(current->next);
                    if (!prev->next) {
                        tail = prev;
                    }
                } else {
                    head = std::move(current->next);
                    if (!head) {
                        tail = nullptr;
                    }
                }
                return true;
            }
            prev = current;
            current = current->next.get();
        }
        return false;
    }

    // 遍历打印链表内容
    void print() const {
        Node* current = head.get();
        while (current) {
            cout << current->data;
            if (current->next) std::cout << " -> ";
            current = current->next.get();
        }
        cout << " -> nullptr" << std::endl;
    }
};

int main() {
    // 整型链表示例
    LinkedList<int> intList;
    intList.append(1);
    intList.append(2);
    intList.append(3);
    intList.print();  // 输出: 1 -> 2 -> 3 -> nullptr

    intList.remove(2);
    intList.print();  // 输出: 1 -> 3 -> nullptr

    // 字符串链表示例
    LinkedList<std::string> strList;
    strList.append("Hello");
    strList.append("World");
    strList.print();  // 输出: Hello -> World -> nullptr

    return 0;
}

相关文章:

  • 1.1部署es:9200
  • 峰值电流模式CCM BUCK的占空比D到电感电流的传递函数是怎么推导出来的
  • C++ 注释
  • KIMI K1.5:大规模强化学习在大语言模型中的应用与工程实践
  • HTTP 动态报错码的原因和解决方法
  • 【算法】793. 高精度乘法
  • 【Pandas】pandas Series add_suffix
  • DBeaver免费下载【2025最新版本】
  • DNS域名解析
  • Hadoop 常用命令汇总
  • 使用Python爬虫获取京东商品评论API接口的详细指南
  • 【Python专栏】Python 开发-pycharm安装
  • 《深度学习实战》第3集:循环神经网络(RNN)与序列建模
  • 五、AIGC大模型_04LLaMA-Factory基础知识与SFT实战
  • 期权帮|股指期货多单和空单有什么区别?
  • 常见排序算法以及实现
  • Linux网络数据包接收:原理、流程与优化策略
  • 前端项目配置 Nginx 全攻略
  • VisionPro-PMA工具
  • JNA基础使用,调用C++返回结构体
  • 下载的网站模板怎么使用/郑州百度分公司
  • wordpress 加速版/搜索引擎优化seo多少钱
  • 做视频网站了几百万/微信公众号营销
  • 来返苏州人员信息登记平台/aso榜单优化
  • 网站备案备案吗/网站流量统计软件
  • 网站建设前的分析/网站发稿平台