Preprocesory

0

Witam mam napisac program ktory pobiera 3 liczby i jesli jest zdefiniowana makro preprocesowa GETMIN to wysiwetla najmniejsza liczbe jestli GETMAX to najwieksza a jesli obie to wyswietla najwieksza i najmniejsza i napisalem kod ktorym podam ponizej ale on wyswietla mi zawsze te liczby.

#include "stdafx.h"
#include <iostream>
#include "Zad4.h"

#define GETMIN
#if defined(GETMIN)
#define najmniejsza najmniejsza2;
#endif
#if defined(GETMAX)
#define najwieksza najwieksza1;
#endif
#if defined(GETMIN) && defined(GETMAX)
#define najmniejsza najmniejsza2
#define najwieksza najwieksza1
#endif
#if !(defined(GETMIN) && defined(GETMAX))
// tutaj mial sie zatrzymac program
#endif

using namespace std;
int main()
{
    int a, b, c, najwieksza1, najmniejsza2;
    cout << "Wprowadz 3 liczby calkowite ";
    cin >> a;
    cin >> b;
    cin >> c;
    if (a > b && a > c)
        najwieksza1 = a;
    if (b > a && b > c)
        najwieksza1 = b;
    if (c > b && c > a)
        najwieksza1 = c;
    if (a < b && a < c)
        najmniejsza2 = a;
    if (b < a && b < c)
        najmniejsza2 = b;
    if (c < a && c < b)
        najmniejsza2 = c;

    cout << "Najwieksza liczba: " << najwieksza;
    cout << "Najmniejsza liczba: " << najmniejsza;
}
0

Przekombinowałeś:

#include <iostream>
#include <algorithm>
 
#define SHOW_MINIMUM
 
int main() {
	int a, b, c;
 
	std::cin >> a >> b >> c;
 
	#ifdef SHOW_MINIMUM
		std::cout << std::min({a, b, c});
	#endif
 
	#ifdef SHOW_MAXIMUM
		std::cout << std::max({a, b, c});
	#endif
 
	return 0;
}

http://ideone.com/FqS6Gw

1

Cześć! Mam wrażenie, że nie do końca rozumiesz co robi preprocesor, na przykład tutaj:

#define najmniejsza najmniejsza2;

Definiujesz (nie deklarujesz!) że gdy w kodzie pojawi się najmniejsza to będzie ona zastępowana zmienną lub wartością najmniejsza2, ale nie jest to dobre rozwiązanie. Na tą chwilę nawet nie jesteśmy pewni czy najmniejsza2 w ogóle pojawi się w kodzie ;)

Po drugie:

#if !(defined(GETMIN)&&defined(GETMAX))
// tutaj mial sie zatrzymac program
#endif

Program się nie zatrzyma, bo programu jeszcze nawet nie ma :D Preprocesor działa jeszcze przed budowaniem Twojego programu. Owszem, możesz w programie wywołać makra odpowiadające za zatrzymanie działania, ale Twój program zaczyna się na początku funkcji main(). Warunek, który stworzyłeś występuje przecież dużo wcześniej...

Ogólnie kombinujesz dobrze, ale nie bój się używać dyrektyw preprocesora w kodzie:

#define GETMIN
#if defined(GETMIN)
#define najmniejsza najmniejsza2;
#endif
#if defined(GETMIN)&& defined(GETMAX)
#define najmniejsza najmniejsza2
#define najwieksza najwieksza1
#endif

using namespace std;

int main()
{
    int a, b, c, najwieksza1, najmniejsza2;
    cout << "Wprowadz 3 liczby calkowite ";
    cin >> a;
    cin >> b;
    cin >> c;
    if (a > b&&a > c) najwieksza1=a;
    if (b > a&&b > c) najwieksza1=b;
    if (c > b&&c > a) najwieksza1=c;
    if (a < b&&a < c) najmniejsza2=a;
    if (b < a&&b < c) najmniejsza2=b;
    if (c < a&&c < b) najmniejsza2=c;

#ifdef GETMAX                       /* To tylko dla przykładu - dyrektywy mogą znajdować się wszędzie */
#define najwieksza najwieksza1;
#endif
    cout <<"Najwieksza liczba: "<< najwieksza;
    cout <<"Najmniejsza liczba: "<< najmniejsza;
}

Po trzecie, program wyświetla Ci zawsze te liczby, bo tak napisałeś w programie:

    cout <<"Najwieksza liczba: "<< najwieksza;
    cout <<"Najmniejsza liczba: "<< najmniejsza;

Dyrektywy odpowiadają nie tylko za stałe i makra, ale też mogą sterować tym co zostanie skompilowane, lub nie. Więc jeśli chcesz wyświetlić tylko jedną wartość, zrób tak:

#ifdef GETMAX
#define najwieksza najwieksza1;
    /* Ta linijka zostanie skompilowana tylko jeśli podałeś GETMAX */
    cout <<"Najwieksza liczba: "<< najwieksza;
#endif
}

Pozdrawiam

0

Wielkie dzięki chłopaki <3

1 użytkowników online, w tym zalogowanych: 0, gości: 1