Я пишу программу на C++, чтобы отобразить двумерный массив, а затем повернуть его на 90, 180 и 270 градусов. Массив представляет собой заглавную букву «Е», состоящую из букв «Е» и пробелов. Я написал программу, но когда я запускаю ее, она печатает буквы E повернутыми, но вертикально (сверху вниз), мой профессор хочет, чтобы они были повернуты, но печатаются горизонтально (слева направо).
По моей логике мне пришлось бы отредактировать свой код, чтобы:
-> вывести строку массива 1
-> повернуть90
-> вывести строку массива 1
-> rotate90 (вернуться к исходному состоянию)
-> повернуть180
-> вывести строку массива 1
-> rotate180 (оригинал)
-> повернуть270
-> строка массива печати 1
-> повернуть на 270 (оригинал) ->
... продолжить 7 раз, пока не будут напечатаны все строки.
Я знаю, что есть более простой способ, но я не могу понять, как это сделать.
#include <iostream>
using namespace std;
char eArray[][7]{
{'E','E','E','E','E','E','E'},
{'E',' ',' ',' ',' ',' ',' '},
{'E',' ',' ',' ',' ',' ',' '},
{'E','E','E','E','E',' ',' '},
{'E',' ',' ',' ',' ',' ',' '},
{'E',' ',' ',' ',' ',' ',' '},
{'E','E','E','E','E','E','E'},
};
int n = 7;
void rotateArray90(char a[][7]){
for (int i = 0; i < n; i += 1) {
for (int j = i+1; j < n; j += 1) {
swap(eArray[i][j], eArray[j][i]);
}}}
void flipArray180(char a[][7]){
for (int i = 0; i < n; i += 1) {
for (int j = 0; j < n/2; j += 1) {
swap(eArray[i][j], eArray[i][n-1-j]);
}}}
void rotateArray270(char a[][7]){
for (int i = 0; i < n; i += 1) {
for (int j = 0; j < n/2; j += 1) {
swap(eArray[i][j], eArray[n-1-i][j]);
}}}
void printArray(char a[][7]){
for (int i = 0; i < n; ++i){
for (int j = 0; j < n; ++j){
cout << eArray[i][j] <<" ";
}cout << endl;
}}
int main(){
printArray(eArray);
cout <<"\n";
rotateArray90(eArray);
printArray(eArray);
cout <<"\n";
rotateArray90(eArray);
flipArray180(eArray);
printArray(eArray);
cout <<"\n";
flipArray180(eArray);
rotateArray270(eArray);
printArray(eArray);
cout <<"\n";
rotateArray270(eArray);
}
Спасибо вам за помощь.
Даже если вам не разрешено делать копии, вам все равно понадобится только функция поворота на 90 °. Вы печатаете первую строку неизмененной матрицы; затем поверните на 90 ° и выведите первую строку; затем поверните еще на 90 ° и напечатайте первую строку матрицы, повернутой теперь на 180 °; затем вы поворачиваете еще на 90 ° и печатаете первую строку матрицы, повернутой на 270 °; затем вы поворачиваете еще на 90 ° (чтобы вернуться к оригиналу) и переходите к печати второй строки матрицы после выполнения поворота.
В стандартном потоке ввода-вывода C++, когда вы вводите новую строку, нет 100% надежного способа вернуться. Вы можете выделить буфер шириной 4 E и скопировать в него повернутые Es по мере их создания, немного расставив их для облегчения чтения, а затем распечатать большой буфер на экране.
Вы можете заметить, что для возврата к исходному изображению после поворота на 90 ° вам нужно сделать поворот на 270 ° (или -90 °), а не еще на 90 °, и наоборот, для поворота на 270 °. Разумеется, два поворота на 180 ° вернут вас туда, откуда вы начали.





Я не уверен, что понял вас, но то, что вы делаете здесь, не является вращением (в смысле вращения матрицы). Когда вы применяете rotateArray90(eArray) два раза, вы должны повернуть массив на 180 градусов, но вместо этого он вернется к исходному массиву.
Вот мой способ вращения, посмотрите, помогает ли он. Когда вы его используете, вам не нужны отдельные методы для поворота на 180, 270 и т.д. градусов, вы просто применяете его 2, 3, ... раза. После 4-го поворота массив возвращается к исходному состоянию. Он работает с любым прямоугольным массивом, а не только с n x n. И вам не нужно использовать необработанные указатели, используйте вместо них контейнеры.
template<typename T>
void printArray(const vector<vector<T>> &vch) {
for (int i = 0; i < vch.size(); ++i) {
for (int j = 0; j < vch[0].size(); ++j) {
cout << vch[i][j] << " ";
}
cout << endl;
}
}
template<typename T>
void rotateArray(vector<vector<T>> &v)
{
vector<vector<T>>rotated;
for (size_t i = 0; i < v[0].size(); i++) {
vector<T> newRow;
for (int j = v.size() - 1; j >=0; j--) {
newRow.push_back(v[j][i]);
}
rotated.push_back(newRow);
}
v = rotated;
}
Вот пример использования:
int main() {
vector<vector<char>> vch = {
{'E', 'E', 'E', 'E', 'E', 'E', 'E'},
{ 'E',' ',' ',' ',' ',' ',' ' },
{ 'E',' ',' ',' ',' ',' ',' ' },
{ 'E','E','E','E','E',' ',' ' },
{ 'E',' ',' ',' ',' ',' ',' ' },
{ 'E',' ',' ',' ',' ',' ',' ' },
{ 'E','E','E','E','E','E','E' },
};
printArray<char>(vch);
cout << "\n";
rotateArray<char>(vch);
printArray<char>(vch);
cout << "\n";
rotateArray<char>(vch);
printArray<char>(vch);
cout << "\n";
rotateArray<char>(vch);
printArray<char>(vch);
cout << "\n";
return 0;
}
//orignal
E E E E E E E
E
E
E E E E E
E
E
E E E E E E E
// rotated 90
E E E E E E E
E E E
E E E
E E E
E E E
E E
E E
// rotated 180
E E E E E E E
E
E
E E E E E
E
E
E E E E E E E
// rotated 270
E E
E E
E E E
E E E
E E E
E E E
E E E E E E E
// rotated 360
E E E E E E E
E
E
E E E E E
E
E
E E E E E E E
4 копии матрицы 7x7 не разорят банк памяти, если только вы не столкнетесь с самыми экстремальными встроенными системами. Сделайте четыре копии, повернутые на 0º, 90º, 180º, 270º (вам нужна только функция «повернуть на 90º» - вы копируете оригинал и поворачиваете копию на 90º; вы копируете повернутую на 90º матрицу и поворачиваете копию на 90º (для поворота на 180º). ); вы копируете повернутую на 180 ° матрицу и поворачиваете копию на 90 ° (для поворота на 270 °) .Теперь вы настраиваете печать строк каждого из 4-х поворотов на странице.