• 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

Object Storage Arubacloud
+1 głos
262 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ź 272 wizyt
0 głosów
2 odpowiedzi 397 wizyt
0 głosów
2 odpowiedzi 751 wizyt
pytanie zadane 17 sierpnia 2016 w C i C++ przez diov Nowicjusz (150 p.)

92,579 zapytań

141,432 odpowiedzi

319,657 komentarzy

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

...