Wyszukiwanie tablicy – wartość graniczna

2018-11-22 12:16
0

Cześć, mam problem z takim programem:
wyszukiwanie elementu o zadanej wartości – tablica z wartościami zmiennoprzecinkowymi – zadanie granicznej wartości różnicy między
liczbami, poniżej której dwie liczby są traktowane jako identyczne.

Ja to próbuję zrobić w taki sposób,jednak program nie działa poprawnie.

#include <stdio.h>
 int main(void)
 {
    int a;
     float tab[5]={2.5,2.6,3.4,3.7,5};
    printf("POdaj element: ");
    scanf("%d", &a);
    for(int i=0;i<5;i++)
    {
        if(tab[i+1]-tab[i]<=0.4 && tab[i+1]-tab[i]>0.1)
        {
            tab[i+1]=tab[i];

         } 
         if(tab[i]==a)
         {
            printf("Element znaleziony na pozycji %d",i);
            break;
         }
         else
         {
            printf("Nie ma takiego elementu");
break;
         }
}
}
edytowany 4x, ostatnio: furious programming, 2018-11-22 22:50

Pozostało 580 znaków

2018-11-22 12:19
kq
0
if(tab[i+1]-tab[i]<=0.4 && tab[i+1]-tab[i]>0.1)

o co tu chodzi? Po co porównujesz różne elementy tablicy i to jeszcze w taki dziwny sposób?

Masz sprawdzić czy wartość bezwzględna z (a-b) jest mniejsza niż epsilon, nic więcej.


Pokaż pozostałe 2 komentarze
Mam wymyslic jakąś granicę właśnie. To w takim razie, jak inaczej to zapisać? - Kamila Nowak 2018-11-22 12:27
Ale co to ma do granicy? Zadanie mówi o wyszukaniu elementu zbliżonego do podanego przez użytkownika, a nie porównywaniu elementów tablicy ze sobą! - kq 2018-11-22 12:28
Więc czy mogę prosić o wskazówkę jak zapisać ten warunek? - Kamila Nowak 2018-11-22 12:34
Tak. Wcale. Zadanie w formie jaką przedstawiłaś nie każde w ogóle porównywać ze sobą elementów tablicy. - kq 2018-11-22 12:35
Nie mam innego pomysłu niż przez porównywanie - Kamila Nowak 2018-11-22 12:39

Pozostało 580 znaków

2018-11-22 12:20
1

Dlaczego tworzysz tablicę zawierającą pięć elementów, lecz iterujesz już do dziesięciu? (a tak właściwie to jedenastu, ponieważ masz tab[i+1])


wkradł się mały błąd, po wcześniejszym programie - Kamila Nowak 2018-11-22 12:20

Pozostało 580 znaków

2018-11-22 12:24
0

Czy to tak może wyglądać?

if(tab[i+1]-tab[i]<=abs(0.4) && tab[i+1]-tab[i]>abs(0.1))

Pozostało 580 znaków

2018-11-22 12:29
0

Kamilka, zapoznaj się z tym


"Sugeruję wyobrazić sobie Słońce widziane z orbity Merkurego, a następnie dupę tej wielkości. W takiej właśnie dupie specjalista ma teksty o wspaniałej atmosferze, pracy pełnej wyzwań i tworzeniu innowacyjnych rozwiązań. Pracuje się po to, żeby zarabiać, a z resztą specjalista sobie poradzi we własnym zakresie, nawet jeśli firma mieści się w okopie na granicy obu Korei."
-somekind,
konkretny człowiek-konkretny przekaz :]
Przecież Kamila porównuje z epsilonem właśnie. - Patryk27 2018-11-22 12:55
I dobrze robi, ale jak widadomo zagadnienie porównywania liczb zmiennoprzecinkowych nie jest trywialne, dlatego dałem linka. - MasterBLB 2018-11-22 13:05

Pozostało 580 znaków

2018-11-22 12:55
1

Bardziej w stylu:

if (abs(tab[i+1] - tab[i]) ...) {
}

Koniec końców abs(0.4) jest stałą i wynosi właśnie 0.4, podczas gdy abs(tab[i+1] - tab[i]) stałą już nie jest.


edytowany 1x, ostatnio: Patryk27, 2018-11-22 12:56
Ale ogólnie mówiąc, zamysł jest dobry tylko warunek trzeba poprawić? - Kamila Nowak 2018-11-22 12:57
Masz porównywać każdy element tablicy do liczby podanej przez użytkownika, prawda? Dlaczego zatem aktualnie porównujesz każdy element tablicy do następnego elementu tablicy? ;-) - Patryk27 2018-11-22 12:59
oświeciłeś mnie, nie rozumiałam wcześniej w czym błąd, dziękuję! - Kamila Nowak 2018-11-22 13:02

Pozostało 580 znaków

2018-11-22 14:02
0
Patryk27 napisał(a):

Bardziej w stylu:

if (abs(tab[i+1] - tab[i]) ...) {
}

Koniec końców abs(0.4) jest stałą i wynosi właśnie 0.4, podczas gdy abs(tab[i+1] - tab[i]) stałą już nie jest.

Za twoją radę tak napisałam, jednak dalej cos jest źle

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    float a;
    float tab[5] = { 2.5,2.6,3.4,3.7,5 };
    printf("POdaj element: ");
    scanf("%f", &a);
    for (int i = 0; i < 5; i++)
    {

        if (abs(tab[i] - a) <=0.3 || tab[i] == a)
        {

            printf(" Element jest na pozycji %d ", i);
            break;
        }
        else
        {
            printf("Nie ma elementu! ");
            break;
        }

    }

    }
edytowany 2x, ostatnio: Patryk27, 2018-11-22 14:07

Pozostało 580 znaków

2018-11-22 14:07
2
  1. if (abs(tab[i] - a) <=0.3 || tab[i] == a) - jeśli tab[i] == a, to na pewno abs(tab[i] - a) <= 0.3, prawda? Więc ten drugi warunek jest zbędny.
  2. Twoja pętla wykonuje się zawsze tylko raz, ponieważ po pierwszej iteracji w każdej sytuacji odpalasz break;.

edytowany 2x, ostatnio: Patryk27, 2018-11-22 14:08
Więc break przesunąć dwie linijki w dół, poza klamerkę? - Kamila Nowak 2018-11-22 14:23
Prawie; porównaj sobie swój kod z takim przykładem: https://hastebin.com/ayujolikit.cpp. - Patryk27 2018-11-22 14:24

Pozostało 580 znaków

2018-11-22 16:51
0
#include <cstdio> 
#include <cmath>

float table[5] = { 2.5, 2.6, 3.4, 3.7, 5 };
float epsilon = 0.01f;

bool ApproximatelyEqual (float a, float b)
{
  return fabs (a - b) <= ((fabs (a) < fabs (b) ? fabs (b) : fabs (a)) * epsilon);
}

float GetInput()
{  float a;
  printf ("Podaj szukany element: ");
  scanf ("%f", &a);
  return a;
}

int DoSearch(float number)
{   
    for (int i= 0; i < 5; i++)
    {

      if (ApproximatelyEqual(number, table[i]))
        {     
         return  i;
        }
    }
   return -1;
}

void ShowResult(int position )
{
 if ( position == -1)
    {
      printf ("Nie ma elementu! ");
    }
    else 
    {
     printf ("Element jest na pozycji %d ", position);
    }
}

int main (void)
{ 
 float number = GetInput();
 int position = DoSearch(number);
 ShowResult(position);
}
edytowany 2x, ostatnio: ipsd, 2018-11-22 17:53
Whoa - i to się nazywa overengineering :-) zmienne globalne pomieszane z parametrami + nadmiar funkcji (Result) + prosty algorytm porównywania zamieniony (dosyć zbędnie) na skomplikowany + pomieszałeś C z C++ (printf vs cmath + iostream) - Patryk27 2018-11-22 17:40
@Patryk27 bede musial jakos z tym zyc :) - ipsd 2018-11-22 17:55

Pozostało 580 znaków

2018-11-22 21:12
0
Patryk27 napisał(a):
  1. if (abs(tab[i] - a) <=0.3 || tab[i] == a) - jeśli tab[i] == a, to na pewno abs(tab[i] - a) <= 0.3, prawda? Więc ten drugi warunek jest zbędny.
  2. Twoja pętla wykonuje się zawsze tylko raz, ponieważ po pierwszej iteracji w każdej sytuacji odpalasz break;.

Zmieniłam to tak jak pokazałeś, jednak program się kompiluje, ale nie działa poprawnie

#include <stdio.h>
#include <stdlib.h>
#define gran 0.3f
int main(void)
{
    float a;
    float tab[5] = { 2.5,2.6,3.4,3.7,5 };
    printf("POdaj element: ");
    scanf("%lf", &a);
    for (int i = 0; i < 5; i++)
    {

        if (abs(tab[i] - a) <=gran)
        {

            printf(" Element jest na pozycji %d ", i);
            return 0;
        }
        else
        {
            printf("Nie ma elementu! ");
            return 0;
        }

    }

    }

Pozostało 580 znaków

2018-11-22 21:13
1

Nie, nie zrobiłaś tak jak napisałem - w dalszym ciągu Twoja pętla zawsze kończy się po jednym obrocie.


wg twojej instrukcji return 0 miało być w po printf, tak też zrobiłam. - Kamila Nowak 2018-11-22 21:16
Ok, teraz to pokaż, gdzie w moim kodzie masz np. else :-) - Patryk27 2018-11-22 21:16

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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