Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    95

    [C]calcolatrice in notazione polacca inversa, problema con le stringhe

    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 è
    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;
    }
    codice:
    struct element {
           double value;
           struct element* next;
    };
    
    typedef  struct element  element;
    
    typedef  element* ptr_element;
    
    typedef struct {
            ptr_element top;
            int cnt;
    } stack;
    codice:
    #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!

  2. #2
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    alternativa e' fgetc o fread.
    Per gli Spartani e Sparta usa spartan Il mio github

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    95
    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

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.