wykład 1 Agata Półrola Wydział Matematyki i Informatyki UŁ sem. zimowy 2016/2017
strona www: http://www.math.uni.lodz.pl/~polrola
To oczywiście pewnie wszyscy wiedzą... Komputer może być traktowany jako urządzenie służące do przechowywania i przetwarzania informacji Działanie komputera jest kontrolowane przez wykonywany przez niego program
Podstawowe elementy komputera Procesor - mózg komputera. Zawiera: jednostkę sterującą (CU - control unit) - element nadzorujący i koordynujący działanie komputera jednostkę wykonawczą (EU - execution unit), a w niej m.in. element odpowiedzialny za operacje arytmetyczne i logiczne (ALU - arithmetic-logic unit) oraz różnego rodzaju rejestry (wbudowane w procesor małe komórki pamięci o szybkim dostępie, służące do przechowywania wyników obliczeń, adresów w pamięci operacyjnej, instrukcji; procesor wykonuje działania korzystając ze swoich rejestrów - dane są pobierane z pamięci do rejestrów a potem odsyłane). Pamięć operacyjna przechowuje m.in. uruchamiany program, dane, tymczasowe struktury danych niezbędne do poprawnego działania uruchamianego programu itp.
Podstawowe elementy komputera - cd jednostki wejścia/wyjścia umożliwiające komunikację z otoczeniem (mysz, klawiatura, ekran itp) pamięć pomocnicza (zewnętrzna) pozwalająca przechowywać dane, programy które nie są wykonywane itp zawartość pamięci pomocniczej jest zazwyczaj zorganizowana w pliki
Pamięć Pamięć komputera może być traktowana jako ciąg komórek pamięci (nazywanych czasami słowami). Każda komórka ma pewien adres, określający jej pozycję w pamięci. Każda komorka składa się z pewnej liczby bitów (zazwyczaj 8, 16, 32 lub 64). 8 bitów tworzy bajt Każdy bit przechowuje cyfrę dwójkową (0 lub 1) za pomocą ciągów cyfr dwójkowych zapisujemy liczby całkowite, rzeczywiste, wartości logiczne, instrukcje programu itd
Wykonanie programu Wykonywany program zajmuje grupę powiązanych ze sobą komórek pamięci. Komórki lub grupy komórek zawierają poszczególne instrukcje programu. program to ciąg instrukcji podczas wykonania programu CU czyta kolejne instrukcje z pamięci i zapewnia, że są one wykonywane w odpowiednim porządku instrukcja mówi komputerowi, że powinien wykonać jakieś zadanie (np. przenieść zawartość komórki pamięci znajdującej się pod jakimś adresem do określonego rejestru procesora, albo dodać dwie liczby w ALU)
Postać programu ( wewnątrz komputera ) Instrukcja jest zapisana jako pewien ciąg zer i jedynek. instrukcja o tej samej roli może mieć różną postać w rożnych modelach komputerów Program zapisany w takiej postaci może być wykonany przez komputer. Mówimy, że jest w postaci kodu maszynowego instrukcje kodu maszynowego nazywa się też rozkazami maszynowymi Przykład 0011001111110011 0011111110000110 1001001111001111
Języki programowania Przykład początkowo programy były pisane w kodzie maszynowym kolejnym etapem był język asembler jest to język używający krótkich nazw odpowiadających poszczególnym rozkazom maszynowym danego typu procesora oraz pozwalający na użycie nazw zmiennych zamiast ich adresów LOAD A ADD B STORE C przetłumaczenie takiego programu na kod maszynowy jest bardzo proste język asembler jest w użyciu; pozwala pisać bardzo wydajne programy
Języki programowania - cd Przykład kolejnym etapem są języki programowania wysokiego poziomu (np. Pascal, Ada, C++, Java,...) prosty zapis operacji C := A + B programy napisane w takich językach są tłumaczone na kod maszynowy przy pomocy specjalnego translatora
Od kodu do programu wykonywalnego Program napisany w języku programowania ma postać pliku tekstowego. Ta postać nazywana jest kodem źródłowym Aby program można było wykonać, musi zostać przetłumaczony na kod wykonywalny (program wykonywalny) zapisany w języku maszynowym proces tłumaczenia programu nazywany jest kompilacją
Od kodu do programu wykonywalnego - cd proces tłumaczenia programu składa się tak naprawdę z dwóch czynności: kompilacji i łączenia kompilacja (przetworzenie kodu źródłowego przez program zwany kompilatorem) zamienia program źródłowy na plik binarny zawierający program w kodzie maszynowym (object file). Najczęściej nie jest on jeszcze końcową wersją programu - zawiera odwołania do zewnętrznych podprogramów umieszczonych w bibliotekach kompilacja może być poprzedzona analizą kodu źródłowego wykonywaną przez program zwany preprocesorem (często kompilator spełnia równocześnie rolę preprocesora) łączenie (konsolidacja, linkowanie,) wykonywana przez program zwany konsolidatorem, tworzy kolejny plik binarny, w którym jest już wszystko co jest potrzebne do wykonania programu na danym sprzęcie z danym systemem operacyjnym
Języki interpretowane (skryptowe) Programy napisane w niektórych językach programowania (np. w języku Perl lub Python) uruchamiane są w inny sposób. do uruchomienia programu potrzebne jest środowisko uruchomieniowe - interpreter interpreter nie tworzy programu wykonywalnego; poszczególne instrukcje programu tłumaczone są po kolei na bieżąco na kod maszynowy i wykonywane. Odwołania do podprogramów umieszczonych w zewnętrznych bibliotekach również przetwarzane są na bieżąco
Etapy tworzenia programu Aby napisać program musimy: określić wymagania programu (faza analizy wymagań i specyfikacji) zaprojektować sposób rozwiązania problemu (faza projektowa) zapisać w/w projekt w wybranym języku programowania (faza implementacji) skompilować i uruchomić program sprawdzić, czy program działa poprawnie (faza testowania)... z czego faza implementacji jest chyba najprostsza... ;-)
PROGRAMOWANIE JEST JEDNO tylko językow programowania wiele
Algorytmy Aby napisać program, musimy znaleźć odpowiedni algorytm - czyli opisać, jak rozwiązać konkretny problem / zadanie Algorytmy można zapisywać na różne sposoby: w języku naturalnym w postaci schematu blokowego w postaci instrukcji programu w pseudokodzie...
Przykłady algorytmów przepis na ciasto instrukcja składania mebli przepis na rozwiązanie równania kwadratowego postaci ax 2 + bx + c = 0 metoda znalezienia największej liczby w (bardzo, bardzo długim) ciągu liczb
Elementy algorytmów Sposób opisu algorytmu musi pozwalać na wyrażenie: sekwencyjności wyboru iteracji rekursji (rekurencji)
Sekwencyjność Opisujemy kolejne kroki. Kroki muszą być wykonywane w takiej kolejności, w jakiej zostały zapisane Przykład weź 4 jajka, szklankę cukru i cukier waniliowy utrzyj żółtka z cukrem przygotuj szklankę mąki z łyżeczką proszku do pieczenia dodaj część mąki do ucieranej masy ubij pianę z białek dodaj do ucieranej masy pianę i resztę mąki...
Wybór Opisujemy fakt konieczności podjęcia decyzji którą z alternatywnych ścieżek wybrać Przykłady jeżeli ucierana masa jest zbyt gęsta, to dodaj łyżkę wody jeżeli uczestnik turnieju odpowiedział poprawnie na co najmniej 5 pytań, to przechodzi do następnego etapu, w przeciwnym razie odpada z gry jeżeli wyróżnik trójmianu kwadratowego jest ujemny, to piszemy że trójmian nie ma pierwiastków, jeżeli wyróżnik jest równy zero, to piszemy że trójmian ma jeden pierwiastek, w pozostałych przypadkach trójmian ma dwa pierwiastki
Iteracja Opisujemy fakt, że pewna część algorytmu będzie powtarzana - albo określoną ilość razy, albo do momentu zajścia pewnego warunku Przykłady podgrzewaj masę mieszając, dopóki cukier się nie rozpuści powtórz 100 razy czynność idź krok na północ (czyli idź 100 kroków na północ)
Rekurencja Problem dzielimy na mniejsze (zagnieżdżone) podproblemy o podobnej strukturze. Każdy z nich rozwiązujemy stosując ten sam algorytm.
Aby tworzyć algorytmy, powinniśmy rozumieć co jest w stanie zrobić komputer W przypadku bardziej złożonego problemu wygodnie jest: podzielić problem na mniejsze, prostsze podproblemy zaprojektować rozwiązanie dla każdego z nich, w razie potrzeby znów dzieląc je na podproblemy Jest to tzw. projektowanie od ogółu do szczegółu albo z góry w dół (top-down design) Kolejny krok to zapisanie algorytmu w wybranym języku programowania
Każdy język ma swoją składnię: słowa kluczowe instrukcje itd Na wykładzie / ćwiczeniach będziemy używać języka C++ jeden z bardziej popularnych języków programowania powstały w latach 80-tych XX wieku jako rozszerzenie języka C o mechanizmy programowania obiektowego
Musimy zaopatrzyć się w jakiś kompilator C++ (albo w odpowiednie IDE, tj. zintegrowane środowisko programistyczne dla danego języka) Przykłady IDE: Code::Blocks Dev-C++ Eclipse Falcon C++ wxdev-c++ VisualStudio Ultimate++...
Przykładowy program # include < iostream > /* dyrektywa preprocesora */ int main () // program glowny { std :: cout << " Dzien dobry! \n" ; std :: cout << " To ja, Twoj pierwszy program "; } return 0;
Dyrektywy preprocesora # include < iostream > linia zaczyna się od dyrektywy preprocesora preprocesor analizuje kod źródłowy poszukując przeznaczonych dla niego poleceń (dyrektyw lub makr) celem wykonania preprocesora jest przekształcenie kodu programu zgodnie z treścią tych poleceń w przypadku dyrektywy #include przekształcenie polega na dołączeniu w danym miejscu kodu pliku podanego po dyrektywie tu dołączamy plik (bibliotekę) iostream ponieważ będziemy używać tzw. strumieni do wypisania tekstu uwaga - preprocesor nie dokonuje kontroli poprawności programu!
Komentarze # include < iostream > /* dyrektywa preprocesora */ int main () // program glowny Komentarz to taki fragment zawartości pliku z kodem źródłowym programu, który nie jest brany pod uwagę przy kompilacji. W C++ istnieją dwa sposoby wstawiania komentarzy: komentarzem jest tekst zawarty między /* (otwarciem komentarza) i */ (zamknięciem komentarza) komentarzy tego typu nie można zagnieżdżać! komentarzem jest też tekst rozpoczynający się od // jest traktowany jako komentarz; końcem komentarza jest wówczas koniec linii
Definicja głównej funkcji programu int main () // program glowny {... // tresc programu return 0; } funkcja o nazwie main jest właściwym programem w C++. Nazwa ta jest zastrzeżona (nie można jej zmienić) każda funkcja zwraca wartość pewnego typu; dla main jest to zawsze int - wartość całkowita. Typ wyniku jest podany przed nazwą funkcji. Na końcu treści programu znajduje się instrukcja return 0; powodująca zwrócenie zera (oznaczającego zazwyczaj poprawne wykonanie programu) funkcja może przyjmować również pewne dane wejściowe - argumenty. Listę argumentów podaje się w nawiasach () następujących po nazwie funkcji. Pusta lista argumentów oznaczana jest pustymi nawiasami.. nawiasy klamrowe { i } wyznaczają początek i koniec bloku zawierającego instrukcje programu każda instrukcja programu jest zakończona średnikiem
Strumień wyjścia std::cout std :: cout << " Dzien dobry! \n" ; std :: cout << " To ja, Twoj pierwszy program "; użycie tzw. strumienia std::cout pozwala na przesłanie danych na standardowe wyjście (ekran) znaki << (nazywane operatorem strumienia wyjścia pozwalają wskazać dane które mają być przekazane do strumienia tu przekazujemy tekst (napis). Napis musi być ujęty w cudzysłowy polecenie przesyłania danych musi być zakończone średnikiem przekierowania można sklejać : std :: cout << " Dzien dobry! \n" << "To ja" ;
Znaki specjalne w tekście std :: cout << " Dzien dobry! \n" ; std :: cout << "To ja, \t \t Twoj pierwszy \" program \" "; W tekście można umieszczać znaki specjalne. Najczęściej używane to: \n - przejście do nowej linii \t - znak tabulacji \" - znak cudzysłowu Efekt przejścia do nowej linii można uzyskać również przesyłając na standardowe wyjście znak oznaczony std::endl
Przykładowy program - drobna zmiana # include < iostream > using namespace std ; // okreslenie przestrzeni nazw int main () { cout << " Dzien dobry! " << endl ; cout << " To ja, Twoj pierwszy program "; } return 0;
Przestrzenie nazw using namespace std ;... cout << " Dzien dobry! " << endl ; Powyższa linia mówi że w programie poniżej niej będziemy używać nazw ze standardowej przestrzeni nazw - std nie musimy zatem poprzedzać nazw cout i endl przedrostkiem std:: - kompilator wie gdzie poszukiwać danego elementu
Identyfikatory w C++ Nazwy wykorzystywane w programie, (tzw. identyfikatory) muszą być ciągami znaków złożonymi z liter, cyfr i znaków podkreślenia, zaczynającymi się od litery, przy czym znak podkreślenia traktowany jest jak litera. polskie znaki nie są traktowane jako litery! wielkie i małe litery są rozróżniane zazwyczaj rozróżniane są tylko pierwsze 32 znaki Przykłady poprawne: prog1, prog 1, moja zmienna, A123, JamesBond007, moj program niepoprawne: on&ona, 1szy program, max%
Słowa kluczowe w C++ Niektóre identyfikatory są tzw. słowami kluczowymi (zarezerwowanymi). Nie mogą one pojawiać się w programie w innym znaczeniu niż nadane w standardzie języka. Słowa kluczowe w C++ and and eq asm auto bitand bitor bool break case catch char class compl const const cast continue default delete do double dynamic cast else enum explicit export extern false float for friend goto if inline int long mutable namespace new not not eq operator or or eq private protected public register reinterpret cast return short signed sizeof static static cast struct switch template this throw true try typedef typeid typename union unsigned using virtual void volatile wchar t while xor xor eq