前言:内容包括四大模块:题目,代码实现,大致思路,代码解读
题目:
中国的古人写文字,是从右向左竖向排版的。本题就请你编写程序,把一段文字按古风排版。
输入格式:
输入在第一行给出一个正整数N(<100),是每一列的字符数。第二行给出一个长度不超过1000的非空字符串,以回车结束。
输出格式:
按古风格式排版给定的字符串,每列N个字符(除了最后一列可能不足N个)。
输入样例:
4
This is a test case
输出样例:
asa T
st ih
e tsi
ce s
代码实现:
#include<stdio.h>
#include<string.h>
int main()
{
int n = 0;
scanf("%d ",&n);
char ch[1001]={0};
gets(ch);
int len = strlen(ch);
int col=len/n;
if(len%n!=0)
{
col+=1;
}
int j = 0;
int index = 0;
char arr[100][100]={0};
for(j=col-1;j>=0;j--)
{
int i = 0;
for(i=0;i<n;i++)
{
if(ch[index]!='\0')
{
arr[i][j]=ch[index];
index++;
}
else
{
arr[i][j]=' ';
}
}
}
int i = 0;
for(i=0;i<n;i++)
{
for(j=0;j<col;j++)
{
printf("%c",arr[i][j]);
}
printf("\n");
}
return 0;
}
大致思路:
预备了解:
n:每列n个字符,也即行数
ch数组:存储输入的字符串
j:二维数组的列数
i:二维数组的行数
len:字符串长度
index:ch数组的下标,即每个字符的下标
1. 创建一个二维数组去存储古风排版的文字
2. 存储:
a. 从最后一列往前存储
b. 一列中从上往下存储
3. 打印二维数组的内容
代码解读:
part 1:确定二维数组的行和列
int len = strlen(ch);
int col=len/n;
if(len%n!=0)
{
col+=1;
}
行很容易确定,就是输入的n
列的确定:求出字符串长度,判断字符串长度除以每列的n个字符的余数
若是余数不为0,说明不能整除留有余数,需要多出一行
part 2:以古风排版的形式存储文字
int j = 0;
int index = 0;
char arr[100][100]={0};
for(j=col-1;j>=0;j--)
{
int i = 0;
for(i=0;i<n;i++)
{
if(ch[index]!='\0')
{
arr[i][j]=ch[index];
index++;
}
else
{
arr[i][j]=' ';
}
}
}
j:二维数组的列
i:二维数组的行
第一个for循环:所有列数
第一个for循环内部:是一列的存储
存储首先从最后一列开始,一列的存储方式:从上往下,即行数从0到n
若是ch中的某个字符不是'\0'(字符串的结束标志),则正常存储
若是ch中的某个字符是'\0',要将这个字符替换成' '(题目要求)
part 3:打印二维数组
int i = 0;
for(i=0;i<n;i++)
{
for(j=0;j<col;j++)
{
printf("%c",arr[i][j]);
}
printf("\n");
}