Tytu³: Instrukcje preprocesora Wiadomo¶æ wys³ana przez: admin Styczeñ 04, 2012, 09:28:45 Preprocesor to program przetwarzaj±cy kod ¼ród³owy jeszcze przed rozpoczêciem kompilacji.
Instrukcje preprocesora nazywane s± dyrektywami. Wszystkie dyrektywy preprocesora rozpoczynaj± siê od znaku #. Znak # sygnalizuje, ¿e nast±pi po nim dyrektywa preprocesora. Dyrektywy wstawiamy na samym pocz±tku kodu programu. Przyk³adem dyrektywy jest #include , pozwalaj±ca na do³±czenie do kodu ¼ród³owego kodu z innych plików ¼ród³owych. Inna dyrektyw± jest dyrektywa #define, okre¶laj±ca sta³e warto¶ci dostêpne w programie: #define adam 4321 od tej chwili identyfikator adam oznacza sta³± o warto¶ci 4321. Takie postêpowanie ma niew±tpliwe zalety, kolejne wersje programu przy zmianie sta³ej adam wymagaj± tylko zmiany warto¶ci przy dyrektywie include. Dyrektywa #define nakazuje preprocesorowi zast±piæ ka¿de wyst±pienie ci±gu znaków innym ci±giem znaków. Pierwszy , zastêpowany ci±g znaków (adam) spe³nia rolê makronazwy, drugi jest makrorozwiniêciem (macro body). Zadanie 1. Przyk³ad deklaracji makroinstrukcji adam i suma. #include <cstdlib> #include <iostream> #define adam 4321; #define suma (23+2) using namespace std; int main(int argc, char *argv[]) { cout<<suma; cout<<adam; system("PAUSE"); return EXIT_SUCCESS; } Makro instrukcja rozwijana przez preprocesor mo¿e dzia³aæ podobnie do funkcji - pobieraæ argumenty i zwracaæ warto¶æ uzyskan± w wyniku przetwarzania danych . Uwaga, wa¿n± rolê spe³niaj± nawiasy okr±g³e !!!!! Tytu³: Odp: Instrukcje preprocesora Wiadomo¶æ wys³ana przez: admin Styczeñ 04, 2012, 09:35:24 Zadanie 2. Napisaæ dwie dyrektywy preprocesora obliczaj±ce czwart± potêgê wprowadzonej liczby. Wyja¶niæ dlaczego wyst±pi³y ró¿nice w otrzymanym wyniku.
#include <cstdlib> #include <iostream> #define pot1(a) ((a)*(a)*(a)*(a)) #define pot2(a) a*a*a*a using namespace std; int main(int argc, char *argv[]) { int b=2, c,d; cout<<"Wynik wywo³ania dwóch makr:"; c=pot1(b);d=pot2(b); cout<<"rezultat pot1(b): "<<c<<endl; cout<<"rezultat pot2(b): "<<d<<endl; c=pot1(b+1); d=pot2(b+1); cout<<"rezultat pot1(b+1): "<<c<<endl; cout<<"rezultat pot2(b+1): "<<d<<endl; system("PAUSE"); return EXIT_SUCCESS; } Tytu³: Odp: Instrukcje preprocesora Wiadomo¶æ wys³ana przez: admin Styczeñ 04, 2012, 10:10:59 Zadanie 3. Makroinstrukcje w jêzyku C++ wolne s± od ograniczeñ topologicznych na³o¿onych na funkcje. Przyk³ad poni¿ej ma wykazaæ poprawno¶æ tej tezy. Je¿eli zmieniony zostanie typ danych z int na float, to dzia³anie i konstrukcja makroinstrukcji pozostan± bez zmian.
#include <cstdlib> #include <iostream> #define pot1(a) ((a)*(a)*(a)*(a)) #define pot2(a) a*a*a*a using namespace std; int main(int argc, char *argv[]) { float b=4.5, c,d; cout<<"Wynik wywo³ania dwóch makr:"; c=pot1(b);d=pot2(b); cout<<"rezultat pot1(b): "<<c<<endl; cout<<"rezultat pot2(b): "<<d<<endl; c=pot1(b+1); d=pot2(b+1); cout<<"rezultat pot1(b+1): "<<c<<endl; cout<<"rezultat pot2(b+1): "<<d<<endl; system("PAUSE"); return EXIT_SUCCESS; } Tytu³: Odp: Instrukcje preprocesora Wiadomo¶æ wys³ana przez: admin Styczeñ 04, 2012, 10:12:34 Zadanie 4. Napisaæ dwie instrukcje preprocesora wybieraj±c± mniejsz± i wiêksz± warto¶æ z dwóch wprowadzonych liczb.
#include <cstdlib> #include <iostream> #define maks(a,b) ((a)>(b)?(a):(b)) #define min(a,b) ((a)>(b)?(b):(a)) using namespace std; int main(int argc, char *argv[]) { float b=4.5, c,d; cout<<"Podaj pierwsz± liczbê liczbê:"; cin>>c; cout<<"Podaj drug± liczbê liczbê:"; cin>>d; cout<<"Wieksza liczba to :"<<maks(c,d); system("PAUSE"); return EXIT_SUCCESS; } |