• 用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~



  • 相关阅读:
    iaas,paas,saas理解
    July 06th. 2018, Week 27th. Friday
    July 05th. 2018, Week 27th. Thursday
    July 04th. 2018, Week 27th. Wednesday
    July 03rd. 2018, Week 27th. Tuesday
    July 02nd. 2018, Week 27th. Monday
    July 01st. 2018, Week 27th. Sunday
    June 30th. 2018, Week 26th. Saturday
    June 29th. 2018, Week 26th. Friday
    June 28th. 2018, Week 26th. Thursday
  • 原文地址:https://www.cnblogs.com/hsqdboke/p/2429988.html
Copyright © 2020-2023  润新知