今天在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;
}
測試如下: