Wyszukiwanie tablicy – wartość graniczna

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;
         }
}
}
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.

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])

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))
0

Kamilka, zapoznaj się z tym

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.

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;
        }

    }

    }
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;.
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);
}
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;
        }

    }

    }

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