Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2015
    Messaggi
    32

    Dubbio su quando usare le funzioni e quando usare le procedure

    Salve a tutti! Sono nuovo nel mondo della programmazione e sto studiando a scuola il linguaggio di programmazione C + + .
    Abbiamo da poco finito di studiare tutte le strutture di controllo del C + + ( quelle sequenziali , selettive(if,else,switch), iterative ( while,do-while,for) ) e siamo passati ai sottoprogrammi.
    Abbiamo detto che esistono due modi per creare un sottoprogramma : attraverso le funzioni oppure le procedure , nel primo caso si ha un passaggio per valore , nel secondo per riferimento .
    Ma se io devo fare un programma come faccio a scegliere se usare una funzione o una procedura?

    Ad esempio pochi giorni fa facemmo un esercizio che con un ciclo while e le strutte if , else , eseguiva separatamente la somma dei pari e quella dei dispari dei numeri interi positivi inseriti e li stampava e si interrompeva appena si inseriva 0 o un numero negativo.

    codice:
    #include <iostream>
    using namespace std; 
    int main ( ) { 
    int x,sp=0,sd= 0 ;
    cout<<"Inserire i Numeri Interi Positivi di cui si vuole conoscere la somma dei numeri pari inseriti e di quelli dispari \nN.B.:Inserire 0 o un numero negativo per interrompere l'immissione numerica\n\n"<<"Inserire un numero\n";
    cin>>x;
    while (x>0){
        if (x%2==0){
        sp= sp+x;
        cout <<"Inserire il prossimo numero\n";
        cin>>x;}
        else{
        sd=sd+x;
        cout <<"Inserire il prossimo numero\n";
        
       cin>>x;
          }
        }
    cout<<"La somma dei numeri pari inseriti e':"<<sp<<endl;
    cout<<"La somma dei numeri dispari inseriti e':"<<sd<<endl;
    system("PAUSE");
    return 0; 
    }
    Se volessi rifare questo esercizio e volessi farlo attraverso i sottoprogrammi , dovrei usare procedure o funzioni? Perché? E come faccio in generale ad orientarmi?

    Grazie mille in anticipo e scusate la niubaggine

  2. #2
    Quote Originariamente inviata da Warioss Visualizza il messaggio
    nel primo caso si ha un passaggio per valore , nel secondo per riferimento .
    Uh!?!

    Chi l'ha detto questo? Passaggio per valore e per riferimento sono due metodi per passare parametri ad una funzione/procedura. Nel primo caso viene generata una copia dell'oggetto da passare, nel secondo un riferimento ( puntatore ) all'oggetto.

    Ma questo vale sia per le funzioni che per le procedure. La differenza tra le due, invece, è che le funzioni ritornano qualcosa al chiamante, le procedure assolutamente nulla. E infatti in C/C++ non esiste il concetto di procedura ( inteso come, che so, in Pascal ). Una procedura C/C++ è semplicemente una funzione void, cioè che non ritorna nulla.

    Questa è la loro differenza e dovrebbe risultare chiaro quando usare le une e quando le altre. Sul come invece spezzettare un programma in tante subroutine ( funzioni o procedure che siano ) dipende da te. Nessuno vieta di scrivere un programma senza nessuna routine, poi però diventa un pastrocchio di codice illeggibile e non manutenibile.

    Stesso discorso se hai pezzi di codice che vengono usati in molte parti del programma, allora vale la pena creare delle subroutine e mettere questi pezzi di codice molto usati lì dentro.

    Nell'esempio che hai fatto non c'è nessun bisogno di creare delle subroutine, ma volendo potresti creare una procedura che legge tutti i numeri e li mette in un'array globale. Un'altra procedura successivamente legge l'array ed effettua le somme. Magari questa potrebbe essere una funzione e ritornare la somma.

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2015
    Messaggi
    32
    Quote Originariamente inviata da paolino_delta_t Visualizza il messaggio
    dovrebbe risultare chiaro quando usare le une e quando le altre
    Non proprio ... forse se ho capito bene mi conviene usare le funzioni quando devo concentrarmi sull'input e le procedure quando devo concentrarmi sull'output?

    Quote Originariamente inviata da paolino_delta_t Visualizza il messaggio
    Nell'esempio che hai fatto non c'è nessun bisogno di creare delle subroutine, ma volendo potresti creare una procedura che legge tutti i numeri e li mette in un'array globale. Un'altra procedura successivamente legge l'array ed effettua le somme. Magari questa potrebbe essere una funzione e ritornare la somma.
    Ehm... purtroppo non ho fatto array nè matrici come ho detto nel messaggio iniziale


    "Sono nuovo nel mondo della programmazione e sto studiando a scuola il linguaggio di programmazione C + + .
    Abbiamo da poco finito di studiare tutte le strutture di controllo del C + + ( quelle sequenziali , selettive(if,else,switch), iterative ( while,do-while,for) ) e siamo passati ai sottoprogrammi. "

  4. #4
    Utente di HTML.it
    Registrato dal
    Nov 2015
    Messaggi
    32
    Io farei così l'esercizio che ho postato

    PROTOTIPO:
    http://imageupper.com/i/?S0200010020...69265131718897

    BODY
    http://imageupper.com/i/?S0200010020...69265131718897

    MAIN
    http://imageupper.com/i/?S0200010020...69265131718897

    Va bene secondo voi? E' la prima volta che mi accingo alla programmazione , vorrei delle conferme =P
    Immagini allegate Immagini allegate

  5. #5
    Quote Originariamente inviata da Warioss Visualizza il messaggio
    Non proprio ... forse se ho capito bene mi conviene usare le funzioni quando devo concentrarmi sull'input e le procedure quando devo concentrarmi sull'output?
    In che senso input ed output? Le funzioni le usi quando hai bisogno che ti venga restituito un valore. La funzione in programmazione è l'equivalente della funzione in matematica, cioè y = f(x), dove ti serve sapere quanto vale y per vari valori della x. Se non ti serve saperlo, allora è una procedura il costrutto che devi usare.

    Riguardo la soluzione dell'esercizio, quella è una possibile soluzione. La procedura è ovviamente inutile, perchè di fatto risolve un problema che non c'è, ma è corretto fare così.

    Avresti potuto usare una funzione nel caso ti fosse servita solo una delle somme, ad esempio così

    codice:
    int sommaPD(int&n) {
        int somma;
    
        while (n>0) {
            somma += n;
            cin >> n;
        }
    
        return somma; // qui la funzione restituisce la somma al chiamante, ti evita di passare somma per riferimento
    }
    Si può fare pure con le due somme, basta creare una struct che contiene due campi ( sp e sd ) e poi restituire la struct. Ma bisognerebbe allocare la struct in memoria, ecc... insomma diventa un pò più complesso.
    Ultima modifica di paolino_delta_t; 07-11-2015 a 22:32

  6. #6
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Quote Originariamente inviata da Warioss Visualizza il messaggio
    Abbiamo detto che esistono due modi per creare un sottoprogramma : attraverso le funzioni oppure le procedure , nel primo caso si ha un passaggio per valore , nel secondo per riferimento .
    Chi ha detto una cosa del genere? Se è stato il tuo professore beh, cambia professore...
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  7. #7
    Utente di HTML.it
    Registrato dal
    Nov 2015
    Messaggi
    32
    Quote Originariamente inviata da paolino_delta_t Visualizza il messaggio
    In che senso input ed output? Le funzioni le usi quando hai bisogno che ti venga restituito un valore. La funzione in programmazione è l'equivalente della funzione in matematica, cioè y = f(x), dove ti serve sapere quanto vale y per vari valori della x. Se non ti serve saperlo, allora è una procedura il costrutto che devi usare.

    Riguardo la soluzione dell'esercizio, quella è una possibile soluzione. La procedura è ovviamente inutile, perchè di fatto risolve un problema che non c'è, ma è corretto fare così.

    Avresti potuto usare una funzione nel caso ti fosse servita solo una delle somme, ad esempio così

    codice:
    int sommaPD(int&n) {
        int somma;
    
        while (n>0) {
            somma += n;
            cin >> n;
        }
    
        return somma; // qui la funzione restituisce la somma al chiamante, ti evita di passare somma per riferimento
    }
    Si può fare pure con le due somme, basta creare una struct che contiene due campi ( sp e sd ) e poi restituire la struct. Ma bisognerebbe allocare la struct in memoria, ecc... insomma diventa un pò più complesso.
    Perfetto, grazie mille
    Ho apprezzato sia la spiegazione teorica che il fatto che tu mi abbia controllato l'esercizio ^_^
    Solo una cosa di ciò che hai scritto non ho capito : l'ultima parte quando hai parlato di " struct" , non so cosa sia

    Quote Originariamente inviata da Alex'87 Visualizza il messaggio
    Chi ha detto una cosa del genere? Se è stato il tuo professore beh, cambia professore...
    No , ne dubito . Ho inteso io male =P

  8. #8
    Quote Originariamente inviata da Warioss Visualizza il messaggio
    l'ultima parte quando hai parlato di " struct" , non so cosa sia
    Non è importante. Le studierete a breve. Si tratta di un costrutto del C/C++ ( ma alcuni docenti dicono che usarle in C++ è segno di cattiva programmazione ) che consente di racchiudere più proprietà di un oggetto all'interno di uno stesso costrutto.

    Esempio:

    codice:
    struct Persona {
        char nome[30];
        char cognome[30];
        int eta;
        bool sesso;
        ecc....
    }
    In questo modo si possono raggruppare più attributi di una stessa classe di oggetti, in modo da rendere più leggibile il codice. In C++ ed altri linguaggi OOP si dovrebbero usare le classi in luogo delle struct, ma non è sempre un'idea intelligente dal punto di vista delle prestazioni.

  9. #9
    Utente di HTML.it
    Registrato dal
    Nov 2015
    Messaggi
    32
    Quote Originariamente inviata da paolino_delta_t Visualizza il messaggio
    Non è importante. Le studierete a breve. Si tratta di un costrutto del C/C++ ( ma alcuni docenti dicono che usarle in C++ è segno di cattiva programmazione ) che consente di racchiudere più proprietà di un oggetto all'interno di uno stesso costrutto.

    Esempio:

    codice:
    struct Persona {
        char nome[30];
        char cognome[30];
        int eta;
        bool sesso;
        ecc....
    }
    In questo modo si possono raggruppare più attributi di una stessa classe di oggetti, in modo da rendere più leggibile il codice. In C++ ed altri linguaggi OOP si dovrebbero usare le classi in luogo delle struct, ma non è sempre un'idea intelligente dal punto di vista delle prestazioni.
    Precisissimo grazie ancora! Alla prossima

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.