Hilo
practico funciones y el valor cambia a nulo (Emanuel) 2019-09-11 16:30:13
Hola estoy con un problema que siempre se me presenta y no se como
solucionarlo.
el problema es que creo una funcion que obtenga datos y a la hora de usarlo
los datos se transforman en cero, y no se porque ocurre esto.
no espero que me resuelvan el codigo(ese es mi trabajo)pero me gustaria
saber porque ocurre este problema siempre que aplico esto.
el codigo que reslize es este:
/*
Confeccionar un programa que solicite el ingreso de un número entero
positivo de 4 cifras y pueda calcular e
informar la suma de sus dígitos hasta llegar a una sola cifra. Ej:2561 → 5
*/
#include <iostream>
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int obtener_datos(int numero);
int calculo_datos(int suma,int numero);
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
using namespace std;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int numero;
int suma;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int main()
{
obtener_datos(numero);
calculo_datos(suma,numero);
return 0;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int obtener_datos(int numero)
{
do
{
cout<<"Digite un numero de 4 cifras mayor a 1000 y menor a 9999: ";
cin>> numero;
cout<<"el numero es: "<<numero<<endl; //mensaje para mostrar el
valor del numero que obtiene
if(numero<999||numero>9999)
{
cout<<"Error"<<endl;
cout<<"Digite un numero de 4 cifras mayor a 1000 y menor a
9999: ";
}
}while(numero<999||numero>9999);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int calculo_datos(int suma,int numero)
{
int unidad_mil;
int decena;
int centena;
int unidad;
int unidad2;
int decena2;
unidad_mil=numero/1000;
centena=(numero%1000)/100;
decena=((numero%1000)%100)/10;
unidad=((numero%1000)%100)%10;
suma=unidad+decena+centena+unidad_mil;
cout<<"el numero es: "<<numero<<endl;
if(obtener_datos(suma)<9)
{ cout<<"el numero es: "<<numero<<endl;
cout<<"El resultado es: "<<suma<<endl;
}
else
{ cout<<"el numero es: "<<numero<<endl;
suma=unidad+decena+centena+unidad_mil;
decena2=suma/10;
unidad2=suma%10;
suma=decena2+unidad2;
cout<<"El resultado es: "<<suma<<endl;
}
}
_______________________________________________
Lista de correo Cconclase Cconclase@listas.conclase.net
http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
Re: practico funciones y el valor cambia a nulo (Salvador Pozo) 2019-09-11 18:51:13
Hola:
El problema que estás teniendo con la función "obtener_datos" es que pasas un parámetro por valor y posteriormente usas la variable que pasaste por valor para hacer los cálculos.
Repasa el capítulo 15 de nuestro curso que trata de este tema "Parámetros por valor y por referencia":
http://c.conclase.net/curso/?cap=015#inicio
Tienes dos opciones para solucionar este problema:
1) Usar el valor de retorno de la función, que has declarado pero que no usas.
Bastaría con añadir una sentencia "return numero;" al final de la función y asignar a la variable global numero el valor retornado por la función.
2) Usar un parámetro por referencia, de este modo, los cambios en el valor del parámetro dentro de la función se conservan al retornar.
Hasta pronto.
--
Salvador Pozo (Administrador)
mailto:salvador@conclase.net
Blog con Clase: http://blogconclase.wordpress.com
Con Clase: http://conclase.net
_______________________________________________
Lista de correo Cconclase Cconclase@listas.conclase.net
http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
Re: practico funciones y el valor cambia a nulo (Pepone) 2019-09-12 07:47:28
Creo que el problema es que no estás devolviendo el valor.
Una función tiene la característica de que además de realizar un algoritmo,
devuelve un valor. Para ello, al final del código debes indicar qué valor
devuelves con la orden "return".
En ninguna de las dos funciones que tienes en ese código tienes esa orde,
por lo que te devuelve un entero inicializado. Es decir, el equivalente al
valor que tendrías en una declaración de un entero (ej: int num;) que por
defecto se inicializa a cero.
No se si me he explicado bien. Si no, dilo y lo vuelvo a intentar, que a
veces me explico regular jeje
¡Ánimo!
El mié., 11 sept. 2019 a las 19:55, Emanuel Cristaldo (<
imeniuel.3.6@gmail.com> ) escribió:
> Hola estoy con un problema que siempre se me presenta y no se como
> solucionarlo.
> el problema es que creo una funcion que obtenga datos y a la hora de
> usarlo los datos se transforman en cero, y no se porque ocurre esto.
> no espero que me resuelvan el codigo(ese es mi trabajo)pero me gustaria
> saber porque ocurre este problema siempre que aplico esto.
> el codigo que reslize es este:
>
> /*
> Confeccionar un programa que solicite el ingreso de un número entero
> positivo de 4 cifras y pueda calcular e
> informar la suma de sus dígitos hasta llegar a una sola cifra. Ej:2561 → 5
> */
> #include <iostream>
>
> ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
> int obtener_datos(int numero);
> int calculo_datos(int suma,int numero);
>
> //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
> using namespace std;
>
> /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
> int numero;
> int suma;
>
>
> ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
> int main()
> {
>
> obtener_datos(numero);
> calculo_datos(suma,numero);
>
> return 0;
> }
>
> //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
> int obtener_datos(int numero)
> {
> do
> {
> cout<<"Digite un numero de 4 cifras mayor a 1000 y menor a 9999: ";
> cin>> numero;
> cout<<"el numero es: "<<numero<<endl; //mensaje para mostrar el
> valor del numero que obtiene
> if(numero<999||numero>9999)
> {
> cout<<"Error"<<endl;
> cout<<"Digite un numero de 4 cifras mayor a 1000 y menor a
> 9999: ";
>
> }
> }while(numero<999||numero>9999);
> }
>
> ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
> int calculo_datos(int suma,int numero)
> {
> int unidad_mil;
> int decena;
> int centena;
> int unidad;
> int unidad2;
> int decena2;
>
> unidad_mil=numero/1000;
> centena=(numero%1000)/100;
> decena=((numero%1000)%100)/10;
> unidad=((numero%1000)%100)%10;
> suma=unidad+decena+centena+unidad_mil;
> cout<<"el numero es: "<<numero<<endl;
> if(obtener_datos(suma)<9)
> { cout<<"el numero es: "<<numero<<endl;
> cout<<"El resultado es: "<<suma<<endl;
> }
> else
> { cout<<"el numero es: "<<numero<<endl;
> suma=unidad+decena+centena+unidad_mil;
>
> decena2=suma/10;
> unidad2=suma%10;
> suma=decena2+unidad2;
> cout<<"El resultado es: "<<suma<<endl;
> }
> }
>
> _______________________________________________
> Lista de correo Cconclase Cconclase@listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
_______________________________________________
Lista de correo Cconclase Cconclase@listas.conclase.net
http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
Re: practico funciones y el valor cambia a nulo (Carlos Ernesto Obregon Suarez) 2019-09-13 12:15:16
Hay 2 errores, 1 ya te han dicho lo de retornar un valor, si el prototipo
de la función es int ObtenerValor (int ); entonces debería retornar un int.
Pero el problema del 0 lo causa otro error y es que guardas el número en
una variable local, que desaparece cuando la función que la creó termina.
Aclarando: el prototipo int ObtenerNumero (int numero); nos dice que la
función recibe como parámetro un entero "por valor" es decir que cuando le
pasas el parámetro, la función hace una copia del valor de ese parámetro
para usarla dentro de la función, de manera que lo que se modifica dentro
de la función es la copia del valor, no la variable original. Esta copia es
local, cuando la función que la usa deja de existir, la copia también. Como
el valor original no se modifica, cuando lo usas en la siguiente función,
tienes solo 0.
Tienes varias soluciones:
1- lo normal sería que cambies el prototipo a int ObtenerValor (); así sin
parametros y al llamar la función hagas algo como
Numero = ObtenerValor ();
Dentro de la función se lee un número, se valida y se retorna con la
sentencia return, el valor de retorno lo atrapa la variable Numero .
2 - con el prototipo void ObtenerValor (); sin parametro ni valor de
retorno, puedes declarar la variable Numero como global, de manera que
pueda usarse en cualquier parte del programa. Las variables globales se
declaran previo al main, algo como:
/// cabeceras
int Numero; ///variable global
int main (){
///Programa
} //fin
3 - pasar el parametro por referencia. En este caso lo que pasas de
parametro es la dirección en memoria de una variable (no una copia del
valor como en el caso de pasar por valor), de manera que se trabaja sobre
el valor original y así si lo modificas dentro de la función, queda
modificado para el resto del programa.
En C++ hay 2 opciones :
a- void ObtenerNumero (int& numero);
Esta opcion dice que no retorna valor y que el parametro es la
referencia a un entero.
b- void ObtenerNumero (int* numero);
Esta opción nos dice que pasamos un apuntador como parámetro, los
apuntadores llevan direcciones, por lo tanto es la dirección a un entero
llamado numero. Esta opción es estilo lenguaje C, si la usas, dentro de la
función debes hacer referencia al número como *numero (* es operador de
desreferencia, hace que accedas al valor de una dirección). Y al llamar la
función debes hacerlo como ObtenerNumero (&numero); donde & indica que lo
que pasas es la dirección de numero, no el valor.
La teoría es amplia, es todo lo que podría adelantar por mensaje, debes
profundizar por tu cuenta. Espero serte de ayuda.
El mié., 11 de sept. de 2019 11:55 AM, Emanuel Cristaldo <
imeniuel.3.6@gmail.com> escribió:
> Hola estoy con un problema que siempre se me presenta y no se como
> solucionarlo.
> el problema es que creo una funcion que obtenga datos y a la hora de
> usarlo los datos se transforman en cero, y no se porque ocurre esto.
> no espero que me resuelvan el codigo(ese es mi trabajo)pero me gustaria
> saber porque ocurre este problema siempre que aplico esto.
> el codigo que reslize es este:
>
> /*
> Confeccionar un programa que solicite el ingreso de un número entero
> positivo de 4 cifras y pueda calcular e
> informar la suma de sus dígitos hasta llegar a una sola cifra. Ej:2561 → 5
> */
> #include <iostream>
>
> ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
> int obtener_datos(int numero);
> int calculo_datos(int suma,int numero);
>
> //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
> using namespace std;
>
> /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
> int numero;
> int suma;
>
>
> ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
> int main()
> {
>
> obtener_datos(numero);
> calculo_datos(suma,numero);
>
> return 0;
> }
>
> //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
> int obtener_datos(int numero)
> {
> do
> {
> cout<<"Digite un numero de 4 cifras mayor a 1000 y menor a 9999: ";
> cin>> numero;
> cout<<"el numero es: "<<numero<<endl; //mensaje para mostrar el
> valor del numero que obtiene
> if(numero<999||numero>9999)
> {
> cout<<"Error"<<endl;
> cout<<"Digite un numero de 4 cifras mayor a 1000 y menor a
> 9999: ";
>
> }
> }while(numero<999||numero>9999);
> }
>
> ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
> int calculo_datos(int suma,int numero)
> {
> int unidad_mil;
> int decena;
> int centena;
> int unidad;
> int unidad2;
> int decena2;
>
> unidad_mil=numero/1000;
> centena=(numero%1000)/100;
> decena=((numero%1000)%100)/10;
> unidad=((numero%1000)%100)%10;
> suma=unidad+decena+centena+unidad_mil;
> cout<<"el numero es: "<<numero<<endl;
> if(obtener_datos(suma)<9)
> { cout<<"el numero es: "<<numero<<endl;
> cout<<"El resultado es: "<<suma<<endl;
> }
> else
> { cout<<"el numero es: "<<numero<<endl;
> suma=unidad+decena+centena+unidad_mil;
>
> decena2=suma/10;
> unidad2=suma%10;
> suma=decena2+unidad2;
> cout<<"El resultado es: "<<suma<<endl;
> }
> }
>
> _______________________________________________
> Lista de correo Cconclase Cconclase@listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
_______________________________________________
Lista de correo Cconclase Cconclase@listas.conclase.net
http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
Fwd: Re: practico funciones y el valor cambia a nulo (Facu) 2019-09-13 15:08:07
Ya te han dado una muy buena respuesta :DPara profundizar, googlea: "Parametros por valor y por referencia"
-------- Mensaje original --------De: Programacion Matematica <progmath13@gmail.com> Fecha: 13/9/19 09:15 (GMT-03:00) A: Lista de correo sobre C y C++ <cconclase@listas.conclase.net> Asunto: Re: [C con Clase] practico funciones y el valor cambia a nulo Hay 2 errores, 1 ya te han dicho lo de retornar un valor, si el prototipo de la función es int ObtenerValor (int ); entonces debería retornar un int.Pero el problema del 0 lo causa otro error y es que guardas el número en una variable local, que desaparece cuando la función que la creó termina.Aclarando: el prototipo int ObtenerNumero (int numero); nos dice que la función recibe como parámetro un entero "por valor" es decir que cuando le pasas el parámetro, la función hace una copia del valor de ese parámetro para usarla dentro de la función, de manera que lo que se modifica dentro de la función es la copia del valor, no la variable original. Esta copia es local, cuando la función que la usa deja de existir, la copia también. Como el valor original no se modifica, cuando lo usas en la siguiente función, tienes solo 0. Tienes varias soluciones:1- lo normal sería que cambies el prototipo a int ObtenerValor (); así sin parametros y al llamar la función hagas algo como Numero = ObtenerValor ();Dentro de la función se lee un número, se valida y se retorna con la sentencia return, el valor de retorno lo atrapa la variable Numero .2 - con el prototipo void ObtenerValor (); sin parametro ni valor de retorno, puedes declarar la variable Numero como global, de manera que pueda usarse en cualquier parte del programa. Las variables globales se declaran previo al main, algo como:/// cabecerasint Numero; ///variable globalint main (){ ///Programa } //fin3 - pasar el parametro por referencia. En este caso lo que pasas de parametro es la dirección en memoria de una variable (no una copia del valor como en el caso de pasar por valor), de manera que se trabaja sobre el valor original y así si lo modificas dentro de la función, queda modificado para el resto del programa. En C++ hay 2 opciones :a- void ObtenerNumero (int& numero); Esta opcion dice que no retorna valor y que el parametro es la referencia a un entero.b- void ObtenerNumero (int* numero); Esta opción nos dice que pasamos un apuntador como parámetro, los apuntadores llevan direcciones, por lo tanto es la dirección a un entero llamado numero. Esta opción es estilo lenguaje C, si la usas, dentro de la función debes hacer referencia al número como *numero (* es operador de desreferencia, hace que accedas al valor de una dirección). Y al llamar la función debes hacerlo como ObtenerNumero (&numero); donde & indica que lo que pasas es la dirección de numero, no el valor.La teoría es amplia, es todo lo que podría adelantar por mensaje, debes profundizar por tu cuenta. Espero serte de ayuda. El mié., 11 de sept. de 2019 11:55 AM, Emanuel Cristaldo <imeniuel.3.6@gmail.com> escribió:Hola estoy con un problema que siempre se me presenta y no se como solucionarlo.el problema es que creo una funcion que obtenga datos y a la hora de usarlo los datos se transforman en cero, y no se porque ocurre esto. no espero que me resuelvan el codigo(ese es mi trabajo)pero me gustaria saber porque ocurre este problema siempre que aplico esto.el codigo que reslize es este:/*Confeccionar un programa que solicite el ingreso de un número entero positivo de 4 cifras y pueda calcular einformar la suma de sus dígitos hasta llegar a una sola cifra. Ej:2561 → 5*/#include <iostream>///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////int obtener_datos(int numero);int calculo_datos(int suma,int numero);//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////using namespace std;/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////int numero;int suma;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////int main(){ obtener_datos(numero); calculo_datos(suma,numero); return 0;}//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////int obtener_datos(int numero){ do { cout<<"Digite un numero de 4 cifras mayor a 1000 y menor a 9999: "; cin>>numero; cout<<"el numero es: "<<numero<<endl; //mensaje para mostrar el valor del numero que obtiene if(numero<999||numero> 9999) { cout<<"Error"<<endl; cout<<"Digite un numero de 4 cifras mayor a 1000 y menor a 9999: "; } }while(numero<999||numero>9999);}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////int calculo_datos(int suma,int numero){ int unidad_mil; int decena; int centena; int unidad; int unidad2; int decena2; unidad_mil=numero/1000; centena=(numero%1000)/100; decena=((numero%1000)%100)/10; unidad=((numero%1000)%100)%10; suma=unidad+decena+centena+unidad_mil; cout<<"el numero es: "<<numero<<endl; if(obtener_datos(suma)<9) { cout<<"el numero es: "<<numero<<endl; cout<<"El resultado es: "<<suma<<endl; } else { cout<<"el numero es: "<<numero<<endl; suma=unidad+decena+centena+unidad_mil; decena2=suma/10; unidad2=suma%10; suma=decena2+unidad2; cout<<"El resultado es: "<<suma<<endl; }}
_______________________________________________
Lista de correo Cconclase Cconclase@listas.conclase.net
http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
_______________________________________________
Lista de correo Cconclase Cconclase@listas.conclase.net
http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ