Creearea unei matrici


stifflerr


Ni s-a dat noua la scoala azi o problema care spunea sa construim o matrice in felul urmator:
16 15 14 13
9 10 11 12
8 7 6 5
1 2 3 4 .
Am facut noi problema la tabla, dar fiind mai ambitios am zis hai sa fac varianta mea, dupa mine, una mai eficienta din urmatoarele puncte de vedere:timp si spatiu.
Problema facuta in clasa arata cam asa:
CODE
#include<fstream.h>
void main()
{int a[20][20],i,j,k,m,n,l;
cin>>n>>m;
for(i=1;i<=m;i++)
a[n][i]=i;
l=m;
k=0;
for(i=n-1;i>=1;i--)
if(k==0)
{for(j=m;j>=1;j--)
{l++;
a[i][j]=l; }
k=1}
else
for(j=1;j
{l++;
a[i][j]=l;
k=0; }
for(i=1;i<=n;i++)
{for(j=1;j<=m;j++)
cout<<a[i][j]<<" ";
cout<<endl;}
}


La ce m-am gandit eu...
Am observat urmatoarea chestie, luand spre exemplu liniile in care numerele sunt in ordine crescatoare. Am schimbat fontul in rosu la numerele 1 si 9. diferenta dintre ele este de 2m, la fel si intre 5 si 13. In capu meu mi-am spus sa fac un for si sa intreb daca linia este para(asta inseamnand ca numere vor fi in ordine crescatoare).Daca e asa, atunci cu urmatoarea formula m(m-j)+1 ar trebui sa-mi scrie numerele in ordine crescatoare incepand exact cu cat iese rezultatul. De exemplu pt m=4, cum e matricea noastra, 4(4-4)+1=1, astea inseamna ca pe a 4a linie, sa se scrie numerele 1 2 3 4, pt j=2 va fi 4(4-2)+1=9, numerele fiind 9 10 11 12.Analog si la liniile impare. pt j=3, 4(4-3)+1=5...
Asta ar fi cam teoretic. La practic o sa ma incurc.
Cu ce as vrea eu sa ma ajutati daca vreti si puteti. Sa mi se spuna daca ideea ar merge, daca e mai eficienta si ca timp si ca spatiu. Eu am sa fac programul dupa mine si as vrea sa fie corectat unde trebuie
CODE
#include<fstream.h>
void main()
{int a[50][50], i,j,n,m;
cin>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
if(m%2==0)
a[m][i]=m(m-j)+1; //aici cred ca nu e bun.
else
for(i=n;i>=1;i--)
for(j=m;j>=1;j--)
a[m][i]=m(m-1)+1; //nici aici nu cred ca e bun. M-am gandit sa iau invers pt a le putea pune descrescator.

....
iar daca de aici imi iese problema restu e simplu....

Va multumesc anticipat!!!
bogdan092
nu cred ca problema ta e mai rapida deoarece folosesti 4 for-uri imbricate
daca codul e mai scurt nu inseamna ca e mai bun,sau mai rapid tongue.gif
 
stifflerr
QUOTE (bogdan092 @ 22nd September 2009, 20:59) *
nu cred ca problema ta e mai rapida deoarece folosesti 4 for-uri imbricate
daca codul e mai scurt nu inseamna ca e mai bun,sau mai rapid tongue.gif


bine asta poate sa treaca. Tot timpu eu am avut varianta mea. Si am fost apreciat si rasplatit pentru asta. Dar problema asta practic mi-a pus probleme. Si nu vreau sa ma las pana nu ii dau de capat. tongue.gif
dani.user
Indenteaza si tu codul asta ca arata oribil tongue.gif
Trecand peste void main(), ce inseamna "#include " ?
stifflerr
QUOTE (dani.user @ 22nd September 2009, 21:07) *
Indenteaza si tu codul asta ca arata oribil tongue.gif
Trecand peste void main(), ce inseamna "#include " ?

eu am scris si <fstream.h>..nu stiu de ce nu a aparut..editez acum
in fine, ceva idei, sugestii? confused.gif
bogdan092
Ti-am editat sursa ta,si am pus niste comentarii:

CITAT (stifflerr @ 22nd September 2009, 20:52) *
CODE
#include <iostream>
using namespace std;
void main()
{int a[50][50], i,j,n,m,k;
cin>>n>>m;
k=n*m; k este numarul de elemente din toata matricea
for(i=1;i<=m;i++)
{
if(i%2==0) /*in primul rand ai confundat n cu m,eu presupun ca m este nr de linii
m ramane neschimbat,de aceea tu trebuie sa testezi i,care este incrementat cu 1;
daca linia este un numar par
pornesti alt for cu j de la n la 1 */
for(j=n;j>=1;j--)
{
a[i][j]=k; //a[i][j] primeste numarul k,dupa care il scadem cu 1
k--;
}
else
for(j=1;j<=n;j++)
{
a[i][j]=k; //a[i][j] primeste numarul k,dupa care il scadem cu 1
k--;
}
}

//afisare
.

Rezolvarea pe care ti-am scris-o e asemanatoare cu ce ai facut in clasa.Daca ai nelamuriri spune-mi,dar intai testeaza codul asta si urmareste pas cu pas.


NLC
numai ca in C/C++ numaratoarea elementelor unui tablou incepe de la 0.
 
bogdan092
CITAT (NLC @ 23rd September 2009, 15:14) *
numai ca in C/C++ numaratoarea elementelor unui tablou incepe de la 0.

si daca eu pun elementele de la pozitia 101 in sus ar fi o problema?? smile.gif Pentru un incepator e mai usor sa inceapa de la 1 decat de la 0. wink.gif
dani.user
E mai sanatos sa inveti ceva corect de la inceput decat sa corectezi ulterior.
Asa o sa ajungi cand ai a[50] sa accesezi a[50] si uneori iti va crapa programul.
bogdan092


CITAT (dani.user @ 23rd September 2009, 16:36) *
E mai sanatos sa inveti ceva corect de la inceput decat sa corectezi ulterior.
Asa o sa ajungi cand ai a[50] sa accesezi a[50] si uneori iti va crapa programul.

Ai dreptate,dar NLC a zis ca asta ar fi ceva gresit,de parca nu ar compila programul laugh.gif
Eu am pus de la 1 ca sa nu il induc in eroare.Cand va ajunge la siruri de caractare atunci va numara elementele de la 0,obligatoriu tongue.gif .
Mosotti
QUOTE (bogdan092 @ 23rd September 2009, 16:20) *
Ai dreptate,dar NLC a zis ca asta ar fi ceva gresit,de parca nu ar compila programul laugh.gif

gresit nu inseamna doar sa nu compileze. cind iti spune compilatorul ca ai gresit inca e bine. problema este cind faci o timpenie si-ti crapa programul fara sa ai habar de ce, doar programul "compileaza"
bogdan092
CITAT (Mosotti @ 23rd September 2009, 17:33) *
gresit nu inseamna doar sa nu compileze. cind iti spune compilatorul ca ai gresit inca e bine. problema este cind faci o timpenie si-ti crapa programul fara sa ai habar de ce, doar programul "compileaza"

Se cheama greseala de semantica.Si nu inteleg de ce exagerati?Nu i-am sugerat ca asa ar trebuie sa foloseasca vectorii in continuare,doar am vrut sa mentionez ca nu e greseala de sintaxa daca incepi de la pozitia 1 sleep.gif .
OriginalCopy
QUOTE (bogdan092 @ 23rd September 2009, 17:38) *
Se cheama greseala de semantica.Si nu inteleg de ce exagerati?Nu i-am sugerat ca asa ar trebuie sa foloseasca vectorii in continuare,doar am vrut sa mentionez ca nu e greseala de sintaxa daca incepi de la pozitia 1 sleep.gif .


Nu e o greseala sintactica, e o greseala de gandire, iar o gandire gresita este fatala (si frustranta) pentru un programator. Programarea este o stiinta exacta, deci nu mai indemna incepatorii de pe aici la practici de programare GRESITE.

Mai bine abtine-te si lasa-i pe altii sa-i stimuleze pe incepatori sa invete CORECT de la bun inceput. Crede-ma ca sunt destule locuri unde poti gresi, la lucruri mult mai complexe, si li se intampla multora chiar daca au experienta de zeci de ani (refactoring anyone?), deci nu mai pune si stanca asta a greselilor banale pe umerii incepatorilor.

Edit:

O gandire sanatoasa pentru un programator este una ascutita si limpede, facand totul cu cap. Un astfel de program cu greseala off-by-one poate functiona, dar functioneaza pentru ca se intampla sa functioneze (read: pt ca face compilatorul niste chestii "inteligente" pentru programatorii prosti), si nu functioneaza pentru ca asa l-a gandit programatorul sa functioneze.

Special pt tine si pt cei care gandesc ca tine: Lucruri pe care orice programator ar trebui sa le stie, Si pe care mi-ar fi placut sa mi le spuna si mie cineva la inceput
bogdan092
CITAT (OriginalCopy @ 23rd September 2009, 19:10) *
Nu e o greseala sintactica, e o greseala de gandire, iar o gandire gresita este fatala (si frustranta) pentru un programator.


Cred ca tu confunzi greselile de sintaxa cu cele de semantica.
Definitia sintaxei:
CITAT
Sintaxa este un set de reguli care definesc exact ce conbinații de litere, numere
și simboluri pot fi folosite într-un limbaj de programare. Nu se acceptă ambiguități.
Vom vedea că încălcarea oricărei reguli a limbajului, de exemplu scrierea incorectă a
unui cuvânt sau uitarea unei virgule pot genera erori de sintaxă (syntax errors) și
codul sursă nu poate fi compilat până la corectarea lor.

Definitia semanticii:
CITAT
Semantica este un set de reguli care determină semnificația instrucțiunilor
scrise într-un limbaj de programare.

CITAT
Programarea este o stiinta exacta, deci nu mai indemna incepatorii de pe aici la practici de programare GRESITE.
Mai bine abtine-te si lasa-i pe altii sa-i stimuleze pe incepatori sa invete CORECT de la bun inceput.


Am zis si mai sus ca nu l-am indemnat la nimic.Chiar el avea in codul sursa de la scoala vectori care aveau elemente de la pozitia 1,deci i-am dat rezolvarea in acelasi fel in care e obisnuit sa o faca.
Daca cineva pune un program aici care afiseaza text cu printf() tu ai sa ii faci morala pt ca nu foloseste cout??Fiecare face asa cum e invatat,si cu timpul se corecteaza singur.Lasa omul sa invete din greselile facute.Si profesorii sunt cei care ar trebui sa-i stimuleze pe incepatori sa invete CORECT de la bun inceput.
Am facut destul offtopic pana acum,si niciunul nu aveti curaj sa recunoasteti ca v-ati luat de mine degeaba.Daca erati asa de preocupati cu ajutatul incepatorilor,ii explicati voi cum sa-si rezolve problema,nu eu.Asa ca ,OriginalCopy,nu ai niciun drept sa spui ca indemn incepatorii la practici de programare gresite.La inceputul topic-ului nu dadea nimeni un reply,cand era vorba de ajutat pe cineva,dar la criticat se baga jumatate de forum.Singurul reply primit pana sa va luati de mine,era de la dani.user care il critica pentru ca nu era identat codul si nu stia ce inseamnca #include.Normal ca e mai usor de facut asta,in loc sa ii explici cum sa rezolve si apoi sa ii dai niste sfaturi despre lizibilitatea codului.Dar...traim in Romania!
Chiar nu am putina dreptate si eu??
OriginalCopy
QUOTE (bogdan092 @ 23rd September 2009, 20:34) *
Cred ca tu confunzi greselile de sintaxa cu cele de semantica.
Cred ca nu ai citit the dragon book. Dupa aceasta lectura vei percepe ca mine (corect).

QUOTE (bogdan092 @ 23rd September 2009, 20:34) *
Am zis si mai sus ca nu l-am indemnat la nimic.Chiar el avea in codul sursa de la scoala vectori care aveau elemente de la pozitia 1,deci i-am dat rezolvarea in acelasi fel in care e obisnuit sa o faca.
Daca tot ajuti, fa-ti un serviciu si ajuta proactiv, pentru long-term.

QUOTE (bogdan092 @ 23rd September 2009, 20:34) *
Am facut destul offtopic pana acum,si niciunul nu aveti curaj sa recunoasteti ca v-ati luat de mine degeaba.Daca erati asa de preocupati cu ajutatul incepatorilor,ii explicati voi cum sa-si rezolve problema,nu eu.
Nu sunt mereu si peste tot, nici macar nu e forumul meu, dar imi place sa ajut (profilul spune multe). No bine, ai ajutat o data, felicitari, dar nu fa un caz din asta.

QUOTE (bogdan092 @ 23rd September 2009, 20:34) *
Am facut destul offtopic pana acum,si niciunul nu aveti curaj sa recunoasteti ca v-ati luat de mine degeaba.Daca erati asa de preocupati cu ajutatul incepatorilor,ii explicati voi cum sa-si rezolve problema,nu eu.
Nu am o problema cu faptul ca ai ajutat, ci ca ai ajutat gresit, chiar sustinand ceva gresit.

QUOTE (bogdan092 @ 23rd September 2009, 20:34) *
Dar...traim in Romania!
Nu toti.
QUOTE (bogdan092 @ 23rd September 2009, 20:34) *
Chiar nu am putina dreptate si eu??
Ai dreptate in masura in care ceri apreciere, dar p-asta nu o primesti (cel putin pe Programming) doar ajutand, ci ajutand si corect.

La ce te astepti, sa vad cum spui o tampenie si sa o las asa? Sper ca nu, spre binele initiatorului (ca tot ii vrei binele incercand sa-l ajuti).
bogdan092
Nu imi dau seama cum de la o simpla observatie am ajuns sa ne contrazicem in halul asta.
-NLC
CITAT
numai ca in C/C++ numaratoarea elementelor unui tablou incepe de la 0.

-corect,in mod normal elementele tabloului se pun de la pozitia 0,dar nu e obligatoriu

Daca NLC spunea ca numaratoarea elementelor POATE incepe de la 0,si ca asa e recomandat,nu ii ziceam nimic.Dar el a spus asta ca si cum ar fi ceva interzis,de parca ar fi o greseala de sintaxa.Compilatorul nu afiseaza nici macar un warning,asa ca am dreptate.
Credeam ca e un forum mai serios,dar voi nu v-ati obosit sa cititi ce scriu deloc.

CITAT
Nu am o problema cu faptul ca ai ajutat,ci ca ai ajutat gresit,chiar sustinand ceva gresit

puteam sa ii dau 100 de sfaturi,dar l-am ajutat cu ce avea nevoie,si din cate imi dau seama nu am sustinut nimic gresit.chiar as vrea sa imi arati citatul in care ii spun eu sa inceapa de la 1.
Si nu ma laud ca l-am ajutat,nu fac un caz din asta,dar in loc sa ii spuneti lui chestiile astea,voi mi le reprosati mie.As vrea sa stiu care de aici la ajutat cu ceva(in afara umplerii topicului de comentarii inutile)?

EDIT:Mai bine inchideti topicul.

Vad ca unii moderatori profita de puterea care o au si sterg comentarii dupa cum au chef.
msmihai
can we just stop ? aveti fiecare dreptate . originalcopy are dreptate pentru ca a corectat o gresala de-a ta, tu ai dreptate pentru ca unele notiuni precum "semantica" pot fi interpretate. gata odata tongue.gif aveti PM la dispozitie pentru scos ochii , nu e nevoie sa stricati topicul omului. Ok ?
Nu inchidem, poate vine cineva cu o idee buna pentru problema lui sau chiar el isi da seama ce nu mergea la el si pune codul bun.
Mosotti
QUOTE (bogdan092 @ 23rd September 2009, 17:38) *
Se cheama greseala de semantica.Si nu inteleg de ce exagerati?Nu i-am sugerat ca asa ar trebuie sa foloseasca vectorii in continuare,doar am vrut sa mentionez ca nu e greseala de sintaxa daca incepi de la pozitia 1 sleep.gif .



nu, se cheama greseala grava. ai un vector alocat de 50 de elemente. daca tu mergi de la al doilea element 50 de elemente o sa iesi din vector. de-aia se pleaca de la 0, nu de la 1. cind aloci un vector de 50 de elemente presupui ca vei aveam maxim 50 de elemente in el. iterind de la al doilea element de 50 de ori te duci la dracu prin boscheti. java, care e mai finutz cu cei care fac timpenii, o sa trinteasca o exceptie. in c, o sa cam crape. sau poate ca nu. dracu stie. evident ca daca NU vei avea maximul de elemente poti sa incepi de unde vrei atita timp cit mai ai destul loc. dar NU ARE SENS

prin urmare, daca profesorul ala (sau ce dracu o fi) e un cretin cu pene trebuie stabilit de la bun inceput, nu lasat ca "mere si asa". merge pina crapa, dupa care nu mai merge
secretalex92
Deci concluzia ar fi ca niciodata sa nu accesezi ultimul element al vectorului
CODSURSA
int a[50];
a[50]; // poate sa-ti crape programul si cand ai scris un  proiect de 100 de linii nu mai asta iti lipsea :P

Eu nu vad cum vrei sa imbunatatesti sursa de la clasa? Si asa trebuie sa initializezi n*m numere, ce rost are daca folosesti 2 for-uri sau unu singur. Tot n*m este complexitatea.
Singurul lucru ce poti sa-l faci e sa afisezi direct numerele, sa nu le mai retii intr-o matrice biggrin.gif
Daca vrei o formul ar fi urmatoarea:
CODSURSA
  if(  i%2 )
  {
       a[i][j]=(n-i+1)*m-i*j+i;
   }
   else {
                a[i][m-j+1]=(n-i+1)*m-i*j+i;
          }

Sper ca nu am gresit formula wink.gif
ps: Indicii i-am luat de la 1 ca sa nu te incruci tongue.gif
Mosotti
QUOTE
Deci concluzia ar fi ca niciodata sa nu accesezi ultimul element al vectorului

concluzia este sa nu accesezi dupa ultimul element din vector. ultimul element din vector poti sa-l accesezi multi si bine, de-aia e "element din vector". de fapt concluzia este ca un vector cu n elemente are indecsii de la 0 la n-1

de fapt daca s-ar incepe cu inceputul la materiile alea fecale care tin loc de materii de info, ar putea sa explice de fapt ce se afla in spatele unei chestii de genul a[30] si bietii copii s-ar prinde imediat de ce incepe de la 0 si se termina la 29. insa in loc sa se explice mai intii chestii DE BAZA ale limbajului se fac tot felul de probleme stupide, inutile si cretinoide, cum ar fi umplerea unui vector cu valori in toate felurile, cind saracu elev nici nu stie ce se afla in spatele unui vector si de la ce index incepe
bogdan092
CITAT (secretalex92 @ 24th September 2009, 12:16) *
ps: Indicii i-am luat de la 1 ca sa nu te incruci tongue.gif

cred ca te referi la stiffler aici,nuuuu??

CITAT (Mosotti @ 24th September 2009, 13:07) *
concluzia este sa nu accesezi dupa ultimul element din vector. ultimul element din vector poti sa-l accesezi multi si bine, de-aia e "element din vector". de fapt concluzia este ca un vector cu n elemente are indecsii de la 0 la n-1

de fapt daca s-ar incepe cu inceputul la materiile alea fecale care tin loc de materii de info, ar putea sa explice de fapt ce se afla in spatele unei chestii de genul a[30] si bietii copii s-ar prinde imediat de ce incepe de la 0 si se termina la 29. insa in loc sa se explice mai intii chestii DE BAZA ale limbajului se fac tot felul de probleme stupide, inutile si cretinoide, cum ar fi umplerea unui vector cu valori in toate felurile, cind saracu elev nici nu stie ce se afla in spatele unui vector si de la ce index incepe

voi incercati sa-mi explicati mie cum sa folosesc vectorii? laugh.gif Sunt incepator,dar nici chiar asa(clasa a XII-a).Tot nu vreti sa intelegeti ca eu doar am facut o observatie,atat.
@Mosotti
Nu te pune nimeni sa folosesti toate elementele din vector.
NLC
CITAT (bogdan092 @ 23rd September 2009, 15:31) *
si daca eu pun elementele de la pozitia 101 in sus ar fi o problema?? smile.gif Pentru un incepator e mai usor sa inceapa de la 1 decat de la 0. wink.gif

un incepator trebuie sa inteleaga ca in C numaratoarea se face de la 0 altfel o sa aiba bataie de cap la programe foarte simple sau ii va fi greu cand ajunge la operatii cu pointeri.

CITAT (bogdan092 @ 23rd September 2009, 17:20) *
Ai dreptate,dar NLC a zis ca asta ar fi ceva gresit,de parca nu ar compila programul laugh.gif
Eu am pus de la 1 ca sa nu il induc in eroare.Cand va ajunge la siruri de caractare atunci va numara elementele de la 0,obligatoriu tongue.gif .

Eu nu vad unde am zis ca programul nu o sa compileze. Doar am facut observatia ca numaratoarea incepe de la 0 si tu ai sarit in sus.
stifflerr
QUOTE (bogdan092 @ 23rd September 2009, 17:20) *
Ai dreptate,dar NLC a zis ca asta ar fi ceva gresit,de parca nu ar compila programul laugh.gif
Eu am pus de la 1 ca sa nu il induc in eroare.Cand va ajunge la siruri de caractare atunci va numara elementele de la 0,obligatoriu tongue.gif .


nu-i problema, ca stiu numerotarea de la 0 la n-1...la siruri de caractere sunt acum.
greseala a pornit de la mine ca nu am inceput le la 0 pana la n.
stifflerr
QUOTE (bogdan092 @ 22nd September 2009, 21:19) *
Ti-am editat sursa ta,si am pus niste comentarii:


Rezolvarea pe care ti-am scris-o e asemanatoare cu ce ai facut in clasa.Daca ai nelamuriri spune-mi,dar intai testeaza codul asta si urmareste pas cu pas.



Multumesc mult..
A mers cum trebuia first.gif
Aceasta este o versiune simplificată a paginii originale. Pentru a vizita versiunea originala click aici.