[C++] Wyszukiwanie zmiennej najblizszej wynikowi


(Quzziy) #1

Witam nie bardzo wiedzialem jak ująć problem w temacie ;p

Wiec tak chce napisac program ktory na podstawie wzroztu i wagi podaje idealne wymiary według tablicy idealnych wymiarów

#include 

main()

{

  double wzrost;

  double waga;

  double wynik;


  cout << "Podaj wzrost w cm : ";

  cin >> wzrost;


  cout << "\n Podaj wage w kg : ";

  cin >> waga;


  wynik = waga / wzrost;


  cout << "\n Wynik : " << wynik;


   system("pause>nul");


}

To oblicza wspolczynnik teraz chodzi o to aby wspolczynnik zostal poruwanany z 10-cioma innymi wspolczynnikami i zostal wybrany najlbizszy temu ktory wyliczylismy

oto ta tablica

044.png

prosze o pomoc


([alex]) #2

Skoro wyniki są posortowane to najszybsza będzie metoda połowienia.

int wynik=...

double tb[][9]={{...},{...},...{...}}; // dane z tablicy

int min=0,max=Rozmiar;

while(min

{

int srednia=(min+max)>>1;

if(wynik

else if(wynik>tb[srednia][0]) min=srednia+1;

else min=max=srednia;

}

if((minabs(tb[min+1][0]-wynik))) ++min; // ewentualna korekta do góry


(Quzziy) #3

Czyli ma to tak wygladac ?

double wynik = wynik

double tb[][10]={{0,3386},{0,3634},{0,3892},{0,4162},{0,4438},{0,4725},{0,5023},{0,5329},{0,5697},{0,6025}}; // dane z tablicy

int min=0,max=0,6025;

while(min

{

int srednia=(min+max)>>1;

if(wynik

else if(wynik>tb[srednia][0]) min=srednia+1;

else min=max=srednia;

}

if((min<0,6025-1)&&(abs(tb[min][0]-wynik)>abs(tb[min+1][0]-wynik))) ++min;


([alex]) #4

Nie, ma wyglądać dokładnie jak podałem, tylko tablicę masz przepisać - pamiętając elementarne podstawy języka C znakiem dziesiętnym jest kropka.

double tb[][8]= // 8 - bo masz 9 kolumn (0..8)

{

{0.3386,33.5,92.5, .... 50.5,33.0},

{0.3634,37.0,96.0, .... 52.0,34.5},

...

{0.6025,47.5,125.5, ... 68.0,45.0},

};

int Rozmiar=10; // bo masz 10 wierszy.


(Quzziy) #5

Hmm ale wynikiem jest np. 0,4444 i ma byc porownany z innymi wspołczynnikami a nie cala tabela

poza tym wynik to 0,44444444 i trzeba by wczesniej skrocic go do 4 miejsc po przecinku zaraz sprobuje to wszystko poskladac i pokaze co mi wyszło


([alex]) #6

Nic nie trzeba skracać, podany przeze mnie kawałek kodu porównuję wynik tylko ze współczynnikami.

w zmiennej min - będzie najbardziej pasujący wiersz.


(Quzziy) #7

Zrobilem to tak (domyslam sie ze źle ) ale zawsze do przodu ;p

#include 

main()

{

  int wzrost;

  int waga;

  int wynik;

  int Rozmiar = 6;


  cout << "Podaj wzrost w cm : ";

  cin >> wzrost;


  cout << "\n Podaj wage w kg : ";

  cin >> waga;


  wynik = waga / wzrost;


double tb[][9]=

{

{0.3386,33.5,92.5,69.5,33.5,27.5,83.5,50.5,33},

{0.3634,37,96,72,34.5,28.5,86.5,52,34.5},

{0.3892,38,100,74.5,36,30,89.5,54,36},

{0.4162,39.5,103.5,76,37,31,93,56,37},

{0.4438,41,107,80,38.5,32,96,57.5,38.5},

{0.4725,42.5,110.5,83,40,33,99.5,59.5,40},

};

int min=0,max=Rozmiar;

while(min
{

int srednia=(min+max)>>1;

if(wynik
else if(wynik>tb[srednia][0]) min=srednia+1;

else min=max=srednia;

}

if((minabs(tb[min+1][0]-wynik))) ++min;



 cout << " ???? " << min ;



  system("pause>nul");

}

Wyskakuje error

[C++ Error] Unit2.cpp(34): E2015 Ambiguity between 'std::abs(int)' and 'std::abs(long)'

Ps. Celowo nie wypisalem calej tablicy , zrobie to jak zadziała


([alex]) #8

żaden z powyższych potrzebujesz:

inline double abs(double x) { return x<0?-x:x; }


(Quzziy) #9

Niestety nic mi to nie mówi chyba bede musial sie wstrzymac z tym programem i zając sie prostszymi żeczami

Ale i tak dzieki za pomoc