Problema Informático en Lenguaje C (gcc 8.3)

DaylanStay

Hola buenas, quería consultar si es que alguien podría darse el tiempo de poder ayudarme a realizar un ejercicio en éste lenguaje, he intentado de todas maneras para que me de un Output correspondiente pero no me sirven, el problema es el siguiente:
Parte 1
https://ibb.co/b30Yt3Y
Parte 2
https://ibb.co/0ZLpyGq

La cosa es que tengo que crear la parte de la función de un programa C, tengo que completar con esa parte y pues solamente se hace uso de la librería ''stdio.h'' no se puede agregar ninguna otra más, en la Imagen de Parte 2, sale en un cuadradito la entrada y cómo debe salir el resultado, y en la imagen parte 1 se ve como es la primera parte del código y en donde irá la función que completará dicho código, he intentado de todas maneras pero el resultado que yo logro es por ejemplo la entrada es 123, mi salida debería ser 1 + 2 + 3 = 6, pero lo que yo logro es solamente 3 + 2 + 1 = 6, si es que alguien podría darse el tiempo de crear el código en dicho lenguaje para éste problema estaría demasiado agradecido :C.

Cabe destacar que tiene que ser realizado de manera recursiva.

Mewtwo

Si de verdad lo tienes hecho , el ejercicio lo tienes ya resuelto. En vez de coger el array por el principio , cogelo por el final.

2 respuestas
enin

Como dice #2 , cambia el tipo de &numero a char[] y vas llamando a la función quitándole el último elemento hasta que tenga longitud 0, y devuelves la suma total

1 respuesta
Devilpower

Tambien te digo una cosa, el ejercicio esta explicado de puto ojete xD

1
Devilpower

Por cierto, algo util seria que nos copiaras el codigo y te demos opinion acerca de lo que estas haciendo mal/bien, en vez de que te solucionemos el ejercicio, ya que asi no te va a servir de nada.

1 1 respuesta
desu

A partir de los 10 minutos.

1 respuesta
DaylanStay

#2 #3 #5 Buenas, tomando en cuenta sus respuestas.

  • El ejercicio en si, lo tengo pero no he logrado la salida que me solicitan
  • Todavia estoy en proceso de aprendizaje en Programación en C y pues no nos han enseñado aún el uso de Arrays y elementos Char(aunque si los han mencionado pero todavia no los hemos aplicado)

Mi codigo que he hecho es el siguiente, me han indicado que éste ejercicio se puede realizar con solamente 1 función, pero es lo que no logro entender, cabe destacar que solamente puedo trabajar con la parte de la función ya que el ejercicio de por si te va a entregar el int main().

unsigned long long sumaDigitos(unsigned long long numero, unsigned long long *suma)
{
    if(numero < 10) //CASO BASE
    {
        printf("%llu",numero);
        *suma += numero;
        return numero;
    }
    else //CASO RECURSIVO
    {
        *suma += numero % 10;
        printf("%llu + ", (numero%10));
        return sumaDigitos(numero  / 10, suma);
    }
}

Aquí está mi código, el que complementará dicha primera parte que no se puede modificar, solo puedo trabajar con la función, la salida de mi codigo es 3 + 2 + 1 = 6, tomando como ejemplo una entrada 123, pero lo que tengo que lograr es que sea 1 + 2 + 3 = 6, ese es mi dilema.

Hay que tomar en cuenta que esta parte:

#include <stdio.h>

{{ TU RESPUESTA SE COPIARÁ ACÁ }}

int main() 
{
    unsigned long long numero;
    scanf("%llu" , &numero);
    unsigned long long suma = 0;
    sumaDigitos(numero, &suma);
    printf(" = %lld",suma);
    return 0;
}

No se puede modificar, solamente hago la parte de la función que se pondrá en donde dice ''TU RESPUESTA SE COPIARÁ ACÁ'' y listo, asique no puedo modificar ninguna variable del int main() ni agregar librerias.

1 respuesta
DaylanStay

#6 Si bien vi el video, todavía no puedo aplicar esas técnicas ya que todavía las desconozco :c, además que en el servidor donde trabajo, nos limitan.

djamb

#1 a mí me pusieron ese mismo problema para resolver en pseudocódigo en un examen de 1° de la carrera, lo resolví con arrays.
Creo que este ejercicio está pensado para que aprendas a jugar con los tipos de datos, enteros, float etc o para que aprendas a usar arrays.
Te doy una idea de resolución jugando con tipos de datos
Sabes que la entrada es 1234, sabes que tienes 4 sumas por lo que has escrito antes, luego la primera división la haces por 1000
1234/1000=1,234 te quedas con el número entero 1
Haces (1,234-1)10 = 2,34 te vuelves a quedar con el entero 2
Haces (2,34-2)10=3,4 te quedas con el 3
(3,4-3)10=4 te quedas con el 4
Y paras cuando no haya decimales.
Edit. No había leído bien que el problema lo estabas teniendo con la recursividad. Sorry

1 respuesta
Mewtwo

#7 hazlo al reves , en vez de sumar y luego llamar a la funcion , llama la funcion y luego haz la suma y te quedara la salida como quieres.

#9 su solucion es válida , el ejercicio le tiene bien hecho. Su problema es solo de orden no necesita mas.

2 respuestas
djamb

#10 usando recursividad lo solucionaría pero no creo que sepa todavía.

1 respuesta
Mewtwo

#11 si esta usando recursividad :psyduck: es mas su ejercicio es de recursividad, si lo ha puesto en #1

1 respuesta
djamb

#12 sorry, acabo de ser papi y entre la privación del sueño y que el bicho te deja leer a trozos no había terminado de leerlo, entonces es lo que estabas comentando 😤

DaylanStay

#10 Me podrías explicar mas detallado? Entiendo eso de tener que cambiar algo en el orden, solamente que no entiendo que es lo que tengo que mover, me convence demasiado lo que me dices, solo que no logro entenderlo al 100%

2 respuestas
Mewtwo

#14 tu prueba como crees que me has entendido. Y mira que es lo pasa. Si lo ves tu y te equivocas vas entenderlo mejor.

2 respuestas
Frankicia

#14 Tu respuesta es recursiva, por lo tanto, en la primera llamada tienes el número completo, en la siguiente tendrás el número/10.
Con el primer ejemplo de 123:

Primera llamada: 123
Segunda llamada 12
Tercera y última: 1

Ves el patrón? Es a lo que se refiere el camarada.

1 respuesta
DaylanStay

#16 No sé si soy muy tonto para entenderlo o algo, pero... tendria que entonces dividir de inmediato el numero en vez de trabajarlo como viene?

1 respuesta
Frankicia

#17 no te he entendido la frase, sorry.

Me refiero a que en recursivo (y en este ejemplo de 123), la tercera llamada es la primera llamada que acabará por completo.
La tercera llamada, devolverá control a la segunda llamada, la segunda acabará y devolverá control a la primera llamada, y la primera llamada acabará.

Imaginatelo así:

--> Primera llamada (123)
----> Segunda llamada (12)
---------->Tercera llamada (1)
<---- Segunda llamada (12)
<-- Primera llamada (123)

--> Se refiere a llamada, <--- Se refiere a volver, igual no es la mejor sintaxis, espero que se entienda.
Lo que está entre paréntesis son los argumentos de la llamada de tu ejemplo que te sale al revés (3 + 2 + 1)

1 respuesta
DaylanStay

#18 Vale, entiendo a lo que te refieres, así es como funciona esa recursividad que estoy aplicando, lo que no logro entender entonces, cómo logro la salida que quiero?
Porque ya veo que luego todo se devuelve, pero la salida...

1 respuesta
DaylanStay

#15 Al parecer no lo entendí :qq:

Frankicia

#19 Ahora mismo estás haciendo esto:

--> Primera llamada (123)
-------------- Imprimir número 3
----> Segunda llamada (12)
-------------- Imprimir número 2
---------->Tercera llamada (1)
-------------- Imprimir número 1
<---- Segunda llamada (12)
<-- Primera llamada (123)

Cómo haces para que se imprima el 2 y el 3 después del caso base?

1 respuesta
DaylanStay

#21 Hmmmm... tomando en cuenta que en el regreso ya no imprime nada, ahi es donde deberia empezar a imprimir en vez de imprimir en el inicio, ya que cuando se llega al caso base, la función empieza a desapilarse y tal, pero para imprimir el 2 y el 3 despues del caso base... cómo hago posible eso? No se me ocurre nada :C ya que no sé como tomar en cuenta el regreso de la función.

1 respuesta
Frankicia

#22
unsigned long long sumaDigitos(unsigned long long numero, unsigned long long *suma)
{
if(numero < 10) //CASO BASE
{
printf("%llu",numero);
*suma += numero;
return numero;
}
else //CASO RECURSIVO
{
*suma += numero % 10;
printf("%llu + ", (numero%10));
return sumaDigitos(numero / 10, suma); <--- aquí llamas a la función
}
}

2 respuestas
DaylanStay

#23 Y como me decían, primero tengo que llamar a la función y luego sumar, pero... cómo?

1 respuesta
Mewtwo

#24 haciendolo al reves, si imprimes y luego llamas y te sale 3+2+1 , entonces tendras que hacer llamar y luego imprimir para que salga 1+2+3

3 respuestas
DaylanStay

#25 Pero si llamo y luego imprimo, al ser return no imprimirá nada ya que no tomará en cuenta el printf que viene

DaylanStay

#25 No sé como tomar la estructura, no se me ocurre qué tengo que cambiar para que funcione asi como dices, la verdad que he estado todo éste rato mirando mi código pero no se me viene nada a la mente.

DaylanStay

#25 #23

#include <stdio.h>

unsigned long long sumaDigitos(unsigned long long, unsigned long long *);

int main() 
{
    unsigned long long numero;
    scanf("%llu" , &numero);
    unsigned long long suma = 0;
    sumaDigitos(numero, &suma);
    printf(" = %lld",suma);
    return 0;
}

unsigned long long sumaDigitos(unsigned long long num, unsigned long long *suma)
{
    if(num <= 9) //CASO BASE
    {
        return printf("%llu", num%10);
    }
    else //CASO RECURSIVO
    {
        *suma += sumaDigitos(num/10, suma);
        return printf(" + %llu", num%10);
    }
}

He tratado y pues logré ahora ordenar bien la salida, pero ahora mi problema es la suma... ¿Alguna sugerencia? :C

1 respuesta
Frankicia

#28 Nadie te obliga a tener que retornar el resultado de la función. Puedes retornar una variable

1 respuesta
DaylanStay

#29 Cómo cual variable debería retornar entonces? No lo capto

1 respuesta