• 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

+1 głos
477 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 (57,400 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 (256,600 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 1,268 wizyt
0 głosów
2 odpowiedzi 749 wizyt
0 głosów
2 odpowiedzi 530 wizyt

93,427 zapytań

142,421 odpowiedzi

322,649 komentarzy

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

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...