Powtórzenie wiadomości z C++

Download Report

Transcript Powtórzenie wiadomości z C++

Robert Nowak
Programowanie
strukturalne i obiektowe
C++
Powtórzenie wiadomości z C++
Schemat prostego programu
#include <iostream>
using namespace std;
int main()
{
instukcje;
return 0;
}
Dyrektywy preprocesora
Wszystkie dyrektywy preprocesora poprzedzone są znakiem
#. Wszystkie dyrektywy preprocesora są wykonywane przez
specjalny program zwany preprocesorem stąd ich nazwa.
Najczęściej wykorzystywaną dyrektywą preprocesora jest
dyrektywa include – służy ona do dołączania plików
nagłówkowych. Każdy z tych plików rozszerza możliwości
C++.
Dzięki plikowi iostream możemy wypisywać zarówno
liczby jak i tekst oraz wczytywać w prosty sposób dane
wprowadzane przez użytkownika programu.
Przestrzenie nazw
Wraz z rozwojem języka ilość bibliotek stale rosła,
a unikatowych nazw dla funkcji i zmiennych zaczynało
brakować. Wymyślono wówczas przestrzenie nazw, mające
zapobiegać problemowi nakładania się nazw. Dawniej, aby
wyświetlić tekst wystarczyło napisać:
cout<<"napis"<<endl;
teraz natomiast trzeba pisać
std::cout<<"napis"<<std::endl;
lub poinformować kompilator, że chcemy używać przestrzeni
nazw std bez przedrostka. Linijka, którą informujemy kompilator
o takiej zmianie to:
using namespace ...;
gdzie za wielokropek wstawiamy nazwę przestrzeni.
Główna funkcja programu - main
Kiedy uruchamiamy nasz program, zaczyna on wykonywać
kod zawarty w funkcji main(). Od niej więc rozpoczyna się
działanie aplikacji – a nawet więcej: na niej też to działanie
się kończy. Zatem program (konsolowy) to przede
wszystkim kod zawarty w funkcji main() – determinuje on
bezpośrednio jego zachowanie.
Funkcja ta musi mieć zawsze nazwę main – tak ktoś sobie
wymyślił, że główna funkcja programu tak się nazywa i tak
już pozostało do dzisiaj.
Najprostsza funkcja main (która nic nie robi), wygląda
tak:
int main()
{
return 0;
}
Jeśli chcemy, aby nasz program cokolwiek wykonał,
musimy umieścić dodatkowy kod pomiędzy { oraz
return 0;
Operacje Wejścia/Wyjścia
Do wypisywania i wczytywania danych używamy tzw.
strumieni.
cout - obsługuje wyprowadzanie danych na
standardowe wyjście, czyli ekran.
cin - obsługuje wprowadzanie danych ze
standardowego wejścia, czyli klawiatury.
Używamy do tego dodatkowo operatorów wstawiania
<< i pobrania >> danych do i ze strumienia.
Zatrzymanie wykonywania
programu
Aby obejrzeć wyniki wykonania programu używaliśmy
funkcji getchar(), która służy do wczytywania znaków
z klawiatury. W naszym przypadku zatrzymywała
wykonywanie programu do naciśnięcia dowolnego
klawisza
Określenie typu zmiennej
W języku C++ musimy jawnie określić typ zmiennej.
Określenie typu zmiennej jest bardzo proste.
Symbolicznie, robi się to następująco:
nazwa_typu nazwa_zmiennej;
Określenie nazwa_typu to typ, jaki będziemy chcieli, aby
miała nasza zmienna. Tutaj nie możemy wpisać
dowolnego słowa. Typy w języku C++ są określone
i musimy użyć jednego ze specjalnych słów.
Z kolei nazwa_zmiennej to nazwa, jaką wymyślimy dla
zmiennej. Nazwa zmiennej to tzw. identyfikator.
Podstawowe typy liczbowe
Podstawowe typy liczbowe występujące w języku C++ to:
- typ całkowity, zakres wartości: -2147483648
÷ 2147483647, zajmuje 4 bajty pamięci
float
- typ zmiennopozycyjny (ułamkowy), zakres
wartości: 1,2 10-38 ÷ 3,4 1038 dokładność 7
cyfr, zajmuje 4 bajty pamięci
double - typ zmiennopozycyjny podwójnej precyzji
(dokładniejszy niż typ float), zakres wartości:
2,2 10-308 ÷ 1,8 10308 dokładność 15 cyfr,
zajmuje 8 bajty pamięci
int




Typ znakowy
Typ znakowy umożliwia przechowywanie jednego znaku.
Typ znakowy w języku C++ to:
char - typ znakowy
Znaki zapisujemy w pojedynczych cudzysłowach '
(apostrofach). Na przykład poniższa instrukcja spowoduje
wypisanie litery a, spacji, a następnie litery b.
cout <<'a'<<' '<<'b';
Czym są operatory
Operatory w C++ pełnią funkcję podobną jak operatory
w matematyce. Umożliwiają one po prostu
przeprowadzanie różnych działań na zmiennych.
Samych grup operatorów jest co najmniej kilka, dlatego
czas je poznać, bowiem bez nich dalsza nauka języka
nie będzie możliwa.
Najważniejszy operator – operator
przypisania
Jednym z najważniejszych operatorów w języku C++ jest
operator przypisania. Operator ten umożliwia
przypisywanie wartości danej zmiennej.
= operator przypisania (to nie jest operator równości!)
Aby dokonać przypisania, po lewej stronie operatora
musimy mieć nazwę zmiennej, a po prawej stronie
wyrażenie którego wartość chcemy przypisać zmiennej.
zmienna = wyrażenie;
Operatory arytmetyczne
Kolejną grupę stanowią operatory arytmetyczne.
Operatory te działają jak znane z matematyki operatory.
Oto lista dostępnych operatorów arytmetycznych:
+
*
/
%
operator dodawania,
operator odejmowania,
operator mnożenia,
operator dzielenia,
operator reszty z dzielenia (zwany operatorem modulo)
+
operator znaku liczby (np. +3), liczba domyślnie jest
zawsze dodatnia
operator znaku liczby (np. -45, -5.678).
-
Instrukcja złożona
Instrukcją złożoną nazywa się sekwencję instrukcji ujętą
w parę nawiasów klamrowych:
{
instrukcja-1;
instrukcja-2;
...
instrukcja-n;
}
W składni języka taka sekwencja jest traktowana jako
jedna instrukcja. Instrukcje złożone mogą być
zagnieżdżane.
Instrukcja warunkowa „jeśli”
Ogólna postać instrukcji „jeśli” jest następująca:
if (wyrażenie) instrukcja
lub
if (wyrażenie) instrukcja1;
else instrukcja2;
gdzie wyrażenie musi wystąpić w nawiasach okrągłych,
zaś żadna z instrukcji nie może być instrukcją deklaracji.
Opis działania instrukcji „jeśli”
Wykonanie instrukcji if zaczyna się od obliczenia
wartości wyrażenia. Jeżeli wyrażenie ma wartość
różną od zera (prawda), to będzie wykonana instrukcja
(lub instrukcja1); jeżeli wyrażenie ma wartość zero
(fałsz), to w pierwszym przypadku instrukcja jest
pomijana, a w drugim przypadku wykonywana jest
instrukcja2. Każda z występujących tutaj instrukcji
może być instrukcją prostą lub złożoną, bądź instrukcją
pustą.
Pierwsza postać instrukcji „jeśli” nazywana jest
instrukcją warunkową „jeśli” prostą, a druga instrukcją
warunkową „jeśli” z alternatywą.
Operatory relacyjne
Operatory relacyjne (dwuargumentowe) służą do
konstrukcji wyrażeń porównania. Operatorami tymi są:
==
!=
<
>
<=
>=
„równy”
„nierówny”
„mniejszy”
„większy”
„niewiększy” lub „jest zawarty”
„nie mniejszy” lub „zawiera”
Wynik wyrażenia porównania jest typu bool i posiada
wartość 0, gdy relacja jest prawdziwa oraz wartość 1, gdy
relacja jest fałszywa.
Operatory logiczne
Operatory logiczne służą do wykonywania operacji
logicznych na wartościach typu bool. Operatorami tymi są:
&&
i
!
nie
||
lub
Instrukcje iteracyjne
Instrukcje iteracyjne umożliwiają wielokrotne
wykonywanie pewnych sekwencji instrukcji, czyli pętli,
które są podstawą programowania.
W języku C++ są trzy instrukcje iteracyjne:
instrukcja „dla” (for),
instrukcja „dopóki” (while),
instrukcja „wykonuj dopóki” (do… while)
Instrukcja „dla” (for)
W porównaniu z analogiczną instrukcją pascalową,
instrukcja „dla” języka C++ ma szersze możliwości i jest
bardziej elastyczna. Jej ogólna postać przedstawia się
następująco:
for (w.-inicjujące; w.-warunkowe; w.-zwiększające)
instrukcja
Wyrażenie inicjujące może być dowolnego rodzaju,
najczęściej jest ono wyrażeniem wyliczeniowym,
zawierającym listę inicjacji liczników pętli. Język C++
dopuszcza w wyrażeniu inicjującym również deklaracje
zmiennych.
Wartość wyrażenia warunkowego musi być typu
skalarnego, zaś wyrażenia zwiększające mogą być
dowolnymi poprawnymi wyrażeniami języka C++. Każde
z wyrażeń występujących w instrukcji „dla” może zostać
pominięte.
Wykonywanie pętli „dla”
Wykonywanie pętli „dla” odbywa się w następujący sposób:
1. Obliczane są wyrażenia inicjujące, co najczęściej
powoduje zainicjowanie liczników pętli.
2. Obliczane jest wyrażenie warunkowe, jeśli jest ono
niezerowe (prawda) wykonywana jest instrukcja
związana z instrukcją for.
3. Obliczane są wyrażenia zwiększające, co powoduje
zwykle zwiększenie lub zmniejszenie liczników pętli.
4. Ponownie obliczane jest wyrażenie warunkowe, jeżeli
jego wartość jest różna od 0 – wykonywane są ponownie
czynności z punktu 2.
Instrukcja „dopóki” (while)
Ogólna postać instrukcji „dopóki” (while):
while (wyrażenie-warunkowe) instrukcja
Instrukcja instrukcja jest wykonywana do momentu, kiedy
wyrażenie warunkowe osiągnie wartość 0 (fałsz), czyli
instrukcję while można by przetłumaczyć: dopóki
wyrażenie warunkowe ma wartość oznaczającą prawdę
(różne od zera), wykonuj instrukcję instrukcja.
Instrukcja „wykonuj dopóki”
(do… while)
Ogólna postać instrukcji „wykonuj dopóki” (do… while)
przedstawia się następująco:
do
instrukcja
while (wyrażenie-warunkowe);
Instrukcja instrukcja jest wykonywana do momentu, gdy
wyrażenie warunkowe osiągnie wartość zero (fałsz).
Instrukcję do…while można więc przetłumaczyć jako:
wykonuj instrukcję instrukcja, dopóki wartość
wyrażenia warunkowego oznacza prawdę. Instrukcje tę
stosujemy zamiast instrukcji while wówczas, gdy zależy
nam, aby wykonana została przynajmniej jedna iteracja.
Postać instrukcji wyboru
Instrukcja wyboru ma następującą postać ogólną:
switch (wyrażenie-sterujące) instrukcja
Instrukcja switch działa podobnie (ale nie tak samo), jak
instrukcja case znana z Pascala. Na podstawie wartości
wyrażenia sterującego pozwala ona przenieść
wykonywanie programu do wskazanego miejsca.
Wyrażenie sterujące musi być typu całkowitego, zaś
instrukcja instrukcja jest dowolną instrukcją języka C++.
Zwykle jednak instrukcja wyboru przybiera postać:
switch (wyrażenie-sterujące)
{
etykieta-wyboru instrukcje
…
etykieta-wyboru instrukcje
}
Etykieta wyboru może przyjąć jedną z postaci:
case wyrażenie-stałe-typu-całkowitego:
default:
Etykieta default jest nazywana domyślna etykietą wyboru.
W obrębie jednej instrukcji wyboru nie wolno stosować
etykiet zawierających wyrażenia stałe o tej samej wartości.
Wykonanie instrukcji wyboru
Wykonanie instrukcji wyboru polega na obliczeniu
wartości wyrażenia sterującego i kontynuowaniu
wykonywania programu począwszy od etykiety
wyboru, której wyrażenie stałe ma wartość równą
obliczonej wcześniej wartości wyrażenia sterującego.
Jeśli żadne z wyrażeń stałych nie spełnia tej równości,
wówczas wykonywany jest skok do miejsca
określonego domyślną (default) etykietą wyboru lub
jeśli jej nie ma – wykonywanie instrukcji wyboru ulega
zakończeniu.
Uwaga
Po wykonaniu skoku do etykiety wyboru wykonywane są
kolejno instrukcje programu bez względu na występujące
po drodze etykiety wyboru. Jeśli więc skok nastąpił do
pierwszej z dziesięciu etykiet wyboru, wykonane zostaną
również instrukcje związane z pozostałymi etykietami.
Za pomocą instrukcji break można wymusić zakończenie
wykonywania instrukcji wyboru np. W momencie
zakończenia wykonywania instrukcji dla danego
przypadku.
Przykład 1
switch
{
case
case
case
case
case
case
case
case
case
case
case
case
}
(miesiac)
1
2
3
4
5
6
7
8
9
10
11
12
:
:
:
:
:
:
:
:
:
:
:
:
dni=31;
dni=28;
dni=31;
dni=30;
dni=31;
dni=30;
dni=31;
dni=31;
dni=30;
dni=31;
dni=30;
dni=31;
break;
break;
break;
break;
break;
break;
break;
break;
break;
break;
break;
break;
Przykład 2
…
char z;
…
switch (z)
{
case ‘w’ : cout<<"wysoki"
break;
case ‘n’ : cout<<"niski";
break;
default : cout<<"nijaki"
}
Pojęcie tablicy
Tablica jest złożoną strukturą danych, składającą się
z określonej liczby elementów tego samego typu.
Dostęp do elementów jest możliwy za pośrednictwem
indeksu(ów) – liczby (liczb) określającej położenie
elementu w tablicy.
Deklaracja tablicy
Deklaracja tablicy N-wymiarowej (zwanej także zmienną
tablicową) o wymiarach wymiar1, wymiar2,…, wymiarN
wygląda następująco
typ-elemetu-tablicy ident-tablicy[wymiar1][wymiar2]…[wymiarN]
Wymiar tablicy, który określa liczbę elementów zawartych
w tablicy, jest ujęty w parę nawiasów prostokątnych i musi
być większy lub równy jedności. Jego wartość musi być
wyrażeniem stałym typu całkowitego, możliwym do
obliczenia w fazie kompilacji; oznacza to, że nie wolno
używać zmiennej dla określenia wymiaru tablicy.
Dostęp do elementów tablicy
Najprostszym sposobem dostępu do elementu tablicy jest
podanie jego pozycji (indeksu(ów)) w nawiasach
kwadratowych, np. tablica [20][11] .
Należy pamiętać, że w języku C++ pierwszy element
tablicy ma wszystkie indeksy równe zero – dostęp do
pierwszego elementu tablicy wygląda następująco:
tablica[0]…[0].
W ten sposób pozycję ostatniego elementu tablicy
określają indeksy
[wymiar1-1]…[wymiarN-1]
Funkcje
Funkcją nazywamy wyodrębnioną część programu, stanowiącą
pewną całość, posiadającą jednoznaczną nazwę i ustalony
sposób wymiany informacji z pozostałymi częściami
programu. Funkcje są stosowane do wykonania czynności,
które mogą być wykorzystane w różnych programach lub
i wykonania czynności wielokrotnie powtarzanych przez dany
program. W przypadku programów rozwiązujących obszerne
problemy, w których wyróżnić można kilka podprogramów,
zastosowanie funkcji umożliwia opracowanie każdego z tych
podproblemów oddzielnie. Wystarczy wówczas dla
zbudowania programu zestawić funkcje oraz odpowiednio je
połączyć.
Definicja funkcji
Składnia definicji funkcji jest następująca:
<typ> identyfikator-funkcji (lista-deklaracji-parametrów)
{
instrukcje
}
Definicja funkcji składa się z nagłówka funkcji oraz z jej
ciała. Nagłówek przypomina prototyp funkcji, w którym
wszystkie parametry muszą być nazwane a na końcu
nagłówka nie występuje średnik. Ciało funkcji jest ujętym
w nawiasy klamrowe zestawem instrukcji. Ostatnią
instrukcją przed nawiasem klamrowym zamykającym
blok funkcji musi być instrukcja return.
Instrukcja return
Instrukcja return występuje często w postaci:
return wyrażenie;
gdzie wyrażenie określa wartość zwracaną przez funkcję.
Jeżeli typ tego wyrażenia nie jest identyczny z typem
funkcji, to kompilator będzie próbował osiągnąć zgodność
typów drogą niejawnych konwersji. Jeżeli okaże się to
niemożliwe, to kompilacja zostanie zaniechana. Zgodność
typu zwracanego z zadeklarowanym typem funkcji można
również wymusić drogą konwersji jawnej.
Funkcja typu void
Jeżeli funkcja jest typu void to nie zwraca ona żadnej
wartości i odnosząc się do języka programowania Pascal
możemy ja nazwać procedurą, chociaż zawodowi
programiści języka C++ nie stosują tej nazwy tylko taką
funkcję nazywają funkcją nie zwracającą wyniku
(wartości).
Zmienne w programie i funkcjach
Zmienne zadeklarowane na zewnątrz funkcji nazywamy
zmiennymi globalnymi, a zmienne opisane wewnątrz
funkcji – zmiennymi lokalnymi.
Rozróżnienie to wynika ze sposobu przydziału pamięci.
Wszystkie zmienne globalne umieszczane są w tzw.
segmencie danych, dla którego pamięć przydzielana jest
raz, w chwili rozpoczęcia wykonywania programu.
Zmienne lokalne umieszczane są w tzw. segmencie
stosowym. Przy każdorazowym wywołaniu procedury lub
funkcji zmiennym lokalnym przydzielana jest w stosie
pamięć, a po zakończeniu wykonywania procedury lub
funkcji, pamięć jest zwalniana.