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; } |