[C++] Contare quante volte un elemento è presente in un vettore

di il
7 risposte

[C++] Contare quante volte un elemento è presente in un vettore

Salve a tutti. Sono alle prime armi con C++ e mi sono incartato su questo esercizio:

"Progettare e realizzare un programma principale che legge una vettore V con n elementi di tipo reale. Inoltre legge un valore X di tipo reale.
V ed X sono i parametri di input di una subroutine (CONTA) che conta quante volte è presente X tra
gli elementi del vettore V. Il contatore è il parametro di uscita e viene stampato dal programma principale."

Ora, io ho provato a farlo in una certa maniera ma i valori che mi restituisce sono completamente sballati e altissimi . Non riesco a capire se sbaglio qualcosa nel sottoprogramma o se è sbagliato proprio l'idea e la struttura del programma. Se qualcuno potesse correggere il codice in modo da renderlo funzionante e spiegare gli errori che ho commesso gli sarei estremamente grato. Un saluto a tutti!
#include <iostream>
#include <stdlib.h>
using namespace std;

void CONTA (float V[300], float X, float C)

{
     int i,n;
     C=0;
     for(i=1;i<=n;i++)
     {
     if (V[i]==X)
     {
      C=C+1;
     }
     }
     }
     
int main ()

{
    int n, i, C;
    float V[300], X;
    cout<<"Scegliere il numero di elementi del vettore, MAX 300"<<endl;
    cin>>n;
    if(n<300&&n>0)
    {
     for(i=1;i<=n;i++)
     {
      cout<<"Dammi l'elemento "<<i<<endl;
      cin>>V[i];                                                    
     }
     cout<<"Dammi l'elemento da cercare nel vettore V"<<endl;
     cin>>X;
     
     CONTA (V, X, C);
     
     cout<<"L'elemento selezionato e' presente nel vettore "<<C<<" volta/e"<<endl;
     }
     else 
     {
          cout<<"Numero di elementi non previsto"<<endl;
     }
     system("Pause");
     return 0;
     }

7 Risposte

  • Re: [C++] Contare quante volte un elemento è presente in un vettore

    La funzione CONTA deve ritornare C e il main deve leggere il valore di ritorno
  • Re: [C++] Contare quante volte un elemento è presente in un vettore

    Sergio.S ha scritto:


    Salve a tutti. Sono alle prime prese con C++ e mi sono incartato su questo esercizio:

    "Progettare e realizzare un programma principale che legge una vettore V con n elementi di tipo reale. Inoltre legge un valore X di tipo reale.
    V ed X sono i parametri di input di una subroutine (CONTA) che conta quante volte è presente X tra
    gli elementi del vettore V. Il contatore è il parametro di uscita e viene stampato dal programma principale."

    Ora, io ho provato a farlo in una certa maniera ma i valori che mi restituisce sono completamente sballati e altissimi . Non riesco a capire se sbaglio qualcosa nel sottoprogramma o se è sbagliato proprio l'idea e la struttura del programma. Se qualcuno potesse correggere il codice in modo da renderlo funzionante e spiegare gli errori che ho commesso gli sarei estremamente grato. Un saluto a tutti!
    #include <iostream>
    #include <stdlib.h>
    using namespace std;
    
    void CONTA (float V[300], float X, float C)
    
    {
         int i,n;
         C=0;
         for(i=1;i<=n;i++)
         {
         if (V[i]==X)
         {
          C=C+1;
         }
         }
         }
         
    int main ()
    
    {
        int n, i, C;
        float V[300], X;
        cout<<"Scegliere il numero di elementi del vettore, MAX 300"<<endl;
        cin>>n;
        if(n<300&&n>0)
        {
         for(i=1;i<=n;i++)
         {
          cout<<"Dammi l'elemento "<<i<<endl;
          cin>>V[i];                                                    
         }
         cout<<"Dammi l'elemento da cercare nel vettore V"<<endl;
         cin>>X;
         
         CONTA (V, X, C);
         
         cout<<"L'elemento selezionato e' presente nel vettore "<<C<<" volta/e"<<endl;
         }
         else 
         {
              cout<<"Numero di elementi non previsto"<<endl;
         }
         system("Pause");
         return 0;
         }
    
    Come prima cosa c'è un if di troppo secondo me nel codice. L'istruzione seguente :
     if(n<300&&n>0)
    mi sembra inutile così come è impostata.
    Puoi anche modificarla in modo che se n è maggiore di 300 o n è negativo, stampi messaggio di errore ed esci. Altrimenti una volta finito il ciclo for, inserire il seguente ramo if-else (inizializzando C a zero prima di chiamare CONTA) in modo da scrivere:
    
    if(C!=0)
    	cout<<"L'elemento selezionato e' presente nel vettore "<<C<<" volta/e"<<endl;
    else 
    	cout<<"Elemento non trovato"<<endl;
     
    Puoi fare o come ti ha suggerito candaluar (in tal caso C invece che passarlo alla funzione devi leggerlo come parametro di output), oppure modificare la dichiarazione di CONTA e passare C come puntatore attraverso l'operatore * :
    void CONTA (float V[300], float X, float* C)
    In tal caso devi poi riferirti alla variabile C all'interno della funziona sempre con l'operatore *, altrimenti modifichi l'indirizzo e non il valore.

    In alternativa potresti usare la variabile reference che ti permette di rimanere l'implementazione del metodo così com'è modificando solo la dichiarazione nel seguente modo:
    void CONTA (float V[300], float X, float& C)
    In questo modo C diventa un alias vero e proprio del parametro dato in input e non un puntatore che si riferisce alla stessa area di memoria.

    Come terza opzione, seguendo il suggerimento di cadaluar, puoi restituire C e modificare la dichiarazione della funzione come di seguito:
    float CONTA (float V[300], float X)
    Ricordandoti di aggiungere l'istruzione
    return C; 
    una volta terminato il ciclo for nella funzione CONTA, e dichiarare C all'inizio del metodo.

    Scegli tu la strada da seguire.
  • Re: [C++] Contare quante volte un elemento è presente in un vettore

    Ciao, innanzitutto ringrazio entrambi per le risposte. Sto provando la terza strada, in quanto mi sembra più semplice per le mie conoscenze attuali. Tuttavia il risultato che al momento ottengo non è molto diverso dall'inizio...
    float CONTA (float V[300], float X)
    
    {
         int i, n, C;
         for(i=1;i<=n;i++)
         {
         if (V[i]==X)
         {
          C=C+1;
          C++;
         }
         return C;
         }
         }
         
    int main ()
    
    {
        int n, i, C;
        float V[300], X;
        cout<<"Scegliere il numero di elementi del vettore, MAX 300"<<endl;
        cin>>n;
        
         for(i=1;i<=n;i++)
         {
          cout<<"Dammi l'elemento "<<i<<endl;
          cin>>V[i];                                                    
         }
         cout<<"Dammi l'elemento da cercare nel vettore V"<<endl;
         cin>>X;
         CONTA (V, X);
         if(C!=0)
         {
         cout<<"L'elemento selezionato e' presente nel vettore "<<C<<" volta/e"<<endl;
         }
         else 
         {
              cout<<"Numero di elementi non previsto"<<endl;
         }
         system("Pause");
         return 0;
         }
    
    Grazie mille per l'aiuto
  • Re: [C++] Contare quante volte un elemento è presente in un vettore

    Non serve un float ma basta un int
    Devi azzerare C prima di usarlo
    Usa solo C++ e non C=C+1
    Nel main devi scrivere C=CONTA(V,X)
  • Re: [C++] Contare quante volte un elemento è presente in un vettore

    Ciao Oregon, innanzitutto ringrazio anche te per aver risposto! Ho provato a mettere in pratica i tuoi consigli: stavolta ottengo risposta "negativa" qualsiasi cosa io faccia (sia se l'elemento scelto si trova nel vettore oppure no). P.S.: ho cambiato la stringa che prima si chiamava "Numero di elementi non previsto".
    int CONTA (float V[300], float X)
    
    {
         int i, n, C;
         C=0;
         for(i=1;i<=n;i++)
         {
         if (V[i]==X)
         {
          C++;
         }
         }
         return C;
         }
         
    int main ()
    
    {
        int n, i, C;
        float V[300], X;
        cout<<"Scegliere il numero di elementi del vettore, MAX 300"<<endl;
        cin>>n;
         for(i=1;i<=n;i++)
         {
          cout<<"Dammi l'elemento "<<i<<endl;
          cin>>V[i];                                                    
         }
         cout<<"Dammi l'elemento da cercare nel vettore V"<<endl;
         cin>>X;
         
         C = CONTA(V,X);
         
         if (C!=0&&C>0)
         {
                  cout<<"L'elemento selezionato e' presente nel vettore "<<C<<" volta/e"<<endl;
         }
         else 
         {
              cout<<"Il valore selezionato non e' presente nel vettore"<<endl;
         }
         system("Pause");
         return 0;
         }
    
  • Re: [C++] Contare quante volte un elemento è presente in un vettore

    La variabile n la devi passare alla funzione dal main altrimenti come fa la funzione a sapere quanti sono gli elementi da controllare?
    Ovviamente la variabile n che hai dichiarato nella funzione non ha senso.

    E la if deve essere semplicemente

    if(C>0)

    perché se è maggiore di 0 è sicuramente diversa da 0
  • Re: [C++] Contare quante volte un elemento è presente in un vettore

    Giusto per chiarezza rileggendo bene il codice, l'if che avevi messo all'inizio puoi aggiustarlo in modo che controlla che n(la dimensione) sia un input valido, ma senza il ramo if-else come avevi fatto all'inizio, semplicemente aggiungendo appena dopo l'istruzione
    cin>>n;
        
    il controllo seguente:
    if(n>300 || n <0){
    	cout << "Errore : Dimensione del numero di elementi non consentita..." <<endl;
    	system("Pause")
    	return 0;
    }
    
    questo ti permette di rendere il codice più robusto ed è più leggibile rispetto all'if-else che avevi messo all'inizio

    Poi come ti suggeriva giustamente oregon non puoi ridefinire la variabile n all'interno della funzione stessa (altrimenti non funzionerà mai perché non rispetta il numero di elementi dati in input), ma la devi passare alla funzione CONTA.
    In realtà ci sarebbe anche un'altra soluzione che ti permette di non passare n a CONTA ma di dichiararla come variabile globale fuori dal main, in modo che si trova sia nello scope del metodo main, che in quello del metodo CONTA. Chiaramente in CONTA devi usare n in sola lettura (read-only), ovvero non la devi modificare altrimenti sovrascrivi la dimensione di input che ti ha dato l'utente.

    P.S: se ti è nuovo il termine scope, sappi che detto in parole semplici con scope si intende fin dove è "visibile" la dichiarazione di una variabile. Dichiarandola fuori il main, risulta visibile a quest'ultimo e a tutte le funzioni che definisci, in quanto avrai definito appunto una "variabile globale".
Devi accedere o registrarti per scrivere nel forum
7 risposte