用户输入一个表格的文本,请按如下格式输出:
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
- #include
- 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
- printf("-");
- }
- void prfshu(){
- printf("|");
- }
- void prfspace(int len){//
- for(int i = 0;i
- printf(" ");
- }
- void prfmap(int c){//i是第几行上面的线,c是有多少列
- for(int j = 0;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
- //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
- for(int j = 0;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
- prfmap(c);//打印前面的线
- printf("\n");
- for(int j = 0;j
- prfshu();//打印竖线
- if(vis[j]==1){
- int left = 1;
- prfspace(left);
- for(int k = 0;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
- 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
- printf("%c",p[i][j][k]);
- }
- prfspace(right);
- }
- }
- prfshu();
- printf("\n");
- }
- prfmap(c);
- printf("\n");
- }
- }
-
相关阅读:
DOM与BOM与Echarts
Vue项目实战——【基于 Vue3.x + NodeJS】实现的课程表排课系统三(duration-title)
实验1 熟悉R语言环境
性能测试工具---jmeter讲解
gmssl 在Windows下的编译注意事项
中国服装自主品牌行业市场环境与投资趋势分析报告
Linux,虚拟机
Git的使用教程
sftp传输文件
[附源码]java毕业设计基于web的建筑合同管理系统
-
原文地址:https://blog.csdn.net/qq_24917263/article/details/128064504