Prova d'esame

di il
11 risposte

Prova d'esame

Ho svolto un programma in C e vorrei chiedervi se vi sembra giusto!

TRACCIA:Scrivere un programma in C che legga da tastiera un testo fino a EOF e stampi in un file formato ASCII tutte le frasi che contengono una determinata parola.

A tal proposito si facciano le seguenti assunzioni:
La dimensione del testo non è nota a priori.
La parola di interesse è passata come primo argomento su linea di comando.
Il nome del file in cui salvare le frasi è passato come ultimo argomento su linea di comando.
Una frase termina sempre e solo con i tre caratteri di punteggiatura ‘.’ (punto), ‘?’ (punto interrogativo) e ‘!’ (punto esclamativo).
All’ interno di una frase tutte le parole sono sempre e solo separate da uno spazio o da new-line.
Le frasi devono essere copiate fedelmente nel file di uscita, ‘\n’ inclusi.
Ogni frase è composta da un massimo di 50 parole; ogni parola è composta al massimo da 20 caratteri e non contiene spazi.
Non fare distinzione tra maiuscole e minuscole.

Esempio
C:\> find quis sentence.txt
Introdurre il testo:
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam quis nostrud
exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit
laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum
iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae
consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?

sentence.txt
Ut enim ad minim veniam quis nostrud
exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit
laboriosam, nisi ut aliquid ex ea commodi consequatur?
Quis autem vel eum
iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae
consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?

RISOLUZIONE:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define R 50
#define C 50
#define K 20

int main ( int argc, char*argv[])
{
FILE *f, *f2;
int RR, CC, i, j, k, flag;
char matrice[R][C][K], s1[C];


if (argc != 3)
{
printf("errore - numero argometni non valido\n");
exit(-1);
}
f=fopen(argv[2], "r");
if(f == NULL)
{
printf("errore - impossibile leggere %s in lettura\n", argv[1]);
exit(-1);
}

RR=0;
CC=0;
while((fscanf(f, "%s", s1)) != EOF)
{
flag=0;
strcpy(matrice[RR][CC],s1);
for(i=0; i<C; i++)
{
if(matrice[RR][CC] == (('.') | ('!') | ('?') ))
{
RR++;
CC=0;
flag =1;

}
if (flag ==0)
{
CC++;
}
}
}

f2=fopen("sentence.txt", "w");
if (f2 == NULL)
{
printf("errore - impossibile aprire il file sentence.txt in scrittura\n");
exit(-1);
}

for(i=0; i<RR; i++)
{
for(j=0; j<C; j++)
{
if ((strcmp(matrice[j], argv[1])) == 0)
{
for (k=0; k<C; k++)
{
fprintf(f2, "%s ", matrice[k]);

}
}
}
}
fclose(f);
fclose(f2);
return 0;
}

11 Risposte

  • Re: Prova d'esame

    Non ho controllato il resto del codice ma già questa linea

    if(matrice[RR][CC] == (('.') | ('!') | ('?') ))

    non fa quello che pensi e dimostra che non hai chiara la sintassi del C
  • Re: Prova d'esame

    Sorry, dovrebbe essere giusto così?

    if((matrice[RR][CC] == '.') ||(matrice[RR][CC] == '!') || (matrice[RR][CC] =='?'))
  • Re: Prova d'esame

    Scusami in anticipo se sono diretto, ma credo che il tuo svolgimento sia proprio sbagliato. Era sufficiente un solo ciclo do-while e un paio di variabili. Mi pare che in un punto usi addirittura tre cicli annidati per non parlare della enorme matrice. Se ho tempo ti posto una possibile soluzione.
  • Re: Prova d'esame

    mentat ha scritto:


    Scusami in anticipo se sono diretto, ma credo che il tuo svolgimento sia proprio sbagliato. Era sufficiente un solo ciclo do-while e un paio di variabili. Mi pare che in un punto usi addirittura tre cicli annidati per non parlare della enorme matrice. Se ho tempo ti posto una possibile soluzione.


    figurati, se ho sbagliato qualcosa meglio saperlo subito... correggere i miei errori e andare avanti.. penso che programmare sia una cosa molto soggettiva e (ai miei livelli, primo esame di ingegneria), penso che la cosa fondamentale sia che il programma funzioni, anche se un po' più macchinoso.. senza stare a guardare se uno per girare occupi più o meno memoria...
    Se il mio è sbagliato mi potresti per favore dire dove così da poterlo correggere o in caso cambiare metodo... se tu hai una tua idea e me la esponessi mi faresti un favore:)
  • Re: Prova d'esame

    Non e' proprio vero che programmare' soggettivo: se e' vero che programmare e' ancora un'arte, e' anche vero che un programma incasinato, che funziona per sbaglio, non e' saper programmare.
    La programmazione richiede di seguire le regole, ma sopprattutto chiarezza di pensiero.
    Un programma incasinato, dove c'e' piu' codice del necessario, incomprensibile, arzigogolato, significa che chi lo ha realizzato non ha compreso bene le regole da seguire ed e' andato solo per tentativi.
  • Re: Prova d'esame

    migliorabile ha scritto:


    Non e' proprio vero che programmare' soggettivo: se e' vero che programmare e' ancora un'arte, e' anche vero che un programma incasinato, che funziona per sbaglio, non e' saper programmare.
    La programmazione richiede di seguire le regole, ma sopprattutto chiarezza di pensiero.
    Un programma incasinato, dove c'e' piu' codice del necessario, incomprensibile, arzigogolato, significa che chi lo ha realizzato non ha compreso bene le regole da seguire ed e' andato solo per tentativi.

    grazie per aver fatto diventare il mio post una questione filosofica/morale, sinceramente dopo una risposta del genere mi sarei aspettato una bozza di programma con scritto (si fa così e basta! unico e solo metodo consentito dai canoni informatici!), invece solo parole.
    A mio parere è una gran cosa che non abbiamo le stesse idee e che certa gente arriva alle conclusioni in maniera diversa, perché è proprio il carattere che ci distingue dalle macchine che sono "comandate" da programmi. Poi non parlare di arte che forse è la cosa più soggettiva che ci sia...
    e comunque, la storia racconta che proprio persone che pensano fuori dagli schemi, hanno fatto la differenza, anche se non è il mio caso..
    poi ti dico, questo è solo il mio pensiero, rispetto il tuo ma non lo condivido..
    ma se mi presenti una bozza di programma e mi smonti il mio spiegandomi il perché te ne sarò molto grato.. molto probabilmente sarai più bravo di me.
    Se fossi sicuro del mio programma non l'avrei scritto qui.. ma più che discorsi sull'informatica in generale mi aspettavo un aiuto pratico.
    Se puoi scrivimi la tua bozza
  • Re: Prova d'esame

    Ecco!
    Ti ho messo un po' di commenti. Come vedi faccio un solo ciclo e non faccio uso di matrici.

    In bocca al lupo!
    
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    int main(int argc, char* argv[]) {
    
       char c = ' ';
       char word[21]; //20 + fine stringa
       char sentence[23*50]; //20 + fine stringa + spazi e punti.
       int found, i, j;
       FILE *fIn;
       FILE *fOut;
    
    
    
       if (argc != 3)
       {
          printf("errore - numero argomenti non valido\n");
          exit(-1);
       }
    
       fIn = fopen(argv[2], "r");
    
       if(fIn == NULL)
       {
          printf("errore - impossibile leggere %s in lettura\n", argv[1]);
          exit(-1);
       }
       
       fOut = fopen("result.txt", "w");
       
       if (fOut == NULL)
       {
          printf("errore - impossibile aprire il file sentence.txt in scrittura\n");
          exit(-1);
       }
    
       
       i = 0; //contatore sulla stringa sentence
       j = 0; //contatore sulla stringa word
       found = 0;
       word[0] = '\0';
       sentence[0] = '\0';
       
       while (argv[1][i])
       {
           argv[1][i] = tolower(argv[1][i++]);
       }
       
       i = 0;
       
       while (c != EOF)
       {
          //leggo un carattere per volta dal file di input
          c = fgetc(fIn);
          
          //lo aggiungo subito alla stringa di output
          sentence[i++] = c;
          
          switch (c) {
             // spazio o newline abbiamo interruzione di parola
             case ' ':
             case '\n':
             
                // truccaccio per eliminare lo spazio dopo il punto in sentence
                if (i == 1) {
                   i = 0;
                }
    
                // termino correttamente la parola da confrontare
                word[j] = '\0';
                
                // confronto con il primo argomento
                if (strcmp(word, argv[1]) == 0)
                {
                   // questa sarà da mettere in output
                   found = 1;
                };
                
                // azzero la parola
                word[0] = '\0';
                j = 0;
                
                break;
             
             // termine della frase
             case '.':
             case '?':
             case '!':
                
                sentence[i] = '\0';
                
                // se era da stampare...
                if (found == 1)
                {
                   fprintf(fOut, "%s", sentence);         
                }
                
                sentence[0] = '\0';
                found = 0;
                i = 0;
                break;
                
             default:
                //evito di mettere nella parola i simboli spazio e punti
                word[j++] = tolower(c);
             
          }
                
       }
       fclose(fIn);
       fclose(fOut);
       return 0;
    }
    
    EDIT
    rileggendo il testo dell'esame, ci sarebbe anche questo
    Non fare distinzione tra maiuscole e minuscole.
    quindi è necessario trasformare sia word che argv[1] in minuscolo. Per argv[1] basta farlo una volta all'inizio del main, per word può essere fatto modificando l'istruzione
    word[j++] = c;
    in
    word[j++] = tolower(c);
    EDIT
    adesso ho inserito anche le correzioni dell'edit precedente
  • Re: Prova d'esame

    Grazie mille, adesso ho capito come farlo, non avevo pensato ad usare uno switch con la punteggiatura!
    grazie ancora per la risposta!
  • Re: Prova d'esame

    Figurati, è stato un piacere.
  • Re: Prova d'esame

    Era la prova d'esame che ho dato a luglio!! Per caso sei del poli?
  • Re: Prova d'esame

    popinskiy ha scritto:


    Era la prova d'esame che ho dato a luglio!! Per caso sei del poli?


    yess
Devi accedere o registrarti per scrivere nel forum
11 risposte