Wyświetlanie tablicy 2D w wybranym kierunku

0

Witam serdecznie muszę stworzyć tablicę 2D według uznania użytkownika natomiast wyświetlić ją zygzakiem od tyłu np. mam tablice :
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15

i muszę ją wyświetlić :
15 14 13 12 11
6 7 8 9 10
5 4 3 2 1

mam przygotowane prawie wszystko , razem z wyswietlaniem tablicy od tyłu problem w tym że nie potrafie "skręcić" w tablicy :D proszę o pomoc , poniżej kod :

#include <iostream>
using namespace std;
 int main()
 {
	 int w, k;
	 std::cout << "Wpisz liczbe wierszy: ";
	 std::cin >> w;
	 std::cout << "Wpisz liczbe kolumn: ";
	 std::cin >> k;
	 
	 int** tab = new int* [w]; //alokacja pamieci
	 for (int i = 0; i < w; ++i)
	 {
		 tab[i] = new int[k]; //alokacja pamieci
	 }
	 
	int x, y;
	std::cout<<"Wpisz wartości do tablicy: \n ";
	for (x = 0; x < w; x++)
	{
		for (y = 0; y < k; y++)
			std::cin>> tab[x][y];
	}
	
	std::cout << " Tablica przed zmiana: \n";
	for(x = 0; x < w; x++)
		 {
		 for(y = 0; y < k; y++)
			 printf_s("  %d ", tab[x][y]);
		 printf_s("\n");
		 }
	
	std::cout << "Tablica po zmianie: \n";

	for (x = w -1; x >= 0; --x)
		{
		for (y = k - 1; y >= 0; --y)
			
			printf_s("  %d ", tab[x][y]);
		printf_s("\n");

		}

		 return 0;
	 }```
4

https://dsp.krzaq.cc/post/176/ucze-sie-cxx-kiedy-uzywac-new-i-delete/

Podziel ten kod na mniejsze funkcje.
Jedna która wczytuje dane,
Jedna która, odwraca dane.
Jedna która, wyświetla dane.
A main tylko je połącz razem.

1

Musisz mieć przed linijką 40 ifa który sprawdzi, w którym jesteś wierszu i zrobi dwie różne pętle w zależności od numeru wiersza. Coś jak:

if(wiersz  o numerze parzystym) {
    for(y = k - 1; y >= 0; --y) {
            printf_s("  %d ", tab[x][y]);
    }
} else {
    for(y = 0; y < k; ++y) {
            printf_s("  %d ", tab[x][y]);
    }
}
printf_s("\n");
0

Dzięki wielkie tak właśnie myślałem ale robiłem jakieś babole :) dziękuję bardzo

0

Jednak niestety nie działa, program wysypuje ciągle te same liczby w nieskończoność:

#include <iostream>
using namespace std;
 int main()
 {
	 int w, k;
	 std::cout << "Wpisz liczbe wierszy: ";
	 std::cin >> w;
	 std::cout << "Wpisz liczbe kolumn: ";
	 std::cin >> k;
	 
	 int** tab = new int* [w]; //alokacja pamieci
	 for (int i = 0; i < w; ++i)
	 {
		 tab[i] = new int[k]; //alokacja pamieci
	 }
	 
	int x, y;
	std::cout<<"Wpisz wartości do tablicy: \n ";
	for (x = 0; x < w; x++)
	{
		for (y = 0; y < k; y++)
			std::cin>> tab[x][y];
	}
	
	std::cout << " Tablica przed zmiana: \n";
	for(x = 0; x < w; x++)
		 {
		 for(y = 0; y < k; y++)
			 printf_s("  %d ", tab[x][y]);
		 printf_s("\n");
		 }
	
	std::cout << "Tablica po zmianie: \n";

	for (x = w -1; x >= 0; --x)
		{
		for (y = k - 1; y >= 0; --y)
			if (w%=2) {
				for (y = k - 1; y >= 0; --y) {
					printf_s("  %d ", tab[x][y]);
				}
			}
			else {
				for (y = 0; y < k; ++y) {
					printf_s("  %d ", tab[x][y]);
				}
			}
		printf_s("\n");
		
		}


		 return 0;
	 }
0

Przed wszystkim: if (x%2==0) { a nie if (w%=2) {... -- zdajesz sobie co napisałeś w tym ifie? :)

0

niestety dalej nie działa mimo mojego babola

1

Nad tym nowym ifem masz nipotrzebnego fora... :/

0

Dziękuję bardzo

1

Proponuję zrobić to bez indeksów, tylko przy użyciu iteratorów.

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<vector<int>> table {
                                { 1  , 2  , 3  , 4  , 5  },
                                { 6  , 7  , 8  , 9  , 10 },
                                { 11 , 12 , 13 , 14 , 15 },
                                { 16 , 17 , 18 , 19 , 20 }
                              };

    auto loop = []( auto begin , auto end ){ for( auto it { begin } ; it != end ; ++it ) cout << *it << "\t"; };

    for( auto it {crbegin(table)} ; it != crend(table) ; ++it )
    {
        distance( it , crend(table) ) % 2 == 0 ? loop( crbegin(*it) , crend(*it) ) : loop( cbegin(*it) , cend(*it) );
        cout << endl;
    }
}
0

To chyba trzeba użyć ifa (jak poprzednio) i rend i rbegin...

0

Dziękuję za propozycję , być może zrobił bym to takim sposobem , niestety nie studiowałem jeszcze takiego sposobu :) pozdrawiam

0

Przestudiuj -- jak chcesz się zająć iteratorami, to trzeba postudiować różne ich rodzaje... :)

0

Tylko chciałbym do tego stworzyć dla użytkownika możliwość tworzenia tablicy każdego rozmiaru

0

Ale iteratory w tym przeszkadzają?

0

Tzn. ja mówiłem o tym co kolega napisał , Vektorowo , tego nie studiowalem i jest to jakis inny sposob dla mnie , i nie wiem jak stworzyc przy tym interfejs uzytkownika , więc zostaję przy iteratorach póki co , vektory to dla mnie czarna magia na razie :D

5

W ramach propagowania czystego kodu:

#include <iostream>
#include <vector>
#include <algorithm>

using Matrix = std::vector<std::vector<int>>;

std::istream& load(std::istream& in, Matrix& m)
{
    int rows, columns;
    if (in >> rows >> columns) {
          m =  Matrix(rows ,std::vector<int>(columns));
          for (auto& row : m) 
               for (auto& a : row)
                   in >> a;
    }
    return in;
}

std::ostream& print(std::ostream& out, const Matrix& m)
{
    for (auto& row : m) {
        for (auto& a : row) {
            out << a << ' ';
       }
       out << '\n';
    }
    return out;
}

void snakeReverse(Matrix& m) {
     bool rowReverse = true;
     for (auto& row : m) {
          if (rowReverse) std::reverse(row.begin(), row.end());
          rowReverse = !rowReverse;
     }
     std::reverse(m.begin(), m.end());
}

int main()
{
    Matrix m;
    if (load(std::cin, m)) {
          snakeReverse(m);
          print(std::cout, m);
    }
}

https://godbolt.org/z/5jWY7o5fT

1 użytkowników online, w tym zalogowanych: 0, gości: 1