画表格


画表格

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

 1 #include<stdio.h>
 2 #include<string.h>
 3 typedef struct{
 4     char s[100];
 5     int len;//串的长度 
 6 }UnitGe;//单元格
 7 typedef struct {
 8     UnitGe dyg[40];//最多40个 
 9     int num;//单元格的个数 
10 }Hang;
11 Hang h[30];
12 int max[40]={0};
13 
14 void fun(char *s,int j)//j表示行 
15 {
16     h[j].num=0;
17     int len=strlen(s),k=0;
18     *(s+len)=','; //在串的结束标记出,加, 
19     for(int i=0;i<=len;i++)
20     {
21         if(s[i]!=',')
22         {
23             h[j].dyg[h[j].num].s[k++]=s[i];
24         }
25         else
26         {
27             h[j].dyg[h[j].num].s[k]=0;//形成一个串
28             h[j].dyg[h[j].num].len=k;
29             if(max[h[j].num]<k)
30                 max[h[j].num]=k;
31             h[j].num++;
32             k=0;
33         }
34     }
35 } 
36 void fenxi(char s[][100],int rows)
37 {
38     for(int i=0;i<rows;i++)
39     {
40         fun(s[i],i);
41     }
42 }
43 
44 void print(char *s,int n)
45 {
46     int j=n-strlen(s);
47     printf("%s",s);
48     for(int i=0;i<j;i++) 
49         putchar(' ');
50     putchar('|');
51 }
52 int getCols(int n)
53 {
54     int count=h[0].num;
55     for(int i=1;i<n;i++)
56         if(count<h[i].num)
57             count=h[i].num;
58     return count;
59 }
60 void draw(int col)
61 {
62     putchar('+');
63     for(int i=0;i<col;i++)
64     {
65         for(int j=1;j<=max[i];j++)
66             putchar('-');
67         putchar('+');
68     }
69     putchar('\n');
70     
71 }
72 int main()
73 {
74     char s[30][100];
75     int rowCount,colCount;//行数
76     printf("请输入行数:");
77     scanf("%d",&rowCount);
78     fflush(stdin);
79     for(int i=0;i<rowCount;i++) 
80         gets(s[i]);
81     fflush(stdin);
82     /////////////////////////
83     fenxi(s,rowCount);//分析 
84     colCount=getCols(rowCount);
85     //printf("cols=%d\n",colCount);
86     for(int i=0;i<rowCount;i++)
87     {
88         draw(colCount);//画边框 
89         //输出数据
90         putchar('|');
91         for(int j=0;j<colCount;j++)
92             print(h[i].dyg[j].s,max[j]);
93         printf("\n");
94     }
95     draw(colCount);
96     getchar();
97     return 0;
98 }

 

这题这么简单,居然费了我那么长时间。主要时间都花在是否那个逗号的调试上

posted @ 2013-05-02 18:01  Please Call me 小强  阅读(359)  评论(0编辑  收藏  举报