PDA

Visualizza la versione completa : [C] Calcolatrice in notazione polacca inversa e stringhe


Rudie
06-09-2011, 09:29
Ciao, io devo fare la calcolatrice in notazione polacca inversa. Ho in un file una stringa per ogni riga del tipo 1.2 2.8 + 17 + 11 -.
Con le istruzioni void* buff=(char*)malloc(100); e fgets(buff, BUFSIZE, filei); leggo tutta la linea (compreso '\0') e la metto in buff: il prof m'ha detto di non usarla perchè c'è appunto il problema che prende anche \0 ma non ho trovato altro e voi?
Dopodichè volevo fare una cosa del genere solo che non converte bene in double la variabile val.
Il mio codice è


// pone un valore in cima allo stack
void push (stack *stack, int value) {
element *p;
p = malloc(sizeof(element));
p -> value = value;
p -> next = stack -> top;
stack -> top = p ;
stack -> cnt++;
}

// recupera ed elimina il valore in cima allo stack
double pop (stack *stack) {
double value;
element *p;
value = stack -> top -> value;
p = stack -> top;
stack -> top = stack -> top -> next;
stack -> cnt--;
free(p);
return value;
}

// restituisce il valore in cima allo stack
double top (stack *stack) {
return (stack -> top -> value);
}

void initialize (stack *stack) {
stack -> cnt = 0;
stack -> top = NULL;
}




struct element {
double value;
struct element* next;
};

typedef struct element element;

typedef element* ptr_element;

typedef struct {
ptr_element top;
int cnt;
} stack;




#include <stdio.h>
#include <stdlib.h>
#include "stack.h"
#include "stack.c"
#define BUFSIZE 100



int main(){
FILE * filei, * fileo;
filei=fopen ("in.txt","r");
fileo=fopen ("out.txt","w");
struct stack * nuovo = malloc(sizeof(stack));
double val, val1, val2;

void* tmp=(char*)malloc(100);
void* buff=(char*)malloc(100);


while (!feof(filei)){

fgets(buff, BUFSIZE, filei);
fprintf (fileo, "Codice operazione: %s\n ", buff);
printf("valore della stringa buff %s\n", buff);
tmp = strtok(buff, " ");

while(tmp!=NULL){
printf("valore della stringa tmp %s\n", tmp);


if(strcmp(tmp,"+")==0 ){
val1 = pop (nuovo);
val2 = pop (nuovo);
push (nuovo, val1+val2);
printf("%.2f + %.2f = %.2f\n", val1, val2, top(nuovo));
}
else if(strcmp(tmp,"-")==0){
val1 = pop (nuovo);
val2 = pop (nuovo);
push (nuovo, val1-val2);
printf("%.2f - %.2f = %.2f\n", val1, val2, top(nuovo));
}
else{
val = atof(tmp);
push(nuovo, val);
printf("top %.2f\n", top(nuovo));
}


tmp = strtok(NULL, " ");
}

printf("il top alla fine vale %.2f\n",top(nuovo));
//fprintf (fileo, "risultato: %f\n", pop(nuovo));
}



fclose(filei);
fclose(fileo);
printf("\n");
system("PAUSE");
return 0;
}



Ovviamente è incompleto e so come procedere, l'unico problema è leggere il file riga per riga e se trovo un numero faccio una cosa, se trovo un'operatore ne faccio un'altra, se finisce la riga calcolo il tutto e passo alla riga successiva.
Grazie!

linoma
06-09-2011, 13:50
alternativa e' fgetc o fread.

Rudie
06-09-2011, 16:25
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
La funzione fread() legge da stream nmemb elementi, ciascuno di dimensione size. Gli elementi letti vengono immagazzinati nel buffer puntato da ptr che deve essere di dimensioni adeguate.

Molto utile però le linee non sono omogenee tra di loro, ci possono essere 4 o più numeri.

int fgetc(FILE *stream);
La funzione fgetc() legge un carattere da stream.
Ritorna il carattere letto oppure EOF se e' stato riscontrato un errore o la fine del file.
Il tipo ritornato e' un intero, poiche' la funzione, oltre a ritornare ogni carattere del tipo char, deve ritornare anche EOF (il cui valore tipico e' -1).

Grazie, ora ci provo

Loading