index o wartosci najblizszej/najdalszej do sredniej z wartosci tablicy

1

Potrzebuje pomocy przy programie do szukania indexu o wartosci najblizszej i najdalszej od sredniej z wartosci tablicy. Problem polega na tym że gdy na przyklad wpisze do tablicy 3 i 2 to pokazuje ten sam index

#include <iostream>
#include <cstdlib>
using namespace std;

int main() {
	
	int numbers[] = {3,2};
	  double sum = 0;
	  double avg;

	  for (int i = 0; i < 2; i++ )
	    sum += numbers[i];
	  avg = sum / 2;
	  cout<<"Average: "<< avg <<endl;
	  int closest = numbers[0];
	  int farthest = numbers[0];
	  for (int i = 1; i < 2; i++ ) {
	    if ( abs ( avg - numbers[i] ) < abs ( avg - closest ) )
	      closest = numbers[i];
	    if ( abs ( avg - numbers[i] ) > abs ( avg - farthest ) )
	      farthest = numbers[i];
	  }
	  cout<<"First closest to average: "<< closest <<endl;
	  cout<<"First farthest from average: "<< farthest <<endl;

	return 0;
}

1

zamień abs na fabs (abs nie działa poprawnie z liczbami z przecinkiem)

0
sig napisał(a):

zamień abs na fabs (abs nie działa poprawnie z liczbami z przecinkiem)

okej ale problem dalej występuje, bierze po prostu liczbe z indexem 0 wiec jak tego uniknac? w tym przypadku wynik to powinien byc closest:2,farthest:3

0

A czemu akurat taki skoro przy obu różnica to 0.5?

0
micw napisał(a):

Problem polega na tym że gdy na przyklad wpisze do tablicy 3 i 2 to pokazuje ten sam index

sig napisał(a):

zamień abs na fabs (abs nie działa poprawnie z liczbami z przecinkiem)

https://en.cppreference.com/w/cpp/numeric/math/fabs
Czyli od C++17 to nie może być ten problem.
W starszych wersjach C++ to może mieć problem (cicha konwersja do int), ale #include<cmath> zapobiegnie takiemu ryzyku.

Prawdziwy problem tutaj to fakt, że 3 i 4 mają ten sam dystans do średniej 3.5, więc obie wartości są zarówno najbliżej jak i najdalej od średniej.
Teraz pytanie czy to faktycznie jest dla ciebie problem?

Wbrew pozorom nie jest pytanie proste do odpowiedzi: https://stackoverflow.com/a/50835839/1387438
W skrócie jeśli a < b i równocześnie b < a, to co powinno zwrócić: min(a, b) i max(a, b)? Przy czym, należy rozważać rzeczy ogólniejsze niż liczby rzeczywiste, gdzie ta koniunkcja wcale nie musi implikować równości a i b.
W wielu przypadkach preferowaną odpowiedzią jest a i b, a nie a i a (przy odruchowych implementacjach min i max).
Tu masz dokładnie ten sam problem.

Niestety standardowe algorytmy z STL też nie łapią tego problemu:
https://wandbox.org/permlink/mKOA1JOoPagFDlb7

0
MarekR22 napisał(a):
micw napisał(a):

Problem polega na tym że gdy na przyklad wpisze do tablicy 3 i 2 to pokazuje ten sam index

https://en.cppreference.com/w/cpp/numeric/math/fabs
Czyli od C++17 to nie może być problem.
#include<cmath> rozwiąże problem, o którym myślisz.

Prawdziwy problem tutaj to fakt, że 3 i 4 mają ten sam dystans do średniej 3.5, więc obie wartości są zarówno najbliżej jak i najdalej od średniej.
Teraz pytanie czy to faktycznie jest dla ciebie problem?

tak, masz pomysł jak to zrobić?

1

Najpierw odpowiedz na pytanie jakie powinny według ciebie powinny być prawidłowe wyniki dla takich danych wejściowych:

a: 
b: 4
c: 3 5
d: 3 3 3 5 5 5

Pewnie jak sobie na nie odpowiesz, to będziesz wiedział co z tym zrobić.

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