Wstęp do programowania w C++

22
2012-05-07 1 Wstęp do programowania w C++ Wydział Energetyki i Paliw Katedra Podstawowych Problemów Energetyki Symfonia C++ standard – Jerzy Grębosz Thinking in C++ - Bruce Eckel Ćwiczenia praktyczne z C++ Literarura

Transcript of Wstęp do programowania w C++

2012-05-07

1

Wstęp do programowania w C++

Wydział Energetyki i PaliwKatedra Podstawowych Problemów Energetyki

• Symfonia C++ standard – Jerzy Grębosz• Thinking in C++ - Bruce Eckel• Ćwiczenia praktyczne z C++

Literarura

2012-05-07

2

Wstęp

Aby wykonać na komputerze zadanie zapisane w postaci programunależy:

� utworzyć plik, którego zawartością jest treść programu, inaczej nazywana kodem źródłowym

� przetworzyć kod źródłowy zapisany w pliku na programwykonywalny ,czyli zrozumiały dla komputera

� wykonać program

Tłumaczenie kodu źródłowego na program

Tłumaczenie kodu źródłowego na program składa się z następujących etapów:

-Kompilacja – wstępne przetworzenie instrukcji programu (kod źródłowy zjęzyka C++ w procesie kompilacji zostaje przetłumaczony najęzyk maszyny, czyli język binarny)

-Łączenie – linkowanie (konsolidacja). Połączenie wszystkich niezależnych segmentów z uwzględnieniem bibliotek, w jeden wykonywalny program. (dopiero w procesie linkowania dochodzi do połączenia napisanego programu z wymaganymi w celu jego prawidłowego działania bibliotekami )

Aby stwierdzi ć poprawno ść działania programu, niezb ędne jest przeprowadzenie odpowiednich testów

Testowanie programu polega na wielokrotnym wykonaniu programu dladanych opisujących proste przykłady i porównaniu otrzymanych wyników zrozwiązaniami uzyskanymi innymi metodami. Pozytywne wyniki testówoznaczają, że można przystąpić do wykorzystania programu.

2012-05-07

3

Algorytm

Algorytm musi spełnia ć dwa warunki:

� gwarantować otrzymanie rozwiązania w skończonej liczbie operacji

� wielokrotne wykonanie algorytmu dla tego samego zestawu danychpowinno spowodować otrzymanie tego samego wyniku - warunekjednoznaczności

Przed przyst ąpieniem do pisania programu wskazane jest opracowanie algorytmu , czyli receptury, opisuj ącej sposób

osi ągni ęcia rozwi ązania zadania .

Algorytm

Przykład algorytmu (pierwiastki wielomianu kwadratowego ax2 +bx +c =0):

START

Podaj a,b,c

Policz ∆

∆ > 0TAK NIE

∆ = 0

NIE

TAK

Brak pierwiastków w dziedzinie liczb rzeczywistych

Obliczenie pierwiastka x0

Obliczenie pierwiastków x1, x2

STOP

2012-05-07

4

Zmienne w języku C++

Czym jest zmienna?

Jest obiektem obdarzonym nazwą, typem i wartością. Wartość zmiennej możebyć określona lub nieokreślona w trakcie wykonywania programu.

Co mo że być nazwą zmiennej w j ęzyku C++?

Nazwą zmiennej może być dowolnie długi ciąg liter, cyfr oraz znaków podkreślenia ‘_’. Nazwa NIE może rozpoczynać się od cyfry. Małe i wielkie litery w nazwach są rozróżniane. Nazwa nie może być identyfikowana z żadnym ze słów kluczowych języka C++ (do, goto, int, else…)

Przykład nazw zmiennych:

NAZWA, J23, NAZWA1, N009Z, kuku, Ala, olo, f_Uf23, break, ale_fajna_nazwa

Podstawowe typy zmiennych

W języku C++ każda nazwa musi zostać zadeklarowana zanim zostanie użyta. Deklaracja mówi jakiego typu będzie to, co nazwaliśmy daną nazwą.

Zestaw podstawowych typów i możliwych do przechowania w nich wartości dla komputerów/kompilatorów 32 bitowych

char 8 1 od -128 do 127

int 32 4 od -2147483648 do 2147483647

float 32 4 od 3.4E-38 do 3.4E+38

double 64 8 od 1.7E-308 do 1.7E+308

Typ zmiennej Szerokość w bitach

Szerokość w bajtach

Najczęściej spotykany zakres wartości

2012-05-07

5

Typy zmiennych - inne

W języku C++ wszystkie typy zmiennych mogą wystąpić w dwóch wariantach

� Signed – ze znakiem. Wyposażenie typu w znak sprawia, że obiekttakiego typu może przechowywać liczbę dodatnią lubujemną.

� Unsigned – bez znaku. Obiekt takiego typu przyjmuje tylko wartościdodatnie.

Definicja zmiennej w postaci np. int a rozumiana jest przez kompilator domyślnie jako definicja zmiennej ze znakiem tj. signed int a

Język C++ wyposażony jest ponadto w wiele tj. podtypów zmiennych. Np.gdy z góry wiemy, że zmienna którą zastosujemy w programie będzieprzyjmowała wartości dużo mniejsze niż zakres zmiennej typu int, możemyzastosować zmienną typu short int.

Typy zmiennych - inne

Zmienne signet, unsignet oraz inne podtypy zmiennyc h

unsigned int 32 4 od 0 do 4294967295

signed int 32 4 od -2147483648 do 2147483647

Int 32 4 od -2147483648 do 2147483647

short int 16 2 od -32768 do 32767

Double 64 8 od 1.7E-308 do 1.7E+308

Long double 80 10 od 3.4E-4932 do 1.1E+4932

Zastosowanie zmiennych o szerszym zakresie umożliwia wykonywanieobliczeń z większą dokładnością, ale im większa dokładność obliczeń tymdłuższy czas ich trwania, stąd należy rozsądnie dobierać zmienne dorealizowanych zadań.

Typ zmiennej Szerokość w bitach

Szerokość w bajtach

Najczęściej spotykany zakres wartości

2012-05-07

6

Typy zmiennych - bool

� Zmienna bool jest wykorzystywana do reprezentacji obiektów logicznych

� Obiekt typu bool przechowuje jedną z dwóch wartości: true, false

Generalna zasada: true = 1, false = 0

…int main() {

int x; // definicja zmiennej x typu całkowitego (integer) bool decyzja // definicja zmiennej decyzja typu bool

…decyzja = (x < 12)

…}

Jeśli obecnie wartość przechowywana w zmiennej x byłaby mniejsza od 12 to

zmienna decyzja przyjmie wartość trueczyli 1

Jeśli obecnie wartość przechowywana w zmiennej x byłaby większa bądź równa 12 to zmienna decyzja przyjmie wartość false

czyli 0

Struktura programu

#include <iostream> // dołączenie bibliotekiusing namespace std; // dołączenie biblioteki

int main() // deklaracja głównej funkcji programu, { // w tym miejscu rozpoczyna się jego wykonanie

cout << "Hello world!" << endl; /* wyprowadzenie tekstu na standardowe wyjście. Zakończenie

linii sygnalizuje się znakiem „ ; ” */return 0; } // zamknięcie głównej funkcji programu

Operacje wejścia/wyjścia nie są częścią definicji języka C++. Funkcje odpowiedzialne za te czynności są w standardowej bibliotece o nazwie iostream, w którą

wyposażony jest kompilator.

Dołączenie biblioteki dzięki której nazwy schowane w przestrzeni nazw std (standard) stają się ogólnie

dostępne. W tej przestrzeni nazw są między innymi przechowywane nazwy cout i cin. Wykorzystanie

przestrzeni nazw std pozwala nam zamiast std::cout istd::cin pisać po prostu cout i cin.

Koniec linii należy ZAWSZE !! Sygnalizować znakiem

średnika ;

/* … */ - typ komentarza, którym można zaznaczyć więcej niż jedną linijkę tekstu

// - po zastosowaniu tego komentarza kompilator ignoruje resztę znaków do końca linii

Każda funkcja zwraca pewna wartość. Dla głównej funkcji

programu wartość tę umownie przyjmuje się za 0

co oznacza, że program został poprawnie wykonany.

W przypadku błędów zwracana jest różna od zera

wartość

2012-05-07

7

Kompilacja i uruchamianie - Linux

Kompilacja + linkowanie

Plik powstały po kompilacji. Do uruchamiania

Kompilacja: g++ -o [output file] [input file]

Uruchomienie programu

Jeśli nazwa pliku wyjściowego, za pomocą której będziemy uruchamiać

program nie zostanie podana (uruchomimy g++ bez opcji -o) to

wtedy kompilator nada plikowi wynikowemu nazwę domyślną a.out

polecenie Opcja wymuszająca podanie nazwy pliku

wyjściowego

Nazwa pliku wyjściowego

Plik, który chcemy skompilować

Prosty program I

/* Program przelicza z dżuli na kalorie */#include <iostream>using namespace std;

int main() {

float joul, cal; //definicja dwóch zmiennych typu floatfloat przelicznik = 4.184; // definicja zmiennej + nadanie wartości

cout << "Podaj liczbe dzuli!\n" ; // wypisanie na ekran cin>>joul; // wczytanie z klawiatury

cal=joul*przelicznik; // obliczenie kalorii

cout<< "W kaloriach to bedzie?\n" ;cout<<cal; cout<<"\n" ;

system("PAUSE");return 0;

}

Wykorzystując w programie standardową przestrzeń nazw

możemy zamiast std:cout oraz std:cinnapisać po prostu cout oraz cin

Niektóre systemy operacyjne (np. MS Windows) natychmiast po zakończeniu

programu zamykają także okno w którym pracował program. Aby temu

zapobiec na końcu programu wpisujemy system (”pause”);

2012-05-07

8

if (warunek 1) {

if (warunek 2) {

[blok instrukcji 1]}

}else{

[blok instrukcji 3]}

Instrukcji sterujące

if (warunek 1) {

[blok instrukcji 1];}else{

[blok instrukcji 3];}

if (warunek 1) instrukcja;

Schemat uproszczony

Instrukcja warunkowa ifZagnieżdżenia

if (warunek 1) {

[blok instrukcji 1]}else if (warunek 2)

{[blok instrukcji 2]

}else{[blok instrukcji 3]

}

Generalna zasada: Je śli nawiasy klamrowe nie stanowi ą inaczej to else odnosi si ę zawsze do najbli ższego poprzedzaj ącego if

Operatory

Operatory w C++

Operatory logiczne % Reszta z dzielenia

== Jest równy

!= Jest różny = przypisywanie

> Jest większy i++ i=i+1

< Jest mniejszy k-- k=k-1

>= Jest większy lub równy

<= Jest mniejszy lub równy && iOperatory arytmetyczne || lub+ Dodawanie

- Odejmowanie

* Mnożenie

/ Dzielenie

2012-05-07

9

Instrukcji sterujące

// Przykład zastosowania instrukcji warunkowej if#include <iostream>using namespace std;

int main () {int predkosc; // definicja dwóch zmiennych typu int

cout << ”Jak szybko jedziesz? [w km/h]:\n” ;cin >> predkosc;

if (predkosc > 70) // warunek{cout << ”Predkosc ” << predkosc << ” to za szybko. Ograniczenie jest do 70 km/h\n”; // co jeśli prawda

}else // co gdy fałsz

{cout << ” Jest bezpiecznie \n”;}

return 0;}

Instrukcji sterujące

// Przykład zastosowania instrukcji warunkowej if#include <iostream>using namespace std;

int main () {float y, x; // definicja dwóch zmiennych typu float

cout << ”Podaj wartosc x \n ”;cin >> x;

if ( x != 1) // warunek{ // co jeśli prawday=(x*x- 5)/(x-1) ;cout << ”Wartosc funkcji dla ” << x << ”Wynosi” << y << endl;

}else // co gdy fałsz

{cout << ” podany x nie należy do dziedziny funkcji \n ”;}

return 0;}

2012-05-07

10

Instrukcji sterujące

while ( warunek ) {

[blok instrukcji]}

Pętla while

Przykład prostej pętli while

char litera;while (litera !=‘K’) {

cout << ”Napisz jakąś literę!”;cin >> litera;cout << ”\nNapisałeś: ” << litera << ”\n”;

}

cout << ”\n Skoro napisałeś K to kończymy!”;

Przystępując do wykonania pętli while komputer najpierw sprawdza

warunek

Spełniony ?

T N

Instrukcje nie zostaną wykonana

Instrukcje zostaną wykonane

W przypadku p ętli while mo że się zdarzyć, że instrukcje w niej zawarte

nie wykonaj ą się ani razu je śli od pocz ątku warunek nie jest spełniony

Instrukcji sterujące

do{

[blok instrukcji]}while (warunek)

Pętla do … while …

Przykład prostej pętli do…while…

char litera;do{

cout << ”Napisz jakąś literę!”;cin >> litera;cout << ”\nNapisałeś: ” << litera << ”\n”;

} while (litera != ‘K’);

cout << ”\n Skoro napisałeś K to kończymy!”;

Wykonanie instrukcji co najmniej raz

Spełniony ?

T N

Dalsze instrukcje nie zostaną wykonana

Dalsze instrukcje zostaną wykonane

W przypadku p ętli do… while instrukcje w niej zawarte zostan ą wykonane co najmniej raz, nawet, gdy warunek nie b ędzie spełniony

2012-05-07

11

Instrukcji sterujące

Różnica do … while … i while

Instrukcji sterujące

for (instr_ini ; warunek ; instr_krok) {

[blok instrukcji]}

Przykład prostej pętli for

Pętla for …

for (i=0 ; i < 10 ; i=i+1) {

cout<< ”Ku-ku!”;}

instr_ini – instrukcja inicjalizująca pracę pętli, wykonywana jednokrotnie, zanim zostanie wykonana właściwa praca pętli

warunek – wyrażenie, które obliczane jest przed każdym obiegiem pętli. Jeśli jest prawdziwe to wykonane zostaną instrukcje zawarte w pętli. UWAGA: pętla w ogóle nie zostanie wykonana jeśli warunek od początku nie będzie spełniony

instr_krok – instrukcja kroku pętli, wykonywana po zakończeniu każdego obiegu (kroku) pętli. Jest to ostatnia instrukcja wykonywana bezpośrednio przed obliczeniem wyrażenia warunek

2012-05-07

12

Instrukcji sterujące

switch (zmienna) {case wartosc1: instrukcja1; break;case wartosc2: instrukcja2; break;case wartosc3: instrukcja3; break;(…) default, instrukcja_domyslna;

}

Konstrukcja switch

Przykład prostej konstrukcji switch

char opcja;cout << ”Podaj opcje! \n”; cin >> opcja;switch (opcja) {

case ‘a’: cout << ”Wybrałeś pranie!”; break;case ‘b’: cout << ”Wybrałeś płukanie”; break;case ‘c’: cout << ”Wybrałeś wirowanie!”; break;default: cout << ”Wybrałeś FULL SERVICE!”;

}

Gdy zmienna równać się będzie: wartość1 to zostanie wykonana

instrukcja1

Gdy zmienna równać się będzie: wartość2 to zostanie wykonana

instrukcja2

Gdy zmienna przyjmie wartość różną od: wartosc1, wartosc2, wartosc3…to wykonana zostanie instrukcja default

break – kończy wykonywanie każdej

instrukcji.

Instrukcji sterujące

goto etykieta;

….

etykieta: instrukcje

Przykład prostej konstrukcji goto

Instrukcja goto

cout<< ”napis!”;goto aaa;cout<< ”To się nie pojawi”;…

aaa:cout<< ”dalsza czesc napisu”;

Zasada działania instrukcji goto polega na tym iż po jej napotkaniu wykonywanie programu przenosi się do

miejsca gdzie jest dana etykieta

ETYKIETA jest to nazwa, po której nast ępuje dwukropek

Po co stosować: instrukcja goto pozwala na natychmiastowe opuszczenie wielokrotnie zagnieżdżonych pętli lub instrukcji switch

Po zastosowaniu instrukcji goto program pomija linijki kodu:

std::cout << ”To się nie pojawi”…

i przechodzi do miejsca, w którym pojawia się etykieta aaa:

2012-05-07

13

Break i continue

for (int a=1; a<10; a++) {cout<< ”B”;

if (a==5) {cout<< ”Przerywamy”break;}

}

Przykład instrukcji continue(w zastosowaniu do pętli

for, while i do while)

Przykład instrukcji break(w zastosowaniu do pętli

for, while i do while)

for (int k=0 ; k < 12 ; k=k+2) {

cout<< ”C”;if (k > 7) continue;cout<< ”D”;

}

Jeśli mamy do czynienia z kilkoma pętlami – zagnieżdżonymi jedna w

drugiej to instrukcja break przerywa tylko tę pętlę w której aktualnie się znajduje =

przejście poziom wyżej

Instrukcja continue powoduje zaniechanie wykonywania instrukcji będących dalszą treścią pętli, jednak

sama pętla nie zostaje przerwana. Continue przerywa tylko ten obieg pętli i

przygotowuje do rozpoczęcia następnego, kontynuując pracę pętli

Zadanie 1 – Napisać program do obliczania silni danej liczby

2012-05-07

14

Zadanie 2 – Napisać program obliczający rzeczywistepierwiastki równania kwadratowego

Tablice

TABLICA – ciąg obiektów tego samego typu, które zajmują ciągły obszar w pamięci

#include <iostream>using namespace std;

int main() {…

int t[4];int t[4] = {2,1,15,8};

…}

Definicja tablicy czterech elementów typu intt[0], t[1], t[2], t[3]. Rozmiar musi być wyrażony liczbą

całkowitą.

Numerowanie elementów tablicy zaczyna si ę od 0

Tablica N-elementowa ma elementy o indeksach od 0

do N-1

� Próba wpisania dowolnej wartości donieistniejącego elementu tablicy np. t[4] nie jest w języku C++ sprawdzana w czasie kompilacji = brak sygnalizacji błędu

� Próba wpisania czegoś do nieistniejącego elementu tablicy t[4] spowoduje zniszczenie w obszarze pamięci czegoś co następuje bezpośrednio za tablicą

� Inicjalizacja tablicy czterech elementów typuinteger t[0], t[1], t[2], t[3].

� Podanie rozmiaru jest opcjonalne

� Podczas inicjalizacji kompilator sprawdza czy rozmiar tablicy nie jest przekroczony. np. podaliśmy jej rozmiar = 4, a wpisaliśmy 5 elementów

2012-05-07

15

Zadanie 3 – Napisać funkcję wypisującą nieujemną liczbę całkowitą w zapisie dwójkowym

Algorytm konwersji liczby dziesiętnej na jej postać binarną opiera się na ciągłym dzieleniu jej przez 2, gdzie reszty z dzielenia tworzą reprezentację binarną danej liczby. Dzielenia dokonujemy tak długo, aż cześć całkowita z

dzielenia będzie równa 0.

Liczba Reszta210 0105 152 026 013 16 03 11 10

Realizację tego algorytmu dla liczby 210

Postać binarna: 1 1 0 1 00 1 0

Zadanie 4 – Napisz program wyszukujący maksimum wzbiorze 8 liczb

2012-05-07

16

Zadanie 5 – Napisz program obliczającym wartość średnią pewnej ilości danych oraz odchylenie standardowe od tej wartości

Zadanie 6 – Napisać program rozwiązujący układ równań 2x2 (2 równania, dwie niewiadome)

2012-05-07

17

Zadanie 7 – Napisz program sortujące zbiór n liczb wkolejności od najmniejszej do największej

Zapisywanie danych do pliku

#include <iostream>#include <fstream>Using namespace std;int main () {

ofstream my_file("zapis");int k;k=3;my_file << k << endl;my_file.close();

return 0; }

Biblioteka strumieni wej ścia-wyj ścia C++ udost ępnia łatwy sposób pracy na plikach. Oto przykład zapisu warto ści zmiennej do pliku:

Przykład koduW celu umożliwienia pracy na plikach trzeba dołączyć

bibliotekę <fstream>

Zakończenie pracy nad plikiem. Zamknięcie pliku.

W celu otwarcie pliku do zapisu trzeba utworzyć obiekt ofstream , który będzie zachowywał się podobnie do cout ! Jednak wynik nie zostanie wydrukowany na ekranie a w pliku. W poniższym przypadku tym obiektem jest my_file .

2012-05-07

18

Zapisywanie tablic do pliku

#include <iostream>#include <fstream>

Using namespace std;int main () {

ofstream my_file("zapis");int k[5]={5,6,7,3,1};int i;for (i=0;i<5;i++)

{my_file << k[i] << endl;}

my_file.close();

return 0; }

Przykład kodu

Zapisywanie kolejnych elementów tablicy do pliku zapis .

Odczytywanie danych z pliku

#include <iostream>#include <fstream>Using namespace std;int main () {

ifstream my_file(„odczyt");int k;my_file >> k ;my_file.close();

return 0; }

Przykład koduW celu umożliwienia pracy na plikach trzeba dołączyć

bibliotekę <fstream>

Zakończenie pracy nad plikiem. Zamknięcie pliku.

W celu otwarcie pliku do odczytu trzeba utworzyć obiekt ofstream , który będzie zachowywał się podobnie do cin! Jednak wartość zmiennej nie będzie czytana z klawiatury

a z pliku. W poniższym przypadku tym obiektem jest my_file .

Biblioteka strumieni wej ścia-wyj ścia C++ udost ępnia łatwy sposób pracy na plikach. Oto przykład zapisu warto ści zmiennej do pliku:

2012-05-07

19

Funkcje

Załóżmy, że pisząc program wielokrotnie musisz wykonań podobną czynność np. obliczyć wartość jakiejś funkcji dla danego argumentu! Wymagał to wielokrotnego wpisywania wzoru funkcji przy liczeniu jej wartości dla każdego argumentu! Czy można to uprościć? Tak stosując funkcje !

Po co komu funkcje?

Po co komu funkcje?

Napisałeś użyteczny fragment kodu? Chcesz go stosować wielokrotnie w bardziej złożonych programach? Możesz to zrobić stosując funkcje funkcje !

Funkcje - przykład

#include <iostream>#include <fstream>#include <cmath>using namespace std;

float f(float x){float f;f=(pow(x,2)+5)/sqrt(pow(x,2)+2)+4;

return f; }

int main(){

float k;float f(float);cout << "Podaj jakis argument:" << endl;cin >> k;cout << "Wartosc funkcji wynosi: " << f(k) << endl;

return 0;}

2012-05-07

20

Zadania - funkcje

Napisz program liczący liczbę bezwzględną (moduł) z podanej przez użytkownika liczby. Użyj poznanego zagadnienia funkcji do obliczenia modułu .

Zadanie 1

Oblicz pochodną funkcji na podanym przedziale. Wykorzystaj do tego funkcje.

Zadanie 2

[ ]2

2

17( ) , 10,10

1

x xf x x

x

−= ∈ −+

Zadania - funkcje

Podaj rozwiązanie nieliniowego równania. Wykorzystują do tego przedstawioną poniżej metodę Newtona .

Zadanie 2

kk+1 k '

k

( )

( )

f xx x

f x= −

Metoda Newtona przyjmuje następujące założenia dla funkcji

:1.W przedziale [a,b] znajduje się dokładnie jeden pierwiastek. 2.Funkcja ma różne znaki na krańcach przedziału.3.Pierwsza i druga pochodna funkcji mają stały znak w tym przedziale.

3 2( ) ( sin( 1) 1) 1f x x x x= + − − −

2012-05-07

21

Tablice wielowymiarowe*

#include <iostream>using namespace std;

int main() {…

int wektor[4] [2];…}

� Definicja tablicy wielowymiarowej

� wektor jest tablicą 4 elementów, z których każdy jestdwuelementową tablicą typu int

Zdefiniowana tablica jest tablicą dwuwymiarową. Można ją rozumieć następująco:

Wektor: (x,y)

Lp: X Y1 wektor[0] [0] wektor[0] [1]2 wektor[1] [0] wektor[1] [1]3 wektor[2] [0] wektor[2] [1]4 wektor[3] [0] wektor[3] [1]

Zapisywanie tablic wielowymiarowych do pliku

ofstream my_file(„odczyt");

int i,j, n;ifstream czytaj("odczyt");

czytaj >>n;float k[n][n];

for (i=0;i<n;i++){for (j=0;j<n;j++){

czytaj >> k[i][j];

}}

my_file.close();

Przykład kodu

Zapisywanie kolejnych elementów tablicy do pliku zapis .

2012-05-07

22

Rzutowanie

#include <iostream> Using namespace std;

int main () {

int liczba = 5, liczba2 = 2; cout << "5/2 int(bez rzutowania): " << liczba/liczba2 << endl; cout << "5/2 float(static_cast): " << static_cast<float>(liczba)/static_cast<float>(liczba2) << endl; return 0;

}

int zmienna_całkowita = static_cast<int>(zmienna_rzeczywista);

Rzutoanie proste czyli: static_cast

Przykład kodu