Non capisco cosa chiede quest'esercizio

di il
5 risposte

Non capisco cosa chiede quest'esercizio

Dal K&R:

"Scrivete un programma entab che rimpiazza stringhe di spazi con il numero nìminimo di caratteri di tabulazione e spazi per ottenere la stessa spaziatura. Usate gli stessi tab-stop del programma detab. Quando entrambi un tab o un singolo spazio sono sufficienti a raggiungere un tab stop, a quale si dovrebbe dare la preferenza?"

Il testo del precedente esercizio era questo:

"Scrivete un programma detab che rimpiazza i caratteri di tabulazione con un numero di spazi tale da raggiungere il successivo tab stop. Assumete di avere un insieme fissato di tab stop, diciamo ogni n colonne. n dovrebbe essere una variabile o una costante simbolica?"

L'esercizio precedente l'avevo interpretato (diciamo che ho voluto interpretarlo così per ipotesi, ma mi sembra un po' ambiguo) credendo di dover stabilire io la dimensione delle tabulazioni (l'ho posta ogni 10 caratteri).
Ora, se la tabulazione la decido io (in questo caso 10), in realtà quando uso il carattere '\t' non è che il cursore si sposta alla tabulazione che ho deciso io, ma a quella definita da C. Se è così allora non capisco cosa chiede quest'esercizio, o meglio, perchè chiede di usare il tab-stop usato nell'altro esercizio, visto che me lo sono inventato.

A questo punto mi chiedo se in realtà non sia sbagliata l'interpretazione l'esercizio precedente.

5 Risposte

  • Re: Non capisco cosa chiede quest'esercizio

    E' un "pezzo" di un editor di testo vecchio stile, nel quale l'indentazione è gestita o con TAB o con spazi.
    Ridefinendo il numero di spazi di TAB si può "magicamente" riformattare il testo con indentazioni (poniamo) da 4, 8 o più spazi.
    In sostanza se poni TAB a 4 spazi, e nel file ne trovi 5, allora metterai un TAB e uno spazio al posto dei 5 spazi.

    In un mondo invece un pochino più "evoluto" non hai TAB di lunghezza fissata, bensì tab stop programmabili (come il righello Word per capirci).
    Per semplicità nel primo esercizio invece sono fissi (ogni n colonne).

    Direi che l'esercizio riguarda la manipolazione di stringhe, la sostituzione di caratteri con sequenze di caratteri (e viceversa) e un minimo di aritmetica modulo n, più qualche funzione di IO per testi
  • Re: Non capisco cosa chiede quest'esercizio

    Allora facciamo così, andiamo con ordine e consideriamo un attimo quello che ho definito come "esercizio precedente", altrimenti ho paura che non ci capiamo e ti faccio pure perdere tempo inutilmente.
    Io l'ho implementato così: ho stabilito che ogni 10 colonne (cioè ogni 10 posizioni) ci fosse questa sorta di "marker", di "linea virtuale" o punto di riferimento (questa sarebbe la mia interpretazione di tab-stop, è corretta?) e ho associato questa dimensione ad una macro (DIM_TAB). Ho stabilito anche il numero di questi "stop", in modo da far concludere la riga in corrispondenza di uno di essi (l'ho messo a 15). Si trattava poi semplicemente di mettere al posto dei caratteri di tab il numero di spazi che fossero serviti a raggiungere lo "stop" successivo (che ho impostato ogni 10 posizioni).

    Il codice di seguito.
    
    #include <stdio.h>
    #define DIM_TAB 10
    #define MAX_RIGA 15*DIM_TAB
    int main(void)
    {
        int ch, posizione, spazio;
    
        posizione = 0;
        while ((ch=getchar()) != EOF) {
            if (ch=='\t') {
                for (spazio = 0; spazio<(DIM_TAB-(posizione%DIM_TAB)); ++spazio)
                    putchar(' ');
                posizione += spazio;
            }
            else if (ch != '\n') {
                putchar(ch);
                ++posizione;
            }
            if (posizione == MAX_RIGA)
                ch = '\n';
            if (ch == '\n') {
                putchar(ch);
                posizione = 0;
            }
        }
        return 0;
    }
    
    Ora, nel secondo esercizio, mi chiede di sostituire un certo numero di spazi con caratteri di tabulazione e spazi, usando gli stessi tab-stop che ho usato nel primo (nel mio caso ogni 10 colonne). I tab-stop sono impostati di default, li posso mica cambiare a mio piacimento senza fare come ho fatto nel primo esercizio (cioè sostituendo il carattere di tabulazione con degli spazi)? Nel senso che, io definisco una macro per indicare dove vorrei che fossero i tab-stop, ma è semplicemente una scritta che mi da un'indicazione, se poi inserisco il carattere '\t' (di tabulazione) mi porta il cursore al tab-stop impostato di default, non alla decima colonna come vorrei io! Per far spostare il cursore alla decima colonna dovrei fare in pratica quello che ho fatto nell'esercizio di prima e cioè sostituire il carattere di tabulazione con una serie di spazi che mi portano al tab-stop definito da me (in pratica sostituire '\t' con una tabulazione "fai da te"), ma si tratta sempre di una serie di spazi inseriti da me. Allora quest'interpretazione non dovrebbe essere corretta, in quanto l'ampiezza dei tab-stop può non coincidere.
  • Re: Non capisco cosa chiede quest'esercizio

    Francamente non avrei impostato l'esercizio come hai fatto.
    avrei definito una funzione "espandi tab" che, presa una stringa contenente tab, la espande sostituendo ai tab n spazi.
    l'avrei chiamata dal main dopo aver aperto il file e letto riga per riga, per poi stampare a video.

    riguardo al secondo esercizio lo vedo come la f^-1 del primo: una funzione "collassatab" che trova tutte le sequenze di caratteri (spazi) più lunghe di n, sostituendo con 1 o più tab (lasciando il numero minimo di spazi).

    in sostanza preso un file e passato due volte (esercizio 1 ed esercizio 2) dovrebbe tornare come all'inizio (ammesso che fosse "ben" formattato)

    riguardo ai tab-stop nel "mondo reale", come accennato, negli editor per programmi sono tipicamente fissi (4 caratteri spesso), mentre nei word processor sono variabili.
    in tal caso serve una struttura che indichi dove si trovano i vari tab. chiaramente nel caso di font proporzionali la cosa diventa interessante (bisogna avere coordinati espresse in una qualche unità di misura, tipo millimetri, punti o quello che vuoi).
    con i font fixed width invece è più facile.

    tornando al tema: fossi in te opererai con le due funzioni "espandi" e "collassa"
  • Re: Non capisco cosa chiede quest'esercizio

    Quel codice era solo un esempio, credo anzi che quell'interpretazione sia sbagliata, l'ho messa per capire cosa intendevo con quell'interpretazione che ho fornito.
    Lasciando un attimo stare quell'esempio in cui ho implementato il primo esercizio, continuo ad avere dei dubbi sull'interpretazione, o meglio, una risposta me la sono data, ma non ho capito se il testo è posto in quel modo di proposito oppure è solo ambiguo.
    Se guardo al testo di entrambi gli esercizi mi viene da pensare che l'ampiezza dei tab-stop usata nel primo, debba necessariamente coincidere con l'ampiezza dei tab-stop dell'editor in uso e, ovviamente, con quella del secondo, altrimenti i due esercizi non possono essere l'uno l'inverso dell'altro e tra l'altro il secondo non avrebbe molto senso (il secondo esercizio non ha senso se uso come ampiezza una misura diversa da quella dei tab-stop impostata dall'editor).

    Ma se l'ampiezza è data dall'editor, cosa vuol dire "assumete un numero fissato di tab-stop, diciamo ogni n colonne"? Se io assumo che per ogni linea di x caratteri ci sia un numero prestabilito di tab-stop, allora n (l'ampiezza dei tab-stop) dipenderà dal numero di caratteri contenuto in una riga, ad esempio se una riga ha 160 caratteri e fisso il numero di tab-stop a 20, n sarà uguale a 8. Ma posso anche stabilire che ci siano 40 tab-stop e quindi n sarà uguale a 4, in questo caso n non dipende dal tab-stop dell'editor in uso e il secondo esercizio perde di significato. Questo se faccio dipendere l'ampiezza dal numero di caratteri di una riga.

    Se invece stabilisco solo il numero di tab-stop e non conosco la lunghezza di una riga, sarà la lunghezza della riga a dipendere sia dal numero di tab-stop che da n, che posso porre a piacere. Anche in questo in caso il secondo esercizio non avrebbe senso.

    Insomma, se devo poter dare un senso al secondo esercizio, devo stabilire che l'ampiezza dei tab-stop corrisponda necessariamente a quella data dall'editor, ma guardando solo al primo esercizio, non necessariamente giungo a questa conclusione e il testo dell'esercizio mi sembra ambiguo (come del resto il quesito che pone).
  • Re: Non capisco cosa chiede quest'esercizio

    Francamente non mi porrei nell'ottica di immaginare di avere una specifica "perfetta".
    fai un tab ogni 4 caratteri (ad esempio) e "vivi felice".
    non si tratta di un progetto, ma di un esercizio, prendilo quindi sotto questo profilo (cioè acquisire "padronanza")
Devi accedere o registrarti per scrivere nel forum
5 risposte