//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;}