Sortowanie if'em.

0

Dzień dobry.
Robię sobie ćwiczenia ze strony http://phppp.gajdaw.pl/projekty/25-03/index.php?id=5
i przy zadaniu, w którym miałem posortować trzy liczby, rozpisałem się okropnie - uwzględniając wszystkie możliwości - działało, ale autor zrobił to dużo łatwiej. Chciałem więc zrobić tak jak On przy sortowaniu czterech liczb... i chyba czegoś nie rozumiem.
Czy mógłby mi ktoś pomoc zrozumieć, dlaczego to nie działa?

 #include<iostream>
using namespace std;

int main(){
    int a, b, c, d, robocza;
    cout << "podaj cztery liczby do posortowania\n";
    cin >> a >> b >> c >> d;
    if (a > b){
        robocza = a;
        a = b;
        b = robocza;
    }
    if (a > c) {
        robocza = a;
        a = b;
        b = c;
        c = robocza;
    }
    if (a > d) {
        robocza = a;
        a = b;
        b = c;
        c = d;
        d = robocza;
    }
    if (b > c) {
        robocza = b;
        b = c;
        c = d;
        d = robocza;
    }
    if (b > d) {
        robocza = b;
        b = c;
        c = d;
        d = robocza;
    }
    if (c > d) {
        robocza = c;
        c = d;
        d = robocza;
    }
    cout << a << b << c << d;
    return 0;
}
0

Po każdym ifie wypisz sobie wszystkie wartości zmiennych, to zobaczysz.
Np. co to niby ma robić?

if (a > c) 
{
    robocza = a;
    a = b;
    b = c;
    c = robocza;
}

Pierwszy if zapewnił, że b będzie większe od a. Po tym ifie jeśli c było najmniejsze to nagle b jest najmniejsze, a a największe z trzech liczb.

0

Brałem przykład z tego:

#include <iostream>
#include <cstdlib>

using namespace std;

int main(int argc, char *argv[])
{
  int a,b,c,rob;
  
  cout << "Program SORT3" << endl 
       << "(C)2002 student" << endl << endl 
       << "Program sortuje malejąco trzy liczby."
       << endl << endl;
       
  cout << "Podaj piewrszą liczbę = ";
  cin >> a;
  
  cout << "Podaj drugą liczbę = ";
  cin >> b;
  
  cout << "Podaj trzecią liczbę = ";
  cin >> c;


  //chcemy by a było większe od b
  if (a<b)
    {
      rob=a;
      a=b;
      b=rob;  
    }  
  //teraz wiemy, że 
  //                a > b  
  
  if (c>a)
    {
      //wymiana cykliczna trzech zmiennych
      rob=c;
      c=b;
      b=a;  
      a=rob;
    }  
  else
    if (c>b)
      {
        rob=b;
        b=c;
        c=rob;  
      }  
    
      
  cout << endl << "===================="  << endl 
       <<  "a = "   << a << endl
       <<  "b = "   << b << endl       
       <<  "c = "   << c
       << endl << "===================="  << endl << endl; 

      
  system("PAUSE");	
  return 0;
} 
0

Zrobiłem to tak:

#include<iostream>
using namespace std;

int main(){
    int a, b, c, d, robocza;
    cout << "Podaj cztery liczby do posortowania.\n";
    cin >> a >> b >> c >> d;
    
    if (a > b){
        robocza = a;
        a = b;
        b = robocza;
    }
    if (a > c) {
        robocza = a;
        a = c;
        c = robocza;
    }
    if (a > d) {
        robocza = a;
        a = d;
        d = robocza;
    }
    if (b > c) {
        robocza = b;
        b = c;
        c =robocza;
    }
    if (b > d) {
        robocza = b;
        b = d;
        d = robocza;
    }
    
    cout << a << b << c << d;
    return 0;
} 

Ale wciąż nie wiem, co autor miał na myśli.:)

1
JakubD napisał(a):

Ale wciąż nie wiem, co autor miał na myśli.:)

Pierwszy if jest po to, żeby posortować 2 liczby a i b. Po nim mamy porządek (lewa mniejsza)

[b] [a]

Teraz liczba c może być w jednym z trzech miejsc

[c] [b] [a]
[b] [c] [a]
[b] [a] [c]

Pierwszy przypadek nie wymaga żadnych działań. Drugi wymaga zamiany b i c (ostatni if), a ostatni wymaga przesunięcia cyklicznego.

0

Dziękuję.

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