Stefan Sokołowski JĘZYKI PROGRAMOWANIA Inst Informatyki UG, Gdańsk, 2014/2015 Wykład1OGÓLNEINFORMACJEOC,str1 JĘZYKI PROGRAMOWANIA reguły gry Zasadnicze informacje: http://infugedupl/ stefan/dydaktyka/jezprog szkicowy program wykładu i laboratorium spis literatury slajdydowykładów wartorobićnotatki ale nie warto przepisywać slajdów z ekranu zadania z laboratorium w mojej grupie itd
Wykład1OGÓLNEINFORMACJEOC,str2 JĘZYKI PROGRAMOWANIA reguły gry Kontakt ze mną: konsultacje: wtorki 14:15 15:00 w pok 57 e-mail: ssokolowski@infugedupl antyspam: unikać frikoprowajderów, np: o2pl wppl gazetapl najlepiej używać konta mailowego w II UG Zaliczenie przedmiotu: zaliczenie laboratorium, egzamin, znajdowanie błędów w wykładzie Najłatwiej jest zaliczyć laboratoria przez sprawdziany Zaliczenie przez rozbójnika na koniec semestru jest trudniejsze Laboratorium musi być zaliczone przed egzaminem Ramowy program Wykład1OGÓLNEINFORMACJEOC,str3 językc szczegółowo podstawowa książka: K&R, czyli Kernighan BW, Ritchie DM Język ANSI C Wydawnictwa Naukowo-Techniczne, Warszawa 2003 ISBN 83-204-2804-1 Należy ją samodzielnie czytać! językphp podstawy programowanie grafiki informacyjnie Będę oczekiwał od słuchaczy napisania wielu drobnych programów, sprawdzających cechy praktycznych realizacji omawianych języków
Historia C Wykład1OGÓLNEINFORMACJEOC,str4 1971: pierwsza wersja C, Ken Thompson& Dennis Ritchie 1972: system operacyjny UNIX napisany w C, Ken Thompson& Dennis Ritchie 1978: The C Programming Language, Brian Kernighan& Dennis Ritchie podręcznik języka, służący jako jego nieformalna specyfikacja 1989: standaryzacja języka C89, American National Standards Institute 1999: poprawiona standaryzacja języka C99, American National Standards Institute 2011: następna poprawiona standaryzacja języka C11, American National Standards Institute Dlaczego trzeba znać C? Wykład1OGÓLNEINFORMACJEOC,str5 najbardziej rozpowszechniony język programowania ogólnego zastosowania, stosunkowo prosty, więc nietrudny do nauczenia się, pozwala programować blisko maszyny, czyli pisać bardzo wydajne programy(ale to jest żmudne), większość współczesnych języków programowania ma zewnętrzną składnię wzorowaną na C(mimo głębokich różnic) Wady C: niektóre jego cechy stoją w sprzeczności z naturalną intuicją i logiką, słabo wspiera programistę w poszukiwaniu i poprawianiu błędów Łacina jest piękniejsza i logiczniejsza od angielskiego, ale dzisiaj można nie znać łaciny, a trzeba znać angielski
Wykład1OGÓLNEINFORMACJEOC,str6 Hierarchia bytów w języku programowania WYRAŻENIA WARUNKI LOGICZNE KOMENDY MODUŁY WYRAŻENIA reprezentujące wartości(arytmetyczne i inne) Np x, 0, x+y WARUNKI LOGICZNE reprezentujące relacje między wartościami(spełnione lub nie) Np x<0 KOMENDY nakazujące dokonanie zmiany stanu (np zmiany wartości zmiennych) Np if(x<0) x=-x; MODUŁY stanowiące autonomiczne zestawy komend wykonujące pewną logicznie zamkniętą czynność Np double wartbezwzgl(doublex) { if(x<0) x=-x; return x; Hierarchia bytów w C Wykład1OGÓLNEINFORMACJEOC,str7 Wszystko poplątane WARUNKI LOGICZNE są również WARTOŚCIAMI, w dodatku całkowitymi warunek jest spełniony, jeśli ma wartość różną od zera; warunek jest niespełniony, jeśli ma wartość zero Np komenda if traktuje test-1 jako spełniony; a test 0 jako niespełniony M#include<stdioh> if(-1) printf(" spelniony\n"); else printf(" niespelniony\n"); drukuje spelniony chociaż w zasadzie nie powinno się uzależniać drogi w programie od liczby
Hierarchia bytów w C Wykład1OGÓLNEINFORMACJEOC,str8 Wszystko poplątane WARUNKI LOGICZNE są również WARTOŚCIAMI, w dodatku całkowitymi warunek jest spełniony, jeśli ma wartość różną od zera; warunek jest niespełniony, jeśli ma wartość zero Npwarunek0>1mawartość0;awarunek0<=1mawartośćróżnąodzera M#include<stdioh> printf(" 1+(0>1) ==%i\n", 1+(0>1)); printf(" 1+(0<=1) ==%i\n", 1+(0<=1)); drukuje 1+(0>1)==1 1+(0<=1) == 2 chociaż warunków logicznych w zasadzie nie powinno się dodawać do liczb Hierarchia bytów w C Wykład1OGÓLNEINFORMACJEOC,str9 Wszystko poplątane KOMENDY również mają WARTOŚCI wartością przypisania x = wyr; jest wartość wyrażenia wyr; wartością komendy czytania jest liczba wczytanych rzeczy; wartością komendy drukowania jest liczba wydrukowanych znaków M#include<stdioh> double x; printf("wartosckomendyx=05;:%lf\n",x=05); drukuje wartosckomendyx=05;:0500000 chociaż w zasadzie komendy powinno się wykonywać, a nie drukować
Hierarchia bytów w C Wykład1OGÓLNEINFORMACJEOC,str10 Wszystko poplątane KOMENDY również mają WARTOŚCI wartością przypisania x = wyr; jest wartość wyrażenia wyr; wartością komendy czytania jest liczba wczytanych rzeczy; wartością komendy drukowania jest liczba wydrukowanych znaków M#include<stdioh> intn;doublex,y; n=scanf("%lf%lf",&x,&y); printf(" wartosc komendy czytania:%i\n", n); drukuje wartosc komendy czytania: 2 chociaż w zasadzie czytanie jest czynnością a nie wartością Hierarchia bytów w C Wykład1OGÓLNEINFORMACJEOC,str11 Wszystko poplątane KOMENDY również mają WARTOŚCI wartością przypisania x = wyr; jest wartość wyrażenia wyr; wartością komendy czytania jest liczba wczytanych rzeczy; wartością komendy drukowania jest liczba wydrukowanych znaków M#include<stdioh> intk; k=printf("123456789\n"); printf(" wartosc komendy drukowania:%i\n", k); drukuje 123456789 wartosc komendy drukowania: 11 chociaż w zasadzie drukowanie również jest czynnością a nie wartością
Wykład1OGÓLNEINFORMACJEOC,str12 Typy wyrażeń całkowity int int 012 - +-*/% ==!=<><=>= Wykład1OGÓLNEINFORMACJEOC,str13 Typy wyrażeń rzeczywisty double double int 001 1231 602E-23 -fabsfloorsqrtlogexpsincostan +-*/pow ==!=<><=>=
Wykład1OGÓLNEINFORMACJEOC,str14 Typy wyrażeń znakowy char a W @ char ==!=<><=>= int Wykład1OGÓLNEINFORMACJEOC,str15 Jawne konwersje typów(rzutowania) (int) (char) double int char (double) (int) M (int)(char)(int)357 = =(int)(char)35 =(int) # =35
Niejawne konwersje typów Wykład1OGÓLNEINFORMACJEOC,str16 int double Prawie w każdym kontekście, w którym dopuszczalna jest wartość rzeczywista, można użyć wartości całkowitej Np double x; x=1; powoduje zamianę wartości całkowitej 1 na rzeczywistą 10, potem przypisanie tej rzeczywistej wartości zmiennej x Wyjątek: printf("%lf\n", 1); działa błędnie char int Jak wyżej Ale printf("%i\n", a ); nie drukuje znaku a tylko liczbę97(kodasciiznakua) OinnychtypachwCbędziejeszczemowa Wykład1OGÓLNEINFORMACJEOC,str17 Priorytety i łączność operatorów w C Ponieważ wszystko ma wartość, do wszystkiego można stosować operacje, trzeba tylko wiedzieć, jakie są ich priorytety MCo wydrukuje ten program? #include<stdioh> intx,y; x=0; y=1; if(x==y+y) printf(" TAK\n"); elseprintf("nie\n"); Czy test x==y+y oznacza (x==y)+y? wtedy TAK,czy x==(y+y)? wtedy NIE
Wykład1OGÓLNEINFORMACJEOC,str18 Priorytety i łączność operatorów w C(K&R, str82) Priorytet Operatory Łączność wysoki () [] ->! ++ -- + - * & (typ) sizeof prawostronna * / % + - << >> < <= > >= ==!= & ^ &&?: prawostronna = += -= *= /= %= ^= = <<= >>= prawostronna niski, Ponieważ priorytet porównania == jest niższy od priorytetu dodawania +, test x==y+y oznacza x==(y+y) Wykład1OGÓLNEINFORMACJEOC,str19 Priorytety i łączność operatorów w C Ponieważ wszystko ma wartość, do wszystkiego można stosować operacje, trzeba tylko wiedzieć, jakie są ich priorytety MCo wydrukuje ten program? #include<stdioh> printf(" 4-2-1 ==%i\n", 4-2-1); Czy wyrażenie 4-2-1 oznacza (4-2)-1? wtedy 1,czy 4-(2-1)? wtedy 3
Wykład1OGÓLNEINFORMACJEOC,str20 Priorytety i łączność operatorów w C(K&R, str82) Priorytet Operatory Łączność wysoki () [] ->! ++ -- + - * & (typ) sizeof prawostronna * / % + - << >> < <= > >= ==!= & ^ &&?: prawostronna = += -= *= /= %= ^= = <<= >>= prawostronna niski, Ponieważ odejmowanie - łączy do lewej, wyrażenie 4-2-1 oznacza (4-2)-1 ijegowartościąjest 1 Wykład1OGÓLNEINFORMACJEOC,str21 Priorytety i łączność operatorów w C Trzebauważać MCo wydrukuje ten program? #include<stdioh> if(! 1==2) printf(" nierowne\n"); else printf(" rowne\n"); Jesteśmy skłonni tak czytać: Jeśli nieprawdą jest, że 1==2, to drukować nierowne, w przeciwnym razie drukować rowne Ponieważ 1==2 jest nieprawdą, więc powinno zostać wydrukowane nierowne Tymczasem: Program drukuje rowne!
Wykład1OGÓLNEINFORMACJEOC,str22 Priorytety i łączność operatorów w C(K&R, str82) Priorytet Operatory Łączność wysoki () [] ->! ++ -- + - * & (typ) sizeof prawostronna * / % + - << >> < <= > >= ==!= & ^ &&?: prawostronna = += -= *= /= %= ^= = <<= >>= prawostronna niski, Ponieważ priorytet negacji! jest wyższy niż priorytet równości ==, test! 1==2 oznacza (!1)==2 i jego wartością jest fałsz Wykład1OGÓLNEINFORMACJEOC,str23 Priorytety nie rozstrzygają wszystkich wątpliwości MJaką wartość komenda y =(x=1)+(x=2); nada zmiennej y? x 2 y 4 x=1; x=2; y=x+x; x 1 y 2 x=2; x=1; y=x+x; x 1 1 x 2 2 y 3 x=1; x=2; y=x+x; Testnamoimkomputerzedaje4,alenainnychmożebyćinaczej MCzy komenda i=0; a[i]=(i=i+1); wpisze 0 czy 1, do a[0] czy doa[1]? Testnamoimkomputerzedaje1wa[1],alenainnychmożebyćinaczej
Programowanie trickowe Wykład1OGÓLNEINFORMACJEOC,str24 Programowanie trickowe polega na wykorzystywaniu dziwacznych własnoći języka lub kompilatora, takie jak naruszanie naturalnej hierarchii logicznej, naruszanie dyscypliny typów, korzystanie z komend o nieustalonej kolejności wykonania itp takiego programowania należy zdecydowanie unikać Program ma nie tylko działać, powinien jeszcze być zrozumiały dla innych programistów, łatwy do zmieniania, łatwy do przeniesienia na inne platformy, skalowalny czyli łatwy do zatosowania z większymi danymi, itd Wykład1OGÓLNEINFORMACJEOC,str25 Operatory charakterystyczne dla C ++,-- dodanie(odjęcie) jedynki od zmiennej całkowitej; n++ oznacza n=n+1,n-- oznacza n=n-1 Np a[n++]=0; oznacza a[n]=0; n=n+1; a[++n]=0; oznacza n=n+1; a[n]=0; Toniejesttosamo! +=,-=,*=,/=,%= połączenie operacji z przypisaniem; Np n+=1 oznacza n=n+1 lubn++ n*=4 oznacza n=n*4 &,,, ˆ,<<,>> operacjebitowe(koniunkcja,alternatywa,negacja, różnica symetryczna, przesunięcia)