Wstęp do programowania w języku C++
Informacje podstawowe
ALGORYTM to przedstawienie rozwiązania zadania w sposób uporządkowany,
tj. z wyszczególnieniem kolejnych czynności.
Program napisany w języku programowania jest jednym ze sposobów zapisu algorytmu.
W języku C, C++ dozwolone jest używanie niżej wymienionych znaków:
A - Z - wielkie litery (bez polskich znaków)
a - z - małe litery (bez polskich znaków)
0 - 9 - cyfry
spacja . , : ; ' $ "
# % & ! _ {} [] () < > |
+ - / * =
Z tych znaków możemy budować nazwy, które będziemy używać w naszych programach. Każda nazwa przed użyciem musi zostać zadeklarowana, czyli musimy poinformować kompilator z jakim typem obiektu, po napotkaniu naszej nazwy, ma do czynienia.
Język C/C++ należy do języków o swobodnym formacie. Pisząc program instrukcje umieszcza się jedna po drugiej w kolejności zależnej od realizowanego algorytmu. Miejsce instrukcji w pisanej linii jest dowolne. Może być ona napisana na początku, w środku, rozbita na kilka linii. Jej koniec (instrukcji) nie jest oznaczony przez przejście do nowej linii, lecz przez średnika. Musi się on znaleźć zawsze na końcu naszej instrukcji.
Napisany przez nas program nie jest w takiej postaci zrozumiały przez komputer. Musi zostać przetłumaczony na język maszynowy. Tym zajmuje się kompilator. Niestety to jeszcze nie wszystko. W naszym programie bowiem występować będą biblioteki, czyli gotowe funkcje.
W trakcie kompilacji sprawdzane jest jedynie odwołanie do bibliotek. Jeżeli kompilacja przebiegnie poprawnie uruchamiany jest linker, czyli taki program, który zlinkuje, czyli połączy nasz program i treść funkcji bibliotecznych. Dopiero teraz otrzymamy gotowy do uruchomienia program.
Typy zmiennych
W języku C/C++ mamy do dyspozycji następujące typy zmiennych:
podstawowe, inaczej fundamentalne,
pochodne, jakby wariacje na temat typów fundamentalnych.
Inny podział typów, to:
typy wbudowane, w które nasz język jest wyposażony,
typy zdefiniowane przez użytkownika, które sami wymyślimy.
My zajmiemy się typami podstawowymi. Możemy je podzielić na typy reprezentujące:
liczby całkowite:
short int, inaczej short,
int,
long int, inaczj long,
znaki alfanumeryczne:
char,
liczby zmiennoprzecinkowe:
float,
double,
long double.
Zarówno typy reprezentujące liczby całkowite, jak i znaki alfanumeryczne, mogą wystąpić
w dwóch wariantach. Mogą być ze znakiem, piszemy wówczas signed, lub bez znaku - unsigned.
W tabeli zebrano określenia typów wraz z zakresem przyjmowanych wartości i liczbą zajętych bajtów.
Nazwa typu |
Typ |
Zakres |
Wielkość (w bajtach) |
Uwagi |
char |
całkowity(znaki) |
-128 … 127 |
1 |
|
unsigned char |
całkowity(znaki) |
0..255 |
1 |
|
int |
całkowity |
-231..231-1 |
4 |
Na kompilatorach 16 bitowych ma 2 bajty |
unsigned int |
całkowity |
0 … 4,294,967,295 |
4 |
Na kompilatorach 16 bitowych ma 2 bajty |
short int |
całkowity |
-32768..32767 |
2 |
|
unsigned short int |
całkowity |
0 … 65535 |
2 |
|
long int |
całkowity |
-2,147,483,648 ... 2,147,483,647 |
4 |
|
unsigned long int |
całkowity |
0 ... 4,294,967,295 |
4 |
|
float |
zmiennoprzecinkowy |
3.4 x 10-38 ... 3.4 x 10+38 |
4 |
6 znaków precyzji |
double |
zmiennoprzecinkowy |
1.7*10-308..1.7*10+308 |
8 |
10 znaków precyzji |
long double |
zmiennoprzecinkowy |
3.4*10-4932..1.1*104932 |
10 |
|
Do typów pochodnych zaliczamy:
tablice - tablica, macierz obiektów danego typu,
wskaźnik - obiekt, w którym można umieścić adres innego obiektu w pamięci,
funkcja - podprogram, grupa instrukcji zdefiniowana i zastąpiona nazwą,
referencja - przezwisko jakiegoś obiektu,
void - z ang. próżny, stoi w miejscu zwykle zajmowanym przez typ.
Deklaracje
Deklaracje zmiennych
Pisząc program często wykonujemy różne operacje na liczbach chcemy nie tylko. Nie chcemy jednak napisać programu, który wykonuje swoje działanie dla jednych, konkretnych, ściśle określonych danych. Dlatego musimy umieścić w naszym programie zmienne, które zastąpią nam konkretne liczby i umożliwią napisanie programu pozwalającego na szersze jego zastosowanie. Miejsce, w którym umieścimy deklaracje zmiennych jest dowolne. Wymagane jest jedynie,
by deklaracja wystąpiła przed wywołaniem zmiennej. Możemy więc zadeklarować zmienne
na początku programu umieszczając wszystkie deklaracje razem. Możemy też umieścić je między poszczególnymi instrukcjami programu, czyli tuż przed miejscem, w którym użycie danej zmiennej okaże się niezbędne.
Deklaracja zmiennej w programie wygląda tak:
typ_zmiennej nazwa_zmiennej;
gdzie:
typ_zmiennej - jeden z typów dostępnych w języku,
nazwa_zmiennej - nazwa, jaką nadaliśmy naszej zmiennej, nie może być to słowo kluczowe języka i byłoby dobrze, gdyby była związana z zastosowaniem, przeznaczeniem naszej zmiennej.
Przykłady:
Deklaracja stałych
Jeżeli w programie mamy elementy, których wartości nie mogą ulec zmianie, to nazywamy je obiektami stałymi. Na przykład liczba π, która może być wykorzystywana przy obliczaniu obwodu i pola koła. Możemy ją zdefiniować nadając jednocześnie odpowiednią wartość.
float pi=3.14;
Jednakże może się zdarzyć, że w innej części programu przez roztargnienie zmienimy wartość pi. Żeby mieć pewność, że taka sytuacja nie zaistnieje, powinniśmy poprzedzić naszą definicję słowem kluczowym const. W ten sposób powstanie definicja obiektu stałego.
const float pi=3.14;
W tym momencie też inicjalizujemy wartość naszej liczby pi. Nie możemy tego zrobić później. Obiekty zadeklarowane i zainicjowane ze słowem const nie mogą być w żaden sposób
w programie zmieniane.
Inicjalizacja - nadanie wartości obiektowi w momencie jego powstania, deklarowania.
Budowa programu
Ogólny układ programu w C jest następujący:
Dyrektywy preprocesora
Deklaracje ogólne
deklaracje zmiennych
deklaracje typów funkcji
Main()
{
lokalne zmienne funkcji main;
instrukcje do wykonania;
}
Definicje funkcji
Wszystkie programy pisane w C muszą zawierać przynajmniej jedną funkcję, choć zwykle mają ich więcej. W każdym programie musi wystąpić funkcja o nazwie main.
Funkcja main jest pierwszą funkcją, która jest wykonywana, gdy program jest uruchamiany. Program kończy działanie z zakończeń wykonywania ostatniej instrukcji funkcji main.
A teraz kilka ogólnych uwag dotyczących pisania programu w C:
Dyrektywy preprocesora to specjalne polecenia, które powodują odpowiednią kompilację programu, a jednocześnie nie mają wpływu na jego przebieg po kompilacji. Pierwszym opisanym poleceniem będzie #include. Powoduje ono dołączenie do naszego programu pliku z kodem źródłowym, który chcemy wykorzystać w naszym programie.
Deklaracje zmiennych nie mają ściśle określonego miejsca. Wygodnie jest je umieszczać razem w jednym miejscu. Na pewno muszą wystąpić przed swoim pierwszym wywołaniem. Zależnie od miejsca deklaracji mają różny zasięg dostępności.
Z funkcjami postępujemy podobnie jak ze zmiennymi. Muszą zostać zadeklarowane przed swoim pierwszym wywołaniem. Należy pamiętać o średniku za deklaracją funkcji.
Jak już zostało napisane w programie musi wystąpić funkcja main. Jej położenie
w programie jest dowolne. Na pewno za to zostanie uruchomiona jako pierwsza ze wszystkich funkcji naszego programu.
Wewnątrz funkcji umieszczane są zmienne lokalne, czyli takie, które ważne są jedynie
w obrębie tej funkcji. Podobnie, jak zmienne ogólne, muszą zostać zadeklarowane przed swoim pierwszym użyciem.
Oprócz deklaracji funkcji, czyli informacji, że w programie znajduje się funkcja określonego typu o danej nazwie, wykorzystująca opisane zmienne, musi się również znaleźć definicja funkcji.
Definicja funkcji to nazwa funkcji, jej typ, zmienne przekazywane i zwracana wartość oraz instrukcje, które są wykonywane przez naszą definiowaną funkcję. Instrukcje muszą znaleźć się w nawiasach klamrowych, lecz za zamykającym nawiasem nie stawiamy średnika.
Najprostszy program:
#include <stdio.h>
main()
{
printf („Witam i o zdrowie pytam”);
}
Powyższy program wypisuje na ekranie tekst „Witam i o zdrowie pytam”. Można napisać jeszcze prostszy program, który nie będzie niczego wykonywał. Wystarczy opuścić w naszym programie funkcję printf. Tylko wtedy nie zobaczymy żadnego efektu działania programu.
Jakie są jego elementy składowe?
Na początek dyrektywy preprocesora, które muszą być poprzedzone znakiem #, a ich pisanie musimy rozpocząć w pierwszej kolumnie tekstu. Tu nie ma dowolności.
#include <stdio.h> - dołącza bibliotekę, w której umieszczone są prototypy funkcji umożliwiających wprowadzanie i wyprowadzanie informacji do i z naszego programu, czyli takie programy, które są odpowiedzialne za kontakt ze światem zewnętrznym. Jest to plik nagłówkowy stdio.h. Instrukcja ta musi znaleźć się przed funkcją main. Nazwę nagłówka umieszczamy w ostrych nawiasach (< >). Takie podanie nazwy oznacza, że plik nagłówka będzie szukany na dysku systemowym, który zawiera resztę aplikacji. Niektóre książki podają inną postać nagłówka:
#include "stdio.h"
“” - oznacza, że pliku nagłówkowego należy szukać w aktualnym katalogu. Będzie to prawdą, gdy napiszemy własny plik nagłówkowy, ale standardowe pliki powinny być podawane
w ostrych nawiasach.
Uwaga: nie używaj średnika do oddzielania plików nagłówka, ale nie zapomnij o znaku #
w pierwszej kolumnie.
W naszym programie nie zadeklarowaliśmy żadnych zmiennych, gdyż nie były one potrzebne. Przejdziemy teraz do kolejnej części programu.
Pierwsza linia jest standardowym początkiem wszystkich programów C - main(). Po niej znajduje się instrukcja w nawiasach klamrowych { }. Te nawiasy oznaczają początek i koniec listy instrukcji, które tworzą program - w tym przypadku jest tylko jedna instrukcja. Średnik ; oznacza koniec instrukcji.
Można się zastanowić, dlaczego nawiasy klamrowe są w różnych liniach, a nie w jednej. Można nasz program zapisać w postaci:
main(){printf("Witam i o zdrowie pytam ");}
lecz w ten sposób się raczej nie pisze, jest on bowiem mało czytelny.
Funkcja printf działa tak, jak sugeruje jej nazwa: drukuje, na ekranie, wszystko to, co się jej każe. Zobaczmy, jakie są jej możliwości.
Wprowadzanie i wyprowadzanie informacji
Wyprowadzanie informacji - instrukcja printf
Instrukcja ta umożliwia wyprowadzenie tekstu lub liczby na ekran monitora. Kursor po wykonaniu instrukcji pozostanie na końcu wyprowadzanego tekstu. Jej postać jest następująca:
printf(”ciąg_sterujący”, lista_zmiennych);
gdzie
ciąg_sterujący - ciąg znaków, zwykle sterujących, podany w cudzysłowie,
lista_zmiennych - nazwa zmiennej lub wielu zmiennych oddzielonych przecinkami, których wartość ma być wyświetlona na ekranie.
Bardzo ważnym elementem tej funkcji jest właśnie ciąg_sterujący, bowiem w nim zawarta jest informacja o typie i sposobie wyprowadzania zmiennych podanych w funkcji printf.
W naszym przykładzie wyświetlony ma zostać tylko tekst, podajemy go w cudzysłowie i nie dodajemy żadnych informacji o sposobie wyświetlania zmiennych. Po prostu ich nie ma.
Jednakże bardzo często niezbędne jest wyświetlenie na ekranie wyniku liczbowego, czyli wartości naszej zmiennej. Wtedy nasza funkcja przybierze postać
printf(”ciąg_sterujący_%typ_zmiennej”, lista_zmiennych);
Funkcja analizuje ciąg_sterujący począwszy od pierwszego znaku. Wyświetla napotkane znaki tak długo, aż pojawi się znak %, który jest sygnałem, że w podanej specyfikacji funkcji podana jest również zmienna, której wartość ma zostać wyświetlona. Typ_zmiennej mówi, że wyświetlana wartość zmiennej jest oznaczona jako typ_zmiennej i zostanie zamieniona na odpowiadający tej postaci ciąg znaków. Funkcja analizuje kolejne znaki, jeśli jest to tekst, to wyświetla go znak po znaku, aż znów napotka znak %. Ponownie wyświetla wartość zgodnie z podaną specyfikacją
i idzie dalej. Kończy swoje działanie wtedy, gdy napotka drugi ”.
Należy zwrócić uwagę na to, by wyspecyfikowany typ był więc zgodny z typem zmiennej, jaki został zadeklarowany dla niej w programie. Jeżeli bowiem zechcemy wyświetlić jako Integer (zmienna tego typu zajmuje dwa bajty) zmienną typu Double (ta zmienna zajmuje osiem bajtów), to zostaną wykorzystane do tego celu jedynie dwa pierwsze bajty informacji.
W tabeli zestawione zostały wybrane oznaczenia typów zmiennych dla funkcji printf.
Określenie formatu dla %
Oznaczenie |
Typ |
Objaśnienie |
%c |
char |
Pojedynczy znak, litera |
%d (%i) |
int |
Liczba całkowita ze znakiem w systemie 10 |
%e (%E) |
float lub double |
Liczba w formacie wykładniczym |
%f |
float lub double |
Liczba zmiennoprzecinkowa ze znakiem |
%g (%G) |
float lub double |
Wybiera krótszy format %f lub %e |
%o |
int |
Liczba wyświetlana w systemie ósemkowym bez znaku |
%s |
tablica znaków |
Ciąg znaków |
%u |
int |
Liczba całkowita bez znaku |
%x (%X) |
int |
Liczba wyświetlana w systemie HEX bez znaku |
%% |
|
Znak % |
Dodatkowo funkcja printf pozwala na formatowanie wyświetlanego tekstu, czyli na jego ułożenie na ekranie. W poniższych tabelkach zestawione zostały flagi, kody sterujące i znaki specjalne, które należy umieścić w celu uzyskania odpowiedniego wyglądu informacji na ekranie.
Flagi:
- |
wyrównuje do lewej, standardowo do prawej |
+ |
zawsze wyświetla znak liczby |
Kody sterujące wypisywaniem tekstu i znaki specjalne:
\b |
przesuń w lewo o znak (backspace) |
\n |
nowa linia |
\f |
nowa strona |
\t |
pozioma tabulacja, kursor przesunięty o wielkość tabulatora w prawo |
\ r |
przesunięcie do początku linii, powrót karetki |
\v |
tabulator pionowy |
\” |
znak ”, bez \ oznaczałby koniec ciągu sterującego |
\\ |
znak \, czyli backslash |
\' |
apostrof |
\? |
znak zapytania |
Dodatkowo można określać sposób wyświetlania samej liczby, czyli z ilu znaków powinna się składać i ile mieć miejsc po przecinku. Składnia jest wtedy następująca:
„% [flagi] [szerokość].[precyzja] [wielkość] typ_zmiennej”
gdzie
szerokość - liczba wszystkich znaków liczby, jeśli podana liczba znaków jest większa niż liczba znaków liczby, to dodane zostaną spacje, w przeciwnym wypadku liczba nie zostanie obcięta; jeżeli poprzedzimy ten parametr zerem (0), to brakujące do długości znaki zostaną uzupełnione zerami;
precyzja - liczba wyświetlonych miejsc po przecinku;
wielkość - czy liczba jest typu long (%ld) czy short (%hd).
Przykłady:
printf("Total = %+d",total); - na ekranie pojawi się napis Total = , a za nim wartość zmiennej total wyświetlona jako liczba całkowita w systemie dziesiętnym.
Funkcja printf analizuje ciąg sterujący od lewej strony do prawej. Ponieważ początek jest zwykłym tekstem wypisuje go znak po znaku. Po napotkaniu znaku % dostaje wiadomość, że teraz nastąpi informacja o sposobie wyprowadzenia zmiennej na ekran. Analizuje teraz kolejno znaki znajdujące się po %. W naszym przypadku będzie wyprowadzać na ekran liczbę w postaci całkowitej ze znakiem
w systemie dziesiętnym. Jest to pierwsza wyprowadzana wartość zmiennej. Przechodzi do kolejnego znaku ciągu sterującego. Teraz jest to ", funkcja kończy analizę ciągu, więcej zmiennych nie będzie
i odczytuje nazwę zmiennej, której wartość ma wyświetlić w formacie podanym w funkcji printf. Wyświetla wartość zmiennej, nie zmieniając po wyprowadzeniu położenia kursora, kończy działanie funkcji printf.
printf("%+6.2f ", x) - na ekranie zostanie wyświetlona wartość zmiennej x ze znakiem („+” - jeśli dodatnia, „-„ - dla ujemnej), będzie miała ona 6 cyfr, w tym dwie
po przecinku; -
Wprowadzanie informacji - instrukcja scanf
Instrukcja ta umożliwia wprowadzenie danych z zewnątrz (np. z klawiatury) do uruchomionego programu. Ważne jest, że scanf zamienia ciąg znaków na wartość im odpowiadającą, umieszczoną
w odpowiednim miejscu pamięci. Postać instrukcji jest następująca:
scanf(„ciąg_sterujący”,&zmienna1,&zmienna2,...);
gdzie
ciąg_sterujący - podawany jest w cudzysłowie, określa, w jaki sposób ciąg znaków (zwykle podawany z klawiatury) powinien zostać zamieniony na liczbę przyporządkowaną zmiennej;
&zmienna- adres zmiennej, gdzie przechowywana jest jej wartość, tam zostanie umieszczona liczba po jej konwersji z wprowadzonych znaków; nazwę zmiennej obowiązkowo należy poprzedzić znakiem &.
Wprowadzając dane możemy:
Pisać je w jednej linii oddzielając je spacjami,
Przechodzić do nowej linii (enter) po wprowadzeniu jednej wartości zmiennej.
Przykład:
scanf(„%d %d”,&k,&j); - oznacza wprowadzenie (wczytanie) dwóch wartości całkowitych do k
i j. Liczby mogą być podane (napisane) w tej samej linii, musi między nimi wystąpić przynajmniej jedna spacja, lub w różnych liniach tak długo, aż zostanie podany ostatni znak liczby.
Podobnie jak printf, również scanf potrzebuje informacji o typie wprowadzanej wartości. Służą
do tego te same określenia.
Instrukcja przypisania
To jedna z najważniejszych instrukcji każdego języka programowania. Pozwala na nadanie zmiennej określonej wartości, obliczenie wyrażeń matematycznych, przypisanie zmiennej wyniku działania funkcji.
Operatorem przypisania jest znak równości =.
Przy pisaniu tej instrukcji należy pamiętać, że nazwa zmiennej, której przyporządkowywać będziemy wartość wyrażenia, musi znajdować się po lewej stronie instrukcji. Za znakiem = podajemy przyporządkowywane wyrażenie.
Składnia
zmienna = wyrażenie;
Wykonanie instrukcji powoduje przypisanie zmiennej, stojącej po lewej stronie symbolu =, wartości wyrażenia zapisanego po prawej jego stronie. Wyrażenie musi być tego samego typu, co zmienna.
Przykład:
i = i + 1; //nieprawdziwe matematycznie, oznacza, że wartość zmiennej i zostanie zwiększona o 1
x = 3; //w zmiennej x znajdzie się wartość 3
Operatory arytmetyczne, relacji, logiczne
Operatory arytmetyczne
Do realizacji działań arytmetycznych stosowane są przedstawione w tabeli operatory dwuargumentowe:
Znak |
Opis |
+ |
Dodanie dwóch wartości |
- |
Odjęcie jednej wartości od drugiej |
/ |
Podzielenie jednej wartości przez drugą |
* |
Pomnożenie jednej wartości przez drugą |
% |
Reszta z dzielenia dwóch liczb, dzielenie modulo |
Dodatkowo możemy wykorzystywać w programie dwa operatory jednoargumentowe:
++ |
Inkrementacja, zwiększenie o 1 |
-- |
Dekrementacja, zmniejszenie o 1 |
Operatory te mogą przyjąć dwie formy:
przedrostkową, np. ++a, operator po lewej stronie zmiennej, najpierw zmienna jest zwiększana o 1, potem wartość zwiększona staje się wartością wyrażenia,
końcówkową, np. a++, operator stoi po prawej stronie zmiennej, najpierw wyrażenie przyjmuje starą wartość zmiennej, a następnie zwiększa się o 1 wartość zmiennej, nie wpływa ona na wartość wyrażenia.
Operatory logiczne
Język C pozwala również na realizację działań logicznych.
Mamy trzy podstawowe działania logiczne. Są to AND (iloczyn logiczny, koniunkcja), OR (suma logiczna, alternatywa) i NOT (negacja, czyli przeczenie). Analizują one zmienne i w wyniku swego działania dają wartość logiczną TRUE (PRAWDA) lub FALSE (FAŁSZ). W niżej przedstawionych tabelach znajdują się oznaczenia poszczególnych operacji, jak również ich tabele prawdy, czyli, dla jakich kombinacji wartości porównywanych zmiennych przyjmują wartość PRAWDA, a dla jakich FAŁSZ.
Operacja |
Oznaczenie |
OR |
|| |
AND |
&& |
NOT |
! |
A |
B |
OR |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
1 |
A |
B |
AND |
|
0 |
0 |
0 |
|
0 |
1 |
0 |
|
1 |
0 |
0 |
|
1 |
1 |
1 |
|
A |
NOT |
||
0 |
1 |
||
1 |
0 |
W przedstawionych tabelach A i B oznaczają zmienne, na których realizowano działania logiczne. Jeżeli wartość zmiennej była równa PRAWDA, to oznaczano to liczbą 1, w przypadku FAŁSZU wartość zmiennej w tabeli równa była 0. Takie same oznaczenia przyjęte zostały dla wyników działania operacji logicznych.
Operatory relacji
Do porównań stosowane są przedstawione w tabeli operatory:
Znak |
Opis |
> |
większe niż |
< |
mniejsze niż |
>= |
większe lub równe |
<= |
mniejsze lub równe |
== |
równe (podwójny znak równości) |
!= |
nie równe, różne |
Pętla for ()
Pamiętać należy, że pętla for stosowana jest wszędzie tam, gdzie z góry wiemy, ile razy daną operację musimy powtórzyć.
Składnia:
for(inicjalizacja_pętli; warunek_końca; krok)
{
instrukcje do wykonania;
}
gdzie:
inicjalizacja_pętli - oznacza ustawienie licznika pętli na wartość początkową, jest wykonywana przed pierwszym uruchomieniem pętli,
warunek_końca - warunek zakończenia działanie pętli, jest sprawdzany przed każdym obiegiem pętli, gdy jest różny od zera, wykonywane są instrukcje pętli,
krok - instrukcja wykonywana na końcu każdego obiegu pętli, zwiększa lub zmniejsza o zadany w tym miejscu krok wartość licznika pętli.
Jak działa pętla for?
Otóż na początku wartością początkową zostaje zainicjowany licznik pętli. Określony jest warunek zakończenia działania pętli oraz krok, z jakim ma się zmieniać licznik przy każdym obrocie pętli. Program przechodzi teraz do wykonania instrukcji, które mają być zrealizowane w każdym przebiegu pętli.
Jeżeli jest więcej instrukcji do wykonania, należy je umieścić w nawiasach klamrowych zaraz za instrukcją for. Po wykonaniu instrukcji zwiększany (lub zmniejszany) jest automatycznie licznik pętli o zadany krok i sprawdzany warunek zakończenia pętli. Jeżeli warunek zakończenia działania pętli nie jest spełniony, ponownie wykonywane są zadane w pętli instrukcje. Znów zwiększany (zmniejszany) jest licznik pętli i sprawdzany warunek jej zakończenia. Działania te są powtarzane tak długo, aż zostanie spełniony warunek zakończenia pętli. Wtedy program przejdzie
do wykonania kolejnej zapisanej w nim instrukcji.
W niżej przedstawionych przykładach pokazane zostały zastosowania pętli do wyświetlania z góry zadanej liczby informacji, jak również wynik działania poszczególnych pętli.
Przykłady:
for(i=1;i<=6;i++)
{ printf("%d",i);
}
for(i=1;i<=6;i=i+2)
{printf("%d",i);
}
for(i=6;i>0;i--)
{printf("%d",i);
}
Pętla do ... while ...
Składnia:
do
{
instrukcje;
modyfikacja warunku;
} while (warunek);
gdzie
do, while - słowa kluczowe oznajmiające początek i koniec pętli,
warunek - warunek, którego niespełnienie przerywa działanie pętli,
instrukcje - instrukcje, które mają być wykonane w czasie działania pętli,
modyfikacja warunku - zmiana zmiennej wykorzystanej w warunku, w celu zakończenia działania pętli.
Instrukcja ta realizuje działanie pętli warunkowej.
Wykonanie instrukcji uzależnione jest od spełnienia podanego po słowie kluczowym while warunku. Istotne tu jest, że instrukcje te zostaną wykonane przynajmniej raz, ponieważ warunek sprawdzany jest dopiero na końcu pętli. Koniecznie należy też pamiętać o modyfikacji warunku wewnątrz pętli. Jeśli tego nie zrobimy, program może wykonywać naszą pętlę w nieskończoność
i nigdy nie zakończy swojego działania. A przecież nie jest to naszym celem.
i = 10;
do
{scanf(“%c”, znak);
printf(“wprowadzony znak = %c,\n”, znak);
i++;
} while (i != 13)
Instrukcja while
while(warunek)
{
instrukcje;
modyfikacja warunku;
}
gdzie
while - słowo kluczowe oznaczające początek pętli warunkowej,
warunek -,niespełnienie warunku przerywa działanie pętli,
instrukcje - instrukcje, które mają być wykonane w czasie działania pętli,
modyfikacja warunku - zmiana zmiennej wykorzystanej w warunku, w celu zakończenia działania pętli.
Instrukcja ta, podobnie jak do - while, realizuje działanie pętli warunkowej. Wykonanie instrukcji uzależnione jest od spełnienia podanego po słowie kluczowym while warunku. Istotne tu jest, że wyrażenie jest sprawdzane zanim instrukcje zostaną wykonane. Jeżeli wyrażenie jest prawdziwe instrukcje są wykonywane. W przeciwnym razie nie zostaną wykonane. Koniecznie należy też pamiętać o modyfikacji warunku wewnątrz pętli. Jeśli tego nie zrobimy, program może wykonywać naszą pętlę w nieskończoność i nigdy nie zakończy swojego działania. A przecież nie jest to naszym celem.
Instrukcje w {}wykonywane są tak długo, dopóki spełniony jest warunek.
Przykład:
i = 1;
while (i != 13)
{
scanf(“%c”, znak);
printf(“wprowadzony znak = %c,\n”, znak);
i++;
}
Instrukcja warunkowa if ...
Instrukcja if sprawdza warunek podany w nawiasie okrągłym. Warunek może być złożony, zawierać operatory logiczne. Jeżeli warunek jest spełniony (wyrażenie logiczne ma wartość 1),
to jest wykonywana instrukcja, która występuje zaraz po nawiasie warunku lub blok instrukcji podany w nawiasach klamrowych. Jeżeli natomiast warunek nie jest spełniony, to zależnie od tego, czy zdefiniujemy instrukcje wykonywane w przypadku FAŁSZ, czy też nie, będą one wykonywane. W związku z tym postać instrukcji może przyjąć dwie formy:
if(warunek) intrukcje_gdy_prawda;
lub też
if(wyrażenie_warunek)
{
intrukcje_gdy_prawda;
}
else
{
instrukcje_gdy_fałsz;
}
Na rysunkach przedstawiono schematy blokowe dla obu form instrukcji.
Jak widać pierwszy przypadek dotyczy sytuacji, w której określone zostało zachowanie programy tylko w przypadku spełnienia podanego w instrukcji warunku. Jeżeli warunek nie zostanie spełniony, instrukcje_gdy_prawda zostaną pominięte i program przejdzie do instrukcji znajdujących się dalej.
W drugim przypadku zdefiniowane zostało nie tylko zachowanie programu w sytuacji spełnienia warunku, lecz również w przypadku jego niespełnienie. Instrukcje do wykonania podane zostały po słowie else.
Przykład:
if (liczba < Min or liczba > Max) liczba = 0;
if (bok< 0)
{
printf(“Bok trojkata rownobocznego nie moze byc ujemny”);
}
else
{
printf(“Obwod trojkata wynosi %f”,3*bok);
}
Instrukcja wyboru switch
Instrukcja wyboru switch stosowana jest wówczas, gdy mamy wiele możliwości wyboru. Wtedy zamiast kilku instrukcji warunkowych if wykorzystuje się jedną instrukcję switch.
Postać instrukcji jest następująca:
switch(warunek)
{
case wartość1: instrukcje1; break;
case wartość2: instrukcje2; break;
case wartość3: instrukcje3; break;
…
default: instrukcje; break;
}
Program sprawdza warunek podany w nawiasach okrągłych i porównuje go z podanymi
w instrukcji wartościami. Jeżeli napotka odpowiednią wartość, wykonuje związane z nią polecenia, po czym kończy działanie instrukcji switch i przechodzi do następnej instrukcji programu. Jeżeli nie napotka odpowiedniej wartości, wtedy wykonuje instrukcje związane z opcją default.
Przykład
#include <stdio.h>
main()
{
int i;
printf("Liczba między 1 i 4");
scanf("%d",&i);
switch (i)
{
case 1:
printf("jeden");
break;
case 2:
printf("dwa");
break;
case 3:
printf("trzy");
break;
case 4:
printf("cztery");
break;
default:
printf("Liczba spoza zakresu");
} /* end of switch */
}
Funkcje
Funkcje w języku C(C++) są odpowiednikiem podprogramów lub procedur w innych językach. W języku C (C++) mamy do czynienia jedynie z funkcjami.
Funkcja jest po prostu grupą instrukcji, które zostały razem zgrupowane i nadano im nazwę. Zaletą takiego działania jest to, że taką grupę instrukcji możesz wielokrotnie wykorzystać pisząc jedynie nazwę.
Nawet w najprostszym programie możemy napisać funkcję, która będzie pisała na ekranie słowa „Dzien dobry:
Demo()
{
printf("Dzien dobry");
}
Tak napisana funkcja nosi nazwę definicji funkcji. Na końcu instrukcji, po ostatnim nawiasie (klamrze) nie stawia się średnika.
Jeśli funkcja jest już zdefiniowana, można jej użyć w programie:
main()
{
demo();
}
I właśnie napisanie demo(); jest równoznaczne z napisaniem w odpowiednim miejscu programu wszystkich instrukcji związanych z naszą funkcją. Tu byłoby tylko wypisanie tekstu na ekran.
Jak wcześniej wspomniano, definicja funkcji może znaleźć się w dowolnym miejscu, ale przed wywołaniem należy podać jej deklarację.
Deklaracja funkcji w C oraz C++ zawiera nazwę funkcji oraz typy przekazywanych jej argumentów i zwracanej wartości.
Napiszmy funkcję obliczającą kwadrat liczby całkowitej. Jej definicja będzie następująca:
int kwadat(short a)
{
return a*a;
}
A oto przykład deklaracji tej funkcji:
int kwadrat (short);
Deklaracja ta mówi kompilatorowi, że w programie pojawi się funkcja o nazwie kwadrat, że funkcja będzie przy wywołaniu potrzebowała jednego argumentu typu short (opis typów argumentów znajduje się w temacie 4) i będzie zwracała (wyliczała) wartość typu int.
Definicja funkcji przypomina jej deklarację, z tą jednak różnicą, że zawiera ona treść, (ciało) funkcji. Ciało funkcji jest zbiorem instrukcji zamkniętym w nawiasie klamrowym. Nawiasy klamrowe symbolizują początek oraz koniec bloku kodu.
Wartością zwracaną przez funkcję nazywamy wartość, którą ta funkcja wylicza i przekazuje do miejsca programu, skąd została wywołana. W szczególnym przypadku funkcja może nie wyliczać żadnej wartości. Podobnie funkcja może, choć nie musi, wymagać przy wywołaniu podania określonych argumentów.
W określeniu tym wyjaśniono termin „definicja funkcji” ale także drugi bardzo ważny termin: „ciało funkcji”. Ciało funkcji, będące zbiorem instrukcji, decyduje o tym jakie czynności i operacje realizuje dana funkcja.
Proszę zwrócić uwagę, że deklaracja funkcji kończyła się znakiem średnika, natomiast w definicji funkcji, po jej nazwie i liście argumentów w nawiasach okrągłych, średnik nie występuje (umieszczanie go tam jest początkowo częstym błędem!).
Słowa kluczowe
Słowa kluczowe mają w języku C++ określone znaczenie. W tabeli zebrane zostały niektóre potrzebne słowa kluczowe wraz z ich wyjaśnieniem.
Słowo |
Znaczenie: |
Przerywa działanie pętli, i nie powoduje ponownego sprawdzenia warunku. |
|
Rodzaj zmiennej |
|
Definiuje stałą. Wymagana wartość |
|
Przerywa wykonywanie pętli, ale powoduje ponowne sprawdzenie warunku |
|
Rodzaj zmiennej |
|
Rodzaj zmiennej |
|
Pętla |
|
Skok bezwarunkowy |
|
Instrukcja warunkowa |
|
Wstawia cały kod funkcji w miejsce gdzie została ona wywołana |
|
Rodzaj zmiennej |
|
Rodzaj zmiennej |
|
Powoduje zakończenie działania funkcji i ewentualnie zwrócenie wartości |
|
Rodzaj zmiennej |
|
Określa zmienną z elementami ujemnymi |
|
Zwraca rozmiar obiektu |
|
Określa blok definiujący struktury |
|
Instrukcja warunkowa |
|
typedef |
Umożliwia nadanie nowego typu zmiennej |
Definiuje zmienną z elementami dodatnimi |
|
Określa typ niezdefiniowany |
|
Pętla |
Biblioteki C++ i ich zawartość
stdio.h: funkcje wejścia i wyjścia:
getchar() zwraca następny znak napisany na klawiaturze
putchar() wyprowadza pojedynczy znak na ekran
printf() jak opisana wcześniej
scanf() jak opisana wcześniej
string.h: Funkcje łańcuchowe
strcmp() porównuje ciąg1 i ciąg2
strcpy() kopiuje zawartość ciągu2 do ciągu1
ctype.h: Funkcje znakowe
isdigit() zwraca wartość różną od zera jeśli argument jest liczbą od 0 do 9
isalpha() zwraca wartość różną od zera jeśli argument jest literą z alfabetu
isalnum() zwraca wartość różną od zera jeśli argument jest literą lub liczbą
islower() zwraca wartość różną od zera jeśli argument jest mała literą
isupper() zwraca wartość różną od zera jeśli argument jest wielką literą
math.h: Funkcje matematyczne
acos() zwraca arc cosinus argumentu
asin() zwraca arc sinus argumentu
atan() zwraca arc tangent argumentu
cos() zwraca cosine argumentu
exp() zwraca logarytm naturalny z e??
fabs()zwraca wartość bezwzględną liczby
sqrt()zwraca pierwiastek kwadratowy liczby
time.h: Funkcje czasu i daty
time()zwraca aktualną datę kalendarzową systemu
difftime()zwraca różnice między dwoma czasami w sekundach
clock()zwraca liczbę cykli zegara systemowego od początku wykonywania programu
stdlib.h:Miscellaneous functions Funkcje różnorodne
rand() opisana wcześniej
srand() używana do restartu punktu początkowego funkcji rand()
Język programowania C++ 4/16
Język programowania C++
fałsz
prawda
modyfikacja warunku
warunek
instrukcje
N
T
instrukcje
i ← i + 1
i <= n ?
i ← 0
fałsz
prawda
modyfikacja warunku
warunek
do
instrukcje
fałsz
N
prawda
T
instrukcje_gdy prawda
warunek
fałsz
N
prawda
T
instrukcje_gdy_prawda
instrukcje_gdy_fałsz
warunek