Amigos, ayuda con C++, estoy atrancado D= [SOLVED]

Muy buenas. Estoy con las prácticas de Fundamentos de programación, y tengo dos ejercicios que no me salen... ¿Podríais ayudarme?

Imagen


Este he logrado la mitad xD, calcular el número de cifras del número para luego elevar cada dígito a lo calculado.

#include <iostream>
#include <cmath>
using namespace std;

int main(){
   int numero, numero_copia;
   double n, n_copia, sumando, suma;
   
   cin >> numero;

   numero_copia = numero;

   n = 0;

   for (numero_copia = numero; numero_copia > 0; n++)
      numero_copia = numero_copia / 10;
   

   cout << "\n\nEl numero de cifras es " << n << ".\n\n";

---->   numero_copia = numero;
---->   suma = 0;
---->   n_copia = n;

---->   for (n_copia = n; n_copia > 0; n_copia--) {
---->      numero_copia = numero_copia % 10;
---->      suma = suma + pow (numero_copia,n);
   }

   if (suma == numero)
      cout << "\n\nEs narcisista.";
   else
      cout << "\n\nNo es narcisista.";

   system("pause");
}


La parte remarcada es la que me he quedado sin ideas (o con ideas pero sin saber cómo plantearlas)... necesito tener cada cifra, pero no sé cómo poner que cada vez divida por 10 más, he probado varias cosas y nada =S...


Imagen

Este no sé por dónde meterle mano, simplemente... Si podéis echarme un cable os lo agradecería, llevo con los demás hechos desde hace días, pero tengo que entregar las prácticas antes de las 23:00 de mañana Lunes y me quedan sólo esos 2...

Muchas gracias ^^

Salu2!!!
#include <iostream>
#include <cmath>
using namespace std;

int main(){
   int numero, numero_copia;
   double n, n_copia, sumando, suma;
   
   cin >> numero;

   numero_copia = numero;

   n = 0;

   for (numero_copia = numero; numero_copia > 0; n++)
      numero_copia = numero_copia / 10;
   

   cout << "\n\nEl numero de cifras es " << n << ".\n\n";

---->   numero_copia = numero;
---->   suma = 0;
---->   n_copia = n;

---->   for (n_copia = n; n_copia > 0; n_copia--) {
---->      numero_copia = numero_copia % 10;
---->      suma = suma + pow (numero_copia,n);
   }

   if (suma == numero)
      cout << "\n\nEs narcisista.";
   else
      cout << "\n\nNo es narcisista.";

   system("pause");
}


Te complicas la vida... yo mejor utilizaría un while, es complicarse la vida con ese n-- en un bucle que requiere divisiones por 10.

numero_copia=numero;
mientras ( numero_copia > 0 ) hacer:
    suma= resultado + pow (numero_copia mod 10);
    numero_copia= numero_copia div 10;
fmientras


Para el segundo ejercicio te daré un par de pistas que van bastante bien a la hora de hacer bucles de bucles, como es este caso

Te lo pondré en términos generales, para empezar el bucle grande simplemente se hace cargo de la condicion de fin de programa, te avanzo que lo utilizarás bastante en programitas de selección de opciones, y despues como los números ni siquiera se van alternando no te tienes que complicar la vida con tablas.

leer primer numero (a veces veras que el primer valor de secuencia es de fin de programa, tipico en tests)
mientras (numero != -1 ) hacer
   veces que ha salido = 1 (es el minimo de veces que va a salir, aunque el siguiente sea diferente)
   leer siguiente numero
   mientras (el numero siguiente sea el mismo que el anterior)
      suma++
      leer otro numero
   fin de mientras
   imprimir numero y suma
fin de mientras


Ale, valor y al toro! Yo me estoy peleando ahora mismo con Java, qué tiempos aquellos que comencé también con mis programitas en c [sonrisa]
Vale, ya he entendido el primero =P. La verdad es que sí, me complico la vida muchas veces, pero bueno, a seguir aprendiendo ^^, ese me ha quedado bastante claro, es fácil una vez que se entiende :D.

El segundo no lo veo del todo... no sé cómo hacer que una expresión evalúe según lo que tenía el valor anterior. A ver, sé, pero claro, no con solamente una variable...

#include <iostream>
using namespace std;

int main(){
   int numero, numero_2, suma;
   
   cout << "\nIntroduce números y se codificarán por el método RLE (salir con -1)\n";
   cin >> numero;

   while (numero != -1){
   suma = 1;
   cin >> numero_2;
      while (numero_2 == numero){
      suma ++;
      cin >> numero_2;
      }
   cout << "\n\n " << numero << " " << suma <<".";
   }

   system("pause");
}


Eso me funciona, pero sólo con el primer número xD, en cuanto cambio de número se producen errores lógicos -.-. Obviamente sé que está mal y se ve claramente, la variable numero nunca cambia de valor... por eso, es que no sé cómo evaluar si una variable tenía el mismo valor que anteriormente, ya que una vez le asignas otro valor, el antiguo se machaca por así decirlo...

Muchas gracias por tu ayuda =).

Salu2!!!
analca3 escribió:Vale, ya he entendido el primero =P. La verdad es que sí, me complico la vida muchas veces, pero bueno, a seguir aprendiendo ^^, ese me ha quedado bastante claro, es fácil una vez que se entiende :D.

El segundo no lo veo del todo... no sé cómo hacer que una expresión evalúe según lo que tenía el valor anterior. A ver, sé, pero claro, no con solamente una variable...

#include <iostream>
using namespace std;

int main(){
   int numero, numero_2, suma;
   
   cout << "\nIntroduce números y se codificarán por el método RLE (salir con -1)\n";
   cin >> numero;

   while (numero != -1){
   suma = 1;
   cin >> numero_2;
      while (numero_2 == numero){
      suma ++;
      cin >> numero_2;
      }
   cout << "\n\n " << numero << " " << suma <<".";
   }

   system("pause");
}


Eso me funciona, pero sólo con el primer número xD, en cuanto cambio de número se producen errores lógicos -.-. Obviamente sé que está mal y se ve claramente, la variable numero nunca cambia de valor... por eso, es que no sé cómo evaluar si una variable tenía el mismo valor que anteriormente, ya que una vez le asignas otro valor, el antiguo se machaca por así decirlo...

Muchas gracias por tu ayuda =).

Salu2!!!

Necesitas un poco de psudocódigo, luego pasarlo a código funcional es un momento.

nueva entrada es distinta de -1? almacenar entrada. Es -1? empezar la ejecución siguiente:
de inicio a fin, leer posicion a posicion.
si posición actual es superior a primera posición, comparas posicion actual con la anterior. incrementas hasta que sea distinto.
das la salida almacenada.


Éso sería si cada entrada va almacenando y luego procesa de golpe. Si quieres hacerlo a medida que vas introduciendo cada carácter, lo adaptas en un plis plas.
Saludos.
exitfor escribió:Necesitas un poco de psudocódigo, luego pasarlo a código funcional es un momento.

nueva entrada es distinta de -1? almacenar entrada. Es -1? empezar la ejecución siguiente:
de inicio a fin, leer posicion a posicion.
si posición actual es superior a primera posición, comparas posicion actual con la anterior. incrementas hasta que sea distinto.
das la salida almacenada.


Éso sería si cada entrada va almacenando y luego procesa de golpe. Si quieres hacerlo a medida que vas introduciendo cada carácter, lo adaptas en un plis plas.
Saludos.


Ese es el problema, como no nos han enseñado pseudocódigo, directamente C++, pues me es difícil pasar del pseudocódigo a C++... y la verdad, lo que me has dicho lo entiendo, pero no sé cómo ponerlo en C++ T_T...

"De inicio a fin, leer posición a posición", y yo pregunto, ¿Cómo leer posición a posición si tengo las variables machacadas? Me da que estoy espeso ya...

Salu2!!!
El pseudocódigo no tiene por qué ser formal, básicamente es hacer un boceto para después trasladarlo al lenguaje elegido.

Necesitas un contador y guardar el último número leído en una variable ("anterior", por ejemplo) y leer un número en cada iteración. Cada vez que lees un número distinto al anterior, guardas/imprimes el resultado del anterior bloque, reinicias el contador a 1 y guardas el número leído en "anterior". Todo eso en un bucle que se repita mientras el número leído no sea -1.

entero leído <- leerEntero()
entero contador <- 0
entero anterior <- leído

mientrasQue leído distinto -1 hacer
  si anterior igual a leído hacer
    contador <- contador + 1
  si_no
    imprimir "contador anterior"
    contador = 1
    anterior = leído
  finSi
 
  leído <- leerEntero()
finMQ
#include <iostream>
using namespace std;

int main(){
   int numero, numero_2, suma;
   
   cout << "\nIntroduce números y se codificarán por el método RLE (salir con -1)\n";
   cin >> numero;

   while (numero != -1){
   suma = 1;
   cin >> numero_2;
      while (numero_2 == numero){
      suma ++;
      cin >> numero_2;
      }
   cout << "\n\n " << numero << " " << suma <<".";
----->numero=numero_2;
   }

   system("pause");
}


Básicamente te ha faltado eso, por eso en cuanto el número cambia los resultados se te trastocan, de esta forma cuando finaliza una secuencia el número a partir del que se comprara es el nuevo valor.

De todas maneras el pseudocódigo de amuchamu también es perfectamente válido, pero al ver que era un ejercicio de bucles no he querido meter condicionales if.
Ah, vale, vale!!!! Ambas posibilidades entiendo ahora xD!!!! Muchísimas gracias a ambos =3. Jope, hasta que no lo entiende uno lo ve todo espeso -.-...

Borro el ejercicio que propuse al final, me da vergüenza mi error xD. Unos paréntesis me han jugado una mala pasada. El hilo está resuelto, muchas gracias a todos =3.

Salu2!!!
7 respuestas