卡码网语言基础课 | 11. 句子缩写

目录

一、 字符串大小的比较

二、 ASCII码值

三、 基本框架代码

 四、 解题思路

4.1 首字母问题

4.2 判定小写字母

4.3 小写字母转换为大写字母

五、空格判断 

六、 代码模块化

6.1 满足的条件

6.2 代码完善

七、 题目解答

7.1 原始代码

7.2 改进代码

八、 拓展与延伸

 8.1 形参和实参

8.2 引用


通过本次练习,将会学习到以下C++知识点:(同时强化字符串的练习)

  • 字符大小的比较、字符运算、字符拼接
  • ASCII码
  • getchar()函数的使用
  • 函数的定义和使用
  • 函数的形参和实参
  • 引用&

 题目:输出一个词组中每个单词的首字母的大写组合。输入中的第一行n代表,之后一共有n组输入数据。其中,每行单词多个,每个单词长度不一,单词之间空格数不一。

示例:
输入:
1
ad dfa     fgs

输出:
ADF

一、 字符串大小的比较

在字符集中的ASCII码值来确定

二、 ASCII码值

三、 基本框架代码

#include <iostream>
#include <string>
using namespace std;
int main(){
    int n;
    cin >> n; //输入接收n行
    getchar(); //从输入中获取一个字符
    
}

注意这里使用了 getchar() 函数来吸收一个回车符,因为在输入 n 之后通常需要输入回车符才会输入下一行。

//原本: cout >> n >> endl;

之后仍然可以使用while循环来处理n行数据,每一行数据使用getline(cin, n) 来进行接收。

string s; // 定义变量s, 接收每行输入的字符串
while(n--) {
   getline(cin, s); // 从标准输入读取一行字符串,存储在字符串变量 s中
   string result; //  定义变量result, 用来输出经过处理后的结果
}

 四、 解题思路

4.1 首字母问题

题目要求输出单词首字母为大写,即存在两种情况,第一种为直接就是大写,另一种就是为小写。

如果第一个字符是小写字符,则将之转换成大写字符,再进行拼接。

4.2 判定小写字母

小写字母从 'a' 到 'z' 对应的ASCII码值是从 97 到 122,且是连续的。

即如果输入的字符>=a, 并且<=z, 则一定在a和z的范围之内,也就是一定是小写字母。

// 如果第一个字符是小写字符
if (s[0] >= 'a' && s[0]  <= 'z') {

}

4.3 小写字母转换为大写字母

大小写字符之间的差值是32, 将小写字符做减法运算,就可以得到对应的大写字符。

// 如果输入的字符是小写字符,则进行转换
if (s[0] >= 'a' && s[0]  <= 'z') {
  // ASCII码中小写字母和大写字母相差32
    s[0] -= 32;
}
result += s[0];// 将每行的第一个字符转换成大写后添加到result中

五、空格判断 

因为在单词之间,存在数量不一的空格,因此需要做出合理判断。

for (int i = 1; i < s.size() - 1; i++) { // 单词之间可能有多个空格
  // 如果当前字符是空格,并且下一个字符不是空格
      if (s[i] == ' ' && s[i + 1] != ' ') {
      // 判定下一个字符是否是小写字母,如果是则转换成大写
      if (s[i + 1] >= 'a' && s[i + 1]  <= 'z') {
        s[i + 1] -= 32;
      }
      // 将下一个字符拼接到结果result中
      result += s[i + 1]
    }
}

六、 代码模块化

由于4.2和4.3中的步骤和代码,在本次题目中重复使用,因此为了代码简洁和后续的方便维护和修改,需要将代码进行模块化操作,从而增加代码的复用性和可维护性

6.1 满足的条件

如果想要定义一个将小写字符转换成大写字符的函数,需要满足以下条件:

  • 返回类型:返回结果是经过转换后的大写字符,所以返回类型为char
  • 函数名:可以自定义,这里使用changeChar作为函数的名称
  • 形参列表:之前的形参列表为空,而一般的形参列表通常包括参数类型和参数名称。参数类型表示参数的数据类型,可以是内置数据类型(例如整数、字符、浮点数等)、用户自定义的数据类型。参数名称通常是用来描述参数的有意义的名称,可以在函数体内部使用,这里接收一个字符作为输入,所以形参列表类型为char, 参数名称可以用a表示, 引用传递&意味着函数可以修改传递给它的参数。

6.2 代码完善

// char代表返回类型,changeChar代表函数名称,char a表示函数接收一个字符a作为参数
char changeChar(char &a) {
  if (a >= 'a' && a <= 'z') a -= 32;
  // 返回类型为char, 最终还要返回a
  return a;
}

七、 题目解答

7.1 原始代码

#include <iostream>
#include <string>
using namespace std;
int main(){
    int n;
    string s;
    cin >> n; //输入接收n行
    getchar(); //从输入中获取一个字符
    while(n--){
        getline(cin,s); //接收新的一行
        string result; //设定结果存储的字符串result
        
        //将首字母小写转换为大写
        if(s[0] >= 'a' && s[0] <= 'z'){
            s[0] -=32; //大小写之间相差32
        }
        
        //将首字母链接到结果中
        result += s[0];
        
        //遍历后续整个字符串
        for(int i = 1; i < s.size() - 1; i++){//i=1即是从第二个字母开始
            
            //若当前字符为空格,下一个字符不是空格,则说明下一个字符是新单词
            if(s[i] == ' ' && s[i+1] != ' '){
                //判定新单词是否为小写,若是,则转换
                if(s[i+1] >= 'a' && s[i+1] <= 'z'){
                    s[i+1] -= 32;
                }
                
                //将新首字母链接到结果中
                result += s[i+1];
            }
            
        }
        
        cout << result << endl;
        
    }
    
}

7.2 改进代码

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

//小写字母转换为大写字母的函数
char changeChar(char a){
    if(a >= 'a' && a <= 'z'){
        a -= 32;
    }
    return a;
}


int main(){
    int n;
    string s,result;
    cin >> n; //输入接收n行
    getchar(); //从输入中获取一个字符
    while(n--){
        result = ""; //PS:该步骤不可缺少
        getline(cin,s); //接收新的一行
        
        result += changeChar(s[0]);  // 将s[0]传递到参数进行处理,转换成大写字母
        
        //遍历后续整个字符串
        for(int i = 1; i < s.size() - 1; i++){//i=1即是从第二个字母开始
            
            //若当前字符为空格,下一个字符不是空格,则说明下一个字符是新单词
            if(s[i] == ' ' && s[i+1] != ' '){
                result += changeChar(s[i+1]); //将s[i+1传递到参数进行处理,转换成大写字母
            }
            
        }
        cout << result << endl;
        
    }
    
}

八、 拓展与延伸

 8.1 形参和实参

实参和形参是与函数调用相关的两个很重要的概念,用于在函数调用时传递数据和接收数据。

形参是函数定义中声明的参数,位于函数的参数列表中。形参的作用是定义函数接受的参数的类型和名称,定义的形参只在函数执行期间有效,在函数执行完毕后会被销毁。而且它作用的范围(作用域)仅限于函数体内部,因此它们与函数外部的变量名称可以相同,而不会发生冲突。

void printSum(int a, int b) { // a和b是传递的形参,只在函数体{}中有效
  int sum = a + b;
  cout << sum << endl;
}

实参是函数调用中传递给函数的具体值或变量,实参传递的值必须与函数的形参类型匹配,否则会发生类型错误。

int main() {
    int x = 5, y = 3;
    printSum(x, y); // 这里进行了函数调用,x和y是实参
      cout << x << y << endl;
    return 0;
}

8.2 引用

在声明引用时,需要在变量名前使用 & 符号。引用必须在声明时进行初始化,并且一旦初始化,就不能改变引用的目标。

int a = 10;
int &ref = a; // 声明并初始化引用为a

当函数传递参数时,通常会创建参数的副本。使用引用参数可以避免不必要的参数复制,这对于大型数据结构(如数组)尤其有用,因为复制这些数据结构会产生显著的开销。

 

#include <iostream>
using namespace std;

void changeValue(int & a) {
    a = 100; // 修改调用方传递的变量的值
}

int main() {
    int x = 10;
    cout << x << endl;
    changeValue(x); // 传递x的引用给函数
    cout << x << endl; // x的值被函数修改为100
    return 0;
}

PS:引用的作用域(作用范围)通常是在声明它的函数或代码块内,超出作用域后引用将无效。 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis五种数据类型及命令操作(一)

&#x1f388;个人公众号:&#x1f388; :✨✨✨ 可为编程✨ &#x1f35f;&#x1f35f; &#x1f511;个人信条:&#x1f511; 知足知不足 有为有不为 为与不为皆为可为&#x1f335; &#x1f349;本篇简介:&#x1f349; 本篇记录Redis五种数据类型及命令操作&#xff0c;如…

[BJDCTF2020]Easy MD5 1

题目环境&#xff1a; 尝试了SQL注入、命令执行等都不行 点击提交并burp进行抓包Repeater进行重放这里看到了内置的SQL语句select * from admin where passwordmd5($pass,true) 发现传进去的值会进行md5加密 这里看了大佬们的解释 ffifdyop绕过&#xff0c;绕过原理是&#xff…

计算机网络期末复习-Part3

1、rdt1.0&#xff0c;rdt2.0&#xff0c;rdt3.0的底层信道模型 RDT 1.0: 完全可靠的底层信道&#xff0c;没有比特差错&#xff0c;也没有分组丢失。 RDT 2.0: 具有比特差错的底层信道&#xff0c;有比特差错&#xff0c;但没有分组丢失。 RDT 3.0: 具有差错和丢包的底层信道…

聊聊性能测试的左移右移

前面的文章中&#xff0c;分享过我对于测试左移右移的一些思考和实践方法。有同学在后台留言问我&#xff1a;常规的性能测试一般都是在测试阶段集成测试时候才开始介入&#xff0c;很容易测试时间不够&#xff0c;可不可以借鉴测试左移右移的思路&#xff0c;更早的介入和发现…

实战Leetcode(三)

Practice makes perfect&#xff01; 实战一&#xff1a; 带环问题其实我们小学时就接触过&#xff0c;就比如在操场上比赛跑步的追击问题&#xff0c;这里也是一样&#xff0c;如果我们定义两个指针&#xff0c;一个快指针&#xff0c;一个慢指针&#xff0c;快指针走的快&…

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException:

错误描述如下所示&#xff1a; 我们将错误拉到最下面如下所示为导致异常的原因&#xff1a; Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type com.example.reviewmybatisplus.Service.UserService available: expec…

基于Mahony互补滤波的IMU数据优化_学习笔记整理

这周自己被安排进行优化软件 IMU 姿态解算项目&#xff0c;之前自己只简单了解四元数&#xff0c;对IMU数据处理从未接触&#xff0c;通过这一周的学习感觉收获颇丰&#xff0c;在今天光棍节之际&#xff0c;&#xff0c;&#xff0c;用大半天的时间对这一周的收获进行整理&…

SwiftUI 如何保证 Text 中字符数量相等的字符串显示宽度一定相同?

0. 问题现象 在 SwiftUI 中我们往往需要将内容相似的字符串展列出来给用户比较,这些字符串内容各有不同但字符数量始终是相等的,我们希望它们的显示宽度始终保持一致: 如上图所示:即使是等宽字符组成的字符串在字符数量相等时它们的显示宽度仍然可能不一致。但演示中最底部…

迷雾系统-人物驱散迷雾

使用linerRender,将人物移动数据动态添加进去&#xff0c;同样是特殊层级让FogCamera渲染 EndCapVertices的数量越多&#xff0c;矩形就变为一个椭圆形的形状&#xff0c;更适合圆形视野探索 当拐点的两个点距离太近&#xff0c;LineRender会发生扭曲&#xff0c;解决方案是在…

14 # 手写 debounce 防抖方法

什么是防抖 防抖: n 秒后再去执行该事件&#xff0c;若在 n 秒内被重复触发&#xff0c;则重新计时&#xff0c;这个效果跟英雄联盟里的回城技能差不多。 本质上是优化高频率执行代码的一种手段&#xff0c;目的就是降低回调执行频率、节省计算资源。 应用场景&#xff1a; …

灵活用工仿boss直聘招聘系统劳务系统源码

灵活用工仿boss直聘招聘系统劳务系统 开发语言&#xff1a; 后台&#xff1a;phpmysql&#xff0c;fastadmin框架 前端&#xff1a;vue&#xff0c;Uniapp 功能介绍&#xff1a; 1.登录 账号密码登录&#xff0c;微信手机号授权登录 2.首页&#xff1a;定位功能&#xf…

2023最新软件测试面试300问

一、Linux系统应用和环境配置 1、Linux系统的操作命令给我说10个&#xff0c;一般用什么工具远程连接Linux服务器&#xff1f; 2、Linux中的日志存储在哪里&#xff1f;怎么查看日志内容&#xff1f; 3、Linux中top和ps命令的区别&#xff1f; 4、Linux命令运行的结果如何写…

《013.Springboot+vue之旅游信息推荐系统》【前后端分离有开发文档】

《013.Springbootvue之旅游信息推荐系统》【前后端分离&有开发文档】 项目简介 [1]本系统涉及到的技术主要如下&#xff1a; 推荐环境配置&#xff1a;idea jdk1.8 maven MySQL 前后端分离; 后台&#xff1a;SpringBootMybatisMySQL; 前台&#xff1a;Vue; [2]功能模块展…

暖手宝+充电宝设计方案 可实现快速升温和充电 低成本充电电流可选

充电暖手宝因为它的便携性&#xff0c;既能供暖又能当充电宝使用而备受人们喜爱。是冬天暖手供暖的必备神器。 目前&#xff0c;市场常见的暖手宝大致有三个类型&#xff0c;分别是加热水的热水袋、通过化学反应放热的铁粉袋子和锂电供电的智能暖手宝。与常见的暖手宝不同&…

如何将BMP图片批量转为PNG透明图片,并去掉BMP黑色背景

将BMP图片批量转为PNG透明图片&#xff0c;并去掉BMP黑色背景&#xff0c;这里推荐一款软件bmp2png&#xff0c;关键是免费的。截图如下&#xff1a; 这个小软件不仅可以将bmp图片批量转为png图片&#xff0c;而且还增加了压缩功能&#xff0c;导出png图片时压缩导出图片&#…

order by的注入与Insert ,update和delete注入

order by的注入 Insert &#xff0c;update和delete注入

告别龟速,从GitHub快速下载项目的技巧分享,简单又高效!

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能AI、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推荐--…

Linux中的粘滞位

目录 粘滞位1、作用2、为什么添加粘滞位3、演示粘滞位的使用方法和效果 粘滞位 1、作用 为了多人协作写进行文件创作时&#xff0c;other用户没有办法将文件删除&#xff0c;只有超级管理员、该目录的所有者、该文件的所有者他们可以删除。 2、为什么添加粘滞位 你想在进行…

Leetcode-145 二叉树的后序遍历

递归 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* this…

开源绘画krita中的笔刷压感开启技巧

一、问题描述 之前用过高漫的绘图板&#xff0c;在krita中没有效果&#xff0c; 原来是因为压感没有开启。方法如下。 二、解决方法 如下图点击笔刷设置按钮&#xff0c;打开 笔刷编辑器&#xff0c;之后如图顺序&#xff0c;从左栏点击笔刷控制属性“大小”&#xff0c;之…