Задача
Напишите программу для нанесения узоров на ткань в виде символов. В нечетных строках узора символы идут подряд, а в четных – разделены пробелом.
Входные данные
В единой строке входного файла задано сначала символ узора S, затем через пробелы [latex]3[/latex] натуральных числа: ширина узора [latex]w[/latex] [latex](w < 80)[/latex], его высота [latex]h[/latex] [latex](h <= 40)[/latex] и повторяемость [latex]t[/latex] [latex](t <= 40)[/latex]. В примере выходных данных пробелы для наглядности заменены на точки.
Выходные данные
Вывести требуемый узор.
Тесты
№ | Ввод | Вывод |
1 | W 7 9 1 | WWWWWWW .W.W.W.W ..WWWWWWW …W.W.W.W ….WWWWWWW …W.W.W.W ..WWWWWWW .W.W.W.W WWWWWWW |
2 | E 9 6 2 | EEEEEEEEE .E.E.E.E.E ..EEEEEEEEE ..E.E.E.E.E .EEEEEEEEE E.E.E.E.E .EEEEEEEEE ..E.E.E.E.E ..EEEEEEEEE .E.E.E.E.E EEEEEEEEE |
3 | D 2 2 2 | DD D DD |
4 | N 9 6 3 | NNNNNNNNN .N.N.N.N.N ..NNNNNNNNN ..N.N.N.N.N .NNNNNNNNN N.N.N.N.N .NNNNNNNNN .N.N.N.N.N ..NNNNNNNNN .N.N.N.N.N NNNNNNNNN .N.N.N.N.N ..NNNNNNNNN ..N.N.N.N.N .NNNNNNNNN N.N.N.N.N |
5 | K 7 11 2 | KKKKKKK .K.K.K.K ..KKKKKKK …K.K.K.K ….KKKKKKK …..K.K.K.K ….KKKKKKK …K.K.K.K ..KKKKKKK .K.K.K.K KKKKKKK .K.K.K.K ..KKKKKKK …K.K.K.K ….KKKKKKK …..K.K.K.K ….KKKKKKK …K.K.K.K ..KKKKKKK .K.K.K.K KKKKKKK |
Код программы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
#include <iostream> #include <string> using namespace std; int main() { char S; cin >> S; int w, h, t; cin >> w >> h >> t; string line_1(w, S); // строка без пробелов, каждая нечетная int times; times = (t * h) - (t - 1);// количество строк узора int num = 0; // количество пробелов перед строкой bool flag = true; // необходим для контроля уменьшения и увеличения числа //пробелов перед четными строками; for (int i = 1; i <=times; i++) { if(num < 0) num = 0; string tmp(num, ' '); //подстрока с пробелами cout << tmp; if (i % 2) cout << line_1;//вывод нечетной строки else { for (int q = 0; q < w / 2 + w % 2; q++) { cout << S; if (q != w / 2 + w % 2 - 1) cout << " "; }// вывод символов, чередующихся пробелами в четной строке } if (!flag) num--; else num++; if (num == h / 2) flag = false; if (num == 0) flag = true; if (num == h / 2 && h % 2 == 0) num--;//данное действие необходимо для //того, чтобы у "серединных" двух строк при четной высоте было одинаковое //число пробелов if (i != times) cout << endl; } return 0; } |
Либо так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
#include <iostream> using namespace std; int main() { char S; cin >> S; int w, h, t; cin >> w >> h >> t; char *s1 = new char[w]; for (int i = 0; i < w; i++) s1[i] = S; int times; times = (t * h) - (t - 1); int num = 0; bool flag = true; char *tmp; for (int i = 1; i <=times; i++) { if(num < 0) num = 0; tmp = new char [num]; for (int i = 0; i < num; i++) tmp[i] = ' '; cout << tmp; if (i % 2) cout << s1; else { for (int q = 0; q < w / 2 + w % 2; q++) { cout << S; if (q != w / 2 + w % 2 - 1) cout << " "; } } if (!flag) num--; else num++; if (num == h / 2) flag = false; if (num == 0) flag = true; if (num == h / 2 && h % 2 == 0) num--; if (i != times) cout << endl; } return 0; } |
Решение
Считываем все входные данные. Создаём строку из [latex]w[/latex] символов, идущих подряд — из неё и пробелов будет состоять каждая нечётная строка. Далее заводим 3 переменные: times, num и flag. Предназначение каждой описано в комментариях в коде решения. После в цикле необходимо вывести узор, чередуя строки, в которых символы идут подряд и с пробелами. Перед каждой подстрокой с символами выводится подстрока с пробелами tmp. Число пробелов регулируется уже упомянутыми переменными num и flag. От нулевой строки до середины flag имеет значение true и num увеличивается с каждым проходом цикла на единицу, с середины до нуля — наоборот. При этом для того, чтобы узор с чётной высотой не шел полностью «ёлочкой» создаём условие, при котором по достижению середины количество дважды уменьшится.
Добавила и исправила.