今天突然想到一个简单的小题目,但是一下子却没想出好的实现办法。题目就是打印菱形。好多人应该做过。
我的第一反映竟然是陷入误区了。因为*前面是有空格的。所以要想办法输出空格。当时我就纠结了。怎么才能做到。
当时我想到了三重循环,但是一想感觉不现实。后来我想到了用域宽来设置,这个在c++中可以很好的实现。
但是我曾经做过java中的打印,当时我还不知道java中是否有域宽控制的函数,但是我当时也做出来了,只是纯粹的循环。
我当时根本就没有想到循环里面的顺序结构。
后来我想到一点。在文件操作里面,有一个可以控制指针位置的函数,比如seekg()函数。当是我就想用两个循环,但是在用第二个循环输出
*号的时候,先把屏幕输出的起始位置设置回第一行第一列。那么不就可以了嘛。但是我没找到这个函数。
最后我百度了下,很快发现了解法。发现只是一个简单的循环,里面加上两个循环,但是两个循环的排列是顺序结构,当时我就怒了,
误区太严重了。因为长期的写循环都是嵌套,一时间都忽略了循环里面的嵌套的关系。
总而言之:不能灵活运用三种结构,还有一些思维误区。虽然这个题目很严重,但是警戒意义却是很大。
#include<iostream>
using namespace std;
int main(){
for (int i = 0; i < 3; i++){
for (int j = 0; j < 2 - i; j++){
cout <<' ';
}
for (int k = 0; k < 2 * i + 1; k++){
cout << '*';
}
cout << endl;
}
system("pause");
return 0;
}
上面这个是循环的做法,下面给一下域宽的做法:
#include<iostream>
#include<iomanip>
using namespace std;
int main(){
for (int i = 0; i <5; i++){
cout.width(5 - i);
for (int j = 0; j < (2 * i) + 1; j++){
cout<< '*';
}
cout << endl;
}
for (int i = 3; i >=0; i--){
cout.width(5- i);
for (int j = 0; j < (2 * i) + 1; j++){
cout << '*';
}
cout << endl;
}
system("pause");
return 0;
}
这个题目啥高级东西都没用到,但是警戒意义很大,故此记录下。