10:02 <@adam_i`2> -------------------------------------------------- czesc 4 ---------------------------------------------------- 10:03 <@Gynvael> witam wszystkich WCZESNIE RANO ;p w czesci 4rtej mojego skromnego kursu 10:03 -!- mode/#gynkurs [+m] by Gynvael 10:03 <@Gynvael> dzisiaj bedzie o petlach, instrukcjach warunkowych 10:03 <@Gynvael> i sztuczkach jak ich uniknac 10:04 <@Gynvael> zaczne od instrukcji warunkowej if 10:04 <@Gynvael> if znaczy po angielsku po prostu "jezeli" 10:04 <@Gynvael> instrukcja ta przyjmuje w nawiasie WARUNEK ktory jest wyliczany 10:04 <@Gynvael> i jesli jest prawdziwy to jest wykonywane to co jest po ifie 10:05 <@Gynvael> a jesli nie, to albo nic nie jest wykonywane, a jesli istnieje "else" (eng. w innym wypadku) to jest wykonywane to co jest po else 10:05 <@Gynvael> przykladowo 10:05 <@Gynvael> if(a == b) puts("ok!"); else puts("nie ok!"); 10:05 <@Gynvael> poprawne sa rowniez nastepujace zapisy: 10:05 <@Gynvael> if(a == b) puts("ok!"); 10:06 <@Gynvael> if(a == b) { instrukcja1; instrukcja2; } else { instrukcja3; instrukcja4; } (jest to metoda polecana przez GNU C standard coding) 10:06 <@Gynvael> mozna napisac tez 10:06 <@Gynvael> if(a == b) inkstrukcja1, instrukcja2; else instrukcja3, instrukcja 4; 10:06 <@Gynvael> ciekawa rzecza o ktorej nie wszyscy wiedza 10:06 <@Gynvael> jest to ze if przyjmuje jako argument liczbe 10:07 <@Gynvael> warunek jest prawdziwy w momencie gdy liczba ta ma wartosc NIEZEROWA 10:07 <@Gynvael> a nieprawdziwy w momencie gdy LICZBA ta ma WARSTOSC ZEROWA DLA DANEGO TYPU 10:07 <@Gynvael> przykladowo 10:07 <@Gynvael> if(1) jest ZAWSZE prawdzwiy 10:07 <@Gynvael> a if(0) nigdy 10:08 <@Gynvael> w jezyku C istnieje dosc spora liczba operacji mametmatyczno-arytmetycznych (kolo 50) 10:08 <@Gynvael> sa tam miedzy innymi porownania 10:08 <@Gynvael> http://gynvael.vexillium.org/gk4_1.c 10:08 <@Gynvael> porownanie 10:08 <@Gynvael> a==b jest operacja ktora w wyniku daje 1 lub 0 10:08 <@Gynvael> printf("%i\n", 1==2); wypisze na ekran 0 10:08 <@Gynvael> a 10:08 <@Gynvael> printf("%i\n", 1==1); wypisze na ekran 1 10:09 <@Gynvael> printf("%i\n", 2==2); tez wypisze na ekran 1 10:09 <@Gynvael> operacja negacji logicznej, czyli ! wstawione przed zmienna badz liczbe 10:09 <@Gynvael> zmienia jej logiczna wartosci 10:09 <@Gynvael> czyli 10:09 <@Gynvael> jesli ! wstawimy przed liczbe 0 (nieprawda), zostanie zmieniona ona na liczbe 1 (prawda) 10:10 <@Gynvael> natomiast jesli ! wstawimy przed dowolna inna liczbe (jako ze wszystkie niezerowe sa prawdziwe, a jest tylko jedno zero) 10:10 <@Gynvael> to dostaniemy w wyniku nieprawde, czyli 0 10:10 <@Gynvael> mozna sie o tym przekonac wykonujac kod printf("%i\n", !1234); 10:10 <@Gynvael> teraz taka ciekawostka 10:10 <@Gynvael> czasami jest potrzeba wyliczenia takiej rzeczy: 10:11 <@Gynvael> jesli a jest prawdziwe, nadaj b wartosc 1, a jesli a jest falszywe, nadaj b wartosc 0 10:11 <@Gynvael> mozna to zapisac jako: 10:11 <@Gynvael> int a,b; 10:11 <@Gynvael> a = 123; /* jakas tam wartosc */ 10:11 <@Gynvael> if(a) b = 1; else b = 2; 10:11 <@Gynvael> e 10:11 <@Gynvael> if(a) b = 1; else b = 0; 10:11 <@Gynvael> ;p 10:11 <@Gynvael> no 10:11 <@Gynvael> natomiast 10:11 <@Gynvael> mozna to zrobic szybciej 10:11 <@Gynvael> za pomoca ! 10:11 <@Gynvael> mianowicie 10:11 <@Gynvael> b = !!a; 10:11 <@Gynvael> przykladowo dla a = 123 uzyskamy: 10:12 <@Gynvael> b = !!123; 10:12 <@Gynvael> b = !(!123); 10:12 <@Gynvael> b = !(0); 10:12 <@Gynvael> b = !0; 10:12 <@Gynvael> b = 1; 10:12 <@Gynvael> przykladowo dla a == 0 uzyskamy 10:12 <@Gynvael> b = !!0; 10:12 <@Gynvael> b = !(!0); 10:12 <@Gynvael> b = !(1); 10:12 <@Gynvael> b = !1; 10:12 <@Gynvael> b = 0; 10:12 <@Gynvael> czyli to samo co robi ten if, ale w duzo krotszy sposob 10:12 <@Gynvael> krotko o instrukcjach porownujacych 10:12 <@Gynvael> mamy tam == (rowne co do wartosci) 10:12 <@Gynvael> rozne kombinacje mniejsze/wieksze/rowne 10:13 <@Gynvael> czyli >= <= > < 10:13 <@Gynvael> nierowne czyli NIEPRAWDA ZE ROWNE - != 10:13 <@Gynvael> CZESTYM BLEDEM jest napisanie 10:13 <@Gynvael> if(a = b) 10:13 <@Gynvael> zamiast 10:13 <@Gynvael> if(a == b) 10:13 <@Gynvael> natomiast kazdy "normalny" kompilator wyswietli warning 10:14 <@Gynvael> badz kaze zrobic if( (a = b) ) jesli to by bylo poprawne wyrazenie 10:14 <@Gynvael> przypomne tylko ze a = b to nadanie zmiennej a wartosci rownej wartosci b 10:14 <@Gynvael> natomiast a == b to instrukcja powronujaca a z b co do wartosci i zwracajaca 1 lub 0 10:14 <@Gynvael> skompilowany program da nastepujace rezultaty 10:14 <@Gynvael> ten gk4_1.c 10:15 <@Gynvael> root@yume:/code/kurs/gk4# gcc gk4_1.c -Wall -pedantic -o gk4_1 10:15 <@Gynvael> root@yume:/code/kurs/gk4# ./gk4_1 10:15 <@Gynvael> a nie jest rowne b 10:15 <@Gynvael> a jest wieksze lub rowne b 10:15 <@Gynvael> a jest wieksze od b 10:15 <@Gynvael> a jest prawdziwym warunkiem 10:15 <@Gynvael> b jest falszywym warunkiem 10:15 <@Gynvael> przyklad kontrukcji if...else mozna zobaczyc w przykladzie drugim 10:15 <@Gynvael> http://gynvael.vexillium.org/gk4_2.c 10:15 <@Gynvael> kolejna wazna rzecza sa dwie operacje logiczne 10:16 <@Gynvael> mianowicie OR (lub) i AND (i) (brak jest operacji logicznej "albo" ;p) 10:16 <@Gynvael> w C or zapisuje sie za pomoca dwoch pipe'ow - || 10:16 <@Gynvael> a and za pomoca dwoch ampow - && 10:16 <@Gynvael> (istnieja tez operacje binarne or i and, zapisuywane | i &, ale o nich pozniej) 10:17 <@Gynvael> (zadziwiajace do ilu roznych rzeczy uzywa sie znaku & w C ne ? tu pointerki, tam operacje binarne... chyba im sie znaki skonczyly jak wymyslali ten jezyk) 10:17 -!- SlimFast [~1234@gate.olnet.com.pl] has quit [""] 10:17 <@Gynvael> ok 10:17 <@Gynvael> teraz jak uzyc || i && ? 10:17 <@Gynvael> przykladowo 10:17 <@Gynvael> int a = 5; 10:18 <@Gynvael> nam pasuje jesli a jest rowne 4 lub 8 10:18 <@Gynvael> sprawdzamy wiec 10:18 <@Gynvael> if( a == 4 || a == 8 ) { costam } 10:18 <@Gynvael> bardziej CZYTELNYM zapisem jest 10:18 <@Gynvael> if( ( a == 4 ) || ( a == 8 ) ) { costam } 10:18 <@Gynvael> aczkolwiek nie zawsze jest on konieczny 10:19 <@Gynvael> znak && stosuje sie na przyklad do sprawdzenia czy szukana wartosc jest z jakiegos przedzialu 10:19 <@Gynvael> przykladowo pasuj nam jesli a jest z przedzialu 3 do 6 wlacznie 10:19 -!- seraphin is now known as seraph`pytanie 10:19 <@Gynvael> napisac wiec mozemy "jesli a jest wieksze lub rowne 3 I a jest mniejsze lub rowne 6" 10:19 <@Gynvael> seraph`pytanie: w8 tylko tyo dokoncze ;> 10:19 <@Gynvael> if( a >= 3 && a <= 6 ) { puts("a wpada w przedzial 3 do 6"); } 10:20 <@Gynvael> ok, tyle wstepu, teraz bede mowil o pewnych ciekawych wlasciwosciach (ciekawych ze wzgledu na optymalizacje) operacji || i && 10:20 -!- d0b0c0p [~user@aag2.internetdsl.tpnet.pl] has joined #gynkurs 10:20 <@Gynvael> pytania ? 10:20 <@seraph`pytanie> ja 10:20 <@Gynvael> seraph`pytanie: mow mow 10:20 -!- seraph`pytanie is now known as seraphin 10:20 <@seraphin> czy 10:20 <@seraphin> jest taka mozliwosc jak w pasacalu 10:20 <@seraphin> if( a == 4 || a == 8 ) { costam } 10:20 <@seraphin> ze 10:20 <@seraphin> kompilator 10:21 <@seraphin> potraktuje to jako binarne OR miedzy 4 a zmienna "a" ? 10:21 <@Gynvael> nie 10:21 -!- adam_i`3 [~none@anh100.neoplus.adsl.tpnet.pl] has joined #gynkurs 10:21 <@Gynvael> nei ma takiej mozliwosci 10:21 <@seraphin> i nie bedzie sie burzyl ze nie ma nawiasow? 10:21 <@Gynvael> || ma mniejszy prioorytet niz ==, dzieki czemu jest to bezpieczny zapis 10:21 <@Gynvael> nie, nie bedzie 10:22 <@seraphin> o jak fajnie ;) 10:22 <@Gynvael> ok 10:22 <@Gynvael> jeszcze jakies ? 10:22 <@seraphin> a wlasnie 10:22 <@seraphin> jeszcze raz ja 10:22 <@Gynvael> mow ;> 10:22 <@seraphin> co jest szybsze 10:22 <@seraphin> a = !!b czy normalnie z ifami? 10:22 -!- mode/#gynkurs [-m] by Gynvael 10:22 -!- adam_i`2 [~none@amv127.neoplus.adsl.tpnet.pl] has quit [Operation timed out] 10:22 < phoenix__> no nareszczie 10:23 <@Gynvael> sorx -- 10:23 <@Gynvael> ;p 10:23 < phoenix__> jaki jest lepszy sposob? 10:23 < phoenix__> z klamrami czy bez? 10:23 < d0b0c0p> ja sobie zapomnialem wejsc o 10, a sie obudzilem grrr 10:23 <@Gynvael> !!b jest szybsze 10:23 <@Gynvael> phoenix__: oba sa dobre, tu chodzi o czytelnosc 10:23 < d0b0c0p> adam_i: poprosze potem o logi, k? 10:23 <@adam_i> nom 10:23 <@Gynvael> phoenix__: jak masz w ifie 123 instrukcje, to lepiej dac jednak te { } niz , , , 10:23 < phoenix__> Gynvael: ja npn wole z klamrami , duzo wyrazniejszy 10:23 <@seraphin> ok to chyba all 10:23 <@Gynvael> phoenix__: tak sie w sumie powinno robic ;> 10:23 <@Gynvael> phoenix__: z klamrami ;> 10:23 < d0b0c0p> moze mi ktos dac logi z poczatku kursu? 10:24 -!- mode/#gynkurs [+o phoenix__] by adam_i 10:24 < d0b0c0p> teraz ;) 10:24 <@Gynvael> phoenix__: przynajmniej tak zalecaja w GNU C Coding standard ;> 10:24 <@phoenix__> Gynvael: a odpowiesz mi nA WCZORAJSZE PYT? 10:24 <@Gynvael> phoenix__: czyli ? 10:24 <@phoenix__> tzn czemu nie ma byc %lu i %li ? 10:25 <@phoenix__> mowiles ze poqinno byc %u i %i 10:26 <@Gynvael> phoenix__: e to na privie ;> 10:26 < phoe> ok 10:26 <@Gynvael> phoenix__: jako ze reszta jest nie w temacie 10:26 <@Gynvael> ok 10:26 <@Gynvael> mozna dalej ? 10:26 < d0b0c0p> niop 10:26 < adam_i`3> nom 10:26 < d0b0c0p> moze ktos +o? 10:27 -!- mode/#gynkurs [+m] by Gynvael 10:27 -!- mode/#gynkurs [+o d0b0c0p] by seraphin 10:27 -!- mode/#gynkurs [+o adam_i`3] by Gynvael 10:27 -!- mode/#gynkurs [+o d0b0c0p] by Gynvael 10:27 -!- mode/#gynkurs [+o phoenix__] by Gynvael 10:27 -!- mode/#gynkurs [+o phoe] by Gynvael 10:27 <@Gynvael> ok 10:27 <@Gynvael> lecimy dalej 10:35 <@Gynvael> teraz pare faktow na temat || i && 10:35 <@Gynvael> mianowicei 10:35 <@Gynvael> z tego co wiecie badz nie wiecie 10:35 <@Gynvael> jest tak 10:35 <@Gynvael> A || B || C 10:35 <@Gynvael> jesli CHOCIAZ JEDNO Z "A", "B" lub "C" BEDZIE PRAWDZIWE 10:35 <@Gynvael> cale wyrazenie JEST prawdziwe 10:35 <@Gynvael> natomiast 10:35 <@Gynvael> A && B && C 10:35 <@Gynvael> jesli chociaz jedno wyrazenie jest NIEPRAWDZIWE, CALE WYRAZENIE JEST NIEPRAWDZIWE 10:35 <@Gynvael> && mozna tlumaczyc jako "i musi byc spelnione" 10:35 <@Gynvael> A musi byc spelnione i B musi byc spelnione i C musi byc spelnione 10:35 <@Gynvael> zeby calosc byla ok 10:35 <@Gynvael> przykladowo 10:35 <@Gynvael> if( 1 || 0 || 0 ) to prawda 10:35 <@Gynvael> podczas gdy 10:35 <@Gynvael> if( 1 && 1 && 0 ) to prawda 10:35 <@Gynvael> if( 1 && 1 && 0 ) to FALSZ 10:35 <@Gynvael> ;p 10:35 <@Gynvael> sic ;p 10:35 <@Gynvael> niom 10:35 <@Gynvael> natoamist 10:35 <@Gynvael> if( 1 && 2 && 3 ) to prawda 10:35 <@Gynvael> a 10:35 <@Gynvael> if( 0 || 0 || 0 ) to falsz 10:35 <@Gynvael> tutaj nalezy zwrocic uwage na fakt 10:35 <@Gynvael> ze kompilator jest sprytny 10:35 <@Gynvael> i wie jedna rzecz 10:35 <@Gynvael> mianowicie 10:35 <@Gynvael> jesli ma zapis typu 10:35 <@Gynvael> if( a || b || c ) 10:35 <@Gynvael> to on sprawdza DO PIERWSZEJ PRAWDZIWEJ WARTOSCI, A RESZTY JUZ NIE SPRAWDZA 10:35 <@Gynvael> czyli gdybysmy mieli na przyklad 10:35 <@Gynvael> if( a() || b() || c() ) 10:35 <@Gynvael> gdzie a() zwroci 0 10:35 <@Gynvael> a b() zwroci 1 10:35 <@Gynvael> to c() NIE BEDZIE JUZ WYWOLANE 10:35 <@Gynvael> analogicznie jest z && 10:35 <@Gynvael> sprawdzanie trwa DO PIERWSZEJ FALSZYWEJ WARTOSCI 10:35 <@Gynvael> czyli 10:35 <@Gynvael> if( a() && b() && c() ) 10:35 <@Gynvael> jako ze a() zwraca 0 10:35 <@Gynvael> to b() i c() nie beda juz wywolane 10:35 <@Gynvael> jakie to ma implikacje ? 10:35 <@Gynvael> wchodzi tutaj kwestia optymalizacji (przyspieszenia dzialania programu) 10:35 <@Gynvael> chodzi o to by ZBADAC KTORE WARUNKI W PROGRAMIE NAJCZESCIEJ SA PRAWDZIWE A KTORE FALSZYWE 10:35 <@Gynvael> I TAK DOBRAC KOLEJNOSC ZEBY: 10:35 <@Gynvael> - TE NAJCZESCIEJ PRAWDZIWE BYLY NA POCZATKU WYRAZENIA TYPU a || b || c 10:35 <@Gynvael> - TE NAJCZESCIEJ FALSZYWE BYLY NA POCZATKU WYRAZENIA TYPU a && b && c 10:35 <@Gynvael> przeprowadzmy pewien test 10:35 <@Gynvael> http://gynvael.vexillium.org/gk4_3.c 10:35 <@Gynvael> http://gynvael.vexillium.org/speed.h 10:35 <@Gynvael> oba pliki trzeba sciagnac 10:35 <@Gynvael> i musza byc w tym samym katalogu podczas kompilacji ;> 10:35 <@Gynvael> speed.h to moja mala "biblioteczka" ktorej uzywam do testow szybkosci 10:35 <@Gynvael> i taki test przeprowadze w tym miejscu 10:35 <@Gynvael> rzuccie okiem na gk4_3 10:35 <@Gynvael> w main() sa 4ry bardzo podobne instrukcje 10:35 <@Gynvael> pojawia sie tam petla for o ktorej bedzie za chwile 10:35 -!- adam_i`4 [~none@aml121.neoplus.adsl.tpnet.pl] has joined #gynkurs 10:35 <@Gynvael> w skrocie tylko podwiem ze tutaj for powtarza ten kod 100000000 razy 10:35 -!- __phoenix [~phoenix@cdv56.neoplus.adsl.tpnet.pl] has joined #gynkurs 10:35 <@Gynvael> dla parametrow po kolei 0, 1, 2, 3, 4, ...., 99999999 10:35 <@Gynvael> podstawiajac te wartosci zamiast i 10:35 <@Gynvael> tcount(); to funkcja ktora liczy czas, pierwsze uruchomienie wlacza stoper, a drugie go wylacza i wypisuje wynik 10:35 <@Gynvael> teraz tak 10:35 <@Gynvael> sa tam 3 funkcje 10:35 <@Gynvael> func_a(int i) 10:35 <@Gynvael> func_b(int i) 10:35 <@Gynvael> func_c(int i) 10:35 <@Gynvael> func_a(int i) - zwraca 1 jesli LICZBA i JEST PODZIELNA PRZEZ 2 10:35 <@Gynvael> func_b(int i) - zwraca 1 jesli LICZBA i JEST PODZIELNA PRZEZ 3 10:35 <@Gynvael> func_c(int i) - zwraca 1 jesli LICZBA i JEST PODZIELNA PRZEZ 4 10:35 <@Gynvael> jak nie trudno sie domyslic 10:35 -!- phoe [^phoenix@ccr138.neoplus.adsl.tpnet.pl] has quit [Operation timed out] 10:36 <@Gynvael> liczac od 0 do 99999999 najwiecej jest liczb podzielnych przez 2 10:36 <@Gynvael> jest to co druga liczba 10:36 <@Gynvael> co trzecia jest podzielna przez 3 10:36 <@Gynvael> a co czwarta przez 4 10:36 -!- phoenix__ [~phoenix@cdv56.neoplus.adsl.tpnet.pl] has quit [Ping timeout] 10:36 <@Gynvael> wiec warunek func_a() jest najczesciej spelniony 10:36 <@Gynvael> warunek func_c() jest najrzadziej 10:36 -!- adam_i`3 [~none@anh100.neoplus.adsl.tpnet.pl] has quit [Ping timeout] 10:36 <@Gynvael> w main znajduja sie 4ry testy 10:37 <@Gynvael> w pierwszym w if wywolania sa ustawione tak zeby uzywac || i "najrzadsze spelnione na poczatku" 10:37 <@Gynvael> a drugim ponownie ||, ale posegregowane od najczestszego do najrzadszego ( tak jak powinno byc) 10:37 <@Gynvael> 3ci i 4rty test sa analogiczne dla && 10:38 <@Gynvael> najpierw wywolania posegregowane w8 "najrzadsze spelnione na poczatku" (tak jak powinno byc) 10:38 <@Gynvael> a potem najczestsze na poczatku 10:38 <@Gynvael> po kompilacji i przeczekaniu paru sekund 10:38 <@Gynvael> dostaej sie mniej wiecej nastepujace wyniki: 10:38 <@Gynvael> root@yume:/code/kurs/gk4# gcc gk4_3.c -Wall -pedantic -o gk4_3 10:38 <@Gynvael> root@yume:/code/kurs/gk4# ./gk4_3 10:38 <@Gynvael> TICKS: 12.430000 sec 10:38 <@Gynvael> TICKS: 9.500000 sec 10:38 <@Gynvael> TICKS: 6.440000 sec 10:38 <@Gynvael> TICKS: 9.020000 sec 10:38 <@Gynvael> sa to czasy wykonania poszczegolnych testow (calej petli) 10:38 <@Gynvael> jak latwo zauwazyc 10:39 <@Gynvael> w momencie posegregowania warunkow 10:39 <@Gynvael> mamy o 3 sec lepszy czas niz bez segregacji 10:39 <@Gynvael> w obu wypadkach, i || i && 10:39 <@Gynvael> nie jest to moze duza roznica jak na 100000000 wywolan 10:40 <@Gynvael> ALE warto o tym wiedziec, jako ze kompilator tej optymalki za programiste nie wykonac 10:40 <@Gynvael> a tutaj optymalka zaniedbana, tam zaniedbana 10:40 <@Gynvael> a potem DOOM3 wymaga Stacji Kosmicznej MIR zeby ruszyl z jakims uczciwym FPS 10:40 <@Gynvael> ok 10:41 <@Gynvael> teraz jeszcze 3 sekundy o obejsciu sie bez ifa 10:41 <@Gynvael> if'a bardzo czesto wykorzystuje sie do sprwdzania czy dany fragment programu wykonal sie ok 10:41 -!- adam_i`2 [~none@amy124.neoplus.adsl.tpnet.pl] has joined #gynkurs 10:41 <@Gynvael> if( ! fragment_programu() ) puts ("blad!"); 10:41 <@Gynvael> rodem z tutoriala PHP mozna uzyc nastepujacego triku, wlasciwosci || 10:42 <@Gynvael> fragment_programu() || puts ("blad!"); 10:42 <@Gynvael> czyli 10:42 <@Gynvael> jesli fragment_programu() zwroci "1", czyli wszystko OK 10:42 -!- adam_i`4 [~none@aml121.neoplus.adsl.tpnet.pl] has quit [Operation timed out] 10:55 <@Gynvael> puts sie nie wypisze, bo sprawdzanie trwa do pierwszej napotkanej poprawnej instrukcji 10:55 <@Gynvael> natomiast jesli fragment_programu() zwroci "0", to puts("blad!"); zostanie wywolane 10:55 <@Gynvael> http://gynvael.vexillium.org/gk4_4.c 10:55 <@Gynvael> tam mozna zobaczyc przyklad uzycia 10:55 -!- adam_i`3 [~none@ang71.neoplus.adsl.tpnet.pl] has joined #gynkurs 10:55 <@Gynvael> root@yume:/code/kurs/gk4# ./gk4_4 10:55 <@Gynvael> nie_udalo_sie() nie wyszlo 10:55 <@Gynvael> NATOMIAST jesli piszemy zgodnie z POSIXowskim standardem 10:55 <@Gynvael> czyli "funkcja zwraca 0 jesli WSZYSTKO OK, a wartosc niezerowa jesli cos nie tak" 10:55 <@Gynvael> to mozemy uzyc && zamiast || ;> 10:55 <@Gynvael> to jest bardziej ciekawostka, jako ze BARDZO RZADKO spotyka sie w kodzie sprawdzania bledow || zamiast ifa 10:55 <@Gynvael> ok 10:55 -!- mode/#gynkurs [-m] by Gynvael 10:55 <@Gynvael> pytania ? 10:55 <@bubel> to ja 10:55 <@bubel> skad wiadomo ze DOOM3 jest nie optymalnie napisany? 10:55 <@bubel> ;>> 10:55 <@d0b0c0p> lol 10:55 <@Gynvael> bubel: hehehe to byl przyklad, jako ze DOOM3 jest obecnie chyba najbardziej wymagajaca pozycja na rynku 10:55 <@Gynvael> chyba ze cos go juz zdetronizowalo ;> 10:55 < __phoenix> bubel bo gyn go kodzil ;] 10:55 < __phoenix> ;P 10:55 < adam_i`3> A ja takie ne na temat czy stad wychodzil adam_I ten bez zandych numerkow na koncu 10:55 <@bubel> ok to tak na rozluznienie ;> 10:55 < __phoenix> i btw nie mam czesci logow bo u M34La szel padl ;P 10:55 < __phoenix> musze potem przeczytac... ;] 10:55 <@Gynvael> adam_i`3: ne, bot siedzial non stop 10:55 <@d0b0c0p> what next? 10:55 < __phoenix> adam_i`3 keidy beda logi ? :> 10:55 -!- mode/#gynkurs [+ooo __phoenix adam_i`2 adam_i`3] by d0b0c0p 10:55 <@adam_i`3> Na koniec 10:55 <@adam_i`3> O ile sesja niepadla 10:55 <@d0b0c0p> ojoj 10:55 <@__phoenix> adam_i`3 mi tez padla 10:55 <@d0b0c0p> Gynvael: najwyrzej ty dasz logi ;) 10:55 <@adam_i`3> Mi loclahsot orae razy padal 10:55 <@__phoenix> i jeszcze ktos siedzi na moim nicku ;] ewnie sesja ;P 10:55 <@Gynvael> (dajcie mi 2 minuty) 10:55 -!- adam_i`2 [~none@amy124.neoplus.adsl.tpnet.pl] has quit [Operation timed out] 10:55 <@bubel> idziemy sie wysikac 10:55 <@__phoenix> phoenix__`C 10:55 <@__phoenix> adam_i`3 co ci tak sesja pada ? 10:55 <@__phoenix> a tak ooftop to nie ma to jak BX 10:55 <@__phoenix> gyn masz fajniuskom stone bledu 404 10:55 <@__phoenix> ;] 10:55 <@bubel> __phoenix: hehe, a kluliczka juz widziales?:p 10:55 <@__phoenix> ala ma kota kot ma 404 10:55 <@__phoenix> bubel widzialem 10:55 <@bubel> a chcesz go kupic?:P 10:55 <@__phoenix> bubel kluliczek chyba byl na ... 10:55 <@__phoenix> cenobium ?:> 10:55 <@__phoenix> bubel nie 10:55 <@bubel> szkoda 10:55 <@bubel> no nic teraz petle beda? 10:55 <@__phoenix> bubel mam za duzo zwierzat ;P 10:55 <@__phoenix> bubel taa inne 10:55 <@bubel> inne? 10:55 <@bubel> nie znam 10:55 <@bubel> sic 10:55 <@Gynvael> ok 10:55 <@Gynvael> jedizemy ? 10:55 -!- phoenix__ [~phoenix@cdv56.neoplus.adsl.tpnet.pl] has joined #gynkurs 10:55 <@bubel> ja nie mam biletu!:D 10:55 -!- mode/#gynkurs [+o phoenix__] by d0b0c0p 10:49 -!- mode/#gynkurs [+o phoenix__] by d0b0c0p 10:49 -!- adam_i [~adam@80.48.232.136] has quit [Ping timeout] 10:49 <@__phoenix> fuck 10:49 <@Gynvael> bubel: a ja czajnika, ale nic nie szkodzi 10:49 <@__phoenix> stuj 10:49 <@d0b0c0p> o shit to juz po logach 10:49 <@Gynvael> adam_i`3: bot ci padl;p 10:49 <@Gynvael> hehe poczekamy na bota 10:49 <@Gynvael> a ja wrzuce przyklady na serv 10:49 <@d0b0c0p> bubel: moze ty masz logi? :P 10:49 <@bubel> d0b0c0p: mam 10:50 -!- adam_i [~none@amc30.neoplus.adsl.tpnet.pl] has joined #gynkurs 10:50 <@d0b0c0p> bubel: no to sie wymienicie za adaskiem :P 10:50 <@__phoenix> bubel za duzo sie nagadalismy ;P 10:50 <@__phoenix> w8 10:50 <@bubel> d0b0c0p: ale ja je sprzedaje 10:50 <@bubel> ;p 10:50 <@bubel> chcesz kupic? 10:50 <@__phoenix> postawie tez nalocalhoscie cos 10:50 <@__phoenix> jakiegos bota 10:50 <@d0b0c0p> bubel: pfff 10:50 <@d0b0c0p> no juz kupuje ;p 10:50 <@bubel> to po 255 kursie 10:50 <@d0b0c0p> cena wywolawcza 0.00 PLN, ok? 10:50 <@bubel> odsprzedam 10:51 <@bubel> +7%vat :P 10:51 <@d0b0c0p> 0.00 * 1.07 = 0.00 PLN, pasuje? 10:51 -!- adam_i`3 [~none@ang71.neoplus.adsl.tpnet.pl] has quit [Operation timed out] 10:51 <@bubel> d0b0c0p: zsikasz sie?:p 10:52 -!- __phoenix is now known as phoelog 10:52 <@d0b0c0p> bubel: ne :F 10:52 <@Gynvael> ok 10:52 <@bubel> d0b0c0p: to co sie cieszysz :p 10:52 <@Gynvael> tyo jedziemy ? 10:52 <@bubel> ok 10:52 -!- mode/#gynkurs [+m] by Gynvael 10:52 <@Gynvael> ok 10:52 -!- mode/#gynkurs [+o adam_i] by d0b0c0p 10:52 <@Gynvael> sorx za przerwe ;> 10:52 <@Gynvael> lecimy dalej 10:52 <@Gynvael> teraz tak 10:53 <@Gynvael> jedna wazna rzecz 10:53 <@Gynvael> w PASCALU napisy porownywalo sie tak: if "ala" = "kota" then .... 10:53 <@Gynvael> w C sie TAK NIE ROBI 10:53 <@Gynvael> if( "ala ma kota" == "ala ma kota" ) w czesci przypadkow jest nieprawdziwe 10:53 <@Gynvael> a jakies 10:56 -!- adam_i_ [~adam@80.48.232.136] has joined #gynkurs 10:56 -!- Irssi: #gynkurs: Total of 17 nicks [16 ops, 0 halfops, 0 voices, 1 normal] 10:56 -!- mode/#gynkurs [+o adam_i_] by phoenix__ 10:56 <@Gynvael> char a[] = "ala ma kota", b[] = "ala ma kota"; 10:56 <@Gynvael> if( a == b ) w 100% przypadkow jest nieprawdziwe 10:56 <@Gynvael> tak samo 10:56 <@Gynvael> if( a == "ala ma kota" ) w 100% przypadkow jest nieprawdziwe 10:56 <@Gynvael> if( b == "ala ma kota" ) w 100% przypadkow jest nieprawdziwe 10:56 -!- Irssi: Join to #gynkurs was synced in 28 secs 10:56 <@Gynvael> chodzi tutaj o pewna wlasciwosc napisow 10:57 <@Gynvael> o ktorej bedzie na ktorym kolejnym wykladzie 10:57 <@Gynvael> narazie powiem tylko ze do porownywania napisow sluzy funkcja strcmp z string.h 10:57 <@Gynvael> i lecimy dalej 10:57 <@Gynvael> ok 10:57 <@Gynvael> czesto zdarza sie 10:57 <@Gynvael> ze trzeba sprawdzic pare wartosci zmiennej 10:57 <@Gynvael> na przyklad 10:57 <@Gynvael> mamy jakeis int a; 10:57 <@Gynvael> a ma jakas tam wartosc 10:57 <@Gynvael> "a" ma jakas tam wartosc 10:58 <@Gynvael> i my chcemy zeby dla a == 0 zrobilo sie costam, a == 1 costam, etc 10:58 -!- adam_i [~none@amc30.neoplus.adsl.tpnet.pl] has quit [Connection reset by peer] 10:58 <@Gynvael> (czekamy na bota;p) 10:58 <@Gynvael> czekamy ? 10:58 <@Gynvael> czy polecial na dobre ?:P 10:58 <@Gynvael> nvm 10:58 <@adam_i_> jest bot 10:58 <@Gynvael> sklei sie logi 10:58 <@Gynvael> ok 10:58 <@Gynvael> wtedy 10:58 -!- You're now known as adam_i 10:58 -!- You're now known as 616LJ384J 10:58 <@Gynvael> uzywa sie konstrukcji typu "if else if else if... else" 10:59 <@Gynvael> if( a == 0 ) { costam } 10:59 <@Gynvael> else if( a == 1 ) { costam } 10:59 <@Gynvael> else if( a == 2 ) { costam } 10:59 <@Gynvael> else { costam } 10:59 <@Gynvael> http://gynvael.vexillium.org/gk4_5.c 11:01 -!- adam_I`2 [~none@and121.neoplus.adsl.tpnet.pl] has joined #gynkurs 11:01 -!- mode/#gynkurs [+o adam_I`2] by phoenix__ 11:01 <@Gynvael> ok 11:01 <@Gynvael> teraz tak 11:01 <@Gynvael> jest to tylko jedna z mozliwosci 11:02 <@Gynvael> istnieje rowniez funkcja switch/case 11:02 <@Gynvael> ktora dla pascalowcow moze byc troche zamieszana 11:02 <@Gynvael> mianowicie 11:02 <@Gynvael> zobaczmy to na przykladzie 11:02 <@Gynvael> http://gynvael.vexillium.org/gk4_6.c 11:02 <@Gynvael> switch(wyrazenie) { 11:02 <@Gynvael> case WARTOSC: ... break; 11:02 <@Gynvael> default: ... 11:02 <@Gynvael> } 11:03 <@Gynvael> porownujac do poprzedniego przykladu 11:03 <@Gynvael> case WARTOSC to po prostu porownania wyrazenia z wartoscia 11:03 <@Gynvael> default to "WSZYSTKIE INNE WARTOSCI NIEWYMIENIONE W LISCIE case" 11:03 <@Gynvael> jest tam jakis tajemniczy "break;" 11:04 <@Gynvael> break to wyjscie ze switcha (tzn pojscie za }) ;> 11:04 <@Gynvael> po co to ? 11:04 <@Gynvael> odpalmy ten program 11:04 <@Gynvael> za chwile wywalmy breaki 11:04 <@Gynvael> skompilujmy i odpalmy jeszcze raz 11:05 <@Gynvael> root@yume:/code/kurs/gk4# ./gk4_6 11:05 <@Gynvael> a == 3 11:05 <@Gynvael> teraz zmieniam 11:05 <@Gynvael> root@yume:/code/kurs/gk4# ./gk4_6 11:05 <@Gynvael> a == 3 11:05 <@Gynvael> a == 4 11:05 <@Gynvael> a == ??? 11:05 <@Gynvael> co sie tak naprawde stalo ? 11:05 <@Gynvael> wynika to z zasady dzialania switch/case 11:05 <@Gynvael> mianowicie switch wykonuje SKOK do case o okreslonej wartosci 11:06 <@Gynvael> I JUZ NIC WIECEJ GO NIE INTERESUJE 11:06 <@Gynvael> jesli nie zrobimy break; to kod poprostu poleci tak jak by wszystkich case nizej nie bylo 11:06 <@Gynvael> wykonujac TAKZE ICH KOD 11:06 <@Gynvael> sa tego dobre i zle strony 11:06 <@Gynvael> wymienic moge jedna dobra strone z przykladem 11:06 <@Gynvael> ostatnio zdarzylo mi sie ze potrzebowalem funkcje ktora cos tam robila 11:07 <@Gynvael> ale ogolnie to jesli dostawala 3 w parametrze 11:07 -!- seraphin is now known as seraph`pytanie 11:07 <@Gynvael> to miala dodac 3 do jednej wartosci 11:07 <@Gynvael> seraph`pytanie: tylko skoncze 11:07 -!- Pakster_ [~pakster@fg46.internetdsl.tpnet.pl] has joined #gynkurs 11:07 -!- mode/#gynkurs [+o Pakster_] by phoenix__ 11:07 <@Gynvael> natomiast musiala kazde dodawanie robic oddzielnie (akurat taka funkcja mi byla potrzebna) 11:07 <@Gynvael> wartosci byly od 1 do 4 11:07 <@Gynvael> wiec zrobilem tak: 11:07 <@Gynvael> int a; <=- to ma wartosc od 1 do 4 11:08 <@Gynvael> int b = 123; <=- tu dodaje 11:08 <@Gynvael> switch(a) { 11:08 <@Gynvael> case 4: b++; 11:08 <@Gynvael> case 3: b++; 11:08 <@Gynvael> case 2: b++; 11:08 <@Gynvael> case 1: b++; 11:08 <@Gynvael> } 11:08 <@Gynvael> czyli, jesli "a" bylo == 4, wtedy wykonywaly sie po kolei wszystkei case'y od case 4: zaczynajac (jako ze nie bylo break) 11:08 <@Gynvael> jak a == 2, to tylko 2 dolne sie wykonywaly 11:08 <@Gynvael> etc 11:08 <@Gynvael> jest to jedno z zastosowan 11:09 <@Gynvael> ok 11:09 <@Gynvael> za chwile bedzie o porownaniu szybkosci miedzy switch/case a if/else 11:09 <@bubel> najlepiej to zrozumiec na przykladzie asm'a 11:09 <@Gynvael> jako ze to to-samo tylko inaczej zapisane ;> 11:09 <@bubel> ze sie tak wtrace 11:09 -!- mode/#gynkurs [-m] by Gynvael 11:09 <@Gynvael> pytania ? 11:09 -!- seraph`pytanie is now known as seraphin 11:09 <@seraphin> ja 11:09 <@bubel> wtedy all jest jasne dlaczego tak a nie inaczej 11:09 <@Gynvael> bubel: duzo rzeczy w C na przykladzie asma trzeba zrozumiec ;> 11:09 <@seraphin> czemu w tym ostatnim przykladzie 11:11 <@phoenix__> ?? 11:11 <@seraphin> wykonalo sie case 4 mimo ze a nie wynosilo 4? 11:11 -!- kiero was kicked from #gynkurs by Pakster_ [no reason] 11:11 <@Gynvael> Pakster_: ? 11:11 -!- mode/#gynkurs [-o Pakster_] by phoenix__ 11:11 < Pakster_> proba Gyn 11:11 <@Gynvael> seraphin: poniewaz nie bylo break; 11:11 < Pakster_> nie zlosliwue 11:11 <@phoenix__> Pakster_: miales opa... 11:11 <@gRl> znow kursujecie? ; o 11:11 <@seraphin> Gynvael: no nie bylo break i dalej powinien sprawdzac warunki 11:11 <@Gynvael> gRl: ta 11:11 < Pakster_> mialem ;] 11:11 <@d0b0c0p> gRl: yes g00ralku ty moj :P 11:11 <@Gynvael> seraphin: ok za chwile to wyjasnie ;> 11:11 <@Gynvael> jeszcze cos ? 11:11 <@bubel> Gynvael: zarzuc asm'em ;> 11:11 <@seraphin> Gynvael: powinien dalej sprawdzac ale a i tak nie wynosi 4 11:11 <@bubel> to sqamaj 11:11 <@Gynvael> bubel: lepiej nie, ale dam linka za chwile do asma ;> 11:11 <@bubel> tam jest jmp 4 11:11 <@Gynvael> seraphin: ah, w C tak wlasnie nie jest ;> 11:11 <@bubel> i potem sie kod od tego wykonuje ;> 11:11 <@Gynvael> ok 11:11 <@Gynvael> to to wyjasnie na przykladzie 11:11 <@Gynvael> cos jeszcze ? 11:12 <@Gynvael> ok 11:12 <@Gynvael> to jade 11:12 -!- mode/#gynkurs [+m] by Gynvael 11:12 <@Gynvael> teraz tak 11:12 <@adam_I`2> http://gynvael.vexillium.org/?stuff=mit_elseif.stuff 11:12 <@Gynvael> adam_I`2: hehe tego linka za chwile chcialem dac ;> 11:12 <@phoenix__> czytalem to ;p 11:12 <@Gynvael> switch(a) 11:12 <@Gynvael> { 11:12 <@Gynvael> case 0: puts("a == 0"); 11:12 <@Gynvael> case 1: puts("a == 1"); 11:12 <@Gynvael> case 2: puts("a == 2"); 11:12 <@Gynvael> case 3: puts("a == 3"); 11:12 <@Gynvael> case 4: puts("a == 4"); 11:12 <@Gynvael> default: puts("a == ???"); 11:12 <@Gynvael> 11:13 <@Gynvael> } 11:13 <@Gynvael> ok 11:13 <@Gynvael> mamy taki kod 11:13 <@Gynvael> a == 3 11:13 <@Gynvael> jak program sie wykona ? 11:13 <@Gynvael> nastepujaco: 11:13 <@Gynvael> main(a=3): 11:13 <@Gynvael> main(a=3): switch(3) 11:13 <@Gynvael> main(a=3): switch(3) wykonuje skok do case 3: I JUZ NICZYM SIE NIE INTERESUJE 11:13 <@Gynvael> main(a=3): case 3: puts("a == 3"); 11:13 <@Gynvael> main(a=3): case 4: puts("a == 4"); (kod leci dalej, nic go nie przerywa, w C sprawdzanie nie jest przy CASE, tylko PRZY SWITCHU, i TYLKO JEDNO) 11:14 <@seraphin> e 11:14 <@d0b0c0p> a 11:14 <@seraphin> moge wtracic? 11:14 <@Gynvael> main(a=3): default: puts("a == ???"); wiec jesli nie ma break, to on normalnie leci dalej 11:14 <@Gynvael> seraphin: mow 11:14 <@seraphin> pierwsza rzecz 11:14 <@seraphin> czy default: tez sie wykona wtedy? 11:14 <@Gynvael> seraphin: tak, jako ze jest po tym 11:14 <@d0b0c0p> seraphin: tak :P 11:14 <@seraphin> drugie 11:15 -!- kiero [avalanche@host-81-190-204-245.gorzow.mm.pl] has joined #gynkurs 11:15 -!- mode/#gynkurs [+o kiero] by d0b0c0p 11:15 <@seraphin> jakby zamienic miejscami case 0: i case 3: to wykonaly by sie wszystkie case? 11:15 -!- mode/#gynkurs [+o Pakster_] by d0b0c0p 11:15 <@phoenix__> ta 11:15 <@Gynvael> seraphin: tak 11:16 <@seraphin> a czy w switch funkcjonuje continue? 11:16 <@phoenix__> seraphin: tutaj chodzi glowni9e o SKOK 11:16 <@phoenix__> seraphin: mozna 11:16 <@phoenix__> seraphin: ale czy to ma sens ;> 11:16 -!- nicon_ [~nicon@80.51.59.3] has joined #gynkurs 11:16 <@bubel> sorki moge se isc kanapke zrobix? 11:16 <@phoenix__> bo mi sie wydaje ze nie 11:16 <@seraphin> Gynvael: continue funkcjonuje w switch? jezeli tak to jak dziala 11:16 <@bubel> skoro bedzie teraz o micie 11:16 * d0b0c0p idem potem sobie logi poczytam cya ;[ 11:16 -!- d0b0c0p [~user@aag2.internetdsl.tpnet.pl] has quit ["idem"] 11:16 <@phoenix__> bubel: yes 11:16 <@Gynvael> seraphin: nie, nie ma continue w switch 11:17 <@phoenix__> Gynvael: nie ma :> ?? 11:17 <@seraphin> phoenix__: a widzisz 11:17 -!- mode/#gynkurs [+o nicon_] by bubel 11:17 <@Gynvael> nie ma, bo i jak by mialo dzialac ?;> 11:17 <@phoenix__> a w CPP jest ?? 11:17 <@nicon_> gadacie o switch case? 11:17 <@kiero> [; 11:17 <@seraphin> Gynvael: skakac do warunku znowu? 11:17 <@bubel> Gynvael: mowie rzuc prostym przykladem w asm 11:17 -!- You're now known as adam_i_ 11:17 <@phoenix__> Gynvael: nic by nie robilo 11:17 <@seraphin> Gynvael: powiedzmy kod w case zmienial by wartosc wyrazenia 11:18 <@Gynvael> proba uzycia continue konczy sie tak: 11:18 <@seraphin> Gynvael: i kazal mu znowu sprawdzac 11:18 <@Gynvael> gk4_6.c: In function `main': 11:18 <@Gynvael> gk4_6.c:27: error: continue statement not within a loop 11:18 <@phoenix__> Gynvael: a jakbyt bylo continue przed break ? :> 11:18 <@Gynvael> seraphin: moglo by, ale tak nie jest ;> 11:18 <@seraphin> Gynvael: aha spoko 11:18 <@Gynvael> seraphin: trzeba by to w petle wziasc 11:18 <@phoenix__> Gynvael: ale w CPP jest ?:> 11:18 <@nicon_> zawsze mnie ciekawila jedna rzecz apropo tego tematu 11:18 <@Gynvael> phoenix__: afair ne 11:18 <@phoenix__> bo z tego co pamietam to jest 11:18 <@phoenix__> w8 sprawdze l[ 11:18 <@nicon_> dlaczego w case nie mozna zadeklarowac zmiennej i jednoczesnie jej zainicjalizowac?? 11:19 <@seraphin> ? 11:19 <@Gynvael> nicon_: w jezyku C WSYZTKIE DEKLARACJE ZMIENNYCH MUSZA BYC NA POCZATKU\ 11:19 <@Gynvael> nicon_: tzn na poczatku funkcji 11:19 <@Gynvael> nicon_: w C++ i C99 niby mozna inaczej, ale to "bad habit" ;p 11:19 <@Gynvael> seraphin: case bez break dziala dokladnie tak: http://gynvael.vexillium.org/gk4_6a.c 11:19 <@Gynvael> (noo, prawie dokladnie, jest bardziej hackisz) 11:19 <@phoenix__> Gynvael: a nom w switch nie ma ale naprzeyk;lad w do while ... itd 11:20 <@Gynvael> phoenix__: niom ;> 11:20 <@Gynvael> phoenix__: tam jest ;> 11:20 <@Gynvael> phoenix__: w for tez 11:20 <@Gynvael> ok 11:20 <@Gynvael> jeszcze jakies pytania czy moge jechac ? 11:20 <@phoenix__> w if 11:20 <@phoenix__> tez 11:20 <@Gynvael> phoenix__: w if nie ma ani break ani continue 11:20 <@phoenix__> ja mam tytaj pod reka przyklad z id 11:20 <@Gynvael> pokaz ;> 11:21 <@phoenix__> cout "A" ; if(k > 1) continue ; cout << "b" << endl; 11:21 <@bubel> o czym teraz? 11:21 <@phoenix__> to jest w for ale tego mi sie nie chcialo pisac 11:21 <@Gynvael> phoenix__: no wlasnie ;p 11:21 <@Gynvael> phoenix__: to continue dotyczy FOR a nie IF 11:21 <@Gynvael> sdf.c: In function `main': 11:21 <@Gynvael> asdf.c:4: error: continue statement not within a loop 11:21 <@Gynvael> asdf.c:4: error: break statement not within loop or switch 11:21 <@phoenix__> aha 11:22 <@Gynvael> takie bledy wyskakuja jesli sie uzyje continue lub break nie w petli 11:22 <@Gynvael> np w ifie 11:22 <@phoenix__> no powiedz jeszcze raz w czym jest contine ?:> 11:22 <@Gynvael> phoenix__: w petlach ;> ale o tym za chwile ;> 11:22 <@phoenix__> switch i if ? :> 11:22 <@Gynvael> phoenix__: do, while, for ;> 11:22 <@phoenix__> czy jakies jeszcze 11:22 <@Gynvael> phoenix__: to nie petle ;> 11:22 <@Gynvael> phoenix__: w switch jest break tylko 11:22 <@phoenix__> aaaaa 11:22 <@Gynvael> ;> 11:22 <@Gynvael> ok 11:22 <@Gynvael> mozna dalej ? 11:22 <@phoenix__> bo tyo sa instarokcjei warunkowe 11:22 <@phoenix__> dobra dalej 11:22 <@Gynvael> tya 11:22 <@phoenix__> nei skojarzylem ;P 11:23 <@phoenix__> Gynvael: continue; ;P 11:23 <@Gynvael> ok 11:23 <@Gynvael> dalej 11:23 <@Gynvael> teraz tak 11:23 <@Gynvael> pytanie brzmi 11:23 <@Gynvael> co jest szybsze 11:23 <@Gynvael> if czy switch ? 11:23 <@Gynvael> zakladajac ze mamy identyczne zastosowanie 11:23 <@Gynvael> http://gynvael.vexillium.org/gk4_7.c 11:23 <@nicon_> switch ;pp 11:23 <@Gynvael> tam jest maly przykladzik testujacy predkosci 11:23 <@salv4tion> ;f 11:23 <@salv4tion> re 11:23 <@salv4tion> sory 11:23 <@salv4tion> zaspalem ;f 11:24 <@bubel> cicho ;p 11:24 <@Gynvael> root@yume:/code/kurs/gk4# gcc gk4_7.c -o gk4_7 11:24 <@Gynvael> root@yume:/code/kurs/gk4# ./gk4_7 11:24 <@Gynvael> TICKS: 2.170000 sec 11:24 <@Gynvael> TICKS: 1.110000 sec 11:24 <@Gynvael> jak widac switch ma mniejszy wynik 11:24 <@Gynvael> dzieje sie tak dlatego ze kompilator uzywa dosc ciekawej metody optymalizacji 11:24 <@Gynvael> mozna o niej poczytac ze 3 slowa 11:24 <@Gynvael> na moim sajcie 11:24 <@Gynvael> adam_I linkiem rzucil ;> 11:24 <@Gynvael> http://gynvael.vexillium.org/?stuff=mit_elseif.stuff 11:25 <@Gynvael> natomiast 11:25 <@Gynvael> gdyby sie wzielo jakies bardziej przypadkowe wartosci 11:25 <@Gynvael> niz 0...4 11:25 <@Gynvael> np 123 87871 908124 i -12 11:25 <@Gynvael> to wtedy byly by conajwyzej rownie szybkie 11:25 -!- nicon_ [~nicon@80.51.59.3] has quit ["Lost terminal"] 11:25 <@Gynvael> (z niewielka przewaga dla switch) 11:25 <@Gynvael> przewaga ifa nad switchem jest fakt 11:26 <@Gynvael> ze w switchy nie da sie zbytnio robic przedzialow ;> 11:26 <@Gynvael> oraz switch robi case'y tylko dla jednej zmiennej 11:26 <@Gynvael> a if moze miec raz (a==1) a za chwile else if ( b == 10 ) 11:26 <@Gynvael> teraz tak 11:26 <@Gynvael> taka ciekawostka ktora mi znajomy (gritz 2 siara) kiedys pokazal 11:26 <@Gynvael> mianowicie "jak bardzo zamieszany moze byc switch/case" ;> 11:27 <@Gynvael> http://rafb.net/paste/results/hygKtu68.html 11:27 <@Gynvael> tam jest przyklad przeplecionego switch z if/else 11:28 <@Gynvael> bardzo nieladny jesli chodzi o styl pisania, natomiast bardzo ciekawy jesli chodzi o zdolnosci kompilatora 11:28 <@Gynvael> ;> 11:28 <@Gynvael> zostawiam go do samodzielnej analizy dla chetnych. 11:28 <@Gynvael> ok 11:28 <@Gynvael> teraz pytanka, a za chwile while i do while 11:28 <@Gynvael> a potem for 11:28 -!- mode/#gynkurs [-m] by Gynvael 11:28 <@bubel> to idem se kanapke zrobic 11:29 <@salv4tion> heh 11:29 <@salv4tion> ;f 11:30 <@Gynvael> hmm hmm 11:30 <@salv4tion> a ja dzisiaj cholera mialbym LD ;f ale sie szybko zerwalem bo o wykladzie zapomnialem [fuck] 11:30 <@Gynvael> pytan brak ?;> 11:30 <@salv4tion> ee 11:30 <@salv4tion> ja nie wiem co gadales wiecnie mam ;p 11:30 <@phoenix__> chyba brak ;] 11:30 <@salv4tion> potem sobie przezytalm loga ;> 11:30 <@salv4tion> Gynvael: ja mam pytanie 11:31 <@salv4tion> co cie tak wzielo na wyklady ;> 11:31 <@Gynvael> salv4tion: ee pare osob mnie poprosilo 11:31 <@Gynvael> ;p 11:31 <@bubel> ok 11:31 <@salv4tion> acha.. 11:31 <@phoenix__> Gynvael: bylo pare a sie 17 zrobil tzn 16 ;] 11:32 <@adam_I`2> Wczoraj 21 11:32 <@Gynvael> ;> 11:32 <@phoenix__> nie sory 14 ;P 11:32 <@Gynvael> tta 11:32 <@Gynvael> ;> 11:32 <@Gynvael> 21 ;> 11:32 <@phoenix__> tfu 11:32 <@Gynvael> wieczorem 11:32 <@Gynvael> hehehe 11:32 <@Gynvael> ok 11:32 <@phoenix__> 13 11:32 <@Gynvael> jedziemy ? 11:32 <@salv4tion> ta.. 11:32 <@adam_I`2> ta 11:32 <@phoenix__> bo maja po 2 sesje ;P 11:32 -!- mode/#gynkurs [+m] by Gynvael 11:32 <@Gynvael> ok 11:32 <@Gynvael> to dalej 11:32 <@Gynvael> w sumie to juz koncowka ;> 11:32 <@Gynvael> zostaly tylko petle 11:32 <@Gynvael> a o nich duzo nie ma co mowic 11:32 <@Gynvael> jako ze najwazniejsze sa w nich warunki 11:33 <@Gynvael> a o nich bylo przed chwila ;> 11:33 <@Gynvael> wiec jedziemy 11:33 <@Gynvael> w C sa 3 petle 11:33 <@Gynvael> 1) while( WARUNEK ) { kod wykonywany } 11:33 <@Gynvael> 2) do { kod wykonywany } while( WARUNEK ); 11:33 <@seraphin> for r0x 11:33 <@Gynvael> 3) for( kod poczatkowy; WARUNEK; iteracja ) { kod wykonywany } 11:34 <@Gynvael> kazda z nich ma swoje wady i zalety i zastosowania 11:34 <@Gynvael> w sumie korzysta sie ze wszystkich 3ch 11:34 <@Gynvael> najrzadziej z do { } while ;> 11:34 <@Gynvael> ok 11:34 <@Gynvael> po kolei 11:34 <@Gynvael> while(WARUNEK) { kod wykonywany } 11:34 <@Gynvael> przykladowo: 11:34 <@Gynvael> int i; 11:34 <@Gynvael> i = 10; 11:34 <@Gynvael> while( i > 0 ) { printf("%i\n", i); i--; } 11:34 <@Gynvael> czyli 11:35 <@Gynvael> DOPOKI i JEST WIEKSZE OD ZERA wypisuj wartosc "i" na ekran i zmniejszaj "i" o jeden 11:35 <@Gynvael> czyli na ekranie pojawi sie 11:35 <@Gynvael> 10 11:35 <@Gynvael> 9 11:35 <@Gynvael> ... 11:35 <@Gynvael> 3 11:35 <@Gynvael> 2 11:35 <@Gynvael> 1 11:35 <@Gynvael> 0 juz sie nie pojawi, poniewaz nie spelnia warunku 11:35 <@Gynvael> i petla zostaje przerwana 11:35 <@Gynvael> continue; umieszczone wewnatrz kodu petli powoduje przejscie do warunku 11:36 <@Gynvael> a break; wyjscie z petli (odrazu) 11:36 <@Gynvael> teraz co do warunku 11:36 <@Gynvael> mozliwe jest napisanie tak: 11:36 <@Gynvael> while(1,2,3,4) ;p 11:37 <@Gynvael> albo 11:37 <@Gynvael> while(a(),b(),c(),d()) 11:37 <@Gynvael> wtedy wszystkei 4ry funkcje zostana wywolane 11:37 <@Gynvael> ALE TYLKO d() JEST OBOWIAZUJACYM SPRAWDZANYM WARUNKIEM 11:37 <@Gynvael> czyli a(), b(), c() moga sobie zwracac 0, ale i tak to co zwroci d() tylko sie liczy na potrzzeby warunku 11:38 <@Gynvael> dosc latwo zilutruje to petla: 11:38 <@Gynvael> while(1, 0) puts("OK"); 11:38 <@Gynvael> po kompilacji (warning powienien byc, ze lewa strona przy przecinku jest bez znaczenia) 11:38 <@Pakster_> kurwa dziadek przyszedl 11:38 <@Pakster_> spadam 11:38 <@Gynvael> i odpaleniu OK nie pojawi sie ani razu 11:38 -!- Pakster_ [~pakster@fg46.internetdsl.tpnet.pl] has quit [""] 11:38 <@Gynvael> pa Pakster_ 11:38 <@Gynvael> natomiast gdyby zmienic na while(0, 1) puts("OK"); 11:38 <@seraphin> to po kiego grzyba to jest? 11:38 <@salv4tion> ci 11:38 <@Gynvael> wtedy OK by sie pojawialo nieskonczona ilosc razy 11:39 <@Gynvael> seraphin: jesli chodzi o zastosowania, tyo a noz ktos by chcial jakas iteracje tam dac 11:39 <@Gynvael> seraphin: szczerze, to w zyciu w while tego nie uzywalem ;> 11:39 <@Gynvael> (w for natomiast pare razy tak) 11:39 <@Gynvael> ok 11:39 <@Gynvael> teraz tak 11:39 <@Gynvael> czesto zdarza sie robic: 11:39 <@Gynvael> while(1) { costam ... if(warunek) break; .. .costam } 11:40 <@Gynvael> po prostu nie chcemy zeby warunek byl sprawdzaby NA POCZATKU PETLI tylko gdzies w srodku 11:40 <@Gynvael> while(0) { costam } przy wyzszych optymalizacjach (-O1 -O2 -O3) jest traktowane prawie jak komentarz ;p 11:40 <@Gynvael> po prostu nie jest wlaczane do koncowego kodu 11:40 <@Gynvael> jako ze nigdy sie nie wykona 11:40 <@Gynvael> ok dalej 11:40 <@Gynvael> druga petla jest do { .. } while(warunek}; 11:40 <@Gynvael> druga petla jest do { .. } while(warunek); 11:41 <@Gynvael> jest to analogiczna petla do while, roznica jest tylko i wylacznie w tym 11:41 <@Gynvael> ze warunek jest sprawdzany NA KONCU a nie NA POCZATKU 11:41 <@Gynvael> roznic koniec 11:41 <@Gynvael> czasem widzi sie w makrach zapis 11:41 <@Gynvael> do { ... } while(0); 11:41 <@Gynvael> podobno jest jakis tego powod nawet ;> 11:41 <@Gynvael> (ew bez ; jest ;p) 11:42 <@Gynvael> ta "petla" wykona sie dokladnie RAZ 11:42 <@Gynvael> tyle o do { ... } while 11:42 <@seraphin> ? 11:42 <@Gynvael> w C NIE MA czegos takiego jak UNTIL w pascalu 11:42 <@Gynvael> jesli chcemy zasymulowac UNTIL, nalezy zrobic do { ... } while(! warunek); 11:42 <@Gynvael> seraphin: ? 11:42 <@seraphin> do { ... } while(0); 11:42 <@seraphin> jaki jest tego sens? 11:43 <@Gynvael> seraphin: do makr stosowane 11:43 <@seraphin> nie lepiej poprostu "..." ? 11:43 <@Gynvael> seraphin: do { ... } while(0) 11:43 <@seraphin> i tak kod wykonuje sie raz 11:43 <@Gynvael> seraphin: przykladowo 11:43 <@Gynvael> #define COSTAM(x) do { puts(x); puts("ala"); } while(0) 11:43 <@Gynvael> if(...) COSTAM(x); 11:43 <@Gynvael> to jest ok 11:43 <@Gynvael> ale gdyby zrobic 11:44 <@Gynvael> #define COSTAM(x) puts(x); puts("ala"); 11:44 <@Gynvael> if(...) COSTAM(x); 11:44 <@Gynvael> to bysmy dostali 11:44 <@Gynvael> if(...) puts(x); 11:44 <@Gynvael> puts("ala"); <=- to juz po za ifem 11:44 <@Gynvael> natomiast mozna by rowniez zrobic 11:44 <@Gynvael> #define COSTAM(x) { puts(x); puts("ala"); } 11:45 <@Gynvael> seraphin: po prostu mowie ze cos takiego jest czasem w kodzie ;> 11:45 <@Gynvael> seraphin: ale nie spotkalem sie z uczciwym wytlumaczeniem "dlaczego" 11:45 <@Gynvael> ;> 11:45 <@Gynvael> moze kiedys nie bylo mozna robic { } dodatkowego 11:45 <@Gynvael> i stad to wyszlo ;> 11:45 <@Gynvael> kto wie 11:45 <@Gynvael> ok 11:45 <@Gynvael> ale dalej 11:45 <@Gynvael> ostatnia ciekawa funkcja jest for ;> 11:46 <@Gynvael> jest ona niezwykle ciekawa ;> 11:46 <@Gynvael> mianowicie postac ma 11:46 <@Gynvael> for( KOD POCZATKOWY; WARUNEK; ITERACJA ) {...} 11:46 <@Gynvael> identyczny efekt daje: 11:46 <@Gynvael> KOD POCZATKOWY; 11:46 <@Gynvael> for(; WARUNEK; ITERACJA ) {...} 11:46 <@Gynvael> czyli jak mozna sie domyslic, KOD POCZATKOWY to cos wykonujace sie przed sama petla 11:46 <@Gynvael> zazwyczaj wrzuca sie tam inicjacje zmiennych iterujacych 11:46 <@Gynvael> na przyklad 11:46 <@Gynvael> int i; 11:46 <@Gynvael> for( i = 0; .... 11:47 -!- Blizzus [blizzard@frycek.net] has joined #gynkurs 11:47 <@Gynvael> nastepnie jest standardowy warunek 11:47 -!- mode/#gynkurs [+o Blizzus] by phoenix__ 11:47 <@Blizzus> o kurwa 11:47 <@Gynvael> jesli jest spelniony, to ok, petla leci dalej 11:47 <@Blizzus> zamiapomnialem 11:47 <@Gynvael> czesc Blizzus hehehe 11:47 <@Blizzus> ;) 11:47 <@Gynvael> z warunkiem jest podobnie jak w while 11:47 <@Blizzus> mow mow 11:47 <@Gynvael> czyli mozna robic 11:47 <@Gynvael> for(i=0; i > 0, i < 100; i++ ) 11:47 <@Gynvael> i liczy sie tylko to PO PRAWEJ STRONIE PRZECINKA 11:48 <@Gynvael> mozna tez uzywac przecinkow w warunkach poczatkowych 11:48 <@Gynvael> zeby dac wiecej niz jede 11:48 <@Gynvael> for(i=0, a = 2, c = x(); i > 0 && a != c; i++ ) 11:48 <@Gynvael> otatnia czescia jest KOD ITERUJACY 11:48 <@Gynvael> kod iterujacy jest wykonywany NA KONCU KAZDEGO OBIEGU PETLI 11:48 <@Gynvael> czyli 11:48 <@Gynvael> wezmy przyklad: 11:49 <@Gynvael> int i; 11:49 <@Gynvael> for( i = 0; i < 2; i++ ) { printf("%i\n", i); } 11:49 <@Gynvael> wykonanie wyglada nastepujaco: 11:49 <@Gynvael> przyklad(): i = 0; 11:49 <@Gynvael> przyklad(i=0): i < 2 ? 11:49 <@Gynvael> przyklad(i=0): 0 < 2 ? 11:49 <@Gynvael> przyklad(i=0): tak, prawdziwa, wejdz do petli 11:50 <@Gynvael> przyklad(i=0): { printf("%i\n", 0); } - wypisze 0 na ekran 11:50 <@Gynvael> przyklad(i=0): i++ - teraz kod iterujacy leci 11:50 <@Gynvael> przyklad(i=1): i < 2 ? - i znowu warunek 11:50 <@Gynvael> przyklad(i=1): 1 < 2, tak, prawdziwy warunek, wejdz do petli 11:50 <@Gynvael> przyklad(i=1): printf(...) 11:50 <@Gynvael> przyklad(i=1): i++ - znowu iteracja 11:50 <@Gynvael> przyklad(i=2): i < 2 ? 11:50 <@Gynvael> przyklad(i=2): 2 < 2 ? nie! wyjscie z petli.... 11:50 <@Gynvael> koniec 11:51 <@Gynvael> przykladowo mozna by sprobowac napisac 11:51 <@Gynvael> for( i = 0; i < 2; printf("%i\n", i++) ); 11:51 <@Gynvael> czyli printf() jako kod iterowania 11:51 <@Gynvael> i wyjdzie dokladnie to samo 11:51 <@Gynvael> aczkolwiek jest to bardziej balaganiarskie 11:52 <@Gynvael> jest tutaj takze break i continue 11:52 <@Gynvael> continue powoduje SKOK DO KODU ITERUJACEGO (a potel leci warunek dopiero) 11:52 <@Gynvael> a break wyskok natychmiastowy z tej petli 11:52 <@Gynvael> czasami mozna zobaczyc uzyte for(;;) zamiast while(1) 11:52 <@Gynvael> ma to dokladnie takie samo dzialanie - petla nieskonczona 11:53 <@Gynvael> w jezyku C nie mozna uzyc break zeby wyskoczyc naraz z wiecej niz jednej petli 11:53 <@Gynvael> przykladowo 11:53 <@Gynvael> for(;;) { for(;;) { break; } } 11:53 <@Gynvael> wyskoczy tylko z tej wewnetrznej petli, czyli do ten zewnetrznej 11:53 <@Gynvael> jesli chce sie wyskoczyc max na zewnatrz 11:53 <@Gynvael> sa dwa sposoby 11:53 <@Gynvael> jeden - wymyslony przez przeciwnikow goto - to flagi 11:53 <@Gynvael> robi sie dodatkowa zmienan flaga 11:54 <@Gynvael> int flaga = 0; 11:54 <@Gynvael> for(;;) { for(;;) { flaga = 1; break; } if(flaga) break; } 11:54 <@Gynvael> ofc jesli mamy 4 petle zagniezdzone, musza byc 3 flagi 11:55 <@Gynvael> drugim sposobem jest nieslawne goto 11:55 <@Gynvael> ktore jest niezwykle kontrowersyjna instrukcja (imho nieslusznie) w jezyku C 11:55 <@Gynvael> mianowicie powoduje ona bezwzgledny skok do podanego miejsca 11:55 <@Gynvael> w powyzszym przykladzie uzyc by go mozna nastepujaco: 11:55 <@Gynvael> for(;;) { for(;;) { goto koniec; } } 11:55 <@Gynvael> koniec: 11:56 <@Gynvael> w momencie wykonanai goto koniec odbyl by sie skok do koniec (czyli wyjscie z petli) 11:56 <@Gynvael> (obu jak widac ;>) 11:56 <@Gynvael> przeciwnicy goto uwazaja ze utrudnia czytelnosc kodu 11:56 <@Gynvael> a zwolennicy twierdza ze to kiepscy programisci nie umiejacy korzystac z goto utrudniaja czytelnosc kodu ;> 11:57 <@Gynvael> (pytalem paru osob na uczelni czemu goto jest "zle"... po przycisnieciu (jak przestaly mowic ogolnikami) przyznawaly sie ze "bo ktos im tak powiedzial") 11:57 <@Gynvael> (wiec ja w sumie powodu by tego nie uzywac nie znam ;p) 11:57 <@Gynvael> ostatnim rodzajem petli wiec moze byc goto 11:57 <@Gynvael> przykladowo petla nieskonczona jest: 11:57 <@Gynvael> tutaj: 11:57 <@Gynvael> goto tutaj; 11:58 <@Gynvael> czyli goto non stop bedzie skakal "tutaj" 11:58 <@Gynvael> nazwy dzialaj TYLKO LOKALNIE, W OBREBIE DANEJ FUNKCJI 11:58 <@Gynvael> goto do petli raczej nie powinno sie stosowac obecnie 11:58 <@Gynvael> (hehe jak sie uczylem programowac to sie uzywalo goto do petli ;p) 11:59 <@Blizzus> ile lat temu;>? 11:59 <@Gynvael> goto natomiast jest doskonale do obslugi bledu 11:59 <@Gynvael> Blizzus: 16 11:59 <@Blizzus> o bosze 11:59 <@Blizzus> ile ty masz lat;P 11:59 <@Gynvael> Blizzus: 22 w sumie ;> ;p 11:59 <@Gynvael> Blizzus: ale pisze od malego heheheheh 11:59 <@Gynvael> ok 11:59 <@Gynvael> w sumie tyle 11:59 <@adam_I`2> Czyli goto niejest tak samo zle w c jak bylo w pascalu ? 11:59 <@Gynvael> o obsludze bledow bedzie kiedys indziej 11:59 <@Gynvael> adam_I`2: nie nie jest 11:59 <@bubel> to ja mam male zadanie domowe dla chetnych: http://pl.wikipedia.org/wiki/100_bottles_of_beer ;> 11:59 <@phoenix__> czyli jak miales 6 lat? 11:59 <@bubel> i co do goto 12:00 <@bubel> adam_I`2: ono nigdy nie bylo zle 12:00 <@bubel> to kolejny mit 12:00 <@Gynvael> adam_I`2: nie trzeba deklarowac labeli etc 12:00 <@Gynvael> bubel: ne o to chodzi ;> 12:00 <@adam_I`2> W pascalu ejst zle 12:00 <@Gynvael> bubel: we pascalu label musial byc zadeklarowany 12:00 <@phoenix__> czyli jak miales 6 lat? 12:00 <@Gynvael> bubel: etc etc 12:00 <@Blizzus> Gynvael: w symfonii pisza zle o goto 12:00 <@bubel> tzn gorzejs ie korzysta 12:00 <@adam_I`2> W pasclu mi sie progam nj awirteln wywalal przto 12:00 <@Gynvael> bubel: bardzo to utrudnialo korzystanie 12:00 <@bubel> ale nie ze jest zle 12:00 <@adam_I`2> bubel: pamietasz 12:00 <@Gynvael> Blizzus: a jakis powod dali ? ;> 12:00 <@Blizzus> tzn o tym to co pisales nieczytelnosc 12:00 <@Gynvael> phoenix__: tak 12:00 <@adam_I`2> potrzebuje log od 10:55 -!- mode/#gynkurs [+o phoenix__] by d0b0c0p do 10:56 -!- adam_i_ [~adam@80.48.232.136] has joined #gynkurs 12:00 <@Gynvael> Blizzus: powiedzmy szczerze, sa zastosowania ktora BARDZO ulatwia uzycie goto 12:01 <@Gynvael> Blizzus: natomiast w C++ sie tego nie robi (oprocz do wyskokow z petli) poniewaz tam do obslugi bledow jest try/catch/throw 12:01 <@Gynvael> Blizzus: ktorego to nie ma w C;> 12:01 <@phoenix__> btw keidy sie nauczyles poierwszego jezyka ?: > jak miales 3 lata ;P? 12:01 -!- mode/#gynkurs [-m] by adam_I`2 12:01 <@Blizzus> mhm 12:01 <@Blizzus> :) 12:01 <@Gynvael> phoenix__: ne no, jak zaczalem pisac ofc 12:01 <@Gynvael> ok 12:01 <@Gynvael> na dzisiaj koniec 12:01 <@Gynvael> nastepny wyklad jutro o 21 12:01 <@phoenix__> of korz nie polskiego ;P tylko jakiegos programowania 12:01 <@Gynvael> bedzie o stringach ;> 12:01 <@Gynvael> jakies pytania ? 12:01 <@bubel> o, o majtkach bedzie gadac ;p 12:02 <@Blizzus> niech ktos wrzuci to cale 12:02 <@Gynvael> phoenix__: hehe jak mialem 6 lat dostalem atari, ksiazke do programowania (kit ze nie znalem tych kszaczkow (liter), ale na klawiaturze byly podobne obrazki wiec przeklepywalem kod ;p) 12:02 <@Gynvael> a 12:02 <@Gynvael> na koniec kawal ;> 12:02 <@phoenix__> Gynvael: hehe 12:02 <@Gynvael> - slyszeliscie o nowym procku SUN'a ? wykonuje nieskonczona petle w 6 sekund!!!! 12:02 <@Gynvael> ;> 12:02 * adam_I`2 potrzebuje log od 10:55 -!- mode/#gynkurs [+o phoenix__] by d0b0c0p do 10:56 -!- adam_i_ [~adam@80.48.232.136] has joined #gynkurs 12:02 <@Gynvael> ok, tyle kawalow na dzisaijj ;> 12:02 <@Gynvael> adam_I`2: gdzie ci wrzucic ? 12:03 <@phoenix__> Gynvael: ale extra procek 12:03 <@adam_I`2> Gynvael: jak niskocnzna w 6 sekund ? 12:03 <@bubel> Gynvael: e, nie zartuj juz ok? 12:03 <@Gynvael> bubel: heheheh ;> 12:03 <@Blizzus> heheh:X 12:03 <@phoenix__> Gynvael: to on chyba nie nowy:P