• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problem z zadaniem w C++(Dzial if)

Object Storage Arubacloud
0 głosów
859 wizyt
pytanie zadane 27 września 2018 w C i C++ przez kuba1245677 Obywatel (1,080 p.)

Nie wiem jak wykonac druga czesc zadania:

Napisz program, który spośród czterech podanych przez użytkownika liczb wybierze największą z nich i wypisze ją na ekranie. Spróbuj przewidzieć wszystkie trudne kombinacje liczb a,b,c i d. Czy możebyć problem w którymś z przypadków?

Trudnym przypadkiem jest kiedy ktores z liczb sa równe sobie

Narazie tyle napisałem

#include <iostream>

using namespace std;

int main()
{
    int a,b,c,d;
    cout<<"Podaj pierwsza liczbe:";
    cin>>a;
    cout<<"Podaj druga liczbe:";
    cin>>b;
    cout<<"Podaj trzecia liczbe:";
    cin>>c;
    cout<<"Podaj czwarta liczbe:";
    cin>>d;

    if((a>b)&&(a>c)&&(a>d))
    {
        cout<<"Liczba "<<a<<" jest najwieksza\n";
    }
    else if((b>a)&&(b>c)&&(b>d))
    {
        cout<<"Liczba "<<b<<" jest najwieksza\n";
    }
    else if((c>b)&&(c>a)&&(c>d))
    {
        cout<<"Liczba "<<c<<" jest najwieksza\n";
    }
     else if((d>b)&&(d>c)&&(d>a))
    {
        cout<<"Liczba "<<d<<" jest najwieksza\n";
    }

    return 0;
}

 

4 odpowiedzi

0 głosów
odpowiedź 28 września 2018 przez afferu Mądrala (5,220 p.)
wybrane 4 października 2018 przez kuba1245677
 
Najlepsza

Według mnie to zadanie jest źle sformułowane. Rozumiem, że ktoś miał pomysł aby praktykować if'y w ten sposób ale realnie porównywanie więcej niż 2 elementów w ten sposób jest bardzo(bardzo) złą praktyką.

Znalazłem tego typu kod (znajduje on minimum 4 liczb bez pętli). (https://stackoverflow.com/questions/19199473/biggest-and-smallest-of-four-integers-no-arrays-no-functions-fewest-if-stat):

int a = 5, b=4, c=7, d=9;
int min_ab, min_cd, min;
min_ab = a < b ? a : b;
min_cd = c < d ? c : d;
min = min_ab < min_cd ? min_ab : min_cd;
printf("%d", min);

Wadą tego rozwiązania jest to, że działa w tylko jednym przypadku, zaleta jest taka, że jest bardzo szybki. 

Zasadniczo maksymalną wartość można ustalić podczas podawania wejścia od użytkownika. Używając pętli można uogólnić problem dla dowolnej liczby wartości, można nawet uogólnić typ danych jaki ma zostać porównany.

Poniżej jest mój przykład(c++11), działa dla dowolnej ustalonej liczby wejść i typu danych (przynajmniej prymitywnych). 

#include <iostream>
#include <array>
#include <limits>
#include <algorithm>

//Wolna funkcja szablonowa
template<typename T, std::size_t arr_size>
void GetMaxValue()
{
    //Tworzysz nową tablice typu T o wielkości arr_size
    std::array<T, arr_size> num_array{};

    //Zmienna na przechowywanie wartości maksymalnej
    T max_val{T()};

    //Pętla do wprowadzania liczb
    for(std::size_t i{std::size_t()}; i<arr_size; ++i)
    {
        //Wypisz wiadomość, który element
        std::cout << "Type in [" << i << "] value.\n";
        //Tymczasowa zmienna na przechowywanie wejścia
        T input_value{};
        //Pobiera wejście ze standardowego strumienia,
        //jeśli std::cin nie otrzyma typu zmiennej T
        //będzie powtarzać pętle dopóki nie otrzyma poprawnego typu T
        while(!(std::cin >> input_value))
        {
            std::cout << "Value is invalid. Try again.\n";
            //Te dwie linie czyszczą flage błędu i ignorują resztę wejścia
            std::cin.clear();
            std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
        }
        //Komunikat sukces, kopiuje wartość do tablicy
        std::cout << "[OK]\n";
        num_array[i] = input_value;
        //Sprawdź czy ostatnie wejście jest większe od max,
        //jeśli tak to zapisz nową wartość max
        max_val = max_val < input_value ? input_value : max_val;
    }

    //Wypisujesz zawartość tablicy
    std::cout << "User input:\n";
    for(auto number : num_array)
    {
        std::cout << number << '\n';
    }

    //Wypisz zmienną na ekran
    std::cout << "Max number: " << max_val << '\n';
}

int main()
{
    //tego typu stała jest znana w czasie kompilacji i może służyć jako argument szablonu
    constexpr int num_count{4};

    //Wywołanie funkcji z argumentami szablonu
    std::cout << "===INT\n";
    GetMaxValue<int, num_count>();

    //Wywołanie dla innego typu
    std::cout << "===FLOAT\n";
    GetMaxValue<float, num_count>();

    return 0;
}

Edit:

Zastanawiałem się trochę nad tym zadaniem i znalazłem nowe roziązanie. Nie jest to do końca rekurencja, bo wywoływane są kolejne specjalizacje funkcji szablonowej. Wadą tego rozwiązania jest to, że ilość wygenerowanych funkcji jest proporcjonalna do ilośći argumentów. Działa też dla róźnych typów ale wynik zależy od zasad konwertowania typów, w tym przypadku jest (chyba) zawężony do int.

Przykład c++ 14

#include <iostream>

template<typename T>
constexpr T GetMax(T val)
{
    return val;
}

template<typename T, typename ... Args>
constexpr T GetMax(T val, Args ... args)
{
    auto max_val(GetMax(args...));
    return val > max_val ? val : max_val;
}

int main()
{
    //**Wprowadziliśmy 4 liczby z konsoli**
    int a{3}, b{244}, c{6}, d{74};
    std::cout << "Max 4 liczb : " << GetMax(a,b,c,d) << '\n';

    //Wynik GetMax(...) obliczony w czasie kompilacji
    constexpr int e{45}, f{654}, g{87}, h{35};
    std::cout << "Max 4 liczb : " << GetMax(e,f,g,h) << '\n';

    //Inne typy danych, magiczne liczby w parametrach :)
    std::cout << "Max, different types: " << GetMax(34.0, 54.0f, 14, 213L, true, false) << '\n';
    std::cout << "Max, bool type: " << GetMax(true, false, true) << '\n';

    return 0;
}

 

0 głosów
odpowiedź 27 września 2018 przez program naczelny Gaduła (3,320 p.)
Nie wiesz jeszcze zapewne co to funkcje? mógłbyś zrobić jedną uniwersalną funkcję podawać 4 argumenty w odpowiedniej kolejności zależnej od tymczasowego porównania (bez sensu to pisze) natomiast te "trudne" przypadki musisz po prostu osobno rozważyć, np jeżeli d==b i d==a to największymi liczbami są d,a,b. Poczytaj o funkcjach to ci ułatwi sprawę
komentarz 27 września 2018 przez kuba1245677 Obywatel (1,080 p.)
A jak by wygladało to zadanie z tymi funkcjami?
komentarz 28 września 2018 przez program naczelny Gaduła (3,320 p.)
edycja 28 września 2018 przez program naczelny
#include <iostream>
 
using namespace std;

void funkcja(q,w,e,r)
{
  if(q>w && q>e && q>r)
  {
  cout<<"najwieksza liczba to: "<<q;
  }
}

int main()
{
int a,b,c,d;
  
   cout<<"podaj pokolei wszystkie liczby";
   cin>>a; cout<<endl;
   cin>>b; cout<<endl; 
   cin>>c; cout<<endl;
   cin>>d; cout<<endl;
 
  funkcja(a,b,c,d);
  funkcja(b,a,c,d);
  funkcja(c,a,b,d);
  funkcja(d,a,b,c);

    return 0;
}

Jest to jeszcze kod bez tych "trudnych" przypadków byś musiał po prostu uwzględnić równości i tyle. Poucz się o funkcjach bo inaczej tego kodu nie zrozumiesz, ani go nie ulepszysz. (Nie sprawdzałem czy działa, może jakiś głupi błąd ale powinno chodzić)

komentarz 28 września 2018 przez Szfierzak Gaduła (3,750 p.)
Nie ucz kolegi używania zmiennych globalnych. Sam zadeklarował elegancko w main zmienne dla inputu, a Ty niepotrzebnie wyciągasz to na zewnątrz. brrr... ;)
komentarz 28 września 2018 przez program naczelny Gaduła (3,320 p.)
w takim małym kodzie to nie ma znaczenia, a nawyki to już inna sprawa. Myślę jednak że kolega ma swój rozum i nie stworzy zmiennej globalnej nazywając tak samo zmienną w podprogramie, w przyszłości. Więc nie widzę sensu wytknięcia tego błędu, który nie jest błędem
komentarz 28 września 2018 przez Szfierzak Gaduła (3,750 p.)
Jak uważasz. Ja uważam, że własnie jest to błąd. Tym bardziej, że próbujesz zaprezentować działanie funkcji, które traci na sensie jeżeli używasz zmiennych globalnych.
komentarz 28 września 2018 przez program naczelny Gaduła (3,320 p.)
to teraz już jest ewidentnie seksownie. Masz swoje ukryte zmienne!
0 głosów
odpowiedź 27 września 2018 przez niezalogowany
5 2 6 6

W takim przypadku nie spełni się żaden warunek. Zamień wszędzie znak > na >=. Lepsze rozwiązanie link.

0 głosów
odpowiedź 4 października 2018 przez mokrowski Mędrzec (155,460 p.)

Taki trik na bitach załatwia sprawę. Wbrew pozorom po wgryzieniu się będzie zrozumiały... być może dorzucę coś jeszcze jak wymyślę nietypowy sposób :) 

#include <iostream>

int main() {
    int a;
    int b;
    int c;
    int d;
    std::cout << "Podaj 4 liczby oddzielone spacją: ";
    std::cin >> a >> b >> c >> d;
    int a_b_max = a ^ ((a ^ b) & -(a < b));
    int c_d_max = c ^ ((c ^ d) & -(c < d));
    int all_max = a_b_max ^ ((a_b_max ^ c_d_max) & ~(a_b_max < c_d_max));
    std::cout << "Maksymalna wartość liczb (" << a << ", " << b << ", "
        << c << ", " << d << ") to " << all_max << '\n';
}

 

Podobne pytania

0 głosów
2 odpowiedzi 225 wizyt
pytanie zadane 20 października 2019 w C i C++ przez Vaxter Nowicjusz (150 p.)
0 głosów
2 odpowiedzi 249 wizyt
pytanie zadane 26 lutego 2019 w C i C++ przez de1vee Nowicjusz (220 p.)
–1 głos
1 odpowiedź 1,694 wizyt
pytanie zadane 24 października 2018 w C i C++ przez Paweł123 Nałogowiec (33,500 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...