Correzione prova pratica del 3 maggio 2003

Correzione prova pratica del 3 maggio 2003


Istruzioni:

il commento iniziale rappresenta il giudizio complessivo sul programma. Nei commenti trovate: Il codice presentato non è necessariamente identico a quello consegnato in quanto possono essere state effettuate modifiche per renderlo compilabile e/o per la corretta indentazione.

//XXX legge a parola e di conseguenza non ignora caratteri non alfabetici
/*

   FONDAMENTI DI INFORMATICA A

   Compito d'esame del 3 maggio 2003



   Scrivere un programma che esegua i segenti punti:

   - aprire un file ASCII il cui nome viene fornito in input dall'utente

   - chiedere all'utente un carattere alfabetico

   - stampare a video il numero di parole del file ASCII di input che contengono

   il carattere inserito dall'utente

   - stampare  la lunghezza minima e massima delle parole che contengono

   il carattere inserito dall'utente

   - (con il termine PAROLA si intenda un qualsiasi insieme contiguo di lettere)



   Questo programma e' stato scritto da:

   DANIELE GIUSTIVI matricola 155766 (teledidattico)

   e-mail: giustivi@inalca.it



   per provare il programma ho utilizzato

   il file mio.txt che allego su floppy

   */

#include <iostream.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#include <fstream.h>
#include <ctype.h>
#include <iomanip.h>

int main (){
  char buffer[250];
  char fileinp[50];     /* nome del file ascii (deve contenere anche

         l'eventuale path con la lettera dell'unit…) */
  FILE *leggofile;      // puntatore al file 'fileinp'

  char lettera;         // carattere da cercare

  unsigned int parolelettera=0;  // numero di parole che contengono 'lettera'

  unsigned int contaparole=0;    // numero delle parole contenute nel file

  unsigned int lungparola=0;     /* variabile temporanea per la lunghezza di

            ogni singola parola letta */
  unsigned int lmax=0,lmin=100;    /* lunghezza max e min delle parole che

              contengono 'lettera' */
  unsigned int contatore;


  // chiedo all'utente il nome del file da analizzare

  cout<<"Inserire il nome del file (se esiste, deve essere di tipo ASCII)"
    <<endl<<"nella forma path+nomefile.ext"<<endl;
  cin>>fileinp;
  cout<<endl;
  ifstream fin(fileinp);


  // se il file non esiste,genero un msg di errore e esco

  if (!fin)
  {cerr<<"Errore: impossibile aprire il file "<<endl<<fileinp<<endl;
    cout<<"verifica l'esatto percorso/nome del ";
    cout<<"file ascii e rilancia il programma"<<endl;
    exit(1);
  }

  /* chiedo all'utente di inserire il carattere di cui si vuole

     ricercare la ricorrenza */
  do
  {
    cout<<"Inserire il carattere (SOLO LETTERE) di cui si vuole ricercare la ricorrenza"<<endl;
    cin>>lettera;
  }
  while(!isalpha(lettera)); /* controlla che venga inserita una lettera

             rifiuta numeri e altri simboli */

  // converto il carattere inserito nel corrispondente maiuscolo

  lettera=toupper(lettera);
  cout<<endl;

  while(fin>>buffer)  // FIXME cosi' pero' leggo anche i segni di punteggiatura etc...

  {
    contaparole++;
    for (contatore=0;contatore<strlen(buffer);contatore++)
    {
      // converto in maiuscolo la parola

      buffer[contatore]=toupper(buffer[contatore]);
      if (isalpha(buffer[contatore]) && (buffer[contatore]==lettera)) // XXX la prima condizione mi sembra non necessaria

      {
  parolelettera++;
  // confronto la lunghezza della parola letta

  lungparola=strlen(buffer);
  if (lungparola<lmin)
    lmin=lungparola;
  if (lungparola>lmax)
    lmax=lungparola;
  break;  /* mi basta che la lettera sia presente ALMENO

       una volta nella parola*/
      }
    }
    //cout<<buffer; //se voglio vedere 'il file che passa'

  }
  fin.close();
  if (lmin==100)  //se non ho trovato nessuna lettera

    lmin=0;
  cout<<endl<<"Il file "<<fileinp<<" contiene "<<contaparole<<" parole";
  cout<<endl<<"Il carattere "<<lettera<<" Š contenuto in "<<parolelettera<<" parole";
  cout<<endl<<"La lunghezza min di queste Š "<<lmin<<" caratteri";
  cout<<endl<<"La lunghezza max di queste Š "<<lmax<<" caratteri";
  cout<<endl;
  cout<<endl<<"per terminare premi un tasto qualsiasi";
  return 0;}


Se avete commenti o osservazioni su questa pagina
mandate un messaggio di posta elettronica a bertozzi@CE.UniPR.IT