Matrice : Afisare Diagonala Secundara C/C++ - Ajutor

C/C++ este un limbaj multi-paradigmă de nivel mediu, orientat pe obiecte, folosit pe scară largă în industria software datorită echilibrului dintre viteză şi complexitate. Dacă ai nelămuriri în legătură cu acest limbaj sau vrei să ne înveți ceva chiar tu, intră aici.

Matrice : Afisare Diagonala Secundara C/C++ - Ajutor

Postby jolgau » 10 Apr 2011, 20:35

Se citeste o matrice patratica. Sa se afiseze diagonala secundara.


Problema este ca nu stiu cum sa afisez o diagonala secundara.
Diagonala principala este usor.

  1. for(i=1; i<=n; i++)
  2.      cout<<a[i][i];


Ma puteti ajuta cu citirea diagonalei secundare, va rog frumos.
0,0p / 0 votes
User avatar
jolgau
Bit
 
Joined: 11 Dec 2010
Status: 0

Re: Matrice : Afisare Diagonala Secundara C/C++ - Ajutor

Postby DarkByte » 10 Apr 2011, 20:38

Primul element din diagonala principala e [1][1] ... primul element din diagonala secundara e [1][n-1] ... so ...
  1. [1][1] - [1][n - 1]
  2. [2][2] - [2][n - 2]
  3. [3][3] - [3][n - 3]
  4. ...
  5. [n - 1][n - 1] - [n - 1][1]


Daca te uiti cu atentie, poti gasi o regula :)

Bafta
0,0p / 0 votes
User avatar
DarkByte
11011011
 
Joined: 29 Dec 2009
Status: 140

Re: Matrice : Afisare Diagonala Secundara C/C++ - Ajutor

Postby eni4ever » 10 Apr 2011, 20:42

Este ok explicația ? :
Image
cu i = {0, ..., dim}

P.S: After DB but of course ... :)
0,0p / 0 votes
Image

"Rațiunea vine în umbre scurte numite suferințe." Victor Adăscăliței
"Bender: Anything less than immortality is a complete waste of time.
Zoidberg: Then suicide it is! Step into my office ..." Futurama S06E06
User avatar
eni4ever
DWord
 
Joined: 03 Jan 2010
Location: Timișoara
Status: 57.83

Re: Matrice : Afisare Diagonala Secundara C/C++ - Ajutor

Postby jolgau » 10 Apr 2011, 21:00

Deci codul ar fi asa ?


  1. for(i=1; i<=n; i++)
  2.    for(j=1; j<=n-i; j++)
  3.         cout<<a[i][j];
0,0p / 0 votes
User avatar
jolgau
Bit
 
Joined: 11 Dec 2010
Status: 0

Re: Matrice : Afisare Diagonala Secundara C/C++ - Ajutor

Postby eni4ever » 10 Apr 2011, 21:14

Nu vrei să iei o foaie și un pix și să vezi, pe un exemplu concret, ce îți face codul tău?
După aceea, poate te concentrezi pe explicațiile mele și ale lui Dark.

Hai hai, put some muscle into it,
Spor
0,0p / 0 votes
Image

"Rațiunea vine în umbre scurte numite suferințe." Victor Adăscăliței
"Bender: Anything less than immortality is a complete waste of time.
Zoidberg: Then suicide it is! Step into my office ..." Futurama S06E06
User avatar
eni4ever
DWord
 
Joined: 03 Jan 2010
Location: Timișoara
Status: 57.83

Re: Matrice : Afisare Diagonala Secundara C/C++ - Ajutor

Postby jolgau » 10 Apr 2011, 21:50

.... tot nu m-am descurcat....

Stau aici si imi tot bat capul, dar nu-mi dau seama.

Am reusit sa scot un cod care arata doua elemente din diagonala secundara, dar matricea era din 3.

Ex:
  1. 1  2  3
  2. 4  5  6
  3. 7  8  9


El afiseaza : 3 5 6

Acesta este codul :
  1. for(i=0; i<=n-1; i++)
  2.     for(j=n-i+1; j<=n; j++)
  3.           cout<<a[i][j];


Alte indicatii.....:D
0,0p / 0 votes
User avatar
jolgau
Bit
 
Joined: 11 Dec 2010
Status: 0

Re: Matrice : Afisare Diagonala Secundara C/C++ - Ajutor

Postby eni4ever » 10 Apr 2011, 21:58

Hmm, îți dau codul dacă promiți că încerci să-l urmărești pe explicațiile mele/a lui Dark. Ok ?
Este spre binele tău.

Try this out:
  1. for(i=0; i<n; i++)
  2.           cout<<a[i][n-i-1];


P.S: Poți arăta că ai înțeles postându-ne un snippet în care să afișezi elementele de pe diagonala principală în a cărui indici neapărat să intre n. Adică elementele să fie ceva de genul : a[n...][n...] (la calcularea indicilor să intre dimensiunea matricii + alte operații dacă este cazul :) ). Ordinea de afișare a elementelor nu conteză!
0,0p / 0 votes
Image

"Rațiunea vine în umbre scurte numite suferințe." Victor Adăscăliței
"Bender: Anything less than immortality is a complete waste of time.
Zoidberg: Then suicide it is! Step into my office ..." Futurama S06E06
User avatar
eni4ever
DWord
 
Joined: 03 Jan 2010
Location: Timișoara
Status: 57.83

Re: Matrice : Afisare Diagonala Secundara C/C++ - Ajutor

Postby andreiandreiq » 11 Apr 2011, 02:48

@jolgau: Puteai/poți să te uiti un pic peste vectori si matrici Pascal (nu e C++, dar explică cum stă treaba cu matricile... și pe undeva e și diagonala secundară, poate o să înțelegi ceva).

Legat de titlul topicului, era de ajuns daca puneai doar: "Matrice : Afisare Diagonala Secundara C/C++", nu îi vad rostul la "Ajutor" (cred că puteai și fără C/C++ din moment ce ai postat în secțiunea de C/C++, dar asta e altă poveste).
0,0p / 0 votes
Image
User avatar
andreiandreiq
Word
 
Joined: 30 Dec 2009
Status: 33.33

Re: Matrice : Afisare Diagonala Secundara C/C++ - Ajutor

Postby Cosmin_NTG » 11 Apr 2011, 14:55

eni4ever wrote:Hmm, îți dau codul dacă promiți că încerci să-l urmărești pe explicațiile mele/a lui Dark. Ok ?
Este spre binele tău.

Try this out:
  1. for(i=0; i<n; i++)
  2.           cout<<a[i][n-i-1];


P.S: Poți arăta că ai înțeles postându-ne un snippet în care să afișezi elementele de pe diagonala principală în a cărui indici neapărat să intre n. Adică elementele să fie ceva de genul : a[n...][n...] (la calcularea indicilor să intre dimensiunea matricii + alte operații dacă este cazul :) ). Ordinea de afișare a elementelor nu conteză!

Am incercat sa rezolv si eu problema pe care a-ti propus-o (ma plictiseam) si am reusit (din fericire). Deci, pot sa postez codul? Nu l-am postat direct deoarece problema este adresata altcuiva si era ceva nepoliticos, de aceea am intentionat sa intreb :D.
0,0p / 0 votes
Thinking about solutions is better than thinking about problems
User avatar
Cosmin_NTG
Byte
 
Joined: 11 Jan 2011
Location: 192.2L1.44G
Status: 10

Re: Matrice : Afisare Diagonala Secundara C/C++ - Ajutor

Postby eni4ever » 11 Apr 2011, 15:01

Să înțeleg că s-a înțeles enunțul. Mă bucur ...
Haideți să-i dăm răgaz de rezolvare până diseară. Dacă nu, sunteți invitatul meu :) .

P.S: E rău să dorești ca un om să fie mereu plictisit? ;))
0,0p / 0 votes
Image

"Rațiunea vine în umbre scurte numite suferințe." Victor Adăscăliței
"Bender: Anything less than immortality is a complete waste of time.
Zoidberg: Then suicide it is! Step into my office ..." Futurama S06E06
User avatar
eni4ever
DWord
 
Joined: 03 Jan 2010
Location: Timișoara
Status: 57.83

Re: Matrice : Afisare Diagonala Secundara C/C++ - Ajutor

Postby jolgau » 11 Apr 2011, 15:32

Multumesc mult.

Dar un exemplu mai concret pentru problema :

Adica asa:

1 2 3
4 5 6
7 8 9

Si el sa afiseze :

1n 5n 9n


????


L.E. (-- 11 Apr 2011, 09:02 --)

Asa trebuie sa arate codul pentru afisarea diagonalei secundare ca mie nu-mi functioneaza corect.
Am pus conio.h pentru clrscr(); si getch();


  1. #include<iostream.h>
  2. #include<conio.h>
  3. void main()
  4. {
  5. clrscr();
  6. int a[100][100],i,n,j;
  7. cin>>n;
  8. for(i=1; i<=n; i++)
  9.    {
  10.     for(j=1; j<=n; j++)
  11.     cin>>a[i][j];
  12.     }
  13.  
  14. for(i=0; i<n; i++)
  15.     cout<<a[i][n-i-1]<<" ";
  16. getch();
  17. }
0,0p / 0 votes
User avatar
jolgau
Bit
 
Joined: 11 Dec 2010
Status: 0

Re: Matrice : Afisare Diagonala Secundara C/C++ - Ajutor

Postby eni4ever » 11 Apr 2011, 19:13

Tu observi că matricea o citești pe [1...n][1...n] și afișarea pe diagonală o faci pe [0...n-1] ? Acestea sunt greșeli frecvente la începători, dar cu perseverență, vor dispărea.
Cuvântul cheie aici este perseverență!

P.S: De cerința mea bănuiesc că nici nu intră în discuție, așa este? Eh las' ... bun și-așa!
0,0p / 0 votes
Image

"Rațiunea vine în umbre scurte numite suferințe." Victor Adăscăliței
"Bender: Anything less than immortality is a complete waste of time.
Zoidberg: Then suicide it is! Step into my office ..." Futurama S06E06
User avatar
eni4ever
DWord
 
Joined: 03 Jan 2010
Location: Timișoara
Status: 57.83

Re: Matrice : Afisare Diagonala Secundara C/C++ - Ajutor

Postby jolgau » 11 Apr 2011, 20:07

Acuma merge.

Multumes mult.
0,0p / 0 votes
User avatar
jolgau
Bit
 
Joined: 11 Dec 2010
Status: 0

Re: Matrice : Afisare Diagonala Secundara C/C++ - Ajutor

Postby Cosmin_NTG » 11 Apr 2011, 20:54

Cred ca acum a venit momentul sa postez rezolvarea gandita de mine:
  1. #include<iostream>
  2. using namespace std;
  3. int v[100][100],i,j,n;
  4. int main()
  5. {          cout<<"n=";
  6.            cin>>n;
  7.            for(i=1; i<=n; i++)
  8.            {   for(j=1; j<=n; j++)
  9.                 {   cout<<"v["<<i<<"]["<<j<<"]=";
  10.                     cin>>v[i][j];
  11.                  }
  12.            }
  13.            for(i=1; i<=n; i++)
  14.            {   for(j=1; j<=n; j++)
  15.                {  if(i==j)
  16.                    cout<<v[n-i+1][n-j+1]<<" ";
  17.                }
  18.            }
  19.            return 0;
  20. }

Precizari: 1--Stiu ca for-urile pornesc de la 1 (ratez un element) dar daca pornesc de la 0 nu mai afisaza corect.
2--Indeplineste cerintele problemei (se afisaza indicii de pe diagonala principala iar in componenta lor se afla dimensiunea matricei). :D Astept pareri.
0,0p / 0 votes
Thinking about solutions is better than thinking about problems
User avatar
Cosmin_NTG
Byte
 
Joined: 11 Jan 2011
Location: 192.2L1.44G
Status: 10

Re: Matrice : Afisare Diagonala Secundara C/C++ - Ajutor

Postby eni4ever » 11 Apr 2011, 21:20

Îți admir strădania (chiar dacă este venită după un moment de plictiseală :) ).

Principial este Ok, dar gândește-te la un aspect : dacă vrei să pornești de la 0 ... de ce nu corelezi citirea cu afișarea astfel încât cele 4 for-uri să pornească de la 0 ? Nu este păcat de a[0][0]? Este bine să gândești și în termeni de optimizarea resurselor ... Nu știi niciodată unde te va duce viața să lucrezi ca și programator (gândindu-mă că asta îți dorești altfel nu ai fi printre noi, corect? ). Ai putea ajunge, de pildă, să lucrezi pe microcontrollere de 32kile ... 32 de Kile în care fiecare bit contează. Dar poate exagerez ... merita totuși amintit. ;)

Revenind ... o altă zonă de optimizare ar fi regiunea de afișare ... gândește așa :
dacă if(i == j) este Adevărat, atunci i poate fi înlocuit cu j sau j poate fi înlocuit cu i în corpul if-ului. Ele două fiind egale altfel nu s-ar fi executat if-ul, corect?
Păi dacă este așa, atunci
  1. cout<<v[n-i+1][n-j+1]<<" ";

poate fi înlocuit cu
  1. cout<<v[n-i+1][n-i+1]<<" ";

=> cele 2 for-uri sunt defapt 1 :
  1. for(i=1; i<=n; i++)
  2.  cout<<v[n-i+1][n-i+1]<<" ";

așa este?

Acum este Ok.
0,0p / 0 votes
Image

"Rațiunea vine în umbre scurte numite suferințe." Victor Adăscăliței
"Bender: Anything less than immortality is a complete waste of time.
Zoidberg: Then suicide it is! Step into my office ..." Futurama S06E06
User avatar
eni4ever
DWord
 
Joined: 03 Jan 2010
Location: Timișoara
Status: 57.83

Re: Matrice : Afisare Diagonala Secundara C/C++ - Ajutor

Postby noobakaflo » 11 Apr 2011, 21:24

Daca vrei tot cu 'if' , ai putea face :

  1. if (i+j==n+1)
  2.     cout<<v[i][j]<<" ";


Dar oricum as zice eu ca e cel mai bine printr-o parcurgere,cum facu eni :D
0,0p / 0 votes
User avatar
noobakaflo
Bit
 
Joined: 10 Dec 2010
Location: Ploiesti
Status: 1

Re: Matrice : Afisare Diagonala Secundara C/C++ - Ajutor

Postby smith » 11 Apr 2011, 22:00

O să fiu puțin offtopic, dar nu contează.

Chiar dacă nu o să lucrați pe microcontrollere, eleganța codului este foarte importantă.
Am spus-o și o mai repet: indicii vectorilor în C/C++ încep de la 0. Și ce dacă (poate) e mai complicat la început? Un pic de antrenament pentru creier nu strică. E natural din punct de vedere matematic și informatic.
Multe limbaje au această convenție. Pascal este o excepție, dar oferă și posibilitatea utilizării indicilor care încep de la 0(sau chiar indici negativi).

C, C++, Java, Python, Ruby, C#, PHP(unde array-urile parcă seamănă mai mult a array-uri asociative) și multe altele adoptă același stil.

Mai devreme sau mai târziu poate o să lucrați ca programatori și nu cred că vreți să fiți de râsul curcilor (cum e S.A. - un programator foarte notoriu și care este subiectul multor mișto-uri).
0,0p / 0 votes
Ilea Cristian
User avatar
smith
Enum
 
Joined: 29 Dec 2009
Location: Cluj-Napoca
Status: 82

Re: Matrice : Afisare Diagonala Secundara C/C++ - Ajutor

Postby Cosmin_NTG » 12 Apr 2011, 14:48

@eni4ever: Aveti dreptate (nici nu ma asteptam altfel, doar sunteti programator). O precizare ar fi ca atunci cand am spus "daca pornesc de la 0 nu mai afiseaza corect" (for-urile) m-am referit ca toate 4 sa porneasca de la 0 pentru ca am verificat inainte.
Codul ar fi cam asa:
  1. #include<iostream>
  2. using namespace std;
  3. int v[100][100],i,j,n;
  4. int main()
  5. {          cout<<"n=";
  6.            cin>>n;
  7.            for(i=0; i<n; i++)
  8.            {   for(j=0; j<n; j++)
  9.                 {   cout<<"v["<<i+1<<"]["<<j+1<<"]=";
  10.                     cin>>v[i][j];
  11.                  }
  12.            }
  13.            for(i=0; i<n; i++)
  14.            {   for(j=0; j<n; j++)
  15.                {  if(i==j)
  16.                    cout<<v[n-i+1][n-j+1]<<" ";
  17.                }
  18.            }
  19.            return 0;
  20. }
  21.  

Este acelasi cod, un pic modificat la afisarea indicilor si, evident, for-urile pornesc de la 0 dar nu afisaza corect.
0,0p / 0 votes
Thinking about solutions is better than thinking about problems
User avatar
Cosmin_NTG
Byte
 
Joined: 11 Jan 2011
Location: 192.2L1.44G
Status: 10

Re: Matrice : Afisare Diagonala Secundara C/C++ - Ajutor

Postby eni4ever » 12 Apr 2011, 16:50

^ Pornind de la 0, se schimbă un pic datele problemei. În ce sens? Păi, vom lua indicii şi vom vedea concret :
Pentru n-j+1 (acelaşi lucru aplicându-se şi pentru "n-i+1"), discutăm cazul în care, aşa cum s-a prezentat iniţial, :
  • Dacă j = 1 => n-j+1 = n-1+1 = n (indicele ultimului element)
  • Dacă j = 2 => n-j+1 = n-2+1 = n-1 (indicele penultimului element)
  • [alţi indici]
  • Dacă j = n => n-j+1 = n-n+1 = 1 (în cazul tău, indicele primului element)
Totul e bine şi frumos până schimbăm limitele :
Dacă , avem aceeaşi analiză, dar (ŞOC!) alte rezultate:
  • Dacă j = 0 => n-j+1 = n-0+1 = n+1 (indice invalid/greşit + 1)
  • Dacă j = 1 => n-j+1 = n-1+1 = n (indice invalid/greşit )
  • Dacă j = 2 => n-j+1 = n-2+1 = n-1 (indice ultimului element )
  • [alţi indici]
  • Dacă j = n-1 => n-j+1 = n-(n-1)+1 = n - n + 1 + 1 = 2 (un indice oarecare din cadrul spaţiului != de primul element)

Concluzie: Calculul indicilor nu se mai aplică pe noul model de acces al memoriei. Mai joacă-te un pic cu formulele.
Hint: Urmăreşte pic-ul din primul meu reply la acest topic, poate ajută! Uită-te în mod special la semnele alese ;). There's a good lad!

Ai văzut "The Butterfly Effect" ? "Un fluture care dă din aripi pe o parte a planetei, provoacă uragane în cealaltă parte". Întrebare : Putem, ca şi programatori, să vedem fluturele?

Spor
0,0p / 0 votes
Image

"Rațiunea vine în umbre scurte numite suferințe." Victor Adăscăliței
"Bender: Anything less than immortality is a complete waste of time.
Zoidberg: Then suicide it is! Step into my office ..." Futurama S06E06
User avatar
eni4ever
DWord
 
Joined: 03 Jan 2010
Location: Timișoara
Status: 57.83

Re: Matrice : Afisare Diagonala Secundara C/C++ - Ajutor

Postby Cosmin_NTG » 12 Apr 2011, 17:59

Depinde pe ce parte a planetei suntem sau pe ce parte a planetei da din aripi fluturele :D.
0,0p / 0 votes
Thinking about solutions is better than thinking about problems
User avatar
Cosmin_NTG
Byte
 
Joined: 11 Jan 2011
Location: 192.2L1.44G
Status: 10

Next

Return to C / C++

Who is online

Users browsing this forum: No registered users and 0 guests