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 17 sati, 17 minuta
  • jmustac: poslano
  • Riba: Javi se meni s detaljima.
  • jmustac: kako obrisati profil na ovom forumu?
  • rusty: @marioart - ovisi o hipervizoru, ali ukratko da. Moguće je dobiti emulaciju x86 na ARM bare metal stroju. UTM hypervisor kojeg osobno koristim nudi u mogućnost. Jasno, to zovu emulacijom, ne virtualizacijom ali eto
  • marioart: @rusty .. moze li se ikako dobiti x86 win kroz virtualizaciju?
  • stefanjos: drlovric. pa odgovaranje poruka na aplikacijama koje namu mac app i ako se puni da ne secem po mob, rijesim preko maca i to je to
  • rusty: Virtualizacija bi bio moj odabir, e sada da li je besplatno ili ne, ovisi o tome kako ćeš tu kopiju licencirati
  • VanjusOS: ima li nekakav besplatni način za imati Windows na Macbook sa M čipovima?
  • drlovric: Za sta ti konkretno mirroring sluzi? Ja mu nisam nasao primjenu :/
  • stefanjos: affinty na popustu 50%. ja sam si uzeo novu licensu. do sada sam bio na v1
  • stefanjos: tako da, meni je to top feature
  • stefanjos: ja imam australski app store i iphone mirroring koristim svaki dan
  • drlovric: To ces probati jednom i nikad vise. Nema razloga za biti razocaran :)
  • Zdravac: - NIJE :/
  • Zdravac: Jel proradio iPhone Mirroring? :)
  • Yonkis: iOS 18.1.1 / macOS Sequoia 15.1.1 [link]
  • kupus: pretpostavljam da to ide meni, znaci fino radi.
  • kupus: hahaha
  • drlovric: Znas kako lijepo klepece. Mozes i mijenjati zvuk. Merak pravi ????????
  • kupus: svejedno hvala smayoo
  • smayoo: Ma nemoj me zajebavat... :D
  • drlovric: Prekrasna aplikacija ako zelite zvuk fancy mehanicke tipkovnice :) [link]
  • drlovric: I ja to ocekujem. Na proljece cu u USA i iskreno se nadam da ce izaci do tada. Da donesem makar dva komada :)
  • Borisone: Osim ako nisi na ti s Tim Cookom, najbliže nagađanju kada je: [link]
  • VanjusOS: zna li netko, hoće li izaći uskoro Air sa M4 čipom?
  • smayoo: Pokušao sam, ali sam odustao kad me zavrtio u krug s registracijom i sign-inom na Epic games. Najprije kaže da može iskoristiti moj AppleID, kad napravi login preko AppleID i kažem da ne želim pokazati svoj AppleID onda me opet svejedno traži login. Tako da... sorry, ne bih.
  • kupus: hvala
  • kupus: moze li netko probat ovaj besplatan virtualan masterpiece na m macovima? [link]
  • ping: @drlovric imaš besplatne konvertere na netu pdf to excel ili konvertiraj u jpeg pa potrazi online free konverter ocr to excel
  • drlovric: nemam Acrobat....smo PDF Exprt i Wondershare.... Raspadne se na oba
  • drlovric: Daj mi mail na poruku pls, pa da ti posaljem....a kakav Pentagon, prosla su ta vremena, glupost neka :)
  • Zdravac: negdje ju uploadaj, pošalji mi link pa ak hoćeš, da vidimo kak će ispasti (osim ako nisu neke secret Pentagon pi*darije :)
  • Zdravac: @drlovric - "export to excel" ?! Adobe acrobat
  • drlovric: Imam fakturu u PDF, htio bih od nje napraviti Excel file. Sta da radim? :)
  • mariolino1971: Pozdrav. Pokušavam poslati oglas no stalno dobivam poruku 413 Request Entity Too Large. U čemu je problem?
  • kupus: UK korisnici vs Apple [link]
  • Yonkis: Jeste li znali da se iPhone sam reboota ako nije otključan u 72 sata? [link]
  • Yonkis: jeste čitali komentare na [link]
  • Ender: takodje zainteresovan za neki IPTV, predlog moze u PM.
  • cariblanco: Ako hočeš ja ti svog "provajdera" kojeg koristim 4-5 godina, pošaljem na pp ?
  • cariblanco: Kako veli Zdravac dobar iptv za 10 E i imaš sve i gdjedaš od kud hočeš. Meni je to jako važno pošto puno putujem, trebam samo dobar net i mirna bosna
  • drlovric: Moj Telemach nema Arene vec Sport Klubove....ali postoji kabelska u zgradi koja ima Arene, preko koaksijalnog kabela.... Pa sam se tehnloski vratio deteljece unatrag. Ali radi evo :)
  • Zdravac: Ali to je paket ex yu kanala, nema samo sport vec sve
  • Zdravac: Kvalitetni, koji mogu preporučiti 10 eur/mj
  • Zdravac: Ima, iptv
  • kupus: hometv to go ili kako već
  • kupus: znači ide i eronet aplikacija
  • kupus: u bih prava ima arenasport ako se ne varam
  • drlovric: Jel ima neki nacin da se HNL Supersport liga gleda online? Neki app? Streaming? Iptv?
  • cariblanco: Prošlo iz petog pokušaja...bit će da je Riba na suhom ;)

Za vikanje moraš biti prijavljen.

Prijava

Prisutni jabučari

Novo na Jabučnjaku

Teme

Poruke

Oglasi

Komentari

Anketa

Koji Mac koristite?

Page Speed 1.37 Seconds

Provided by iJoomla SEO