这章的代码还是有点小折磨,废话不多说直接上。对着分析。
#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的使用和编程思路的培养。