Accelerated Cpp Chapter2 greeting装框的for while if else写法

这篇博客详细解析了一段C++代码,该代码用于获取用户输入的名字并输出被*包围的问候语。作者首先阐述了程序设计思路,然后逐步解释了代码的各个部分,包括使用iostream和string库,定义变量,输入输出,以及利用for和while循环构建问候语的装框效果。博客重点讨论了循环结构和条件判断的应用,旨在巩固编程思维和循环控制语句的使用。
摘要由CSDN通过智能技术生成

这章的代码还是有点小折磨,废话不多说直接上。对着分析。

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

int main()
{
	//输出提示
	cout << "What is your name?" << endl;

	//要输入name变量
	string name;
	cin >> name;

	//要构建greeting
	const string greeting = "Hello, " + name + "!";

	//定义空白
	const int pad = 1;
	//定义行rows,列cols
	const int rows = 2 * pad + 3;
	const string::size_type cols = greeting.size() + pad * 2 + 2;

	//输出空白行分隔输入与输出
	cout << endl;

	//定义当前输入了0行r,
	for (int r = 0; r != rows; ++r) {
		string::size_type c = 0;//为保证c是可修改的,这里不可以加const※※※
		while (c != cols) {
		

			if (r == pad + 1 && c == pad + 1)/*当行与列都为pad+1个时,该输出greeting*/ {
				cout << greeting;
				c += greeting.size();
			
			}
			else {
				//我们在边界上吗?
				if (r == 0 || r == rows - 1 || c == 0 || c == cols - 1) 
					cout << "*";//这里不能输入endl,不然就换行了
				else 
					cout << " ";//这里不能输入endl,不然就换行了
					++c;//因为不处于边界,所以需要每输出一个空格就加一位;且注意这里的++c是对if和eles都起作用的,不然if的“*”输出之后,c没有自加,会一直是0,就永远到达不了cols。
				}
				}//while的{}相当于一行。记得要有++c,以增加c的值。
		cout << endl;//这个换行是为了让while执行循环结束后,c=cols后进行换行。
	}
	
	return 0;
}

构建的思路是:先确定自己要输出一个什么样子的程序,然后根据目标来进行编写。

目标是输出一个问题“你叫什么名字?”,在用户作出回答后,输出一句被*框起来的问候语:“你好,某某!”

首先,为了输出这个问题,我要用到cout,以及定义一个string类型的变量name,用cin>>name来读取用户的输入值。

之后我需要写出我的问候语内容,为了方便“装框”这个过程,我将这句包含了变量name的问候语定义为一个变量greeting。

接下来,为了分开输入name与接下来的问候语,我输出了一个空行。

剩下就是对greeting进行装框的环节。构思是通过for,while循环语句来达到在框的边界上生成*,在框内部除了greeting的地方输出空格,并在该输出greeting的地方输出greeting。

行r,列c的初始值都定义为0(即下限),上限值根据框图的输出目标定义为rows=pad*2+3(两行*一行greeting);列cols的上限定义为2+pad*2+greeting.size()/*就是greeting所占的字符长度。*/。

为了简化程序结构,使用for语句对行进行循环,即for(初始值 condition;expression){   }。通过r!=rows来构造一个左闭右开的r区间,在r通过循环到达rows-1时,执行了++r操作,使r!=rows这一判断为假,从而终止循环。自动的让r从0输出到rows这个数值,停止输出。

为什么能用for对r进行简化?

我的思考是:因为每一行(r)还是由一个个字符(c)构成的,在书写循环时,要将大的循环尽量放在外面。

因此先用for循环把r的从0到rows写出来,再在for后面的花括号中增加每一行r是如何由c构成的。包括了判断是否在边界上,从而在合适的地方输出空格或*;判断什么时候输出greeting。以及最重要的,进行c的输出后,记得对c加上相应的位数。以让c的值增加以推进循环结束。

以及,while语句后的{}视作是一行内容,因为while语句的判断条件是c!=cols,因此在while后面要加上换行命令cout<<endl;否则无法切换行数,使r增加。

在if else语句后面,为什么有时候可以加{ },有时候不用加?

因为如果在if else后面加上{ }的话,则if语句控制{ }内的所有statement,如果没有{ }的话,则if语句只能控制最近的一行。

主要难点在于:

1.整个程序的编写思路,先确认自己的输出目标是什么,再根据目标进行分析,一步步编写出程序。(先确认需要输出的话,问句和greeting;需要构建的变量name;怎么对greeting进行装框,构建pad,r,c,rows,cols,使用什么方法做到框的构建)

2.用到了for和while循环的嵌套。先写出一个比较宏观的for循环(里面规定了行r的从0到rows循环),再在{}中嵌套while循环,以描述具体每一行的c应该输出什么,在c=cols的时候进行换行,此类更加细致的东西。)

继续加油,明天把本章的练习拿下,巩固for while的使用和编程思路的培养。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值