compila pero no hace lo que pido

Iniciado por imeniuel, 3 Septiembre 2019, 19:42 PM

0 Miembros y 1 Visitante están viendo este tema.

imeniuel

hola estoy practicando funciones y me puse a realizar un programa que compila pero los resultados no son lo que esparaba, si alguno me dice donde esta mi error me ayudaria mucho
el codigo es:

/*
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);
void calculo_datos(int suma);
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
using namespace std;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int numero;
int suma;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int main()
{
    obtener_datos(numero);
    calculo_datos(suma);
    return 0;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int obtener_datos(int numero)
{
    do
    {
        cout<<"Digite un numero de 4 cifras mayor a cero: ";
        cin>>numero;

        if(numero>1000)
        {
            return numero;
        }
        else
        {
            cout<<"El numero ingresado no cumple los requisitos pedidos"<<endl;
            cout<<"Digite un numero de 4 cifras mayor a cero: ";
        }
    }while(numero<=999);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void calculo_datos(int suma)
{
    int unidad_mil;
    int decena;
    int centena;
    int unidad;
    int unidad2;
    int decena2;

    unidad_mil=numero/1000;
    centena=(numero%1000)/100;        //1234
    decena=((numero%1000)%100)/10;
    unidad=((numero%1000)%100)%10;
    suma=unidad+decena+centena+unidad_mil;
    if(suma>0&&suma<=9)
    {
        cout<<"El resultado es: "<<suma<<endl;
    }
    else
    {
        decena2=suma/10;
        unidad2=suma%10;
        suma=decena2+unidad2;
        cout<<"El resultado es: "<<suma<<endl;
    }
}

MAFUS

Deberías pensar en usar la recursividad y tal vez usar bucles para conseguir cada uno de los dígitos.

Debes encontrar el patrón y automatizar.

@XSStringManolo

#2
No estás haciendo lo que se te pide. Y estás declarando todo como ints. Dice número entero positivo.
Si usas unsigned ya que sabes que es positivo y que va a tener 4 cifras puedes usar short.
unsigned short int numero = 1000;

La condicion del bucle debería ser comprobar si el número está entre 1000 y 9999 ambos incluidos. Ya que son todos los números enteros positivos de 4 cifras.

Esta forma de pedirte el ejercicio interpreto que está planteado  específicamente para que lo resuelvas de forma matemática. Si no, lo más sencillo es resolver este problema con un array de ints y usando el operador de array[] o aritmética de punteros para acceder a cada elemento del array y sumarlos. Otra opción es usar un string que no deja de ser un array de caracteres y aplicarías el mismo principio de usar el operador array[], aritmética de punteros o como añadido alguno de los múltiples métodos que te habilita la Standart Template Library, como el método find, o recorrer el array usando iteradores o alguno de los múltiples for como el clásico o el basado en rango o alguno de los algoritmos disponibles para ello.
También puedes resolverslo obteniendo los bytes que ocupa en memoria el tipo de dato unsigned short int o usar los operadores de bits y resolverlo operando en binario.
Interpreto que lo tienes que resolver matemáticamente debido a que te dice "número entero positivo" no caracter. O "números" enteros positivos. Aunque el resultado final sea el mismo, será para que desarrolles tu pensamiento lógico.

Matemáticamente puedes aprovecharte de que se hace un truncado de números decimales. Es decir, la parte decimal no se aproxima, se elimina.

Si el numero fuese por ejemplo 6789 obtienes las cifras dividiendo entre cada valor.

numero1 = numero/1000; Obtienes 6.
numero2 = numero/100; Obtienes 67.
numero3 = numero/10; Obtienes 678.
numero4 = numero/1; Obtienes 6789.

Así solo sacas uno de los números que vas a sumar. El 6.

Ahora voy a sacar el 7.
numero2 = numero2 - numero1*10;
Así ya sale el 7.

Ahora el 8.
numero3 = numero3 - ((numero1*10 + numero2)*10); Esto equivale a 678-670;

El último.
numero4 = numero4 - (((numero1*10 + numero2)*10)*10); Esto equivale a 6789-6780;

Te queda:
numero1 = 6
numero2 = 7
numero3 = 8
numero4 = 9

Sumas todo:
numero = numero1 + numero2 + numero3 + numero4; Y obtienes 30.

Si el número es mayor a 9 tienes 2 cifras, asique debes obtener ambas cifras. Usas el mismo método.
numero1 = 30/10; Obtienes 3.
numero2 = numero - numero1*10; Obtienes 0.

Por último obtienes el resultado final del programa:
numero = número1 + numero2; Obtienes 3.

Esto si lo quieres hacer con una función hazlo con una funcion que returne unsigned short int y tome como parámetro el número.
unsigned short int Calculo (numero);

Seguramente haya burradas de maneras de resolverlo matemáticamente y más eficientes. Esta es la que se me ocurre a mi sin darle muchas vueltas ni buscar ejemplos. Impleméntala en el programa o utiliza otra. Asegúrate de que esté todo correcto y se cumpla en todos los casos.

Estas operaciones están en bruto, puedes sacar y deberías sacar el patrón usado e implementarlo en un for.

MAFUS

Creo que te complicaste un poco, Manolo. Con dividir y resto es más sencillo, cómo lo hacía él, pero en un bucle.