[C] Giudizio veloce su esercizio svolto

di il
3 risposte

[C] Giudizio veloce su esercizio svolto

Vi chiedo un giudizio veloce su come ho svolto questo esercizio:

Esercizio 1.19 Scrivete una funzione reverse(s), che inverta la stringa di caratteri s.
Usatela per scrivere un programma che inverta, una per volta, le sue linee di input.

Io ho fatto in questo modo:
/* Registra tutto l'input fino a EOF nel vettore input (in main)
Taglia la prima stringa del vettore input e la trasferisce nel vettore scambio.
Reverse inverte il contenuto del vettore scambio trasferendolo nel vettore output
Stampa il vettore output
Shift del vettore input (per cancellare la stringa appena stampata)
Azzera i vettori scambio e output
Ricomincia dal punto 2

Il codice che ho scritto funziona bene ma ho l'impressione che la soluzione da me adottata sia troppo complicata per un esercizio cosí semplice. Che ne pensate?

 /* Esercizio 1.19 Scrivete una funzione reverse(s), che inverta la stringa di caratteri s.
   Usatela per scrivere un programma che inverta, una per volta, le sue linee di input. */

/*      Registra tutto l'input fino a EOF nel vettore input (in main)
        Taglia la prima stringa del vettore input e la trasferisce nel vettore scambio.
        Reverse inverte il contenuto del vettore scambio traserendolo nel vettore output
        Stampa il vettore output
        Shift del vettore input
        Azzera i vettori scambio e output
        Ricomincia dal punto 2          */
#include <stdio.h>

#define MAXINPUT 1000000

void azzeravett(char vettore[], int lunghezzavettore);
int tagliastr(char from[], char to[]);
void shift(char vettore[], int inizio, int lunghezzavettore);
void reverse(char dritto[], char inverso[], int lunghezzastringa);
void stampa(char vettore[]);

char input[MAXINPUT];
char scambio[MAXINPUT];
char output[MAXINPUT];

int finestr;            // indica il numero di caratteri della striga da stampare

int main()
{
/* Azzera variabili e vettori */
        azzeravett(input, MAXINPUT);
        azzeravett(scambio, MAXINPUT);
        azzeravett(output, MAXINPUT);
        int finestr=0;          // numero di caratteri della stringa in lavorazione
        int c=0;
        int endinput=0;         // numero di caratteri di tutto l'input
/* Registra tutto l'input nel vettore input */
        while((c=getchar())!=EOF)
        {
                input[endinput]=c;
                ++endinput;
        }
/* Se l'input non finisce con new line aggiungi '\n' */
        if(input[endinput-1]!='\n')
                input[endinput]='\n';
        putchar('\n');
/* Loop che formatta e stampa l'input.
   Il ciclo si interrompe quando l'input e' una linea vuota */
        while((finestr=tagliastr(input, scambio))!=0)
        {
                reverse(scambio, output, finestr);
                stampa(output);
                shift(input, finestr, MAXINPUT);
                azzeravett(output, MAXINPUT);
                azzeravett(scambio, MAXINPUT);
        }

        return 0;
}
/* azzerra un vettore */
void azzeravett(char vett[], int stop)
{
        for(int i=0; i<=stop; ++i)
                vett[i]=0;
}
/* taglia la prima stringa di un vettore e la trasferisce in un vettore scambio. Restituisce la
        lunghezza della stringa, restituisce 0 se il primo carattere incontrato e' '\0'  */
int tagliastr(char from[], char to[])
{
        int c=0;
        int i=0;
        c=from[i];
        switch(c)
        {
                case '\0' :
                        return i;
                        break;
                default :
                        while((c=from[i])!='\n')
                        {
                                to[i]=c;
                                ++i;
                        }
                        to[i]='\n';
                        return i;
                        break;
        }
}
/* trasferisce la stringa dal vettore scambio a quello di output, invertendola */
void reverse(char dritto[], char inverso[], int stop)
{
        int contatore;
        contatore=stop-1;
        int i=0;
        for(i=0; i<stop; ++i)
        {
                inverso[i]=dritto[contatore];
                --contatore;
        }
        inverso[stop]='\n';
        inverso[stop+1]='\0';
}
/* stampa la stringa nel vettore output */
void stampa(char vett[])
{
        printf("%s", vett);
}
/* shift del vettore di input per eliminare la stringa appena stampata */
void shift(char vett[], int inizio, int fine)
{
        int i=0;
        for(i=0; i<=fine; ++i)
        {
                vett[i]=vett[inizio+1];
                ++inizio;
        }
}  

3 Risposte

  • Re: [C] Giudizio veloce su esercizio svolto

    Intanto non ha senso usare vettori da 1000000 caratteri ...

    E poi mi sa che hai esagerato con codice inutile ... non è necessario nessun "azzeramento" ... Insomma, qualcosa del genere bastava
    
    #include <stdio.h>
    #include <string.h>
    
    #define MAXINPUT 100
    
    char input[MAXINPUT];
    char output[MAXINPUT];
    
    void reverse(char dritto[], char inverso[])
    {
    	int i=strlen(dritto)-1, j=0;
    
    	while(i>=0)
    		inverso[j++] = dritto[i--];
    
    	inverso[j] = '\0';
    }
    
    int main()
    {
    	while(1)
    	{
    		gets(input);
    		if(strcmp(input, "*")==0) break;
    
    		reverse(input, output);
    		printf("%s\n", output);
    	}
    
    	return 0;
    }
    
    Interrompi l'input con un *
  • Re: [C] Giudizio veloce su esercizio svolto

    oregon ha scritto:


    Intanto non ha senso usare vettori da 1000000 caratteri ...
    Lo avevo portato a un 1000000 di caratteri perché gli ho dato in input un intero libro (l'Inferno di Dante!).

    oregon ha scritto:


    E poi mi sa che hai esagerato con codice inutile ...
    Era proprio questo il mio dubbio. Grazie dell'esempio, per me é molto istruttivo (come avrai capito, non conoscevo nemmeno le funzioni per le stringhe!).
  • Re: [C] Giudizio veloce su esercizio svolto

    Quel vettore ti deve servire per una singola riga non per tutto il libro. La lettura va fatta riga per riga.

    Le funzioni di libreria del C le devi studiare prima di scrivere codice che potrebbe utilizzarle. Se usi le stringhe devi prima studiare le relative funzioni.
Devi accedere o registrarti per scrivere nel forum
3 risposte