洛谷 P5733 【深基6.例1】自动修正

这篇博客介绍了一个简单的C++程序,用于读取输入的字符串并将其中的小写字母自动转换为大写字母。程序通过遍历字符串,判断每个字符是否为小写字母,并使用字符运算将小写字母转换为大写。这是一个基础的字符操作实例,适合初学者学习。

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

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

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

输入输出样例
输入 #1
Luogu4!

输出 #1
LUOGU4!

#include <iostream>

using namespace std;

int main(){
    string s;
    cin >> s;
    for(int i = 0;i < s.size();i ++){      //s.size()为获得字符串长度
    	if(s[i] <= 'z' && s[i] >= 'a'){   //判断是否为小写
    		cout << (char)(s[i] - 32);     //小写转大写
		}else{
			cout << s[i];        //若为大写则直接输出
		}
	}
	return 0;
}

<think>好的,我现在需要解决用户的问题,即编写P5733题“自动修正”的代码。首先,我得仔细理解题目要求。题目大意是将输入字符串中的所有小写字母转换成大写,其他字符保持不变。输出处理后的字符串。 接下来,我得考虑如何实现这个功能。用户可能刚接触编程,属于GESP三级水平,所以需要代码简洁易懂。C++是常用语言,所以用C++来写。 首先,读取输入字符串。使用getline(cin, s)可以读取整行,包括空格。但有时候可能因为输入缓冲区的问题,需要处理换行符。不过题目中的输入应该是一行字符串,直接读取即可。 然后遍历每个字符,判断是否是小写字母。如果是,转换为大写。转换方法可以用ASCII码操作,小写字母a-z对应97-122,大写A-Z对应65-90。因此,减去32即可。或者使用toupper函数,但考虑到教学目的,显式转换可能更直观。 循环处理每个字符,构建结果字符串。最后输出结果。 测试样如输入“Luogu3”,处理后应为“LUOGU3”。需要确保非字母字符不变,如数字和符号。 可能的错误点:忘记处理字符串中的非字母字符,或者大小写转换不正确。需要确保条件判断正确,只有小写字母才转换。 代码结构大致是: 1. 包含头文件,如iostream和string。 2. 使用命名空间std。 3. 主函数中读取字符串s。 4. 遍历每个字符,转换小写字母。 5. 输出结果。 然后,编写代码。如: #include <iostream> #include <string> using namespace std; int main() { string s; getline(cin, s); for (char &c : s) { if (c >= 'a' && c <= 'z') { c -= 32; } } cout << s; return 0; } 这样写的话,使用范围for循环,修改原字符串中的每个字符,简洁高效。检查条件是否正确,确保只有小写字母被转换。如,字符是否在'a'到'z'之间,如果是,就减去32得到大写字母。 另外,也可以使用标准库函数toupper,如: c = toupper(c); 但可能需要包含<cctype>头文件。两种方法都可以,但显式转换可能更适合初学者理解ASCII码的操作。 测试不同的输入情况,比如全小写、混合大小写、包含数字和符号,确保正确处理。如输入“Hello!123”应该输出“HELLO!123”。 用户可能需要代码的解释,所以回答时要详细说明每个部分的作用,比如getline读取整行,循环遍历字符,条件判断和转换,最后输出结果。这样用户能理解代码的逻辑和实现方式。</think>以下是题目 **P57336.1自动修正** 的C++代码实现,**功能是将输入字符串中的小写字母全部转为大写字母**: --- ```cpp #include <iostream> #include <string> using namespace std; int main() { string s; getline(cin, s); // 读取整行(包含空格) for (char &c : s) { // 遍历每个字符 if (c >= 'a' && c <= 'z') { // 判断是否是小写字母 c = c - 'a' + 'A'; // 转为大写(等价于 c -= 32) } } cout << s; // 输出处理后的字符串 return 0; } ``` --- ### **代码解析** 1. **读取输入** `getline(cin, s)` 可以读取包含空格的整行输入(如 `"hello world"`)。 2. **字符遍历与转换** - 使用范围循环 `for (char &c : s)` 遍历字符串的每个字符(`&` 表示直接修改原字符)。 - 小写字母的ASCII码范围是 `a(97)` 到 `z(122)`,大写字母是 `A(65)` 到 `Z(90)`。 - 转换公式:`c = c - 'a' + 'A'`(等价于 `c -= 32`)。 3. **输出结果** 直接输出处理后的字符串,非字母字符(如数字、符号)保持原样。 --- ### **示测试** 输入: ``` Hello World! 123 ``` 输出: ``` HELLO WORLD! 123 ``` --- ### **其他实现方式** 若使用库函数 `toupper`(需包含头文件 `<cctype>`): ```cpp #include <cctype> // ... for (char &c : s) { c = toupper(c); // 直接转为大写 } ``` **题目链接**:[P57336.1自动修正](https://www.luogu.com.cn/problem/P5733)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值