画表格
在图形环境中很容易做出漂亮的表格。但在控制台环境中就比较困难了。有的时候可以用一些符号大略地模拟:(word文档中可能不整齐,拷贝到记事本中看)
+-------+------+
|abc |xyz=tt|
+-------+------+
|hellomm|t2 |
+-------+------+
本题目要求设计一个程序,把用户输入的内容用这种“准表格”的方式展现出来。具体的要求是:
用户输入的第一行是一个整数,表示接下来有多少行信息。接下来的每行由若干单元组成。单元间用逗号分开。
程序输出:用表格方式重新展现的输入内容。
例如:
用户输入:
3
cat,dog,good-luck
1,2,5
do not use,,that
则程序输出:(word文档中可能不整齐,拷贝到记事本中看)
+----------+---+---------+
|cat |dog|good-luck|
+----------+---+---------+
|1 |2 |5 |
+----------+---+---------+
|do not use| |that |
+----------+---+---------+
从中不难看出:
两个连续的逗号表示中间有一个内容为空的单元
列的数目由最大的单元数的那行决定
列的宽度由同列的最宽的单元决定
单元格中的信息左对齐
可以假设:用户输入的最大行数为30,可能的最多列数为40。
感觉这道题挺坑的,因为一般的时候就用printf中的一些函数,谁会用cout啊,但是今天就摊上事了,并且是摊上大事了,因为好像printf不能填充除了0以外的字符,所以只能是重操旧业,用了我的”母语“,但是越是娘家语言,也是不会用看,用了三四个小时被坑在这里面,最终把这个cout的输出格式有了一点研究,成功了。。。
注意这里面的gets、find、substr这几个函数的使用 。。。
#include <iostream> #include <iomanip> #include <cstdio> using namespace std; int main (){ string str[35][45],tempstr; int n,list,a[45]={0},strrow=0,strlist=0,strle[45]={0}; char ch[100]; cin>>n; getchar();//注意收取回车 for(int i=0;i<n;i++){ gets(ch); tempstr=ch; int now=0,xx = tempstr.find(','); while(xx!=-1){ str[strrow][strlist++]=tempstr.substr(now,xx-now); if(xx-now>strle[strlist-1]) strle[strlist-1]=xx-now; now=xx+1; xx=tempstr.find(',',now); } str[strrow][strlist++]=tempstr.substr(now); if(tempstr.length()-now>strle[strlist-1]) strle[strlist-1]=tempstr.length()-now; list=strlist; strrow++; strlist=0; } for(int i=0;i<strrow;i++){ cout<<'+'<<setiosflags(ios::right)<<setfill('-'); for(int j=0;j<list;j++) cout<<setw(strle[j]+1)<<'+'; cout<<endl<<'|'<<setiosflags(ios::left)<<setfill(' '); for(int j=0;j<list;j++) cout<<setw(strle[j])<<str[i][j]<<'|'; cout<<endl; } cout<<'+'<<right<<setfill('-');//输出最后一行--------+------ for(int j=0;j<list;j++) cout<<setw(strle[j]+1)<<'+'; return 0; }运行结果不正确,恩,是的,这个代码确实是有问题的,就是因为字符的左右对齐这个函数出了问题。
下面的代码修改了这个错误,错误详情查看http://blog.csdn.net/u014665013/article/details/44781973
#include <iostream> #include <iomanip> #include <cstdio> using namespace std; int main (){ string str[35][45],tempstr; int n,list,a[45]={0},strrow=0,strlist=0,strle[45]={0}; char ch[100]; cin>>n; getchar();//注意收取回车 for(int i=0;i<n;i++){ gets(ch); tempstr=ch; int now=0,xx = tempstr.find(','); while(xx!=-1){ str[strrow][strlist++]=tempstr.substr(now,xx-now); if(xx-now>strle[strlist-1]) strle[strlist-1]=xx-now; now=xx+1; xx=tempstr.find(',',now); } str[strrow][strlist++]=tempstr.substr(now); if(tempstr.length()-now>strle[strlist-1]) strle[strlist-1]=tempstr.length()-now; list=strlist; strrow++; strlist=0; } for(int i=0;i<strrow;i++){ cout<<'+'<<setiosflags(ios::right)<<setfill('-'); for(int j=0;j<list;j++) cout<<setw(strle[j]+1)<<'+'; cout<<endl<<'|'<<resetiosflags(ios::right)<<setiosflags(ios::left)<<setfill(' ');//这里用第一个re..()对对齐方式做了重置 for(int j=0;j<list;j++) cout<<setw(strle[j])<<str[i][j]<<'|'; //为什么在这里不用加重置对齐方式现在还未知。 cout<<endl; } cout<<'+'<<right<<setfill('-');//输出最后一行--------+------ for(int j=0;j<list;j++) cout<<setw(strle[j]+1)<<'+'; return 0; }一不小心,发现了一个更好的方法,并且更加容易记忆了...
#include <iostream> #include <iomanip> #include <cstdio> using namespace std; int main (){ string str[35][45],tempstr; int n,list,a[45]={0},strrow=0,strlist=0,strle[45]={0}; char ch[100]; cin>>n; getchar();//注意收取回车 for(int i=0;i<n;i++){ gets(ch); tempstr=ch; int now=0,xx = tempstr.find(','); while(xx!=-1){ str[strrow][strlist++]=tempstr.substr(now,xx-now); if(xx-now>strle[strlist-1]) strle[strlist-1]=xx-now; now=xx+1; xx=tempstr.find(',',now); } str[strrow][strlist++]=tempstr.substr(now); if(tempstr.length()-now>strle[strlist-1]) strle[strlist-1]=tempstr.length()-now; list=strlist; strrow++; strlist=0; } for(int i=0;i<strrow;i++){ cout<<'+'<<right<<setfill('-'); for(int j=0;j<list;j++) cout<<setw(strle[j]+1)<<'+'; cout<<endl<<'|'<<left<<setfill(' '); for(int j=0;j<list;j++) cout<<setw(strle[j])<<str[i][j]<<'|'; cout<<endl; } cout<<'+'<<right<<setfill('-');//输出最后一行--------+------ for(int j=0;j<list;j++) cout<<setw(strle[j]+1)<<'+'; return 0; }
终结版的代码,因为我发现使用在一道题里使用两种对齐方式因为函数的特点,所以有点麻烦,所以以后尽量不用两种,比如下面的完美的解决了这个问题。
#include <iostream> #include <iomanip> #include <cstdio> using namespace std; int main (){ string str[35][45],tempstr; int n,list,a[45]={0},strrow=0,strlist=0,strle[45]={0}; char ch[100]; cin>>n; getchar();//注意收取回车 for(int i=0;i<n;i++){ gets(ch); tempstr=ch; int now=0,xx = tempstr.find(','); while(xx!=-1){ str[strrow][strlist++]=tempstr.substr(now,xx-now); if(xx-now>strle[strlist-1]) strle[strlist-1]=xx-now; now=xx+1; xx=tempstr.find(',',now); } str[strrow][strlist++]=tempstr.substr(now); if(tempstr.length()-now>strle[strlist-1]) strle[strlist-1]=tempstr.length()-now; list=strlist; strrow++; strlist=0; } for(int i=0;i<strrow;i++){ for(int j=0;j<list;j++) cout<<setfill('-')<<setw(strle[j]+1)<<setiosflags(ios::left)<<'+'; cout<<'+'<<endl<<'|'; for(int j=0;j<list;j++) cout<<setw(strle[j])<<setfill(' ')<<str[i][j]<<'|'; cout<<endl; } cout<<setfill('-'); for(int j=0;j<list;j++) cout<<setw(strle[j]+1)<<'+'; cout<<'+'; return 0; }