C Wykład IV 2005 2006 s

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 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

background image

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

background image

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)

background image

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)

background image

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)

background image

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

background image

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]

background image

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

background image

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;

}

background image

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'

background image

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;

}

background image

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;

}

background image

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

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

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ą

background image

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;}

background image

AJ

AJ

S

S

Typ referencyjny -

ograniczenia

Nie wolno konstruować:

- referencji do referencji

float

&&rx;

- wskaźników zmiennych referencyjnych

int

&*wsk_ref;

- tablic referencji

double

&_ref[100];

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

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,

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.

W

C++

parametry

mogą

być

przekazywane przez:

1. wartość,

2. wskaźnik,

3. referencję.

przez

przez

adres

adres

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>
#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

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

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

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>
#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

background image

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;
}
}

background image

AJ

AJ

S

S

background image

AJ

AJ

S

S

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>
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

background image

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

background image

AJ

AJ

S

S

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


Wyszukiwarka

Podobne podstrony:
C Wykład III 2005 2006 s
C Wykład II 2005 2006 s
Szkolne Zawody Matematyczne 2005-2006, Klasa IV(1)
C++ Wykład IV 2006 2007 M Ch
Pedagogika specjalna - wykłady 2005-2006, niepełnosprawność intelektualna
nawożenie - wykład IV- 24.10.2006, semestr V
A Pojecie deficytu 2006, STUDIA, studia materiały, Finanse Publiczne, Wykład IV
C Wykład I 2005 2006 s

więcej podobnych podstron