Programiranje u C jeziku
(1 korsinik/a gleda/ju temu) (1) Gost

Programiranje u C jeziku


14.12.2010 | 22:19
Sve ispravila i opet ne radi, opet ista greška...
14.12.2010 | 22:28
Što si ispravila u što? Ako i dalje imaš grešku u 10. retku, vjerojatno nisi 5. redak dobro ispravila. Kako ti sada glasi?
14.12.2010 | 22:46
#include<iostream>
using namespace std;

int m = 3;
int determinanta(int A, int m)
{
  int suma = 0;
  if (m == 2)
  {
      suma = A[1][1]*A[2][2]-A[1][2]*A[2][1];
  }else
   {
       for (int i=1; i<m; i++)
       {
            int redak = 1; 
            int stupac = 1;
            for (int j=2; j<m; j++)
            {
                 for (int k=1; k<m; k++)
                 {
                      if (k!=i)
                      {
                      int b[redak][stupac]=A[j][k];
                      stupac++;
                      }
                 }
                 redak++;
           }
           suma = suma + (-2*((i+1)%2)+1)*A[1][i]*determinanta(b,m-1);
       }
   }
 return suma;
}

int main ()
{
  
  int A [m][m] = {{1,1,7},{2,1,3},{2,2,7}};
  
  cout << determinanta (A,3);

return 1;
}


valjda sam sad dobro napravila ovo što ti je bilo pod ps
14.12.2010 | 23:12
Jesi, ali i dalje prosljeđuješ funkciji int umjesto pointera na matricu (točnije, pointera na pointer na matricu). Znaš li baratati s pointerima?

Kako si zamislila ovaj dio: b[redak][stupac]? Kako kompajler zna koliko je "velika" matrica b? Ne zna. Morat ćeš sama alocirati memoriju i proslijediti pointer dalje. Za to će ti trebati funkcija malloc(), a trebat će ti i free() ako ne želiš biti neuredna s memorijom (a ne želiš).
14.12.2010 | 23:16
...? Ne, ne znam baratati s pointerima...
To baš nužno za ovaj program?
14.12.2010 | 23:30
Ajde probaj prvo nešto jednostavnije. U main() funkciji definiraj matricu. Počni sa 2x2. Potom je proslijedi funkciji test() kao parametar te funkcije. I ispiši element [0][0] prosljeđene matrice, unutar funkcije test. Ne računajući vitičaste zagrade, to je 6 linije koda.

Jel' ti radi program?
14.12.2010 | 23:34
OK... Odustajem... Nisam ja dorasla ovom zadatku... Bez obzira što neki od mene traže da to budem... Možda ga nekad i riješim... Vama ovdje hvala što ste se trudili stvarno ste super
Veliki pozdrav...
14.12.2010 | 23:40
Nadam se nastavku čim se sprijateljiš s funkcijama i pointerima. Nisi jako daleko od rješenja u onom kodu koji si poslala.
16.12.2010 | 23:14
Ajme, ona je daleko da ne može biti dalje, čim ste je uvalili u rekurziju (a očitu je ne zna).

Cauchy, tebi treba Gaussova eliminacija koja tvoju nxn matricu svodi na trokutastu, a iz trokutaste je trivijalno izračunati determinantu. Objašnjenje što je Gaussova eliminacija i linkovi na matematiku koja će te dovesti do riješenja možeš pronaći na lavica.fesb.hr/mat1/predavanja/node32.html .

Za ekipu koja toliko voli rekurziju: riješavanje determinante rekurzijom je konstruktivno poput zabijanja čavla u zid tako da tenk vozite napred nazad. Pri svakom (rekurzivnom) pozivanju funkcije ili mora stvoriti novo dvodimenzionalno polje (matricu) što je ogromno bespotrebno korištenje memorije, ili mora pažljivo prenositi indekse retka i stupca s kojim trenutno radi. U oba slučaja na stacku mora ostati brdo informacija - izračuna determinanti 2x2, 3x3, 4x4 itd. što je OK u slučaju manjih primjera, ali je posve ludo pri većim determinantama (broj međurezultata eksponencijalno raste).

Svođenje na gornju trokutastu je trivijalno poput:
// određivanje koji stupac gledamo
za i=1 do n-1
   ako je POLJE[i][i]=0
       pronađi pogodni redak za zamjenu i zamjeni retke (ovo neću objašnjavati kako se radi jer je trivijalno)
      
   // prolazak kroz sve preostale retke  
   za j=i+1 do n
       // određivanje koeficijenta s kojim množimo i-ti redak sa retkom koji gledamo 
       koeficijent=polje[j][i]/polje[i][i]
        
       // izračunavanje novih elemenata u j-tom retku
       za k=j do n
          polje[j][k] = polje[j][k] - polje[i][k] * koeficijent  
       



I na kraju determinanta se izračuna sa
determinanta=1
za i=1 do n
   determinanta=determinanta*polje[i][i]




Nikakva rekurzija, tri for petlje.


PS. nemojte misliti da pametujem ovdje, ali matematika rijetko kad očekuje/traži/želi rekurziju. Ako se ne pretražuju nekakva stabla poradi optimalnosti, rekurzija je veliki no-no. Pa čak i kad imamo brza i stabilna računala!

PPS. Vrlo je moguće da gornji kod ne radi ispravno, pisan je odokativno, sa brzinskim pregledom linka koji sam dao. Za ispravno korištenje preporuča se sve brojeve držati u najboljoj točnosti koju jezik nudi, čak i ako su originalni brojevi cjelobrojni. Dapače, ako su na početku cjelobroni brojevi zbog veće količine operacija dijeljenja preporuka je castati integere u doublove (ili još bolje long doublove), sve izračunati i zaokružiti (round), čime se gubi moguća greška u decimalama pri izračunu.
16.12.2010 | 23:31
Ne mislim da pametuješ a i da pametuješ, sve je dobrodošlo dok god je konstruktivno.

Moja namjera je bila provesti Cauchy kroz njeno razmišljanje. Spomenuo si trokutastu u svojoj prvoj poruci u ovom threadu, ali Cauchy je postupak "s olovkom i papirom" opisala rekurzivno (uz uvijek prisutnu mogućnost da sam pogrešno shvatio to što je napisala). Od tuda "rekurzija" kao jedan od sastojaka NJENOG algoritma. No, u praksi je zapravo zapela već na prijenosu matrice u funkciju, što smo spoznali tek na kraju čavrljanja. U tom smislu, nadam se da će joj sve napisano pomoći za naučiti sve što tek mora naučiti.

I da, algoritam koji si ponudio je optimalniji pa karma+ u to ime.
16.12.2010 | 23:53
Ja imam slijedeću potrebu: kako provest automatsko ispravljanje C programa? Ono, za neke ulazne podatke dobiti neke izlazne podatke, i ako ti podaci odgovaraju pravim izlaznim podacima zadatak radi, u protivnom ne.

IDEALNO bi bilo online al nemam pojma. Čitao sam nešto o nekakvom sandboxu na serveru pa trante-mante nemam blage veze šta
17.12.2010 | 00:20
Ja imam slijedeću potrebu: kako provest automatsko ispravljanje C programa? Ono, za neke ulazne podatke dobiti neke izlazne podatke, i ako ti podaci odgovaraju pravim izlaznim podacima zadatak radi, u protivnom ne. IDEALNO bi bilo online al nemam pojma. Čitao sam nešto o nekakvom sandboxu na serveru pa trante-mante nemam blage veze šta

"Algoritam" (za on-line varijantu):
1. omogući korisniku upload koda (.c datoteka)
2. kompajliraj uploadni kod
3. u slučaju greške prilikom kompajliranja, javi (kome god) da uploadni program nije ispravan i abortaj dalju evaluaciju (ili skoči na 8)
4. ako je sve prošlo OK, imaš exe
5. exeu proslijedi (kao parametar ili učitavanjem iz prethodno dogovorene datoteke, npr. "input.txt" ) ulazne podatke i preusmjeri output u neku datoteku (npr. "output.txt" )
6. parsaj output (provjeri odgovara li sadržaj output.txt traženom rješenju)
7. ponovi korake od 5 do 8 dok god ne iscrpiš sve ulazne podatke
8. spremi dobivenu "ocjenu"

Za (1) je dovoljan HTML (komunikacija s korisnikom) i skripta (PHP, npr.) na serveru koja prihvaća upload i sprema ga u datoteku. Za (2) je potreban kompajler (na serveru; GCC, recimo). Skripta pod (1), nakon uploada koda i spremanja u lokalnu datoteku, može pokrenuti shell skriptu koja obavlja kompajliranje i testira uspješnost kompajliranja. Ista skripta može obaviti i ovo pod (3). Exe nastane kao produkt koraka (2). Shell skripta radi i sve ostale korake (5-8).

Potencijalni problem može biti korak 5 - umjesto očekivanog koda može stići nešto maligno. U tom slučaju je poželjan nekakav sandbox koji će ograničiti to što se izvršava, da ne "luduje" po serveru. Nevezano uz sandbox - često je potrebno limitirati vrijeme izvršavanja testiranog koda pa se u tom slučaju (shell) skripta mora brinuti i za timing, odnosno killanje processa (ili kako god to riješiš) koji izvršava exe.

Svi koraci osim (6) se, jednom kreirani, recikliraju, a parser outputa se modificira ovisno o zadacima, odnosno traženim rješenjima.


Za što ti to treba?
17.12.2010 | 00:32
john_st: Ovisno koliko ti se da z**** s time.

Najjednostavnija opcija je: koristeći neki testing alat (mi koristimo TCExam i testove unutar Moodlea) daš nekoliko zadataka koji korisniku daju ulazne podatke, a od njega se očekuje da unose podatke koje je program dao na izlazu. Sa dovoljno velikim izborom pitanja na unosu, nije neki program to dati desetku ili stotini ljudi.

Problem u ovome je što učenici/studenti mogu pokušati podvaliti tuđe riješenje. Mi smo takve probleme (ne koristimo ideju direktno za C, ali se npr koristi pri izračunima i simulacijama!!! u Excelu (zato uskličnici ) ) riješili tako da smo osmislili desetak zadataka i očekuje se od studenta da nam uploada datoteku nazad, a kasnije profesor ručno provjeri sve zadatke istog tipa. Ma koliko bi zadaci trebali biti isti, ljudi ipak malo drugačije razmišljaju i riješavaju, pa se vidi da li je nešto podvaljen tuđi ili je samostalan rad.

Ako se radi o programiranju u C-u, postoje alati poput CPD-a ili Sherlocka koji uspoređuju datoteke da vide kolika je sličnost između datoteka. Neki se profesori bore protiv kopiranja tako da od studenta traže da u nekom dijelu postupka upotrebe prvo slovo imena, ili prezimena, ili da ubace u neki izračun zadnjih par znamenki svog JMBAG-a. Time se već dobiva dovoljno da se može analizirati jesu li kopirali ili ne, jer onaj tko ne razumije kako program radi najčešće nezna ni izmjeniti potrebne podatke.

Čak i sa takvim "zaštitama" ostavljena je opcija da u tuđem programu testiraju tvoje ulazne podatka, a uploadaju neki svoj kod koji ne radi.



Sa onim naprednijim sustavima na koje si ciljao (nešto tipa KATTIS ili DOMJudge) nisam radio, do sada smo se najviše pouzdali na čovjeka (profesora/asistenta) i strah studenata da ne budu provaljeni kad kopiraju tuđi kod. A kad se prvi otkrije, velika buka, puno zastrašivanja, nekakva primjerena kazna (ovisno o tome koliki je grijeh) i svi budu dobri i samostalno rade
17.12.2010 | 20:29
StajpZg, naklon i od mene, tvoje je rješenje uistinu bolje. No, inače, argument o utrošku stacka, i štojaznam s teoretske strane stoji, ali je u današnje vrijeme zaista smiješan. Da se poslužim tvojim tenkom, pričati o tome da je rekurzija loše rješenje u kontekstu današnjih računala i programerskih razvojnih okolina isto je kao da te na spomenutom tenku brine to što golublje govno na kupoli narušava aerodinamiku tenka i povećava mu potrošnju za 0,000000000001 %.

Inače, ta zajebancija s prijenosom matrice funkciji, eto, i to je jedan razlog zašto ne volim C.

E, sad, kao nekom tko se C-om nije nikad služio ozbiljno, ne zamjerite mi ako sam nešto pobrkao, te uzmite u obzir i to da ne znam *TOČNO* u čemu je sve razlika između C i C++, no čitam u Kerninghan & Ritchieu:

The story is different for arrays. When the name of an array is used as an argument, the value passed to the function is the location or address of the beginning of the array - there is no copying of array elements. By subscripting this value, the function can access and alter any argument of the array. This is the topic of the next section.


(str. 29, drugo izdanje, sam kraj poglavlja 1.8)

Po tome ispada da ne treba ništa petljati s pointerima, zar ne? Ili nešto nisam shvatio?

Također, ako je to tako, onda se ne alocira novi stack prostor za svaki rekurzivni poziv. Pa ne moramo brinuti o golubljem govnu na kupoli.
17.12.2010 | 21:09
@smayoo - da, ime niza sadrži adresu prvog elementa niza

@djipi - treba mi za ispravljanje tuđih rješenja. ja sam kakti asistent pa ispravljam tonu kolokvija, domaćih radova, nagradnih zadataka, a to košta i vremena i živaca, a posebice na objašnjenja da je = različito od == i da to nije samo jedan znak nego totalno krivi pristup i da ako to "mali Perica" ne kuži da onda očito ne zna dovoljno da položi.

@stajpzg - proguglat ću malo ovo što si napisao idealno bi bilo da student riješi neki zadatak, uploada rješenje na server i onda mu se u vrlo kratkom vremenu izbaci DA ili NE i to je to. ako ipak misli da bi mu program trebao raditi a ne radi može mi se javiti za konzultacije di ćemo taj kod proć liniju po liniju. sviđa mi se ovo sa JMBGom na kraju. jel moš dat neki primjer upotrebe?

ako vam nije tlaka, registrirajte se tu, pa riješite ovaj trivijalni zadačić, da biste stekli pravi dojam što ja želim http://z-trening.com/tasks.php?show_task=5000000008
17.12.2010 | 21:16
john_st je napisao:
@smayoo - da, ime niza sadrži adresu prvog elementa niza


OK, onda Đipi nije Cauchy dobro uputio i onda uopće nije problem u pointerima. U čemu je onda problem?
17.12.2010 | 22:40
OK, onda Đipi nije Cauchy dobro uputio i onda uopće nije problem u pointerima. U čemu je onda problem?

Kako nije problem u pointerima? Da prenosi matricu fiksnih dimenzija (3x3), onaj int A bi mogao biti A[][3] i problem (barem kompajliranja) riješen. Ali rekurzivni pozivi će, ovisno o veličini matrice b (gdje je čeka sljedeći problem), zahtjevati alociranje komada memorije za matricu b, uzimanje pointera na taj komad i baratanje dalje s novom matricom preko njega.

Ili propuštam neki jednostavniji C++ način za isto to?
17.12.2010 | 23:00
Gle, ja C znam "avionski" i nisam nikad ozbiljno programirao u njemu (upravo zato što mi se gadi, jer od ovako jednostavne stvari ispada komplikacija - jebote, pa to je jedan najobičniji Fortran 80 mogao bez pola frke, još prije 30 godina).

Ali eno, prema onom što piše u K&R, ispada da ne treba to ništa. Samo proslijediš matricu, a on bi trebao sam uzeti pointer itd. Ili sam ja nešto krivo protumačio? Ili to ne vrijedi za C++? Ili...?
17.12.2010 | 23:35
Ali eno, prema onom što piše u K&R, ispada da ne treba to ništa. Samo proslijediš matricu, a on bi trebao sam uzeti pointer itd. Ili sam ja nešto krivo protumačio? Ili to ne vrijedi za C++? Ili...?

Dobro si shvatio. Ali kad je matrica višedimenzionalna (kao u ovim slučajevima koje razglabamo, gdje je 2D), parametar funkcije se definira kao "tip ime[][veličina]" (za 2D), odnosno "tip ime[][veličina][veličina]" (za 3D). Pri čemu udaramo u problem konstanti (veličina) zbog kojeg sam se (opet) vratio na pointere i pitam postoji li elegantnije rješenje.
18.12.2010 | 11:06
Postoji. Problem je, međutim u tome što Cauchy ne vlada dovoljno C-om da uopće shvati što si je pitao, a tempo nastave na faksu je tjera da uči algoritmiranje i C paralelno, a bez gotovo ikakvog predznanja (dopisivali smo se E-mailom pa znam koji detalj više). Tako da bi joj više pomogao da si direktno ispravio pogrešku i objasnio joj ograničenja, nego da si postavljao potpitanja na koja ne da ne zna odgovor, nego ne shvaća ni što je pitaš.

@StajpZG: I, BTW, kaže da je profesor očekivao rješenje *SA* rekurzijom. Čovjek očito voli tenkove.
18.12.2010 | 16:54
@smayoo & djipi: zezancija sa C-om je to što se polja koriste kao i pointeri, te se prolasci kroz polja obavljaju pointerskom aritmetikom. To nije direktno problem dok se ne dođe do prenošenja polja u funkcije, što se isključivo radi pointerima. Slanjem polja (odnosno naziva polja) u funkciju prenosi se adresa na prvi element polja. Gdje je problem? Ne prenose se dimenzije polja, od tad nadalje se ne može trivijalno koristiti polja u 2D obliku [x][y] , već se sve prevodi u oblik x*MAX_STUPACA+y . Odnosno, moraju se, uz polje, poslati i dimenzije polja. Doduše, ovo je sve na osnovi početničkog programiranja, postoje metode kako to zaobići ali nisu za početnike. Ovaj problem će se ponovno pojaviti u odgovoru smayii

@smayoo Ako profesor očekuje rekurziju onda je naprosto blesav. Kao što sam već napisao, osim za pretraživanje stabala i pokuju čudnu upotrebu rekurzija je posve neupotrebljiva. Možemo lamentirati kako je rekurzija upotrebljiva na današnjim računalima, i možemo pričati o stacku koji je (virtualno) beskonačan, _ali_ to ne znači da je rekurzija nešto dobro. I dalje je loša jer je a) uvijek sporija b) uvijek troši više procesorskog i memorijskog prostora. Objašnjenje za determinantu (i zašto je profesor blesav) je jednostavno: pri svakom radu podmatricom originalne matrice moramo a) poslati trenutni redak i stupac i raditi sa ostatkom matrice ili b) kopirati podmatricu u novu matricu i s njom raditi.

Opcija a) će uzrokovati da ćemo u primjeru
a b c d
e f g h
i j k l
m n o p

morati poslati parametar 1,1 za a ; 2,1 za e itd .. također mora se
poslati veličina trenutne matrice kako bi sustav znao odrediti podmatricu.

Time se šalju 4 integera u svaki poziv. Poziva ima 4 za rang (3x3) i po 3 za svaku ranga 2x2. U rangu 2x2 možemo odmah izračunati, ne moramo (iako to možemo) pozvati funkciju. To je 4*3 = 12 poziva rekurzije, sa po 4 x 4 bytea (integer u VS-u je 4 bytea) = 16 byteova. Znači popapamo 192 bytea za 4x4. No pređimo na determinanu 20x20. Poziva funkciji ima 20! / 2! odnosno 2.43*10^18 / 2 = 1.22 *10^18 što uz 4*4 bytea znači da će kroz računalnu memoriju proći 19.6 * 10^18 byteova. Vjerujem kako ne moram objašnjavati detalje i implikacije tog računa. (napomena: 20! je 20 faktorijela, odnosno 20x19x18x17x16....x2x1)

b) je još gora opcija, jer će se trošiti vrijeme na kopiranje matrice u podmatricu, ali će se ovakav slučaj lakše distribuirati ako se radi o nekom clusteru. Umjesto slanja cijele matrice, šalje se dio koji se mora obraditi. Onda ove brojke gore ne izgledaju tako grozno.

Rekurzija je zato veliki no-no, i ako je tip očekivao riješenje sa rekurzijom onda je budala[1]!


@john_st z-training koristi standardni input i output, što se na linuxu lako izvede pipeanjem podataka. Uz nekakav filter da ne koriste "ključne" riječi koje bi mogle potrgati sustav može se izvesti sustav kakav je spomenuo djipi. No kako sam već napisao, KETTIS i DOMJudge sustavi koji se koriste na natjecanjima iz programiranja, koji rade upravo ono što tebi treba.

Što se JMBAG-a tiče, ako se zada nekakav algoritam koji računa neki red, uvijek se može ubaciti da rezultat treba podijeliti sa zadnje tri znamenke JMBAG-a, ili dati ostatak pri dijeljenju sa zadnje tri znamenke. Kolege na bazama su tako napravili bazu sa 1000 kupaca i za svakog kupca po nekoliko računa, i od studenata zatražili da im ispišu podatke za kupce sa ID-jem koji odgovara završetku JMBAG-a. Kolega koji je drilao sa Excelom je rekao da moraju za stupac G izvući sumu/srednju vrijednost/max itd. skupa brojeva koji su u rasponu od zadnje tri znamenke JMBAGa zapisane normalno i naopačke (npr 285 i 852). Ako radiš sa datotekama možeš uvesti istu foru, daš svima istu datoteku, ali ovisno o JMBAG-u moraju odraditi drugačiji raspon u datoteci.



[1] Zanimljivo, radim na fakultetu i kažem da je neki profesor budala. Apsolutno stojim iza toga da ima previše ljudi na fakultetima koji nazivno nešto znaju, a u realnosti ili nemaju pojma, ili imaju velikog pojma a to ne znaju prenijeti studentima. Na jabucnjaku piše moje puno ime i prezime, pa se slobodno možemo natezati kasnije o mojem mišljenju
18.12.2010 | 17:34
Kako ti se uopće dalo toliko pisati? Zar zaista misliš da ne znamo sami izračunati koliko se bajta potroši i koliko se poziva napravi?

To što si čovjeka ad hoc nazvao budalom, zapravo više govori o tebi, nego o njemu. Ali to si već znao, zar ne? Kako god bilo, to je samo tvoje mišljenje, a ne objektivna istina.

Ja ipak mislim da je sasvim logično da se na kolegiju koji se zove "Programiranje" ili tako nekako već slično namjerno zahtijeva primjenu rekurzije (čak i ako jest suboptimalna za dan primjer). Kako bi inače studenti naučili rekurziju? Ti bi, pretpostavljam, brucošima nakon 2 mjeseca studiranja odmah utrpao pretraživanje stabla ne bi li ih natjerao da uz algoritmiranje i C sintaksu još paralelno uče i pointerske liste, relacijske strukture ili slično, čisto zato što ne želiš biti budala da im daš da rekurziju nauče na nekom lakšem primjeru.

Primjer koji sam ja dao gore za ilustraciju rekurzije - funkcija za računanje faktorijela - primjer je iz Vlašićeve knjige "Pascal" koja je mene još u srednjoj školi, davnih osamdesetih, naučila 75% svega što treba znati o programiranju. Jamačno smatraš da je i on bio budala. Jer je, kreten, riješio faktorijel rekurzijom umjesto jednom for petljom. A rekurziju je trebao ilustrirati na primjeru optimizacije ruta za distribuciju mliječnih proizvoda u gradu Zagrebu, na bazi GIS sustava otežanog faktorima gustoće prometa. Sasvim primjereno svakom prosječnom gimnazijalcu, zar ne?

Jao tvojim studentima...
18.12.2010 | 18:30
Postoji.

Hoćemo li konačno doći do toga koje je?
18.12.2010 | 18:41
Koristiti Fortran 80.
18.12.2010 | 19:05
Sorry, nisam mogao izdržati.

Dakle, u primjeru koji je Cauchy postala funkciji se prosljeđuje matrica (pointer na matricu) i dimenzija matrice (matrica je kvadratna pa je dovoljno poslati m, jer je n=m, jer se determinanta i može izračunati samo za kvadratnu matricu).

E, sad, s obzirom da je dinamički alocirana matrica u C-u očito mission impossible ako se ne želiš upuštati u pointersku aritmetiku, može li se, za potrebe ovog zadatka (a ne kao općenito upotrebljivo rješenje) A deklarirati kao npr. [10][10] i jednostavno ne iskoristiti višak elemenata, odnosno ograničiti veličinu matrice na max 10x10? Isto tako i za lokalnu matricu B u samoj funkciji. Pa da se onda ne mora petljati s pointerskom artimetikom?

Stacku je svejedno s obzirom da se preko njega u rekurzivne pozive prenosi samo pointer, a i broj istodobnih ugniježdenih rekurzivnih poziva koji opterećuju stack nije nikakav faktorijel, već je jednak dimenziji matrice minus jedan (zato što kad rekurzija stigne do matrice 2x2, onda se "otpetlja" jednu razinu) tako da broj stanja odloženih na stack nije veći od dimenzije matrice. Samo je ukupni broj rekurzivnih poziva vrlo velik za velike matrice, ali wth. Što veći tenk, bolja zabava.
18.12.2010 | 19:50
Sorry, nisam mogao izdržati.

Vidim.

može li se, za potrebe ovog zadatka (a ne kao općenito upotrebljivo rješenje) A deklarirati kao npr. [10][10] i jednostavno ne iskoristiti višak elemenata, odnosno ograničiti veličinu matrice na max 10x10? Isto tako i za lokalnu matricu B u samoj funkciji.

Ako tražimo rješenje za matrice maksimalne veličine 10x10 i pritom memorija nije kritična, da, to je svakako "najjednostavnije" rješenje. Ali definitivno ga ne bih nazvao "najelegantnijim".

Rješenje (rekurzivno) koje sam imao na umu je ovog tipa: spoiler. I unatoč dinamičkoj alokaciji, nije teška znanost. I da, rješivo je za 15 minuta ako algoritam nije nepoznanica (a njega smo već pretresli uzduž i poprijeko pa recimo da nije).

Ako netko zna elegantnije C++ rješenje, i dalje me zanima.
18.12.2010 | 20:06
smayoo je napisao:
Kako ti se uopće dalo toliko pisati? Zar zaista misliš da ne znamo sami izračunati koliko se bajta potroši i koliko se poziva napravi?


Sorry, radim sa studentima kojima moraš sve detaljno objasniti i staviti u perspektivu. S druge strane, vidim kako jako voliš rekurziju, a to da je rekurzija no-no nisam izmislio, nego su me tako učili i naučili sa (puno) previše primjera.


To što si čovjeka ad hoc nazvao budalom, zapravo više govori o tebi, nego o njemu. Ali to si već znao, zar ne? Kako god bilo, to je samo tvoje mišljenje, a ne objektivna istina.

Ja ipak mislim da je sasvim logično da se na kolegiju koji se zove "Programiranje" ili tako nekako već slično namjerno zahtijeva primjenu rekurzije (čak i ako jest suboptimalna za dan primjer). Kako bi inače studenti naučili rekurziju? Ti bi, pretpostavljam, brucošima nakon 2 mjeseca studiranja odmah utrpao pretraživanje stabla ne bi li ih natjerao da uz algoritmiranje i C sintaksu još paralelno uče i pointerske liste, relacijske strukture ili slično, čisto zato što ne želiš biti budala da im daš da rekurziju nauče na nekom lakšem primjeru.


Sasvim slučajno predajem Programiranje studentima druge godine, ali kojima je to prvo programiranje (ranije su ih maltretirali sa raznim elektronikama i elektrotehnikama), i radili smo rekurziju prije dva tjedna. Primjer koji su dobili na predavanjima upravo jesu faktorijeli (sa primjerima stabala objašnjenim idejno), na labosima su dobili izračun reda i Fibonaccijeve brojeve. To je razina rekurzije koju brucoši (ili oni koji se prvi put susreću sa programiranjem) trebaju znati. Razina koju bi trebali znati i gimnazijalci na kraju školovanja, ako su išta programirali. Razina rekurzije koja koristi dvodimenzionalna polja bez upotrebe dinamički alocirane memorije nije nešto za studente prve godine, osim ako su prvaci iz programiranja u srednjoj, a ti se prepoznaju na prvom i drugom satu labosa, a ne sa ovakvim zadacima.

Kad je kolega asistent zadao zadatak sa Fibonaccijevim brojevima - rekurzijom, svi su se pobunili kako sam im rekao da rekurziju ne koriste ako ne moraju. Jedva ih je kolega nagovorio da napišu to rekurzijom.

A što se tiče toga što sam čovjeka nazvao budalom - svaki profesor koji drži programiranje vrlo brzo nauči kako su studenti vrlo inventivni ako je zadatak zadan ugrubo, bez detaljnih specificiranja. Zato dopuštam studentima da zadatke pišu kako god znaju i umiju, dok god riješavaju osnovni problem, jer je moja greška ako uspijem nespecificirati detalje. Kolega se opekao kad je rekao da želi tablicu množenja do 100, pa je dobio program koji je sadržavao deset printf-ova sa adekvatnim vrijednostima. Ako je La Pommesin profesor napomenuo kako je nužno koristiti rekurziju, tad ne zna osnovne ideje kako funkcije i rekurzije rade, kako rade polja u C-u itd, što po meni predstavlja u najmanju ruku neznalicu za predmet koji drži.


A rekurziju je trebao ilustrirati na primjeru optimizacije ruta za distribuciju mliječnih proizvoda u gradu Zagrebu, na bazi GIS sustava otežanog faktorima gustoće prometa. Sasvim primjereno svakom prosječnom gimnazijalcu, zar ne?


Stablo? Stablo? Koliko već spominjem stabla? Stablo koje si spomenuo nije ništa nejasnije od recimo primjera traženja optimalnog poteza u šahu, a što sam prezentirao svojim studentima (naravno idejno, sa težinama svake figure).

BTW gornji primjer je sasvim primjeren gimnazijalcima AKO je primjereno prezentiran. Djeca nisu kreteni, samo im treba objasniti o čemu se radi. Što me vraća na tezu koju sam dao prije - o profesorima koji pojma nemaju ili imaju pojma a neznaju to prikazati.
18.12.2010 | 20:16
Djipi je napisao:


Ako netko zna elegantnije C++ rješenje, i dalje me zanima.


Nope. To je to. To je opcija b) koju sam spominjao - kopiranje matrice i prenošenje nove matrice. Doduše, ova opcija će biti sporija ako ništa drugo zbog kopiranja elemenata. Dalo bi se ubrzat nekom od opcija kopiranja memorije direktno (memcpy) jer u C-u i C++-u alokacija memorije se obavlja u komadu, odnosno svi podaci su jedni iza drugih, ali ovaj algoritam je školski jasan.
18.12.2010 | 20:46
Da. "Elegantnije" je, priznajem, kriva riječ. Ono što sam htio reći - postoji način da se to napravi tako da bude manje zahtjevno za nekog tko nije nikad čuo za pointere. Ali dobro.

Nego, ako sam dobro skužio, submatrica m se dinamički alocira kao niz pointera koji pokazuju na nizove od po n elemenata, red po red. Da? Ne? Ako da, zašto tako, a ne kao pointer na niz od n x n elemenata?
18.12.2010 | 20:57
stajpZg je napisao:
a to da je rekurzija no-no nisam izmislio, nego su me tako učili i naučili sa (puno) previše primjera.


Recikliraš. Već sam ti odgovorio na to. Golublje govno koje kvari aerodinamiku tenka. Prije 20 godina bi se apsolutno složio s tobom. Danas je to teoretski točno, ali je u praksi nebitno.

Inače, nije da baš toliko volim rekurziju pa da je svakamo guram. Ali stjecajem okolnosti zaista sam radio neke algoritme gdje je rekurzija beskrajno olakšala posao. Možda sam mogao provesti tjedan dana proučavajući matematičke mogućnosti i istražujući primjenjivost raznih transformacija pa napraviti neki nerekurzivni algoritam koji bi koristio 2 kB memorije manje i radio parsto milisekundi brže. Međutim, tih tjedan dana u stvarnom životu košta novaca, tako da je izbor bio sasvim jasan.

Praksa bez teorije je bauljanje u mraku, a teorija bez prakse je gledanje u sunce.
Moderatori: Bertone

Vikalica™

Zadnja poruka: pred 5 sati, 30 minuta
  • zoranowsky: @air, u biti isti je pricnip, samo si sam sebi target :)
  • Air: Polako, polaku, kuda žurba, daj mi prvo link na to kako pročitati vlastite misli :)
  • smayoo: Za one koji ne znaju čitati misli - [link] :D
  • Borisone: Za one koji ne znaju čitati misli, koja je konfiguracija?
  • VanjusOS: pozdrav, treba li netko Mac mini M2, nekorišteno?
  • kupus: Ima takvih naravno. Iz mog skromnog iskustva takvi su u manjini.
  • smayoo: većina online trgovaca odbija slati na poste restante pa čak i na poštanski pretinac
  • kupus: zasto na osobnu adresu*
  • kupus: Zasto na adresu? Naruci na adresu postanskog ureda, tamo ce te cekat
  • drlovric: Imamo li koga iz Zupanje na forumu da bih mogao naruciti paket na njegovu adresu? :)
  • ecvis17: ok, tnx
  • smayoo: Piši u forum
  • ecvis17: pozdrav svima, imam stari MBP koji maksimalno moze voziti BigSur ... malo nisam vise u toku, gdje se danas mogu pronaci Combo installeri? Tnx
  • cariblanco: Čekao je da Hajduk osvoji prvenstvo i na kraju je odustao ;)
  • Yonkis: Od sada ćemo mjeriti vrijeme pre-JM and post-JM time
  • JOHN: Ako je vjerovao, neka mu dragi Bog pomogne i uzme sebi. Ako nije, opet nema veze……sve u svemu mislim da je živio dobar život!
  • smayoo: Ljudi... ode nam Joža Manolić... Nije šala.
  • accom: ne nadjem...
  • accom: jel postoji tema "must have apps"?
  • Riba: Vjerojtano koliko je Apple mapa detaljna.
  • Yonkis: Ili da otvorim temu u forumu?
  • Yonkis: Jedna osoba dok je bila u Beču, mogao sam vidjeti njenu lokaciju točno na kojem je katu i u kojem dijelu zgrade je bila (iPhone 14 u pitanju). Zna li netko koji su preduvjeti za takvo točno lociranje jer u Hrvatskoj to još nisam nigdje doživio? Vidim lokaciju ali ne u 3D.
  • m@xym: Uostalom, palčevi su na ovom forumu odavno prestali biti relevantni, a nama koji smo redovito ovdje niti ne trebaju da bi smo znali kakav je tko.
  • m@xym: Nerviraj se samo zbog onih koji su ti bitni, a nebitne ignoriraj, inače ćeš ostati bez živaca.
  • Vanjuška: Nema nervoze m@xym, ali da javno prozovem malog žapčića da bog sve vidi i sve zna :D
  • smayoo: Ja nemam.
  • zvone: Servisom naime...
  • zvone: ljudi ima li tko iskustva sa sercisom iklinika?
  • m@xym: Čemu nervoza zbog palčeva?! Evo ti još jedna gore ako te to baš toliko muči.
  • Vanjuška: LOL, puknem post i vidim 1 pozitivan palac gore, a imao sam ih 10 nakon onog Tinovog pushanja. Kaj je Žabac/Jura, opet me imaš na piku? :D
  • Kloba: Predizborna škola Željka Pervana [link]
  • Yonkis: Najljepše je kad ostane u “obitelji” :)
  • imjasminh: Mobitel prodan useru s Jabučnjaka :)
  • Zdravac: :)
  • Zdravac: Jel zna netko bez googlea odakle to?
  • Zdravac: ...Galebi, oj beli tići, poletite dole k jugu, ter moju pozdravite majku...
  • Gjuroo: Moj talent za poeziju nije skriven :)
  • Air: ...možda bi se razvili skriveni talenti za poeziju :)
  • Air: Da uredništvo ima smisla za biznis... brzo bi se reducirao broj vojnih stratega, predsjednika, trenera... :)
  • smayoo: @Air: :D
  • imjasminh: u biti cmd r xD
  • imjasminh: updatane slike mobitela u oglasniku - cmd f5 ako vidite stare slike...
  • imjasminh: Apple iPhone 14, 128GB, Midnight Blue - 89% - Spuštam na 450 EUR - [link]
  • Air: Da uredništvo ima smisla za biznis uvelo bi porez na političke teme, 1c za čitanje, 2c za pisanje po postu.
  • Gjuroo: "Smayoo: 25x je vrlo optimistična procjena :)
  • Bertone: Otvorena tema "Zero-day" pa se slobodno možete maknuti od politike i rata
  • Bertone: Ma znam, ali tko će to čitati :(
  • smayoo: Svatko je slobodan otvoriti kakvu god želi temu koja ne krši opća pravila. Zar je uredništvo krivo što vi, članovi, pokazujete 25 puta veći interes za političke teme, nego za stručne? :)
  • Bertone: ... no u pravu si, lakše je mlatiti o politici nego o stručnim hardversko-softverskim temama :)
  • Bertone: Kad si stavio video, malo sam bacio oko na forum no nisam našao zasebnu temu o sigurnosti u koju bi se mogle staviti vijesti ili linkovi na iste no tražiti ću još malo

Za vikanje moraš biti prijavljen.

Prijava

Prisutni jabučari

Novo na Jabučnjaku

Teme

Poruke

Anketa

Kupujete li profesionalni Mac?

Čekam novi modularni Mac Pro - 48.5%
Novac nije problem, kupujem iMac Pro - 0.7%
Kupujem Valjak, baš je lijep i tih! - 0%
Kupujem polovni Mac Pro tower - 11.8%
Nadogradit ću postojeći Mac Pro tower - 2.9%
Običan iMac 27" mi je dovoljan za posao - 5.9%
Skromnih sam potreba, Mac mini je zakon! - 7.4%
Radim na terenu, mora biti MacBook Pro - 3.7%
Ne diram ništa, stari Mac služi me odlično - 10.3%
Kupujem PC kantu i prelazim na Windowse! - 8.8%

Ukupno glasova: 136
Anketa je završena dana: 08 Svi 2018 - 12:17
Page Speed 1.27 Seconds

Provided by iJoomla SEO