C++ 多行文本块
C++ multiline text blocks
我要创建一种圣诞贺卡,需要包含使用嵌套 for 循环生成的设计。
输出需要在所有四个边上都有一个边框,内部有可变文本以及嵌套 for 循环设计。
大致如下:
我尝试使用 for 循环生成边框并将设计放在里面,但是在打印多行设计时出现了问题。
#include <iostream>
#include <iomanip>
using namespace std;
int main(){
char tree[10][10];
int i,j;
for(i=0; i<7; i++){
for(j=0; j<7; j++){
if(i==0 && j==3){
// cout << '*';
tree[i][j] = '*';
}
else if(i==1 && j==3){
// cout << '|';
tree[i][j] = '|';
}
else if(i==2 && j==3){
// cout << 'M';
tree[i][j] = 'M';
}
else if(i==3 && j>1 && j<5){
// cout << 'A';
tree[i][j] = 'A';
}
else if(i==4 && j>0 && j<6){
if(j % 2 == 0){
// cout << 'o';
tree[i][j] = 'o';
} else {
// cout << 'A';
tree[i][j] = 'A';
}
}
else if(i==5){
if(j % 2 == 0){
// cout << 'A';
tree[i][j] = 'A';
} else {
// cout << '~';
tree[i][j] = '~';
}
}
else if(i==6 && j==3){
// cout << "M";
tree[i][j] = 'M';
}
else {
// cout << ' ';
tree[i][j] = ' ';
}
}
tree[i][7] = '\n';
}
tree[6][8] = '[=10=]';
for(i=0; i<30; i++){
for(j=0; j<70; j++){
if(i==0 || i==29){
cout << "^";
} else if(j==0 || j==69){
cout << "*";
}
int a,b;
if(j>=42 && j<50 && i >= 10 && i< 17){
for(a=0; a<7; a++){
for(b=0; b<8; b++){
cout << tree[a][b];
j++;
}
i++;
}
}
else {
cout << " ";
}
}
cout << endl;
}
return 0;
}
这会将整个边框向下推,因为设计是多行的。
我对这种方法有点困惑。也许使用 setw()
?
问题是您增加了内部循环中的计数器。
尝试这样的事情:
if (j >= 42 && j<50 && i >= 10 && i< 17) {
//for (auto a = 0; a<7; a++) {
//for (auto b = 0; b<8; b++) {
cout << tree[i - 10][j -42];
//j++;
//}
//i++;
//}
}
所以我找到了解决问题的方法。
我没有直接打印到标准输出,而是将输出存储在二维字符数组中。
以下将存储边框:
for(i=0; i<50; i++){
for(j=0; j<70; j++){
if(i==0 || j==0 || i==49 || j==69){
finalOutput[i][j] = '*'; //Just for the sake of an example
} else {
finalOutput[i][j] = ' ';
}
}
}
下面将树存储在框内的某个位置,
for(i=30; i<7; i++){
for(j=30; j<7; j++){
finalOutput[i][j] = tree[i-30][j-30];
}
}
然后打印 finalOutput 解决了我的问题。
我要创建一种圣诞贺卡,需要包含使用嵌套 for 循环生成的设计。
输出需要在所有四个边上都有一个边框,内部有可变文本以及嵌套 for 循环设计。
大致如下:
我尝试使用 for 循环生成边框并将设计放在里面,但是在打印多行设计时出现了问题。
#include <iostream>
#include <iomanip>
using namespace std;
int main(){
char tree[10][10];
int i,j;
for(i=0; i<7; i++){
for(j=0; j<7; j++){
if(i==0 && j==3){
// cout << '*';
tree[i][j] = '*';
}
else if(i==1 && j==3){
// cout << '|';
tree[i][j] = '|';
}
else if(i==2 && j==3){
// cout << 'M';
tree[i][j] = 'M';
}
else if(i==3 && j>1 && j<5){
// cout << 'A';
tree[i][j] = 'A';
}
else if(i==4 && j>0 && j<6){
if(j % 2 == 0){
// cout << 'o';
tree[i][j] = 'o';
} else {
// cout << 'A';
tree[i][j] = 'A';
}
}
else if(i==5){
if(j % 2 == 0){
// cout << 'A';
tree[i][j] = 'A';
} else {
// cout << '~';
tree[i][j] = '~';
}
}
else if(i==6 && j==3){
// cout << "M";
tree[i][j] = 'M';
}
else {
// cout << ' ';
tree[i][j] = ' ';
}
}
tree[i][7] = '\n';
}
tree[6][8] = '[=10=]';
for(i=0; i<30; i++){
for(j=0; j<70; j++){
if(i==0 || i==29){
cout << "^";
} else if(j==0 || j==69){
cout << "*";
}
int a,b;
if(j>=42 && j<50 && i >= 10 && i< 17){
for(a=0; a<7; a++){
for(b=0; b<8; b++){
cout << tree[a][b];
j++;
}
i++;
}
}
else {
cout << " ";
}
}
cout << endl;
}
return 0;
}
这会将整个边框向下推,因为设计是多行的。
我对这种方法有点困惑。也许使用 setw()
?
问题是您增加了内部循环中的计数器。
尝试这样的事情:
if (j >= 42 && j<50 && i >= 10 && i< 17) {
//for (auto a = 0; a<7; a++) {
//for (auto b = 0; b<8; b++) {
cout << tree[i - 10][j -42];
//j++;
//}
//i++;
//}
}
所以我找到了解决问题的方法。
我没有直接打印到标准输出,而是将输出存储在二维字符数组中。
以下将存储边框:
for(i=0; i<50; i++){
for(j=0; j<70; j++){
if(i==0 || j==0 || i==49 || j==69){
finalOutput[i][j] = '*'; //Just for the sake of an example
} else {
finalOutput[i][j] = ' ';
}
}
}
下面将树存储在框内的某个位置,
for(i=30; i<7; i++){
for(j=30; j<7; j++){
finalOutput[i][j] = tree[i-30][j-30];
}
}
然后打印 finalOutput 解决了我的问题。