Program wybierający liczbę najbliższą średniej

0

Witam.
Mam do napisania program mający policzyć średnią z 5 podanych przez usera liczb, a następnie ma z pośród nich wyświetlić tą która jest najbliższa wartością średniej.
Ale nie mam pojęcia jak się za to zabrać, tzn. mam już program liczący średnią ale nie wiem jak to dalej pociągnąć.
Obecnie program wygląda tak:

#include <iostream>

using namespace std;


//float srednia;

int main()
{
    float a,b,c,d,e;
    cout << "podaj 5 liczb podzielonych spacja: ";
    cin>>a>>b>>c>>d>>e;

    //srednia=(a+b+c+d+e)/5;

    cout<<(a+b+c+d+e)/5;
    return 0;
}
 
0

Zapisz sobie średnią w zmiennej, następnie po każdej liczbie musisz obliczyć wartość bezwzględną z różnicy tej liczby i średniej. Najmniejsza różnica oznacza liczbę najbliższą Twojej średniej.

abs(srednia-liczba)
0

Ładuj wczytywanie liczby do tablicy, potem pętla po niej i znajdujesz najmniejsza wartość abs(tab[i] - srednia). Przechowaj gdzieś ta liczbę, albo jej indeks

1

Spytaj jeszcze prowadzącego zajęcia, co masz wypisać gdy jest kilka liczb najbliższych. Np. użytkownik wpisał 2 2 3 5 8, średnia wynosi 4. Co wypisać 3, 5, obie te liczby?

0

Napisałem program obliczający średnią i obliczający wartość bezwzględną z podanych liczb ale nie wiem co dalej?

 #include <iostream>
#include <cstdlib>
#include <cmath>

using namespace std;


//float srednia;

int main()
{
    float a,b,c,d,e;
    float srednia;
    cout << "podaj 5 liczb podzielonych spacja: ";
    cin>>a>>b>>c>>d>>e;

    srednia=(a+b+c+d+e)/5;
    cout<<srednia<<endl;

    abs(srednia-a);
    cout<<srednia-a<<endl;
    abs(srednia-b);
    cout<<srednia-b<<endl;;
    abs(srednia-c);
    cout<<srednia-c<<endl;
    abs(srednia-d);
    cout<<srednia-d<<endl;
    abs(srednia-e);
    cout<<srednia-e<<endl;


    return 0;
}
0

ABSowanie floata jest mocno nieprzewidywalne, poza tym na twoim miejscu użył bym tablicy zamiast 5 zmiennych, i potem szukał minimum tak

min = tab[0];
for (int i = 1;i< 5;i ++)
   if (tab[i] < min) min = tab[i];

Pisane z palca bezpośrednio tu, więc może wymagać drobnych poprawek

0

@kropto, dla typu float - fabs()

0

Mógłby ktoś sprawdzić dla różnych danych?

@kropto Może tak lepiej? Też specem nie jestem, chętnie przyjmę każda krytykę :P

#include <iostream>
#include <vector>

using namespace std;

int main()
{
	unsigned int srednia_z = 5;
	vector<float> vf(srednia_z);
	float srednia = 0.0;
	cout << "podaj " << srednia_z << " liczb podzielonych spacja: ";
	for (auto& f : vf) {
		cin >> f;
		srednia += f;
	}
	srednia /= vf.size();
	float min = INT_MAX;
	float res = 0.0;
	for (auto f : vf) {
		float tmp = fabs(srednia - f);
		if (tmp < min) {
			min = tmp;
			res = f;
		}
	}
	cout << "Najblizsza liczba do " << srednia << " jest " << res;
        return 0; 
}
0

jak w c++ pokazać w programie liczbę najbliższą jakiejś wartości ?
np. z 5 liczb ta która jest najbliższa zero.

4

Może tak:

#include <algorithm>
#include <iostream>
#include <iterator>
#include <valarray>
#include <cmath>
using namespace std;
 
int main()
  {
   const size_t Size=5;
   valarray<double> tb(Size);
   cout<<"Podaj "<<Size<<" liczb: ";
   istream_iterator<double> din(cin);
   copy_n(din,tb.size(),begin(tb));
   double avg=tb.sum()/tb.size();
   valarray<double> cp(Size);
   transform(begin(tb),end(tb),begin(cp),[&avg](double v) { return fabs(v-avg); });
   size_t pos=min_element(begin(cp),end(cp))-begin(cp);
   cout<<"Najblizszy tb["<<pos<<"]="<<tb[pos]<<';'<<endl;
   return 0; 
  }
0

A czy taka wersja programu się nada:

#include <iostream>
#include <math.h>

using namespace std;


int main()
{
    float a,b,c,d,e,srednia,najbl;

    cout << "podaj 5 liczb oddzielonych spacja"<< endl;
    cin>>a>>b>>c>>d>>e;
    srednia=(a+b+c+d+e)/5;
    cout<<"srednia tych liczb to: "<<srednia<<endl;

    najbl=a;
    if(fabs(srednia-b)<(srednia-a)) najbl=b;
    if(fabs(srednia-c)<(srednia-najbl)) najbl=c;
    if(fabs(srednia-d)<(srednia-najbl)) najbl=d;
    if(fabs(srednia-e)<(srednia-najbl)) najbl=e;

    cout<<"liczba najblizej sredniej to: "<<najbl<<endl;

    return 0;
}
 
3
kropto napisał(a):

A czy taka wersja programu się nada ...
Teoretycznie - tak, ale wyobraź sobie że tuż przed zajęciami okazało się że źle zadanie odczytałeś/przepisałeś/otrzymałeś i trzeba 50 liczb a nie 5 (zwyczajnie zero się zagubiło) - to co leżysz i kwiczysz?

1

Prowadzący musiałby mieć sporego kaca żeby Ci to zaliczyć jako rozwiązanie. To jest rozwiązanie na poziomie kogoś kto nigdy nie programował. Jeśli chcesz tak być traktowany to OK. Jak napisał _13th_Dragon - napisz program który obsłuży 5,50,5000 liczb. Bo co teraz jest to takie "Ala ma kota" w dziedzinie informatyki.

Krok 1: pętle
http://guidecpp.cal.pl/cplus,loops
http://cpp0x.pl/kursy/Kurs-C++/Poziom-2/Petla-do-while/18
http://cpp0x.pl/kursy/Kurs-C++/Poziom-2/Petla-for/294

0

mam takie pytanie czy da się ten program ulepszyć tak aby uwzględniał możliwość wystąpienia dwóch wartości pasujących do założenia, a jeśli tak to jak.
Pytam z czystej ciekawości bo po mojemu łatwiej jest go zbudować na tablicach, lub pętlach:

#include <iostream>
#include <math.h>

using namespace std;


int main()
{
    float a,b,c,d,e,srednia,najbl;

    cout << "podaj 5 liczb oddzielonych spacja"<< endl;
    cin>>a>>b>>c>>d>>e;
    srednia=(a+b+c+d+e)/5;
    cout<<"srednia tych liczb to: "<<srednia<<endl;

    najbl=a;
    if(fabs(srednia-b)<(srednia-a)) najbl=b;
    if(fabs(srednia-c)<(srednia-najbl)) najbl=c;
    if(fabs(srednia-d)<(srednia-najbl)) najbl=d;
    if(fabs(srednia-e)<(srednia-najbl)) najbl=e;

    cout<<"liczba najblizej sredniej to: "<<najbl<<endl;

    return 0;
}
 

przykładowo jeżeli w programie są podane dane w których liczby to: 3 i 7 a średnia to 5

0

Wczoraj o 11 napisałem:

Spytaj jeszcze prowadzącego zajęcia, co masz wypisać gdy jest kilka liczb najbliższych. Np. użytkownik wpisał 2 2 3 5 8, średnia wynosi 4. Co wypisać 3, 5, obie te liczby?

Znasz już odpowiedź na to pytanie?

0

kod teraz wygląda następująco:

#include <iostream>
#include <iostream>
#include <math.h>

using namespace std;


int main()
{
    float a,b,c,d,e,srednia,najbl;

    cout << "podaj 5 liczb oddzielonych spacja"<< endl;
    cin>>a>>b>>c>>d>>e;
    srednia=(a+b+c+d+e)/5;
    cout<<"srednia tych liczb to: "<<srednia<<endl;

    najbl=a;
    if(fabs(srednia-b)<(srednia-a)) najbl=b;
    if(fabs(srednia-c)<(srednia-najbl)) najbl=c;
    if(fabs(srednia-d)<(srednia-najbl)) najbl=d;
    if(fabs(srednia-e)<(srednia-najbl)) najbl=e;

    cout<<"liczby najblizej sredniej to: "<<najbl<<endl;
    float epsilion = 0.00000001;
    if(fabs(a-najbl) < epsilion)
        cout<<a<<" ";
    if(fabs(b-najbl) < epsilion)
        cout<<b<<" ";
    if(fabs(c-najbl) < epsilion)
        cout<<c<<" ";
    if(fabs(d-najbl) < epsilion)
        cout<<d<<" ";
    if(fabs(e-najbl) < epsilion)
        cout<<e<<" ";

    //cout<<"liczby najblizej sredniej to: "<<najbl<<endl;

    return 0;
}

 

i wszystko działa tylko nie wiem po co na końcu jeszcze raz podaje wartość liczby najbliższej średniej ?

0

jak go zmieniłem na coś takiego to teraz działa prawidłowo :

 #include <iostream>
#include <math.h>

using namespace std;


int main()
{
    float a,b,c,d,e,srednia,najbl;

    cout << "podaj 5 liczb oddzielonych spacja"<< endl;
    cin>>a>>b>>c>>d>>e;
    srednia=(a+b+c+d+e)/5;
    cout<<"srednia tych liczb to: "<<srednia<<endl;

    najbl=a;
    if(fabs(srednia-b)<(srednia-a)) najbl=b;
    if(fabs(srednia-c)<(srednia-najbl)) najbl=c;
    if(fabs(srednia-d)<(srednia-najbl)) najbl=d;
    if(fabs(srednia-e)<(srednia-najbl)) najbl=e;

    cout<<"liczby najblizej sredniej to: "<<najbl<<endl;
    float epsilion = 0.00000001;
    if(fabs(a-najbl) < epsilion)
        //cout<<a<<" ";
    if(fabs(b-najbl) < epsilion)
        //cout<<b<<" ";
    if(fabs(c-najbl) < epsilion)
        //cout<<c<<" ";
    if(fabs(d-najbl) < epsilion)
        //cout<<d<<" ";
    if(fabs(e-najbl) < epsilion)
        //cout<<e<<" ";

    //cout<<"liczby najblizej sredniej to: "<<najbl<<endl;

    return 0;
}
1

Nie epsilion, ale epsilon. Epsilon, to nazwa greckiej litery \epsilon używanej standardowo w matematyce do oznaczania małych liczb.

    cout<<"liczby najblizej sredniej to: ";
    float roznica = fabs(srednia - najbl);
    float epsilon = 0.00000001;
    if(fabs(fabs(a-srednia) - roznica) < epsilon)
        cout<<a<<" ";
    if(fabs(fabs(b-srednia) - roznica) < epsilon)
        cout<<b<<" ";
    if(fabs(fabs(c-srednia) - roznica) < epsilon)
        cout<<c<<" ";
    if(fabs(fabs(d-srednia) - roznica) < epsilon)
        cout<<d<<" ";
    if(fabs(fabs(e-srednia) - roznica) < epsilon)
        cout<<e<<" ";
0

Jeżeli chcemy wypisać kilka najbliższych to:

#include <algorithm>
#include <iostream>
#include <iterator>
#include <valarray>
#include <cmath>
using namespace std;
 
int main()
  {
   const size_t Size=5;
   valarray<double> tb(Size);
   cout<<"Podaj "<<Size<<" liczb: ";
   istream_iterator<double> din(cin);
   copy_n(din,tb.size(),begin(tb));
   double avg=tb.sum()/tb.size();
   cout<<"Srednia "<<avg<<endl;
   valarray<double> cp(Size);
   transform(begin(tb),end(tb),begin(cp),[&avg](double v) { return fabs(v-avg); });
   double val=*min_element(begin(cp),end(cp));
   cout<<"Najblizsze:"<<endl;
   for(unsigned i=0;i<cp.size();++i) if(cp[i]==val) cout<<"tb["<<i<<"]="<<tb[i]<<';'<<endl;
   return 0; 
  }
0
 
#include <iostream>
#include <math.h>
#include <stdlib.h>

using namespace std;

int main()
{
float liczba[4],ne,wynik[4],s,s1=0;
cout<<"Podaj 5 liczb oddzielajac je spacja:";
for(int i=0; i<=4; i++)
{
    cin>>liczba[i];
}
cout<<endl<<liczba[0]<<endl;
for(int i=0; i<=4; i++)
{
    s1=s1+liczba[i];
}
s=s1/5;
cout<<"srednia jest rowna:"<<s<<endl;
//cout<<liczba[0]<<'\n'<<liczba[1]<<endl;;



/*for(int i=0; i<=4; i++)
{
    wynik[i]=fabs((fabs(s))-(fabs(liczba[i])));
}*/

wynik[0]=fabs(fabs(s)-fabs(liczba[0]));
wynik[1]=fabs(fabs(s)-fabs(liczba[1]));
wynik[2]=fabs(fabs(s)-fabs(liczba[2]));
wynik[3]=fabs(fabs(s)-fabs(liczba[3]));
wynik[4]=fabs(fabs(s)-fabs(liczba[4]));
cout<<liczba[0]<<endl;
ne=liczba[0];


//alternatywna metoda bez petli
/*if(wynik[0]>=wynik[1]) ne=liczba[1];
if(wynik[1]>=wynik[2]) ne=liczba[2];
if(wynik[2]>=wynik[3]) ne=liczba[3];
if(wynik[3]>=wynik[4]) ne=liczba[4];
  /*  for(int i=1; i<=4; i++)
{
    if(wynik[i-1]>=wynik[i]) ne=liczba[i];
}*/



cout<<"najblizsza liczba:"<<ne;
return 0;
}


Może mi ktoś powiedzieć dlaczego w tym momencie:

wynik[0]=fabs(fabs(s)-fabs(liczba[0]));
wynik[1]=fabs(fabs(s)-fabs(liczba[1]));
wynik[2]=fabs(fabs(s)-fabs(liczba[2]));
wynik[3]=fabs(fabs(s)-fabs(liczba[3]));
wynik[4]=fabs(fabs(s)-fabs(liczba[4]));
cout<<liczba[0]<<endl;
ne=liczba[0];

nagle liczba[0] jest równa 5 zamiast 6,5?
Zamierzam jeszcze uogólnić program jeśli chodzi o ilość liczb do pracy, ale na tę chwilę potrzebuję pomocy w tej części. Proszę o pomoc :(

2

Alokujesz tablice na cztery elementy, a wczytujesz pięć.

0
  1. Zapoznaj się z pojęciem formatowania kodu: http://4programmers.net/Forum/998482
  2. Zapoznaj się z inkrementacją, bo jej nie rozumiesz: http://4programmers.net/Forum/1101404
  3. Nie używaj innego niż angielskie nazewnictwa: http://4programmers.net/Forum/1208091
  4. Jak już wspomniał @Patryk27 - niepoprawna allokacja więc wyłazisz poza przydzieloną pamięć
  5. Nigdzie nie szukasz tej minimalnej wartości.
0

Czyli float liczba[5] jest jednoznaczne z float liczba[1], float liczba[2], float liczba[3], float liczba[4], float liczba[5]
czy
float liczba[0], float liczba[1], float liczba[2], float liczba[3], float liczba[4], float liczba[5]?

2

Iteruje się od zera.
Pisząc int tablica[4]; alokujesz tablicę mającą cztery elementy o indeksach 0, 1, 2 oraz 3 (ale już bez czwórki, bo to byłby piąty element!).

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