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

Zadanie ze średnią ważoną

Object Storage Arubacloud
0 głosów
384 wizyt
pytanie zadane 25 marca 2017 w C i C++ przez Undisputed Gaduła (3,040 p.)

Witam.

Rozwiązując zadania z solve.edu.pl napotkałem na problem przy jednym zadaniu i nie jestem w stanie ruszyć.

Treść zadania

Tutaj moje rozwiązanie, jednak sędzia odpowieda, że odpowiedź błędna

#include <iostream>

using namespace std;

int main()
{
    int K1, K2, K3, E;
    int srednia;
    cin >> K1 >> K2 >> K3 >> E;
    if (K1>=0 && K1<=100 && K2>=0 && K2<=100 && K3>=0 && K3<=100 && E>=0 && E<=100)
    {
        srednia=(K1+K2+K3+2*E)/5;
        //cout << srednia;
        if((K1>=40 && K2>=40 && E>=40 && srednia>=50) || (K2>=40 && K3>=40 && E>=40 && srednia>=50) || (K1>=40 && K2>=40 && E>=40 && srednia>=50) )
        {
            cout <<"ZDANY";
        }
        else if ((K1>=40 && K2>=40 && E>=40 && srednia<50) || (K2>=40 && K3>=40 && E>=40 && srednia<50) || (K1>=40 && K2>=40 && E>=40 && srednia<50))
        {
            cout <<"DOPYTKA";
        }
        else
        {
            cout <<"NIEZDANY";
        }
    }
    return 0;
}

Za wszelkie rady, wskazówki będę wdzięczny :)

2 odpowiedzi

+1 głos
odpowiedź 25 marca 2017 przez niezalogowany
wybrane 25 marca 2017 przez Undisputed
 
Najlepsza

Pierwsze co rzuca się w oczy to operowanie na intach. Powinieneś na pewno zamienić je na double, lub float.

double K1, K2, K3, E;
double srednia;

Przykład dlaczego:

int a = 1;
int b = 3;
double c = 1;
double d = 3;
cout<<a/b<<endl;
cout<<c/d<<endl;

EDIT: Jednak główny problem leży w sprawdzaniu kolokwium 1-2, 1-3, 1-2 zamiast 1-2, 1-3, 2-3.

komentarz 25 marca 2017 przez Undisputed Gaduła (3,040 p.)

zrobiłem wcześniej coś takiego:

double srednia;
srednia=(double)(K1+K2+K3+2*E)/5;

i nie pomogło, ale spróbuję tak jak piszesz :)

komentarz 25 marca 2017 przez Undisputed Gaduła (3,040 p.)
Zrobiłem, nic to nie dało :/
komentarz 25 marca 2017 przez niezalogowany
Dało. Zobacz jak średnie się różnią... Zupełnie inne. Wydaje mi się, że inny problem leży w rozległości warunków jakie masz. Zaraz to ogarnę
komentarz 25 marca 2017 przez Undisputed Gaduła (3,040 p.)
Tzn. tak, wiem że średnia ważona, się wtedy zmienia, jednak to chyba nie w tym leży problem :)
komentarz 25 marca 2017 przez niezalogowany

Problem tkwił, że sprawdzałeś kolosy 1-2, 2-3, 1-2 zamiast 1-2, 2-3, 1-3. Usunąłem na wszelki wypadek zewnętrzny warunek wyników, bo w takich zadaniach się go nie pisze. Pełny kod, który przeszedł:

#include <iostream>

using namespace std;

int main()
{
    double K1, K2, K3, E;
    double srednia;
    cin >> K1 >> K2 >> K3 >> E;

    srednia=(K1+K2+K3+2*E)/5;
    //cout << srednia;
    if((K1>=40 && K2>=40 && E>=40 && srednia>=50) || (K2>=40 && K3>=40 && E>=40 && srednia>=50) || (K1>=40 && K3>=40 && E>=40 && srednia>=50) )
    {
        cout <<"ZDANY";
    }
    else if ((K1>=40 && K2>=40 && E>=40 && srednia<50) || (K2>=40 && K3>=40 && E>=40 && srednia<50) || (K1>=40 && K3>=40 && E>=40 && srednia<50))
    {
        cout <<"DOPYTKA";
    }
    else
    {
        cout <<"NIEZDANY";
    }

    return 0;
}

Miałeś też rację, że średnia nie ma tutaj nic do rzeczy (nie trzeba uwzględniać int czy double). Co jest dziwne i wynika chyba tylko z przykładowych wyników jakie są brane pod uwagę przy sprawdzaniu. 

komentarz 25 marca 2017 przez Undisputed Gaduła (3,040 p.)
Racja, błąd jest z tymi kolosami.
Śmieszny głupi błąd, jednak był.

Dziękuję pięknie za pomoc :)
0 głosów
odpowiedź 25 marca 2017 przez mokrowski Mędrzec (155,460 p.)
edycja 25 marca 2017 przez mokrowski

Trochę dla wprawki, napisałem to w nowoczesnym C++. Może komuś się przyda:

EDIT: Poprawiony błąd w czyWynikPrzedmiotu50iWiecej.

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#include <numeric>
#include <tuple>

int main() {
    std::vector<unsigned> sprawdziany;
    std::copy_n(std::istream_iterator<unsigned>(std::cin), 4,
        std::back_inserter(sprawdziany));
    // Bo ostatnim elementem jest egzamin.
    auto kolokwiaKoniec = sprawdziany.cend() - 1; 

    bool czyKolokwiaZdane = std::count_if(sprawdziany.cbegin(), kolokwiaKoniec,
            [](const unsigned wynik) {
                return wynik >= 40;
            }) >= 2;
    bool czyEgzaminZdany = *kolokwiaKoniec >= 40;
    bool czyWynikPrzedmiotu50iWiecej = ((std::accumulate(sprawdziany.cbegin(),
            sprawdziany.cend(), 0) + *kolokwiaKoniec) / 5) >= 50;

    auto wyniki = std::make_tuple(
            czyKolokwiaZdane, czyEgzaminZdany, czyWynikPrzedmiotu50iWiecej);

    // Kryteria decyzji
    auto zdany = std::make_tuple(true, true, true);
    auto dopytka = std::make_tuple(true, true, false);
    
    if(zdany == wyniki) {
        std::cout << "ZDANY";
    } else if(dopytka == wyniki) {
        std::cout << "DOPYTKA";
    } else {
        std::cout << "NIEZDANY";
    }
}

 

komentarz 25 marca 2017 przez niezalogowany
Wydaje mi się, że coś działa nie tak dla zestawu danych "80 72 90 45". Powinno wyjść "zdane" - a to się nie dzieje.
komentarz 25 marca 2017 przez mokrowski Mędrzec (155,460 p.)

Dzięki... tu był błąd (teraz poprawione):

bool czyEgzaminZdany = *kolokwiaKoniec >= 50;

Dzięki... W systemie nie jestem zarejestrowany więc jeśli jeszcze arbiter nie zalicza to daj(cie) znać. Z uwag, myślę że nieco dokładniej powinna brzmieć informacja o średniej ważonej. Po głębszym wczytaniu się myślę że można także przyjmować interpretację z dzieleniem przez 4.

komentarz 25 marca 2017 przez niezalogowany
Nadal występują jakieś problemy. Nie jest to chyba problem nieprzyjmowania nowszych rozwiązań, bo machina sprawdzająca pokazuje, że przechodzi 11% wyników( z poprzednią wersją kodu 22%).
komentarz 25 marca 2017 przez mokrowski Mędrzec (155,460 p.)
Spoko :-) Zostawiam dla potomności. I tak chciałem sprawdzić wartościowanie tuple i użycie algorytmów. Jak ktoś będzie chciał to się będzie bawił :-)
komentarz 25 marca 2017 przez niezalogowany
W sumie jak zobaczyłem Twój post to chętnie się pobawię tymi klockami :) Jak znajdę problem dam znać :)
komentarz 25 marca 2017 przez mokrowski Mędrzec (155,460 p.)
Oczywiście... Dalsze (po znalezieniu błędu) wyzwanie brzmi, nie użyć jawnie if'a :-)

Podobne pytania

0 głosów
1 odpowiedź 483 wizyt
0 głosów
1 odpowiedź 418 wizyt
0 głosów
2 odpowiedzi 2,479 wizyt
pytanie zadane 13 grudnia 2015 w C i C++ przez Ciri Gaduła (3,380 p.)

92,568 zapytań

141,421 odpowiedzi

319,629 komentarzy

61,956 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!

...