Lepszy zapis kodu

0

Chciałbym się zapytać jak zapisać mój kod w jakiś lepszy prostszy sposób, używając lepszych funkcji.
Celem było napisanie programu który czytał by liczby zapisane w konkretnym formacie np. < 3; 2; 5; 4.3; 6; >

#include <stdio.h>
#include <stdlib.h>

#define MAX_NUMBERS 20

void blad(int b){
    fprintf(stderr, "Wystąpił błąd o numerze %d\n", b);
}

int main (int argc, char **argv){

    FILE    *in = argc > 1 ? fopen(argv[1], "r") : stdin;
    double  t[MAX_NUMBERS];
    int     i, j;
    char    x;

     while ( (x = fgetc(in)) == ' ' || x == '\t' || x == '\n' ) ;
    if ( x  == '<' ) ;
    else {
        blad(-1);
        return -1;
    }
    
        i = 0;
    while ( fscanf(in, "%lf %c", t + i, &x) == 2 ){
        if (x != ';') {
            blad(-2);
            return -2;
        }
        i++;
    }
    if ( (x = fgetc(in)) == '>' );
    else{
        blad(-3);
        return -3;
    }
    
        for ( j= 0; j < i; j++)
        printf("%g\n",t[j]);

    return 0;
}
2
if ( x  == '<' ) ;
    else {
        blad(-1);
        return -1;
    }

Nie wyczuwasz, że czegoś tutaj jest za dużo? Że można by wykorzystać inny operator?
2.Osobiście zrobiłbym z blad makro, aby nie musieć dodatkowo pisać return -1;. Ewentualnie: return blad(-1);.

1

Coś w ten deseń:

#include <stdio.h>
#include <stdlib.h>
 
#define MAX_NUMBERS 20
 
void fatal(int err,const char *msg)
  {
   if(!err) return;
   fprintf(stderr,"%s\n",msg);
   exit(1);
  }

int ws(FILE *in)
  {
   int ch=0;
   fscanf(in," %c",&ch);
   return ch;
  }

int main(int argc,char *argv[])
  {
   int count=0,ret,ch,i;
   double tb[MAX_NUMBERS];
   FILE *in;
   
   in=argc>1?fopen(argv[1],"r"):stdin;
   fatal(!in,"Nie odnaleziono pliku");
   fatal((ch=ws(in))!='<',"Nie odnaleziono znaku poczatku listy");
   while(((ret=fscanf(in,"%lf",tb+count))==1)&&((ch=ws(in))==';')&&(count<MAX_NUMBERS)) ++count;
   fatal(ret!=1,"Niepoprawny format liczby");
   fatal(ch==';',"Zbyt dluga lista");
   fatal(ch!='>',"Nie odnaleziono znaku konca listy");
   for(i=0;i<=count;++i) printf("%g\n",tb[i]); 
   return 0;
  }

http://ideone.com/6TLtsP

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