CODIGO FUENTE (El uso esta despues del codigo)
---------------------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define FICHERO_OPERACIONES "C:\\Users\\ALVARO\\Desktop\\hexa c\\Debug\\operaciones.txt","r"
#define FICHERO_RESULTADOS "C:\\Users\\ALVARO\\Desktop\\hexa c\\Debug\\resultados.txt","w"
#define TAM_LINEA 400
#define MAX_VALORES 80
typedef struct op{
int valores[MAX_VALORES];
char operandos[MAX_VALORES-1];
int tam;
}operacion;
operacion* parse(char* linea);
char* substr(char* cadena, int comienzo, int longitud);
char xtod(char c);
int HextoDec(char *hex);
int xstrtoi(char *hex);
long calcular(operacion* o);
void main(void){
FILE *f_r,*f_w;
char linea[TAM_LINEA];
operacion *o;
f_r=fopen(FICHERO_OPERACIONES);
f_w=fopen(FICHERO_RESULTADOS);
if(f_r!=NULL){
while(!feof(f_r)){
fgets(linea,TAM_LINEA,f_r);
o=parse(linea);
fprintf(f_w,"%li\n",calcular(o));
free(o);
}
fclose(f_r);
fclose(f_w);
}
}
operacion* parse(char* linea){
operacion *retorno;
unsigned int i,j;
int pos;
retorno=(operacion*)malloc(sizeof(operacion));
i=0;
j=0;
pos=0;
while( i < strlen(linea) ){
if(linea[i]=='+' || linea[i]=='-'){
retorno->valores[pos]=xstrtoi(substr(linea,j,i-j));
retorno->operandos[pos]=linea[i];
pos++;
j=i+1;
}
if(linea[i]=='\n'){
retorno->valores[pos]=xstrtoi(substr(linea,j,i-j));
pos++;
j=i+1;
}
i++;
}
retorno->tam=pos;
return retorno;
}
long calcular(operacion* o){
int i;
long resultado;
resultado=o->valores[0];
for(i=1; i<o->tam;i++){
if(o->operandos[i-1]=='+'){
resultado += o->valores[i];
}
if(o->operandos[i-1]=='-'){
resultado -= o->valores[i];
}
}
return resultado;
}
char* substr(char* cadena, int comienzo, int longitud){
char *nuevo;
if (longitud == 0){
longitud = strlen(cadena)-comienzo-1;
}
nuevo = (char*)malloc(sizeof(char) * longitud+1);
strncpy(nuevo, cadena + comienzo, longitud);
nuevo[longitud]='\0';
return nuevo;
}
char xtod(char c) {
if (c>='0' && c<='9') return c-'0';
if (c>='A' && c<='F') return c-'A'+10;
if (c>='a' && c<='f') return c-'a'+10;
return c=0;
}
int HextoDec(char *hex)
{
if (*hex==0) return 0;
return HextoDec(hex-1)*16 + xtod(*hex) ;
}
int xstrtoi(char *hex)
{
return HextoDec(hex+strlen(hex)-1);
}
GUIA DE USO
-------------
De los defines, deberias modificar los que tienen las rutas a los ficheros con operaciones y resultados
El fichero operaciones.txt puede contener sumas y restas en cualquier orden y con muchos operandos de longitud arbitraria. Solo hay una IMPORTANTE restriccion: el primer operando de cada operacion no puede ser negativo. De todas maneras, como no pueden existir valores negativos para un puntero, no tendria sentido que esa restriccion fuese un obstaculo.
El fichero resultados.txt contendrá el resultado EN DECIMAL de cada linea, que puedes pasarlo a hexa con la calculadora de win mismamente.
Fichero operaciones.txt de ejemplo:
A0A-1BB1B+2C2C
444A-1B+2C2C
A0A-1B1B+2C2C-5555
A0A-1B1B
Fichero resultados.txt resultante:
-99557
28763
-14906
2570
Espero que te sirva.
Un saludo
P.D: Se que hay una serie de leaks bastante simpatica. Me da vagancia arreglarlo, lo dejo para los estudiantes de primero de FP/carrera
.