Języki programowania

Podobne dokumenty
Programowanie obiektowe C++

Programowanie obiektowe C++

Języki programowania

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

Wyjątki (exceptions)

1 Podstawy c++ w pigułce.

Programowanie w C++ Wykład 6. Katarzyna Grzelak. kwiecień K.Grzelak (Wykład 6) Programowanie w C++ 1 / 40

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 7 maja K.Grzelak (Wykład 8) Programowanie w C++ 1 / 31

4. Wyrzuć wyjątek jeśli zmienna ist nie istnieje bloki: try, catch i wyrzucanie wyjątku

1 Podstawy c++ w pigułce.

Wykład 8: Obsługa Wyjątków

7. Pętle for. Przykłady

LEKCJA 2. Szukaj dziury w całym: debugowanie

Język C++ wykład VIII

Zad.30. Czy można utworzyć klasę, która implementuje oba interfejsy?

Efekty uboczne błędów

Wstęp do programowania. Wykład 1

Niezwykłe tablice Poznane typy danych pozwalają przechowywać pojedyncze liczby. Dzięki tablicom zgromadzimy wiele wartości w jednym miejscu.

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Wstęp do informatyki- wykład 7

Kod doskonały : jak tworzyć oprogramowanie pozbawione błędów / Steve McConnell. Gliwice, cop Spis treści. Wstęp 15.

Języki i metody programowania Java INF302W Wykład 3 (część 1)

Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019

Jeśli chcesz łatwo i szybko opanować podstawy C++, sięgnij po tę książkę.

4. Funkcje. Przykłady

Język ludzki kod maszynowy

Wyjątki. Wyjątki. Bogdan Kreczmer. Katedra Cybernetyki i Robotyki Politechnika Wrocławska

Programowanie komputerowe. Zajęcia 2

Wyjątki. Streszczenie Celem wykładu jest omówienie tematyki wyjątków w Javie. Czas wykładu 45 minut.

Szablony funkcji i szablony klas

Elżbieta Kula - wprowadzenie do Turbo Pascala i algorytmiki

Sesje, ciasteczka, wyjątki. Ciasteczka w PHP. Zastosowanie cookies. Sprawdzanie obecności ciasteczka

C++ - [1-3] Debugowanie w Qt Creator

Java podstawy jęyka. Wykład 2. Klasy abstrakcyjne, Interfejsy, Klasy wewnętrzne, Anonimowe klasy wewnętrzne.

Laboratorium Informatyka (I) AiR Ćwiczenia z debugowania

Programowanie obiektowe

Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie

Język C++ zajęcia nr 2

for (inicjacja_warunkow_poczatkowych; wyrazenie_warunkowe; wyrazenie_zwiekszajace) { blok instrukcji; }

Podstawy i języki programowania

Java EE produkcja oprogramowania

Wykład I. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Podstawy Programowania Podstawowa składnia języka C++

Matematyka Dyskretna. Andrzej Szepietowski. 25 czerwca 2002 roku

Pierwsze kroki. Algorytmy, niektóre zasady programowania, kompilacja, pierwszy program i jego struktura

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

Programowanie obiektowe i C++ dla matematyków

1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami

Podstawy języka C++ Maciej Trzebiński. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. Praktyki studenckie na LHC IVedycja,2016r.

Programowanie komputerowe. Zajęcia 7

Liczby losowe i pętla while w języku Python

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.

Algorytm. a programowanie -

Obsługa wyjątków. Język C++ WW12

Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków

Pętla for. Wynik działania programu:

Jak napisać program obliczający pola powierzchni różnych figur płaskich?

Widoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach?

TEMAT : KLASY DZIEDZICZENIE

Podstawy Informatyki. Algorytmy i ich poprawność

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

Testowanie II. Celem zajęć jest zapoznanie studentów z oceną jakości testów przy wykorzystaniu metryk pokrycia kodu testami (ang. code coverage).

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

PROE wykład 3 klasa string, przeciążanie funkcji, operatory. dr inż. Jacek Naruniec

Cel: Przypisujemy przyciskom określone funkcje panel górny (Panel1)

Podstawy Programowania. Wykład 1

Wstęp do Programowania, laboratorium 02

Ogólne zasady projektowania algorytmów i programowania

Programowanie - wykład 4

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Wykład VII. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Warunek wielokrotnego wyboru switch... case

Metody Metody, parametry, zwracanie wartości

- - Ocena wykonaniu zad3. Brak zad3

Nazwa wariantu modułu (opcjonalnie): Laboratorium programowania w języku C++

1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.

Podstawy algorytmiki i programowania - wykład 4 C-struktury

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Praktyka Programowania

Programowanie komputerowe. Zajęcia 1

Wykład 8. Testowanie w JEE 5.0 (1) Autor: Zofia Kruczkiewicz. Zofia Kruczkiewicz

Wstęp do Informatyki i Programowania Laboratorium: Lista 0 Środowisko programowania

Zapisywanie algorytmów w języku programowania

Języki i techniki programowania Ćwiczenia 2

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 16 kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 27

Instrukcje wyboru. Tworzenie programu, Schematy blokowe, Instrukcje wyboru, Operatory logiczne

Podstawy Programowania C++

3. Instrukcje warunkowe

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 15 kwietnia K.Grzelak (Wykład 8) Programowanie w C++ 1 / 33

Wykład 1. Program przedmiotu. Programowanie Obiektowe (język C++) Literatura. Program przedmiotu c.d.:

Obsługa błędów za pomocą wyjątków. Paweł Motofa (140746)

W przeciwnym wypadku wykonaj instrukcję z bloku drugiego. Ćwiczenie 1 utworzyć program dzielący przez siebie dwie liczby

Schematy blokowe I. 1. Dostępne bloki: 2. Prosty program drukujący tekst.

Konwersje napis <-> liczba Struktury, unie Scanf / printf Wskaźniki

Podstawy Informatyki. Inżynieria Ciepła, I rok. Wykład 10 Kurs C++

3. Podaj elementy składowe jakie powinna uwzględniać definicja informatyki.

for (inicjacja_warunkow_poczatkowych(końcowych); wyrazenie_warunkowe; wyrazenie_zwiekszajace(zmniejszające)) { blok instrukcji; }

ZASADY PROGRAMOWANIA KOMPUTERÓW

Programowanie obiektowe, wykład nr 6. Klasy i obiekty

Struktura pliku projektu Console Application

Transkrypt:

Języki programowania Nowoczesne techniki programowania Wykład 3 Witold Dyrka witold.dyrka@pwr.wroc.pl 19/10/2012

Kolokwium I termin piątek, 30/11/2012 (w terminie wykładu) II termin środa, 5/12/2012, godz. 7.30 s.314/a-1

Prawa autorskie Slajdy do wykładu powstały w oparciu o slajdy Bjarne Stroustrupa do kursu Foundations of Engineering II (C++) prowadzonego w Texas A&M University http://www.stroustrup.com/programming

Program wykładów 1. Pierwszy program 5/10 2. Obiekty, typy i wartości. Wykonywanie obliczeń 12/10 3. Błędy 19/10 4. Kończenie programu 26/10 5. Techniki pisania funkcji i klas 9/11 6. Strumienie wejścia/wyjścia 16/11 7. Wskaźniki i tablice 23/11

Plan na dziś (1) Błędy Źródła i rodzaje Mechanizm wyjątków Odrobaczanie

Błędy w programie Podstawowym celem programisty jest poprawność kodu uświadomiłem sobie, że od teraz dużą część mojego życia spędzę szukając i poprawiając moje własne błędy. Maurice Wilkes Przypuszczam, że unikanie, znajdowanie i poprawianie błędów stanowi 95% lub więcej wysiłku w poważnym tworzeniu oprogramowania. Bjarne Stroustrup

Błędy w programie Źródła błędów Rodzaje błędów Wykrywanie błędów Raportowanie błędów Wyjątki Debugowanie (odrobaczanie) Testowanie

Źródła błędów Słaba specyfikacja (80% dużych projektów wysypuje się przez złą specyfikację) Niekompletny program Nieoczekiwane argumenty funkcji (np. funkcja sqrt() nie przyjmie wartości -1) Niespodziewane dane wejściowe (np. uszkodzony plik z danymi) Niespodziewany stan Niewłaściwy algorytm rozwiązania

Rodzaje błędów Błędy kompilacji błędy typów błędy składni Błędy konsolidacji Błędy czasu wykonania (ang. run-time) wykryte przez system ( program się wysypał ) wykryte przez biblioteki (wyjątki) wykryte przez kod użytkownika Błędy logiczne wykryte przez programistę/testera

Oczekiwania Każdy program 1)Powinien wytworzyć pożądany wynik dla każdego poprawnego wejścia 2)Powinien zwrócić sensowny komunikat o błędzie dla niepoprawnych danych wejściowych Twój program 3)Nie musi przejmować się błędami sprzętu 4)Nie musi przejmować się błędami systemu 5)Może zakończyć działanie po znalezieniu błędu

Błędy argumentów funkcji Kompilator sprawdza liczbę i typy argumentów funkcji: int pole(int wysokosc, int szerokosc) { return wysokosc*szerokosc; } int x1 = pole(7); // błąd kompilacji: zła liczba argumentów int x2 = pole("siedem", 2); // błąd kompilacji: argument 1 ma zły typ int x3 = pole(7, 10); // ok int x5 = pole(7.5, 10); // działa, ale: 7.5 zostanie obcięte do 7; // większość kompilatorów zgłosi ostrzeżenie int x = pole(10, -7); // typy się zgadzają, ale wartość -7 nie ma sensu!!!

Obsługa błędów int a = 10; int b = -7; int x = pole(a, b); // typy się zgadzają, ale wartość -7 nie ma sensu!!! Tym błędem musi zająć się programista Dwie strategie sprawdzania poprawności argumentów sprawdza wywołujący funkcję + wie jak obsłużyć błąd - musi znać specyfikację funkcji, dłuższy i nieczytelny kod sprawdza funkcja wywoływana + prostszy, bardziej elegancki kod - nie wie co zrobić z błędem Pomysł: funkcja zwraca informacje o błędzie, a wywołujący decyduje co z tym zrobić

Raportowanie błędów (1) Zwracanie wartości błędu int pole(int wysokosc, int szerokosc) // zwraca -1 jeśli błędne dane { if(wysokosc <0 szerokosc < 0) return -1; return wysokosc*szerokosc; } Wywołujący musi (może?) sprawdzić wynik i podjąć działanie int z = pole(x,y); if (z<0) { cerr<<"problem z obliczaniem pola"; return; // Kolejny problem: jaką wartość błędu może zwracać funkcja max()?

Raportowanie błędów (2) Ustawianie znacznika błędu: int errno = 0; int pole(int wysokosc, int szerokosc) { if(wysokosc <0 szerokosc < 0) errno = 7; return wysokosc*szerokosc; } Wywołujący musi (może?) sprawdzić wynik i podjąć działanie int z = pole(x,y); if (errno==7) { cerr<<"problem z obliczaniem pola"; return; // Te same problemy co poprzednio nie używaj!!

Raportowanie błedów (3) Zgłaszanie wyjątków: int pole(int wysokosc, int szerokosc) { if (wysokosc <0 szerokosc < 0) throw 1; // wyrzucamy wyjątek nr 1 return wysokosc*szerokosc; } Wywołujący próbuje czy we fragmencie kodu nie zgłoszono wyjątku, chwyta go i decyduje co zrobić try { int z = pole(x,y); // jeżeli pole() nie zgłosiło wyjątku } // wykonuje przypisanie i idzie dalej catch(int& wyjatek) { // jeżeli pole() zgłosiło wyjątek typu int, obsługuje go: if (wyjatek==1) cerr << "Ups! Problem z obliczaniem pola"; }

Raportowanie błedów (3) Zgłaszanie wyjątków: int pole(int wysokosc, int szerokosc) { if (wysokosc <0 szerokosc < 0) throw string("zle pole"); // wyrzucamy wyjątek return wysokosc*szerokosc; // Zle pole } Wywołujący próbuje czy we fragmencie kodu nie zgłoszono wyjątku, chwyta go i decyduje co zrobić try { int z = pole(x,y); // jeżeli pole() nie zgłosiło wyjątku } // wykonuje przypisanie i idzie dalej catch(string& wyjatek) { // jeżeli pole() zgłosiło wyjątek typu string, obsługuje go: cerr << "Ups! Problem z obliczaniem pola: " << wyjatek; }

Raportowanie błedów (3) Zgłaszanie wyjątków: class Zle_pole { }; // Tak w C++ definiujemy typ użytkownika, tutaj typ błędu int pole(int wysokosc, int szerokosc) { if (wysokosc <0 szerokosc < 0) throw Zle_pole(); // wyrzucamy obiekt typu Zle_pole return wysokosc*szerokosc; } Wywołujący próbuje czy we fragmencie kodu nie zgłoszono wyjątku, chwyta go i decyduje co zrobić try { int z = pole(x,y); // jeżeli pole() nie zgłosiło wyjątku } // wykonuje przypisanie i idzie dalej catch(zle_pole&) { // jeżeli pole() zgłosiło wyjątek Zle_pole(), obsługuje go: cerr << "Ups! Problem z obliczaniem pola"; }

Wyjątki - idea Program, czyli grupa funkcji przybywa na dzikie i niebezpieczne tereny. Jedna z nich wyrusza na rekonesans www.sidzina.net.pl Sygnalizuje go rzucając wyjątek: Wtem, napotyka problem: msw-pttk.org.pl Reszta chwyta, że żółta flara oznacza misia i podejmuje dalsze działania artofmanliness.com

Dlaczego wyjątki? Obsługa wyjątków jest uniwersalna Nie można o nich zapomnieć: wystarczy, że umieścisz całość programu w bloku try catch, a program zakończy działanie, jeśli wyjątek pojawi się i nie zostanie obsłużony Prawie każdy typ błędu można zgłosić wyjątkiem Jednak to wciąż programista musi zastanowić się co zrobić z każdym wyjątkiem

Wyjątki błąd poza zakresem int main() try { vector<int> v(10); // wektor 10-ciu int-ów for (int i = 0; i<v.size(); ++i) v.at(i) = i; // ustawiamy wartości // at(i) = [i] + wyjątek zakresu for (int i = 0; i<=10; ++i) // drukujemy 10 wartości (???) cout << "v[" << i << "] == " << v.at(i) << endl; } catch (out_of_range&) { // wyjątek out_of_range cerr << "ups któryś indeks wektora poza zakresem\n"; } catch ( ) { cerr << "ups jakiś błąd\n"; } // wszystkie inne wyjątki

Odrobaczanie Na proces debugowania składa się: 1) Zauważenie, że coś działa inaczej niż oczekiwano 2) Sprawdzenie co tak na prawdę się dzieje 3) Poprawienie A jak tego nie robić? dopóki (program nie sprawia wrażenia działającego) { zaglądam tu i tam, szukając czegoś co wygląda dziwnie; zmieniam to, aby wyglądało lepiej ; }

Krok 1: Zadbaj o strukturę programu Jeżeli masz znaleźć błąd program musi być łatwy do czytania 1) Komentuj wyjaśniaj swoje pomysły 2) Używaj znaczących nazw 3) Rób wcięcia trzymaj się jednego stylu 4) Podziel kod na małe funkcje - unikaj funkcji dłuższych niż strona kodu 5) Jeśli to możliwe, unikaj skomplikowanego kodu, np. zagnieżdżonych pętli i instrukcji warunkowych 6) Używaj funkcji bibliotecznych są sprawdzone

Krok 2: Skompiluj program Jeśli program się nie kompiluje - sprawdź: 1) Czy zakończyłeś literały łańcuchowe ('') i znakowe (')? 2) Czy zakończyłeś każdy blok ({ }) 3) Czy zamknąłeś wszystkie nawiasy? 4) Czy każda nazwy została zadeklarowana? 5) Czy każda nazwa została zadeklarowana przed użyciem? 6) Czy zakończyłeś każdą instrukcję średnikiem?

Krok 3: Prześledź program Podejdź do tego jakbyś był komputerem Czy dane na wyjściu spełniają Twoje oczekiwania? Warto wyrzucić wartości paru zmiennych na wyjście błędu: cerr << "x == " << x << ", y == " << y << '\n'; Uważaj musisz zobaczyć to co programu rzeczywiście robi, nie to co uważasz, że powinien robić: for (int i=0; 0<month.size(); ++i) { // błąd! for( int i = 0; i<=max; ++j) { Gdzie szukać błędu? // podwójny błąd!

Krok 3: Gdzie szukać błędu? Wprowadź testy poczytalności (ang. sanity checks), if (liczba_elementow<0) throw runtime_error("ujemna liczba elementow"); if (maksymalny_sensowny<liczba_elementow) throw runtime_error("nieoczekiwanie wielka liczba elementow"); if (x<y) throw runtime_error("niemozliwosc: x<y"); Napisz je tak, aby nie trzeba było ich usuwać z kodu w momencie, gdy program będzie wyglądał na ukończony

Krok 3: Gdzie szukać błędu? Wprowadź testy poczytalności (ang. sanity checks), if (liczba_elementow<0) throw 101; if (maksymalny_sensowny<liczba_elementow) throw 102; if (x<y) throw 103; Napisz je tak, aby nie trzeba było ich usuwać z kodu w momencie, gdy program będzie wyglądał na ukończony

Krok 3: Gdzie szukać błędu? Warunki początkowe i końcowe class Zly_argument { }; class Zle_pole { }; int pole(int wysokosc, int szerokosc) { if (wysokosc <0 szerokosc < 0) throw Zly_argument(); int p = wysokosc*szerokosc; if (p<0) throw Zle_pole(); return p; } Zasady Zawsze przemyśl warunki początkowe i końcowe Zapisz je przynajmniej w postaci komentarza Sprawdzaj, gdy szukasz błędu Kiedy w przykładzie warunek początkowy będzie spełniony, a końcowy nie?

Krok 3: Gdzie szukać błędu? Sprawdź przypadki brzegowe Czy zainicjowałeś każdą zmienną sensowną wartością? Czy funkcja dostała prawidłowe argumenty? Czy funkcja zwróciła prawidłową wartość? Czy poprawnie obsłużyłeś pierwszy i ostatni element? (np. pętli) Czy poprawnie obsłużyłeś przypadki puste? (brak elementów, brak wejścia) Czy poprawnie otworzyłeś plik? Czy rzeczywiście wczytałeś wejście i zapisałeś wyjście?

Kilka ogólnych zasad Jeżeli nie możesz znaleźć błędu, szukasz w złym miejscu Nie dowierzaj swojemu przekonianiu, że wiesz gdzie jest błąd Nie zgaduj, kieruj się danymi na wyjściu: Szukaj od miejsca, gdzie wiesz, że jest ok Co się dzieje dalej, dlaczego? Szukaj przed miejscem, gdzie dostałeś zły wynik Co mogło się wydarzyć? Znalezłeś robaka? Zastanów się, czy naprawienie go rozwiązuje cały problem Często szybka poprawka wprowadza nowe błędy Jeśli programista mówi: znalazłem ostatni błąd, to żartuje;-)

Dziś najważniejsze było... Raportujemy błędy przy użyciu mechanizmu wyjątków Odrobaczamy program systematycznie Jeśli programista mówi: znalazłem ostatni błąd, to żartuje;-)

A za tydzień... Napiszemy prosty kalkulator Nauczymy się tworzyć własne typy danych