Wartość środkowa trzech liczb ;)

0

Ostatnio z powodu nudy w pewnym miejscu znalazłem na internecie takie zadanie:

Napisz program, który po podaniu trzech liczb wypisze ich wartość środkową np: dla liczb 3,6,10 prawidłowe wyjście to: 6.

Chwilkę nad tym pomyślałem i po 15 minutach miałem gotową implementację:

 
#include <iostream>
using namespace std;

int main()
{
	int A,B,C;

	
	while (true)
	{

	cout << "Podaj trzy liczby: ";
	cin >> A >> B >> C;
	
    if((B > C && B < A) || (B < C && B > A))
		cout << B << endl;
	// 1 3 2
	else if( (C>A && C < B)	|| (C<A && C > B)		)
		cout << C << endl;
	// 2 3 1
	else if (	(A > C && C < B) || (A < C && C > B)	)
		cout << A << endl;
	cout << endl;
	}

}

No i zastanawiam się jakie Wy byście proponowali rozwiązanie tego problemu? Może znacie jakiś krótszy albo bardziej optymalny zapis? Podzielcie się swoimi kodami (nie koniecznie w C++ ale haskella/cobola nie mam zamiaru rozszyfrowywać).

0

http://biobio.loc.edu/chu/web/Courses/COSI216/median3.htm

albo wersja "armata-na-muchę": posortuj trzy liczby jakimś standardowym sort()em i weź tę która zostanie po środku :-)

albo coś takiego (jeśli już mamy odpowiednie funkcje):
return max(c, min(a,b))

0

@mvt8: bardziej optymalnym zapisem będzie pozbycie się trzeciego, zbędnego warunku. to dodatkowo pozwoli cokolwiek wypisać, kiedy liczby są równe.
przydałoby się też ładnie sformatować kod, a nie takie bohomazy wrzucać.

0

Wystarczy takie cos. Bez zbednego sortowania.

int mid(int a, int b, int c)
{
    return (a<b && a>c) || (a>b && a<c) ? a : ( (a>b && b>c) || (a<b && b<c) ? b : c);
}
0

return max(c, min(a,b))

nie zadziała dla
c = 10
b = 5
a = 7

czyli gdy
b < a < c

0

Zawsze można pokombinować jeszcze bardziej i zamiast sortować użyć set-a (oraz składni C++11) ;]

#include <set>
#include <iostream>
#include <initializer_list>

int main(){
    std::multiset<int> s {3, 9, 4};
    std::cout << *++s.begin();
}
0

Do znajdowania mediany w C++ zamiast sortowania lepiej użyć std::nth_element. Nie wiem tylko czy sprawdzi się to też, kiedy z medianę będziemy chcieli przyjąć średnią ze środka (dla parzystej liczby elementów). Oczywiście dla 3 elementów ify będą chyba szybsze. ;-)

0
return max(min(a, b), min(max(a, b), c));
0

@lukasz1235

 
#include <iostream>
using namespace std;
int min(int,int);
int max(int,int);
int mediana(int,int,int);
int main() 
{
        int t; // liczba testów
        cin >> t;
        while(t--)
        {
                int a,b,c,tmp;
                cin >> a >> b >> c;
                tmp=mediana(a,b,c);
                cout << tmp << "\n";
        }
        return 0;
}
int min(int p,int q)
{
        return (p<=q)?p:q;
}
int max(int p,int q)
{
        return (p>=q)?p:q;
}
int mediana(int a,int b,int c)
{
        return max(min(a, b),min(max(a, b),c));
}

http://ideone.com/9bfaP

Czekamy na rozwiązanie w C. Bez bibliotek, rzecz jasna :)

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