• 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++

0 głosów
98 wizyt
pytanie zadane 6 listopada 2020 w C i C++ przez n0sk1llexe Początkujący (300 p.)
zamknięte 12 lipca 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 VIP (136,880 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 VIP (136,880 p.)
Zmienne wynik i iens są niezainicjowane. Jeżeli średnia jest równa zero też będą problemy.
komentarz 4 stycznia przez n0sk1llexe Początkujący (300 p.)
edycja 13 stycznia 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

0 głosów
1 odpowiedź 80 wizyt
pytanie zadane 29 czerwca 2020 w C i C++ przez Bartosz Kuligowski Nowicjusz (120 p.)
0 głosów
1 odpowiedź 238 wizyt
0 głosów
4 odpowiedzi 225 wizyt
pytanie zadane 2 listopada 2015 w C i C++ przez Aleksandra Nowicjusz (140 p.)

85,774 zapytań

134,555 odpowiedzi

298,695 komentarzy

56,666 pasjonatów

Advent of Code 2021

Top 15 użytkowników

  1. 64p. - nidomika
  2. 62p. - ScriptyChris
  3. 60p. - Whistleroosh
  4. 57p. - adrian17
  5. 55p. - CC PL
  6. 55p. - B4mbus
  7. 53p. - Klaudia
  8. 50p. - WhiskeyTaster
  9. 47p. - rucin93
  10. 45p. - tokox
  11. 44p. - Adrian Rębisz
  12. 43p. - Michał Tartanus
  13. 41p. - Jarosław Roszyk
  14. 38p. - Argeento
  15. 18p. - Marcin Harasimowicz
Szczegóły i pełne wyniki

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...