matice
Moderátori: psichac, Moderátori
matice
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;
}
}
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
Re: matice
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.
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
Re: matice
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?
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
Re: matice
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.
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
- chameleon
- Okoloidúci
- Príspevky: 39
- Dátum registrácie: 31 Okt 2011, 09:51
- Bydlisko: Bratislava
- Vek: 10
- Kontaktovať používateľa:
Re: matice
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
- scd
- Stály člen
- Príspevky: 150
- Dátum registrácie: 17 Apr 2009, 00:00
- Bydlisko: Dubnica nad Váhom
- Vek: 35
Re: matice
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???
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.
Veď čo si myslíte, ten názov poľa reprezentuje? Jeho hodnotu???
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...
Re: matice
@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?
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
- chameleon
- Okoloidúci
- Príspevky: 39
- Dátum registrácie: 31 Okt 2011, 09:51
- Bydlisko: Bratislava
- Vek: 10
- Kontaktovať používateľa:
Re: matice
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...
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
- scd
- Stály člen
- Príspevky: 150
- Dátum registrácie: 17 Apr 2009, 00:00
- Bydlisko: Dubnica nad Váhom
- Vek: 35
Re: matice
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 **.
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...
Re: matice
@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
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
- kubo150
- 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
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
Moje slovo:
Neverím na náhody,
Náhoda je len jedným, alebo skupinou ľudí nepochopená realita
- scd
- Stály člen
- Príspevky: 150
- Dátum registrácie: 17 Apr 2009, 00:00
- Bydlisko: Dubnica nad Váhom
- Vek: 35
Re: matice
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:
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:
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.fillo777 napísal: Bud to spravis tak, ze das ako parameter funkcie generujMaticuNahodne adresu premennej matica, alebo ...
0
Keyboard not present. Press ENTER to continue...
Re: matice
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);
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
- scd
- Stály člen
- Príspevky: 150
- Dátum registrácie: 17 Apr 2009, 00:00
- Bydlisko: Dubnica nad Váhom
- Vek: 35
Re: matice
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.
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...
Re: matice
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
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
- scd
- Stály člen
- Príspevky: 150
- Dátum registrácie: 17 Apr 2009, 00:00
- Bydlisko: Dubnica nad Váhom
- Vek: 35
Re: matice
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);
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...
- kubo150
- 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
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é.
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
Moje slovo:
Neverím na náhody,
Náhoda je len jedným, alebo skupinou ľudí nepochopená realita
Re: matice
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
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
- scd
- Stály člen
- Príspevky: 150
- Dátum registrácie: 17 Apr 2009, 00:00
- Bydlisko: Dubnica nad Váhom
- Vek: 35
Re: matice
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
{
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...
Re: matice
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.
vypisMaticu(matica);
transponujMaticu(matica,transponovana);
vypisMaticu(transponovana);
bud posielat aj rozmery alebo ina funkcia.
0
-
- Podobné témy
- Odpovedí
- Zobrazení
- Posledný príspevok
-
- 8 Odpovedí
- 712 Zobrazení
-
Posledný príspevok od používateľa DanielK