Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Znajdź element podobny

Ostatnio zmodyfikowano 2014-11-17 18:08
Autor Wiadomość
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.
P-120668
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.

C/C++
#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;
}
P-120672
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ę.

C/C++
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;
}


P-120681
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)

 
P-120685
Kaikso
» 2014-11-16 02:32:41
Dokładnie tak to wygląda bez zbędnego kodu ;)
P-120750
Balttazarr
Temat założony przez niniejszego użytkownika
» 2014-11-16 11:32:50
Dzięki za pomoc :)
P-120764
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
P-120779
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 :
C/C++
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ę:

C/C++
case '4': // PROGRAM nr 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;
}
P-120781
« 1 » 2
  Strona 1 z 2 Następna strona