LEKCJA 15. Jak pos�ugiwa� si� funkcjami. ________________________________________________________________ W trakcie tej lekcji dowiesz si� wi�cej o: * funkcjach i prototypach funkcji; * przekazywaniu argument�w funkcji; * wsp�pracy funkcji ze wska�nikami. _______________________________________________________________ Aby przedstawi� dzia�anie operator�w logicznych opracujemy w�asn� funkcj� Demo() i zastosujemy j� w programie przyk�adowym [najwa�niejszy fragment]. int Demo(int Liczba) { int MaxNr=15; for (; MaxNr>=0; MaxNr--) { if ((Liczba>>MaxNr)&1) printf("1"); else printf("0"); } return 0; //Funkcja nie musi nic zwracac } Funkcja przesuwa liczb� o kolejno 15, 14, 13 itd. bit�w w prawo i sprawdza, czy 16, 15, 14 bit jest jedynk�, czy zerem. Iloczyn logiczny z jedynk� ( 0000000000000001 ) gwarantuje nam, �e wp�yw na wynik operacji b�dzie mia� tylko ten jeden bit (patrz wy�ej - jak dzia�aj� operatory logiczne). [P042.CPP] # include <stdio.h> int Demo(int Liczba) { int MaxNr=15; for (; MaxNr>=0; MaxNr--) if ((Liczba>>MaxNr)&1) printf("1"); else printf("0"); return 0; } char odp; int main() { int X, Y; clrscr(); printf("\nPodaj dwie liczby calkowite od -32768 do +32767\n"); printf("\nLiczby X i Y rozdziel spacja"); printf("\nPo podaniu drugiej liczby nacisnij [Enter]"); printf("\nLiczby ujemne sa w kodzie dopelniajacym"); printf("\nskrajny lewy bit oznacza znak 0-Plus, 1-Minus"); for(;;) { printf("\n"); scanf("%d %d", &X, &Y); printf("\nX:\t"); Demo(X); printf("\nY:\t"); Demo(Y); printf("\n~Y:\t"); Demo(~Y); printf("\nX&Y:\t"); Demo(X&Y); printf("\nX|Y:\t"); Demo(X|Y); printf("\nX^Y:\t"); Demo(X^Y); printf("\nY:\t"); Demo(Y); printf("\nY>>1:\t"); Demo(Y>>1); printf("\nY<<2:\t"); Demo(Y<<2); printf("\n\n Jeszcze raz? T/N"); odp=getch(); if (odp!='T'&& odp!='t') break; } return 0; } Je�li operacje maj� by� wykonywane nie na bitach a na logicznej warto�ci wyra�e�: || oznacza sum� (LUB); && oznacza iloczyn (I); ! oznacza negacj� (NIE). Przyk�ady: (x==0 || x>5) - x r�wna si� 0 LUB x wi�kszy ni� 5; (a>5 && a!=11) - a wi�ksze ni� 5 I a nie r�wne 11; (num>=5 && num!=6 || a>0) num nie mniejsze ni� 5 I num nie r�wne 6 LUB a dodatnie; Wyra�enia logiczne sprawdzane instrukcj� if MUSZ� by� uj�te w nawiasy okr�g�e. Do wytworzenia warto�ci logicznej wyra�enia mo�e zosta� u�yty operator relacji: < <= == >= > != . Je�li tak si� nie stanie, za warto�� logiczn� wyra�enia przyjmowane jest: 1, PRAWDA, TRUE, je�li warto�� numeryczna wyra�enia jest r�na od zera. 0, FA�SZ, FALSE, je�li warto�� numeryczna wyra�enia jest r�wna zero. Por�wnaj: if (a<=0) ... if (a) ... if (a+b) ... Konwersja - przyk�ady. C++ dysponuje wieloma funkcjami wykonuj�cymi takie dzia�ania, np: itoa() - Integer TO Ascii - zamiana liczby typu int na �a�cuch znak�w ASCII; ltoa() - Long int TO Ascii - zamiana long int -> ASCII; atoi() - zamiana Ascii -> int; atol() - zamiana Asdii -> long int . Wszystkie wymienione funkcje przekszta�caj�c liczby na �a�cuchy znak�w potrzebuj� trzech parametr�w: p1 - liczby do przekszta�cenia; p2 - bufora, w kt�rym b�d� przechowywa� wynik - �a�cuch ASCII; p3 - podstawy (szesnastkowa, dziesi�tna itp.). Je�li chcemy korzysta� z tych funkcji, powinni�my do��czy� plik nag��wkowy z ich prototypami - stdlib.h (STandarD LIBrary - standardowa biblioteka). A oto przyk�ad. [P043.CPP] # include "stdio.h" # include "stdlib.h" main() { int i; char B10[10], B2[20], B16[10]; //BUFORY for (i=1; i<17; i++) printf("%s %s %s\n", itoa(i, B10[i], 10), itoa(i, B2[i], 2), itoa(i, B16[i], 16)); return 0; } [Z] ________________________________________________________________ 1. Opracuj program testuj�cy dzia�anie funkcji atoi(). ________________________________________________________________ KILKA S��W O TYPACH DANYCH i KONWERSJI W C/C++ . Przed przyst�pieniem do obszernego zagadnienia "funkcje w C" kr�tko zasygnalizujemy jeszcze jedno zjawisko. Wiesz z pewno�ci�, �e wykonywane na liczbach dw�jkowych mno�enie mo�e da� wynik o d�ugo�ci znacznie wi�kszej ni� mno�na i mno�nik. W programach mo�e si� poza tym pojawi� konieczno�� np. mno�enia liczb zmiennoprzecinkowych przez ca�kowite. Jak w takich przypadkach post�puje C++ ? Po pierwsze: C/C++ mo�e sam dokonywa� konwersji, czyli zmiany typ�w danych naog� zgodnie z zasad� nadawania zmiennej "mniej pojemnego" rodzaju typu zmiennej "bardziej pojemnego" rodzaju przed wykonaniem operacji; Po drugie: my sami mo�emy zmusi� C++ do zmiany typu FORSUJ�C typ �wiadomie w programie. W przyk�adzie poni�ej podaj�c w nawiasach ��dany typ zmiennej forsujemy zmian� typu int na typ float. [P044.CPP] # include "stdio.h" void main() { int a=7; printf("%f", (float) a); } Konwersja typ�w nazywana bywa tak�e "rzutowaniem" typ�w (ang. type casting). A oto kilka przyk�ad�w "forsowania typ�w": int a = 2; float x = 17.1, y = 8.95, z; char c; c = (char)a + (char)x; c = (char)(a + (int)x); c = (char)(a + x); c = a + x; z = (float)((int)x * (int)y); z = (float)((int)x * (int)y); z = (float)((int)(x * y)); z = x * y; c = char(a) + char(x); c = char(a + int(x)); c = char(a + x); c = a + x; z = float(int(x) * int(y)); z = float(int(x) * int(y)); z = float(int(x * y)); z = x * y; FUNKCJE BIBLIOTECZNE I W�ASNE W J�ZYKU C/C++ . Poj�cie funkcji obejmuje w C/C++ zar�wno pascalowe procedury, jak i basicowe podprogramy. Funkcji zdefiniowanych w C++ przez prducenta jest bardzo du�o. Dla przyk�adu, funkcje arytmetyczne, kt�re mo�esz wykorzysta� do oblicze� numerycznych to np.: abs() - warto�� bezwzgl�dna, cos() - cosinus, sin() - sinus, tan() - tangens, asin(), atan(), acos(), - funkcje odwrotne ARCUS SINUS... funkcje hiperboliczne: sinh(), cosh(), tanh(), wyk�adnicze i logarytmiczne: exp() - e^x log() - logarytm naturalny, log10() - logarytm dziesi�tny. Je�li skorzystasz z systemu Help i zajrzysz do pliku math.h (Help | Index | math.h), znajdziesz tam jeszcze wiele przydatnych funkcji. Funkcja mo�e, ale nie musi zwraca� warto�� do programu - dok�adniej do funkcji wy�szego poziomu, z kt�rej zosta�a wywo�ana. W ciele funkcji s�u�y do tego instrukcja return. U�ytkownik mo�e w C++ definiowa� w�asne funkcje. Funkcja mo�e by� bezparametrowa. Oto przyk�ad bezparametrowej funkcji, zwracaj�cej zawsze liczb� ca�kowit� trzyna�cie: int F_Trzynascie() { return 13; } Poprawne wywo�anie naszej funkcji w programie g��wnym mia�oby posta�: int main() { ...... int X; ........ // Funkcja typu int nie musi byc deklarowana. X = F_Trzynascie(); ...... } Je�li funkcja musi pobra� jakie� parametry od programu (funkcji wy�szego poziomu, wywo�uj�cej)? Zwr�� uwag�, �e program g��wny w C/C++ to te� funkcja - main(). Przyk�ad nast�pny pokazuje definicj� funkcji obliczaj�cej pi�t� pot�g� pobranego argumentu i wywo�anie tej funkcji w programie g��wnym. Przyk�ad: int F_XdoPiatej(int argument) { int robocza; //automatyczna wewnetrzna zmienna funkcji robocza = argument * argument; robocza = robocza * robocza * argument; return (robocza); } int main() { int Podstawa, Wynik, a, b; ... /* Funkcja nie jest deklarowana przed uzyciem */ Wynik = F_XdoPiatej(Podstawa); ..... a = F_XdoPiatej(b); ..... return 0; } Zwr�� uwag�, �e definiuj�c funkcj� podajemy nazw� i typ ARGUMENTU FORMALNEGO funkcji - tu: argument. W momencie wywo�ania na jego miejsce podstawiany jest rzeczywisty bie��cy argument funkcji. Aby zapewni� wysok� dok�adno�� oblicze� wymienione wy�ej funkcje biblioteczne sqrt(), sin() itp. "uprawiaj�" arytmetyk� na d�ugich liczbach typu double. Funkcj� tak� przed u�yciem w swoim programie MUSISZ ZADEKLAROWA�. Przyk�ad: [P045.CPP] main() { double a, b; double sqrt(); // tu skasuj deklaracje funkcji sqrt() // a otrzymasz bledny wynik ! clrscr(); printf("Podaj liczbe\n"); scanf("%lf", &a); b = sqrt(a); printf("\n %Lf", (long double) b); getch(); return 0; } PROTOTYPY FUNKCJI, czyli jeszcze o deklaracjach funkcji. Prototyp funkcji to taka deklaracja, kt�ra: * zosta�a umieszczona na pocz�tku programu poza funkcj� main(), * zawiera deklaracj� zar�wno typu funkcji, jak i typ�w argument�w. Przyk�ad prototypu (funkcja2.cpp): double FUNKCJA( double X, double Y); main() { double A=0, B=3.14; printf("Wynik dzia�ania funkcji: \n"); printf("%lf", FUNKCJA(A,B)); return 0; } double FUNKCJA(double X, double Y) { return ((1+X)*Y); } Prototyp m�g�by r�wnie dobrze wygl�da� tak: double FUNKCJA(double, double); nazwy parametr�w formalnych nie s� istotne i mo�na je pomin��. Je�li prototyp funkcji wygl�da tak: int Funkcja(int, char*, &float) oznacza to, �e parametrami funkcji s� wska�niki do zmiennych, b�d� referencje do zmiennych. Przy rozszyfrowywaniu takiej "abrakadabry" warto w...
lazarusp22