wstęp do programowania w c++
TRANSCRIPT
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