tdulik

Floating point checking

Nov 11th, 2019
125
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*
  2.  ============================================================================
  3.  Name        : float.c
  4.  Author      :
  5.  Version     :
  6.  Copyright   : Your copyright notice
  7.  Description : Hello World in C, Ansi-style
  8.  ============================================================================
  9.  */
  10.  
  11. #include <stdio.h>
  12. #include <stdlib.h>
  13. #include <ctype.h>
  14.  
  15. enum {
  16.     START,
  17.     ZNAMENKO,
  18.     CELACAST,
  19.     MOZNADESETINY,
  20.     MOZNADESETINY2,
  21.     DESETINNACAST,
  22.     MOZNAEXPONENT,
  23.     ZNAMENKOEXPONENT,
  24.     EXPONENT,
  25. };
  26. void ok() {
  27.     puts("OK");
  28.     exit(0);
  29. }
  30. void error() {
  31.     puts("ERROR");
  32.     exit(0);
  33. }
  34.  
  35. int main(int pocetp, char *poleRetezcu[]) {
  36.     setvbuf(stdout, NULL, _IONBF, 0);
  37.     setvbuf(stderr, NULL, _IONBF, 0);
  38.  
  39.     int stav = START;
  40.     int znak;
  41.  
  42.     FILE *f = stdin;
  43.     if (pocetp > 1) {
  44.         f = fopen(poleRetezcu[1], "r");
  45.         if (f == NULL) {
  46.             printf("Nepodarilo se otevrit soubor. \n");
  47.             return 0;
  48.         }
  49.     }
  50.     while ((znak = fgetc(f)) != EOF) {
  51.         switch (stav) {
  52.         case START:
  53.             if (znak == '.')
  54.                 stav = MOZNADESETINY;
  55.             else if (znak == '+' || znak == '-')
  56.                 stav = ZNAMENKO;
  57.             else if (isdigit(znak))
  58.                 stav = CELACAST;
  59.             break;
  60.         case ZNAMENKO:
  61.             if (znak == '.')
  62.                 stav = MOZNADESETINY;
  63.             else if (isdigit(znak))
  64.                 stav = CELACAST;
  65.             else
  66.                 error();
  67.             break;
  68.         case CELACAST:
  69.             if (znak == 'E')
  70.                 stav = MOZNAEXPONENT;
  71.             else if (isspace(znak))
  72.                 ok();
  73.             else if (znak == '.')
  74.                 stav = MOZNADESETINY2;
  75.             else if (!isdigit(znak))
  76.                 error();
  77.             break;
  78.         case MOZNADESETINY:
  79.             if (isdigit(znak))
  80.                 stav = DESETINNACAST;
  81.             else
  82.                 error();
  83.             break;
  84.         case MOZNADESETINY2:
  85.             if (isdigit(znak))
  86.                 stav = DESETINNACAST;
  87.             else if (znak == 'E')
  88.                 stav = MOZNAEXPONENT;
  89.             else
  90.                 error();
  91.             break;
  92.         case DESETINNACAST:
  93.             if (znak == 'E')
  94.                 stav = MOZNAEXPONENT;
  95.             else if (isspace(znak))
  96.                 ok();
  97.             else if (!isdigit(znak))
  98.                 error();
  99.             break;
  100.         case MOZNAEXPONENT:
  101.             if (znak == '+' || znak == '-')
  102.                 stav = ZNAMENKOEXPONENT;
  103.             else if (isdigit(znak))
  104.                 stav = EXPONENT;
  105.             else
  106.                 error();
  107.             break;
  108.         case ZNAMENKOEXPONENT:
  109.             if (isdigit(znak))
  110.                 stav = EXPONENT;
  111.             else
  112.                 error();
  113.             break;
  114.         case EXPONENT:
  115.             if (isspace(znak))
  116.                 ok();
  117.             else if (!isdigit(znak))
  118.                 error();
  119.             break;
  120.         }
  121.         //fprintf(stderr,"stav = %d, znak = %c \n",stav,znak);
  122.  
  123.     }
  124.  
  125.     return EXIT_SUCCESS;
  126. }
RAW Paste Data