View Full Version : [c++] problema funzione
gabriel_cz
20-04-2010, 14:57
Ciao a tutti sono nuovo del forum e anche alla programmazione.non capisco perche' la funzione che ho scritto mi restituisce dei valori che non sono quelli che vorrei cioe' la tabellina di un numero che gli passo.Grazie e scusate la mia ignoranza.
#include <cstdlib>
#include <iostream>
//funzione che riceve un numero e ne restituisce la tabellina
using namespace std;
int tabelline(int num)
{
int v[10];//vettore per contenere la tabellina
int ris=0;
int i=1;
int numero;
for(i=1;i<=10;i++)
{
ris=numero*i;//ris=il numero per il contatore e passo il risultato al vettore
v[ris];
}
return v[ris];//restituisce il vettore con la tabellina del numero
}
int main(int argc, char *argv[])
{
int numero;
cout<<"scrivi un numero "<<endl;
cin>>numero;
cout<<"la tabellina di "<<numero<<" e' "<<endl<<tabelline(numero);//chiamo la funzione e gli passo numero
system("PAUSE");
return EXIT_SUCCESS;
}
agente mm8
20-04-2010, 15:08
Semplicemente perché invece di moltiplicare num per i, moltiplichi numero per i.
numero tra l'altro è una variabile (inutile) che non hai inizializzato. :)
lupoxxx87
20-04-2010, 15:10
ehm....ci sono un paio di errori ovunque nella struttura della funzione
int tabelline(int num) { //qui la funzione restituisce solo un intero...non una tabellina..e non usi la variabile "num"
int v[10];
int ris=0;
int i=1;
int numero;
for(i=1;i<=10;i++) { //gli indici devono andare da 0 a 9
ris=numero*i;
v[ris]; //questa operazione non fa nulla
}
return v[ris]; //restituisce un elemento che è al di fuori del vettore
}
una versione corretta potrebbe essere
int[] tabelline(int num) {
int v[10];
for(int i=0;i<10;i++)
v[i]=num*(i+1);
return v;
}
gabriel_cz
30-04-2010, 18:37
#include <cstdlib>
#include <iostream>
using namespace std;
//funzione che dato un numero ne stampa la tabellina
int tabellina(int num)
{
int v[10];//vettore per contenere la tabellina
int risultato=0,i=0;
for(i=1;i<=10;i++)
{
risultato=num*i;
v[risultato];
}
return v[risultato];
}
int main(int argc, char *argv[])
{
int risposta;
cout<<"inserisci numero"<<endl;
cin>>risposta;
cout<<"la tabellina del "<<risposta<<" e' "<<tabellina(risposta)<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
questo e' cio' che ho scritto dopo alcune modifiche grazie ai vostri suggerimenti
purtroppo continua a restituire valori strani.Io penso che il problema sia che la funzione deve restituire un vettore.Forse vanno usati i puntatori.Spero che qualcuno me lo spieghi.grazie
agente mm8
30-04-2010, 20:18
Usa il tag code per favore...
#include <cstdlib>
#include <iostream>
using namespace std;
//funzione che dato un numero ne stampa la tabellina
int tabellina(int num)
{
int v[10];//vettore per contenere la tabellina
int risultato=0,i=0;
for(i=1;i<=10;i++)
{
risultato=num*i;
v[risultato];
}
return v[risultato];
}
int main(int argc, char *argv[])
{
int risposta;
cout<<"inserisci numero"<<endl;
cin>>risposta;
cout<<"la tabellina del "<<risposta<<" e' "<<tabellina(risposta)<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
questo e' cio' che ho scritto dopo alcune modifiche grazie ai vostri suggerimenti
purtroppo continua a restituire valori strani.Io penso che il problema sia che la funzione deve restituire un vettore.Forse vanno usati i puntatori.Spero che qualcuno me lo spieghi.grazieForse non hai ben chiaro come funziona la cosa...
Se vuoi che restituisca una tabellina, la funzione dovrà restituire un array di interi, e non un intero. Ma tu, l'array, non lo costruisci, anzi rischi che ti dia parecchi problemi.
Vediamo nel dettaglio.
int risultato=0,i=0;
Qui, l'inizializzatione di i è inutile, perché subito dopo (nel for) lo poni ad 1. Fai così: lo inizializzi subito ad 1, ed elimini l'assegnazione nel primo pezzo del for, così: for(;i<=10;i++)
v[risultato];
Questa riga non fa assolutamente nulla: non assegni, insomma, il risultato alla corrispondente posizione nell'array. Quello che fai è richiamare il valore dell'array v nella posizione risultato (che quindi può valere anche 90, ben oltre i limiti dell'array)... e basta, perché non ci fai nulla: non lo assegni a niente.
Allora, ricapitoliamo: tu vuoi che l'array contenga la tabellina. Cioè, nel primo posto ci vuoi num*1, nel secondo num*2 e così via. Allora, quello che devi fare è questo:
v[i-1]=risultato;
La variabile i contiene i valori da 1 a 10 e c'è utile per indicare la posizione all'interno dell'array. Il -1 serve perché la prima posizione dell'array è indicata con 0 e non con 1. Quindi fai l'assegnazione dovuta.
return v[risultato];
Per l'appunto, questo è l'errore di prima. Se immetto 5 come num, allora verrà restituito v[50], che è un valore numerico ben oltre il range dell'array.
Inoltre, così tu restituisci un intero, e non un array.
Allora devi restituire v, e non v[qualcosa]. Contemporaneamente, devi modificare la dichiarazione della funzione in modo che restituisca un array, o più generalmente un puntatore ad una variabile di tipo intero. Così:
int* tabellina(int num)
Tutto il trucco sta in quel piccolo asterisco, per farti entrare nel magico mondo dei puntatori (non ne sai molto, vero? Preparati psicologicamente, per chi non li ha mai visti sono un po' un trauma... E col C ne vedrai fino al voltastomaco).
Infine c'è la questione della stampa a video. Non puoi stampare direttamente un array, questo è poco ma sicuro. Ti produrrebbe risultati incomprensibili...
Ti consiglio di cambiare l'ultima parte così:
int* tabell = tabellina(risposta),i=0;
cout<<"la tabellina del "<<risposta<<" e' ";
for (;i<10;i++) {
cout << *(tabell+i) << " ";
}
cout << endl;
Se hai delle domande chiedi pure.
deadlyomen17
01-05-2010, 11:38
#include <iostream>
using namespace std;
int* ottieniTabellina( int numero );
int main (int argc, char const* argv[])
{
int numero;
// lettura del numero
cout << "Inserisci un numero: ";
cin >> numero;
// ottengo l'array di interi che contiene la tabellina
int* tabellina = ottieniTabellina( numero );
// ciclo l'array e stampo ogni suo elemento
for( int* i = tabellina; *i; i++ )
{
cout << *i << " ";
}
cout << endl;
delete [] tabellina;
return 0;
}
int* ottieniTabellina( int numero )
{
// dichiaro e inizializzo l'array di interi in cui metterò il risultato
int* tabellina = new int[10];
for( int i = 1; i <= 10; i++ )
{
// i-1 perchè per fare la tabellina facciamo partire i da 1, mentre
// un array parte sempre da 0
tabellina[i-1] = numero * i;
}
return tabellina;
}
gabriel_cz
04-05-2010, 17:21
grazie ragazzi.erano giorni che ci pensavo ma non riuscivo ad uscirne.
Max se mi spiegassi nel dettaglio ,come hai fatto nella prima parte,il codice per la stampa,te ne sarei grato.
deadly adesso mi studio quello che hai scritto tu e casomai ti chiedo chiarimenti.
Pensavo fosse piu' facile,voleva essere un esercizio per imparare ma si e' rivelato piu' ostico di quello che pensavo...
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.