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
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
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
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ą
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
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];
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.
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;
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.
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)
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
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]
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.
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).
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
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
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;
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;
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;
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
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
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
i
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,
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.
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
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
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
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)
{
}
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.
W
C++
parametry
mogą
być
przekazywane przez:
1. wartość,
2. wskaźnik,
3. referencję.
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ę.
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ść
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
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;
}
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
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ę.
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;
}
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
w
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
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
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
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
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
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
e
sekwencyj
ne
programu
Wywołanie
funkcji (skok
do funkcji)
Powrót do
miejsca
wywołania
funkcji
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).
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.