zoukankan      html  css  js  c++  java
  • 用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~



  • 相关阅读:
    安卓官方ViewPager与android.support.design.widget.TabLayout双向交互联动切换 。
    安卓系统设置选项的框架。
    Android动画效果生动有趣的通知NiftyNotification(Android Toast替代品)
    Android第三方开源对话消息提示框:SweetAlertDialog(sweet-alert-dialog)
    百度地图可视化定位效果,可以输入目的地定位。
    利用百度地图开源sdk获取地址信息。
    可伸缩的textview。
    两个activity之间传递数据用startActivityForResult方法。
    Android 主页面顶部栏的通知Notification ,可以自定义通知消息栏的风格,并且点击通知栏进人本程序。
    获取手机通讯录放入PinnedSectionListView中,按名字首字母排序,并且实现拨打电话功能。
  • 原文地址:https://www.cnblogs.com/hsqdboke/p/2429988.html
Copyright © 2011-2022 走看看