古风排版
古风排版
一、目的
-掌握vector用法
-掌握cin.get的用法
二、实验内容与设计思想
古风排版
中国的古人写文字,是从右向左竖向排版的。本题就请你编写程序,把一段文字按古风排版。
输入格式:
输入在第一行给出一个正整数N(<100),是每一列的字符数。第二行给出一个长度不超过1000的非空字符串,以回车结束。
输出格式:
按古风格式排版给定的字符串,每列N个字符(除了最后一列可能不足N个)。
输入样例:
4
This is a test case
输出样例:
asa T
st ih
e tsi
ce s
函数相关伪代码
1.动态数组a
2.字符单个输入
3.获得字符长度
4.循环数组并判断是否输出
函数代码
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main() {
vector<char> a;
int i = 0, s, m, l, j, p, h,k=0,y;
char ch;
cin >> s;
cin.get();
while (cin.get(ch) && ch != '\n') {
a.push_back(ch);
}
l = a.size() / s;
j = a.size();
if (a.size() % s != 0) {
l = l + 1;
}
h = j % s;
for (i = 0;i < s;i++) {//行
y = 0;
if (i< h||h==0) {
p = 0;
}
else {
p = 1;
cout << " ";
y = 1;
}
if (h != 0) {
j = a.size() / s * s + i;
}
else {
j = a.size() - s+i;
}
for (;p < l;p++) {//列
if (y==1) {
j = j - s;
}
y = 1;
cout << a[j];
}
cout << endl;
}
return 0;
}
时间复杂度O(n),空间复杂度O(1)
三、实验使用环境
以下请根据实际情况编写
- 操作系统:Windows 11专业版
- 编程语言:C++
- 开发工具:[Visual Studio 2022]
四、实验步骤和调试过程
古风排版
本机运行截图
五、实验小结
遇到的问题及解决方法:
- 问题:输入字符未正确处理
- 解决方法:优化代码,修改输入方法
实验体会和收获:
这段代码的主要功能是实现一个字符的转置输出。首先,程序通接收一个int s,表示输出时一列有几个字符。接着,通过cin.get(单字符输入)输入一行字符,将这些字符存储在数组a中。先确定会有几列,由于最后一列可能不够,需要单独考虑这种情况,行由s已经可以确定。在输出部分,程序通过两层循环实现题目要求。外层循环变量i表示行数,故要小于s,内层循环变量p实际上可表示列数。由于第一列(实际是最后一列)输出会不够,需要用空格来表示,此时空格就占据了一列,因此p的初始值可能为0,也可能为1,这需要用h(余数)来判断。当前列索引i小于余数h,则从后向前输出字符,否则先输出一个空格,再从后向前输出字符。这样,就实现了题目要求。由于是从后向前输出方式,我就直接动过判断使j的初始值在每一行要输出的第一个下标,直接减s,来表示这一行中的输出,由此要加个条件使第一次进入循环时不减.