PDA

Prikaži potpunu verziju : Zbir dijagonala u matrici


programer_01
30.4.2014, 14:10
Pozz za sve forumase ako moze pomoc oko jednoga zadatka. U ovome prvome djelu nema nista tesko napravim dvije petlje jednu u drugoj unesem sve elemente i napravim uslov da ne moze se unjeti isti element. E sada je problem kako izracunati taj zbir na koji fazon ja to ne mogu da skontam nikako? Mislim kako napraviti tu pelju

Zadatak:
http://postimg.org/image/5jtzbcbxv/
moze a i ne mora citav zadatak najbitniji je ovaj dio koji zbraja elemente lijeve i desne dijagonale..

Markonije
30.4.2014, 15:06
Pa na kom mestu se nalaze elementi na dijagonali?


ako je N red a M kolona

N1M1,N2M2,N3M3,N4M4,N5M5 - leva dijagonala




Jel tako,e onda petlju koja inkrementira K i I (povecava za jedan,posto 'k' i 'i' sluze kao indexi elemenata,tj poziciju gde se nalazi element u matrici) i cita element u svakom prolazu...


Kod i desnu dijagonalu skontaj sam,neces nauciti nista ako dobijes sve gotovo! (ovo bash moras sam da prokljuvis,tome i sluzi)

Ivan452
1.5.2014, 1:48
E ovako:

Kao sto ti pise u zadatku recimo da imas N za broj kolona i M za broj redova.
Svaka matrica ima dve dijagonale: glavnu dijagonalu i sporednu dijagonalu.
Glavna dijagonala je skup elemenata: a[1,1], a[2,2], a[3,3] ... a[N,N]
Sporedna dijagonala je skup elemenata: a[N,1], a[N-1,2], a[N-1,3] ... a[1,N].

Matricu ces verovatno cuvati kao dvodimenzionalni niz u programskom jeziku u kojem radis, tako da ces moci direktno da pristupis vrednostima elemenata.
I za glavnu i za sporednu dijagonalu ti je potrebna po jedna petlja, koja ce da ide do N i da sabira po gore datim formulama.

programer_01
1.5.2014, 11:02
Ne razumijem kako formirati te dvije petlje ja sam pokusvao sve i svasta i ne da mi se. Nije problem kada se racunaju dijagonale koje ne zavise od indeksa elementa tada je lako a kod mene zavise od indeksa elementa koji ja unesem pise gore k i l i od toga elementa racuna se lijeva i desna dijagonala ne ukljucujici taj element. Sto znaci ako unesem indeks drugog elementa
nece biti
a[1,1], a[2,2], a[3,3] ... a[N,N] i a[N,1], a[N-1,2], a[N-1,3] ... a[1,N].

Sun Tzu
1.5.2014, 12:10
Napiši lepo celu matricu na papir, ionako je maks. 5x5, nije problem ispisati.
Onda probaj za tipa elemente npr. 24, 32, 53.
Lepo napiši šta se sabira, koji tu elementi ulaze u zbir, pa zaključi kako se krećeš kroz petlju tj. uopšti sve to.

ivan90BG
1.5.2014, 19:49
Pa primer sve govori. Date su koordinate [2,2], treba odrediti dve dijagonale koje prolaze kroz to polje. Prva dijagonala (paralelna sa glavnom) će biti [1,1] [2,2] [3,3] [4,4] [5,5]. A druga (parallena sa sporednom) će biti [3,1] [2,2] [1,3]. Samo treba d ase primete zakonitosti koje važe u ovim brojevima, nisu teške. Samo nam treba malo bolji primer. Recimo da uzmemo polje [3,4]:

Prva dijagonala: [1,2] [2,3] [3,4] [4,5]
Druga dijagonala: [5,2] [4,3] [3,4] [2,5]

Za prvu dijagonalu primećujemo da obe koordinate rastu, s tim što su obe ograničene na interval od 1 do 5. Za drugu dijagonalu promećujemo da kada jedna raste druga opada sa istim ograničenjem.

Dakle trebaju ti četiri petlje, za svaku dijagonalu po jedna koja ide levo od datog polja i jedna koja ide desno od datog polja. Naravno petlje će imati dupli indeks. Recimo za prvu dijagonalu petlja koja ide levo od datog polja će početi tako što će početni indeksi biti za jedan manje od datih, pri svakoj iteraciji oba indeksa će se dekrementovati, a uslov prestanka je da bilo koji od indeksa padne ispod 1. Na desnu stranu će biti inkrementovanje, a uslov prestanka bilo koji indeks veći od 5.

Valjda možeš sam odavde da zaključiš šta se dešava za drugu dijagonalu. :)

p.s. ja mislim da se da zaključiti da je jezik Pascal, jer indeksi počinju od 1. :)

programer_01
2.5.2014, 2:38
Hvala na pomoci napokon sam ga uspio uraditi.Meni radi probao sam vise vrsta matrica i indeksa elemenata i pokazalo mi se da radi dobro. E sada ja ne znam je li to bas tako desavalo mi se cesto da ga uradim neki zadatak mislim da je dobro i tek onda kada ga malo bolje procackam skontam da ima neka greska. E sada ako neko moze da pogleda ovo moje i da kaze svoje misljenje mislim kakv je ovo nacin rjesavanja da li postoji nesto jos jednostavnije od ovoga inace ovo je zadatak sa nekog takmicenja za koje po zadatku treba 24 minute meni je nekako malo tih 24 minute za ovaj zadatak ima dosta pisati i razmisljati...


#include<stdio.h>
main(){
int k,l,i,j,n,m,a,b,stop=0,sl1=0,sl2=0,sd1=0,sd2=0;
printf("N=");
scanf("%d",&n);
printf("M=");
scanf("%d",&m);
int niz[n][m];
for(i=0;i<n;i++)
for(j=0;j<m;j++)
scanf("%d",&niz[i][j]);
printf("k=");
scanf("%d",&k);
printf("l=");
scanf("%d",&l);
a=k-1,b=l-1;
while(stop==0){
a++;
b++;
sl1+=niz[a][b];
if ((a==n-1)||(b==m-1)) stop=1;}
a=k-1,b=l-1,stop=0;
while(stop==0){
a--;
b--;
sl2+=niz[a][b];
if ((a==0)||(b==0)) stop=1;}
a=k-1,b=l-1,stop=0;
while(stop==0){
a++;
b--;
sd1+=niz[a][b];
if ((b==0)||(a==n-1)) stop=1;}
a=k-1,b=l-1,stop=0;
while(stop==0){
a--;
b++;
sd2+=niz[a][b];
if ((a==0)||(b==m-1)) stop=1;}
printf("\nZbir dijagonala je:%d",sd1+sd2+sl1+sl2);
}

ivan90BG
2.5.2014, 11:37
Ovako napisano jeste tačno i radi ono što zadatak traži, ali ovaj kod nije naročito lep i pun je loših navika. Prepravio sam tvoj kod u ovo:


#include <stdio.h>

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

int n, m; //veličina matrice
int k, l; //polje za dijagonale
int i, j; //iteratori
int prvaLevo = 0;
int prvaDesno = 0;
int drugaLevo = 0;
int drugaDesno = 0;

//unos dimenzija matrice
printf("N=");
scanf("%d", &n);
printf("M=");
scanf("%d", &m);

//unos elemenata
int niz[n][m];
for (i = 0; i < n; i++) {
for (j = 0; j < m; j++) {
scanf("%d", &niz[i][j]);
}
}

//unos polja za dijagonale (indeksi počinju od 1)
printf("k=");
scanf("%d", &k);
printf("l=");
scanf("%d", &l);

//popravljanje indeksa
k = k-1;
l = l-1;

//prva dojagonala levo od polja
for (i=k-1, j=l-1; (i >= 0) && (j >= 0); --i, --j) {
prvaLevo += niz[i][j];
}
//prva dijagonala desno od polja
for (i=k+1, j=l+1; (i < n) && (j < m); ++i, ++j) {
prvaDesno += niz[i][j];
}
//druga dijagonala levo od polja
for (i=k+1, j=l-1; (i < n) && (j >= 0); ++i, --j) {
drugaLevo += niz[i][j];
}
//druga dijagonala desno od polja
for (i=k-1, j=l+1; (i >= 0) && (j < m); --i, ++j) {
drugaDesno += niz[i][j];
}
int zbir = prvaLevo + prvaDesno + drugaLevo + drugaDesno;
printf("\nZbir dijagonala je:%d", zbir);
return 0;
}


Šta je promenjno. Definicija main funkcije, dodato return 0, uklonjene promenljive viška (a i b), deklaracije promenljivih razdvojene i izkomentarisane. Zbirovima data imena (kratka a deskriptivna), ugnježdena petlja popravljena da liči na nešto, stavljeno komentari na delove koda. Četiri petlje koje sabiraju prepravljene tako da se lakše razume kako rade (iteratorke promenljive se po konvenciji postinkrementuju, a koristi se uslov nastavka petlje, a ne uslov prestanka, izvinjavam se što sam u prethodnom postu pomenuo uslov prestanka, trebao sam uslov nastavka).

Pisanje koda tako da je čitljiv i deskriptivan je važno da bi drugi mogi da ga razumeju, a i ti sam kada ga budeš čitao posle nekog vremena, ali ne samo zato, pisanje čitljivog koda je važno i dok ga pišeš. Ako daješ onakva imena promenljivama kada dođeš do dela programa gde treba da napišeš srž, glavni algoritam, moraš dobro da razmisliš koja promenljiva ti je za šta da ne bi pogrešio. A ako daješ deskriptivna imena (alie ne mnogo dugačka) i imaš algoritam u glavi, mnogo će ti biti lakše da ga ispišeš, a da ti se ne prekine tok misli.

Inače, ja tebi ništa ne zameram, i ja sam pisao onakav kod dok sam bio u gimnaziji, posle sam video kako izgleda čitljiv kod. Samo ti preporučujem da učiš da tuđim, a ne na svojim greškama. :)

programer_01
2.5.2014, 16:43
Hvala druze nisam znao da se ovo moze raditi preko for petlje mislio sam da mora while.. Ali sada znam ovako je dosta jednostavnije...
Jedino sto mi nije jasno u citavome kodu jeste int argc, char** argv
u funkciji main. Sta to znaci?? Probao sam i bez toga i program normalno radi...

Sun Tzu
2.5.2014, 17:05
Main, kao i sve druge funkcije, može da ima parametre.

http://stackoverflow.com/questions/4176326/arguments-to-main-in-c

programer_01
2.5.2014, 17:13
Evo jos malo kada sam bolje pogledao zapela mi je za oko ova petlja sa duplim indeksom.
for (i=k-1, j=l-1; (i >= 0) && (j >= 0); --i, --j) {
prvaLevo += niz[i][j]; }
Malo me zbunjuje ova dva ampersena && to znaci 'I' E sada pitanje je kada se se zaustavti ova petlja po nekoj mojoj logici sto ja mogu zakljciti jeste kada oba indeska budu 0 ali to ne treba tako ne moraju oba indeksa biti 0 kada sam ja radio onaj svoj program ja sam stavljao uslov || 'ILI' jer mislim da tako i treba a ovo mi nije jasno kako ona funkcionise....

Sun Tzu
2.5.2014, 17:27
Ta petlja radi dokle god su i i j veći/jednaki od 0. Čim jedan od ta 2 uslova ne uspe ( i ili j budu manji od 0), završava se for.

Kod ivana (tj. u C-u) su polja matrice od 0 do m-1, u zadatku gore idu od 1 do m.

programer_01
2.5.2014, 17:36
Jasno mi je to za indexe u C-u idu od nule a ono je gore vjerovato zadatak iz PASCAL-a pa zato idu od 1.. Kako se zove ova petlja sa duplim indexom sta da ukucam da malo to prucim ko nje me ne bude indexi ovo 0 m-1 vec samo logicki operator && u toj petlji

Sun Tzu
2.5.2014, 17:45
Nije to nikakva spec. petlja, ti u for možeš ubaciš koliko god oćeš uslova i provera i dodela itd.
Inače, &&. (http://sr.wikipedia.org/wiki/%D0%9B%D0%BE%D0%B3%D0%B8%D1%87%D0%BA%D0%B0_%D0%BA% D0%BE%D0%BD%D1%98%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1 %98%D0%B0)