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

Znajdowanie liczby najbliżej średniej - przypadek, gdy jest więcej niż jedna takich liczb

Object Storage Arubacloud
+1 głos
336 wizyt
pytanie zadane 19 czerwca 2022 w C i C++ przez Noizz00 Użytkownik (910 p.)

Witam,

ostatnio zabrałem się na napisanie programu z 'pracy domowej' z kursu p. Zelenta (LINK). Trafiłem na barierę jaką jest rozpatrzenie takiego przypadku, w którym istnieją dwie różne najbliższe średniej liczby, np. średnia = 5, x = 6.5, y=3.5. Zauważyłem, że wtedy zawsze jedna liczba jest większa od średniej, a druga - mniejsza i chciałem z tego skorzystać. Program poniżej.

#include <iostream>

using namespace std;

float liczba[5], suma, srednia, n, roznica[5], najblizszaw, najblizszam;
int w[5], m[5];

int main()
{
    for(int i=0; i<5; i++)
    {
        cout << "Podaj "<<i+1<<" liczbe: ";
        cin >> liczba[i];
        suma+=liczba[i];
    }
    srednia=suma/5;
    cout << "Srednia podanych liczb wynosi: "<<srednia;
    for(int i=0; i<5; i++)
    {
        if(liczba[i]>=srednia) {roznica[i]=liczba[i]-srednia, w[i]=1, m[i]=0;}
        else if(liczba[i]<=srednia) {roznica[i]=srednia-liczba[i]; w[i]=0; m[i]=1;}
    }
    n=roznica[0];
    for(int i=1; i<=5; i++)
    {
        if((w[i]==1)&&(n>=roznica[i])) {n=roznica[i]; najblizszaw=liczba[i];}
        else if((m[i]==1)&&(n>=roznica[i])) {n=roznica[i]; najblizszam=liczba[i];}
    }
    cout << endl << najblizszaw;
    cout << endl << najblizszam;
    return 0;
}

najblizszaw - liczba najbliższa średniej, która jest od niej większa, najblizszam - która jest od niej mniejsza. Tablice w[5] i m[0] przechowują 1 i 0 informujące, czy liczba jest większa lub mniejsza od średniej (ustawiane jest to w pierwszej pętli for). Program niestety za każdym razem podaje jedną najbliższą średniej liczbę. Dla zestawu 6.5., 3.5., 0, 15, 0 podaje kolejno liczby 0 i 3.5 (3.5. jest mniejsza od średniej 5 i jest wyświetlana jako druga z kolejności, co by się z programem zgadzało). 

Macie jakieś łatwiejsze pomysły od mojego, bądź wiecie, jak zmienić moje warunki tak, aby było dobrze? Nie mam już pomysłów, siedziałem nad tym już z parę godzin i się poddaję. 

2 odpowiedzi

+1 głos
odpowiedź 19 czerwca 2022 przez Whistleroosh Maniak (56,980 p.)
W linii 24. powinieneś iterować się od 0 do 4. Ale nawet jak to naprawisz to program i tak nie będzie działał tak jak należy. Np. dla danych: 15, 3.5, 7.5, 0, 0 średnia to 5.2, a program wypisze 15 i 3.5
0 głosów
odpowiedź 20 czerwca 2022 przez VBService Ekspert (252,660 p.)
edycja 20 czerwca 2022 przez VBService

Proponuje takie rozwiązanie,

  • deklaruje tablice np. 6 elementową
  • od użytkownika pobieram 5 liczb (5 elementów tablicy)
  • obliczam średnią
  • dodaję wartość średniej do tablicy (6-ty element)
  • sortuję tablicę (od najmniejszej do największej)
  • sprawdzam w pętli na której pozycji występuje wartość średniej
  • odejmuje 1 indeks dla "Najbliższa min" i dodaje 1 indeks dla "Najbliższa max"
  • wychodzę z pętli  - break (dalsze przeszukiwanie tablicy jest zbędne)

 

przykład  [ on-line ]

#include <iostream>
 
using namespace std;

int main()
{
    float liczba[6], suma=0, srednia=0;
    
    for (int i=0; i<5; i++)
    {
        cout << "Podaj " << i+1 << " liczbe: ";
         cin >> liczba[i];
        suma += liczba[i];
    }

    srednia = suma/5;
    cout << "Srednia podanych liczb wynosi: " << srednia << endl;
    
    liczba[5] = srednia;

    float temp=0;
    for (int i=0; i<5; i++)
        for (int j=i+1; j<6; j++)
            if (liczba[i] > liczba[j])
            {
                temp = liczba[j];
                liczba[j] = liczba[i];
                liczba[i] = temp;
            }

    for (int i=0; i<6; i++)
        if (liczba[i] == srednia)
        {
            cout << "Najbliższa min: " << liczba[i-1] << endl;
            cout << "Najbliższa max: " << liczba[i+1] << endl;
            break;
        }

    return 0;
}

Podobne pytania

0 głosów
2 odpowiedzi 706 wizyt
0 głosów
2 odpowiedzi 503 wizyt
0 głosów
2 odpowiedzi 340 wizyt

92,536 zapytań

141,376 odpowiedzi

319,451 komentarzy

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

...