Liczba najbliższa wczytanej wartości i fabsf...

0

Cześć wszystkim :)
Mój problem wygląda następująco:

Mam napisać funkcję, która w tablicy np. 100 wartości znajduje wartość najbliższą zadanej przez użytkownika.
Wartości mają być liczbami losowymi z przedziału [0;1]

Napisałam coś takiego, lecz kompilator wyrzuca błąd.

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <math.h>
#define SIZE 100
int najblizsza(float val, float *tab);

int main(void){

float tab[1000], val;
int i;
srand(time(NULL));

//losowanie el tablicy
    for(i=0;i<SIZE;i++)
    tab[i]=(float)(rand()/(RAND_MAX+1.0));

for(i=0;i<SIZE;i++)
printf("%.2f ", tab[i]);
printf("\nPodaj wartosc z przedzialu [0;1]\n");
scanf("%f", val);

i=najblizsza(val, tab);

printf("\nWartosc najblizsza wpisanej to: %f\n", i);

}

int najblizsza(float val, float *tab){
int i;
float x;
x=5.0;
for(i-0;i<SIZE;i++)
    if((fabsf(*(tab+i)-val))<(fabsf(*(tab(i+1))-val))){
        if(*(tab+i)<x)
            x=*(tab+i);
    }
    else{
        if(*(tab(i+1))<x)
            x=*(tab(i+1));
    }
return x;
}

Czas na pytania:

  1. Czy można w ten sposób używać funkcji fabsf, a jeśli nie to w jaki?
  2. Czy można napisać to w inny, prostszy sposób?
  3. Dlaczego kompilator wyrzuca mi błąd
called object 'tab' is not a function

?

0

Nie patrzałem dokładnie na kod, ale m.in.tutaj:

tab(i+1)

Odwołujesz się do tablicy jak do funkcji.

tab[i+1]

Może o to chodziło?

0

Fakt, zabrakło jednego plusa, miało być tab+(i+1). Dziękuję.
Program już się kompiluje, ale w trakcie pracy zawiesza się ;/

Znalazłam jeszcze kilka literówek, oto kod który się kompiluje i działa, ale nie wyszukuje jak należy zadanej wartości:

 #include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <math.h>
#define SIZE 100
float najblizsza(float val, float *tab);

int main(void){

float tab[1000], val, x;
int i;
srand(time(NULL));

//losowanie el tablicy
    for(i=0;i<SIZE;i++)
    tab[i]=(float)(rand()/(RAND_MAX+1.0));

for(i=0;i<SIZE;i++)
printf("%f ", tab[i]);
printf("\nPodaj wartosc z przedzialu [0;1]\n");
scanf("%f", &val);
printf("Podales %f", val);

x=najblizsza(val, tab);

printf("\nWartosc najblizsza wpisanej to: %f\n", i);

}

float najblizsza(float val, float *tab){
int i;
float x;
x=5.0;
for(i=0;i<SIZE;i++)
    if((fabsf(*(tab+i)-val))<(fabsf(*(tab+(i+1))-val))){
        if(*(tab+i)<x)
            x=*(tab+i);
    }
    else{
        if(*(tab+(i+1))<x)
            x=*(tab+(i+1));
    }
return x;
}
0

Funkcję najblizsza określasz jako zwracającą int, i jako int łapiesz jej wynik. Czy aby na pewno tak ma być?
Także w ww. funkcji trawersujesz o jeden indeks za daleko. tab[SIZE] nie posiada żadnej określonej wartości,a przy dynamicznej alokacji znajdowałoby się poza tablicą.
I tak na marginesie, do czego Ci potrzebne porównywanie sąsiednich elementów? Bez tego można rozwiązać problem znacznie łatwiej.

0

Ma być jako float, poprawiam.
Chciałam zrobić to tak, że porównuję dwa sąsiednie elementy (konkretnie różnicę między nimi a val) i jeśli np pierwsza różnica jest mniejsza to nasz 'x' będzie właśnie tyle równy. Pomysł trochę słaby, ale innego nie miałam.
W jaki sposób można zrobić to prościej?

0

Porównuj każdy kolejny element z dotychczasowym najlepszym "kandydatem": jego możesz pamiętać w zmiennej x, którą notabene używasz już do tego celu.

0
float najblizsza(float val, float *tab){
int i=0;
float x;
x=*(tab+i);
for(i=0;i<SIZE;i++)
    if((fabsf(x-val))>(fabsf(*(tab+i)-val))){
            x=*(tab+i);
    }
return x;
}

coś w tym stylu? Też nie działa. Możesz mi powiedzieć dlaczego 'najbliższa' zawsze zwraca mi to samo co wpisałam?

1

Sama funkcja wygląda na poprawną. Na pewno wszystko w mainie jest ok? W ostatniej wersji było

x=najblizsza(val, tab);
 
printf("\nWartosc najblizsza wpisanej to: %f\n", i);

Co nie ma większego sensu jeśli łapiesz do x, a wyświetlasz i ;)

0

Ojeny, jaki głupi bład. Wstyd mi :D Dziękuję za pomoc (:

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