【C++】B2115 密码翻译

news2025/2/4 6:34:31

在这里插入图片描述

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

文章目录

  • 💯前言
  • 💯题目解析
  • 💯1. 老师的做法
    • 代码实现:
    • 思路解析:
  • 💯2. 我的做法
    • 代码实现:
    • 思路分析:
  • 💯3. 老师的做法与我的做法的对比
  • 💯4. 我的代码问题及修正
  • 💯5. 拓展:编码实践的优化方向
  • 💯小结


在这里插入图片描述


💯前言

  • 在计算机编程中,解题不仅仅是通过完成任务,还能帮助我们培养思维的灵活性和严谨性。通过对这道题《密码翻译》(题号:B2115)进行详细的分析和思考,我们不仅能更好地理解 C++ 的基础应用,还能够在实际操作中进行思维优化,提升代码效率与可读性。在本篇文章中,我将详细讲解老师的做法、我的做法以及两者之间的优缺点,最后我会提出如何修正代码中的问题,并对本题做一些拓展与延伸,帮助大家更深入地理解这类问题。
    C++ 参考手册
    在这里插入图片描述

💯题目解析

B2115 密码翻译
在这里插入图片描述

题目描述如下:

题目描述:
在信息传递过程中,为了防止信息被截获,往往需要采用一定的方式加密。我们给出一种最简单的加密方法,对给定的一个字母字符串,其中字母 A ~ Z,a ~ z 的字母用其后继字母替代,把 z 和 Z 用 a 和 A 替代,其他非字母字符则保持不变。请根据此加密规则将输入的密码进行解密。

输入格式:
一行,加密后的字符串,长度不超过 10000 个字符。

输出格式:
一行,将密码解密后的字符串。

输入输出例:
输入:
Ifmmp! Ipx! bsf zpvs!
输出:
Hello! How! are you!

💯1. 老师的做法

老师的做法非常直接,处理了字母和非字母字符,运用了字符的 ASCII 值进行解密。

代码实现:

#include <iostream>
#include <string>
using namespace std;

int main()
{
    string s;
    getline(cin, s);  // 输入加密后的字符串
    for (int i = 0; i < s.size(); i++)  // 遍历字符串中的每个字符
    {
        if ((s[i] >= 'b' && s[i] <= 'z') || (s[i] >= 'B' && s[i] <= 'Z'))  // 字母范围
        {
            s[i]--;  // 字符减去 1,进行解密
        } 
        else if (s[i] == 'a') {
            s[i] = 'z';  // 特殊情况:'a' 变成 'z'
        }
        else if (s[i] == 'A') {
            s[i] = 'Z';  // 特殊情况:'A' 变成 'Z'
        }
    }
    cout << s << endl;  // 输出解密后的字符串
    return 0;
}

思路解析:

  1. 字母解密:字母 A~Z 和 a~z 都要按后继字母替代,其中大写字母和小写字母都做了 ASCII 值的操作,保证 ‘b’ ~ ‘z’ 变成 ‘a’ ~ ‘y’,‘B’ ~ ‘Z’ 变成 ‘A’ ~ ‘Y’,‘a’ 和 ‘A’ 被特殊处理。
  2. 非字母字符的处理:对于非字母字符,程序不做任何处理,直接原样输出。

这种方式简单且符合题目要求,但存在潜在问题,在处理边界字符(如 ‘a’ 和 ‘A’)时,虽然做了特殊处理,但有可能会对某些字符做过多的条件判断,使得代码在某些边界情况下的处理不够简洁。

💯2. 我的做法

我基于老师的思路做了一些修改,特别是在处理 ‘a’ 和 ‘A’ 的字符时,我采用了不同的处理方式,以下是我的代码实现:

代码实现:

#include <iostream>
#include <string>
using namespace std;

int main()
{
	string s;
	getline(cin, s);
	for(int i = 0; i < s.size(); i++)
	{
		if((s[i] >= 'B' && s[i] <= 'Z') || (s[i] >= 'b' && s[i] <= 'z') )
		{
			cout << char(s[i] - 1);
		}
		else if(s[i] == 'a' || s[i] == 'A')
		{
			cout << char(s[i] + 25);
		}
		else
			cout << s[i];
	}
	
	return 0;
}

思路分析:

  • 我对每个字符进行判断,如果是字母(‘b’ 到 ‘z’ 或 ‘B’ 到 ‘Z’),我直接通过减 1 的方式来解密字符,保证字符的顺序准确。
  • 对于 ‘a’ 和 ‘A’,我通过直接赋值的方式将其转换为 ‘z’ 和 ‘Z’。
  • 对于非字母字符,直接原样输出。

这种方法通过直接字符赋值的方式,避免了过多的数学计算,使得代码更加直观和简洁。

💯3. 老师的做法与我的做法的对比

特征老师的做法我的做法
代码结构稍微复杂,特别是针对 ‘a’ 和 ‘A’ 的条件判断。直接处理字母,通过字符赋值方式解决特殊情况。
解密过程对字符进行移位,针对 ‘a’ 和 ‘A’ 做特殊处理。同样处理移位,对 ‘a’ 和 ‘A’ 采用简单的赋值。
可读性有一些复杂的判断逻辑,略显冗长。逻辑简洁明了,容易理解和扩展。
处理特殊字符的方式使用加法和减法来计算 ‘a’ 和 ‘A’ 的处理,增加了运算复杂度。直接对 ‘a’ 和 ‘A’ 进行赋值,减少了运算量。

💯4. 我的代码问题及修正

尽管我的代码在逻辑上简化了处理方式,但也存在一个潜在的问题,即对输入字符串的长度进行过多的判断。在某些情况下,我没有在处理大写字母和小写字母的边界时进行更精确的验证。通过进一步简化代码和处理边界情况,可以避免不必要的错误,并提高效率。

💯5. 拓展:编码实践的优化方向

  • 性能优化:在处理大量数据时,字符串操作的效率非常重要。在本题中,我们的解密过程是逐字符进行的,但可以考虑在一些高效的算法下,比如并行计算或使用哈希表来提高处理速度。
  • 错误处理:虽然题目未涉及异常情况,但在实际应用中,我们常常需要考虑各种可能的错误,比如非法字符输入、数据超出范围等。因此,在代码中加入适当的错误检查也是一种良好的编码习惯。

💯小结

本题通过对老师和我自己代码实现的对比,我们可以看到代码的优化不仅仅是性能上的提升,还包括代码的可读性、简洁性以及处理特殊情况的方式。通过详细分析题目和解密过程,我们能够更好地理解 C++ 中字符处理的基本原理,以及如何通过细致的思考和优化来提高代码质量。在解题过程中,逐步提升代码的质量并学习如何有效避免潜在的逻辑错误,将为我们今后的编程实践奠定坚实的基础。

希望这篇文章能帮助大家更好地理解并优化 C++ 编程,提升解题能力。


在这里插入图片描述


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

学习C++的建议

C++ 是一门强大且广泛应用的编程语言,无论是系统开发、游戏开发还是高性能计算,它都有不可替代的地位。然而,学习C++的道路可能是陡峭的,为了帮助你更高效地掌握这门语言,我总结了一些学习建议和经验。


1. 理解C++的基础
学习重点:

  1. 掌握基本语法
    • 学会声明变量、条件语句、循环、函数等核心语法。
    • 掌握数组、指针、引用等基础知识。
  2. 熟悉标准输入输出
    • 掌握 cincout 的用法。
    • 理解格式化输出,例如 std::setwstd::fixed
  3. 记住编译器的角色
    • 理解源代码如何通过编译器转换为可执行程序,选择一款好的IDE(如Visual Studio、Clion、VSCode)。

建议:用大量小程序练习这些基础语法,比如写一个计算器、模拟猜数字游戏等。


2. 深入学习C++的特性
学习重点:

  1. 面向对象编程(OOP)
    • 理解类和对象,熟悉如何定义类、成员变量和成员函数。
    • 掌握封装、继承、多态三大核心特性。
  2. 内存管理
    • 理解指针的用法,掌握动态内存分配(newdelete)。
    • 学习如何避免内存泄漏,熟悉智能指针(如std::unique_ptrstd::shared_ptr)。
  3. 标准模板库(STL)
    • 熟悉常用的容器(如vectormapset)和算法(如sortfind)。
    • 掌握迭代器的用法。
  4. 异常处理
    • 学习使用try-catch块处理异常。
    • 理解异常的用途以及如何设计健壮的代码。

建议:尝试开发一个小型项目,比如一个学生管理系统,综合应用类、STL、指针和动态内存分配。


3. 掌握进阶内容
学习重点:

  1. 模板
    • 理解函数模板和类模板,掌握泛型编程思想。
    • 学习模板特化和模板元编程的基本概念。
  2. 多线程与并发
    • 学习 C++11 提供的多线程支持(如std::thread)。
    • 熟悉互斥锁(std::mutex)和条件变量(std::condition_variable)。
  3. C++与C的兼容性
    • 学习如何在C++中使用C语言代码,理解C和C++的区别。
    • 掌握C风格字符串(char[])和C++字符串(std::string)的转换。

建议:在这一阶段,可以挑战更复杂的项目,比如开发一个小型的HTTP服务器,学习网络编程并结合多线程。


4. 学习资源与实践方法
学习资源:

  1. 书籍
    • 《C++ Primer》:非常适合初学者的经典书籍。
    • 《Effective C++》:进阶学习C++最佳实践的指南。
    • 《The C++ Programming Language》:Bjarne Stroustrup(C++之父)的权威著作。
  2. 在线课程
    • Coursera 上的 C++ 编程课程。
    • YouTube 上免费的 C++ 系列教程。
  3. 社区与文档
    • 参与C++相关的论坛(如CSDN、Stack Overflow)。
    • 阅读官方文档(https://en.cppreference.com)。

实践方法:

  1. 多写代码,多调试
    • 每学一个概念后,写至少两个示例代码并进行调试。
  2. 做小项目
    • 从简单的控制台程序开始,比如文件读写、计算器、小游戏等。
    • 慢慢过渡到图形界面或网络程序开发。
  3. 阅读他人代码
    • 阅读开源项目的代码,理解优秀代码的设计思路。
  4. 参加编程比赛
    • 比如 LeetCode 或 Codeforces,可以帮助你提升算法能力和C++的熟练度。

5. 保持耐心与兴趣
学习C++可能会面临以下困难:

  1. 复杂的语法:如模板、智能指针、多线程等。
  2. 调试困难:指针错误、内存泄漏、未定义行为可能让人头疼。

如何应对:

  • 将大问题拆解成小问题,逐步解决。
  • 不断重复基础知识,以加深理解。
  • 保持兴趣,尝试一些有趣的项目,比如写一个游戏、制作一个简单的图形程序。

小结
学习C++需要一个循序渐进的过程,从基础语法到面向对象编程,再到进阶的模板和并发编程,每一步都需要耐心和实践。通过充分利用学习资源、进行大量编码练习,以及挑战实际项目,你一定可以成为C++的高手。记住,学习的核心在于理解,而非死记硬背。

祝你学有所成,享受C++编程的乐趣!


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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Leetcode—598. 区间加法 II【简单】

2025每日刷题&#xff08;206&#xff09; Leetcode—598. 区间加法 II 实现代码 class Solution { public:int maxCount(int m, int n, vector<vector<int>>& ops) {int ans m * n;int x ops.size();if(ops.empty()) {return ans;}int xm ops[0][0], ym …

OpenCV:图像轮廓

目录 简述 1. 什么是图像轮廓&#xff1f; 2. 查找图像轮廓 2.1 接口定义 2.2 参数说明 2.3 代码示例 2.4 运行结果 3. 绘制图像轮廓 3.1 接口定义 3.2 参数说明 3.3 代码示例 3.4 运行结果 4. 计算轮廓周长 5. 计算轮廓面积 6. 示例&#xff1a;计算图像轮廓的面…

文字显示省略号

多行文本溢出显示省略号

Cosmos - 世界模型开发平台

文章目录 一、关于 Cosmos主要特点模型家族 二、使用示例1、推理2、后训练 许可证和联系方式 一、关于 Cosmos NVIDIA Cosmos是开发者第一的世界基础模型平台&#xff0c;旨在帮助物理AI开发者更好、更快地构建他们的物理AI系统。宇宙包含 预训练模型&#xff0c;可通过拥抱脸…

图像分割中根据mask的ROI,去除mask和image中没有勾画ROI层数以外的图像

在分割任务中&#xff0c;一个患者有很多层图像&#xff0c;但是勾画的ROI仅有那么几层。我想去除ROI以外层数的那些没用的图像。这里以一个36张图像的nii格式数据为例 查看一下mask文件中有多少个非0图像 import nibabel as nib import numpy as np# 加载 .nii 文件 file_pat…

全栈开发:使用.NET Core WebAPI构建前后端分离的核心技巧(一)

目录 cors解决跨域 依赖注入使用 分层服务注册 缓存方法使用 内存缓存使用 缓存过期清理 缓存存在问题 分布式的缓存 cors解决跨域 前后端分离已经成为一种越来越流行的架构模式&#xff0c;由于跨域资源共享(cors)是浏览器的一种安全机制&#xff0c;它会阻止前端应用…

springboot使用rabbitmq

使用springboot创建rabbitMQ的链接。 整个项目结构如下&#xff1a; 1.maven依赖 <dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>3.4.1</version> </dependency>application.y…

Linux——ext2文件系统(二)

Linux——ext2文件系统 ext2文件系统宏观认识一、磁盘分区与格式化二、块组&#xff08;Block Group&#xff09;结构三、文件系统特性 文件名与目录名与inode一、inode的作用原理二、文件与目录名与inode的关系 路径一&#xff0c;路径解析二&#xff0c;路径缓存三&#xff0…

如何让DeepSeek恢复联网功能?解决(由于技术原因,联网搜索暂不可用)

DeekSeek提示&#xff1a;&#xff08;由于技术原因&#xff0c;联网搜索暂不可用&#xff09; 众所周知&#xff0c;因为海外黑客的ddos攻击、僵尸网络攻击&#xff0c;deepseek的联网功能一直处于宕机阶段&#xff0c;但是很多问题不联网出来的结果都还是2023年的&#xff0c…

python的ruff简单使用

Ruff 是一个用 Rust 编写的高性能 Python 静态分析工具和代码格式化工具。它旨在提供快速的代码检查和格式化功能&#xff0c;同时支持丰富的配置选项和与现有工具的兼容性。ruff是用rust实现的python Linter&Formatter。 安装&#xff1a; conda install -c conda-forge…

【漫话机器学习系列】077.范数惩罚是如何起作用的(How Norm Penalties Work)

范数惩罚的作用与原理 范数惩罚&#xff08;Norm Penalty&#xff09; 是一种常用于机器学习模型中的正则化技术&#xff0c;它的主要目的是控制模型复杂度&#xff0c;防止过拟合。通过对模型的参数进行惩罚&#xff08;即在损失函数中加入惩罚项&#xff09;&#xff0c;使得…

LLMs之OpenAI o系列:OpenAI o3-mini的简介、安装和使用方法、案例应用之详细攻略

LLMs之OpenAI o系列&#xff1a;OpenAI o3-mini的简介、安装和使用方法、案例应用之详细攻略 目录 相关文章 LLMs之o3&#xff1a;《Deliberative Alignment: Reasoning Enables Safer Language Models》翻译与解读 LLMs之OpenAI o系列&#xff1a;OpenAI o3-mini的简介、安…

Notepad++消除生成bak文件

设置(T) ⇒ 首选项... ⇒ 备份 ⇒ 勾选 "禁用" 勾选禁用 就不会再生成bak文件了 notepad怎么修改字符集编码格式为gbk 如图所示

后台管理系统通用页面抽离=>高阶组件+配置文件+hooks

目录结构 配置文件和通用页面组件 content.config.ts const contentConfig {pageName: "role",header: {title: "角色列表",btnText: "新建角色"},propsList: [{ type: "selection", label: "选择", width: "80px&q…

Spring Boot项目如何使用MyBatis实现分页查询

写在前面&#xff1a;大家好&#xff01;我是晴空๓。如果博客中有不足或者的错误的地方欢迎在评论区或者私信我指正&#xff0c;感谢大家的不吝赐教。我的唯一博客更新地址是&#xff1a;https://ac-fun.blog.csdn.net/。非常感谢大家的支持。一起加油&#xff0c;冲鸭&#x…

Intellij 插件开发-快速开始

目录 一、开发环境搭建以及创建action1. 安装 Plugin DevKit 插件2. 新建idea插件项目3. 创建 Action4. 向新的 Action 表单注册 Action5. Enabling Internal Mode 二、插件实战开发[不推荐]UI Designer 基础JBPanel类&#xff08;JPanel面板&#xff09;需求&#xff1a;插件设…

语言月赛 202412【题目名没活了】题解(AC)

》》》点我查看「视频」详解》》》 [语言月赛 202412] 题目名没活了 题目描述 在 XCPC 竞赛里&#xff0c;会有若干道题目&#xff0c;一支队伍可以对每道题目提交若干次。我们称一支队伍对一道题目的一次提交是有效的&#xff0c;当且仅当&#xff1a; 在本次提交以前&…

MySQL锁类型(详解)

锁的分类图&#xff0c;如下&#xff1a; 锁操作类型划分 读锁 : 也称为共享锁 、英文用S表示。针对同一份数据&#xff0c;多个事务的读操作可以同时进行而不会互相影响&#xff0c;相互不阻塞的。 写锁 : 也称为排他锁 、英文用X表示。当前写操作没有完成前&#xff0c;它会…

OSCP - Proving Grounds - Roquefort

主要知识点 githook 注入Linux path覆盖 具体步骤 依旧是nmap扫描开始&#xff0c;3000端口不是很熟悉&#xff0c;先看一下 Nmap scan report for 192.168.54.67 Host is up (0.00083s latency). Not shown: 65530 filtered tcp ports (no-response) PORT STATE SERV…

集合通讯概览

&#xff08;1&#xff09;通信的算法 是根据通讯的链路组成的 &#xff08;2&#xff09;因为通信链路 跟硬件强相关&#xff0c;所以每个CCL的库都不一样 芯片与芯片、不同U之间是怎么通信的&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 很重要…