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

question-closed Błąd logiczny, zadanie domowe z odcinka 11 kursu C++

Object Storage Arubacloud
0 głosów
529 wizyt
pytanie zadane 6 listopada 2020 w C i C++ przez n0sk1llexe Początkujący (300 p.)
zamknięte 12 lipca 2021 przez n0sk1llexe

Cześć, przychodzę z zapytaniem stricte logicznym. Aktualnie oglądam serię podstaw C++ i utknąłem na zadaniu domowym z odcinka nr 11.
Polecenie:

Napisz program znajdujący liczbę najbliższą średniej z 5-ciu podanych liczb.

Mimo ubogiej wiedzy podszedłem do tematu ambitnie i chciałem aby to było jednak więcej niż 5 liczb oraz nie chciałem uciekać się do biblioteki cmath. Stąd też rozpisałem warunki na if'ach lecz gdzieś zrobiłem błąd logiczny lub być może w zapisie

#include <iostream>

using namespace std;


int main()
{
    int x;
    cout << "Podaj ilosc liczb: ";
    cin >> x;
    float liczby[x];
    float suma = 0;
    for(int i=0; i<x; ++i)
    {
        cout << "Podaj " << i+1 << " liczbe: ";
        cin >> liczby[i];
        suma+=liczby[i];
    }
    float srednia = suma/x;
    float wynik;
    float closest;
    for(int i=0; i<x; ++i)
    {
        if(liczby[i]>=0 && srednia<0)
        {
            wynik=liczby[i]-srednia;
            if(wynik<closest)
            {
                closest=liczby[i];
            }
        }
        else if(liczby[i]>0 && srednia>=0)
        {
            if(liczby[i]>srednia)
            {
                wynik=liczby[i]-srednia;
                if(wynik<closest)
                {
                    closest=liczby[i];
                }
            }
        }
        else if(liczby[i]<0 && srednia<0)
        {
            if(liczby[i]>srednia)
            {
                wynik=liczby[i]-srednia;
                if(wynik<closest)
                {
                    closest=liczby[i];
                }
            }
        }
        else if(srednia>0 && liczby[i]>0)
        {
            if(srednia>liczby[i])
            {
                wynik=srednia-liczby[i];
                if(wynik<closest)
                {
                    closest=liczby[i];
                }
            }
        }
        else if(srednia>0 && liczby[i]<0)
        {
            wynik=srednia-liczby[i];
            if(wynik<closest)
                {
                    closest=liczby[i];
                }
        }
        else if(srednia<0 && liczby[i]<0)
        {
            if(srednia>liczby[i])
            {
                wynik=srednia-liczby[i];
                if(wynik<closest)
                {
                    closest=liczby[i];
                }
            }
        }
    }
    if(srednia==closest)
    {
        cout<<"Najblizsza liczba sredniej jest taka sama jak srednia, ktora wynosi: "<< srednia<<endl;
    }
    else
    {
        cout<<"Srednia wynosi: "<<srednia<<endl;
        cout<<"Najblizsza sredniej jest liczba: "<<closest<<endl;
    }
    return 0;
}

 

komentarz zamknięcia: Problem rozwiązany

1 odpowiedź

+1 głos
odpowiedź 6 listopada 2020 przez tangarr Mędrzec (154,780 p.)
wybrane 18 listopada 2020 przez n0sk1llexe
 
Najlepsza
Wywal ten cały ciąg instrukcji warunkowych.

Utwórz zmienną przechowującą indeks elementu najbliższego średniej oraz zmienną przechowująca wartość bezwzględną różnicy średniej i najbliższej jej liczby (w danej iteracji).

Na początku ustaw indeks na pierwszy element tablicy oraz oblicz wartość bezwzględną różnicy średniej i tego elementu.

Potem iteruj po kolejnych elementach tablicy i obliczaj wartość bezwzględną różnicy średniej i aktualnie sprawdzanej liczby. Jeżeli ta wartość jest mniejsza od zapisanej najmniejszej to aktualna liczba jest bliżej średniej. W tym przypadku zaktualizuj indeks i minimalną wartość bezwzględną średniej i elementu.
komentarz 18 listopada 2020 przez n0sk1llexe Początkujący (300 p.)

Dziękuje za konkretną odpowiedź, faktycznie ten sposób był dużo prostszy aniżeli próba mojego poprzedniego zapisu. Mimo wszystko, dalej gdzieś popełniłem błąd

#include <iostream>

using namespace std;

int main()
{
    int x;
    cout << "Podaj ilosc liczb: ";
    cin >> x;
    float liczby[x];
    float suma = 0;
    for(int i=0; i<x; ++i)
    {
        cout << "Podaj " << i+1 << " liczbe: ";
        cin >> liczby[i];
        suma+=liczby[i];
    }
    float srednia = suma/x;
    int iens[2]; //indeks elementu najblizszego sredniej
    float wynik;
    cout<<"Srednia wynosi: "<<srednia<<endl;
    for(int i=0; i<x; ++i)
    {
        if(liczby[i]-srednia==0)
            {
                cout << "Najblizszy liczba jest rowna sredniej, czyli wynosi" << srednia;
                break;
            }
        else
            {
            wynik = liczby[i]-srednia;
            if (wynik<0)
            {
                wynik = -wynik;
            }
            if(i<1) //Pierwszy loop petli
            {
                iens[0] = i;
            }
            else if (wynik<liczby[iens[0]]) //Warunek nadpisania zmiennej
            {
                iens[0] = i;
            }
            else if (wynik==liczby[iens[0]] && liczby[i]!=liczby[iens[0]]) //Druga zmienna w przypadku przeciwnej liczby w tej samej odleglosci
            {
                iens[1]= i;
            }
            }
    }
    if (iens[1])
        {
        cout<<"Liczbami najblizej sredniej sa " << liczby[iens[0]] << " i " << liczby[iens[1]] <<endl;
        }
    else
        {
        cout<<"Najblizsza sredniej jest liczba: "<<liczby[iens[0]]<<endl;
        }
    return 0;
}

 

komentarz 18 listopada 2020 przez tangarr Mędrzec (154,780 p.)
Zmienne wynik i iens są niezainicjowane. Jeżeli średnia jest równa zero też będą problemy.
komentarz 4 stycznia 2021 przez n0sk1llexe Początkujący (300 p.)
edycja 13 stycznia 2021 przez n0sk1llexe

Trochę mi zajęło znalezienie motywacji do skończenia tego zadania, jednak nauczyło sporo myślenia. Dziękuję tangarr za wskazówki laugh

#include <iostream>

using namespace std;

int x;

int main()
{
    cout << "Podaj ilosc liczb: ";
    cin >> x;
    float l[x]; //tablica liczb wprowadzonych przez uzytkownika
    float suma = 0;
    for(int i=0; i<x; ++i)
    {
        cout << "Podaj " << i+1 << " liczbe: ";
        cin >> l[i];
        suma+=l[i];
    }
    float srednia = suma/x;
    cout<<"Srednia wynosi: "<<srednia<<endl;
    float rabs[x]; //roznica bezwzgledna
    for(int i=0; i<x; i++)
    {
        if (srednia>l[i])
        {
            rabs[i] = srednia-l[i];
        }
        else if (srednia<l[i])
        {
            rabs[i] = srednia-l[i];
            rabs[i] = rabs[i]*(-1);
        }
        else if (srednia-l[i]==0)
        {
            cout << "Podana liczba " << l[i] << " jest rowna sredniej." << endl;
            return 0;
        }
    }
    int iens[2]; //indeks elementu bedacego najblizej sredniej
    iens[0] = 0;
    iens[1] = 0;
    for(int y=0; y<x; y++)
    {
        if (rabs[iens[0]]==rabs[y+1])
        {
            iens[1]=y+1;
        }
        else if (rabs[y]<rabs[iens[0]])
        {
            iens[0]=y;
        }
    }
    if (iens[0] < iens[1] && l[iens[0]] != l[iens[1]])
    {
        cout << "Najblizej sredniej sa liczby: " << l[iens[0]] << " oraz " << l[iens[1]] << endl;
    }
    else
    {
        cout << "Liczba najblizej sredniej jest: " << l[iens[0]] << endl;
    }
    return 0;
}

 

Podobne pytania

+2 głosów
1 odpowiedź 312 wizyt
pytanie zadane 11 lutego 2022 w JavaScript przez Jakub3kk Nowicjusz (170 p.)
0 głosów
1 odpowiedź 117 wizyt
pytanie zadane 29 czerwca 2020 w C i C++ przez Bartosz Kuligowski Nowicjusz (120 p.)
0 głosów
1 odpowiedź 371 wizyt

92,539 zapytań

141,382 odpowiedzi

319,481 komentarzy

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

...