Pomoć oko matrice

Pomoć oko matrice

offline
  • Pridružio: 29 Maj 2013
  • Poruke: 5

Pozdrav za sve članove prije svega.
Imam problem sa jednim zadatkom koji sam dobio da rešim pa vas zamoljavam za pomoć.

Zadatak:
Napisati funkcije kojim se na osnvu date matrice A(NxN) formira niz b[0],...b[n-1] čiji su elementi redom jednaki:
a) sumi elemenata u vrstama matrice A;
b) proizvodu elemenata vrste;
c) najmanjim vrednostima u vrstama matrice A;
d) razlici najvećih i najmanjih vrednosti u vrsti.

Zamoljavam sve za pomoć, hitno mi je...
Hvala unaprijed. Smile



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
offline
  • Milan
  • Pridružio: 17 Dec 2007
  • Poruke: 14823
  • Gde živiš: Niš

Pa oko čega ti je potrebna pomoć? Šta ti konkretno nije jasno?



offline
  • Pridružio: 29 Maj 2013
  • Poruke: 5

vasa.93 ::Pa oko čega ti je potrebna pomoć? Šta ti konkretno nije jasno?
Iskreno da ti kažem prijatelju nije mi jasan cijeli zadataka, nemam nikakvog iskustva sa ovim matricama. :/

offline
  • Milan
  • Pridružio: 17 Dec 2007
  • Poruke: 14823
  • Gde živiš: Niš

Pa onda prinauči to pa probaj da odradiš sam i kad zapneš javi se, pomoći ćemo ti.
Realno, nema svrhe da ti neko napiše ceo kod koji ti nećeš razumeti. Wink

offline
  • Pridružio: 29 Maj 2013
  • Poruke: 5

Evo ljudi nešto sam radio, eh sad su problem ove funkcije, npr. ova za sumiranje, zapeo sam kod ovog što sam boldiro i podvuko, tačnije rečeno ne znam sada da postavim komandu da izračuna sumu elemnata samo za jedan red (vrstu), ovo što sam ja uradio računa sumu elemenata cijele matrice. Ne mogu odavdje nikako da se pomaknem, nadam se da sam ovaj dio dobro uradio. :S
Zahvaljujem vam se unaprijed. Smile

main()
{
int a[10][10],b[100];
int i,j,n;
int suma();
int proizvod();
int min();
int razlika();
printf("Unesite broj vrsta(kolona) kvadratne matrice: ");
scanf("%d",&n);
printf("Unesite podatke vrstu po vrstu:\n");
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
printf("a) Suma elemenata:\n");
for(i=0;i<n;i++)
printf("B[%d]=%d\n",i,suma(a,n));
printf("b) Proizvod elemenata:\n");
for(i=0;i<n;i++)
printf("B[%d]=%d\n",i,proizvod(a,n));
printf("c) Najmanja vrijednost:\n");
for(i=0;i<n;i++)
printf("B[%d]=%d\n",i,min(a,n));
printf("d) Razlika elemenata:\n");
for(i=0;i<n;i++)
printf("B[%d]=%d\n",i,razlika(a,n));
getch();
}

/*Funkcija za sumiranje*/
int suma(int a[][10],int n)
{
int i,j;
int s=0;
for(i=0;i<n;i++)
for(j=0;j<n;j++)

s=s+a[i][j];
return s;
}

offline
  • Milan
  • Pridružio: 17 Dec 2007
  • Poruke: 14823
  • Gde živiš: Niš

Napisano: 31 Maj 2013 14:46

Čitam sad baš zadatak i nisam siguran šta tačno treba uraditi. Koliko razumem, prva funcija treba da računa sumu elemenata svake vrste i da razultat upisuje u niz. Dakle, ja sam to ovako razumeo:
Sumu prve vrste upisujemo u B[0]
Sumu druge vrste upisujemo u B[1]
.
.
.
Sumu n-te vrste upisujemo u B[n-1]
Ako je tako, kako ima n vrsta, u niz B će biti upisano n elemenata, pa, kako je navedeno da niz B ima n elemenata, praktično "neće biti mesta" u nizu za dalja upisivanja, odnosno krajni niz (nakon izvršenja svih funkcija i svih upisa u niz) neće imati n elemenata nego više (4*n pošto svaka funkcija upisuje po n elemenata).

Svakako, ne možeš iz te funcije koju si napisao da odrediš sumu samo jedne vrste. Da bi odredio sumu samo jedne vrste funcija mora da ima argument koji će predstavljati broj vrste čiju sumu računaš. Dakle, funkcija ukupno treba da ima tri argumenta. Prvi će biti matrica (u tvom primeru a[][]), drugi će biti dimenzija matrice (dakle n) i treći će biti broj vrste koju treba sumirati. Kako imaš n vrsta, imaćeš brojač i, i pozivaćeš n puta funkciju suma gde će ti u svakom ciklusu treći argument biti brojač i, i za svaki poziv ćeš vrednost koju funkcija vrati upisivati u niz B.

Funcija za sumiranje bi izgledala ovako:
int suma(int A[100][100], int n, int v) { int i, s=0; for(i=0; i<n; i++) s=s+A[v-1][i]; //v-1 zato što prva vrsta ima indeks 0, zato što druga ima indeks 1,... return s; }

Elemente bi u niz B upisivao (na način, opisan gore, na koji sam ja shvatio zadatak) na sledeći način:
for(i=0; i<n; i++) B[i]=suma(A, n, i);

Dopuna: 31 Maj 2013 15:10

Inače, gledao sam samo funkciju suma, ne i ostalo.
BTW, gde su ti definicije ostalih funkcija?

offline
  • Pridružio: 29 Maj 2013
  • Poruke: 5

Dobro si razumeo, znači niz B se formira od svake vrste.
Npr:
a) Suma elemenata vrste: b[0]=...
b[1]=...
b[2]=...
b) Proizvod elemenata vrste: b[0]=...
b[1]=...
b[2]=...
c) Najmanja vrijednost vrste: b[0]=...
b[1]=...
b[2]=...
d) Razlika najveceg i najmanjeg u vrsti: b[0]=...
b[1]=...
b[2]=...
Ja sam zadatak priveo kraju pomoću onog tvog načina sumiranja i hvala ti na tome, međutim nastao je problem kod proizvoda (a) jer mi množi samo prva dva člana, npr: ako je matrica A(3x3), on mi množi kao da je A(2x2), a sličan je problem i kod razlike jedan član kao da izbaci. Evo ti Kod pa pogledaj:
main() {       int a[10][10],b[100];       int i,j,n;       int suma();       int proizvod();       int min();       int razlika();       printf("Unesite broj vrsta(kolona) kvadratne matrice: ");       scanf("%d",&n);       printf("Unesite podatke vrstu po vrstu:\n");       for(i=0;i<n;i++)         for(j=0;j<n;j++)            scanf("%d",&a[i][j]);       printf("a) Suma elemenata vrste:\n");       for(i=0;i<n;i++)         printf("B[%d]=%d\n",i,suma(a,n,i));       printf("b) Proizvod elemenata vrste:\n");       for(i=0;i<n;i++)         printf("B[%d]=%d\n",i,proizvod(a,n,i));       printf("c) Najmanja vrijednost vrste:\n");       for(i=0;i<n;i++)         printf("B[%d]=%d\n",i,min(a,n,i));       printf("d) Razlika najveceg i najmanjeg u vrsti:\n");       for(i=0;i<n;i++)         printf("B[%d]=%d\n",i,razlika(a,n,i));       getch();       }        /*Funkcija za sumiranje*/ int suma(int a[][10],int n, int j) {     int i,s=0;     for(i=0;i<n;i++)           s=s+a[j][i];       return s; } /*Funkcija za mnozenje*/ int proizvod(int a[][10],int n, int j) {     int i,p=0;     for(i=0;i<n;i++)           p=a[j][i]*a[j][i];       return p; } /*Funkcija za najmanju vrijednost*/ int min(int a[][10],int n, int j) {     int i,min;     min=a[j][i];     for(i=0;i<n;i++)       if(min>a[j][i])           min=a[j][i];       return min; } /*Funkcija za razliku*/ int razlika(int a[][10],int n, int j) {     int i,min,max,r;     max=a[0][0];     for(i=0;i<n;i++)       if(max<a[j][i])           max=a[j][i];     min=a[j][i];     for(i=0;i<n;i++)       if(min>a[j][i])           min=a[j][i];     for(i=0;i<n;i++)            r=max-min;       return r; }      

offline
  • Milan
  • Pridružio: 17 Dec 2007
  • Poruke: 14823
  • Gde živiš: Niš

Generalno, ne valja ti izraz unutar petlje. Ovako kako si ga napisao, funkcija će da vraća kvadrat poslednjeg elementa matrice. Dakle, da bi pomnožio sve elemente jedne vrste praktično moraš da imaš promenljivu p (koju pre petlje inicijalizuješ na 1), a onda u for petlji u svakom ciklusu množiš vrednost promenljive p sa elementom matrice, i novodobijenu vrednost opet dodeljuješ promenljivoj p. Dakle, slično kao kada računaš faktorijel.

Funkcija bi trebalo da izgleda ovako:
int proizvod(int A[100][100], int n, int j) {     int i, p=1;     for(i=0; i<n; i++)           p*=A[j][i];       return p; }

Dobro, zadatak je podeljen u četiri dela. Ja sam računao da se u niz upisuju vrednosti nakon svakog poziva funkcije i da se prethodno upisane vrednosti ne presnimavaju. Dobro, tačno, može da se radi i sa jednim nizom od n elemenata. Samo, u tom slučaju bi niz morao da prikažeš pre novog upisa u niz, tj. pre prelaska na drugi deo zadatka (sa a) na b), sa b) na c), ...).

Gledam sada glavni program, i vidim da ti uopšte nemaš formiran niz B, ni u jednom sličaju. Ono što ti radiš jeste direktan prikaz. Ok je to, međutim, to nije ono što se traži u zadatku. Dakle, pre nego što odštampaš elemente (proizvod, sumu, bilo koje) moraš da ih upišeš u niz B, a onda praktično štampaš niz B.

Što se tiče funkcije za razliku maksimuma i minimuma, ni to ne valja.
Pre svega, opet si loše inicijalizovao vrednosti min i max. Dakle, na početak ih postavljaš na min=A[j][0] i max=A[j][0]. Nakon toga tražiš minimum i maksimum. Možeš i u jednoj petlji (dva if-a), a možeš i u dve, ovako kako si uradio. Nakon toga, treća petlja koju si napisao je potpuno nepotrebna. U jednoj vrsti imaš jedan maksimum i jedan minimum. Dakle, samo jednu vrednost računaš, a to je r=max-min.

Funkcija bi trebalo da izgleda ovako:
int razlika(int A[100][100], int n, int j) {     int i, min=a[j][0], max=a[j][0], r;     for(i=0; i<n; i++)     {       if(max<a[j][i])           max=a[j][i];       if(min>a[j][i])           min=a[j][i];     }          r=max-min;       return r; }

U funkciji za minimum promenljivu min inicijalizuješ na min=[j][0], ili pre toga i inicijalizuješ na i=0. Ovako kako si napisao neće da radi jer pozivaš promenljivu i koja nije inicijalizovana. Nakon takve inicijalizacije, brojače možeš i da pustiš da kreću od 1, međutim, sasvim je isto i kada kreću i od nule.

Nakon ovoga, sve funkcije bi trebalo da su ok. Samo ispravi ovo za niz B, formiraj ga prvo (napisao sam ti iznad kako to možeš da uradiš) pa tek onda štampaj i to je sve. Very Happy

offline
  • Pridružio: 29 Maj 2013
  • Poruke: 5

Evo završio sam, radi sve extra, HVALA TI PUNO PRIJATELjU Very HappyD

Ko je trenutno na forumu
 

Ukupno su 1168 korisnika na forumu :: 30 registrovanih, 6 sakrivenih i 1132 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: _Rade, A.R.Chafee.Jr., bladesu, bokisha253, cavatina, celik, cifra, Frunze, Griffon vulture, kerist88, Komentator, Kriglord, Kubovac, loon123, M1los, mean_machine, milenko crazy north, milutin134, mnn2, nenad81, nick79, Oscar2, raptorsi, stegonosa, tubular, vathra, vladom6, wolverined4, zastavnik, zixmix