Program dla max i min

0

Witam. Jestem początkującym programistą. Dostałem do wykonania listę zadań, niestety na jednym się zawiesiłem. Zad. Napisz program, który dla danych liczb a, b, c, d rzeczywistych obliczy i wyświetli wartości najmniejszej z liczb a, b, d oraz największej z liczb b, c, d.
Wymyśliłem taki program ale niestety nie działa on do końca poprawnie

 #include <stdio.h>
 int main()
 {
    float tabmin[3],tabmax[3], max, min;
    int i;
    printf("Podaj liczbe a : ");
    scanf("%f",&tabmin[0]);
    printf("Podaj liczbe b : ");
    scanf("%f",&tabmin[0],&tabmax[0]);
    printf("Podaj liczbe c : ");
    scanf("%f",&tabmax[1]);
    printf("Podaj liczbe d : ");
    scanf("%f",&tabmin[2],&tabmax[2]);
max=tabmax[0]; // wyznaczenie maximum
min=tabmin[0]; // wyznaczenie minimum
       for( i=0; i<3 ; i++)
            if(max<tabmax[i])
               {max=tabmax[i];}
           printf( "\nNajwyzsza wartosc z liczb b, c, d jest rowna %f" , max );
            if(min>tabmin[i])
               {min=tabmin[i];}
           printf( "\nNajnizsza wartosc z liczb a, b, d jest rowna %f" , min );
    return 0;
 }

Są to moje pierwsze programy i mam pytanie jak wpisać tą samą liczbę do dwóch różnych tablic? - bo z tego co zauważyłem to tutaj pojawia się problem.

1
#include <stdio.h>

#define MAX2(a, b) ((a) > (b) ? (a) : (b))
#define MAX3(a, b, c) (MAX2(MAX2(a, b), c))

#define MIN2(a, b) ((a) < (b) ? (a) : (b))
#define MIN3(a, b, c) (MIN2(MIN2(a, b), c))

int main(void) {
    float a, b, c, d;
    scanf("%f %f %f %f ", &a, &b, &c, &d);
    printf("min(%f, %f, %f) = %f\n", a, b, c, MIN3(a, b, c));
    printf("max(%f, %f, %f) = %f\n", b, c, d, MAX3(b, c, d));
    return 0;
}

https://ideone.com/ZlKtvn

0

Dzięki za odpowiedz. Jako że jestem początkujący to mam jeszcze pytanie: dlaczego w programie muszę podać 5 liczb?
Program działa tylko obawiam się, że miałem to zrobić za pomocą tablic, pętli i if - takiego czegoś jak #define jeszcze nie "znamy"

0

W sumie to inne rozwiązanie z wykorzystaniem symboli w c++:

if (a>b){
    return a;
} else {
    return b;
}

Może zostać rozwiązane w taki sposób:

return a>b ? a : b;

Konstrukcja tego to jeśli (?) a>b jest prawdą, zwróć/sprawdź pierwszą wartość przed dwukropkiem w innym wypadku zwróć b

Czyli twój problem (w założeniu że liczby są różne) można zapisać w ten sposób: [TO ZŁY SPOSÓB, ale jak jesteś nowy, pokazuje by ukazać ;p]

 return a>b and a>c and a>d ? b>c and b>d ? c>d ? a : b : c : d;

Gdyby nie to że pierwszy argument jest wywołany tylko w przypadku gdy wszystkie argumenty są prawdą. Jeśli pierwszy jest fałszem to wywołuje ostatni nie sprawdzając kolejnego. (wolę uczulić przed takim zapisem.
Dlatego proponuje taki zapis:

    return a>b and a>c and a>d ? a : b>c and b>d ? b : c>d ? c : d;

Jeśli a jest większe od wszystkich, zwróci a, w innym wypadku sprawdza czy b jest większe od pozostałych, zwróci b, w innym przypadku sprawdza czy c jest większe od d, zwróci c, jeśli nie to d.
Z minimum możesz zrobić tak samo ;p

Do równości jeszcze musisz się pobawić znakiem większe lub równe, minimum na tej podstawie zrobić to powinno być już prosto ;p

Oczywiście sposób tylko uczy dla ograniczonych ilości argumentów, nie jest to tablicowe. Ale też warto znać, najszybszy sposób.
W innym przypadku zalecam algorytmy sortujące, znajdziesz tego pełno w sieci :).

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