【C++】P5733 【深基6.例1】自动修正


在这里插入图片描述

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳]
本文专栏: C++

文章目录

  • 💯前言
  • 💯题目描述
  • 💯解题思路概述
  • 💯第一种实现方式:直接使用字符ASCII值计算
    • 代码实现
    • 代码分析
  • 💯第二种实现方式:直接修改字符数组
    • 代码实现
    • 代码分析
    • 特殊问题解答:为什么需要显式转换?
  • 💯第三种实现方式:使用标准库函数 islower 和 toupper
    • 代码实现
    • 代码分析
  • 💯附加介绍:islower 和 toupper 的作用
    • 函数原型
    • 函数功能
  • 💯对比与总结
  • 💯优化与扩展
  • 💯小结


在这里插入图片描述


💯前言

  • 字符处理是C++编程中的重要基础能力,尤其是在解题过程中,熟练掌握字符数组、条件判断、循环、以及标准库函数的使用,不仅可以提高代码的简洁性,还能优化运行效率。本次讨论围绕一道简单但颇具代表性的编程题展开,旨在将输入字符串中所有小写字母转为大写字母,并结合多种实现方式进行详细分析,包括代码思路、优缺点对比、扩展优化,最终带领读者全面掌握相关知识点。
    C++ 参考手册
    在这里插入图片描述

💯题目描述

P5733 【深基6.例1】自动修正
在这里插入图片描述

题目编号:P5733 [深基6.例1] 自动修正

题目要求如下:

题目描述:

大家都知道一些办公软件有自动将字母转换为大写的功能。输入一个长度不超过100且不包括空格的字符串,要求将该字符串中的所有小写字母变成大写字母并输出。

输入格式:

输入一行,一个字符串。

输出格式:

输出一个字符串,即将原字符串中的所有小写字母转化为大写字母。

输入输出样例:

输入:Luogu4!

输出:LUOGU4!


💯解题思路概述

这道题的核心在于:

  1. 遍历字符串中的每个字符。
  2. 判断字符是否为小写字母。
  3. 如果是小写字母,将其转换为对应的大写字母。
  4. 输出处理后的字符串。

根据题目要求,输入字符串只含字母、数字及标点符号,并且不包含空格,长度不超过100。这样的限制使得问题更为简单,减少了复杂边界条件的处理。

以下分别从代码实现与优化的角度,对几种不同的实现方案展开详细分析。


💯第一种实现方式:直接使用字符ASCII值计算

代码实现

以下是用户提供的解决方案:

#include <iostream>
#include <cstring>
using namespace std;char arr[105];int main()
{cin >> arr; // 输入字符串int len = strlen(arr); // 获取字符串长度for(int i = 0; i < len; i++) // 遍历字符串{if(arr[i] > 96 && arr[i] < 123) // 如果是小写字母{cout << char(arr[i] - 32); // 转换为大写字母并输出}else{cout << arr[i]; // 输出原字符}}return 0;
}

在这里插入图片描述

代码分析

  1. 核心逻辑:

    • 判断一个字符是否是小写字母:
      • ASCII 值范围 'a' (97) 到 'z' (122)。
      • 条件 arr[i] > 96 && arr[i] < 123 用于确认当前字符是否为小写字母。
    • 将小写字母转换为大写字母:
      • 大写字母与对应小写字母的 ASCII 值相差 32。
      • 用表达式 arr[i] - 32 实现从小写到大写的转换。
    • 非小写字母直接原样输出。
  2. 优点:

    • 代码简单直观,容易理解。
    • 不需要额外引入库,直接使用 ASCII 值处理。
  3. 缺点:

    • 操作依赖于 ASCII 编码,不够通用。
    • 无法直接修改原字符数组,而是通过 cout 逐字符输出,若需修改原字符串则需额外操作。

💯第二种实现方式:直接修改字符数组

代码实现

以下是老师提供的第一种代码实现:

#include <iostream>
using namespace std;const int N = 110;
char s[N];int main()
{cin >> s; // 输入字符串for(int i = 0; s[i] != '\0'; i++) // 遍历字符串,直到结束符{if(s[i] >= 'a' && s[i] <= 'z') // 如果是小写字母{s[i] -= 32; // 转换为大写字母}}cout << s << endl; // 输出最终处理后的字符串return 0;
}

在这里插入图片描述

代码分析

  1. 核心逻辑:

    • 在字符数组 s 上直接操作,通过 s[i] -= 32 修改原字符。
    • 循环条件 s[i] != '\0' 确保遍历至字符串结束符。
  2. 优点:

    • 直接修改原字符数组,内存使用高效。
    • 输出时无需逐字符处理,代码更简洁。
  3. 缺点:

    • 同样依赖于 ASCII 编码,缺乏通用性。
    • 处理 Unicode 或其他编码格式的字符集可能出现问题。

特殊问题解答:为什么需要显式转换?

在用户代码中,

cout << char(arr[i] - 32);

需要显式加上 char,否则会输出数字而不是字符。而在老师代码中,

s[i] -= 32;

不需要显式转换,直接可以输出字符。原因如下:

  1. 用户代码:

    • 表达式 arr[i] - 32 的计算结果是 int 类型(因为 C++ 中字符在参与算术运算时会隐式转换为整数)。
    • 如果直接 cout << arr[i] - 32;,输出的是整数值(对应字符的大写字母的 ASCII 值)。
    • 显式加 char 是为了告诉 cout 按字符输出。
  2. 老师代码:

    • s[i] -= 32; 是直接修改字符数组的内容。
    • 修改后 s[i] 的类型仍然是 char,所以输出时自动按字符处理,无需显式转换。

总结:用户代码在临时表达式的结果上操作,而老师代码直接操作数组变量。


💯第三种实现方式:使用标准库函数 islower 和 toupper

代码实现

以下是老师提供的第二种优化方案:

#include <iostream>
#include <cctype> // 包含 islower 和 toupper
using namespace std;const int N = 110;
char s[N];int main()
{cin >> s; // 输入字符串for(int i = 0; s[i] != '\0'; i++) // 遍历字符串,直到结束符{if(islower(s[i])) // 如果是小写字母{s[i] = toupper(s[i]); // 转换为大写字母}}cout << s << endl; // 输出最终处理后的字符串return 0;
}

在这里插入图片描述

代码分析

  1. 核心逻辑:

    • 使用 islower(s[i]) 判断字符是否为小写字母:
      • islower 是 C++ 标准库函数,返回非零值表示为小写字母。
    • 使用 toupper(s[i]) 将字符转换为大写字母。
  2. 优点:

    • 简化了字符判断与转换逻辑,代码更简洁。
    • 与 ASCII 无关,通用性更强,可适配其他字符集。
  3. 缺点:

    • 需要引入 <cctype> 头文件。

💯附加介绍:islower 和 toupper 的作用

C++ 提供了一些方便的标准库函数来处理字符判断和转换,其中常用的两个是 islowertoupper,它们位于头文件 <cctype> 中。

函数原型

int islower(int c); // 判断字符是否是小写字母
int toupper(int c); // 将字符转换为大写字母

函数功能

  1. islower

    • 用于判断字符是否为小写字母。

    • 如果参数 c 是小写字母,函数返回非零值(通常是1)。

    • 如果参数 c 不是小写字母,函数返回0。

    • 示例:

      char ch = 'a';
      cout << islower(ch) << endl; // 输出 1ch = 'A';
      cout << islower(ch) << endl; // 输出 0
      
  2. toupper

    • 用于将字符转换为对应的大写字母。

    • 如果参数 c 是小写字母,返回对应的大写字母。

    • 如果参数 c 本身不是小写字母,则返回参数本身。

    • 示例:

      char ch = 'a';
      cout << toupper(ch) << endl; // 输出 'A'ch = 'A';
      cout << toupper(ch) << endl; // 输出 'A'
      

通过使用这两个函数,可以显著简化字符处理逻辑,并增强代码的可读性和通用性。


💯对比与总结

实现方式优点缺点
ASCII 直接操作简单直观,不依赖库不够通用,依赖编码格式
修改字符数组高效,简化输出逻辑同样依赖 ASCII,编码适配性较差
使用 islower 和 toupper通用性强,逻辑简洁需要引入额外头文件,依赖标准库

💯优化与扩展

  1. 支持空格的输入:
    现有代码使用 cin 读取字符串,无法处理包含空格的输入。可以改用 getline 实现:

    string s;
    getline(cin, s);
    for (int i = 0; i < s.length(); i++)
    {if (islower(s[i])){s[i] = toupper(s[i]);}
    }
    cout << s << endl;
    
  2. 处理 Unicode 字符:
    对于支持多语言字符集的需求,可使用 ICU 库或 C++20 提供的 Unicode 字符处理功能。具体实现较复杂,读者可根据需要深入研究。

  3. 性能优化:

    • 当前实现已经是 O(n) 的复杂度,已较为高效。
    • 可结合多线程技术对超大字符串的处理进行并行优化。

💯小结

本次讨论从多个角度全面分析了一道 C++ 基础字符处理题目,并结合用户与老师的不同代码实现,详细阐述了思路、优缺点与优化空间。通过这道题目,我们不仅巩固了字符数组、ASCII 处理、以及 C++ 标准库函数的使用,还进一步拓展了编码适配性与输入灵活性等实战技能。希望读者通过本次学习,能够更加熟练地应对类似的编程挑战!


在这里插入图片描述


在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/502958.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Elasticsearch】文档操作:添加、更新和删除

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

【insert 插入数据语法合集】.NET开源ORM框架 SqlSugar 系列

系列文章目录 &#x1f380;&#x1f380;&#x1f380; .NET开源 ORM 框架 SqlSugar 系列 &#x1f380;&#x1f380;&#x1f380; 文章目录 系列文章目录一、前言 &#x1f343;二、插入方式 &#x1f4af;2.1 单条插入实体2.2 批量 插入实体2.3 根据字典插入2.4 根据 Dat…

权限掩码umask

1 、 设置新建文件或目录的默认权限 在 Linux 系统中&#xff0c;当用户创建一个新的文件或目录时&#xff0c;系统都会为新建的文件或目录分配默认的权限&#xff0c;该默认权限与umask 值有关&#xff0c;其具体关系是&#xff1a; 新建文件的默认权限 0666-umask 值 新建…

202-01-06 Unity 使用 Tip1 —— UnityHub 模块卸载重装

文章目录 1 卸载模块2 更新配置文件3 重启 UnityHub 起因&#xff1a; ​ WebGL 平台打包程序报错&#xff0c;懒得修复了&#xff0c;因此粗暴地删了重装。但是 UnityHub 不支持卸载模块&#xff0c;因此手动配置。 1 卸载模块 ​ 以 Unity 6000.0.26f1c1 为例&#xff0c;其…

打造三甲医院人工智能矩阵新引擎(二):医学影像大模型篇--“火眼金睛”TransUNet

一、引言 1.1 研究背景与意义 在现代医疗领域,医学影像作为疾病诊断与治疗的关键依据,发挥着不可替代的作用。从传统的X射线、CT(计算机断层扫描)到MRI(磁共振成像)等先进技术,医学影像能够直观呈现人体内部结构,为医生提供丰富的诊断信息,涵盖疾病识别、病灶定位、…

国产编辑器EverEdit - 两种删除空白行的方法

1 使用技巧&#xff1a;删除空白行 1.1 应用场景 用户在编辑文档时&#xff0c;可能会遇到很多空白行需要删除的情况&#xff0c;比如从网页上拷贝文字&#xff0c;可能就会存在大量的空白行要删除。 1.2 使用方法 1.2.1 方法1&#xff1a; 使用编辑主菜单 选择主菜单编辑 …

李宏毅机器学习笔记-Transformer

目录 1. Seq2seq 2. encoder Transformer 中的 Block 结构 3. Decoder 4.Encoder和Decoder间的信息传递 5.Training 6.Tips 1. Seq2seq Transformer 是一个seq2seq的model。Seq2seq指的是input是一个序列&#xff0c;输出也是一个序列&#xff0c;输出的长度是由机器自己…

GitLab集成Runner详细版--及注意事项汇总【最佳实践】

一、背景 看到网上很多用户提出的runner问题其实实际都不是问题&#xff0c;不过是因为对runner的一些细节不清楚导致了误解。本文不系统性的介绍GitLab-Runner&#xff0c;因为这类文章写得好的特别多&#xff0c;本文只汇总一些常几的问题/注意事项。旨在让新手少弯路。 二、…

指针 const 的组合

1、首先来了解一下常量 const int num 5&#xff1b; 那么num的值是5&#xff0c; num的值不可修改 2、来了解一下指针 int value 5; int* p &value; 我喜欢吧指针和类型放一起&#xff0c;来强调p是一个指针类型&#xff0c; 而赋值的时候就得赋值一个int类型的地址…

《C++11》各种初始化方式的详细列举与对比

在 C 中&#xff0c;初始化对象的方式多种多样。随着 C 标准的演进&#xff0c;特别是 C11 的引入&#xff0c;初始化方式得到了显著的扩展和改进。本文将详细列举 C 中的各种初始化方式&#xff0c;并对它们进行对比&#xff0c;帮助开发者更好地理解和应用这些特性。 1. C98…

前端小案例——520表白信封

前言&#xff1a;我们在学习完了HTML和CSS之后&#xff0c;就会想着使用这两个东西去做一些小案例&#xff0c;不过又没有什么好的案例让我们去练手&#xff0c;本篇文章就提供里一个案例——520表白信封 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主…

【Vim Masterclass 笔记05】第 4 章:Vim 的帮助系统与同步练习(L14+L15+L16)

文章目录 Section 4&#xff1a;The Vim Help System&#xff08;Vim 帮助系统&#xff09;S04L14 Getting Help1 打开帮助系统2 退出帮助系统3 查看具体命令的帮助文档4 查看帮助文档中的主题5 帮助文档间的上翻、下翻6 关于 linewise7 查看光标所在术语名词的帮助文档8 关于退…

10-C语言项目池

C语言项目池 《个人通讯录》 《火车订票系统》 管理员用户1录入火车票信息区间查询/购票2显示火车票信息打印购票信息3查询火车票信息退票4修改火车票信息5添加火车票信息 《学生学籍管理系统》 1录入学生信息2添加学生信息3显示学生信息4查找学生信息5删除学生信息6修改学…

Android 绘制学习总结

1、刷新率介绍 我们先来理一下基本的概念&#xff1a; 1、60 fps 的意思是说&#xff0c;画面每秒更新 60 次 2、这 60 次更新&#xff0c;是要均匀更新的&#xff0c;不是说一会快&#xff0c;一会慢&#xff0c;那样视觉上也会觉得不流畅 3、每秒 60 次&#xff0c;也就是 1…

每日一题:BM1 反转链表

文章目录 [toc]问题描述数据范围示例 C代码实现使用栈实现&#xff08;不符合要求&#xff0c;仅作为思路&#xff09; 解题思路 - 原地反转链表步骤 C语言代码实现 以前只用过C刷过代码题目&#xff0c;现在试着用C语言刷下 问题描述 给定一个单链表的头结点 pHead&#xff…

78、使用爱芯派2_AX630C开发板 3.2T高有效算力 低功耗 支持AI-ISP真黑光实验

基本思想:使用爱心元智最新的版本开发板进行实验 AX630C、AX620Q 都是 620E 这一代 一、参考这个官方教程,先把代码在本地交叉编译完成 https://github.com/AXERA-TECH/ax620e_bsp_sdk 然后在拷贝到620c设备上 root@ax630c:~/ax620e_bsp_sdk/msp/out/arm64_glibc/bin# ./…

【Redis经典面试题七】Redis的事务机制是怎样的?

目录 一、Redis的事务机制 二、什么是Redis的Pipeline&#xff1f;和事务有什么区别&#xff1f; 三、Redis的事务和Lua之间有哪些区别&#xff1f; 3.1 原子性保证 3.2 交互次数 3.3 前后依赖 3.4 流程编排 四、为什么Lua脚本可以保证原子性&#xff1f; 五、为什么R…

企业网络性能监控

什么是网络性能监控 网络性能监控&#xff08;NPM&#xff09;是指对计算机网络的性能进行持续测量、分析和管理的过程&#xff0c;通过监控流量、延迟、数据包丢失、带宽利用率和正常运行时间等关键指标&#xff0c;确保网络高效、安全地运行&#xff0c;并将停机时间降至最低…

【开源】创建自动签到系统—QD框架

1. 介绍 QD是一个 基于 HAR 编辑器和 Tornado 服务端的 HTTP 定时任务自动执行 Web 框架。 主要通过抓包获取到HAR来制作任务模板&#xff0c;从而实现异步响应和发起HTTP请求 2. 需要环境 2.1 硬件需求 CPU&#xff1a;至少1核 内存&#xff1a;推荐 ≥ 1G 硬盘&#xff1a;推…

SUB输入5V升压充电16.8V芯片HU5912

HU5912芯片&#xff0c;作为航誉微电子有限公司推出的一款高性能升压充电管理IC&#xff0c;自其面世以来&#xff0c;便以其出色的性能和广泛的应用领域&#xff0c;受到了业界的高度关注和赞誉。本文将详细介绍HU5912芯片的技术特点、应用优势、市场定位以及其在各类电子设备…