Liczenie średniej liczb i wyznaczanie liczby najbliższej średniej – problem z liczbami ujemnymi

0

Próbuje przebrnąć przez kurs pana Zalenta i podczas 11 lekcji zadał on zadanie domowe: Mam napisać program który liczy średnią z pięciu liczb po czym znajduje liczbę z tych pięciu najbardziej zbliżoną do średniej. Wiem jest rozwiązanie na internecie ale chciałbym żeby to był moj autorski pomysł. Pisałem już 4 kody i cały czas ginę w jednym miejscu.. wymyśliłem że odejmę liczby od średniej i tak otrzymam wartość jaka różni daną liczbę od średniej ale problem pojawia się gdy dana liczba jest minusowa nie potrafię przekształcić jej na dodatnią wychodzą mi jakieś dziwne wyniki albo zero.
To jest kod w którym próbowałem użyć tablic:

#include <iostream>

using namespace std;
int liczby[5];
int srednia=0;
int srednia1=0;
int roznice[5];
int liczbaMinusowa=-1;
int main()
{
    for (int i =0;i<5;i++){
        cout<<endl<<"Podaj "<<i+1<<" liczbe do sredniej: ";
        cin >> liczby[i];
    }
    for (int i=0;i<5;i++){
        srednia+=liczby[i];
      srednia1=srednia/5;
    }
    cout <<"srednia"<<srednia1<<endl;
    {
        for (int i =0;i<5;i++){
            roznice[i]=liczby[i+1-srednia1];
            if (roznice[i]<0){
                roznice[i]=-roznice[i];
            }
                 else
                    roznice[i]=roznice[i];
        }
        cout<<"roznica: "<<roznice[1];
    }

    return 0;
}

A tu jest tzw kamieniologia ale i ona nie pomogła:

#include <iostream>

using namespace std;
int liczby[5];
int sumaLiczbWtablicy=0;
int srednia;
int roznica[5];
int daneDoPorownania[5];
int liczbaMinusowa=(-1);

int main()
{
    for (int i=0; i<5; i++){
        cout<<endl<<"Podaj "<<i+1<<" liczbe do sredniej: ";
        cin >> liczby[i];
    }
    sumaLiczbWtablicy=0;
    for (int i =0; i<5; i++){
        sumaLiczbWtablicy +=liczby[i];
    }
    cout <<"Suma liczb z tablic: "<<sumaLiczbWtablicy;
    srednia=sumaLiczbWtablicy/5;
    cout << "Srednia to: " <<srednia;
    {
        roznica[1]=roznica[1]-srednia;
        if (roznica[1]<0){
            roznica[1]=-roznica[1];
        }
        else roznica[1]=roznica[1];

        roznica[2]=liczby[2]-srednia;
        if (roznica[2]<0){
            roznica[2]*(-1);
        }
        else roznica[3]=roznica[3];

        roznica[3]=liczby[3]-srednia;
        if (roznica[3]<0){
            roznica[3]*(-1);
        }
        else roznica[4]=roznica[4];

        roznica[4]=liczby[4]-srednia;
        if (roznica[4]<0){
            roznica[4]*(-1);
        }
        else roznica[4]=roznica[4];

        roznica[5]=liczby[5]-srednia;
        if (roznica[5]<0){
            roznica[5]*(-1);
        }
        else roznica[5]=roznica[5];
    }
    cout <<"roznica 1:"<<roznica[1];

    return 0;
}

Juz naprawiłem

2

Tak swoja droga to webowka zelenta jest ok ale kurs Cpp lepiej porzuc i ucz sie z czegos innego bo ten jest kiepski a dla newbie sprawia wrazenie supermerytorycznego i to blad

A z problemem nie pomoge bo wkleiles plain text i sie tego czytac nie da

2

Do przekształcenia liczby ujemnej na dodatnią możesz użyć funkcji abs, która wyciąga wartość bezwzględną.

#include<cstdlib>

int a = -250;
std::cout << abs(a);
0
Draaz napisał(a):

Do przekształcenia liczby ujemnej na dodatnią możesz użyć funkcji abs, która wyciąga wartość bezwzględną.

#include<cstdlib>

int a = -250;
std::cout << abs(a);

Dzięki też myślałem o wartości bezwzględnej. Czyli mój kod jest zły tak? nie idzie go naprawić tak żeby dział?

0
stivens napisał(a):

Tak swoja droga to webowka zelenta jest ok ale kurs Cpp lepiej porzuc i ucz sie z czegos innego bo ten jest kiepski a dla newbie sprawia wrazenie supermerytorycznego i to blad

A z problemem nie pomoge bo wkleiles plain text i sie tego czytac nie da
Już działa. To jest tylko uzupełnienie bo w założeniu mam wziąć się za jave.

1

Ale Ty chcesz średnią bez rozwinięcia dziesiętnego? Bo użyłeś zmiennych int zamiast float czy raczej to błąd jak się domyślam?

0

Zapisz wartości bezwzględne z tego odejmowania każdego elementu od średniej w np. tablicy / vectorze i go posortuj, a następnie weź 1 element lub ostatni - zależy jak sortujesz malejąco lub rosnąco.

2

Tak po chłopsku:
Potrzebujesz trzech zmiennych:

  • tablicę do trzymania liczb
  • zmienną na trzymanie średniej
  • zmienną na trzymanie indeksu liczby najbliższej średniej
#include <iostream>

int main( int argc, char** argv )
{
  int numbs[ 5 ];
  int average = 0, index = 0;
  for ( int i = 0; i < 5; ++i ) {
    std::cout << "Podaj " << i + 1 << " liczbe: ";
    std::cin >> numbs[ i ];
    average += numbs[ i ];
  }
  average /= 5;
  std::cout << "Srednia: " << average << "\n";
  for ( int i = 0; i < 5; ++i ) {
    if ( abs( numbs[ i ] - average ) < abs( numbs[ index ] - average ) ) {
      index = i;
    }
  }
  std::cout << "Liczba najblizsza sredniej: " << numbs[ index ] << "\n";
  return 0;
}
1

A jak pytałeś o Twój kod czy można to rozwiązać bez wartości bezwzględnej to może być to chociażby coś takiego:

#include <iostream>
using namespace std;

int main()
{
    float liczby[5];
    float srednia=0;
    float roznica;

    for (int i =0;i<5;i++)
    {
        cout<<endl<<"Podaj "<<i+1<<" liczbe do sredniej: ";
        cin >> liczby[i];
        srednia+=liczby[i];
    }
 
    srednia/=5;
    cout <<"srednia "<<srednia<<endl;

    for(int i=0;i<5;i++)
    {
        if(i==0)
        {
            roznica = liczby[i] - srednia;
            if(roznica < 0)
                roznica*=-1;
        }
        else
        {
            float sprawdzanie_roznicy = liczby[i] - srednia;
            if(sprawdzanie_roznicy < 0)
                sprawdzanie_roznicy*=-1;
            if(sprawdzanie_roznicy < roznica)
                roznica = sprawdzanie_roznicy;
        }
    }
    cout<<"Najmniejsza roznica wynosi: "<<roznica<<endl;

    return 0;
}

I nie używaj zmiennych globalnych, jeśli nie ma takiej potrzeby

3

Uwaga od Zelenta można się nauczyć dużo fajnych rzeczy, ale równocześnie przyswaja się dużo złych nawyków.
Dla newbie on wygląda jak zbawca, dla tych co już coś umieją jest szkodliwym heretykiem.
Dlatego jak już ktoś ogląda jego filmy to należy zachować sceptycyzm jak do 95% zawartości internetu.

0

Bardzo wam wszystkim dziękuję jutro postaram się przeanalizować kod. Inta użyłem celowo.

0
Misza_71 napisał(a):

Inta użyłem celowo.

Szczerze mówiąc to BARDZO wątpię. Jeśli celowo, to pewnie potrafisz to jakos uzasadnić?

wychodzą mi jakieś dziwne wyniki albo zero

j/w

Dawno już nie miałem styczności z książkami/kursami początkującymi, ale a) albo jest fatalny b) albo cofnij się z tej jedenastej lekcji i to dużo.

1 użytkowników online, w tym zalogowanych: 0, gości: 1