学习的一些误区

今天突然想到一个简单的小题目,但是一下子却没想出好的实现办法。题目就是打印菱形。好多人应该做过。

我的第一反映竟然是陷入误区了。因为*前面是有空格的。所以要想办法输出空格。当时我就纠结了。怎么才能做到。

当时我想到了三重循环,但是一想感觉不现实。后来我想到了用域宽来设置,这个在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;
}

这个题目啥高级东西都没用到,但是警戒意义很大,故此记录下。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值