Gdzie dać break, aby program działał poprawnie?

0

Witam.
otóż nie działa mi poprawnie warunek dla b==0, bo po wpisaniu np 3.7 ukazuje 3 pozycje, a nie 1 (tę pierwszą tylko).

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define R 8
#define gran 0.5f
int main (void)
{
    float tab[R]={1.2,2.4,2.7,3.5,3.6,3.8,6.8,7.2};
    float a;
    int b;
    int licznik;
    printf("Podaj element ktory chcesz znalezc: ");
    scanf("%f",&a);
    printf("Chesz znalezc wszystkie elementy, cz tylko pierwszy napotkany? \n");
    printf("Nacisnij 1 - wszystkie lub 0 - tylko pierwszy: ");
    scanf("%d",&b);
    
      if(b==0)
        {
            int i=0;
            while(i<R)
        
            {
            if(fabs(tab[i]-a)<=gran)
            {
                printf("Element znaleziony na pozycji: %d\n",i);
                licznik++;
          
     
            }
 if(licznik==1)
                {
                    break;
                }
        
            if(licznik==0)
            {
                return 0;
                
             
            }
           
            i++;
        }
        }
        if(b==1)
        {
            int i=0;
            while(i<R)
    {
            
            if(fabs(tab[i]-a)<=gran)
            {
                printf("Element znaleziont na pozycji: %d\n",i);
               
                licznik++;
     
            }
            if(licznik==0)
            {
                return 0;
            }
        i++;
    }
            
        }
    
}
1

Spróbuj sobie wypisać wartość licznika tuż przed ifem:

if(licznik==1)

jak myślisz dlaczego nie jest równy 0?

2

Breake'a masz dobrze, tylko licznik poprawnie zainicjalizuj, zamiast

int licznik;

napisz:

int licznik = 0;

Masz jeszcze inne błędy w kodzie, Twój int main(void) nie kończy się return 0 i co zabawniejsze - wejdziesz w taką ścieżkę w trakcie poprawnego wykonania, czyli gdy spełnisz warunek

if (licznik == 1) {
  break;
}

Twój program zakończy się nie zwracając poprawnej wartości. Podobnie dzieje się w pozytywnej ścieżce dla warunku b == 1 Dla warunku b == 0 nie potrzebujesz w ogóle zmiennej licznik.

Anyway, widzę, że próbujesz rozszerzyć rozwiązanie, które dostałaś w innym wątku https://4programmers.net/Forum/Newbie/318359-wyszukiwanie_tablicy_wartosc_graniczna Chłopaki (@cs @MasterBLB @Patryk27) trochę się namęczyli, żeby Ci pomóc, dwie karty dyskusji żeby napisać pętle z ifem, no no ;)

3

Na litość Peruna i Trygława, dziewczyno, poświęć chwilę czasu na sformatowanie kodu nim na forum zapodasz...
Tak poza tym, za dużo napowtarzałaś kodu - pomijając kwestię poprawnej inicjalizacji to w zupełności starczy jedna pętla:

while (i < R)//swoją drogą, jak znana jest z góry liczba iteracji to lepiej użyć pętli for
{
     if (fabs(tab[i] - a) <= gran)
     {
         printf("Element znaleziony na pozycji: %d\n", i);
         if (b == 0)//ta konstrukcja wystarczy aby przerwać szukanie kolejnych liczb po znalezieniu pierwszej pasującej. Przekombinowałaś Kamila.
         //if (!b)//w przypadku jakby kompilator c nie kumał wyrażenia b == 0 to użyj w zastępstwie takiej konstrukcji
         {
              break;
         }
         //licznik++;//to Ci już nie jest potrzebne. A przynajmniej ja nie wiem, jakie miałoby mieć zastosowanie.
     }
     i++;
}
//przy okazji zwróć uwagę - nie lepiej się czyta jak się da spację między operatorami matematycznymi, czy też słowami kluczowymi while, if itd?

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