c++ wykłady, C++ Wykład IV 2004 2005

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

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

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

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

e

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


Wyszukiwarka

Podobne podstrony:
C++ Wyklad II 2004 2005
C++ Wykład II 2004 2005
c++ wykłady, C++ Wykład III 2004 2005
C Wykład VI 2004 2005
C Wykład IV 2005 2006 s
AS-wyklad 2004-2005, PSC (Porownawcze Studia Cywilizacji - kulturoznawstwo), Antropologia kulturowa

więcej podobnych podstron