C++ "okretanje" 5x5 matrice

poruka: 11
|
čitano: 6.084
|
moderatori: XXX-Man, vincimus
1
+/- sve poruke
ravni prikaz
starije poruke gore
13 godina
neaktivan
offline
Pomoc u c++?Matrice

Pozdrav svima.

 

Potrebna mi je pomoc oko jednog zadatka.Naime treba mi  program koji trazi od korisnika da unese elemente u matricu velice 5x5 nakon cega se vrsi zamjena elemenata po slijedecem primjeru:

 

 

 

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

 

 

5    4    3    2     1

10  9    8    7    6

15  14  13   12   11

20  19  18   17   16

25  24  23   22    21

 

Dakle u principu okrene matricu naopako :D :D

 

Ako neko moze pomoci bio bih mu zahvalan.Pozz

 

 

 
0 0 hvala 0
13 godina
neaktivan
offline
Re: Pomoc u c++?Matrice

Dakle, razbiješ algoritam na sljedeći način

za svaki red

  za svaki stupac

   unesi broj u tom retku i stupcu

 

za svaki red

  zamijeni prvog i zadnjeg odnosno prvog i petog odnosno 0. i 4.

  zamijeni drugog i predzadnjeg odnosno drugog i četvrtog odnosno 1. i 3.

 

 

Samo se sjeti kako deklarirati matricu 5x5, kako pristupiti individualnim ćelijama, kako zamijeniti vrijednosti dviju varijabli i kako se indeksiraju polja u C++-u.

 

Sretno :)

16 godina
neaktivan
offline
Pomoc u c++?Matrice

Jedna od opcija ::

Uzeo sam matricu 1x25 umjesto 5x5 ali ti slično ide za obje.

Malo samo razradi kod ua 5x5 verziju iako i 1x25 je iste funkcionalnosti ali drukčijeg ustroja.

Ako ti nije neophodno 5x5 onda možda i navedeni kod bude dovoljan. 

 

 

#include <iostream>

 

using namespace std;

 

int main()

{

 

 cout<< "Unesi 25 brojeva u matricu: " << endl;

 

int first[25];

for(int i=0 ; i<25 ; i++)

{

  cin>> first[i];

}

 

int* temp = first;

 

cout<< "ORIGINALNA MATRICA" << endl << endl;

for(int i=0 ; i<25 ; i++)

{

 

 if(i != 0 && i%5 == 0)

  {

   cout<< endl;

  } 

   cout<< *(temp) << " ";

   temp = temp + 1;

}

 

cout<< endl << endl;

 

 

int second[25]; 

temp = second;

int first_num = 0;

int  last_num = 4;

int temp_count = 0;

 

for (int i = 0 ; i<25 ; i++)

{

 

if(first_num != 0 && first_num%5 == 0)

  {

   temp_count += 5;

   last_num  += 5;

  } 

 

   *(second+first_num) =  *(first+last_num-first_num+temp_count);

    first_num++;

 

}

 

cout<< endl << endl << "IZOKRENUTA MATRICA" << endl << endl;

 

for(int i=0 ; i<25 ; i++)

{

  if(i != 0 && i%5 == 0)

  {

    cout<< endl;

  } 

 

  cout<< *(temp) << " ";

  temp = temp + 1;

 

}

 

return 0;

 

}

 

Poruka je uređivana zadnji put sri 14.12.2011 12:48 (nik_02).
Moj PC  
1 0 hvala 0
13 godina
neaktivan
offline
Pomoc u c++?Matrice

Uf, ne mogu prokužiti logiku izokretanja, moguće je da je točna no netrivijalna je.

 

Matrice možeš definirati kao:

int matrica[5][5];

 

i onda ti je i-ti redak i j-ti stupac

matrica[i][j]

 

Ali ako već koristiš jednodimenzionalno polje umjesto dvo, onda imaš sljedeće mapiranje

(i, j) => i * 5 + j

 

odnosno, preskoči za svaki redak po N elemenata (gdje je N broj stupaca) i dodaj redni broj stupca. Jer 5x5 matrica u jednoj dimenziji ima zapis

0 1 2 3 4 5 6 7 8 9...

odnosno

0 1 2 3 4

5 6 7 8 9

...

 

primjeti da je drugi redak prvi plus 5

 

Ono što si trebao je:

// za svaki redak matrice

for (int i = 0; i < 5; ++i)

{

  // na prvo mjesto tog retka stavi 5. iz druge tablice istog retka

  second[i * 5 + 0] = first[i * 5 + 4];

  // na drugo mjesto tog retka stavi 4. iz druge tablice istog retka

  second[i * 5 + 1] = first[i * 5 + 3];

}

 
2 0 hvala 0
15 godina
neaktivan
offline
Pomoc u c++?Matrice

Dakle, jednostavno kad pohranjujes pohrani u mat[5-i][j] a ne u mat[i][j]...

Moj PC  
0 0 hvala 0
16 godina
neaktivan
offline
Re: Pomoc u c++?Matrice

Točno je. Slobodno provjeri na linku http://ideone.com/. Imaš opciju za input pa ubaci svojevoljno 25 brojeva.

Da , netrivijanog je izgleda ali to i nije u ovom slučaju bitno jer daje traženi rezultat a i nisam baš siguran po postu da je tražena edukacija kroz kod.

 

Poruka je uređivana zadnji put sri 14.12.2011 12:53 (nik_02).
13 godina
neaktivan
offline
Pomoc u c++?Matrice

Evo uspio sam isprogramirati na ovaj nacin:

 

#include<iostream>
using namespace std;
int main(){

int niz[5][5];
cout<<"Unesite niz : "<<endl;
for(int i=0;i<5;i++)
for(int j=0;j<5;j++){
cout<<"Unesite "<<i<<""<<j<<" clan niza: ";
cin>>niz[i][j];
}


cout<<"Unijeli ste niz: "<<endl;
for(int i=0;i<5;i++){
for(int j=0;j<5;j++)
cout<<" "<<niz[i][j];
cout<<endl<<endl;
}
cout<<endl<<endl;
int k=4;
for(int i=0;i<2;i++){
for(int j=0;j<5;j++){
int temp=niz[j][i];
niz[j][i]=niz[j][k];
niz[j][k]=temp;
}
k--;
}
cout<<"Nakon izmjene niz izgleda: "<<endl<<endl;
for(int i=0;i<5;i++){
for(int j=0;j<5;j++)
cout<<" "<<niz[i][j];
cout<<endl<<endl;
}
system("pause");
}

 

Hvala na pomoci i objasnjenju :) :) :)

 
0 0 hvala 0
17 godina
moderator
offline
Re: Pomoc u c++?Matrice
nik_02 kaže...

Jedna od opcija ::

Uzeo sam matricu 1x25 umjesto 5x5 ali ti slično ide za obje.

Malo samo razradi kod ua 5x5 verziju iako i 1x25 je iste funkcionalnosti ali drukčijeg ustroja.

Ako ti nije neophodno 5x5 onda možda i navedeni kod bude dovoljan.

Jednodimenzionalno (1x25) polje je (matematički gledano) vektor. Matrica je dvodimenzionalno polje.

14 godina
neaktivan
offline
C++ "okretanje" 5x5 matrice

Ako je matrica napravljena kao 2D statičko polje onda je ono u memoriji zapravo vektor (1D polje). Npr;

 

int matrica[5][5], int* p;

 

i nakon

 

p = &matrica[0][0];

 

može se koristiti kao da je riječ o 1D polju tj.

 

p[0] ... p[25]

http://www.chess.com/livechess/profile/Tracer1808
Moj PC  
1 0 hvala 1
16 godina
neaktivan
offline
Re: Pomoc u c++?Matrice
mbaksa kaže...
nik_02 kaže...

Jedna od opcija ::

Uzeo sam matricu 1x25 umjesto 5x5 ali ti slično ide za obje.

Malo samo razradi kod ua 5x5 verziju iako i 1x25 je iste funkcionalnosti ali drukčijeg ustroja.

Ako ti nije neophodno 5x5 onda možda i navedeni kod bude dovoljan.

Jednodimenzionalno (1x25) polje je (matematički gledano) vektor. Matrica je dvodimenzionalno polje.

 

Naravno , u pravu si.To nije sporno isto kao što nije sporno da dvodimenzionalna matrica 5x5 može biti baza za pohranu pet peteročlanih vektora. Kad sam naveo ""Malo samo razradi kod za 5x5 verziju iako i 1x25 je iste funkcionalnosti"" mislio sam samo na pojam funkcionalnosti koji se može primjeniti na ovom zadatku odnosno da i jednim i drugim načinom dolazimo do istog riješenja.

OpenGL npr. koristi jako puno matrice 4x4 za razne transformacije...itd ali su definirane kao jednodimenzionalna polja 1x16 column major radi svojih prednosti u odnosu na 4x4 polja.

Tehnički gledano sam pogriješio uzimajući 1x25 ali u ovom konkretnom slučaju je rezultat isti.

17 godina
neaktivan
offline
C++ "okretanje" 5x5 matrice
Možda malo kasnim, ali zasto ne jednostavno napraviti dvodimenzionalno polje koje ce cuvati sve vrijednosti matrice. I onda red po red ubacivati u stack i samo iz stacka izvaditi van.
Moj PC  
0 0 hvala 0
1
Nova poruka
E-mail:
Lozinka:
 
vrh stranice