Vettori per principianti

di il
7 risposte

Vettori per principianti

Buongiorno ragazzi, sono un attempato roockie alle prese con il K&R e affrontando il capitolo relativo ai vettori, non capisco da dove salti fuori l'output suggerito dagli autori con l'esempio che propongono, inoltre qui dicono che i possibili tipi di input sono 12, tra cui le dieci cifre.
Ad intuito direi che gli altri due tipi dovrebbero essere "nwhite" e "nother", ma chiedo una vostra conferma, in quanto il libro risulta un po' criptico.

#include <stdio.h>

int main()
{
    int c, i, nwhite, nother;
    int ndigit[10];
    
    nwhite = nother = 0;
    for (i = 0, i < 10; ++i)
        ndigit[i] = 0;
        
    while ((c = getchar()) != EOF)
        if (c>= '0' && c<= '9')
            ++ndigit[c - '0'];
        else if (c == ' ' || c == '\n' || c == '\t')
            ++nwhite;
        else
            ++nother;
            
    printf("cifre =");
    for (i = 0; i < 10; ++i)
        printf(" %d", ndigit[i]);
    printf(", spaziature = %d, altri = %d\n", nwhite, nother);
}
Infatti alla fine del listato trovo scritto che l'output del programma, eseguito con il suo stesso input è:

Cifre = 9300000001, spaziature = 123, altri = 345

Non mi è chiaro come interpretare questi numeri, al momento mi sembra chiaro che il listato non sia composto da 9 miliardi e rotti di caratteri , per il resto, da buon principiante, brancolo nel buio.
Grazie a tutti!

7 Risposte

  • Re: Vettori per principianti

    Ci sono diversi errori nel tuo codice!

    Modificalo cosi':

    1) nel ciclo 'for' hai scritto 'i = 0,' VIRGOLA, ERRORE CI VA UN PUNTO E VIRGOLA 'i = 0; '
    2) il ciclo 'while' modificalo nel seguente modo:
    
    while ((c = getchar()) != EOF && (c != '\n'))
    
    cioe' esci dal ciclo anche quando premi il tasto [INVIO]

    Che compilatore stai usando? Perche' un compilatore DECENTE ti avrebbe fatto notare l'errore.

    ASSIOMA: quando scrivi dei programmini, in particolare cosi' semplici, la compilazione NON DEVE GENERARE NESSUN TIPO DI WARNING (gli errori non sono un problema, perche' il compilatore non compila prorpio )

    Se ci sono dei WARNING, li puoi ignorare SOLO SE SEI CERTO AL 10.000% che non sono un problema, NON se 'il programma funziona lo stesso'

    Il motivo e' complicato da spiegare, ma uno dei problemi principali dei principianti e' scrivere programmi che FUNZIONANO PER SBAGLIO.
    E coreggere un programma che funziona per sbaglio E' UN BAGNO DI SANGUE (E LACRIME) ANCHE per gente con N-milioni di anni di esperienza.
  • Re: Vettori per principianti

    Grazie e chiedo scusa per un veniale errore di trascrizione.
    Solitamente uso Xcode su un Mac mini, al momento sto utilizzando un compilatore free (Code::blocks mi pare) su un computer Windows per ragioni logistiche.
    Quello che ancora non mi è chiaro è quale sia il significato dell'output dichiarato dagli autori: "cifre = 9300000001, spaziature = 123, altri = 345, che si ottiene inserendo in input il suo stesso testo.
    Inoltre gli stessi fanno riferimento al fatto che i possibili output sono dodici: come ho detto, ad intuito direi che ciò deriva dal fatto che le cifre sono 10 + nwhite + nother, ma non ne sono sicuro.
    Voi avete un chiarimento da darmi?
    Grazie mille
  • Re: Vettori per principianti

    Quel 'cifre' dovrebbe essere scritto come:
    
    cifre = 9 3 0 0 0 0 0 0 0 1, spaziature = 123, altri = 345
    
    (gli spazi CONTANO) e che cosa vuol dire lo capisci da qui:
    
    printf("cifre =");
        for (i = 0; i < 10; ++i)
            printf(" %d", ndigit[i]);
        printf(", spaziature = %d, altri = %d\n", nwhite, nother);
    
    Basta capire a che cosa servono

    - 'ndigit' (numero cifra i-ma),
    - 'nwhite' (numero bianco),
    - 'nother' (numero altro)
  • Re: Vettori per principianti

    Ok, grazie, avevo vagamente intuito che il risultato cifre saltasse fuori da quella struttura.
    Il mio problema rimane, in quanto nel K&R non viene chiarito come il programma conta i caratteri immessi e quella fila di numeri per me non ha ancora un gran significato.
    Le cifre sono dieci, come sono dieci gli indici possibili per un vettore, ma non trovo corrispondenze dirette tra queste cifre e il testo stesso del programma.
    Faccio ancora fatica a capire questo risultato e se riusciste a spiegarmelo in un modo terra terra, ve ne sarei estremamente grato.
    Confido ancora che qualcuno sia in grado di confermare o smentire con una chiara spiegazione il fatto che i tipi di input possibili sono 12.
    Grazie per la pazienza, non saprei chi altro torturare al posto vostro.
  • Re: Vettori per principianti

    PS: il programma in esame conta le occorrenze delle diverse cifre (ndigit[]), dei caratteri di spaziatura (spazio, tabulazione, new line = nwhite), tutti gli altri caratteri (nother).
  • Re: Vettori per principianti

    Il TRUCCO sta' qui':
    
    c - '0'
    
    Nella codifica ASCII (che DEVI CONOSCERE, e se non lo sai, STUDIALA) lo 'ZERO' ha valore numerico '48', l'UNO ha valore numerico '49', ecc.

    http://www.asciitable.com

    Ora, POICHE' un carattere puo' anche essere visto come un intero il valore numerico e' quello definito dalla codifica ASCII

    SE 'c' (la TUA variable) contiene il carattere '5', il cui codice ASCII e' 53 e '0' (ZERO) ha codice ASCII 48, QUANTO FA

    53 - 48

    ?

    Ma guarda il caso
  • Re: Vettori per principianti

    Super! Questa è l'anello mancante del ragionamento!
    Ti ringrazio, avevo tralasciato la codifica ASCII e mi hai aperto il mondo che mi mancava!
    Grazie mille, studierò di più, promesso, ma siate clementi, io smanetto solo per imparare nuovi modi di ragionare e perché la semplice enigmistica mi annoia a morte!
    Amo affrontare nuove sfide, nonostante tutti i miei limiti e voi, in questo forum, siete un aiuto indispensabile per alzare sempre di più l'asticella delle mie capacità.
    Grazie ancora e non mancherò di disturbarvi ancora!
Devi accedere o registrarti per scrivere nel forum
7 risposte