LEKCJA15.TXT

(25 KB) Pobierz
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...
Zgłoś jeśli naruszono regulamin