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

Programacion Matematica progmath13 en gmail.com
Vie Sep 13 14:15:08 CEST 2019


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 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 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 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/ea575442/attachment-0001.html>


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