Program liczący przecięcia zera, odczyt z pliku

0

Program ten ma zliczać każdorazowe przecięcie zera w celu obliczenia częstotliwości przecięć. Potrzebuje jednak, aby program pobierał wartości z pliku, a nie z klawiatury. Program jednak nie potrzebuje informacji na temat czasu, który ma postać xx:xx:xx.yyy. np 00:00:00.167, a jedynie to co występuje po spacji, czyli wartość dodatnią czy też ujemną, które służyć będą do obliczania przecięć zera.

Plik posiada następujące informacje:

00:00:00.167 3.98
00:00:00.296 7.12
00:00:00.398 9.12
00:00:00.459 9.57
00:00:00.504 8.60
00:00:00.669 7.63
00:00:00.701 4.35
00:00:00.888 2.01
00:00:00.959 -1.65
00:00:01.091 -4.38
00:00:01.137 -7.23
00:00:01.230 -8.54
...

Kod źródłowy programu, który liczy przecięcia zera z klawiatury. Szukam dlatego sposobu jak sprawić, aby wartości te były odczytywane wprost z pliku.

#include <stdio.h>
#define PACZKA 99
#define MAX 10
#define MIN -10
#define GORA 14
#define DOL 8
 
int main()
{
  float now=0.0, past=0.0;
  int cut=0, index=0;
  printf("\n        Licznik przeciec zera.        \n");
  printf("Zakres liczb brany pod uwage: <-10;10>\n");
  printf("     Kod 99 konczy prace licznika.    \n\n");
 
  while (now!=99)                   /*petla programu*/
    {
      /*now - aktualna wartosc
        past - wartoscc poprzednia, nie 0
        cut - liczba przeciec
        index - liczba danych w zestawie*/
      scanf("%f", &now);
      if ((now>=MIN) && (now<=MAX)) /*zgodne dane*/
        {
          ++index;                  /*dodanie liczby do licznika*/
          if ((now*past)<0.0) ++cut;/*przeciecie zera*/
          if (now!=0.0) past=now;   /*pominiecie zer*/         
          if (index==PACZKA)        /*koniec paczki*/
            {
                if((cut>=DOL) && (cut<=GORA))   /*po zebraniu danych sprawdza przeciecia*/
                {
                    printf("Poprawna liczba przeciec: %d\n", cut);
                }
                else
                {
                    printf("Niepoprawna liczba przeciec: %d\n", cut);
                }
                /*jezeli program napotka kod konczacy 99 przed
                koncem paczki nie wyswietli aktualnej liczby przeciec*/
                index=0; /*wyzerowanie danych*/
                cut=0;
                past=0.0;
            }
 
        }
     }
  return 0;
}
0

Tylko jak mam odseparować te 2 dane, czyli czas i wartość. Czy da się zrobić tak, aby odczytywało tylko float z każdej linii?

0

A dlaczego nie po prostu:

fscanf(fd, "%i:%i:%i.%i %f", &unused, &unused, &unused, &unused, &value);

?

0

Zrobiłem tak, ale program się nie kończy, ciągle wypisuje wartości

 #include <stdio.h>
int main()
{
  FILE *plik = fopen("przeciecia_zera1.txt", "r");
  int unused;
    float value;
  if (plik == NULL)
    {
      printf("Otwarcie nieudane");
    }
  while (fscanf(plik, "%i:%i:%i.%i %f\n", &unused, &unused, &unused, &unused, &value) != EOF)
    {
      printf("%f\n", &value);
    }

fclose(plik);
}

1

Racja, kropka psuje.

while (fscanf(plik, "%i:%i:%f %f", &unused_int, &unused_int, &unused_float, &value) != EOF)

Dodatkowo w printf przy value nie powinno być &.

0

Okej, super teraz działa. Pozostaje teraz najgorsze jak dla mnie, Wprowadzić to do programu docelowego :/

0

Program wyłącza się przy skonczeniu paczki, jak temu moge zapobiec, probuje getch(), ale moze jest w zlym miejscu?

 #include <stdio.h>
#define PACZKA 99
#define MAX 10
#define MIN -10
#define GORA 14
#define DOL 8

int main()
{
  float value=0.0, past=0.0, unused_float;
  int cut=0, index=0, unused_int;
  FILE *plik = fopen("przeciecia_zera1.txt", "r");
  if (plik == NULL)
    {
      printf("Otwarcie nieudane");
    }



  printf("\n        Licznik przeciec zera.        \n");
  printf("Zakres liczb brany pod uwage: <-10;10>\n");
  printf("     Kod 99 konczy prace licznika.    \n\n");

  while (value!=99)                   /*petla programu*/
    {
                                    /*now - aktualna wartosc                                                                                                                                                
                                  past - wartoscc poprzednia, nie 0                                                                                                                                         
                                      cut - liczba przeciec                                                                                                                                                 
                                      index - liczba danych w zestawie*/
      while (fscanf(plik, "%i:%i:%f %f\n", &unused_int, &unused_int, &unused_float, &value)!=EOF)
        {
          if ((value>=MIN) && (value<=MAX)) /*zgodne dane*/
            {
              ++index;                  /*dodanie liczby do licznika*/
              if ((value*past)<0.0) ++cut;/*przeciecie zera*/

              if (value!=0.0) past=value;   /*pominiecie zer*/
            }
        }
          if (index==PACZKA)        /*koniec paczki*/

            {


              if((cut>=DOL) && (cut<=GORA))   /*po zebraniu danych sprawdza przeciecia*/
                {
                  printf("Poprawna liczba przeciec: %d\n", cut);
                }
              else
                {
                  printf("Niepoprawna liczba przeciec: %d\n", cut);
                }
              /*jezeli program napotka kod konczacy 99 przed                                                                                                                                                
                koncem paczki nie wyswietli aktualnej liczby przeciec*/
              index=0; /*wyzerowanie danych*/
              cut=0;
              past=0.0;
            }
  }
  fclose(plik);
  getch();
  return 0;
}
0

Usunąłem

 if (index==PACZKA)

i teraz zlicza wszystko dobrze.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.