今天見到個題目,就把他做了,題目如下:
在圖形環境中很容易做出漂亮的表格。但在控制臺環境中就比較困難了。有的時候可以用一些符號大略地模擬:(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#include
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;igets(s[i]);
//求最大列數 for(i=0;i{
l=strlen(s[i]);
for(j=0;j{
if(s[i][j]==',')
M1[i]++;
}
if(M1[i]>max)
{
max=M1[i];
}
}
col=++max;
//求每列最大寬度
//1.先求每個單元的長度,賦給M3[i][j]中 for(i=0;i{
l=strlen(s[i]);
k=0;
for(j=0;j{
if(s[i][j]!=',')
{
M3[i][k]++;
}
if(s[i][j]==',')
k++;
} //for2 }//for1//2.找每列最大的賦予M2[] for(j=0;j {
max=0;
for(i=0;i{
if(M3[i][j]>max)
max=M3[i][j];
}
M2[j]=max;
}
//表格 chart(n,M2,col);
//輸入數據 for(i=0;i{
k1=0;
k2=0;
k=0;
l=strlen(s[i]);
for(j=0;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;jprintf("%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;is1+=a[i];
for(i=0;i<=2*n;i++)
{
//輸出奇數行 if(i%2==0)
{
s=0;
k=0;
for(j=0;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{
if(j==s)
{
S[i][j]='|';
s+=a[k];
s++;
k++;
}
}
}
} //for
}
OK!
一個例子如下,O(∩_∩)O~