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