Upload
others
View
13
Download
0
Embed Size (px)
Citation preview
Wykład 1. Historia i wstęp do programowania.
dr inż. Joanna Putz-Leszczyńska
Podstawy programowaniaPodstawy programowania
Informacje organizacyjne
Wykładowcy: Dr inż. Tomasz Śliwiń[email protected], pok. 561Dr inż. Mariusz [email protected], pok. 561Dr inż. Piotr PałkaP.Pał[email protected], pok. 554
Zakład Badań Operacyjnych i Systemowch
• Regulamin, harmonogram zajęć, prezentacje do wykładu, oceny z laboratorium i kolokwiów znajdować się będą w wydziałowym systemie komunikacji ze studentami: http://studia.elka.pw.edu.pl
– tam należy wejść w opcje indywidualne i zalogować się przy pomocy konta wydziałowego
Regulamin
•Szczegóły w pliku regulamin.pdf•3 Kolokwia (odbywają się na wykładach):▫I kolokwium 10 pkt ▫II kolokwium 15 pkt▫Kolokwium poprawkowe
(mogą Państwo poprawiać albo I kolokwium albo II)
•Ćwiczenia 35 pkt, 7 zajęć▫Wiedza – 14 pkt. - wymagane wcześniejsze przygotowanie,
sprawdzane za pomocą wejściówki▫Aktywność – 6 pkt. po jednym punkcie na ćw 1-6▫Mini-projekt – 15 pkt. wykonywany w zespole 2-4 osób
• Laboratoria 40 pkt▫3 indywidualne projekty programów w języku C
Regulamin
• Warunkiem zaliczenia jest przepołowienie kolokwiów, laboratoriów i ćwiczeń
•Oceny:▫3 <51,61) pkt▫3.5 <61,71) pkt▫4 <71,81) pkt▫4.5 <81,91) pkt▫5 <91, 100> pkt
Organizacja zajęć
• Laboratoria (sala 09)▫Na pierwszych laboratoriach dostaną Państwo konta na
serwerze wydziałowym (Biuro Obsługi Informatycznej, pok.15)
•Terminarz ćwiczeń ▫W pliku plan_cw_i_wykladow.pdf
•Kolokwia w czasie wykładów nr. 7, 14 i 15
Temat 1: Podstawowe pojęcia i proste programy. Pojęcia algorytmu, programu, kodu wykonywalnego. Kompilacja i wykonanie programu. Sieci działań. Struktura programu. Komentarze i dokumentacja programu. Zmienne i ich nazwy, podstawowe typy: całkowite, rzeczywiste, znakowe i napisowe. Definicje zmiennych. Instrukcje: czytania, pisania, przypisania. Klasyfikacja typów. Stałe, wyrażenia i funkcje standardowe. Instrukcje: warunkowa, złożona. Instrukcje cykliczne: pętla for, pętle sterowane warunkiem. Instrukcje przerywające wykonanie pętli. Instrukcja wielokrotnego wyboru.
Temat 2: Tablice, rekordy i pliki. Tablice: definiowanie tablic, zmienna tablicowa i indeksowana. Operacje na tablicach. Algorytmy sortowania i przeszukiwania w tablicach, porównanie złożoności obliczeniowej. Struktury i rekordy, operacje wykonywane na rekordach. Definiowanie plików, zasady dostępu, operacje wejścia – wyjścia.
Temat 3: Funkcje i rekurencja. Zasady definiowania i wywołania funkcji. Parametry formalne i aktualne. Wiązanie parametrów przez wartość i referencję. Zasięg nazw, zasłanianie. Rekurencja jako jedna z podstawowych technik konstruowania algorytmów. Zasada działania rekurencji i warunek końca. Przykłady algorytmów rekurencyjnych.
3Program wykładu
Temat 4: Wskaźniki i listy. Zmienne dynamiczne i wskaźniki. Przydział i zwalnianie pamięci. Dynamiczna rezerwacja tablic. Listy jednokierunkowe: zasada tworzenia, podstawowe operacje na listach. Listy dwukierunkowe i cykliczne. Iteracyjne i rekurencyjne algorytmy przetwarzania list.
Temat 5: Struktury drzewiaste. Drzewa binarne i binarne drzewa sortowane (BST). Podstawowe operacje na drzewach z wykorzystaniem rekurencji. Drzewa wyważone (AVL i RBT). Kopce, B-drzewa, zastosowania do baz danych. Złożoność obliczeniowa.
Temat 6: Przegląd algorytmów, algorytmy grafowe. Przegląd zasad konstruowania algorytmów: programowanie typu „dziel i zwyciężaj”, programowanie dynamiczne, algorytmy z powrotami, metody zachłanne. Grafy i algorytmy grafowe: przeszukiwanie grafu, problem najkrótszej ścieżki, minimalne drzewa rozpinające grafów.
4Program wykładu
Algorytmy+struktury danych=programy. N. Wirth
Język ANSI C Kernighan, Ritchie
Stephen Prata Szkoła Progtamowania – Język C
5Literatura uzupełniająca
Historia i Hardware
•Maszyna analityczna Babbage’a (1822)•Komputer Atanasoff-Berry’ego (ABC, 1937)▫wymagała stałego nadzoru człowieka-operatora
•Z3, Zuse KG (1941)•Colossus MarkII (1943) •Electrical Numerical Integrator and Computer
(ENIAC, 1946)▫Lampy elektronowe (prekursor tranzystora)
Hardware
•Komputery zbudowane są z elementów fizycznych zwanych hardware’m (sprzętem komputerowym)
•Sprzęt umożliwia przechowywanie i przetwarzanie danych zgodnie z zapisanym programem
•Sprzęt komputerowy nie przechowuje danych przy użyciu tych samych symboli, których używają ludzie
Bity & Bajty
•Najmniejszym i najbardziej podstawową jednostką informacji (danych) w komputerze jest bit:▫0 lub 1
•Grupa 8 bitów tworzy grupę określaną bajtem:▫Może reprezentować 256 różnych wzorców▫najmniejsza adresowalna jednostka
informacji pamięci komputerowej
Podstawowe komponenty komputera
Central processing unit (CPU)
Control
Arithmeticand logic unit (ALU)
Central Processing Unit (CPU)
• Przetwarzanie danych: ▫Arithmetic and Logic Unit (ALU): służy do wykonywania
prostych operacji arytmetycznych (takich jak dodawanie, odejmowanie itp.), operacji logicznych (np. Ex-Or) pomiędzy dwiema liczbami oraz operacje jednoargumentowe takie jak przesunięcie bitów, negacja.
▫Pipelines (przetwarzanie potokowe) jest jednym ze sposobów sekwencyjnego (szeregowego) przetwarzania danych.
• Control unit: kieruje i monitoruje ogólne funkcjonowanie komputera, w szczególności przetwarzanie danych:▫Śledzi gdzie znajduje się następna instrukcja▫Obsługuje wszystkie instrukcje
CPUs jest powszechnie znany jako microprocessor
Podstawowe komponenty komputera
Central processing unit (CPU)
Main memory
Secondary storage
Control
Arithmeticand logic unit (ALU)
Main Memory Unit
• Jest skonstruowana jako pamięć o dostępie swobodnym
(random access memory – RAM):▫Dostęp do losowego fragment pamięci jest równie szybki jak do
pozostałych części
▫Ulotna: dane są tracone w momencie wyłączenia komputera
• Rozmiar jest określany zwykle w bajtach (MB or GB)
• Przechowuje dane i instrukcje w postaci sekwencji bajtów
• Program musi znajdować się w pamięci głównej, jeśli ma być
wykonany na komputerze
• Łączy 1 lub więcej bajtów w jedną grupę, zwaną słowem
Secondary Storage
•Używana jako pamięć stałego przechowywania programów i danych: ▫Dyski twarde▫Dyski CD, DVD, …
500 KB 1.2 MB
Podstawowe komponenty komputera
Central processing unit (CPU)
OutputInput
Main memory
Secondary storage
Control
Arithmeticand logic unit (ALU)
Input/Output Unit
• Jednostka wejścia / wyjścia (I / O) zapewniają dostęp do komputera, pozwalając wprowadzanie i wyprowadzanie danych
• Jest to interfejs do urządzeń wejścia /wyjścia, mogą być wbudowane jak i peryferyjne, takie jak klawiatury, ekran, drukarki, itp…
Języki programowania
•Program komputerowy: dane i instrukcje wykorzystywane przez komputer do otrzymania określonego wyniku ▫Program, lub ich zbiór nazywany jest softwarem
•Programowanie: pisanie instrukcji w języku zrozumiałym dla komputera i innych programistów
• Język programowania: zestaw instrukcji, które mogą być wykorzystane do skonstruowania (napisania) programu
Język maszynowy
•Program (plik) wykonalny: plik, który może być uruchomiony bezpośrednio przez komputer w środowisku systemu operacyjnego
•Programy wykonalne napisane są w języku maszynowym za pomocą liczb binarnych, które są wewnętrznym językiem procesora (język maszynowy)
Języki programowania dzieli się przede wszystkim pod względem stopnia zaawansowania.
Język maszynowy jest językiem pierwszej generacji 1GL Pierwsi programiści rzeczywiście pisali kod w postaci kodu
maszynowego
Przykładowy kod programu:
111010100000000000001111111111111111100010011101100000000010100000001
•Asemblery: Języki niskiego poziomu, pod względem składni tożsame z maszynowymi, z tą różnicą że zamiast liczb używa się tu łatwiejszych do zapamiętania mnemoników.
Asemblery
Asemblery są językami drugiej generacji (2GL)
?
Przykładowy kod programu:
297D:0100 MOV AX,0006 ; Puts value 0006 at register AX297D:0103 MOV BX,0004 ; Puts value 0004 at register BX297D:0106 ADD AX,BX ; Adds BX to AX contents297D:0108 INT 20 ;Causes end of the Program
result = 6 + 4
Asemblery
•Asembler musi być przetłumaczony:
Program w języku asembler
Program wjęzyku maszynowym
Translator
Translator jest to program tłumaczący programy napisane w określonym języku programowania na język maszynowy. Tłumaczenie takie jest konieczne, ponieważ procesor rozumie tylko język maszynowy.
• 1:1 mapowanie poleceń asemblera na instrukcje w kodzie maszynowym
• w językach wyższej generacji – pojedyncze polecenie jest tłumaczone na wiele instrukcji w kodzie maszynowym
Języki niskiego i wysokiego poziomu
• Języki pierwszej i drugiej generacji nazywane są językami niskiego poziomu ponieważ się ściśle związane z architekturą komputera.
• Program napisany w języku programowania nazywany jest programem źródłowym - kodem źródłowym
• Każdy program napisany w języku innym niż język procesora musi zostać przetłumaczony przez translator aby komputer mógł go zrozumieć.
•Mamy dwa rodzaje translatorów:▫ interpretery (ang. interpreters)▫kompilatory (ang. compilers)oba różnią się między sobą znacznie pod względem sposobu tłumaczenia programu.
Interpretery
Interpretery tłumaczą program w następujący sposób:1. pobierają jedną instrukcję programu2. tłumaczą na język maszynowy3. dają procesorowi do wykonania4. powracają do pkt. 1.
Językami interpretowanymi są na przykład: Basic, Pyton, SQL, JavaScript, itp.
kod źródłowy wykonanie linii1 linia
Kompilatory
Kompilatory działają w następujący sposób:1. tłumaczą cały program2. zapisują przetłumaczony program w pamięci
komputera lub na dysku
• Program po przetłumaczeniu (skompilowaniu) przez kompilator jest gotowy do wykonania.
• Plik binarny generowany przez kompilator podczas kompilacji pliku z kodem źródłowym nazywamy plikiem obiektowym.
• Językami kompilowanymi są na przykład: Pascal, C, C++, Asembler, COBOL, itp.
kod źródłowy kod wynikowy
3GL – języki proceduralne i obiektowe
3GL - języki wysokiego poziomu, proceduralne (imperatywne). W językach tych jedna instrukcja jest tłumaczona na kilka instrukcji procesora, najczęściej od 5 do 10.
Wymyślone w latach 50-tych wprowadziły koncepcję programowania strukturalnego (nazwane
zmienne, wyrażenia algebraiczne) wprowadziły pewien poziom abstrakcji niezależny od sprzętu
Pierwsze przykłady:• Fortran (1956) – używany przez dekady, wciąż gdzieniegdzie
widywany• ALGOL (mid 1950’s)– poprzednik Pascala• COBOL (1959) – wciąż aktualizowany i używany w zastosowaniach
biznesowych
Nowoczesne przykłady:• BASIC (1964) – stworzony do nauki programowania• C, C++ …..• JAVA (1995) – pochodzi od C & C++ - mnogość zastosowań
3GL – języki proceduralne i obiektowe
• Języki proceduralne: Instrukcje są używane do tworzenia samodzielnych fragmentów kodu – procedur, które wykonują ściśle określone operacje
•Procedura: akceptuje dane wejściowe i przekształca je w jakiś sposób do uzyskania określonego wyniku w postaci danych wyjściowych
•Procedury często określa się funkcjami i metodami
Dwie perspektywy widzenia programu
•Użytkownika:Wykonywalny plik który wykonuje określone zadania (edytor tekstu, gra, program graficzny)
•Programisty:Plik tekstowy który zawiera instrukcje zapisane w pewnym języku programowania, które w pewnym momencie są tłumaczone na plik wykonywalny
PROBLEM ALGORYTM PROGRAM
Algorytmizacja Kodowanie
7Algorytmizacja
?
Algorytmizacja – proces tworzenia konkretnego algorytmu.
Algorytm -zbiór określonych reguł postępowania, które stosowane w ustalonym porządku prowadzą do rozwiązania określonego zadania.
Algorytm
•Algorytm: określa konkretne kroki postępowania by osiągnąć pożądany rezultatUstaw n równe 100Ustaw a równe 1Ustaw b równe 1000Oblicz sumę = n(a+ b)/2Wyświetl sumę
•Kiedy algorytm jest zapisany za pomocą języka naturalnego i formuł matematycznych mówimy wtedy o pseudokodzieWczytaj trzy liczby do komputeraOblicz średnią dodając trzy liczby do siebie i dzieląc je przez 3
Wyświetl średnią
„Strasburger”
– Dlaczego programista na umycie głowy zużywa całą butelkę szamponu?
– Bo w instrukcji jest napisane: nałożyć, spłukać, czynność powtórzyć.
Pseudokod ;)
Algorytmy przedstawiane są z różnym stopniem szczegółowości. Najczęściej stosuje się: opis słowny lub sieci działań (schematy blokowe).
Symbole graficzne do budowy sieci działań
Przykład:
Warunekprawdziwy ?
Początek Koniec
5 5
Realizacja operacji Opis realizowanej w algorytmie czynności
Tak Nie
pisz a, b, cczytaj
a, b, c
Oznaczenie początku, końca sieci działań
Łączniki dzielące sieć działań na fragmenty
Rozgałęzienie - przejście do części algorytmu wynikającej ze spełnienia warunku
Odpowiednio: wczytanie lub wydrukowanie wartości: a, b, c
11
Prezentacja algorytmu w postaci sieci działań
Początek
Koniec
k 3
Tak
pisz N, " jest pierwsza"
czytaj N
reszta z dzielenia N przez k = 0 Tak
k k +2
k >
Tak
Nie
Nie
Koniec
pisz N, " nie jest pierwsza "
k – zmienna pomocnicza
Sprawdzić, czy wczytana liczba całkowita N>3 jest pierwsza (dzieli się tylko przez jeden i siebie). (Przykład z: D. van Tassel: „Praktyka programowania”. WNT Warszawa)
N
reszta z dzielenia N przez 2 = 0
Nie
12
liczby pierwsze: 2, 3, 5, 7, 11, 13, 17, 19, 23, 29,
31, ...
Przykład sieci działań
PROBLEM ALGORYTM PROGRAM
Algorytmizacja Kodowanie
Cel tego wykładu:
• Nabycie umiejętności algorytmizacji podstawowych problemów
• Nabycie umiejętności kodowania algorytmów z wykorzystaniem języka wysokiego poziomu
7Programowanie
Implementacja algorytmu za pomocą języka programowania, takiego jak C, nazywana jest kodowaniem
Algorytmizacja i Kodowanie
Specyfikacja wymagań
Analiza problemu
Wybór ogólnego rozwiązania
Utrzymanie kodu
Kodowanie(pisanie programu)
Testowanie programu
Algorytmizacja i kodowanie
Dokumentacja
Specyfikacja wymagań
•Czym jest specyfikacja wymagań?•Dostajecie e-maila od swojego kierownika projektu:
▫To nie jest precyzyjnie zdefiniowane zapotrzebowanie !!!
▫Aby wyjaśnić i określić wykaz problemów, pierwszym krokiem byłoby skontaktować się z przełożonym, aby dokładnie określić, jakie informacje mają być produkowane (jego wyjścia) i jakie dane będą dostarczane(wejścia) - specyfikacja wymagań
Potrzebujemy program który będzie podawał statystyki obrotu produktami.
Phase II: Design and Development•Krok 1: Analiza problemu:▫Jakie dane wejściowe mają być produkowane▫Jakie dane wyjściowe są potrzebne by otrzymać
pożądane dane wejściowe ▫Operacje łączące wejścia z wyjściami
Algorytmizacja i Kodowanie
•Krok 2: Wybór ogólnego rozwiązaniaDla większych problemów dokomponujemy je na mniejsze, specyfikując jakie są relacje pomiędzy poszczególnymi komponentami (mniejszymi algorytmami)
Algorytmizacja i Kodowanie
•Krok 3: Kodowanie (pisanie programu)▫Struktura sekwencji definiuje porządek w którym
instrukcje są wykonywane przez program▫Struktura rozgałęzień zapewnia
możliwość dokonania wyboru pomiędzy różnymi grupami instrukcji, w zależności od wyniku pewnych warunków
▫Struktura powtórzeń - pętle, umożliwia powtarzanie tej samej operacji w oparciu o wartość warunku
▫Struktura wołania funkcji– pozwala na wywoływanie w miarę potrzeby tego samego fragmentu kodu
Algorytmizacja i Kodowanie
10Kompilacja i Konsolidacja programu
•Konsolidator (linker): w trakcie procesu konsolidacji łączy zadane pliki obiektowe i biblioteki statyczne tworząc w ten sposób plik wykonywalny.
8Działający program
Algorytmizacja i Kodowanie
•Krok 4: Testowanie i uruchamianie kodu
▫Błąd programu potocznie nazywamy pluskwą (bugiem)▫Proces szukania i naprawiania błędów nosi nazwę.
debugowania (ang. debugging)▫Testowanie pozwala stwierdzić czy program generuje
spodziewane rezultaty▫Jeśli powstanie błąd należy go zlokalizować, poprawić i
ponownie sprawdzić działanie programu▫Przydaje się zdefiniowanie wszystkich możliwych
zachowań programu – i ich przetestowanie
• Błędy kompilacji – jeśli kompilator „nie rozumie” programu źródłowego.
• Błędy wykonania programu – jeśli program po kompilacji nie daje się wykonać.
• Błędy logiczne – jeśli program wykonuje się nieprawidłowo.
9Kompilacja i wykonanie programu
Dokumentacja
• Ważne elementy rozwiązania problemu:1. Specyfikacja wymagań2. Opis kodowanego algorytmu3. Komentarze w kodzie programu4. Opis modyfikacji i zmian w programie 5. Opis testów przebiegów, obejmujący wejścia i wyjścia
z pojedynczych przebiegów6. Instrukcja obsługi, która jest szczegółowym
wyjaśnienie w jaki sposób korzystać z programu
Utrzymanie kodu
•Utrzymanie (pielęgnowanie) programu/kodu to:▫poprawianie, ▫zmienianie,▫rozszerzanie
• Łatwość utrzymywania kodu zależy od łatwości z jaką może być odczytany i zrozumiany
Koszty utrzymania
Backup – kopie zapasowe
•Niezbędnym elementem programowania jest robienie i utrzymywanie kopii zapasowych
•Nie jest formalnym elementem procesu
•Warto mieć backup dwa kroki wstecz, lub całą historię.
•W praktyce wiele organizacji trzyma co najmniej jedną kopię zapasową na miejscu, gdzie może być łatwo wykorzystana, a druga kopię w odległym miejscu
Państwa również dotyczy!!!
Historia języka C
•Powstał w roku 1970s w AT&T Bell Laboratories.• Jego autorami byli K. Thompson, D. Ritchie, and B.
Kernighan• Jezyk wysokiego poziomu
•C umożliwia bezpośredni dostęp do pamięci komputera i modyfikacji danych
•Zostało ustandaryzowane przez American National Standards Institute (stąd ANSI C)
•W roku 1980s, Bjarne Stroustrup (pracujący w AT&T) wprowadził język C++ (obiektowe C – więcej na 14 wykładzie)
Program jest TEKSTEM (ciągiem znaków), dla którego zdefiniowano:
• ALFABET ( dopuszczalny ciąg znaków )
• SŁOWA KLUCZOWE ( predefiniowane, mające specjalne znaczenie )
• DEFINICJE i DEKLARACJE oraz INSTRUKCJE
STRUKTURA PROGRAMU
# include <stdio.h> dołączanie plików nagłówkowych bibliotek
.....
int main ( ) {
definicje, deklaracje i instrukcje return 0; funkcja main (główna) - musi być w programie
}
.....
inne funkcje - niekonieczne
13Program w C
#include <stdio.h>int main (void){ printf("Hello world"); return 0;}
#include <stdio.h>
int main (void ){ int x,y;
scanf("%d %d\n",&x,&y); if (x>y) printf("%d",x); else printf("%d",y); return 0;}
1) Najprostszy program: 2) Wydrukować większą wartość spośród dwóch wczytanych:
#include <stdio.h>
int main (void) { int a, obwod, pole; printf("Podaj bok kwadratu\n"); scanf("%d",&a); obwod = 4*a; pole = a*a; printf("Obwod = %d Pole = %d ", obwod, pole);
return 0;}
3) Wczytać bok kwadratu, a następnie obliczyć i wydrukować jego obwód i pole:
#include <stdio.h>int main (void ) { printf("Hello world"); return 0;}
To samo w innej konwencji zapisu nawiasów klamrowych:
14Przykłady programów
Są ignorowane przez kompilator, służą wyłącznie osobie czytającej tekst programu.
Zapisuje się je:
• wewnątrz par znaków /*.....*/, co pozwala tworzyć komentarze złożone z wielu linii
15
Przykład komentarzy:
/* Wszystko to co tutaj jest wpisane jest niewidoczne z punktu widzenia kompilatora*/
Komentarze
#include <stdio.h>int main (void ) {/* najprostszy z programow */ printf("Hello world"); return 0;}
Najczęstsze błędy programowania
•Pośpiech w pisaniu i uruchamianiu programu bez wcześniejszej analizy problemu i przygotowania algorytmu
•Zapominanie o backupie
•Zapominanie o tym, że komputery robią tylko to co im polecimy
Podsumowanie
•Początki to Charles Babbage w roku 1822
•Fizyczne komponenty komputera nazywamy hardwarem
•Programy wykonujące się na komputerze nazywamy
softwarem
• Istnieje wiele typów i rodzajów języków programowania
• Języki używające kompilatorów i interpreterów
nazywamy językami wysokiego poziomu
Podsumowanie
• Algorytm: zbiór określonych reguł postępowania, które stosowane w ustalonym porządku prowadzą do rozwiązania określonego zadania•Procedura tworzenia oprogramowania:▫Specyfikacja wymagań▫Algorytmizacja(projektowanie) i kodowanie▫Dokumentacja▫Utrzymanie
Podsumowanie
•Pamiętajcie że potrzebujecie mieć co najmniej jeden backup Waszego programu
Nawet wtedy jeśli jest to mały programik tworzony na laboratoriach.