background image

 

 

AJ

AJ

S

S

1. 

Typy proste

 (skalary)

              -  arytmetyczne  (całkowite  i     
rzeczywiste)

       - wskaźnikowe,

    

- referencyjne. 

Typy danych w 
C++

 

2. 

Typy 

strukturalne

 

(złożone)

        - tablice,

        

- struktury,

        - unie,

        - klasy. 

     - typ wyliczeniowy,

     - typ void

 

background image

 

 

AJ

AJ

S

S

Typ referencyjny (odniesienie)

Typ referencyjny określany czasem jako 

odniesienie, służy do wprowadzenia 

dodatkowej nazwy dla obiektu użytego w 

definicji jako wartość początkowa

Referencja

 jest specjalnym 

niejawnym wskaźnikiem, który 

działa jak alternatywna nazwa 

dla zmiennej

background image

 

 

AJ

AJ

S

S

Typ referencyjny (odniesienie)

Zmienne typu referencyjnego służą do 

reprezentacji innych zmiennych w programie

czyli

wartością zmiennej typu 

referencyjnego jest inna 

zmienna

Zmienne typu referencyjnego w praktyce 

służą do przekazywania parametrów do 

funkcji oraz zwracania wartości funkcji

background image

 

 

AJ

AJ

S

S

Deklarowanie zmiennej 

referencyjnej

int x, 

&rx=x;

typ zmiennej referencyjnej i zmiennej

         

nazwa zmiennej

operator i nazwa zmiennej referencyjnej          

inicjacja 

zmiennej referencyjnej

Deklaracja zmiennej referencyjnej 

musi być połączona z jej inicjacją

background image

 

 

AJ

AJ

S

S

Deklarowanie zmiennej 

referencyjnej

double pos=56, &r_pos=pos;

zmienna 

referencyjna r_pos 
związana ze zmienną pos

int i, n=10, &ri=n;
ri=n;

 

zmienna referencyjna ri 

związana ze zmienną i 

 przyjmuje 

wartość 10

background image

 

 

AJ

AJ

S

S

Typ referencyjny - 

ograniczenia

Nie wolno konstruować: 

- referencji do referencji 

float 

&℞

- wskaźników zmiennych referencyjnych

int 

&*wsk_ref;

- tablic referencji

double 

&_ref[100];

background image

 

 

AJ

AJ

S

S

- typ 
wyliczeniowy

Służy 

do 

zadeklarowania 

grupy 

stałych 

całkowitych w zwarty sposób. 

Stałe  otrzymują  domyślnie  kolejne  wartości 
całkowite poczynając od 0.

Składnia

enum {stała1, stała2, stała3, ..., stałan};

wartość=

  0

     1                 2                  

       n

np.   enum {ford, fiat, opel, mercedes};

enum {stała1=10, stała2, stała3, ..., 

stałan};

Kolejne przyjmą wartości    11                   12            itd.  

background image

 

 

AJ

AJ

S

S

- typ wyliczeniowy i 
zmienne

Składnia (definicja nowego typu i jego zmiennych)

enum  nowy_typ  {stała1,  stała2,  ...,  stałan}  zm_1, 
zm_2=stała2;

nazwa  nowego  typu lista  stałych  wyliczeniowych

zmienne 

nowego typu z inicjacją

 

Np.  

enum miesiac {styczen, luty, marzec, kwiecień, maj, czerwiec, 

lipiec};

miesiac x=luty;

enum boolean {falsz, prawda} nie=fałsz, tak=prawda; 

    

background image

 

 

AJ

AJ

S

S

- typ void

Typ który posiada pusty zbiór wartości

Użyteczny  szczególnie  w  zastosowaniu  do 
funkcji, które nie zwracają żadnej wartości.

background image

 

 

AJ

AJ

S

S

Typy strukturalne

 

to uporządkowane, 
wspólne  zbiory 
obiektów tego 
samego lub różnego 
typu. 

2. 

Typy 

strukturalne

 

(złożone)

        - tablice,

        - 

struktury,

        - unie,

        - klasy. 

Zmienne zdolne do przechowywania 
więcej niż jednej wartości 
jednocześnie nazwano zmiennymi 
strukturalnymi (agregatami danych)

background image

 

 

AJ

AJ

S

S

Lp

marka

cena_min

cena_max

1

FORD

35000

200000

2

BMW

70000

400000

3

AUDI

80000

350000

4

SEAT

30000

120000

background image

 

 

AJ

AJ

S

S

marka

FORD

BMW

AUDI

SEAT

Lp

1

2

3

4

cena_min

cena_max

35000

200000

70000

400000

80000

350000

30000

120000

można – tablice równoległe

int lp[4]

        char marka[4][20]            float[4][2]

background image

 

 

AJ

AJ

S

S

Ale po co – lepiej struktury

Struktura

 pozwala na połączenie w jedną 

całość wielu danych różnych typów

Struktura

 jest to konstrukcja złożona z różnych danych 

(typów danych) i jest deklarowana przy użyciu słowa 

kluczowego 

struct

Struktura jest w istocie definicją nowego „pomieszanego” rodzaju 

danych.

background image

 

 

AJ

AJ

S

S

Sposób konstrukcji agregatora danych w C++ 

jakim jest  struktura używa następujących 

pojęć:

- pole rekordu (struktury) –

field 

 zmienna typu prostego 

wchodząca w skład struktury.

- wystąpienie rekordu danego typu – 

single record 

instance

 (rekord może zawierać wiele pól w ustalonej 

(predefiniowanej) kolejności.

- ponumerowana tablica –

arrey of records (DataBase 

Table)

 

złożona z rekordów.

- nowy strukturalny typ danych –

structure type 

(structural data type)

 

określony typ struktur (rekordów).

background image

 

 

AJ

AJ

S

S

Definicja nowego typu 
struktur

struct pojazd

{

  int lp;

  char marka[20];

  float cena_min;

  float cena_max;

};

Słowo 
kluczowe

Nazwa-identyfikator 
typu struktura 
(rekordu)

typ nazwa 

1

 pola struktury

typ nazwa 

2

 pola struktury

typ nazwa 

3

 pola struktury

typ nazwa 

4

 pola struktury

background image

 

 

AJ

AJ

S

S

struct pojazd   

został zdefiniowany nowy typ 

danych

przez użytkownika, który można wykorzystać do 
deklaracji zmiennych

Deklaracja zmiennej typu pojazd

   struct pojazd samochod;

może być pominięte

[opcjonalne]

nazwa nowego typu

nazwa zmiennej nowego typu pojazd

Zawiera 4 pola zdefiniowane w strukturze 
pojazd

1 pole          int lp

2 pole          char marka[20]

3 pole          float cena_min

4 pole          cena_max

background image

 

 

AJ

AJ

S

S

Odwoływanie się do poszczególnych pól struktury 
(rekordu)

Notacja z użyciem kropki (dot notation)

samochod.marka

samochod.cena_max

Zainicjowanie pól struktury (rekordu)

strcpy (samochod.marka, „FORD”);

samochod.cena_max=200000;

Dostęp do pól struktury (rekordu)

cout<<samochod.cena_max;

cout<<samochod.marka;

background image

 

 

AJ

AJ

S

S

Jeden rekord to w strukturze danych zbyt mało

 

Struktury jako elementy tablic

struct pojazd samochod[10];

(zmienna samochod może zawierać 10 rekordów)

strcpy(samochod[0].marka,”FORD”);

strcpy(samochod[1].marka,”FIAT”);

samochod[0].cena_min=30000;

samochod[0].cena_max=200000;

background image

 

 

AJ

AJ

S

S

#include<iostream.h>            

#include<iostream.h>            \\tablica złożona ze 

\\tablica złożona ze 

struktur

struktur

#include<string.h>

#include<string.h>

#include<conio.c>

#include<conio.c>

struct pojazd 

struct pojazd 

{ int lp;

{ int lp;

  

  

char marka[20];

char marka[20];

  

  

float cena_min;

float cena_min;

  

  

float cena_max;};

float cena_max;};

main()

main()

struct pojazd samochod[10];

struct pojazd samochod[10];

  

  

int i;

int i;

  

  

samochod[0].lp=1;

samochod[0].lp=1;

  

  

strcpy(samochod[0].marka,"FORD");

strcpy(samochod[0].marka,"FORD");

  

  

samochod[0].cena_min=35000;

samochod[0].cena_min=35000;

  

  

samochod[0].cena_max=200000;

samochod[0].cena_max=200000;

  

  

samochod[1].lp=2;

samochod[1].lp=2;

  

  

strcpy(samochod[1].marka,"BMW");

strcpy(samochod[1].marka,"BMW");

  

  

samochod[1].cena_min=70000;

samochod[1].cena_min=70000;

  

  

samochod[1].cena_max=400000;

samochod[1].cena_max=400000;

background image

 

 

AJ

AJ

S

S

  

  

samochod[2].lp=3;

samochod[2].lp=3;

  

  

strcpy(samochod[2].marka,"AUDI");

strcpy(samochod[2].marka,"AUDI");

  

  

samochod[2].cena_min=80000;

samochod[2].cena_min=80000;

  

  

samochod[2].cena_max=350000;

samochod[2].cena_max=350000;

  

  

samochod[3].lp=4;

samochod[3].lp=4;

  

  

strcpy(samochod[3].marka,"SEAT");

strcpy(samochod[3].marka,"SEAT");

  

  

samochod[3].cena_min=30000;

samochod[3].cena_min=30000;

  

  

samochod[3].cena_max=120000;

samochod[3].cena_max=120000;

  

  

cout<<"Lp\t"<<"marka  "<<"cena_min  

cout<<"Lp\t"<<"marka  "<<"cena_min  

"<<"cena_max"<<endl<<endl;

"<<"cena_max"<<endl<<endl;

  

  

for(i=0;i<4;i++)

for(i=0;i<4;i++)

  

  

{

{

  

  

cout<<samochod[i].lp<<'\t'<<samochod[i].marka;

cout<<samochod[i].lp<<'\t'<<samochod[i].marka;

  

  

cout<<'\t'<<samochod[i].cena_min<<'\t'<<samochod[i].cena_max

cout<<'\t'<<samochod[i].cena_min<<'\t'<<samochod[i].cena_max

<<endl;

<<endl;

  

  

}

}

  

  

getch();

getch();

  

  

return 0;

return 0;

}

}

Lp         marka      cena_min          cena_max

Lp         marka      cena_min          cena_max

1          FORD         35000               200000

1          FORD         35000               200000

2          BMW          70000               400000

2          BMW          70000               400000

3          AUDI          80000               350000

3          AUDI          80000               350000

4          SEAT          30000               120000

4          SEAT          30000               120000

background image

 

 

AJ

AJ

S

S

.lp

.lp

.marka

.marka

.cena_min

.cena_min

.cena_max

.cena_max

1

1

FORD”

FORD”

35000

35000

200000

200000

.lp

.lp

.marka

.marka

.cena_min

.cena_min

.cena_max

.cena_max

2

2

BMW”

BMW”

70000

70000

400000

400000

.lp

.lp

.marka

.marka

.cena_min

.cena_min

.cena_max

.cena_max

3

3

AUDI”

AUDI”

80000

80000

350000

350000

.lp

.lp

.marka

.marka

.cena_min

.cena_min

.cena_max

.cena_max

4

4

SEAT”

SEAT”

30000

30000

120000

120000

[0

[0

]

]

[1

[1

]

]

[2

[2

]

]

[3

[3

]

]

samochod

samochod

rekord

rekord

pole

pole

background image

 

 

AJ

AJ

S

S

FUNKCJE

Moduły (części) programu 

napisanego w C++ nazywane 

są funkcjami

Powody stosowania funkcji:

- 

najlepszy  jest  krótki  kod

      (

program  bardziej 

czytelny,  zrozumiały,  uzyskujemy  bezpośrednią  korelację  między 
algorytmem a tekstem programu

),

- 

łatwiejsze  i  szybsze  wyłapywanie  błędów 

(pluskiew – bug),

- 

moduł  napisany  raz  może  być  wielokrotnie 

wykorzystany,  może  powiększać  biblioteki 

gotowych kodów,

- 

podczas 

testowania 

uruchomienia 

programu 

można 

oddzielnie 

sprawdzać 

poszczególne funkcje a następnie uruchomić 

cały program,

- 

programowanie 

to 

gra 

zespołowa, 

poszczególne 

moduły 

tworzą 

różni 

programiści,

 

background image

 

 

AJ

AJ

S

S

Fundamentalne zasady gry 

z funkcjami w C++

Każda funkcja w C++ składa się z:

-prototypu  (prototype)  - 

musi 

się 

znajdować 

przed 

głównym 

modułem 

programu tj. przed funkcją main(),

-definicji  (defination,  ciało)  - 

znajduje 

się 

zwykle 

po 

zakończeniu 

głównego  modułu  programu  tj.  po  return  0. 

Może  znajdować  się  również  bezpośrednio 

pod prototypem funkcji.

 

background image

 

 

AJ

AJ

S

S

Prototyp funkcji w 

C++ 

float funkcja1 (int x, int y, 

float z); 

Typ danych 
wyjściowych

Dane wejściowe 

funkcji 

umieszczone w 

nawiasach  ( )

Nazwa własna 

funkcji, 

unikalna, 

niepowtarzal

na

Pamię

taj  

średni

k

Argumenty

formalne

background image

 

 

AJ

AJ

S

S

Definicja (ciało) funkcji w 

C++ 

float funkcja1 (int x, int y, float z) 
{
float a,wynik; 
a=pow(x,y);
wynik=a*z;
return wynik;
}

Nagłówek funkcji 
jest powtórzeniem 
prototypu

Zapamiętaj 

Brak średnika

Normalny kod C+

+ zawarty w ciele 

funkcji

Argumenty

formalne

background image

 

 

AJ

AJ

S

S

Wywołanie funkcji w C++ 

Y=funkcja1 

(a,b,c); 

Przy wywołaniu argumenty funkcji mogą nazywać się 
zupełnie inaczej, niż je nazywa sama funkcja w 
prototypie i definicji.

Funkcję w C++ nie obchodzi jak argument 

nazywa się w "świecie zewnętrznym".

Wywołujemy 
funkcję  poprzez 
nazwę

Przekazujemy 

funkcji 

argumenty 

aktualne

Nazwy 

rzeczywiste 

argumentów

background image

 

 

AJ

AJ

S

S

Dyrektywy preprocesora

Prototypy 
funkcji

Funkcja główna

Wywołania 
funkcji

Definicje 
funkcji

#

float Funkcja_1(int x, float y,float z);

main()

{

suma=Funkcja_1(a,b,c);

Funkcja_2(t,12);

}

float Funkcja_1(int x, float y,float z)

{

}

void Funkcja_2(int X, int DD);

void Funkcja_2(int X, int DD)
{

}

background image

 

 

AJ

AJ

S

S

Przekazywanie argumentów 

(parametrów)

 

Przekazywanie argumentów do funkcji 
polega  na  umieszczaniu  wartości 
argumentów  aktualnych  w  pamięci 
przydzielanej argumentom formalnym 
funkcji.

C++ 

parametry 

mogą 

być 

przekazywane przez:

1. wartość,

2. wskaźnik,

3. referencję. 

background image

 

 

AJ

AJ

S

S

Przekazywanie przez wartość

Polega 

na 

kopiowaniu 

wartości 

argumentów  aktualnych  do  pamięci 
argumentów 

formalnych, 

czyli 

funkcja  nigdy  nie  ma  dostępu  do 
swoich  argumentów  aktualnych  (do 
oryginałów).

Zawartość argumentów aktualnych 
przekazywanych przez wartość nie ulega 
zmianie.

Ograniczenia:

gdy przekazywany argument zajmuje duży 

obszar pamięci,
- gdy wartości argumentu muszą być 
zmieniane przez funkcję.

 

background image

 

 

AJ

AJ

S

S

Moduł główny 
main()

Moduł funkcji 
potega(x)

liczba=20;

wynik=potega(li
czba);

20

400

400

20

x

x=x*x;  zmienna x zawiera 
teraz 400    

              a wartość 21 
znikła

kopiowanie 
wartości 
zmiennej liczba 
do zmiennej x

kopiowanie 
wartości 
zmiennej x  do 
zmiennej wynik

Chociaż wartość 20 została zmieniona we wnętrzu funkcji to w module 
głównym main()

wartość zmiennej liczba nie została zmieniona

Przekazywanie przez wartość

background image

 

 

AJ

AJ

S

S

#include <iostream.h>
#include <conio.h>

double silnia (unsigned n); 

//prototyp 

funkcji

main() 
{
clrscr();
int x;
cout<<"Podaj x=";
cin>>x;
cout<<endl<<x<<"!="<<silnia(x)<<endl<<endl;

//wywolanie funkcji

getch();
return 0;
}
double silnia (unsigned n)

//definicja 

funkcji

{
unsigned i;
double wynik;
if (n!=0)
{
wynik=1;
for (i=1;i<=n;i++)
wynik*=i;
return wynik;
}
else
return 1.0;
}

Obliczanie 
silni

background image

 

 

AJ

AJ

S

S

I

double silnia 

(unsigned n)
{
unsigned i;
double wynik;
if (n!=0)
{
wynik=1;
for (i=1;i<=n;i++)
wynik*=i;
return wynik;
}
else
return 1.0;
}

//definicje funkcji silnia

II

double silnia 

(unsigned n)
{
double wynik=1;
for (;n;--n)
wynik*=n;
return wynik;
}

background image

 

 

AJ

AJ

S

S

#include <iostream.h>
#include <conio.h>
void zamiana (int x, int y); 

//prototyp funkcji

main()
{
clrscr();
int a=10, b=20;
cout<<"przed zamiana      a="<<a<<"   b="<<b<<endl<<endl;
zamiana(a,b);

//wywolanie funkcji

cout<<"po zamianie

   a="<<a<<"   

b="<<b<<endl<<endl;
getch();
return 0;
}
void zamiana (int x, int y)

//definicja funkcji

{
int pomoc=y;
y=x;
x=pomoc;
}

Niebezpieczeństwa 

gdy wartości argumentów muszą być 

zmieniane przez funkcję 

Zamiana wartości między zmiennymi

background image

 

 

AJ

AJ

S

S

Przekazywanie przez wskaźnik

Jest właściwie odmianą przekazywania 

przez wartość. Funkcja otrzymuje po 

prostu kopię wskaźnika.

Przypisanie 

wartości 

zmiennej 

wskazywanej 

przez 

parametr 

wskaźnikowy 

pozwala 

zmieniać 

wartość 

zmiennych utworzonych w innych funkcjach programu

Główne wykorzystanie:

do przekazywania dużych struktur danych 

(np. tablice, łańcuchy),

- w celu umożliwienia zwrócenia 
zmodyfikowanego argumentu przez 
funkcję,

- w celu umożliwienia zwrócenia 
zmodyfikowanej lub więcej niż jednej 
wartości przez funkcję.

 

background image

 

 

AJ

AJ

S

S

#include <iostream.h>
#include <string.h>
#include <conio.h>
char *odwroc(char *s); 

//prototyp funkcji

main()
{
clrscr();
char *lancuch="Ala ma kota";
cout<<"przed odwroceniem  "<<lancuch<<endl;
cout<<"po odwroceniu  "<<odwroc(lancuch)<<endl;

//wywołanie funkcji

getch();
return 0;
}
char *odwroc(char *s)

//definicja funkcji

{
char *st=s, *kn=s+strlen(s)-1, c;
while (st<kn)
{
c=*st;
*st=*kn;
*kn=c;
++st;
--kn;
}
return s;
}

background image

 

 

AJ

AJ

S

S

Przekazywanie przez referencję (adres)

Przekazywanie argumentów przez 

zmienne.

Operacje  są  przeprowadzane  albo  bezpośrednio 
na  zmiennej,  której  referencję  przekazano  do 
funkcji,  albo  na  zmiennej  tymczasowej,  co  ma 
miejsce 

przypadku 

niezgodności 

typu 

referencyjnego  i  zmiennej  do  której  referencja 
jest tworzona.

Powszechnie 

używa 

się 

argumentów 

referencyjnych 

do 

przekazywania 

dodatkowych wyników wywołania funkcji

background image

 

 

AJ

AJ

S

S

Moduł główny 
main()

Moduł funkcji 
potega(x)

wskaźnik

wynik=potega(li
czba);

Powoduje, że 
wskaźnik x 
wskazuje adres 
FF00 tak samo 
jak wskaźnik 
liczba

FF00

FF00

x

x=x*x;  

Powoduje, że zawartość 
adresu pamięci FF00 
zmienia się z 20 na 400.

20

400

FF00

Oryginalna 

zawartość 

została 

zmieniona 

Przekazywanie przez adres

background image

 

 

AJ

AJ

S

S

#include <iostream.h>
#include <conio.h>
void zamiana (int &x, int &y); 

//prototyp funkcji

main()
{
clrscr();
int a=10, b=20;
cout<<"przed zamiana      a="<<a<<"   b="<<b<<endl<<endl;
zamiana(a,b);

//wywolanie 

funkcji

cout<<"po zamianie

   a="<<a<<"   b="<<b<<endl<<endl;

getch();
return 0;
}
void zamiana (int &x, int &y)

//definicja funkcji

{
int pomoc=y;
y=x;
x=pomoc;
}

Gdy wartości argumentu muszą być zmieniane przez 

funkcję 

Zamiana wartości między zmiennymi

background image

 

 

AJ

AJ

S

S

#include <iostream.h>
#include <conio.h>
void zastap(double &d)

//deklaracja i definicja 

funkcji zastap

{
d=d*d;
}
main()
{
clrscr();
int i=10;
double x=10.0;
zastap(i);

//wywołanie 1 funkcji

zastap(x);

//wywołanie 2 funkcji

cout<<"i="<<i<<endl;
cout<<"x="<<x<<endl;
getch();
return 0;
}

NIEBEZPIECZEŃSTWA  przy przekazywaniu przez 

referencję

przy niezgodności typów

background image

 

 

AJ

AJ

S

S

#include <iostream.h>
#include <conio.h>
int suma_kwadratow(int x); 

 

main()
{
clrscr();
int n, wynik;
cout<<"podaj wartosc zmiennej n"<<endl;
cin>>n;
wynik=suma_kwadratow(n);
cout<<"Suma  kwadratow  dla  n="<<n<<"   

wynosi   "<<wynik;
getch();
return 0;
}
int suma_kwadratow(int x) 
{
int i, suma=0;
for (i=1;i<=x;i++)
suma+=i*i;
return suma;
}

Napisz program do obliczania następującej sumy 
1

2

+2

2

+3

2

+ ... +n

2

Prototyp 
funkcji

Wywołanie 
funkcji

Definicja 
funkcja

background image

 

 

AJ

AJ

S

S

#include <iostream.h>
#include <conio.h>
int suma_kwadratow(int x); 

 

main()
{
clrscr();
int n, wynik;
cout<<"podaj wartosc zmiennej n"<<endl;
cin>>n;
wynik=suma_kwadratow(n);
cout<<"Suma  kwadratow  dla  n="<<n<<"   

wynosi   "<<wynik;
getch();
return 0;
}
int suma_kwadratow(int x) 
{
int i, suma=0;
for (i=1;i<=x;i++)
suma+=i*i;
return suma;
}

Wykonanie programu z zastosowaniem funkcji

Wykonani

sekwencyj

ne 

programu

Wywołanie 

funkcji (skok 

do funkcji)

Powrót do 

miejsca 

wywołania 

funkcji

background image

 

 

AJ

AJ

S

S

Funkcje - co warto zapamiętać

1. Pięć powodów.
2. Prototyp 

funkcji 

musi 

zostać 

umieszczony 

przed 

początkiem 

programu  głównego  (main).  (int 

FUN1(int x, int y)

3. Format definicji funkcji w C++ jest 

bardzo 

podobny 

do 

formatu 

programu głównego.

4. Funkcja  może  być  wywoływana  z 

wnętrza  kodu  programu  głównego 

lub  z  wnętrza  innej  funkcji  (gdy 

jest globalna).

5. Funkcja  w  C++  może  zwrócić  tylko 

pojedynczy rezultat.
(Jeśli  dwa  lub  więcej  należy  użyć 

więcej  funkcji  albo  wywołać  tę 

samą funkcję kilka razy).

background image

 

 

AJ

AJ

S

S

Funkcje - co warto zapamiętać cd

6. Zmienna 

lokalna/wewnętrzna 

to 

taka 

zmienna, 

która 

została 

zadeklarowana  we  wnętrzu  danej 

funkcji.

7. Wszystko  co  zostało  zadeklarowane 

przed  użyciem  słowa  kluczowego 

main  jest  traktowane  w  C++  jako 

zewnętrzne/globalne  i  może  być 

stosowana  w  dowolnym  miejscu 

programu (przesłanianie zmiennych 

globalnych).

8. Rezultat  zwracany  przez  funkcję 

musi być typu prostego.


Document Outline