Linguaggio c e programma

di il
30 risposte

30 Risposte - Pagina 2

  • Re: Linguaggio c e programma

    IfNotFalseTrue, azzero la matrice con memset() perché si suppone che inizialmente le variabili destinate a contenere le medie debbano essere "vuote". Tanto per tanto, tanto vale inizializzare l'intera matrice azzerandola dalla a alla zeta. Dopo, "popolo" le variabili destinate a contenere i valori immessi dall'utente. In un'altra funzione si potranno poi calcolare le medie, avendo a disposizione uno spazio che non contiene valori casuali ma zeri (anche se in questo caso è irrilevante e l'azzeramento si sarebbe potuto fare nella funzione di calcolo delle medie, ho letto da più parti che sarebbe una buona pratica inizializzare sempre le variabili prima del loro utilizzo).

    Ora qualcuno potrebbe obbiettare che gli spazi occupati dalle variabili globali vengono comunque azzerati "in automatico" al lancio del programma... e va be'! Era un esempio, mica un programma completo!
  • Re: Linguaggio c e programma

    AldoBaldo ha scritto:


    Un pezzetto di codice
    Un pezzetto di codice? Ci prendi in giro?

    Comunque, solo per precisare, il regolamento recita

    In un forum prima di tutto si aiuta l'utente, indirizzandolo sulla soluzione migliore. Gli spezzoni di codice che vengono dati non sono da intendere come soluzione definitiva, ma un esempio su come procedere.


    mi sembra chiaro che sia rivolto a chi risponde e che

    1) si indirizza
    2) eventualmente si danno spezzoni di codice (non funzioni intere, fra l'altro neanche provate)
    3) che sono "esempi" non da copiare o incollare

    E, non per fare polemica, in ogni caso ritengo che questa "sensibilità" debba essere più alta in un docente (ho insegnato anch'io per tanto tempo e ho avuto sempre ottimi risultati con gli studenti in questo senso) come sei tu.

    Detto questo, dato che voleva suggerimenti semplici, era meglio mostrare come azzerare la matrice con due for, piuttosto che fargli studiare funzioni mai viste (come intendeva migliorabile).

    Infine, il tuo "studente" aveva già posto la stessa identica domanda su

    https://www.inforge.net/forum/threads/programma-linguaggio-c.519964/#post-4867359

    e, come nella pesca a strascico, stava attendendo che i suoi pesci cadessero nella rete.
  • Re: Linguaggio c e programma

    Per brevità, rispondo per punti, sperando che tu non voglia dilungarti oltre, perché non aggiungiamo niente di significativo al thread.

    1. Tolti gli spazi e gli "accessori" non significativi, sono otto righe di codice in tutto.
    2. La pappa pronta non si spiega, io ho spiegato quel che significa il codice (ad eccezione, lo ammetto, di memset() sulla quale è comunque facile reperire informazioni, limitate a poche righe e utili da conoscere).
    3. A me quel che dici che ti sembra chiaro non sembra chiaro.
    4. La funzione l'ho provata e nel contesto del programma che risolve l'esercizio (e che ho tenuto per me proprio per evitare di stuzzicarti per niente) funziona a dovere anche con la svista (che ho corretto) in memset().
    5. Chi ha posto l'interrogativo ha dichiarato di essere un autodidatta.
    6. Non conoscevo inforge.net; ora vado a dargli un'occhiata, chissà ch'io lo possa trovare interessante.
  • Re: Linguaggio c e programma

    S

    AldoBaldo ha scritto:


    IfNotFalseTrue, azzero la matrice con memset() perché si suppone che inizialmente le variabili destinate a contenere le medie debbano essere "vuote". Tanto per tanto, tanto vale inizializzare l'intera matrice azzerandola dalla a alla zeta. Dopo, "popolo" le variabili destinate a contenere i valori immessi dall'utente. In un'altra funzione si potranno poi calcolare le medie, avendo a disposizione uno spazio che non contiene valori casuali ma zeri (anche se in questo caso è irrilevante e l'azzeramento si sarebbe potuto fare nella funzione di calcolo delle medie, ho letto da più parti che sarebbe una buona pratica inizializzare sempre le variabili prima del loro utilizzo).

    Ora qualcuno potrebbe obbiettare che gli spazi occupati dalle variabili globali vengono comunque azzerati "in automatico" al lancio del programma... e va be'! Era un esempio, mica un programma completo!
    Avevo capito il senso, ma sono convinto che memset(matrice, 0, sizeof(matrice)) sia più leggibile e meno contorto di memset(&matrice[0][0], 0, sizeof(matrice)), ma il punto non è questo.
    Hai ragione a dire che le variabili globali e statiche sono inizializzate a zero secondo lo standard sin dal C89 ( ) ma volendo essere espliciti perché non scrivere direttamente così?
    Non c'è nessuna ragione per usare memset in questo caso...
    
    float matrice[Q_STUDENTI+1][Q_PROVE+1] = {0};
    
  • Re: Linguaggio c e programma

    Aldo ... rispondo solo ad un punto perché per il resto vefo che non c'è speranza...

    Il fatto che il prigramma funzionasse era solo perché le variabili globali sono già azzerate. MA se solo avessi provato a chiamare la funzione due volte aveesti ritrovato i dati precedenti tranne che nel primo elemento, unico azzerato. Ne convieni?
  • Re: Linguaggio c e programma

    Oregon, certo che ne convengo (l'ho già scritto in precedenza) è stato un errore di copia-e-incolla.
    Nel programma che non ho inviato, inizializzo in modo ridondante le variabili anche in altri punti, appena prima dell'utilizzo (non è visibile nello spezzone), mentre nello spezzone vengono sovrascritte comunque quelle che vengono impostate nell'ambito della funzione imposta_voti_manuale(). Per questo l'errore di copia-e-incolla non genera errori nel programma di test completo, indipendentemente dalla quantità di volte per le quali viene eseguito.
    Ho aggiunto la funzione memset() nell'esempio proprio perché le inizializzazioni che avvengono altrove non erano visibili. Per risparmiare battiture ho copia-e-incollato "matrice" catturando anche "[0][0]", che invece sarebbe dovuto restare fuori dalla selezione.
  • Re: Linguaggio c e programma

    IfNotFalseTrue, hai ragione su tutti i fronti tranne uno, perché in quel caso ho ragionato secondo uno schema diverso, ovvero ipotizzando che in situazioni diverse da quelle dell'esercizio potesse rendersi necessario inserire i dati più volte, inizializzando la matrice ad ogni "passaggio". Eccesso di zelo? Ma sì, dai!
  • Re: Linguaggio c e programma

    Io ringrazio aldo
    perchè comunque mi ha mostrato con esempi come procedere
    Anche scrivendo il codice mi ha aiutato moltissimo in quanto mi ha mostrato come scrivere correttamente il codice
    anche se va contro il regolamento lo ringrazio comunque
  • Re: Linguaggio c e programma

    Antoniotrotta ha scritto:


    anche se va contro il regolamento lo ringrazio comunque
    Questo mi sembra ovvio e altrettanto ovviamente i "cattivi" sono sempre quelli che i "regolamenti" li rispettano ... è così in Italia ...
  • Re: Linguaggio c e programma

    Oregon, il regolamento l'ho rispettato, nella forma in cui l'ho riportato anche qui. Se lo vuoi diverso, proponine la riscrittura secondo i tuoi punti di vista, magari chi amministra il forum prenderà in considerazione il tuo desiderio di modifica.

    Tempo fa scrivesti che non ho titolo per dire agli altri come comportarsi... (o qualcosa del genere, vado a memoria)
  • Re: Linguaggio c e programma

    Ti ho già risposto sulla tua interpretazione del regolamento, inutile ripetertelo vedo.
  • Re: Linguaggio c e programma

    Ma no, dai, ripetila, la tua interpretazione del regolamento, che la rileggo volentieri.
  • Re: Linguaggio c e programma

    @AldoBaldo
    1) non essere polemico e rispetta i 'vecchietti' (io sono un vecchietto)
    2) i regolamenti sono fatti per essere rispettati. NESSUNO ti punta una pistola alla tempia, e nessuno ti vieta di postare l'intero codice SE NECCESSARIO, ma farlo sistematicamente non ha senso. Sopprattutto se e' evidente che la controparte fa delle domande solo perche' non ha studiato.
    Non ci crede nessuno che se viene proposto un esercizio con i puntatori, l'insegnante non li abbia spiegati, e non ci sia un libro su cui studiare. O qualunque altro argomento.
    Al massimo, ma in casi decisamente rari, la spiegazione potrebbe essere stata mal strutturata. Ma stiamo sempre parlando di argomenti moooolto semplici. Oltre al fatto che Internet e' li', basta cercare un po'.

    Per quanto riguarda il trick, e' il memset.

    Insegnare NON E' facile. Ti devi immedesimare nell'interlocutore e fornire una risposta che l'interlocutore riesca a comprendere. Scrivi codice SEMPLICE, anche se ci sono sistemi piu' efficienti.

    Inoltre segui TUTTE le regole di buona programmazione: dall'identazione, ai commenti, all'inizializzazione delle variabili, ecc.. Ma se trovi altre buone regole da seguire, fallo pure e consiglia!

    Tra l'altro, i compilatori moderni sono in grado di rendere il codice molto piu' efficiente di quanto si possa fare a mano. Inoltre, i problemi di efficienza sono decisamente insignificanti in un esercizio.
    Molto meglio la chiarezza e la semplicita'.
  • Re: Linguaggio c e programma

    Migliorabile, se scorri la sequenza degli interventi ti accorgi che la polemica non è nata da me.

    Quanto all'intero codice, eccolo:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <time.h>
    
    #define DEBUGGA
    
    #define Q_PROVE      8
    #define Q_STUDENTI  18
    
    float matrice[Q_STUDENTI+1][Q_PROVE+1];
    
    #ifdef DEBUGGA
    
    void imposta_voti_automatico( void ) {
        int s, p; // s: studente; p: prova
    
        memset( &matrice[0][0], 0, sizeof(matrice[0][0]) );
    
        srand( time(NULL) );
    
        for (s=0; s<Q_STUDENTI; s++)
            for (p=0; p<Q_PROVE; p++)
                matrice[s][p] = 0.1f*(1+(rand()%100));
    }
    
    #else // NOT DEBUGGA
    
    void imposta_voti_manuale( void ) {
        int s, p; // s: studente; p: prova
    
        for (s=0; s<Q_STUDENTI; s++) {
            printf("\nstudente n. %02d\n", s+1);
    
            for (p=0; p<Q_PROVE; p++) {
                printf("prova n. %02d: ", p+1 );
                scanf("%f",&matrice[s][p]);
            }
        }
    }
    
    #endif // fine DEBUGGA / NOT DEBUGGA
    
    void calcola_medie_studenti( void ) {
        int s, p; // s: studente; p: prova
    
        for (s=0; s<Q_STUDENTI; s++) {
            matrice[s][Q_PROVE] = 0.0f;
    
            for (p=0; p<Q_PROVE; p++)
                matrice[s][Q_PROVE] += matrice[s][p];
    
            matrice[s][Q_PROVE] /= Q_PROVE;
        }
    }
    
    void calcola_medie_prove( void ) {
        int s, p; // s: studente; p: prova
    
        for (p=0; p<Q_PROVE; p++) {
            matrice[s][Q_STUDENTI] = 0.0f;
    
            for (s=0; s<Q_STUDENTI; s++)
                matrice[Q_STUDENTI][p] += matrice[s][p];
    
            matrice[Q_STUDENTI][p] /= Q_STUDENTI;
        }
    }
    
    void calcola_media_globale( void ) {
        int s, p; // s: studente; p: prova
    
        matrice[Q_STUDENTI][Q_PROVE] = 0.0f;
    
        for (s=0; s<Q_STUDENTI; s++)
            for (p=0; p<Q_PROVE; p++)
                matrice[Q_STUDENTI][Q_PROVE] += matrice[s][p];
    
        matrice[Q_STUDENTI][Q_PROVE] /= Q_STUDENTI*Q_PROVE;
    }
    
    void calcola_medie( void ) {
        calcola_medie_studenti();
        calcola_medie_prove();
        calcola_media_globale();
    }
    
    void mostra_matrice( void ) {
        int s, p; // s: studente; p: prova
    
        for (s=0; s<=Q_STUDENTI; s++)
            for (p=0; p<=Q_PROVE; p++)
                printf( "%5.1f%c", matrice[s][p], p!=Q_PROVE?' ':'\n' );
    }
    
    int main(){
        #ifdef DEBUGGA
        imposta_voti_automatico();
        #else
        imposta_voti_manuale();
        #endif
    
        calcola_medie();
        mostra_matrice();
    
        printf( "\nMedia globale: %5.1f\n\n", matrice[Q_STUDENTI][Q_PROVE] );
    
        return 0;
    }
    Questo non per mettere in mostra chissà quale abilità (che non ho), ma per permettere di rilevare che quando dico che ho mandato giusto un esempio, è perché ho mandato giusto un esempio. Avessi voluto mandare l'intero codice, avrei mandato le cento e passa righe, non otto.

    Ora, da vecchietto a vecchietto, avrei piacere che la si smettesse di tentare di farmi passare per uno che commette chissà quali scorrettezze (di fantasia) -- sono invece un hobbista che SI DIVERTE a scrivere le quattro cose che sa scrivere e, a volte, a condividerle nei forum. State tentando di farmi passare la voglia? Basta dirlo e "vado" altrove.
  • Re: Linguaggio c e programma

    Non è questione di "voglia", ma di dare indicazioni in modo che chi studia ci arrivi da solo senza codice pronto. Perché se uno non sa scrivere una funzione, dargli 8 righe in cui c'è la funzione bella e pronta significa dare la pappa pronta.

    Ovviamente, sei libero di pensare e fare quello che vuoi, ma sul fatto che hai dato della pappa pronta, non ci piove.

    E per me la questione con te è chiusa.
Devi accedere o registrarti per scrivere nel forum
30 risposte