Określenie rozmiaru tablicy na podstawie danych pobranych z klawiatury

0

Witam, mam za zadanie zrobić to co rozrysowałem na obrazku(załącznik), rozmiar tablicy mam podawać na starcie czyli może być 5x5, albo np 20x20.
W programie dla testu zwracam miejsce [1][1], w którym powinno być 1, a jest niestety 0. Gdzie popełniam błąd?

#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
	int k, w;
    int tab[k][w];
    
    cout << "Podaj liczbe kolumn i wierszy: " << endl;
    cin >> k, w;
    
    

    	if (tab[k][w]=(k+w)/2){
    		tab[k][w]=1;
    	}
    		else if (tab[k][w]!=(k+w)/2){
    			tab[k][w]=0;
			}
		

    cout<<tab[1][1];
      

    
    return 0;
}

Wiem jeszcze że w miejscu [10] i [0] program nie zadziała, ale nad tym pomyślę w przyszłości.

0

Zacznijmy od tego, że w C++ tablice muszą mieć stały rozmiar i znany w czasie kompilacji,
albo użyć std::vector.

0

Yhm, czyli zmienię na tab[10][10], ale to nie rozwiązuje mojego problemu, gdzie jeszcze popelniam błąd?

0

Tablica jest dwuwymiarowa, więc użyj zagnieżdżonych pętli do iterowania po niej.
Podejrzewam, że wpadniesz na rozwiązanie.

0

Od paru dni próbuję to zrobić, a to praca na zaliczenie niestety, ogólnie pomysł na zrobienie tego jest zły bo 10+0/2 to będzie 5 a nie 10 :/ Masz jakiś pomysł jak to zrobić :/?

1

Nie wnikając w poprawność reszty, tak mi się rzuciło w oczy

if (tab[k][w]=(k+w)/2)

Raczej chodziło Ci o operator ==

0

Ogólnie zamysł powinien być taki:

  1. Definiujesz tablicę wypełnioną zerami.
  2. Zagnieżdżasz pętle
for (int i = 0; i < size; ++i) {
    for (int j = 0; j < size; ++j) {
        // tutaj operacje na tablicy
    }
}

Liczniki pętli i i j odpowiadają indeksom tablicy.

  1. Wykrywasz ifami, czy indeksy znajdują się w przekątnej.

Przekątna od lewego górnego rogu, to ta gdzie oba indeksy są sobie równe,
natomiast druga przekątna, to ta gdzie suma indeksów i i j równa jest maksymalnemu indeksowi tablicy (nie rozmiarowi).

Określenie rozmiaru tablicy na podstawie danych pobranych z klawiatury

Do tego potrzebna jest dynamiczna tablica.
https://dsp.krzaq.cc/post/448/n-wymiarowy-widok-na-macierz-w-cxx/
https://dsp.krzaq.cc/post/176/ucze-sie-cxx-kiedy-uzywac-new-i-delete/

2
int k, w;
int tab[k][w];

@Rafał Żurawski: no i jaki rozmiar ma ta tablica, skoro zmiennym k i w nie przypisałeś żadnych wartości? Nie wiadomo – UB jak nic. Natomiast późniejsze przypisanie wartości niczego nie zmieni, bo zmienne k i w nie są nijak połączone ze zmienną tab.

int k, w;
 
cout << "Podaj liczbe kolumn i wierszy: " << endl;
cin >> k, w;

int tab[k][w];  // "k" i "w" w tym momencie mają znane wartości

Takie coś zadziała, o ile kompilator wspiera VLA.

Aby mieć pewność, że kod będzie działał prawidłowo bez względu na kompilator, użyj operatora new i przydziel pamięć dla tablicy, a następnie w pętli dla każdej kolumny. Na koniec należy taką tablicę zwolnić – znów w pętli zwalnia się najpierw kolumny, na koniec samą tablicę. Przykład użycia znajdziesz tutaj – http://www.cplusplus.com/forum/articles/7459/ (punkt Pointer based multi-dimensional arrays).

A jak już ogarniesz alokowanie pamięci dla tablic to kolejnym krokiem będzie poznanie wektorów.


Edit: w skrócie można to przedstawić tak – najpierw deklaracja zmiennych:

int **tab;
int cols, rows;

Teraz pobranie danych określających liczbę kolumn i wierszy:

cout << "Enter the number of columns and rows: ";
cin >> cols, rows;

Teraz alokacja pamięci dla tablicy:

tab = new int*[rows];

for(int row = 0; row < rows; row++)
  tab[row] = new int[cols];

W tym momencie tablica jest gotowa to użycia – w sposób standardowy możesz wpisywać dane i je odczytywać. Na koniec pracy, jeśli już tablica nie będzie dłużej potrzebna, należy zwolnić pamięć:

for(int row = 0; row < rows; row++)
  delete [] tab[row];

delete [] tab;

Do potestowania tutaj – http://cpp.sh/6ib5c

0

@YooSy: na razie chcę zrobić stałą tablicę 10x10, z jedną przekątną, gdzie robię błąd bo już nie rozumiem

#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{

    int tab[10][10]={0};
    
    for (int i = 0; i < 10; ++i) {
    for (int j = 0; j < 10; ++j) {
        if (i+j==i & i+j==j) {
        	
        	tab[i][j]={1};
		}
    }
}

cout << tab[5][5];
return 0;
}
0

Warunek jest zły – wcale nie określa prawidłowych wpsółrzędnych komórek przekątnej. Pętla też jest zła – iterujesz po wszystkich komórkach tablicy, choć wcale tego nie potrzebujesz robić.

0
furious programming napisał(a):

Warunek jest zły – wcale nie określa prawidłowych wpsółrzędnych komórek przekątnej. Pętla też jest zła – iterujesz po wszystkich komórkach tablicy, choć wcale tego nie potrzebujesz robić.

A da się to zrobić prościej :/ ? Problem jest taki, że mam to zrobić, a nauczyciel jedyne czego nas nauczył, to int tab[10][10], to wszystko... totalnie nie ogarniam tego a do 18 mam czas :/

0

Przekątna od lewego górnego rogu, to ta gdzie oba indeksy są sobie równe,
natomiast druga przekątna, to ta gdzie suma indeksów i i j równa jest maksymalnemu indeksowi tablicy

To jest główna wskazówka.

Jedna przekątna to jeden if, a druga to drugi if.

PS:
Zresztą obliczenie wymaganych indeksów jest analogiczne do tej wsakzówki.

0

Tzn. niepotrzebnie iterujesz po wszystkich komórkach tablicy – indeksy komórek które masz wypełnić są z góry znane. Pierwsza przekątna to współrzędne o takich samych wartościach, przy drugiej, należy odjąć wartość jednej współrzędnej od rozmiaru tablicy.

Poza tym deklarujesz za małą tablicę – int tab[10][10] utworzy tablicę, w której elementy indeksowane są od 0 do 9, a nie od 0 do 10.

0
YooSy napisał(a):

Przekątna od lewego górnego rogu, to ta gdzie oba indeksy są sobie równe,
natomiast druga przekątna, to ta gdzie suma indeksów i i j równa jest maksymalnemu indeksowi tablicy

To jest główna wskazówka.

Jedna przekątna to jeden if, a druga to drugi if.

PS:
Zresztą obliczenie wymaganych indeksów jest analogiczne do tej wsakzówki.

Mogłbyś napisać jak mają wyglądać te if-y żeby to działało, bo sam chyba tego nie wykminię, a miałbym z czego się nauczyć przynajmniej :/

0
furious programming napisał(a):

Tzn. niepotrzebnie iterujesz po wszystkich komórkach tablicy – indeksy komórek które masz wypełnić są z góry znane. Pierwsza przekątna to współrzędne o takich samych wartościach, przy drugiej, należy odjąć wartość jednej współrzędnej od rozmiaru tablicy.

Poza tym deklarujesz za małą tablicę – int tab[10][10] utworzy tablicę, w której elementy indeksowane są od 0 do 9, a nie od 0 do 10.

Mogłbyś napisać jak mają wyglądać te if-y żeby to działało, bo sam chyba tego nie wykminię, a miałbym z czego się nauczyć przynajmniej :/

1

Nie potrzebujesz ifów – powinieneś skorzystać z jednej pętli, jednocześnie inkrementując lub dekrementując oba iteratory. Przykład niżej:

int size = 11;
int tab[size][size] = {{0}};

int row, col;

for(row = 0, col = 0; row < size; row++, col++)
{
  tab[row][col] = 1;
  tab[size - row - 1][col] = 1;
}

Możesz też skorzystać z innej pętli.

A jeśli już koniecznie chcesz użyć zagnieżdżonych pętli (brute force) i warunku, to sprawdzaj czy obie współrzędne są sobie równe:

for(row = 0; row < size; row++)
  for(col = 0; col < size; col++)
    if(row == col)
    {
      tab[row][col] = 1;
      tab[size - row - 1][col] = 1;
    }

Edit: Wystarczy jedna współrzędna, co pokazał @YooSy niżej. ;)

1
const int size = 11;
   int arr[size][size]{0};

   for (int i = 0; i < size; ++i) {
      for (int j = 0; j < size; ++j) {
         if (i == j) { arr[i][j] = 1; }
         if (i + j == size - 1) { arr[i][j] = 1; }
      }
      std::cout << '\n';
   }


   for (int i = 0; i < size; ++i) {
      arr[i][i] = 1;
      arr[i][(size - 1) - i] = 1;
   }

Oba sposoby. Chociaż próbowałeś to rozwiązać.

0
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
    int tab[11][11];
    
	const int size = 15;
   int arr[size][size]{0};
 
   for (int i = 0; i < size; ++i) {
      for (int j = 0; j < size; ++j) {
         if (i == j) { arr[i][j] = 1; }
         if (i + j == size - 1) { arr[i][j] = 1; }
      }
      cout << '\n';
   }
 
   for (int i = 0; i < size; ++i) {
      arr[i][i] = 1;
      arr[i][(size - 1) - i] = 1;
   }
   
   cout << tab[0][0] <<" "<< tab[0][1] <<" "<< tab[0][2] <<" "<< tab[0][3] <<" "<< tab[0][4] <<" "<< tab[0][5] <<" "<< tab[0][6] <<" "<< tab[0][7] <<" "<< tab[0][8] <<" "<< tab[0][9] <<" "<< tab[0][10] <<" "<< endl;
	cout << tab[1][0] <<" "<< tab[1][1] <<" "<< tab[1][2] <<" "<< tab[1][3] <<" "<< tab[1][4] <<" "<< tab[1][5] <<" "<< tab[1][6] <<" "<< tab[1][7] <<" "<< tab[1][8] <<" "<< tab[1][9] <<" "<< tab[1][10] <<" "<< endl;
	cout << tab[2][0] <<" "<< tab[2][1] <<" "<< tab[2][2] <<" "<< tab[2][3] <<" "<< tab[2][4] <<" "<< tab[2][5] <<" "<< tab[2][6] <<" "<< tab[2][7] <<" "<< tab[2][8] <<" "<< tab[2][9] <<" "<< tab[2][10] <<" "<< endl;
		cout << tab[3][0] <<" "<< tab[3][1] <<" "<< tab[3][2] <<" "<< tab[3][3] <<" "<< tab[3][4] <<" "<< tab[3][5] <<" "<< tab[3][6] <<" "<< tab[3][7] <<" "<< tab[3][8] <<" "<< tab[3][9] <<" "<< tab[3][10] <<" "<< endl;
			cout << tab[4][0] <<" "<< tab[4][1] <<" "<< tab[4][2] <<" "<< tab[4][3] <<" "<< tab[4][4] <<" "<< tab[4][5] <<" "<< tab[4][6] <<" "<< tab[4][7] <<" "<< tab[4][8] <<" "<< tab[4][9] <<" "<< tab[4][10] <<" "<< endl;
				cout << tab[5][0] <<" "<< tab[5][1] <<" "<< tab[5][2] <<" "<< tab[5][3] <<" "<< tab[5][4] <<" "<< tab[5][5] <<" "<< tab[5][6] <<" "<< tab[5][7] <<" "<< tab[5][8] <<" "<< tab[5][9] <<" "<< tab[5][10] <<" "<< endl;
					cout << tab[6][0] <<" "<< tab[6][1] <<" "<< tab[6][2] <<" "<< tab[6][3] <<" "<< tab[6][4] <<" "<< tab[6][5] <<" "<< tab[6][6] <<" "<< tab[6][7] <<" "<< tab[6][8] <<" "<< tab[6][9] <<" "<< tab[6][10] <<" "<< endl;
						cout << tab[7][0] <<" "<< tab[7][1] <<" "<< tab[7][2] <<" "<< tab[7][3] <<" "<< tab[7][4] <<" "<< tab[7][5] <<" "<< tab[7][6] <<" "<< tab[7][7] <<" "<< tab[7][8] <<" "<< tab[7][9] <<" "<< tab[7][10] <<" "<< endl;
							cout << tab[8][0] <<" "<< tab[8][1] <<" "<< tab[8][2] <<" "<< tab[8][3] <<" "<< tab[8][4] <<" "<< tab[8][5] <<" "<< tab[8][6] <<" "<< tab[8][7] <<" "<< tab[8][8] <<" "<< tab[8][9] <<" "<< tab[8][10] <<" "<< endl;
								cout << tab[9][0] <<" "<< tab[9][1] <<" "<< tab[9][2] <<" "<< tab[9][3] <<" "<< tab[9][4] <<" "<< tab[9][5] <<" "<< tab[9][6] <<" "<< tab[9][7] <<" "<< tab[9][8] <<" "<< tab[9][9] <<" "<< tab[9][10] <<" "<< endl;
									cout << tab[10][0] <<" "<< tab[10][1] <<" "<< tab[10][2] <<" "<< tab[10][3] <<" "<< tab[10][4] <<" "<< tab[10][5] <<" "<< tab[10][6] <<" "<< tab[10][7] <<" "<< tab[10][8] <<" "<< tab[10][9] <<" "<< tab[10][10] <<" "<< endl;	
    return 0;
}

Jak wyświetlam każdy element, to pojawiają się losowe liczby, a nie ten debilny X z 1 :/

0

@Rafał Żurawski: przeginasz nieco z tym wyświetlaniem zawartości tablicy… Jak długo to pisałeś? ;)

Masz przecież do dyspozycji pętle – używasz ich do wypełnienia tablicy, więc czemu ich nie użyjesz do jej wyświetlenia?

for(int row = 0; row < size; row++)
{
  for(int col = 0; col < size; col++)
    cout << tab[row][col];

  cout << endl;
}
0
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
    int tab[11][11];
    
	const int size = 15;
   int arr[size][size]{0};
 
   for (int i = 0; i < size; ++i) {
      for (int j = 0; j < size; ++j) {
         if (i == j) { arr[i][j] = 1; }
         if (i + j == size - 1) { arr[i][j] = 1; }
      }
      cout << '\n';
   }
 
   for (int i = 0; i < size; ++i) {
      arr[i][i] = 1;
      arr[i][(size - 1) - i] = 1;
   }
   
   	for(int row = 0; row < size; row++)
{
  for(int col = 0; col < size; col++)
    cout << tab[row][col];
 
  cout << endl;
}

    return 0;
}

Co tu jest źle ? Serio nie zdążę sam tego ogarnąć a próbuję od paru dni :/ To co jest wyświetla losowe liczby aka:123543312 itd :/

0
{
      const int size = 11;
      int arr[size][size]{ 0 };

      for (int i = 0; i < size; ++i) {
         arr[i][i] = 1;
         arr[i][(size - 1) - i] = 1;
      }

      std::cout << "\n\n";
      for (int i = 0; i < size; ++i) {
         std::cout << i << '\t';
         for (int j = 0; j < size; ++j) {
            std::cout << arr[i][j] << ' ';
         }
         std::cout << '\n';
      }
   }

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