[C con Clase] Fwd: Re: practico funciones y el valor cambia a nulo

Facundo Curti facu.curti en gmail.com
Vie Sep 13 17:08:08 CEST 2019


Ya te han dado una muy buena respuesta :DPara profundizar, googlea: "Parametros por valor y por referencia"
-------- Mensaje original --------De: Programacion Matematica <progmath13 en gmail.com> Fecha: 13/9/19  09:15  (GMT-03:00) A: Lista de correo sobre C y C++ <cconclase en 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 en 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 en listas.conclase.net
http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20190913/0679c913/attachment-0001.html>


Más información sobre la lista de distribución Cconclase