C Plus Plus
Advertisement


Algorytmy.

Procedura służąca rozwiązaniu problemu określona przez działania jakie należy wykonać oraz porządek w jakim te działania zostaną wykonane nosi nazwę algorytmu. Przed napisaniem programu służącego rozwiązaniu określonego problemu niezbędne jest dogłębne poznanie, zrozumienie i rozważny plan jego rozwiązania. Rozważmy taki oto przykład (bardzo często pojawiający się w różnych podręcznikach programowania) "algorytm ubierania się" : (1) załóż majtki, (2) załóż skarpetki, (3) załóż podkoszulek, (4) załóż spodnie, (5) załóż sweter, (6) załóż kurtkę, (7) załóż buty. Mamy tu wymienione działania jakie należy wykonać wyrażone w czasowniku "załóż" oraz porządek w jakim mają one być wykonane wyrażony cyframi. Gdybyśmy nie trzymali się określonego porządku wykonania działań moglibyśmy np. założyć skarpetki na buty albo majtki na spodnie. Dlatego bardzo ważny jest etap projektowania programu oraz konstruowania algorytmów, jeśli na tym etapie popełnione zostaną błędy logiczne Twój program nie będzie działał prawidłowo mimo np. właściwej składni.

Struktury sterujące.

Zazwyczaj instrukcje programu wykonywane są jedna po drugiej w porządku w jakim zostały napisane. Jest to wykonanie sekwencyjne. Język C++ pozwala programiście określić inny sposób wykonania programu tzn. kolejne wykonane wyrażenie będzie inne niż następne występujące w sekwencji jest to tzw. przekazywanie sterowania. Wszystkie programy mogą być napisane w oparciu o trzy struktury sterujące : sekwencji, wyboru, powtórzenia. Struktura sekwencji jest wbudowana w C++. Dopóki nie jest powiedziane inaczej instrukcje wykonywane są jedna po drugiej. C++ daje programiście trzy struktury wyboru :instrukcja if, instrukcja if/else oraz switch. Są również trzy struktury powtórzenia : while, do/while, for. Daje to nam w sumie siedem struktur sterujących. Słowa te są słowami kluczowymi nie mogą być one użyte jako identyfikatory, a także dla nazw zmiennych.

Struktury wyboru.

Struktura if.

Instrukcja if ma następującą składnię:

if(warunek)
{
  instrukcja;
  instrukcja;
  instrukcja;
  ...;
} 


Jeśli warunek jest prawdziwy instrukcje wewnątrz nawiasów klamrowych są wykonywane. Jeśli warunek jest fałszywy instrukcje te są pomijane. Jeśli po instrukcji if ma być wykonana tylko jedna instrukcja można pominąć nawiasy klamrowe np.:

if(ocena>=3)
  cout<<"Zdales"; 

Struktura wyboru if jest stosowana wtedy, gdy chcemy skorzystać z alternatywnych sekwencji wykonania programu. Załóżmy taki warunek:

Jeśli ocena jest równa lub większa niż 3

Wyświetl "Zdałeś"

Jeśli warunek jest prawdziwy (true) wyświetlone zostaje Zdałeś, dopiero potem zostaje wykonane następne wyrażenie w programie. Jeśli natomiast warunek jest fałszywy (false) instrukcja Wyświetl "Zdałeś" jest pomijana i wykonywane jest kolejna instrukcja. Przełóżmy teraz to, co napisałem na język C++:

// ocena.cpp - struktura wyboru if.
#include <iostream>
using namespace std;
int ocena;
int main()
{
  cout<<"Wprowadz ocene :"<<endl;
  cin>>ocena;

  if(ocena>2) cout<<"Zdales!!!"<<endl;
  //tutaj mogą następować inne instrukcje programu
  return 0;
} 
Struktura if/else.

Struktura if/else ma następującą składnię:

if(warunek)
{
  instrukcja;
  instrukcja;
  instrukcja;
  ...;
}
else
{
  instrukcja;
  instrukcja;
  instrukcja;
  ...;
} 


Jeśli warunek jest prawdziwy(true) instrukcje wewnątrz nawiasów klamrowych są wykonywane, jeśli warunek jest fałszywy(false) wykonywane są instrukcje wewnątrz nawiasów klamrowych po instrukcji else np.:

if(ocena>=3)
  cout<<"Zdales";
else
  cout<<"Nie zdales"; 

Jeśli do wykonania jest tylko jedna instrukcja to można pominąć nawiasy klamrowe. W przypadku, gdy warunek będzie prawdziwy tzn. wartość zmiennej ocena będzie równa lub większa od trzech, zostanie wyświetlony napis "Zdales", a dopiero wówczas zostaną wykonane kolejne instrukcje programu. Jeżeli warunek będzie fałszywy tzn. wartość zmiennej ocena będzie mniejsza od trzech, wyświetlony będzie napis "Nie zdales", po tym będą wykonywane kolejne instrukcje programu. Oprócz instrukcji if/else C++ dostarcza operator warunkowy (?:). Jest to jedyny operator trójargumentowy w C++. Pierwszy operand jest warunkiem, drugi jest wartością dla całego wyrażenia warunkowego jeśli warunek jest prawdziwy, a trzeci jest wartością dla całego wyrażenia jeśli warunek jest fałszywy np.:

  cout<<(ocena>=3 ? "Zdales" : " Nie zdales");

Można także wstawić tą strukturę wyboru poza funkcją main, jako dyrektywę preprocesora #if ... #endif:

  #if warunek
    instrukcje
  #endif

Z else:

  #if warunek
    instrukcje
  #else
    instrukcje
  #endif

Uwaga programiśći! W C++ nie wolno umieszczać średnika za dyrektywą preprocesora!

Struktura wyboru switch.

Składnia instrukcji:

switch (wyrażenie sterujące) 
{
  case etykieta:
    instrukcja;
    ...;
  break ;
  case etykieta:
    instrukcja ;
    ... ;
  break;
   ...
  default:
    instrukcja ;
    ... ;
} 

Struktura switch składa się z serii przypadków case i opcjonalnego przypadku default. Po słowie kluczowym switch następuje wyrażenie sterujące(jest nim np. zmienna ujęta w nawiasy). Wartość tego wyrażenia jest porównywana z każdą z etykiet case. Jeśli wynik porównania jest prawdziwy wykonane zostaną instrukcje po tym przypadku case. Instrukcja break powoduje, że wykonanie programu jest kontynuowane od pierwszej instrukcji po strukturze switch. Jeżeli nie byłoby nigdzie w strukturze switch instrukcji break to po wystąpieniu dopasowania instrukcje wszystkich pozostałych przypadków case zostaną wykonane. Jeśli nie wystąpi dopasowanie w żadnym z przypadków case, przypadek domyślny default zostanie wykonany. Każdy przypadek case może zwierać jedną lub więcej instrukcji. W przypadku case nie są wymagane nawiasy klamrowe, gdy wykonane ma być wiele instrukcji. Instrukcja switch może być stosowana tylko do testowania stałych wyrażeń całkowitych. Oto praktyczne zastosowanie struktury switch:

// ocena.cpp - struktura wyboru switch.

#include <iostream>

using namespace std;

unsigned short int ocena;

int main()
{
  cout<<"Wprowadz ocene:"<<endl;
  cin>>ocena;
  switch(ocena)
  {
   case 1:
     cout<<"Pala"<<endl;
   break;
   case 2:
     cout<<"Bardzo slabo"<<endl;
   break;
   case 3:
     cout<<"Trojka to dobra ocena"<<endl;
   break;
   case 4:
     cout<<"Czworka to bardzo dobra ocena"<<endl;
   break;
   case 5:
     cout<<"Piatka to super ocena"<<endl;
   break;
   case 6:
     cout<<"Szostka to najfajniejsza ocena"<<endl;
   break;
   default:
     cout<<"To nie jest ocena"<<endl;
  }

  //tutaj mogą następować inne instrukcje programu

  return 0;
} 


Po wprowadzeniu wartości zmiennej poprzez instrukcję cin>>ocena; struktura switch zostaje uruchomiona. Wartość wyrażenia sterującego mającego postać (ocena) porównywana jest z każdą z etykiet case. Jeśli użytkownik wprowadził np. 6, wystąpi dopasowanie (case 6:) i instrukcje dla tego przypadku zostaną wykonane (cout<<"Szostka to najfajniejsza ocena"<<endl;) wyświetlony zostanie napis "Szostka to najfajniejsza ocena" i nastąpi wyjście ze struktury switch bezpośrednio po instrukcji break;

Struktury powtórzenia.

Struktura powtórzenia for.

Struktura ta ma składnię:

for(inicjacja zmiennej; warunek kontynuacji pętli; inkrementacja/dekrementacja zmiennej) 
{
 instrukcja;
 instrukcja;
 ...;
} 

Struktura powtórzenia for jest doskonałym narzędziem wszędzie tam gdzie zachodzi potrzeba powtarzania kontrolowanego licznikiem. W strukturze for wymagane są dwa średniki. Najlepiej będzie gdy wyjaśnię na przykładzie jak działa ta struktura.

// for.cpp Powtarzanie kontrolowane licznikiem

#include <iostream>
using namespace std;
int licznik=1;
int main()
{
  for(;licznik<=100;licznik++)
    cout<<licznik<<endl;

  return 0;
} 

Gdy program rozpoczyna wykonywanie najpierw deklarowana jest(jako typ int) i inicjowana(wartością 1) zmienna licznik. Po tym, w pętli for, sprawdzany jest warunek kontynuacji pętli. Ponieważ wartość zmiennej licznik jest 1, warunek jest prawdziwy, więc wyświetlane jest 1. Następnie zmienna licznik jest inkrementowana(licznik++). Więcej o operatorach inkrementacji w dalszej części kursu. Cały ten proces jest kontynuowany, aż zmienna licznik osiągnie wartość 100. Dla struktury for nie ma znaczenia czy użyjesz pre- czy postinkrementacji. Wartość licznika zwiększana jest dopiero gdy ciało for zostanie wykonane. W przykładzie pominęliśmy parametr oznaczający inicjację, ponieważ zmienna była przed pętlą zadeklarowana i zainicjowana.

Instrukcje break i continue.

Instrukcja break kiedy jest wykonywana w strukturze for, switch powoduje bezpośrednie wyjście z tej struktury.

//break.cpp przykład użycia break
#include <iostream>
using namespace std;
short int a=1;
int main()
{

 for(;a<21;a++)
 {
   if(a==10)
     break;

   cout<<a<<" ";
 }

 return 0;
} 

Gdy wartość zmiennej a osiągnie wartość 10 pętla for zostanie przerwana.

Wyrażenie continue, kiedy jest wykonywana w strukturze while, for, do/while, switch pomija pozostałe wyrażenia w ciele tej struktury i kontynuuje następną iteracją.

//continue.cpp przykład użycia continue
#include <iostream>
using namespace std;
short int a=1;
int main()
{

  for(;a<21;a++)
  {
    if(a==10)
      continue;

    cout<<"a="<<a<<"\t";
  }

  return 0; 
}

Gdy wartość zmiennej a będzie się równała 10 dalsze wyrażenia w pętli for zostaną pominięte tzn. program wyświetli wszystkie wartości zmiennej a od 1 do 20 z pominięciem wyświetlenia wartości 10.

Operatory przypisania.

C++ zwiera różne operatory, których celem jest skrócenie wyrażeń przypisania. Np.:

a=a*3;

może zostać napisane jako :

a*=3;

Dowolne wyrażenie w postaci zmienna=zmienna operator wyrażenie może zostać przekształcone do zmienna operator=wyrażenie. Przy czym operator musi być jednym z operatorów dwuargumentowych +, -, *, /, %.

Operatory inkrementacji i dekrementacji.

W C++ wbudowane są też jednoargumentowe operatory inkrementacji i dekrementacji.

Wyrażenie w postaci ++a inkrementuje zmienną a o 1, a następnie używa nowej wartości a w wyrażeniu w którym jest a. Wyrażenie w postaci a++ najpierw używa a w wyrażeniu w którym a występuje, a następnie zwiększa a o jeden.

Wyrażenie w postaci --a zmniejsza a o jeden, a następnie używa nowej wartości a w wyrażeniu w którym a występuje. Wyrażenie w postaci a-- najpierw wykorzystuje a w wyrażeniu w którym a występuje a potem zmniejsza a o jeden.

Operatory logiczne.

C++ dostarcza również operatorów logicznych aby umożliwić nam formułowanie bardziej złożonych warunków. C++ sprawdza pod względem prawdy lub fałszu wszystkie wyrażenia, które zawierają operatory relacyjne, równości oraz operatory logiczne.

Operator iloczynu logicznego(AND).

Operator iloczynu logicznego zapisujemy: &&. Tabela prawdy dla tego operatora:

Wyrażenie1 Wyrażenie2 Wyrażenie1 && Wyrażenie2
false false false
false true false
true false false
true true true

Czyli np. mamy wyrażenie :

  if(a<10 && b==5)

Jeśli wartość pierwszego wyrażenia i drugiego wyrażenia będzie miało wartość true wartość całego wyrażenia będzie miało wartość true. Jeśli którekolwiek z tych wyrażeń będzie miało wartość false, wartość całego wyrażenia będzie miało wartość false. Operator iloczynu logicznego stosujemy wtedy, gdy chcemy się upewnić, że dwa warunki są prawdziwe.

Operator sumy logicznej(OR).

Operator sumy logicznej zapisujemy: ||. Tabela prawdy dla tego operatora pokazuje wszystkie możliwe kombinacje:

Wyrażenie1 Wyrażenie2 Wyrażenie1 || Wyrażenie2
false false false
false true true
true false true
true true true

Logiczne OR stosujemy wtedy, gdy chcemy się upewnić, że dwa warunki są prawdziwe.

Operator negacji logicznej.

Operator negacji logicznej ! jest, w przeciwieństwie do operatorów && i ||, operatorem jednoargumentowym. Operator ten ma tylko jeden warunek jako wyrażenie. Jest on umieszczany przed warunkiem np.

if(!wyrażenie==wyrażenie)

Możemy to zapisać również za pomocą operatora relacyjnego !=:

 if(wyrażenie!=wyrażenie)


Tabela prawdy dla tego operatora:

Wyrazenie !Wyrazenie
true false
false true

Ćwiczenia.

  1. Napisz program, który obliczy średnie zużycie paliwa. Program powinien pobierać liczbę przejechanych kilometrów i zatankowanych litrów przy każdym tankowaniu. Program powinien obliczyć i wyświetlić zużycie paliwa przy każdym tankowaniu, a także dla wszystkich tankowań.
  2. Napisz program wyświetlający potęgi liczby 2(2,4,8,16 ..).#
  3. Napisz program odczytujący promień koła i obliczający oraz wyświetlający średnicę, obwód oraz pole.
  4. Napisz program odczytujący 3 niezerowe wartości zmiennoprzecinkowe(float) oraz określający i wyświetlający informację, czy mogą one stanowić długość boków trójkąta.
  5. Trójkąt prostokątny może mieć boki, których długości są liczbami całkowitymi. Trójka pitagorejska musi spełniać jeden warunek: suma kwadratów dwóch boków musi być równa kwadratowi przeciwprostokątnej. Znajdź wszystkie trójki pitagorejskie dla wartości nie dłuższych niż 500.
Advertisement