C++感受6-Hello World 交互版

news2024/9/22 13:24:09
  • 变量、常量
  • 输入、输出、流
  • getline() 函数读入整行输入
  • Hello() 函数复习
  • 新定义函数 Input() 实现友好的人机交互
  • 还有 “痘痘” 为什么挤不到的分析……

 

1. DRY 原则简介

上一节课,我们写了两版“问候”程序。第一版的最大问题是重复的内容比较多,每一次问候都在重复从 cout 到 endl 的代码,中间只有人名不同。

刚学编程的人可能会说:“代码重复怕什么啊?在电脑里 复制、 粘贴 文本非常快啊!”

问题不在于写代码是快还是慢,而在于重复的代码,难以修改、难以维护。

重复的代码,它们的背后的业务逻辑往往是相同或者高度相似的。如果有一天,这个业务逻辑发生改变,就会造成代码中所有重复的地方都要修改。我们现在的代码才几行而已,如果有一天q有上千,上万行代码,我们很可能都无法找出所有重复的地方,一个个修改过去也极大可能引发新的错误。

“不要到处写重复的代码”,这已经成为专门一条行业内的编码规矩,称为 “DRY”原则,也就是 “Dont’t repeat yourself”,不要重复你自己。

2. 新情景、新需求

第二版的问候程序,有很大的进步。因为我们把重复的,问候操作,写成一个函数,叫Hello(),多次调用。这样一来,将来,如果问候操作,需要变化,我们也只需要修改这个Hello()函数即可。

// 我的第一个函数
void Hello(std::string_view XXX)
{
    std::cout << "你好," << XXX << "!" << std::endl;
}

 这一节课,我们要为问候业务,提出新的场景需求:模拟在上班路上,碰到谁,就问候谁的过程。

碰上谁,就问候谁……那我们能事先知道每一天上班会碰到谁吗?当然无法预知。这样一看,现有的这第二版问候程序就显得非常“死板”了。每一次运行这个程序,都是先问候志玲,再问候幂幂,再问候冰冰……无论运行多少次,它的问候过程都是一成不变的。

这就说到了“变”!我们需要可以变的姓名;这就引出这节谭,们要学习第一个重要的知识点:变量。

3. 认识变量和常量

程序中的数据,可以按可变和不可变区分,分成两大类:常量和变量。

3.1 常量

常量,就是在程序运行之后,无法修改,或禁止修改它的“量”的数据。

这里的“量”,更通俗易懂的说法是一个数据的“值”,或者说,一块内存里存放的内容。

我们以后会重点讲解常量。不过,大家要在今天记住这两个描述:“无能力修改” 和 “禁止修改”。

来举一个“恶俗”,但绝对管用的例子吧——

假设你是一个非常喜欢挤别人痘痘的人。然后,有个女生说她后背某个地方长了一颗很大的痘痘,可是她不告诉你这颗痘痘的位置。请问,你能挤掉一颗你看不见,摸不着的痘痘吗?当然不能,这就叫“无能力修改”。

另外一种情况,这颗痘痘就长在女生鼻头上,你看得见,摸得着,但是你能伸手就挤掉它吗?也不能,因为人家女生不允许你动它。

这就是将来我们会学习到的,最常见的两种类型的常量:一种是代码在客观上没有能力修改的数据,一种在语法上明确标明不让修改的数据。上一课第一版代码中的名字字符串,就是第一种,叫“字面常量”。它就像我们白纸黑字签下的字,一旦写下,就涂改不了。

3.2 变量

初中学习的代数,当一个数据我们暂时不知道它会是什么值时,我们可以用个字母,比如 x、y、z,来暂时先代表这个数据。在程序中,一个数据,我们暂时不知道它会是什么值;或者,知道它一开始的值,但这个值会随着程序的运行而不断变化,这情况下,我们也可以用一个字母,或者更好的,用一个单词来表达它,表达这个会变化的数据。

今天,我们不知道什么?答,我们不知道每一天上班路上会先遇到谁,后遇到谁。所以,就让我们写的C++程序,定义第一个真正意义上的变量,取名为 “” 吧!

你当然也可以使用 X 来表达,这样显得更加有科技感和神秘感。但是,我觉得用名字是“谁”这个变量,来表达程序中可能遇到谁谁谁谁……想一想是不是也挺直观的?

没错,这也是我们今天学习到又一个重要的知识点:变量的名字一定要能直观地表达它的作用

来看一些常量与变量使用对比的例子——

  • “我的体重是 60 公斤”:人的体重很少一成不变,所以我们得用变量表达它,这个变量的名字可以叫 weight。

  • “我的身高 175 厘米……”:也一样,从小到大再到老,身高也会变化,这个变量可以叫 height。

3.3 变量常见使用过程

结合用变量表达待问候的人名的例子,我们来看看变量最常见的使用过程。

(1)定义变量

要使用变量,首先需要定义变量。C++定义变量时,需要给出变量名字,还需要直接或间接给出变量的类型。今天我们学习其中的“直接”方式:

变量类型 变量名字;

即:先写下变量的类型,再写下它的名字,然后用分号结束,这是定义变量的一种常见语法。

在我们的例子,变量名是,它实际是要表达人的名字,所以它的类型应该是字符串。在 C++ 的标准库中,有一个叫 string 的类型,用来表达字符串。

std::string 谁;  // 定义了一个变量,名字叫谁,类型是 std::string

大家还记得前面课堂学习到的名字空间的知识点吧?特别是这个 std:: 的写法,你应该很熟悉了。

这样定义的变量谁,一开始时,它并不持任何字符内容(或者说,它持有一个空的字符串)。

2)修改变量的值

有了一个变量,接下来,就可以修改它的“量”了,也就是为它赋值。你可能猜到了,赋值操作在C++中,就是日常的 “=” 操作符(等号)。

下面演示了赋值 “张三” 给 的代码:

谁 = "张三";  // 修改这个变量的值 (量、内存)

(3)使用变量

变量很方便用来传递一个值,比如,我们可以把 谁 作为之前我们写的 Hello() 函数的入参,以实现将 谁 的当前值(第2步中的 “张三”)传递给 Hello() 函数的入参(还记得吗,这个入参是一个“偷窥狂”,哦不是,是“观察者”)……

Hello(谁);  // 将谁的当前值,传递给 Hello() 函数入参,再于函数内部输出其值

(4)再改,再用

变量变量,比孙悟空还善变,悟空才能连续72变,我们的变量可以无穷尽地变下去……

谁 = "李天王";
Hello(谁);

谁 = "孙悟空";
Hello(谁);

// ...

3.4 变量使用完整示例代码

#include <iostream>
#include <string>
#include <string_view>

void Hello(std::string_view XXX)
{
    std::cout << "你好," << XXX << "!" << std::endl;
}

int main()
{
    std::string 谁; 

    谁 = "志玲";
    Hello(谁);

    谁 = "幂幂";
    Hello(谁);

    谁 = "冰冰";
    Hello(谁);

    谁 = "热巴";
    Hello(谁);

    谁 = "真木阳子";
    Hello(谁);

    谁 = "井川遥";
    Hello(谁);

    谁 = "Lily Collins";
    Hello(谁);
}

问题来了:这个使用变量的版本,感觉写起来,比之前的常量版本还啰嗦呀?

4. 人机交互!

4.1 认识 getline()

尽管用了变量,但这个版本每次运行起来,输出结果还是一成不变;甚至写起来比常量的那个版本,还要麻烦、还啰嗦,并且,没有引入什么新功能呀?!

我们准备这样来模拟每天上班路上遇到谁问候谁的过程:我们让用户(其实,就是我们自己),在程序运行时,通过键盘输入一个姓名,输入谁,就表示我们遇到谁。

我们要输入的是一个姓名,一个字符串。并且,如果是外国人的话,那么他们的姓名中间可能包含空格。C++标准库提供了一个 getline() 的函数,特别适合于读入整行的字符串,包括中间的空格。

getline() 有两个入参。第一个入参指定输入流。什么叫“输入流”?

【输入、输出】:首先来理解什么叫“输入”:往程序里“塞”数据,就叫“输入”。大家顺便可以理解一下什么叫 “输出”,程序往外“吐”数据,就叫输出,也就是,编程时讲的输入和输出,是以程序为中心来理解的。

【流】:那什么叫流:水流、电流,都是流。流就是在同一个方向上的排着队的一大堆数据。比如,“车流”就是:同一个行驶方向上,有很多车一辆接一辆地往前走。

本站深入讲解,包含多个实践项目的 C++“流”的高级课程:
《C++“流”编程视频辅导》课程 建议及时加深学习

我们现在写的程序,暂时只能使用键盘往程序里输入数据,一阵“噼噼啪啪”敲键盘,就可以往程序里输入一大串字符,因此它满足“输入流”的概念的三个要素:

  • 同一个方向:键盘到主机
  • 支持连续:噼噼啪啪快速输入,一个字符都不会丢
  • 支持排队(即有序):无论你击键有多少,都不可能出现先输入字符的后到,后输入的字符先到的乱序情况

所以,C++标准库就把键盘输入,包装成一个 标准字符输入流,并且预先定义成一个变量。

如果是我写的标准库,那这个变量的名字肯定得叫 噼噼啪啪,可惜不是。
这个预先定义的,代表标准输入流,或者说,绝大多数情况下,代表键盘的变量,它的真正的名字叫 cin。c指字符,in 指输入 。加上标准库名字空间直接限定,就是 std::cin。

getline() 函数的第二个入参,在本例中,我们给的是我们自己定义的字符串变量,也就是

当程序这样写时:

getline(std::cin, 谁); 

执行该句代码并完成 getline() 的调用之后,变量的值,就是用户从键盘上输入的一行文本。输入一行文本,是指用户输入一些普通字符内容(包括汉字内容)之后,非常潇洒的拍下键盘上的回车键。getline()开始从行首一直读到行尾,不含回车换行

如果用户在此期间就是不碰键盘,那程序就会“卡”在这一行一动不动。

4.2 问候程序的人机交互第一版

#include <iostream>
#include <string_view>
#include <string>


void Hello(std::string_view XXX)
{
    std::cout << "你好," << XXX << "!" << std::endl;
}

int main()
{
    std::string 谁; 

    std::getline(std::cin, 谁);
    Hello(谁);

    std::getline(std::cin, 谁);
    Hello(谁);
}

为了不浪费版面,暂时就只支持上班路上遇到两个吧!后面的遇到的,管他是大老板还是小保安,管她是不是你暗恋的办公室女神,咱们就全都假装没看到。

5. 是时候看视频了……

ffls09-HelloWorld-交互版

6. 最终版本代码

将 “遇见” 的过程,也封装成一个函数:Input(),该函数返回用户输入的姓名,并且提供了更好的人机交互界面。

#include <iostream>
#include <string_view>
#include <string>

// 负责问候(输出)
void Hello(std::string_view XXX)
{
    std::cout << "你好," << XXX << "!" << std::endl;
}

// 负责遇见(输入)
std::string Input()
{
    std::cout << "遇见谁了?请输入他的名字:";

    std::string name;
    std::getline(std::cin, name);
    return name;
}

int main()
{
    std::string 谁; 
	
    谁 = Input(); // 遇见谁
    Hello(谁);  // 问候谁

    谁 = Input(); // 纵不遇见你
    Hello(谁);   // 也想问候你
}

「本课终」

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

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

相关文章

Netty快速入门

网络通信模型 在了解Netty之前&#xff0c;我们可以简单的先了解一下我们的网络通信方式&#xff0c;正所谓知其然&#xff0c;知其所以然。只有了解了网络通信模型&#xff0c;我们才能更好的去理解Netty的一些核心的原理。 如下图是一个简单的请求发送的时候的一个大概的HTT…

大型网站系统架构演化实例_6.使用分布式文件系统和分布式数据库系统

1.使用分布式文件系统和分布式数据库系统 任何强大的单一服务器都满足不了大型网站持续增长的业务需求。数据库经过读写分离后&#xff0c;从一台服务器拆分成两台服务器&#xff0c;但是随着网站业务的发展依然不能满足需求&#xff0c;这时需要使用分布式数据库。文件系统也一…

el-image组件预览图片同时操作页面

背景&#xff1a;el-image组件打开预览效果不能滑动页面。 Q:那么如何才能在打开遮罩层后还能操作页面呢&#xff1f; A:改变遮罩层的大小。CSS3有一个属性width&#xff1a;fit-content&#xff1b;可以解决这个问题。 打开F12看看饿了么的原生样式如下 加上width&#xff1…

AI大模型实现软件智能化落地实践

1、什么是大模型 大型语言模型&#xff08;Large Language Model&#xff0c;LLM&#xff1b;Large Language Models&#xff0c;LLMs)。 大语言模型是一种深度学习模型&#xff0c;特别是属于自然语言处理&#xff08;NLP&#xff09;的领域&#xff0c;一般是指包含数干亿&…

在数字化转型过程中,企业的资产管理需要做出哪些调整?

在数字化转型过程中&#xff0c;企业的资产管理做出调整的常见于以下几个方面&#xff1a; 1、提高工作效率&#xff1a;数字化转型能够让员工在部门与部门之间的沟通更加顺畅&#xff0c;节省时间&#xff0c;提高效率。这要求企业在资产管理中采用数字化工具和流程&#xff…

高中数学:三角函数之考点精华-单调性问题

一、解题方法 1、换元 2、画图 3、反向求解 参考&#xff1a;整体换元法 二、练习 例题1 解析&#xff1a; 这一题&#xff0c;比较简单&#xff0c;是标准的换元法应用题。 这里稍微注意下第二小问的对称中心&#xff0c;因为&#xff0c;B1&#xff0c;所以&#xff0c;对…

单机三pxc节点集群,+docker-haproxy2.0负载均衡实现

一.下载 https://www.haproxy.org/download/2.0/src/haproxy-2.0.5.tar.gz 或者在这里下载&#xff08;下面需要的各个配置文件都有&#xff09;&#xff1a; https://download.csdn.net/download/cyw8998/89170129 二.编写文件&#xff0c;制作docker镜像 1.Dockerfile&a…

恒峰智慧科技—森林消防泵,你了解多少?

在我们的日常生活中&#xff0c;森林火灾是一种非常危险的现象。为了保护森林资源和人民的生命财产安全&#xff0c;森林消防泵成为了一种非常重要的设备。那么&#xff0c;你对森林消防泵了解多少呢&#xff1f;本文将为您详细介绍森林消防泵的操作步骤、注意事项以及维护保养…

第⑮讲:Ceph集群管理与监控操作指南

文章目录 1.查看集群的状态信息2.动态的查看集群的状态信息3.查看集群的利用率4.查看OSD的资源利用率5.查看OSD的列表6.查看各组件的状态7.查看集群的仲裁信息8.查看/修改集群组件sock的配置参数 1.查看集群的状态信息 通过集群状态信息可以看到集群的健康状态、各个组件的运行…

Spark 中的分桶分化

Spark 中的分桶分化 Bucketing是 Spark 和 Hive 中用于优化任务性能的一种技术。在分桶桶&#xff08;集群列&#xff09;中确定数据分区并防止数据混洗。根据一个或多个分桶列的值&#xff0c;将数据分配给预定义数量的桶。 分桶有两个主要好处&#xff1a; 改进的查询性能&…

jvm(JVM快速入门、stack栈、堆、GC垃圾回收、Arthas)

文章目录 1. JVM快速入门1.1. 结构图1.2. 类加载器ClassLoader1.3. 执行引擎Execution Engine1.4. 本地接口Native Interface1.5. Native Method Stack1.6. PC寄存器(程序计数器)1.7. Method Area方法区 2. stack栈3. 堆3.1. 堆体系概述3.1.1. 新生区3.1.2. 老年代3.1.3. 永久代…

2024统计建模:大数据与人工智能时代的统计研究

文章目录 题目解读你需要具备的知识点课题推荐视频分析 题目解读 主要做的是“大数据”与“人工智能”。 其中“大数据”所涉及的的第一个就是大量的数据&#xff0c;数据从哪里来&#xff1f;拿到数据后&#xff0c;我们需要做基本的数据分析&#xff0c;如何对大量的数据进…

【UnityShader]使用Shader将图片进行水平/竖直镜像翻转

一、需求 在开发时从很多地方取出来的图片可能并不是图像原本的模样&#xff0c;可能是被水平或者竖直镜像翻转后的图形&#xff0c;这时候我们要将图片再次镜像回来&#xff0c;只需要一个小小的Shader即可。 二、实现 下面是镜像翻转Shader的思路: 一般来说我们在顶点着色…

C++奇迹之旅:从0开始实现日期时间计算器

文章目录 &#x1f4dd;前言&#x1f320; 头文件Date.h&#x1f309;日期计算函数&#x1f320;前后置&#x1f309;前后置-- &#x1f320;两对象日期相减&#x1f309;自定义流输入和输出 &#x1f309; 代码&#x1f309; 头文件Date.h&#x1f320;Date.cpp&#x1f309; …

ECALL介绍

一、ECALL关键词介绍 ECALL:Emergency Call,紧急呼叫 PSTN:Public Switched Telephone Network MSD:Minimum Set of Data PLMN: Public Land Mobile Network PASP:Public Safety Answering Point IVS: in-vehicle system(车载系统)是内部的调制解调器,以全双工的方式…

【漏洞复现】手机卡号推广商城 login.php接口处存在 SQL 注入漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

STM32应用开发教程进阶--UART串口重定向(printf)

实现目标 1、掌握STM32 HAL库的串口重定向 2、具体目标&#xff1a;1、实现printf “打印”各种常用的类型的数据变量 一、串口“打印” UART串口通信协议是我们常用的通信协议&#xff08;UART、I2C、SPI等&#xff09;之一&#xff0c;全称叫做通用异步收发传输器&#xf…

卷积神经网络CNN入门

卷积神经网络应用领域 因为卷积神经网络主要应用场景就是计算机视觉任务&#xff0c;因此有必要简单介绍一下CV领域发展情况&#xff1a; 可以发现&#xff0c;在 ImageNet 图像数据集中分析图像的错误率十年间已经被深度学习给降低到了比人类&#xff08;HuMan&#xff09;识…

阿里云短信渠道专属优惠价格,全网最便宜入口

阿里云短信渠道专属优惠&#xff0c;1000条短信30元、2000条短信优惠价格60元、3000元短信套餐包价格90元、5000短信优惠150元&#xff0c;活动页面 aliyunbaike.com/go/duanxin 链接打开如下图&#xff1a; 阿里云短信渠道专属优惠价格 阿里云短信支持国内快速发送验证码、通…

算法——BFS算法

1. 什么是BFS算法 BFS&#xff08;广度优先搜索&#xff0c;Breadth-First Search&#xff09;算法是一种用于图和树等数据结构中进行搜索的基本算法。它从指定的起始节点开始&#xff0c;逐层地向外扩展搜索&#xff0c;直到找到目标节点或遍历完整个图。 BFS算法的基本思想是…