Test
[testingrepojp.git] / entero.c
bloba86d3b843c4d54e5468b5daef4bd0232e8d50e60
1 #include <stdio.h>
2 #include <string.h>
4 typedef struct{
5 signed char losDigitos[ BUFSIZ ];
6 size_t laCantidadDeDigitos;
7 } Entero;
9 Entero Entero_CrearDesdeCadena(char *unaCadenaConUnNumero);
10 Entero Entero_Sumar(Entero unEntero, Entero otroEntero);
11 Entero Entero_Read(FILE *in);
12 int Entero_Write(const Entero unEntero, FILE *out);
13 int Entero_Scan(FILE *in, Entero *unEntero);
14 void Entero_Print(Entero unEntero, FILE *out);
15 int Entero_Comparar(Entero unEntero, Entero otroEntero);
17 static void strEspejo(char *s, int len);
18 static int EsEntero(const char *unaCadena);
19 static int ColumnaAutomata(const char c);
21 #Test comment
22 Entero Entero_CrearDesdeCadena(char *unaCadenaConUnNumero)
24 Entero temp;
25 char *s = unaCadenaConUnNumero;
26 int CantDig = strlen(unaCadenaConUnNumero);
29 * Le saco el signo más y los puntos, si es que los tiene.
31 if (*s == '+') s++;
32 if ( s[CantDig - 4] == '.' ) {
33 int i,k = 0;
34 char t[ BUFSIZ ];
35 for(i = 0; s[i] != '\0' ; i++)
36 if (s[i] != '.'){
37 CantDig--;
38 t[k++] = s[i];
40 t[k] = '\0';
41 s = t;
44 strcpy(temp.losDigitos, s);
45 temp.laCantidadDeDigitos = CantDig;
46 return temp;
50 Entero Entero_Sumar(Entero unEntero, Entero otroEntero)
52 //To Do.
56 static void strEspejo(char *s, int len)
58 int i, temp;
59 len--;
61 for(i=0; i<len; i++, len--){
62 temp=s[i];
63 s[i]=s[len];
64 s[len]=temp;
69 int Entero_Comparar(Entero unEntero, Entero otroEntero)
71 return strcmp(unEntero.losDigitos, otroEntero.losDigitos);
75 Entero Entero_Read(FILE *in)
77 Entero temp;
79 fread(&temp, sizeof temp, 1, in);
81 return temp;
85 int Entero_Write(const Entero unEntero, FILE *out)
87 fwrite(&unEntero, sizeof unEntero, 1, out);
88 return 0;
92 void Entero_Print(Entero unEntero, FILE *out)
94 if(EsEntero(unEntero.losDigitos))
95 fprintf(out,"%s;",unEntero.losDigitos);
99 int Entero_Scan(FILE *in, Entero *unEntero)
101 int c, i=0;
102 char s[ BUFSIZ ];
104 while( ((c = getc(in)) != ';') && (c != '\n') && (c != EOF) )
105 s[i++] = c;
106 s[i] = '\0';
108 if( (c == ';') && EsEntero(s) )
109 *unEntero = Entero_CrearDesdeCadena(s);
110 else
111 *unEntero = Entero_CrearDesdeCadena("");
113 return c;
117 * | 0 1..9 +,- . default
118 * --|------------------------
119 * 0-| 10 2 1 -1 -1
120 * 1 | -1 2 -1 -1 -1
121 * 2+| 3 3 -1 6 -1
122 * 3+| 4 4 -1 6 -1
123 * 4+| 5 5 -1 6 -1
124 * 5+| 5 5 -1 -1 -1
125 * 6 | 7 7 -1 -1 -1
126 * 7 | 8 8 -1 -1 -1
127 * 8 | 9 9 -1 -1 -1
128 * 9+| -1 -1 -1 6 -1
129 * 10+| -1 -1 -1 -1 -1
131 * -1 es estado de rechazo directo.
134 static int EsEntero(const char *unaCadena)
136 static const int matrizAF[11][5]={{10,2,1,-1,-1},
137 {-1,2,-1,-1,-1},
138 {3,3,-1,6,-1},
139 {4,4,-1,6,-1},
140 {5,5,-1,6,-1},
141 {5,5,-1,-1,-1},
142 {7,7,-1,-1,-1},
143 {8,8,-1,-1,-1},
144 {9,9,-1,-1,-1},
145 {-1,-1,-1,6,-1},
146 {-1,-1,-1,-1,-1}};
148 int i, estadoactual = 0;
150 for( i=0 ; (unaCadena[i]!='\0') && (estadoactual!=-1) ; i++)
151 estadoactual = matrizAF[ estadoactual ][ ColumnaAutomata(unaCadena[i]) ];
153 if ( (estadoactual==2) || (estadoactual==3) ||
154 (estadoactual==4) || (estadoactual==5) ||
155 (estadoactual==9) || (estadoactual==10) ) return 1; //Es Reconocido
156 return 0;
160 static int ColumnaAutomata(const char c)
162 if (c=='0')
163 return 0;
164 else if ( (c>='1') && (c<='9') )
165 return 1;
166 else if ( (c=='+') || (c=='-') )
167 return 2;
168 else if ( c=='.' )
169 return 3;
170 else
171 return 4; //Con esta opcion, la matriz siempre devuelve -1, NO ACEPTADA.