C++实践参考解答 输出星号图

【项目:输出星号图】自选下面的几个图案,编程序输出(自选两个完成,其他的想想思路即可)。

 


(c)“向下的等腰三角”详解

将一个图,看作为6行,完成了第一级的分解,设计的算法框架为:

i=1;
While(i<=6)  //需要输出6行
{
  输出第i行;
  换行;
  ++i;
}

  对于“输出第i 行”的任务,可以进行细化:

先输出若干空格(多少个空格?第1行0个,第2行1个,第3行2……第6行5个);
再输出若干个星号(多少星号?第一行11个,第2行9个……第6行1个)

  其实把空格数和星号数和表示行数的变量 i  挂起钩来,上面的“若干个”可以用  表示出来,简单地做些推算可以写出式子。

  对于“输出第i行”的任务,可以进行细化:

先输出 i-1 个空格; 
再输出 2*(6-i)+1 个星号; 

  于是,算法就是:

i=1;
While(i<=6)  //需要输出6行
{
  //输出第i行
  先输出 i-1 个空格; 
  再输出 2*(6-i)+1 个星号; 
  换行;
  ++i;
}

  将输出若干个空格/星号等写成代码,得到了下面的代码

//参考解答一
#include <iostream>
using namespace std;
int main( )
{
	int i,j;
	i=1;
	while(i<=6)  //需要输出6行
	{
		//输出第i行
		for(j=1; j<=i-1; ++j)
			cout<<" ";
		for(j=1; j<=2*(6-i)+1; ++j)
			cout<<"*";
		cout<<endl;
		++i;
	}
	return 0;
}


  下面给出程序的另一种写法,其中引入了两个变化:(1)三角的行数可以由变量n控制;(2)最外层控制输出n行的循环改为了for循环,实际上,内层的循环用while也无不可。

//参考解答二
#include <iostream>
using namespace std;
int main( )
{
	int i,j,n=15; //用n来灵活对待可能的行数
	for(i=1;i<=n;++i)  //将上一种解法中的while循环改造为for循环
	{
		//输出第i行
		for(j=1; j<=i-1; ++j) //内层的这个for循环可以写作while循环
			cout<<" ";
		for(j=1; j<=2*(n-i)+1; ++j) //这儿也可以用其他循环,可尝试改造
			cout<<"*";
		cout<<endl;
	}
	return 0;
}

  下面的程序采用的是让控制循环的变量由大变小(与三角上大下小呼应)的思路,相应地,只需要改变控制空格数和星号数的式子即可

//参考解答三
#include <iostream>
using namespace std;
int main( )
{
	int i,j,n=6; 
	for(i=n;i>=1;--i) //i由大变小
	{
		//输出第i行
		for(j=1; j<=n-i; ++j) //关键:输出的是n-i个空格
			cout<<" ";
		for(j=1; j<=2*i-1; ++j) //关键:输出的是2*i-1个星号
			cout<<"*";
		cout<<endl;
	}
	return 0;
}

  其他的星号图,思路类似,相信同学们可以独立做出来。


所有三角全解参考:



(1)

要输出的是:


代码:

#include <iostream>		
using namespace std;	
int main( )
{
	int i,j,n=6; 
	for(i=n;i>=1;--i) //一共要输出n行
	{
		//输出第i行
		for(j=1; j<=2*i-1; ++j) //输出2*i-1个星号
			cout<<"*";
		cout<<endl;
	}
	return 0;	
}


(2)

要输出的是:


代码:

#include <iostream>		
using namespace std;	
int main( )
{
	int i,j,n=6; 
	for(i=1;i<=n;++i) //一共要输出n行
	{
		//输出第i行
		for(j=1; j<=n-i; ++j) //输出n-i个空格
			cout<<" ";
		for(j=1; j<=i; ++j) //输出i个星号
			cout<<"*";
		cout<<endl;
	}
	return 0;	
}


(3)

要输出的是:


代码:

#include <iostream>
using namespace std;
int main( )
{
	int i,j,n=6; 
	for(i=n;i>=1;--i) //i由大变小
	{
		//输出第i行
		for(j=1; j<=n-i; ++j) //关键:输出的是n-i个空格
			cout<<" ";
		for(j=1; j<=2*i-1; ++j) //关键:输出的是2*i-1个星号
			cout<<"*";
		cout<<endl;
	}
	return 0;
}


(4)

要输出的是:


代码:

#include <iostream>		
using namespace std;	
int main( )
{
	int i,j,n=6; 
	for(i=1;i<=n;++i) //一共要输出n行
	{
		//输出第i行
		for(j=1; j<=n-i; ++j) //输出n-i个空格
			cout<<" ";
		for(j=1; j<=2*i-1; ++j) //输出2*i-1个星号
			cout<<"*";
		cout<<endl;
	}
	return 0;	
}


(5)

要输出的是:


代码:这一个稍微麻烦一些在于,第1行和最后一行单独处理,而中间的n-2行则有规律:若干空格、1个星号、若干空格、1个星号

#include <iostream>		
using namespace std;	
int main( )
{
	int i,j,n=6; 
	//输出第一行:n-1个空格和1个星号并换行
	for(j=1; j<=n-1; ++j) //输出n-i个空格
		cout<<" ";
	cout<<"*"<<endl;

	//再输出中间的n-2行
	for(i=2;i<=n-1;++i) //一共要输出n-2行
	{
		//输出第i行
		for(j=1; j<=n-i; ++j) //输出n-i个空格
			cout<<" ";
		cout<<"*";  //再输出一个星号
		for(j=1; j<=2*i-3; ++j) //然后输出2*i-3个空格
			cout<<" ";
		cout<<"*"<<endl; //输出一个星号后本行结束,换行
	}

	//输出最后一行:2*n-1个星号
	for(j=1; j<=2*n-1; ++j) 
		cout<<"*";
	cout<<endl;
	return 0;	
}


(6)

要输出的是:


参考代码:

#include <iostream>		
using namespace std;	
int main( )
{
	int i,j,n=6;  //n代表上三角行数
	//先输出上三角
	for(i=1;i<=n;++i) //输出n行
	{
		//输出第i行
		for(j=1; j<=n-i; ++j) //输出n-i个空格
			cout<<" ";
		for(j=1; j<=2*i-1; ++j) //输出2*i-1个星号
			cout<<"*";
		cout<<endl;
	}
	//下面输出下三角
	for(i=1;i<=n-1;++i) //输出n-1行 
	{
		//输出第i行
		for(j=1; j<=i; ++j) //输出i个空格
			cout<<" ";
		for(j=1; j<=2*(n-i)-1; ++j) //输出2*i-1个星号
			cout<<"*";
		cout<<endl;
	}
	return 0;	
}



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

迂者-贺利坚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值