表格
题目描述
用户输入一个表格的文本,请按如下格式输出:
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 | +-------+---------+------+---------+-------+
最近在优化以前写的代码,发现曾经做过的题再写一次也还是会有不少问题。。。
回到这道题上来,这道题核心就是拿一个开一个三维数组来存单词
其他打印表格部分用函数来控制。这道题我重新优化做了一次后竟然犯了以前没犯的错,忘记初始化了,卡了一段时间。。
#include <stdio.h>
#include <string.h>
char p[22][22][22] = {0};
int maxlen[22] ={0};
int vis[22] = {0};
int lenarr[22][22] ={0};
void prfplus(){
printf("+");
}
void prfjian(int len){
prfplus();
for(int i = 0;i<len;i++)
printf("-");
}
void prfshu(){
printf("|");
}
void prfspace(int len){//
for(int i = 0;i<len;i++)
printf(" ");
}
void prfmap(int c){//i是第几行上面的线,c是有多少列
for(int j = 0;j<c;j++){//j是第几列
prfjian(maxlen[j]+2);//打印减号同时打印加号
}
prfplus();//补齐末尾加号
}
int main(){
int t;
scanf("%d",&t);
while(t--){
memset(p,0,sizeof(p));
memset(maxlen,0,sizeof(maxlen));
memset(vis,0,sizeof(vis));
memset(lenarr,0,sizeof(lenarr));
//这道题的我半天不过的原因就是没有初始化
int r,c;
char ch;
scanf("%d %d",&r,&c);
getchar();//这里加getchar()就没有问题
for(int i = 0;i<c;i++){
//getchar();这里加getchar()也会有问题
//之后会退不出输入程序
scanf("%c",&ch);
if(ch=='l'){
vis[i] = 1;//为什么此时i变为1了?,一定记得在前面加getchar();
//是不是跳过了i=0的情况
}//某一列的对齐情况
if(ch=='c'){
vis[i] = 2;
}
if(ch=='r'){
vis[i] = 3;
}
}
//每一列的对齐情况
for(int i = 0;i<r;i++){
for(int j = 0;j<c;j++){
scanf("%s",p[i][j]);//这里为什么可以用%s可以呢
//而不用那种可以输入带空格的字符串
//注意我们这里是三维数组
//第三个空代表一个单词,输入单词按空格后就代表
//这一个单词输入完了
int len = strlen(p[i][j]);
lenarr[i][j] = len;//储存每个字符的长度
if(len>=maxlen[j]){
maxlen[j] = len;
}
}
}
for(int i = 0;i<r;i++){
prfmap(c);//打印前面的线
printf("\n");
for(int j = 0;j<c;j++){
prfshu();//打印竖线
if(vis[j]==1){
int left = 1;
prfspace(left);
for(int k = 0;k<lenarr[i][j];k++){
printf("%c",p[i][j][k]);
}
int right = maxlen[j]+2-left-lenarr[i][j];
prfspace(right);
}
if(vis[j]==2){
//根据字符长度和最大长度来确定空格
int left = (maxlen[j]+2-lenarr[i][j])/2;
//利用c语言向下取整的性质满足题意;
prfspace(left);
for(int k = 0;k<lenarr[i][j];k++){
printf("%c",p[i][j][k]);
}
int right = maxlen[j]+2-lenarr[i][j]-left;
prfspace(right);
}
if(vis[j]==3){
int right = 1;
int left = maxlen[j]+2-lenarr[i][j]-right;
prfspace(left);
for(int k = 0;k<lenarr[i][j];k++){
printf("%c",p[i][j][k]);
}
prfspace(right);
}
}
prfshu();
printf("\n");
}
prfmap(c);
printf("\n");
}
}