打印斜三角數對

今天在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;
}

測試如下: 

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