WYKAAD 6 (2014) Podstawy programowania 1 (dr.inż Marcin Głowacki) 1
PODSTAWY
PROGRAMOWANIA
Wykład 6
PROWADZCY: dr inż. Marcin Głowacki
E-Mail: Marcin.Glowacki@pwr.wroc.pl
Pok.907 C-5
Wrocław 2014
WYKAAD 6 (2014) Podstawy programowania 1 (dr.inż Marcin Głowacki) 2
6. ZASIG DOSTPNOÅšCI ZMIENNYCH:
Zmienne:
·ð Globalne majÄ… zasiÄ™g ogólny dostÄ™pne wszÄ™dzie w programie, posiadajÄ… rezerwacjÄ™ w
pamięci operacyjnej i swój stały adres
·ð Lokalne powoÅ‚ywane do życia wewnÄ…trz funkcji, znikajÄ… po zakoÅ„czeniu funkcji
(tworzone tymczasowo na stosie w pamięci operacyjnej). Przesłaniają inne zmienne o tych
samych nazwach (patrz przykład)
·ð Statyczne definiowane wewnÄ…trz funkcji zachowujÄ… wartość do nastÄ™pnego wywoÅ‚ania
tej samej funkcji
PRZESAANIANIE ZMIENNYCH GLOBALNYCH:
Nazewnictwo zmiennych lokalnych nie jest dowolne, ponieważ zmienne globalne o tych
samych nazwach zostają przesłonięte przez nowe definicje, ale ich czas życia jest ograniczony
do wnętrza funkcji. Po zakończeniu funkcji zmienne lokalne znikają bezpowrotnie. Bierze się to
stąd, że są one tworzone tymczasowe na strukturze stosu w pamięci operacyjnej komputera.
Przykładowy program:
#include
int k=50, j=10; //zmienne globalne z nadaną wartością początkową
int fnFunkcja(void) {
return (k+100); //obszar zasięgu zmiennej globalnej k=150
}
int main() {
using std::cout; using std::endl;
int k=3; //zmienna lokalna k w funkcji main
cout<< Dla lokalnego k: <}
Wynik : ? >113, 160<
WYKAAD 6 (2014) Podstawy programowania 1 (dr.inż Marcin Głowacki) 3
Przykładowy program:
#include
int i=10, j=200, k=300; //zmienne globalne
void fnFun(void) {
using std::cout; using std::endl;
int i =4; //przesłonięcie nazwy globalnej
static int j=0; //przesłonięcie nazwy globalnej zmienna static
i++; j++;k++;
cout<<"W fnFun(): I= "<Wynik: a: 110 b: 210
}
x: 10 y: 10
int main(){
using std::cout; using std::endl;
int x=10, y=10;
fnZwieksz(x,y); //nie spowoduje zmiany wartości x i y w funkcji main()
cout << x: <return 0;
}
UWAGA: Można to obejść używając wewnątrz funkcji zmiennych globalnych, ale nie podając
ich jako argument wywołania, lecz wykonując jedynie operacje na nich.
#include
int x=10, y=10; //zmienne globalne
void fnZwieksz(int a, int b) {
using std::cout; using std::endl;
x=a+100;
y=b+200;
cout << " a: "<Wynik: a: 10 b: 10
}
x: 110 y: 210
int main(){
using std::cout; using std::endl;
fnZwieksz(x,y); //nie spowoduje zmiany wartości x i y w funkcji main()
cout << x: <return 0;
}
ARGUMENTY FUNKCJI - przekazywanie argumentów przez adres
Poprzednio poznaliśmy przekazywanie parametrów funkcji przez wartość. Były na to
przykłady, które pokazywały, że zmienne nawet o tej samej nazwie nie mają ze sobą nic
wspólnego jedynie ich wartość przekazywana jest do wnętrza funkcji.
WYKAAD 6 (2014) Podstawy programowania 1 (dr.inż Marcin Głowacki) 5
Przykład:
void fnZwieksz(int a, int b) {
a +=100;
b+=200;
}
Wywołanie:
int x = 10, y = 10;
fnZwieksz(x,y); //nie zmienia wartości x i y
Efekt: //bez zmian: x = 10, y=10
1. Wykorzystać referencję (C++) symboliczne przekazanie adresu
Referencja jest interesującym rozszerzeniem w języku C++, która umożliwia zadeklarowanie
funkcji z argumentami, które są adresami do zmiennych znaczek ampersand & jest symbolem
adresu. Przetwarzanie w funkcji odbędzie się na danych spod adresu wskazanego w referencji,
zatem na komórkach pamięci oryginalnych zmiennych, które były użyte przy wywołaniu funkcji,
a nie na ich kopiach tworzonych na stosie.
Przykład z referencją
void fnZwiekszRef(int &a, int &b){ // Zmienia się jedynie deklaracja funkcji z użyciem znaku &
a+=100;
b+=200;
}
Wywołanie:
int x = 10, y = 10;
fnZwiekszRef(x,y); // zmienia wartość x i y
Efekt: x=110, y=210
2. Wykorzystać wskazniki (C, C++) przekazywanie adresu przez wskazniki
(wskazniki zostaną szerzej omówione pózniej)
Przykład ze wskaznikami
void fnZwiekszInny (int *a, int *b) {
*a+=100;
*b+=200;
}
Wywołanie:
int x=10, y =10;
fnZwiekszInny(&x,&y); //zmienia wartość x i y
Efekt: x=110, y=210
WYKAAD 6 (2014) Podstawy programowania 1 (dr.inż Marcin Głowacki) 6
Przykład - zamiana wartości argumentów:
void fnZmien(int &a, int &b){
int pom=b;
b=a;
a=pom;
}
Wywołanie:
int x=10, y=30;
fnZmien(x,y);
Efekt: x=30, y=10
WYKAAD 6 (2014) Podstawy programowania 1 (dr.inż Marcin Głowacki) 7
ARGUMENTY FUNKCJI main:
Argumenty funkcji main() są skojarzone z parametrami wywołania programu:
nazywanymi liniÄ… komend lub wierszem polecenia
int main () lub int main (void) bez parametrów,
int main(int argc, char *argv[]) dwa parametry:
·ð argc liczba argumentów wywoÅ‚ania programu (>=1)
·ð argv tablica wskazników do tekstów argumentów
//Program wypisze liczbę oraz zawartość wszystkich argumentów funkcji main()
#include
int main(int argc, char *argv[]) {
using std::cout; using std::endl;
cout<< Program <for(int i=1;i cout<< Argument\t <return 0;
}
Wywołanie programu: funkcje_5.exe argument1 argument2 argument3
Wynik:
Program ścieżka\ funkcje_5.exe ma 3 argumentów.
Argument 1 to argument1
Argument 2 to argument2
Argument 3 to argument3
Aby kontynuować, naciśnij dowolny klawisz . . .
UWAGA: Trzeba pamiętać, żeby dokonać ustawień dla linii komend w kompilatorze, np. w Dev-
C++ w okienku Compilation przycisk Parameters.
WYKAAD 6 (2014) Podstawy programowania 1 (dr.inż Marcin Głowacki) 8
ARGUMENTY FUNKCJI Z WARTOÅšCI DOMYÅšLN
Podczas definicji funkcji można przypisać domyślne (początkowe) wartości argumentów funkcji
void fnSuma(int a=10, int b=20, int c=30, int d=40){
....
}
Wywołanie tej funkcji może się odbyć z niepełną liczbą parametrów:
fnSuma(1,2); //a=1, b=2 i domyślnie c=30 i d=40
= równoważne =
fnSuma(1,2,30,40);
UWAGA: Możemy pominąć tylko wszystkie argumenty począwszy od tego,
którego pominiemy jako pierwszy.
WYKAAD 6 (2014) Podstawy programowania 1 (dr.inż Marcin Głowacki) 9
PRZECIŻANIE FUNKCJI
Nadajemy te same nazwy funkcjom, które realizują analogiczne operacje,
ale różniące się typem lub liczbą parametrów - dzięki tym różnicom kompilator
rozpoznaje, którą z funkcji ma być użyta w zależności od typu wywołania.
Przykład:
//prototypy funkcji
int polePowierzchni(int bokX,int bokY);
double polePowierzchni(double bokX,double bokY);
double polePowierzchni(double promien);
int main(){
int a=5,b=4;
double c=5.8,d=3.2, r=2.11;
cout<<"Pole powierzchni z argumentami całkowitymi "<cout<<"Pole powierzchni z argumentami rzeczywistymi "<cout<<"Pole powierzchni koła z argumentem rzeczywistym "<return 0;
}
//definicja funkcji
int polePowierzchni(int bokX,int bokY){
return (bokX*bokY);
}
double polePowierzchni(double bokX,double bokY){
return (bokX*bokY);
}
double polePowierzchni(double promien){ //promień kola
return (promien*promien*3.1415);
}
Wyszukiwarka
Podobne podstrony:
PodstawyAutomatyki w06
Wyk6 ORBITA GPS Podstawowe informacje
Podstawowe informacje o Rybnie
3 podstawy teorii stanu naprezenia, prawo hookea
zestawy cwiczen przygotowane na podstawie programu Mistrz Klawia 6
podstaw uniw
Jezyk angielski arkusz I poziom podstawowy (5)
07 GIMP od podstaw, cz 4 Przekształcenia
Podstawy dzialania routerow i routingu
Podstawy Cyfrowego Przetwarzania Sygnalów
C20408 podstawy org UN, odruchy
więcej podobnych podstron