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

Poszukiwanie liczby najbliższej średniej z podanych liczb na tablicach

Aruba Cloud - Virtual Private Server VPS
+1 głos
496 wizyt
pytanie zadane 16 lipca 2016 w C i C++ przez Krystian Strycharz Początkujący (260 p.)

Program ma wczytywać dowolną ilość liczb, z których wybierze najbliższą średniej z tych wszystkich. Algorytm wydaje mi się dobrze ułożony jednak coś jest nie tak, kiedy sprawdzam jego poprawność dla liczb:
-55; -44; -33; 22; 11. Proszę o jakąś sugestię co może zawodzić.

 

Algorytm:

  • tworzy tablicę t[] z podanymi liczbami
  • oblicza ich sumę oraz średnią
  • tworzy tablicę tr[] zawierającą odległość każdego wyrazu od średniej
  • wyraz z najbliższą odległością jest poszukiwanym wyrazem

 

#include <iostream>
#include <cmath>
#include <cstdlib>
using namespace std;

int main()
{
unsigned int n=0;
float x,  suma=0, srednia;
float t[10000];
float tr[10000];        //skrot od tablicaroznic

    cout << "Ile liczb chcesz porownac? " << endl;
    cin >> n;
    cout<< "\nPodaj te liczby: "<<endl;

    for(int i=0 ; i<n ; i++)
    {
        cin>>x;
        t[i]=x;
    }

    cout<<"\n t[]= ";
    for (int i=0; i<n; i++)
    {
        cout<<t[i]<<"   ";
        suma+=t[i];
    }

srednia=suma/n;

    cout<<"\nSuma tych liczb wynosi: "<<suma;
    cout<<"\nSrednia tych liczb wynosi: "<<srednia;

    for (int i=0; i<n; i++)
    {
        tr[i]=abs(srednia-t[i]);
        if (tr[i]==0)
            {
            cout<<"\nLiczba najblizsza sredniej to: "<<t[i];
            exit(1);
            }
    }

float najblizsza0=tr[0];

    cout<<"\n tr[]= : ";

    for(int i=0; i<n; i++)
    {
        if (tr[i]<najblizsza0) najblizsza0=t[i];
         cout<<tr[i]<<"   ";
    }

    cout<<"\nLiczba najblizsza sredniej to: "<<najblizsza0;

    return 0;
}

 

2 odpowiedzi

+1 głos
odpowiedź 16 lipca 2016 przez Krystian Strycharz Początkujący (260 p.)
Najprawdopodobniej błąd jest w ostatniej pętli, bo gdy zamiast t[i] będzie tr[i] to program wybiera "odpowiedni" wyraz z tej tablicy. Kwestia wybrania tego samego i-tego wyrazu z tablicy t[], ale nie wiem w czym dokładniej problem tkwi.
+1 głos
odpowiedź 16 lipca 2016 przez niezalogowany
1. 10000 to nie dowolna ilość 2. if (tr[i]==0) itd. jest zbędne 3. (Kluczowe) W 55 lini, wyświetlasz najmniejszą odległość, a nie najbliższą liczbę
komentarz 17 lipca 2016 przez Krystian Strycharz Początkujący (260 p.)

1. Wiem, że to nie dowolna ilość.
2. Linie 38-41 mogą wcześniej zakończyć dzianie programu jeżeli znajdzie się liczba równa średniej
3. W 51 linii jest przypisanie najbliższej liczby t[i] do zmiennej najblizsza0.

komentarz 17 lipca 2016 przez niezalogowany
2. Jest to jednak mało prawdopodobne i zazwyczaj będzie tylko marnować czas, itd. (Wiem że komputer szybki, ale i tak polecam usunąć) 3. Nie do końca, po przypisaniu t[i] do najblizsza0 porównujesz ze sobą rzeczy z tablicy t oraz tr
komentarz 17 lipca 2016 przez Krystian Strycharz Początkujący (260 p.)
Kompletnie nie rozumiem dlaczego tak się dzieje, przy testowaniu raz wskazuje wyraz z tr[] a raz z t[]. Nie mam pomysłu z czego to wynika i jak temu zaradzić. Czy możesz napisać coś więcej na ten temat?
komentarz 17 lipca 2016 przez niezalogowany
Algorytm w teorii masz dobry, ale program go nie odwzorowuje. W zmiennej najblizsza0 na początku przechowujesz pierwszysz element z tr, a potem to już tylko elementy tablicy t i porównujesz je z elementami tr. Polecam zrobić coś takiego: int adres=0; Początek tej ostatniej pętli if (tr[i]
komentarz 17 lipca 2016 przez niezalogowany
Chyba ucięło mi komentarz po napisaniu. Reszta: if(tr[i]
komentarz 17 lipca 2016 przez niezalogowany
Cały czas ucina a na telefonie nie mogę inaczej niż po prostu pisać, jutro dokończę kod
komentarz 31 lipca 2016 przez Krystian Strycharz Początkujący (260 p.)
Gdybyś mógł to dokończ swoją wskazówkę.
komentarz 1 sierpnia 2016 przez niezalogowany

Przepraszam za zwłokę, zapomniałem o tym kompletnie.

int adres=0;
najblizsza0=tr[0];

for(int i=1; i<n; i++)
{
if (tr[i]<najblizsza0)
{
adres=i;
najblizsza0=tr[i];
}
}

cout<<"Liczba najblizsza sredniej to: "<<t[adres];

 

Podobne pytania

0 głosów
1 odpowiedź 327 wizyt
0 głosów
2 odpowiedzi 470 wizyt
0 głosów
2 odpowiedzi 1,197 wizyt
pytanie zadane 17 sierpnia 2016 w C i C++ przez diov Nowicjusz (150 p.)

93,335 zapytań

142,331 odpowiedzi

322,415 komentarzy

62,670 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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...