matice

C,C++,C#

Moderátori: psichac, Moderátori

JuroOO
Stály člen
Stály člen
Príspevky: 225
Dátum registrácie: 02 Dec 2011, 12:59
Bydlisko: Trnava

matice

Príspevok od používateľa JuroOO » 15 Dec 2013, 14:33

Zdravím pohol by my niekto poradit, mám za ulohu vytvorit transponovanú maticu z matice[8][9] .Na tú už mam vytvorenu procedúru aby ju náhodne vygenerovalo. ale ako mám zavolať tu proceduru v procedure transponuj maticu aby tá procedura pracovala s už vytvorenou maticou?

void transponujMaticu(int matica[8][9], int transponovana[9][8]){
generujMaticuNahodne(matica);
for(int i = 0; i < 9; ++i){
for(int j = 0; j < 8; ++j){
transponovana[j] = matica[j];
cout << transponovana[j]<<"\t";
}
cout <<endl;
}
}
0

fillo777
Okoloidúci
Okoloidúci
Príspevky: 28
Dátum registrácie: 06 Jún 2011, 00:00
Vek: 31

Re: matice

Príspevok od používateľa fillo777 » 15 Dec 2013, 14:58

Ahoj,
budes musiet pracovat s pointermi. Bud to spravis tak, ze das ako parameter funkcie generujMaticuNahodne adresu premennej matica, alebo to spravis tak, ze funkcia nebude mat parametre a bude vracat pointer na to vytvorene pole.
0

JuroOO
Stály člen
Stály člen
Príspevky: 225
Dátum registrácie: 02 Dec 2011, 12:59
Bydlisko: Trnava

Re: matice

Príspevok od používateľa JuroOO » 15 Dec 2013, 15:41

No s pointermi som sa ešte nestretol takže nemám šajnu čo to je..no a to že ,.ze das ako parameter funkcie generujMaticuNahodne adresu premennej matica,, to ako ??????

Noa ešte tu mám toto, má to spočítať súčet prvkov na obvode

int sucetPrvkovNaObvode(int matica[8][9]){
int sucet=0;
int a=0,b=0,c=0,d=0;
generujMaticuNahodne(matica);
for(int i=0;i<8;i++){
for(int j=0;j<9;j++){
if(i==8) {a=a+matica[j];}
if(j==9) {d=d+matica[j];}
if(j==0) {c=c+matica[j];}
if(i==0) {b=b+matica[j];}

}
}
sucet=a+b+c+d;
return sucet;

}


výsledok my vyhodí okolo -400, čo je málo, neviete kde može byt chyba?
0

fillo777
Okoloidúci
Okoloidúci
Príspevky: 28
Dátum registrácie: 06 Jún 2011, 00:00
Vek: 31

Re: matice

Príspevok od používateľa fillo777 » 15 Dec 2013, 16:09

Ohladom pointerov... ono to chce trochu casu, aby si to vstrebal... Skus si pozriet na nete nejake tutorialy.
Este ma napadlo najjednoduchsie riesenie, ale v niektorych pripadoch nie uplne najspravnejsie, ze definujes premennu matica ako globalnu. To potom nebudu potrebne ziadne parametre.

Ta chyba bude pravdepodovne v tom, ze si si neuvedomil ake hodnoty dosahuju i a j... Cyklus mas
for(i = 0; i < 8; i++) {
}
Dosiahne i niekedy hodnotu 8? :)
+ ak to budes robit tymto sposobom, tak prvky na rohoch matice zapocitas do suctu 2 krat.
0

Používateľov profilový obrázok
chameleon
Okoloidúci
Okoloidúci
Príspevky: 39
Dátum registrácie: 31 Okt 2011, 09:51
Bydlisko: Bratislava
Vek: 10
Kontaktovať používateľa:

Re: matice

Príspevok od používateľa chameleon » 15 Dec 2013, 16:15

Adresa = pointer = smernik, tzn. predavas funkcii nie hodnotu, ale adresu premennej. Ak si sa s tym este nestretol, tak tadial cesta nevedie zatial(ale je to lepsie riesit cez pointre...). Problem je, ze funkcii generujMaticuNahodne(matica) sice predas hodnoty, ale cokolvek v tej funkcii spravis sa prejavi len v samotnej funkcii generujMaticuNahodne. Nezmeni hodnoty v povodnej matici. pomoze ak si int matica[8][9] zadefinujes ako globalnu premennu, tak sa vyhnes pouzitiu pointrov. Preto zle pocita aj sucet prvkov na obvode..
0

Používateľov profilový obrázok
scd
Stály člen
Stály člen
Príspevky: 150
Dátum registrácie: 17 Apr 2009, 00:00
Bydlisko: Dubnica nad Váhom
Vek: 35

Re: matice

Príspevok od používateľa scd » 15 Dec 2013, 18:29

Nechcem vás chlapci uraziť, ale radíte mu blbosti s tými pointrami.
Veď čo si myslíte, ten názov poľa reprezentuje? Jeho hodnotu??? :D
Názov poľa je práve jeho adresa je to smerník na prvý prvok poľa, tak doštudujte :)
A to stým globálnym poľom radšej vynechajte, je to najhorší návyk, ktorý treba odučiť a nie ešte na to niekoho navádzať.

JuroOO:
deklaruj si obidve matice.
funkcii transponujMaticu predaj tieto matice ako parametre(normalne len nazov tych dvojrozmerných polí).
funkcii generujMaticuNahodne predaj pole matica tak ako si to mal, čiže:
generujMaticuNahodne(matica);
tá ti priradí náhodné hodnoti do poľa matica.
Ak vieš, čo je to debugovanie, tak ho použi a odkrokuj si program, aby si názorne videl, čo sa tam deje, čo sa zapisuje do premenných.

edit:
A aby som ti aj trošku poradil, pozri si hlavne to aké hodnoty nadobúda premenná i a j a ako máš deklarované pole matica.
0
Keyboard not present. Press ENTER to continue...

fillo777
Okoloidúci
Okoloidúci
Príspevky: 28
Dátum registrácie: 06 Jún 2011, 00:00
Vek: 31

Re: matice

Príspevok od používateľa fillo777 » 15 Dec 2013, 18:50

@scd
Ake blbosti s pointrami? Ak definiciu tej funkcie generovania ma takymto sposobom, tak to podla mna takto jednoducho nepojde. Ved vsetko co v tej funckii generovania urobi zostane len v tej funkcii. Ak by chcel, aby sa obsah mohol pouzit aj mimo funkcie mala by byt funkcia definovana nejak takto

generujMaticuNahodne(int **matica) {
generovanie...
}

a v maine
int **matica = (int **)calloc (width * height, sizeof(int *));

for(int i = 0; i < heigth; i++) {
matica = (int *) calloc (width, sizeof(int));
}

generujMaticuNahodne(matica);

Syntaxou si nie som uplne isty, pisem to z hlavy.
Prosim povedz co presne si mam dostudovat?
0

Používateľov profilový obrázok
chameleon
Okoloidúci
Okoloidúci
Príspevky: 39
Dátum registrácie: 31 Okt 2011, 09:51
Bydlisko: Bratislava
Vek: 10
Kontaktovať používateľa:

Re: matice

Príspevok od používateľa chameleon » 15 Dec 2013, 19:23

scd ma samozrejme pravdu, ze preda funkcii pointer na prvy prvok v poli, avsak predpokladam ze v generujmaticunahodne robi psie kusy... preto nemeni hodnoty povodnej matice, kedze nevie o pointroch nic... a pocita to zle.
Co sa tyka globalnych premennych, je to dogma, globalne premenne su fajn, ak ich vies vhodne pouzit. Silou mocou zapuzdrovat a neriesit globalne premenne kde sa to pyta, je takisto hlupost. Nevravim, ze zrovna tu je to vhodne, ale ak sa zatial uci iba zakladne algoritmy, nema sajn o tom co s tym robi compiller a co sa kde deje.. Nech zisti casom. Takto by sme mohli ist neviem kam, preco to nerobi elegantnejsie, preco to nerobi optimalne hned, preco nedodrzuje MISRA C pravidla atd...
0

Používateľov profilový obrázok
scd
Stály člen
Stály člen
Príspevky: 150
Dátum registrácie: 17 Apr 2009, 00:00
Bydlisko: Dubnica nad Váhom
Vek: 35

Re: matice

Príspevok od používateľa scd » 15 Dec 2013, 19:43

Samozrejme, že ak sa niekde hodí použitie globálnej premennej tak je blbosť silou mocou to robiť lokálnou premennou. No v tomto prípade je zasa zbytočné to robiť globálnou premennou, a takisto ide asi aj o to aby sa chalan naučil používať funkcie a odovzdávať im parametre. k tým psím kúskom - preto som mu odporučil nech si to odkrokuje, na tom nie je nič zložité sa to naučiť a určite mu to len pomôže. A pri takýchto základných operáciách s poliami nemusí poznať ešte pointre, tiež nevravím, že by to bolo na škodu, no chalan sa očividne teprve učí a možno by to bolo na neho príliš veľa zo začiatku. Neskôr možno pochopí a dostaví sa mu "AHA" efekt :)

fillo777:
ak predáš funkcii pointer na premennú tak sa podľa teba vytvorí nová inštancia premennej?
proste názov poľa je pointer na jeho prvý prvok hotovo. Ak prvky pola sú typu int* tak jeho názov bude reprezentovať int **.
0
Keyboard not present. Press ENTER to continue...

fillo777
Okoloidúci
Okoloidúci
Príspevky: 28
Dátum registrácie: 06 Jún 2011, 00:00
Vek: 31

Re: matice

Príspevok od používateľa fillo777 » 15 Dec 2013, 19:58

@scd
pardon... zmylil som sa... Odjakziva som bol v tom, ze ked to mas zadane takto
int sucetPrvkovNaObvode(int matica[8][9])
tak to nefunguje tak ako ma. Neviem preco som si to myslel... Pritom mam v typoch, ze co je *int, **int, atd celkom jasno...

nuz jemne som sa verejne zosmiesnil :)
0

Používateľov profilový obrázok
kubo150
Ultimate člen
Ultimate člen
Príspevky: 3253
Dátum registrácie: 20 Júl 2007, 00:00
Bydlisko: Pri Bytči
Vek: 32
Kontaktovať používateľa:

Re: matice

Príspevok od používateľa kubo150 » 15 Dec 2013, 20:35

Neviem kde je napísané, že potrebuje mať univerzálnu funkciu, ktorú zavolá. Ak potrebue len niekde v programe proste jednorázovo transponovať maticu, tak nepotrebuje žiadné pointre ani nič, stačí mu len pomocná matica, poprípade ani tú mu netreba. Len proste prvky zapíše prekrížene.
0
Som ten ktorý to vykoná.
Moje slovo:
Neverím na náhody,
Náhoda je len jedným, alebo skupinou ľudí nepochopená realita

Používateľov profilový obrázok
scd
Stály člen
Stály člen
Príspevky: 150
Dátum registrácie: 17 Apr 2009, 00:00
Bydlisko: Dubnica nad Váhom
Vek: 35

Re: matice

Príspevok od používateľa scd » 15 Dec 2013, 20:42

Presne ako píšeš, no myslím si, že je to zadanie do školy preto hovorím, že je lepšie aby to mal cez funkcie a parametre, aby sa to naučil používať.

fillo777:
to je v pohode, ono je aj podľa mňa celkovo dosť taký chaotický zápis tých polí a v praxi sa aj tak zápis sucetPrvkovNaObvode(int matica[8][9]) asi moc nepoužije, skôr už takto sucetPrvkovNaObvode(int matica[][9], int pocetRiadkov);
Ja som hlavne narážal na to, čo si napísal na začiatku:
fillo777 napísal: Bud to spravis tak, ze das ako parameter funkcie generujMaticuNahodne adresu premennej matica, alebo ...
keď juroOO to mal spravené dobre viď generujMaticuNahodne(matica); lebo keby to spravil tak ako pišeš ty generujMaticuNahodne(&matica); /aspoň ja som to tak pochopil z toho čo si napísal/, tak by funkcii odovzdal adresu pointera na to pole.
0
Keyboard not present. Press ENTER to continue...

JuroOO
Stály člen
Stály člen
Príspevky: 225
Dátum registrácie: 02 Dec 2011, 12:59
Bydlisko: Trnava

Re: matice

Príspevok od používateľa JuroOO » 15 Dec 2013, 20:43

Ja len neviem , na začiatku vygenerujem nejakú maticu matica[8][9] , náhodne, to mám.
Na a teraz chcem aby sa v tých funkciách pracovalo s touto maticou, pretože teraz ako to robím tak, každa funkcia pracuje s vlastnou vygenerovanou maticou.

Teraz tú povodnu vygenerevoanú maticu volám v každej tej funkcii takto napr.

void transponujMaticu(int matica[8][9], int transponovana[9][8]){
generujMaticuNahodne(matica);
0

Používateľov profilový obrázok
scd
Stály člen
Stály člen
Príspevky: 150
Dátum registrácie: 17 Apr 2009, 00:00
Bydlisko: Dubnica nad Váhom
Vek: 35

Re: matice

Príspevok od používateľa scd » 15 Dec 2013, 20:59

najskôr si deklaruj polia t.j.
int matica[8][9];
int transponovana[9][8];
potom zavolaj funkcie
generujMaticuNahodne(matica); //naplni ti pole matica nahodnymi datami
transponujMaticu(matica,transponovana); //zapise ti do transponovanej matice "obratene" hodnoty(pripadne ich aj vypise)

alebo ak chceš, tak vo vnútri funkcie transponujMaticu zavolaj funkciu generujMaticuNahodne a v main-e potom zavolaj len funkciu transponujMaticu.
0
Keyboard not present. Press ENTER to continue...

JuroOO
Stály člen
Stály člen
Príspevky: 225
Dátum registrácie: 02 Dec 2011, 12:59
Bydlisko: Trnava

Re: matice

Príspevok od používateľa JuroOO » 15 Dec 2013, 21:19

int main()
int matica[8][9];
int transponovana[9][8];
generujMaticuNahodne(matica);
vypisMaticu(matica);
transponujMaticu(matica,transponovana);


Ak nezavolám funkciu generujMaticuNahodne(matica); Tak pri funkcii vypisMaticu(matica); to vygeneruje blud
0

Používateľov profilový obrázok
scd
Stály člen
Stály člen
Príspevky: 150
Dátum registrácie: 17 Apr 2009, 00:00
Bydlisko: Dubnica nad Váhom
Vek: 35

Re: matice

Príspevok od používateľa scd » 15 Dec 2013, 22:19

veď to je jasné, že ak nezavoláš tú funkciu, že ti to vypíše bludy, pretože tá matica nieje inicilaizovaná, niesú do nej priradené hodnoty a obsahuje len náhodné čísla z pamäte.
ak chceš to generovanie matice prevádzať až vo funkcii na transponovanie, tak musíš volať funkciu na výpis až po jej volaní.
int main()
int matica[8][9];
int transponovana[9][8];
transponujMaticu(matica,transponovana);
vypisMaticu(matica);
vypisMaticu(transponovana);
0
Keyboard not present. Press ENTER to continue...

Používateľov profilový obrázok
kubo150
Ultimate člen
Ultimate člen
Príspevky: 3253
Dátum registrácie: 20 Júl 2007, 00:00
Bydlisko: Pri Bytči
Vek: 32
Kontaktovať používateľa:

Re: matice

Príspevok od používateľa kubo150 » 15 Dec 2013, 23:03

Na toto som robil semestralku, asi sú tam aj drobné chyby v texte a vo vývojáku to nieje úplne správne opísané, ten beh programu, ale inak kód je napísaný dobre a funguje.

Podmienky semestrálky boli, že:
musí sa pracovať s funkciami, min 2
musí sa pracovať s pointrami
Musí byť použité min 2 rozmerné pole, alebo 3-tiu podmienku si presne nepametám

Vybral som primitívne riešenie pre toto zadanie, ale účel to splnilo a nebolo to zložité.
Prílohy
prog-sem1.doc
(74 KiB) 45 stiahnutí
0
Som ten ktorý to vykoná.
Moje slovo:
Neverím na náhody,
Náhoda je len jedným, alebo skupinou ľudí nepochopená realita

JuroOO
Stály člen
Stály člen
Príspevky: 225
Dátum registrácie: 02 Dec 2011, 12:59
Bydlisko: Trnava

Re: matice

Príspevok od používateľa JuroOO » 15 Dec 2013, 23:32

ak chceš to generovanie matice prevádzať až vo funkcii na transponovanie, tak musíš volať funkciu na výpis až po jej volaní. hmm neviem či myslím na to isté na čo ty.

Priebeh by mal byť: zavolám funckiu na generovanie matice- zatial sa na obrazovku nevypíše, potom zavolám funkciu na výpis tejto matice. no a potom zavolám funkciu na výpis transponovaniej matice
0

Používateľov profilový obrázok
scd
Stály člen
Stály člen
Príspevky: 150
Dátum registrácie: 17 Apr 2009, 00:00
Bydlisko: Dubnica nad Váhom
Vek: 35

Re: matice

Príspevok od používateľa scd » 15 Dec 2013, 23:46

int main()
{
int matica[8][9];
int transponovana[9][8];
generujMaticuNahodne(matica);
vypisMaticu(matica);
transponujMaticu(matica,transponovana);
vypisMaticu(transponovana);
}

Skús si odkrokovať ten program, budeš vidieť ako sa to správa, aké sú aktuálne hodnoty premenných atď.
Tu máš aj ukážku ako na to
http://web.ics.upjs.sk/paz1a/Material/Debugovanie
0
Keyboard not present. Press ENTER to continue...

Používateľov profilový obrázok
boban
Stály člen
Stály člen
Príspevky: 137
Dátum registrácie: 03 Jún 2010, 00:00
Bydlisko: po

Re: matice

Príspevok od používateľa boban » 16 Dec 2013, 12:10

takto asi nie, pretoze transponovana ma ine rozmery (8,9 -> 9,8)

vypisMaticu(matica);
transponujMaticu(matica,transponovana);
vypisMaticu(transponovana);

bud posielat aj rozmery alebo ina funkcia.
0

Napísať odpoveď
  • Podobné témy
    Odpovedí
    Zobrazení
    Posledný príspevok