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

Średnia arytmetyczna

Object Storage Arubacloud
0 głosów
1,104 wizyt
pytanie zadane 6 maja 2016 w Programowanie przez Kornel Howil Początkujący (260 p.)
zmienione kategorie 6 maja 2016 przez Kornel Howil

Witam, 

Program ma za zadanie wypisywać liczbę najbiższą średniej podanych liczb. Bardzo dobrze działa dla jednej próby. Przy ich większej ilości wypisuje albo nie tą liczbę, albo nawet liczbę, której w danym zestawie nie wpisywałem. Prosiłbym o jakąś podpowiedź

include <iostream>
#include <math.h>
using namespace std;

int main()
{
    //dane wpisane
    int prob, liczb;
    //zmienne do tablic
    int a, b, c, d;
    a=1;
    b=0;
    c=1;
    d=0;
    //bufory
    int buf1, buf2, buf3;
    //tablice
    float wczytane [500];
    float suma[500];
    float srednia[500];
    float wynik[500];
    suma[0] = srednia[0] = 0;
    cout << "Podaj liczbe prob: ";
    //Liczba prob
    cin >> prob;
    //ustalenie wartosci pierwszego bufora
    buf1 = prob;
    //Wczytywanie liczb i liczenie sredniej podana ilosc razy
    while(prob>0)
    {
        cout << "Ilosc liczb: ";
        //Ilosc liczb
        cin >> liczb;
        //Ustalenie wartosci drugiego bufora
        buf2=liczb;

        cout << "Podaj " << liczb << " liczb odzielonych spacja: ";

        //Wczytywanie podanej iloœci liczb do tabeli
        while(liczb>0)
        {
            cin >> wczytane[a];
            suma[c] = suma[c-1] + wczytane[a];
            a++;
            c++;
            liczb--;
        }

        //Liczenie sreniej podanej iloœci liczb
        srednia[b] = suma[c-1]/buf2;
        b++;

        //i=k=1;

        prob--;
    }
    //przypisanie poczatkowych wartosci zmiennych
    b=0;
    a=1;
    //przypisanie wartosci bufora
    buf3=buf2;
    //Wypisywanie najbliższej do średniej liczby
    while(buf1>0)
    {
        /*cout << srednia[b] << endl;
        buf1--;
        b++;*/
        
        buf2=buf3;

        float m = fabs(srednia[b]-wczytane[a]);
        while(buf2>0)
        {

            if(fabs(srednia[b] - wczytane[a]) < m)
            {
                m = fabs(srednia[b] - wczytane[a]);
                wynik[d] = wczytane[a];
            }
            a++;

            buf2--;
        }
        b++;
        cout << wynik[d] << endl;
        d++;
        buf1--;

    }

    return 0;
}

 

2 odpowiedzi

+1 głos
odpowiedź 7 maja 2016 przez CzikaCarry Szeryf (75,340 p.)

Po 1: Po co Ci bufory? Wystarczy, że na początku pobierzesz zmienną "liczb", a później gdy będziesz potrzebował wykonać "liczb" iteracji w pętli to wystarczy dać coś takiego:

cin>>liczb;

int i=0; 
 

  while(i<liczb)  //pętla wykona się "liczb" razy
    {
      //jakiś kod
      i++;
    }

    i=0;  //przypisujesz wartość 0 iteratorowi

     while(i<liczb)  //znów pętla wykona się "liczb razy
    {
      //jakiś kod
      i++;
    }

Można tak robić ile razy się chce w jednym kodzie bez konieczności używania pierdyliarda buforów. Po 2: Nie potrzebne Ci są te tablice suma, srednia, wynik, ponieważ SPOJ (zgaduję, że zadanie ze SPOJa) sam rozpoznaje, co jest outputem. Co to oznacza? Nie musisz podawać wyników "na sam koniec", możesz je podawać zaraz po podaniu zestawu liczb dla których masz obliczyć wynik, czyli nie musi być tak:

Input:
3
4 1 2 3 4 
4 4 3 2 1
4 0 3 2 4

Output:
2
3
2

ale może być tak:

input :3
input :4 1 2 3 4 
output:2
input: 4 4 3 2 1
output:3

input: 4 0 3 2 4
output:2

 

Więc możesz te wczytywanie liczb, obliczanie średniej, wyniku, oraz wypisywanie wyniku wpakować do jednej pętli, aby nie robić bałaganu. Kod ten jest tak nieczytelny, że trudno tu dowiedzieć się, co tu jest nie takk, że wypisuje niepoprawny wynik. Przydałby się debugger. W tej kwestii ci nie pomogę, napisz program na nowo stosując się do wskazówek!

Pozdrawiam, miłego kodowania!

0 głosów
odpowiedź 6 maja 2016 przez niezalogowany
Nie rozumiem po co używasz tablic suma, średnia, wynik. Moim zdaniem wystarczy: wczytać liczby do tablicy, zsumować je i wpisać do zmiennej suma, policzyć średnią i zapisać w zmiennej średnia, a potem pętlą for zrobić sprawdzenie (czy wartość bezwzględna różnicy obecnie najbliższej liczby i średniej jest mniejsza od wartości bezwzględnej różnicy kolejnej liczby pobranej z tablicy i średniej), a potem tylko wypisać otrzymaną liczbę, powodzenia :)

Podobne pytania

0 głosów
1 odpowiedź 1,030 wizyt
pytanie zadane 7 sierpnia 2018 w SPOJ przez Piotr Błaszczak Bywalec (2,890 p.)
+1 głos
1 odpowiedź 496 wizyt
pytanie zadane 29 czerwca 2018 w C i C++ przez ernest52 Początkujący (450 p.)
0 głosów
2 odpowiedzi 334 wizyt

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

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

...