Znajdź element podobny
Ostatnio zmodyfikowano 2014-11-17 18:08
Balttazarr Temat założony przez niniejszego użytkownika |
Znajdź element podobny » 2014-11-15 16:19:05 Witam.
Mam problem. Nie mam pojęcia jak sprawić, żeby podprogram , po wczytaniu przez użytkownika danej liczby sprawdzał, która z liczb w tablicy jest do niego najbardziej zbliżona.. No i oczywiście ją wyświetla ;)
Pozdrawiam. |
|
Kaikso |
» 2014-11-15 17:15:14 Funkcja get_similar zwraca indeks pierwszej najbardziej podobnej liczby do key w tablicy tab o rozmiarze size. Oczywiście możesz zmienić typ double na dowolną typ liczbowy. #include <iostream>
size_t get_similar( double * tab, size_t size, double key ) { size_t found = 0; double difference = tab[ 0 ] - key; difference = difference > 0 ? difference: - difference; for( size_t i = 1; i < size; i++ ) { double tmp = tab[ i ] - key; tmp = tmp > 0 ? tmp: - tmp; if( tmp < difference ) { difference = tmp; found = i; } } return found; }
int main() { size_t size; std::cout << "Podaj ilosc elemendow: "; std::cin >> size; double * tab = new double[ size ]; for( int i = 0; i < size; i++ ) { std::cout << "Podaj element nr." << i << ": "; std::cin >> tab[ i ]; } double key; std::cout << "Podaj wartosc szukana: "; std::cin >> key; size_t similar = get_similar( tab, size, key ); std::cout << "Najbardziej podobny element to element nr." << similar << " o wartosci: " << tab[ similar ] << std::endl; delete[] tab; return 0; }
|
|
Balttazarr Temat założony przez niniejszego użytkownika |
» 2014-11-15 18:21:41 Czy mógłbyś mi wytłumaczyć od góry do dołu tą funkcję? Nie potrzebnie pisałeś cały program , bo reszte mam. Po prostu nie potrafię zrobić tego poprogramu. Z góry Ci dziękuję. size_t get_similar( double * tab, size_t size, double key ) { size_t found = 0; double difference = tab[ 0 ] - key; difference = difference > 0 ? difference: - difference; for( size_t i = 1; i < size; i++ ) { double tmp = tab[ i ] - key; tmp = tmp > 0 ? tmp: - tmp; if( tmp < difference ) { difference = tmp; found = i; } } return found; }
|
|
1aam2am1 |
» 2014-11-15 19:19:32 Ta funkcja przed pętlą liczy różnicę (odejmuje) klucza i pierwszej wartości z tablicy. Ta różnica jest zawsze dodatnia dzięki difference = difference > 0 ? difference: - difference;
W pętli robi to samo ale z następnymi elementami.
W if( tmp < difference ) sprawdza czy różnica jest mniejsza jeżeli tak zmienia wartość found na odpowiednie miejsce w tablicy.
Dzięki czemu zawsze znajdzie najbliższą liczbę w tablicy do klucza.
PS: Niezłe, sam bym tego lepiej nie wymyślił (Do twórcy)
|
|
Kaikso |
» 2014-11-16 02:32:41 Dokładnie tak to wygląda bez zbędnego kodu ;) |
|
Balttazarr Temat założony przez niniejszego użytkownika |
» 2014-11-16 11:32:50 Dzięki za pomoc :) |
|
Monika90 |
» 2014-11-16 13:56:55 @Kaikso Niestety, Twój program nie działa prawidłowo kiedy elementami tablicy są kolejno liczby 1 i 2, a wartość szukana to 1e20
|
|
Balttazarr Temat założony przez niniejszego użytkownika |
» 2014-11-16 14:03:48 A jak wyświetla mi się co innego niż powinno ? Np. w tablicy miałem liczbę 9. Wpisałem , że szukam liczby podobnej do 10 . Wyszło 6 :D o co tu chodzi? tutaj funkcja : int znajdz_podobny( int wartosc_zadana, int * tab ) { int found = 0; int roznica = tab[ 0 ] - wartosc_zadana; roznica = roznica > 0 ? roznica: - roznica; for( int i = 1; i < 10; i++ ) { int X = tab[ i ] - wartosc_zadana; X = X > 0 ? X: - X; if( X < roznica ) { roznica = X; found = i; } } return found; } tutaj jak ją wywołuję: case '4': { int w; cout << "Podaj liczbe calkowita od 0 - 100: " << endl; cin >> w; int sprawdzenie = znajdz_podobny( w, tab ); cout << "\n Najbardziej zblizona liczba z tablicy do podanej wynosi " << sprawdzenie << endl; system( "pause" ); break; }
|
|
« 1 » 2 |