打印斜三角数对

今天在CSDN论坛上看到的一个帖子,要求实现如下格式数对:

                   {3,1} {4,1} {5,1} {6,1}

          {2,2} {3,2} {4,2} {5,2}

{1,3} {2,3} {3,3} {4,3}

{1,4} {2,4} {3,4}

{1,5} {2,5}

{1,6}

其中起始列数可以设定。应该说,数对本身很有规律,开始以为很容易,试过之后才发现,要想写好,其实还是需要花些功夫琢磨。这里,我为了输出美观,做了一些额外工作,并加入了对任意行数的输出格式自适应的控制代码,并对用户输入进行了简单的检测。不过对于非法输入还是无能为力,类似正则表达式的方法应该是个好的思路,日后加以改进。好了,不多说了,源代码如下:

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

//统计整数位数的个数
int DigitsCount(int digitNumber)
{
	int Num=0;
	while(digitNumber !=0)
	{
		Num++;
		digitNumber /= 10;
	}
	return Num;
}

//输出数对
void PrintDataPair(int row,int startCol)
{
	if(startCol<1)
	{
		cout<<"\n输入列数不能小于等于0!"<<endl<<endl;
		return;
	}else if(startCol>row)
	{
		cout<<"\n起始列数不能大于总列数"<<endl<<endl;
		return;
	}

	cout<<endl;

	int i,j,k;
	//自适应格式控制
	int width = DigitsCount(row);
    
	//循环每一行
	for(i=0;i<row;i++)  
	{
		// 打印空格,当j=0不打印
		for(j=0;j<startCol-i-1; j++) 
			cout<<setw(4+width*2)<<" ";
        //如果每行之前有空格,输出列数固定
		if(j!=0)       
		{
		  for(k=0;k<row-startCol+1;k++)                
			  cout<<"{"<<left<<setw(width)<<startCol-i+k<<","<<right<<setw(width)<<i+1<<"} ";
		}else {
		  //如果每行没有空格,输出列数逐行减1,直至结束。
		  for(k=0;k<row-i;k++)
			  cout<<"{"<<left<<setw(width)<<k+1<<","<<right<<setw(width)<<i+1<<"} ";
		}
		cout<<endl<<endl; //输出完一行, 进行换行
	}
}

int main()
{
	int rows;
	int startPos;
	cout<<"请输入打印的行数和起始列,如: 5 3 "<<endl<<endl;
	cout<<"->";
	cin>>rows>>startPos;
	while(1)
	{
			PrintDataPair(rows,startPos);
			cout<<"->";
			cin>>rows>>startPos;
	}
	return 0;
}

测试如下: 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章