Esercizio funzioni C++

di il
3 risposte

Esercizio funzioni C++

Buonasera a tutti.
Innanzitutto essendo il mio primo messaggio sul forum mi presento mooolto brevemente: mi chiamo Simone, ho 21 anni, studio economia e per motivi di studio sto imparando ad utilizzare C++ (da qualche giorno) e SQL (prossimamente).

Premettendo che le mie conoscenze in questo campo sono davvero molto ridotte, vorrei sapere se c'è qualcuno che è in grado di spiegarmi cosa c'è di sbagliato in questo programma che ho provato a compilare:

/*
Definire una funzione di nome conta con due parametri: v di tipo vettore di 100 interi e a di tipo intero. La funzione deve restituire il numero di elementi di v che sono maggiori di a.
Nella funzione main:
- Definire un vettore t contenente 100 numeri interi
- Inizializzare t con valori letti da standard input
- Visualizzare su standard output il risultato della funzione conta applicata a t e il numero 3.
*/

#include<iostream>
using namespace std;

int conta(int& v[100], int& a)
{
	int c, i;
	c = 0;
	i = 0;
	
	while(i < 100)
	{
		if(v[i] > a)
		{
			++c;
		}

		++i;
	}
	
	return c;
}

int main()
{
	int t[100], z, b, tot;

	while(z < 100)
	{
		cout << "Inserire un numero intero: " << endl;
		cin >> b;
		t[z] = b;
		++z;
	}

	tot = conta(t[100], 3);
	cout << "Nel vettore sono presenti " << tot << " numeri maggiori di 3" << endl;

	return 0;
}
Mi dà un paio di errori quando lo compilo ma sinceramente mi risulta incomprensibile ciò che vogliono indicare. Qualcuno riesce ad uscirne fuori?

3 Risposte

  • Re: Esercizio funzioni C++

    #include<iostream>
        using namespace std;
    
        int conta(int& v[100], int& a)
        {
           int c, i;
           c = 0;
           i = 0;
           
           while(i < 100)
           {
              if(v[i] > a)
              {
                 ++c;
              }
    
              ++i;
           }
           
           return c;
        }
    
        int main()
        {
           int t[100], z=0, b, tot;
    
    //Devi inizializzare z così sei sicuro che l'enumerazione parte da 0.
    
           while(z < 100)
           {
              cout << "Inserire un numero intero: " << endl;
              cin >> b;
              t[z] = b;
              ++z;
           }
    
    //chiamata alla funzione sbagliata
           tot = conta(t[100], 3);
    //correzione
    tot = conta(t, 3);
    
    
           cout << "Nel vettore sono presenti " << tot << " numeri maggiori di 3" << endl;
    
           return 0;
        }
  • Re: Esercizio funzioni C++

    Grazie skynet!! Bhe dai almeno il fatto che sono più che altro errori di sintassi, che devo ancora imparare a conoscere meglio, e di distrazione (l'inizializzazione di z) un po' mi consola.. In effetti con queste correzioni e togliendo le & in (int& v[100], int&a) il programma gira..

    Comunque ho un altro problema con un altro esercizio, questa volta però ci deve essere qualcosa dietro che sicuramente mi sfugge, ma non si tratta di sintassi. Provo a spiegare...

    Il problema che devo risolvere è il seguente:

    /*
    Istruzione: Data una matrice di nome M contenente 2 righe e 5 colonne, scrivere un procedimento che legge
    da standard input una sequenza di numeri interi e che inserisce nella prima riga di M i numeri pari della
    sequenza e nella seconda riga di M in numeri dispari della sequenza.
    */

    Io avevo pensato di risolverlo in questo modo:
    #include<iostream>
    using namespace std;
    
    int main()
    {
    	int M[2][5];
    	int c0, c1, a;
    
    	c0 = 0;
    	c1 = 0;
    	
    	while((c0 < 5) || (c1 < 5))
    	{
    		cout << "Inserisci un numero intero: ";
    		cin >> a;
    
    		if(a % 2 == 0)
    		{
    			{
    				M[0][c0] = a;
    				++c0;
    			}
    		}
    		else
    		{
    			M[1][c1] = a;
    			++c1;
    		}
    	}
    
    	return 0;
    }
    L'unico problema è che se ad esempio inserisco 20 numeri pari e poi 5 dispari, alla fine dell'esecuzione mi compare la schermata di errore: Run-Time Check Failure #2 - Stack around the variable 'M' was corrupted.

    Ho provato, per tentativi successivi, a risolverlo in diversi modi, e alla fine sono riuscito a trovare un algoritmo che non mi dà quell'errore, però di fatto non ho ancora capito cos'è che non funziona nel primo 'metodo'. Questo è l'algoritmo con cui funziona:
    #include<iostream>
    using namespace std;
    
    int main()
    {
    	int M[2][5];
    	int c0, c1, a;
    
    	c0 = 0;
    	c1 = 0;
    	
    	while((c0 < 5) || (c1 < 5))
    	{
    		cout << "Inserisci un numero intero: ";
    		cin >> a;
    
    		if(a % 2 == 0)
    		{
    			if(c0 < 5)
    			{
    				M[0][c0] = a;
    				++c0;
    			}
    		}
    		else
    		{
    			if(a % 2 != 0)
    			{
    				if(c1 < 5)
    				{
    					M[1][c1] = a;
    					++c1;
    				}
    			}
    		}
    	}
    	
    	return 0;
    }
    Però continuo a non capire dove sia l'errore nel primo procedimento...
  • Re: Esercizio funzioni C++

    Beh, direi che il primo codice lo hai corretto col secondo, mettendo il controllo sui valori di c0 e c1 per non 'sforare' negli indici. Ed è proprio quello 'sforare' degli indici il motivo per cui avevi quell'errore
Devi accedere o registrarti per scrivere nel forum
3 risposte