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.