Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [C++] ricerca del massimo e conteggio occorrenze

    Salve a tutti, parto con una piccola premessa: sto aiutando un ragazzo al terzo anno di uno strano liceo di cui non ricordo il nome (non sono aggiornato in merito alle riforme del sistema scolastico italiano) in cui imparano a programmare in C++. Ovviamente, essendo una scuola superiore, gli argomenti vengono trattati in maniera relativamente semplice.

    Ora, ho scritto un breve codice per risolvere questo problema: "inserire N valori numerici in un vettore. Determinare il valore più grande, comunicando anche il numero di volte che è stato inserito".

    Il codice è:
    codice:
    #include <iostream>
    using namespace std;
    
    main() {
        int n, max;
        int cont = 1; //il vettore avrà almeno un elemento, quindi il massimo sarà presente almeno una volta
        
        cout << "Quanti valori vuoi inserire nel vettore?\n";
        cin >> n;
        
        int vect[n];
       
        //inizializzazione vettore
        for(int i=0; i<n; i++) {
            cout << "Inserisci il " << i+1 << "^ elemento: ";
            cin >> vect[i];
        }
                
        max = vect[0]; // assumiamo come "massimo iniziale" il primo elemento del vettore
        
        for(int j=1; j<n; j++) {
            if(max == vect[j])
                cont++;
            else if(max < vect[j]){
                cont = 1;
                max = vect[j];
            }
        }
        
        cout << "Il massimo e' " << max << " ed e' presente " << cont << " volte" << endl;
        
        system("pause");
    }
    Credo che funzioni però non riesco a togliermi la sensazione che sia un po'... disordinato.
    Vista la premessa iniziale (cioè che quello che vedete scritto in questo codice è più o meno quello con cui questo ragazzo ha a che fare a scuola) credete che questo codice sia migliorabile in qualche maniera o conviene seguire un approccio diverso? E nel caso, quale?

    Grazie a tutti già da adesso!

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    codice:
    int vect[n];
    Questo è sbagliato in C++...
    Devi utilizzare l'allocazione dinamica o dichiarare un vettore di dimensioni sicuramente sufficienti all'inizio e usare solo le locazioni che ti servono...
    Oppure usare un vector<int> e lasciare gestire la memoria a lui essendo nel contempo sicuro di avere sempre locazioni di memoria sufficienti...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  3. #3
    Originariamente inviato da Scara95
    codice:
    int vect[n];
    Questo è sbagliato in C++...
    Devi utilizzare l'allocazione dinamica o dichiarare un vettore di dimensioni sicuramente sufficienti all'inizio e usare solo le locazioni che ti servono...
    Oppure usare un vector<int> e lasciare gestire la memoria a lui essendo nel contempo sicuro di avere sempre locazioni di memoria sufficienti...
    Perdonami se te lo chiedo, probabilmente la risposta è banale eppure non ci arrivo... sbagliato perché?
    Tralasciando il fatto che il programma viene compilato ed eseguito correttamente (e che funziona come dovrebbe), so che gli array devono essere dichiarati "staticamente" (per il momento allocazione dinamica di memoria e vector sono fuori portata), ossia bisogna dargli una dimensione precisa, e il programma fa esattamente quello, chiede qual è il valore di n all'utente per poi utilizzare quello che è a tutti gli effetti un valore noto per dichiarare un array che sarà sicuramente di dimensioni sufficienti.

    O sbaglio?

  4. #4
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    L'array è allocato sullo stack e la dimensione deve essere conosciuta a compile time.
    Se utilizzi g++ il programma funziona correttamente perché questo offre l'estensione per i VLA che sono permessi e standardizzati solo in C (C99 e successivi).
    Prova a cambiare compilatore e ti accorgerai che il programma non compila nemmeno!
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  5. #5
    Ok, ora ho capito.
    Non avevo pensato che l'array deve avere dimensioni stabilite proprio perché lo spazio va allocato durante la compilazione e che passare il valore di n in fase d'esecuzione è ovviamente un errore.

    Grazie a Scara95 per la puntualizzazione

  6. #6
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Non c'è di che
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

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 © 2026 vBulletin Solutions, Inc. All rights reserved.