用户输入一个表格的文本,请按如下格式输出:
1. 用'-'表示横线,'|'表示竖线,'+'表示横竖线的交点 2. 列宽为当前列最长字符串长度+2 3. 每列的对齐方式相同,一共有三种,分别为靠左对齐,居中对齐,靠右对齐,分别用'l','c','r'表示。 a. 靠左对齐,字符串左端距离边线1个空格; b. 居中对齐,字符串距离边线左和右空格数的差不超过1,且左边空格数小于等于右边空格数。 c. 靠右对齐,字符串右端距离边线1个空格;输入
第一行是一个整数T(1≤T≤100) , 表示样例的个数。
每个样例的第1行是两个整数r,c(1≤r,c≤10),表示表格的行和列数。
第2行是c个字符,字符只由'l','c','r'三种组成,依次表示对应列的对齐方式。
以后的r行,每行c个字符串,表示对应行列的单元格内容,字符串只含英文字母,数字,长度不超过20个字符。输出
按格式依次输出每个样例的的结果。
样例输入
1 3 5 lcccr Name English Math Chinese Total Alice 100 85 75 260 Bob 85 100 85 270样例输出
+-------+---------+------+---------+-------+ | Name | English | Math | Chinese | Total | +-------+---------+------+---------+-------+ | Alice | 100 | 85 | 75 | 260 | +-------+---------+------+---------+-------+ | Bob | 85 | 100 | 85 | 270 | +-------+---------+------+---------+-------+
解题思路:这题没啥难度,只要你肯烧脑,多想两遍就没啥问题。写模拟题的时候多备两瓶霸王吧。
AC代码:
#include <stdio.h>
#include <string.h>
int wid,len,cnt,formR,formC;
char ins[15],element[105][25],form[15][270];
void henl(int s,int t)
{
len = strlen(element[++cnt]);
form[s][++wid] = ' '; // 靠左,先打印一个空格
for (int i = 0; i < len; i ++)
form[s][++wid] = element[cnt][i]; // 然后打印 该元素
for (int i = 0; i < t-1-len; i ++) // 用空格补齐
form[s][++wid] = ' ';
}
void henc(int s,int t)
{
len = strlen(element[++cnt]);
int left = (t-len)/2; // 计算左空格数
for (int i = 0; i < left; i ++) // 打印
form[s][++wid] = ' ';
for (int i = 0; i < len; i ++)
form[s][++wid] = element[cnt][i];
for (int i = 0; i < t-left-len; i ++)
form[s][++wid] = ' ';
}
void henr(int s,int t)
{
len = strlen(element[++cnt]);
for (int i = 0; i < t-1-len; i ++) // 打印
form[s][++wid] = ' ';
for (int i = 0; i < len; i ++)
form[s][++wid] = element[cnt][i];
form[s][++wid] = ' ';
}
int main()
{
int T,r,c;
scanf("%d",&T);
while ( T --)
{
cnt = -1; // cnt 按行列序记录:当前表格元素下标
int tag[12] = {0};
scanf("%d %d %s",&r,&c,ins);
for (int i = 0; i < r; i ++)
{
for (int j = 0; j < c; j ++)
{
scanf(" %s",element[++cnt]); // 把每个元素都存在 element数组中
len = strlen(element[cnt])+2; // 记录每列最大宽度
if (len > tag[j]) tag[j] = len;
}
}
formR = 2*r + 1; formC = c + 1; cnt = -1; // 输出表格 行 = 2*r+1
for (int i = 0; i < c; i ++) // 输出表格 列 = c+1+每列最大宽度
formC += tag[i];
for (int i = 1; i < formR; i += 2) // 先打印对应行的每列元素
{
form[i][0] = '|'; wid = 0; // wid值记录该行,当前列的位置,打印完成一个,就往后++一个。
for (int j = 0; j < c; j ++)
{
if (ins[j] == 'l') henl(i,tag[j]);
if (ins[j] == 'c') henc(i,tag[j]);
if (ins[j] == 'r') henr(i,tag[j]);
form[i][++wid] = '|';
}
}
for (int i = 0; i < formR; i += 2) // 打印表格方框,先全打印为 ‘-’
for (int j = 1; j < formC; j ++)
form[i][j] = '-';
int p = 0;
for (int i = 0; i < c; i ++) // 把行列交界处改为 ‘+’
{
p += (tag[i]+1);
for (int j = 0; j < formR; j += 2) // 每行的第p位就是行列交界处,都要改为‘+’
form[j][0] = form[j][p] = '+';
}
for (int i = 0; i < formR; i ++) // 输出
{
for (int j = 0; j < formC; j ++)
printf("%c",form[i][j]);
puts("");
}
}
return 0;
}