用C语言画个简单表格

今天见到个题目,就把他做了,题目如下:

在图形环境中很容易做出漂亮的表格。但在控制台环境中就比较困难了。有的时候可以用一些符号大略地模拟:(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。

代码如下:

#include<stdio.h>
#include<string.h>
char S[100][1000]={' '};//声明表为全局变量
int s1=0;
void chart(int n,int a[],int m);
int main()
{
int n;
int M1[40]={0},M2[40]={0},M3[40][100]={0};
int i,j,k,k1,k2,max=0,col,l;
char s[30][1000];
scanf("%d",&n);
getchar();//注意,必须得有这个来接收回车符
//
for(i=0;i<n;i++)
gets(s[i]);

//求最大列数
for(i=0;i<n;i++)
{
l=strlen(s[i]);
for(j=0;j<l;j++)
{
if(s[i][j]==',')
M1[i]++;
}
if(M1[i]>max)
{
max=M1[i];
}
}
col=++max;

//求每列最大宽度
    //1.先求每个单元的长度,赋给M3[i][j]中
for(i=0;i<n;i++)
{
l=strlen(s[i]);
k=0;
for(j=0;j<l;j++)
{
if(s[i][j]!=',')
{
M3[i][k]++;
}
if(s[i][j]==',')
k++;

} //for2
}//for1
//2.找每列最大的赋予M2[]
for(j=0;j<col;j++)
{
max=0;
for(i=0;i<n;i++)
{
if(M3[i][j]>max)
max=M3[i][j];
}
M2[j]=max;
}

//表格
chart(n,M2,col);

//输入数据
for(i=0;i<n;i++)
{
k1=0;
k2=0;
k=0;
l=strlen(s[i]);
for(j=0;j<l;j++)
{
S[2*i+1][k2+1]=s[i][j];
if(s[i][j+1]==',')
{
k1=k1+M2[k]+1;
k2=k1;
k++;
j++;
}
else
k2++;
}
}
//输出表格
for(i=0;i<=2*n;i++)
{
for(j=0;j<s1;j++)
printf("%c",S[i][j]);
printf("\n");
}

return 0;
}

void chart(int n,int a[],int m)//行数 每列的最大长度数组
{
int i,j,k;
int s;
s1=m+1;
for(i=0;i<m;i++)
s1+=a[i];

for(i=0;i<=2*n;i++)
{
//输出奇数行
if(i%2==0)
{
s=0;
k=0;
for(j=0;j<s1;j++)
{
if(j==s)
{
S[i][j]='+';
s+=a[k];
s++;
k++;
}
else
S[i][j]='-';
}//for
} //if
//输出偶数行
else
{
s=0;
k=0;
for(j=0;j<s1;j++)
{
if(j==s)
{
S[i][j]='|';
s+=a[k];
s++;
k++;
}
}
}

} //for

}

OK!

一个例子如下,O(∩_∩)O~



posted @ 2012-04-02 15:36  龙杉老师  阅读(16346)  评论(0编辑  收藏  举报