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 wskaźnikowy
(wskaźnik)
Wskaźnik (zmienna wskazująca) to
zmienna zawierająca adres początku
obszaru
pamięci,
w
którym
zapamiętane są wskazywane dane
czyli
wartością wskaźnika jest adres
zmiennej
AJ
AJ
S
S
FFOO
wskaźnik i
jego
wartość
(zawartość)
Typ wskaźnikowy
(wskaźnik)
wartością wskaźnika jest adres zmiennej
dane
F
F
O
O
miejsce w pamięci
począwszy od
bajtu o nr FF00
zawierające dane
AJ
AJ
S
S
Deklarowanie zmiennej
wskaźnikowej
(deklarowanie wskaźnika)
int
*numer;
Została zadeklarowana zmienna
numer
, która wskazuje
dane typu
int
* operator wskazania
(wyłuskania)
AJ
AJ
S
S
Deklarowanie zmiennej
wskaźnikowej
(deklarowanie wskaźnika)
Aby zmienna wskazująca podawała
adres konkretnej zmiennej na którą
ma on wskazywać należy użyć
operator adresowy (referencji)
&
,
który przypisze odpowiedni adres
zmiennej
numer=&zmien
na;
& operator adresu
(referencji)
AJ
AJ
S
S
Napisz
program,
w
którym
zadeklarujesz wskaźnik do pewnej
zmiennej oraz przypiszesz mu
odpowiedni adres.
Następnie
spraw,
aby
wartość
zmiennej
została
wypisana
na
ekranie na dwa sposoby:
1. poprzez bezpośrednie odniesienie
do zmiennej,
2. poprzez wskaźnik.
Spraw również, aby na ekranie
został wypisany adres zmiennej (na
dwa sposoby)
AJ
AJ
S
S
#include <iostream.h>
#include <conio.h>
int ala=155; //
deklaracja i inicjacja zwykłej zmiennej
ala
int *zyga; //
deklaracja wskaźnika
main()
{
clrscr();
zyga=&ala; //
inicjacja wskaźnika by wskazywał adres
zmiennej ala
cout<<"Wzrost Ali="<<ala<<endl;
cout<<"Wzrost Ali wg Zygi: "<<*zyga<<endl;
cout<<"Adres Ali="<<&ala<<endl;
cout<<"Adres Ali wg Zygi: "<<zyga<<endl;
getch();
return 0;
}
Wzrost Ali=155
Wzrost Ali wg Zygi=155
Adres Ali: 0x8f9304ce
Adres Ali wg Zygi: 0x8f9304ce
AJ
AJ
S
S
Wskaźniki i tablice
W języku C++ istnieje ścisła zależność pomiędzy
wskaźnikami i tablicami.
Każda operacja na zmiennej indeksowanej może być
wykonana za pomocą wskaźników
(za pomocą wskaźników
operacje są wykonywane szybciej).
Podczas kompilacji nazwa tablicy jest automatycznie
przekształcana na wskaźnik jej pierwszego elementu.
tab[ ]
kompilacja
wtab=tab
równoważne
wtab=&tab[0]
stała wskaźnikowa (nazwa tablicy)
zmienna wskaźnikowa
Zmienna wskaźnikowa może ulegać zmianie :
działanie
wtab=wtab+1
zmienia wskazanie na
wtab=&tab[1]
AJ
AJ
S
S
Wydruk tablicy tab przy użyciu wskaźników
#include <iostream.h>
#include <conio.h>
main()
{
clrscr();
int tab[]={0,1,2,3,4,5,6,7,8,9},*wtab;
wtab=tab;
//
lub wtab=&tab[0] poniewaz
tab==&tab[0];
for (int i=0;i<10;i++)
cout<<"tab["<<i<<"]="<<*wtab++<<endl;
getch();
return 0;
}
tab[0]=0
tab[1]=1
tab[2]=2
tab[3]=3
tab[4]=4
tab[5]=5
tab[6]=6
tab[7]=7
tab[8]=8
tab[9]=9
AJ
AJ
S
S
Kopiowanie tablicy tab1 do tab2 przy użyciu
wskaźników
#include <iostream.h>
#include <conio.h>
main()
{
clrscr();
int tab1[]={0,1,2,3,4,5,6,7,8,9},*wtab1,tab2[10],*wtab2;
wtab1=tab1;
//lub wtab1=&tab1[0] poniewaz
tab1==&tab1[0];
wtab2=tab2;
//lub wtab2=&tab2[0] poniewaz
tab2==&tab2[0];
while (wtab2<&tab2[9])
*wtab2++=*wtab1++;
wtab2=tab2;
//
cofniecie wskaznika lub wtab-=10
for (int i=0;i<10;i++)
cout<<"tab2["<<i<<"]="<<*wtab2++<<endl;
getch();
return 0;
}
AJ
AJ
S
S
Wskaźniki i tablice znaków
(łańcuchy)
W języku C++ wszystkie operacje na łańcuchach
są wykonywane za pomocą wskaźników do znaków
łańcucha.
Przypomnienie łańcuch jest ciągiem znaków zakończonych
znakiem '\0'
z tych powodów należy deklarować łańcuchy
char *tekst="ZABAWA";
char tekst[ ]="ZABAWA";
char *tekst="ZABAWA";
wtekst=&tekst[0];
//wtekst=tekst;
wtekst=wtekst+1;
//wtekst=&tekst[1]; czyli
*wtekst == 'A'
AJ
AJ
S
S
Kopiowanie łańcucha ze zmiennymi
indeksowanymi
#include <iostream.h>
#include <conio.h>
#include <string.h>
main()
{
clrscr();
char start[]="ABCD1111", cel[]="EFGH2222";
int i=0;
cout<<"Lancuch cel przed kopiowaniem: "<<cel<<endl;
for (i=0;i<strlen(start);i++)
//while ((cel[i]=start[i])!='\0')
cel[i]=start[i];
//i++;
cout<<"Lancuch cel po kopiowaniu: "<<cel<<endl;
getch();
return 0;
}
AJ
AJ
S
S
Kopiowanie łańcucha przy użyciu wskaźników
#include <iostream.h>
#include <conio.h>
main()
{
clrscr();
char *start="ABCD1111", *cel="EFGH2222", *pomoc=cel;
cout<<"Lancuch cel przed kopiowaniem: "<<cel<<endl;
while (*cel++=*start++)
;
//cel=cel-9;
cout<<"Lancuch cel po kopiowaniu: "<<pomoc<<endl;
//<<cel<<
getch();
return 0;
}
AJ
AJ
S
S
Typ referencyjny (odniesienie)
Referencja
jest czymś w rodzaju
synonimu lub odsyłacza do innej
zmiennej
(obiektu) dla której staje się
alternatywą
Wszystkie operacje na utworzonej referencji
będą również wykowywane na zmiennej
(obiekcie) którą została zainicjowana ta
referencja
Różnice
Wskaźnik
– jego wartość to adres
wskazywanej zmiennej
Referencja
– jej wartość to inna zmienna
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
double pos=56, &r_pos=pos;
zmienna referencyjna r_pos związana ze zmienną pos
int i, n=10, &ri=n;
zmienna referencyjna ri związana ze zmienną i
przyjmuje wartość 10
ri=n;
Deklaracja zmiennej referencyjnej musi być
połączona z jej inicjacją
AJ
AJ
S
S
Przypisanie do referencji
#include <iostream>
#include <conio.h>
using namespace std;
main() {
int jeden;
int &r_jeden=jeden;
jeden=10;
cout<<"jeden="<<jeden<<endl;
cout<<"r_jeden="<<r_jeden<<endl;
cout<<"adres jeden="<<&jeden<<endl;
cout<<"adres r_jeden"<<&r_jeden<<endl;
int dwa=20;
r_jeden=dwa;
cout<<"jeden="<<jeden<<endl;
cout<<"dwa="<<dwa<<endl;
cout<<"r_jeden="<<r_jeden<<endl;
cout<<"adres jeden="<<&jeden<<endl;
cout<<"adres dwa="<<&dwa<<endl;
cout<<"adres r_jeden"<<&r_jeden<<endl;
getch();
return 0;}
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
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ę.
przez
przez
adres
adres
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>
#include <conio.h>
using namespace std;
void zamien(int *x, int *y);
//prototyp funkcji
main()
{
int a=10, b=20;
cout<<"Przed zamiana a="<<a<<" b="<<b<<endl<<endl;
zamien(&a,&b);
//wywołanie
funkcji
cout<<"Po zamianie a="<<a<<" b="<<b<<endl;
getch();
return 0;
}
void zamien(int *x, int *y)
//definicja funkcji
{
int z=*x;
*x=*y;
*y=z;
}
Przekazywanie przez wskaźnik - przykład
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>
#include <conio.h>
using namespace std;
void zamien(int &x, int &y);
//prototyp funkcji
main()
{
int a=15, b=25;
cout<<"Przed zamiana a="<<a<<" b="<<b<<endl<<endl;
zamien(a,b);
//wywołanie
funkcji
cout<<"Po zamianie a="<<a<<" b="<<b<<endl;
getch();
return 0;
}
void zamien(int &x, int &y)
//definicja funkcji
{
int z=x;
x=y;
y=z;
}
Przekazywanie przez referencję - przykład
AJ
AJ
S
S
// Zwracanie wielu wartości funkcji z wykorzystaniem referencji
#include<iostream>
#include<conio.h>
using namespace std;
enum kod_bledu {pech,sukces};
//typ wyliczeniowy
kod_bledu potegi(int x, int &y, int &z);
//prototyp funkcji
main()
{ int liczba, kw, sz;
kod_bledu wynik;
cout<<"Podaj liczbe od 1 do 15 \n";
cin>>liczba;
wynik=potegi(liczba,kw,sz);
//wywołanie funkcji
if(wynik==sukces)
{
cout<<"liczba="<<liczba<<endl;
cout<<"kwadrat="<<kw<<endl;
cout<<"szescian="<<sz<<endl;
}
else
cout<<"wystapil blad !!!";
getch();
return 0;}
kod_bledu potegi (int x, int &y, int &z)
//definicja funkcji
{ if (x>15)
return pech;
else
{
y=x*x;
z=x*x*x;
return sukces;
}
}
AJ
AJ
S
S
AJ
AJ
S
S
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>
using namespace std;
int suma_kwadratow(int x);
main()
{
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
funkcji
AJ
AJ
S
S
#include <iostream>
#include <conio.h>
using namespace std;
int suma_kwadratow(int x);
main()
{
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
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.