Problema-Pseudocodice-Programma

di il
26 risposte

Problema-Pseudocodice-Programma

Salve a tutti,sto provando ad imparare il linguaggio C,con non poche difficoltà.Mi sto avvalendo del corso completo Deitel.Sono arrivato appena al terzo capitolo in cui parla dello sviluppo di programmi strutturati a partire da uno un algo sviluppato in pseudocodice con un processo per raffinamenti successivi(top down).In questo capitolo vengono introdotte le strutture di selezione con i comandi di selezione if , if...else e le strutture di iterazione(cicliche?) in particolare il comando di iterazione while.veniamo al punto.Il mio problema è quello di scrivere l'algo sotto forma di pseudocodice per poi tradurlo in C.
faccio un esempio con un esercizio del libro che mi sta mettendo in difficoltà:
Il programma deve prendere in input i Km percorsi e i litri usati per ogni pieno.Dovrà calcolare i Km percorsi con ogni litro per ogni pieno e visualizzarli.E infine dovrà calcolare e visualizzare i Km per litro percorsi complessivamente con tutti i pieni...

Un modo per risolvere il problema è quello di utilizzare un valore sentinella che all'immissione interrompa il ciclo while e proceda alla sequenza successiva.

1)Inizializzare le variabili
a- Inizializzare la media totale Km/l a 0
b- Inizializzare il contatore(numero pieni) a 0
2)Fichè il numero di litri è u valore diverso dal valore sentinella,prendere in input i Km percorsi e i litri usati per un pieno,calcolare i Km percorsi per ogni litro.
a- Prendere in input i Km percorsi e visualizzarli
b- Prendere in input i Litri usati e visualizzarli
c- Calcolare i Km percorsi per ogni litro e visualizzarli
d- Aggiungere 1 al Contatore (Numero pieni).
e- Prendere in input i dati del successivo pieno(o forse del valore sentinella)
3) Calcolare la media dei Km percorsi per ogni litro per tutti i pieni considerati.
a-Se il contatore non è uguale a 0
a1-Impostare la media con il totale diviso per il contatore
a2-Visualizzare la media.
b-Altrimenti
b1-Visualizzare "Non sono stati immessi dati"


questo è il codice che ho scritto,però non da il risultato che dovrebbe,quando il chiede l'input litri e inserisco il valore sentinella il ciclo dovrebbe interrompersi subito,invece,prima di passare all'istruzione successiva,mi chiede l'input Km...probabilmente il problema è a monte...
#include <stdio.h>
#include <stdlib.h>

int main()
{
  float litri;
  float km;
  float media;
  float mediatot = 0;
  int counter = 0;
   
     
         
  while(litri != -1){
         
              
         printf("Inserisci i litri consumati(-1 per terminare): ");
         scanf("%f" , &litri);
         
         printf("Inserisci i Km percorsi con questo pieno: ");
         scanf("%f" , &km);
         
         media = (float) km / litri;
         
         mediatot += media;
         counter += 1; 
         
  
         printf("I km / litro percorsi per questo pieno sono %f\n\n" , media);
       
             
}
  
  if(counter != 0){
         mediatot = (float) mediatot / counter;
         printf("La media complessiva km/l equivale a %f\n" , mediatot);
}
   
  else{
         printf("Non sono stati immessi dati!\n");
}

  system("PAUSE");	
  return 0;
}

26 Risposte

  • Re: Problema-Pseudocodice-Programma

    Devi chiedere di inserire i litri sia appena prima del while, sia alla fine del blocco. In questo modo la prima volta che inserisci i litri (quindi prima del while) se inserisci un valore valido entra nel ciclo, chiede i chilometri e calcola la prima media; a questo punto, arrivato verso la fine del ciclo, ti richiede i litri, e se è un valore valido riesegue il ciclo, e così via...

    ciao
  • Re: Problema-Pseudocodice-Programma

    dvaosta ha scritto:


    Devi chiedere di inserire i litri sia appena prima del while, sia alla fine del blocco. In questo modo la prima volta che inserisci i litri (quindi prima del while) se inserisci un valore valido entra nel ciclo, chiede i chilometri e calcola la prima media; a questo punto, arrivato verso la fine del ciclo, ti richiede i litri, e se è un valore valido riesegue il ciclo, e così via...

    ciao
    Grazie mille per la risposta,credo di aver capito, più tardi provo...
    Grazie ancora
  • Re: Problema-Pseudocodice-Programma

    
      while( litri > -1.0)
      {
    
    
             printf("Inserisci i litri consumati(-1 per terminare): ");
             scanf("%f" , &litri);
                if (litri < 0.0) break;
    
             printf("Inserisci i Km percorsi con questo pieno: ");
             scanf("%f" , &km);
    
             media = (float) km / litri;
    
             mediatot += media;
             counter += 1;
    
    
             printf("I km / litro percorsi per questo pieno sono %f\n\n" , media);
    
    
      }
    
  • Re: Problema-Pseudocodice-Programma

    vbextreme ha scritto:


    
      while( litri > -1.0)
      {
    
    
             printf("Inserisci i litri consumati(-1 per terminare): ");
             scanf("%f" , &litri);
                if (litri < 0.0) break;
    
             printf("Inserisci i Km percorsi con questo pieno: ");
             scanf("%f" , &km);
    
             media = (float) km / litri;
    
             mediatot += media;
             counter += 1;
    
    
             printf("I km / litro percorsi per questo pieno sono %f\n\n" , media);
    
    
      }
    
    Sì ma così non è strutturato, e lui adesso deve imparare a programmare bene. Tra l'altro non è neanche detto che conosca già il break;
  • Re: Problema-Pseudocodice-Programma

    Grazie per l'aiuto,sto iniziando a capire la logica da applicare...


    1)Inizializzare le variabili
    a- Inizializzare la media totale Km/l a 0
    b- Inizializzare il contatore(numero pieni) a 0
    2)Prendere in input i litri consumati
    3)Finchè il numero di litri è u valore diverso dal valore sentinella,prendere in input i Km percorsi e calcolare i Km percorsi per ogni litro.
    a- Prendere in input i Km percorsi e visualizzarli
    b- Calcolare i Km percorsi per ogni litro e visualizzarli
    c- Aggiungere 1 al Contatore (Numero pieni).
    d- Prendere in input i i litri usati nel successivo pieno(o forse del valore sentinella)
    3) Calcolare la media dei Km percorsi per ogni litro per tutti i pieni considerati.
    a-Se il contatore non è uguale a 0
    a1-Impostare la media con il totale diviso per il contatore
    a2-Visualizzare la media.
    b-Altrimenti
    b1-Visualizzare "Non sono stati immessi dati"

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
      float litri;
      float km;
      float media;
      float mediatot = 0;
      int counter = 0;
       
             printf("Inserisci i litri consumati(-1 per terminare): ");
             scanf("%f" , &litri);
             
             
      while(litri != -1){
             
             printf("Inserisci i Km percorsi con questo pieno: ");
             scanf("%f" , &km);
             
             media = (float) km / litri;
             
             mediatot += media;
             counter += 1; 
             
      
             printf("I km / litro percorsi per questo pieno sono %f\n\n" , media);
             
             printf("Inserisci i litri consumati(-1 per terminare): ");
             scanf("%f" , &litri);
                 
    }
      
      if(counter != 0){
             mediatot = (float) mediatot / counter;
             printf("La media complessiva km/l equivale a %f\n" , mediatot);
    }
       
      else{
             printf("Non sono stati immessi dati!\n");
    }
    
      system("PAUSE");	
      return 0;
    }
  • Re: Problema-Pseudocodice-Programma

    Niente,non ci arrivo...anche in quest'altro caso la sentinella dorme...o meglio si appisola dopo che è iniziato il ciclo...solo se inserisco il suo valore alla prima richiesta di input fa il suo dovere...
    int main()
    {
      int account;
      float beginning;
      float charges;
      float credit;
      float limit;
      float balance;
      
      printf("Inserisci il numero di conto(-1 per terminare): ");
      scanf("%d" , &account);
      
      while(account != -1){
                    printf("Inserisci il saldo iniziale: ");
                    scanf("%f" , &beginning);
                    
                    printf("Inserisci il totale dei debiti: ");
                    scanf("%f" , &charges);
                    
                    printf("Inserisci il credito applicato sul conto: ");
                    scanf("%f" , &credit);
                    
                    printf("Inserisci il limite di credito sul conto: ");
                    scanf("%f" , &limit);
                    
                    balance = (float) beginning + charges - credit;
    
                      
      if(balance > limit){
                    printf("Numero di conto: %d\n" , account);
                    printf("Limite di credito concesso: %f\n" , limit);
                    printf("Saldo: %f\n" , balance);
                    printf("Limite di credito superato\n\n");
    }
                 printf("Inserisci il numero di conto: ");
                 scanf("%f" , &account);              
    }
      system("PAUSE");	
      return 0;
    }
  • Re: Problema-Pseudocodice-Programma

    Scanf("%f" , &account);

    Sicuro che deve essere %f ?

    Non usare il copia incolla se non sai esattamente cosa fai ...
  • Re: Problema-Pseudocodice-Programma

    oregon ha scritto:


    scanf("%f" , &account);

    Sicuro che deve essere %f ?

    Non usare il copia incolla se non sai esattamente cosa fai ...
    che babbione che sono..grazie..
    approfitto che sei in linea per chiedere una cosa...
    nel caso in cui l'if non venga soddisfatto,come faccio a metter degli spazi tra la nuova visualizzazione e la precedente?
  • Re: Problema-Pseudocodice-Programma

    Se intendi delle linee (non spazi) allora ti basta

    printf("\n\nInserisci il numero di conto: ");
  • Re: Problema-Pseudocodice-Programma

    fravol82 ha scritto:


    oregon ha scritto:


    scanf("%f" , &account);

    Sicuro che deve essere %f ?

    Non usare il copia incolla se non sai esattamente cosa fai ...
    che babbione che sono..grazie..
    approfitto che sei in linea per chiedere una cosa...
    nel caso in cui l'if non venga soddisfatto,come faccio a metter degli spazi tra la nuova visualizzazione e la precedente?
    okok risolto da me...scusate ancora
  • Re: Problema-Pseudocodice-Programma

    oregon ha scritto:


    Se intendi delle linee (non spazi) allora ti basta

    printf("\n\nInserisci il numero di conto: ");
    ok...nel frattempo ho avuto un ormai raro lampo di genio
  • Re: Problema-Pseudocodice-Programma

    
    int main()
    {
      int account;
      float beginning;
      float charges;
      float credit;
      float limit;
      float balance;
     
      //redundant
      //printf("Inserisci il numero di conto(-1 per terminare): ");
      //scanf("%d" , &account);
     
      do{
                    printf("Inserisci il saldo iniziale: ");
                    scanf("%f" , &beginning);
                   
                    printf("Inserisci il totale dei debiti: ");
                    scanf("%f" , &charges);
                   
                    printf("Inserisci il credito applicato sul conto: ");
                    scanf("%f" , &credit);
                   
                    printf("Inserisci il limite di credito sul conto: ");
                    scanf("%f" , &limit);
                   
                    balance = (float) beginning + charges - credit;
    
                     
      if(balance > limit){
                    printf("Numero di conto: %d\n" , account);
                    printf("Limite di credito concesso: %f\n" , limit);
                    printf("Saldo: %f\n" , balance);
                    printf("Limite di credito superato\n\n");
        }
                 printf("Inserisci il numero di conto: ");
                 scanf("%f" , &account);             
    }while(account != -1);
      
      //horrible
      //don't use dev-c++
      //system("PAUSE");   
      return 0;
    }
    
  • Re: Problema-Pseudocodice-Programma

    vbextreme ha scritto:


    
    int main()
    {
      int account;
      float beginning;
      float charges;
      float credit;
      float limit;
      float balance;
     
      //redundant
      //printf("Inserisci il numero di conto(-1 per terminare): ");
      //scanf("%d" , &account);
     
      do{
                    printf("Inserisci il saldo iniziale: ");
                    scanf("%f" , &beginning);
                   
                    printf("Inserisci il totale dei debiti: ");
                    scanf("%f" , &charges);
                   
                    printf("Inserisci il credito applicato sul conto: ");
                    scanf("%f" , &credit);
                   
                    printf("Inserisci il limite di credito sul conto: ");
                    scanf("%f" , &limit);
                   
                    balance = (float) beginning + charges - credit;
    
                     
      if(balance > limit){
                    printf("Numero di conto: %d\n" , account);
                    printf("Limite di credito concesso: %f\n" , limit);
                    printf("Saldo: %f\n" , balance);
                    printf("Limite di credito superato\n\n");
        }
                 printf("Inserisci il numero di conto: ");
                 scanf("%f" , &account);             
    }while(account != -1);
      
      //horrible
      //don't use dev-c++
      //system("PAUSE");   
      return 0;
    }
    
    Eheh lo so che dev non è ben visto da programmatori esperti, , però è così semplice e intuitivo...sono vermente all'inizio e pensavo che per ora fosse un buon compromesso...cmq, , cosa consigliate di meglio?

    Per il resto ho notato altre modifiche al codice però non le capisco..
  • Re: Problema-Pseudocodice-Programma

    Un classico è code::block, che è altrettanto semplice e si può estendere a più linguaggi.

    Dicci quali modifiche non hai capito.

    ciao
Devi accedere o registrarti per scrivere nel forum
26 risposte