elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)



+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  invertir el número entero
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: invertir el número entero  (Leído 6,399 veces)
lohayne

Desconectado Desconectado

Mensajes: 8


Ver Perfil
invertir el número entero
« en: 20 Abril 2018, 02:25 am »

Hola
Hola buenas tardes,
Estoy haciendo un ejercicio para invertir un número (un número de la elección del usuario)
ejemplo: 1234 se convierte en 4321
pero a pesar de que el programa se ejecuta, cuando pongo 3 dígitos o más, los números aparecen invertidos, pero falta 1 dígito
¿Alguien me puede ayudar?




Olá boa tarde,
Eu estou fazendo um exercício para inverter um numero(um numero da escolha do usuário)
exemplo:1234 vira 4321
mas apesar do programa rodar,quando eu coloco 3 dígitos ou mais  ,os números aparecem invertidos ,mas o ultimo digito não aparece
alguém poderia me ajudar?
 
 
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main() {
  5.    int n,cifra,i;
  6.    int *v;
  7.     v =(int*) malloc (n*sizeof(int));
  8.    printf("escriba un numero:");
  9.    scanf("%i",&n);
  10.    for (i=0;i<n;i++) {
  11.    cifra=n%10;
  12.    n=n/10;
  13.    v=cifra;
  14.    printf("%i",v );}
  15.    return 0;}
  16.  


· Los códigos deben ir en etiquetas GeSHi (corregido)
>aquí las reglas del foro
-Engel Lex


« Última modificación: 20 Abril 2018, 02:29 am por engel lex » En línea

engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.458



Ver Perfil
Re: invertir el número entero
« Respuesta #1 en: 20 Abril 2018, 02:42 am »

tienes un problema logico en tu operación

Código
  1. for (i=0;i<n;i++) {
  2.    cifra=n%10;
  3.    n=n/10;
  4.    v=cifra;
  5.    printf("%i",v );
  6. }

primera linea: para i empezando en 0, mientras que i sea menor que n

en este caso si el numero por ejemplo es 118

Código:
ciclo1:
i=0
cifra = 8
n = 11
v = 8
imprime 8
-------
ciclo2:
i=1
cifra = 1
n = 1
v = 1
imprime 1
-------
ciclo:
i = 2.... n en el ciclo2 era 1 por lo tanto al ser 2>1 se rompe el for

el codigo deben cambiar la linea del for por

Código
  1. while(n){

esto hará que se repita mientras que n no sea 0(que será interpretado como false y terminará el codigo)...


por otro lado aunque no te afecta realmente, tienes una incoherencia con ese puntero a v no tiene mucho sentido


En línea

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 2.678


Ver Perfil
Re: invertir el número entero
« Respuesta #2 en: 20 Abril 2018, 02:54 am »

Tienes un error semántico...

Usas el bucle incorrecto al caso. Para usar un bucle "For", se debe saber cuantas veces debe ejecutarse. Cuando se desconoce cuantas veces deba ejecutarse un bucle, es mejor usar un bucle incondiional tipo "while..."

Tu usas i como contador, pero 'i', nada tiene que ver con el valor que introduce el usuario (por ejemplo 34567), con cada ciclo, n pierde un dígito, e 'i' suma 1, luego cuando 'n' solo qued euna cifra... el resultado dependerá de si 'i' se ha ejecutado menos veces que el valor de 'n' que resta...

La solución es modificar el bucle así:

Código:
Hacer mientras (n>0)
   imprimir (n modulo 10)
   n = (n\10)
repetir

Si fuera el caso que hubiera ceros a la izquierda, como número los ceros a la izquierda, no valen nada (00053 = 53, luego la inversión del número 0053 = 35 es correcta)...
...pero si lo tomas como si fuera texto, si cuentan ("0053" invertido sería "3500", pero en ese caso 'n' no podría ser tratado cono un número y el módulo y la división darían error, es decir la función debería ser otra distinta, operando con caracteres y no con cifras.

En línea

Kenji-chan

Desconectado Desconectado

Mensajes: 104


Ver Perfil
Re: invertir el número entero
« Respuesta #3 en: 20 Abril 2018, 03:48 am »

la resolución de este problema es sencilla
primero tienes que averiguar la cantidad de dígitos que tiene el numero ingresado

Código:
num = numero ingresado por el usuario;
digitos = 0;
aux = 1;

mientras aux < num hacer:
    digitos = digitos + 1;
    aux = aux * 10;
con esto obtenemos la cantidad de dígitos que tiene el numero
ahora hay que voltear el numero para ello tenemos que descomponer el numero
Código:
//para el ejemplo usaremos el numero 1234
inverso = 0
parte = num/valor_proposicional //El valor posiciona es el valor que toma un dígito de acuerdo con la posición que ocupa dentro del número (unidades, decenas, centenas…)
/*parte = 1234/1000*/
inverso = inverso + (parte * valor_proposicional) en este caso el valor_proposicional sera la nueva posiciona que le estemos dando
/*inverso = 0 +(1 * 1)*/
y si repetimos el proceso iremos re posicionando los dígitos del numero
pero para ello tenemos que cambiar el valor de nuestro numero

Código:
num = num%valor_proposicional
/* num = 1234%1000
esto nos devolverá 234 que son los números que nos hace falta re posicionar
En línea

lohayne

Desconectado Desconectado

Mensajes: 8


Ver Perfil
Re: invertir el número entero
« Respuesta #4 en: 20 Abril 2018, 04:25 am »

funcionó usando el bucle,
pero necesito hacer usando el vector como pide el ejercicio, y no estoy consiguiendo
En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.495



Ver Perfil
Re: invertir el número entero
« Respuesta #5 en: 20 Abril 2018, 07:23 am »

Primero debes conseguir cuántos cifras componen el número. Si te dan 1000 este tiene 4 cifras, no 1000. Esto se con log10 y sumando 1: log10(1000)+1

Después creas un array de enteros de tantas cifras.

Después con el bucle que de NEBIRE y un índice vas dejando el número calculado al array.
En línea

while(is_alive(yourself)) {
    make_true(yourself, yourdreams);
}
lohayne

Desconectado Desconectado

Mensajes: 8


Ver Perfil
Re: invertir el número entero
« Respuesta #6 en: 21 Abril 2018, 02:14 am »

Hola amigos, Rehice mi código y creé una función para contar dígitos. Mi programa funcionó hasta 8 dígitos, después de eso, el número fue invertido pero falta el último dígito pero no sé si es semántica error o debido a variable int.
Código:
#include <stdio.h>
#include <stdlib.h>

// função para contar digitos
int contdigitos(int n);

int main() {
    int n,i;
    int *v;
    int nd=contdigitos(n);
    //como vetor é dinâmico ,usei a função malloc
 v =(int*) malloc (nd*sizeof(int));
printf("digite um numero:");
scanf("%i",&n);
for (i=0;i<nd;i++) {
    v[i]=n%10;
    n=n/10;

    printf("%i",v[i]);
    if (n<=0)
    break;}
    return 0;}

 int contdigitos(int n) {
    if (n < 10) {
    return 1;
    }
    int contador = 0;
    while (n > 0) {
        n /= 10;
        contador++;
    }
    return contador;
}
« Última modificación: 21 Abril 2018, 02:16 am por lohayne » En línea

Yuki

Desconectado Desconectado

Mensajes: 80


El error es una muestra de la incompetencia.


Ver Perfil WWW
Re: invertir el número entero
« Respuesta #7 en: 21 Abril 2018, 02:33 am »

No te entiendo la verdad, pero voy a dejar este código por acá...

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. char* strrev2(char *buff){
  6. int i; // Variable indice.
  7. int ln = strlen(buff); // Obtenemos la longitud del buffer (para optimizar reserva de memoria).
  8. char * ret = (char*)calloc(1,ln); // Almacenamos un buffer rellenado a cero.
  9. for(i=0;i<ln;i++){
  10. ret[i] = buff[(ln-1)-i]; // Rellenamos el buffer de retorno con los carácteres del argumento.
  11. /* Notese que en la línea anterior, la variable asignada incrementa el indice
  12.   Y la variable que retorna los carácteres lo decrementa.
  13.   el (ln-1) es para saltar el carácter nulo.*/
  14. }
  15. return ret;
  16. }
  17.  
  18. int main() {
  19. char * buff = (char*)calloc(1,300); // Declaramos un variable puntero de cadena y le establecemos un buffer amplio.
  20. char * buff2; // Declaramos el puntero que contendrá la cadena invertida.
  21. printf("Escriba un número:"); // Escribimos en consola.
  22. scanf("%s",buff); // Obtenemos lo que ingresó el usuario.
  23. buff2 = strrev2(buff); // invertimos la cadena que ingresó el usuario.
  24. printf(buff2); // La imprimimos en pantalla.
  25. free((void*)buff); // Liberamos el primer buffer.
  26. free((void*)buff2); // Liberamos el segundo buffer.
  27. return 0;
  28. }
En línea

engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.458



Ver Perfil
Re: invertir el número entero
« Respuesta #8 en: 21 Abril 2018, 02:43 am »

no entiendo la obsesión de hacerlo con for XD pero  puedes hacer

Código
  1. for (i=0;n>0;i++)


así el ciclo se rompe si n es 0 y puedes avanzar i al mismo tiempo

en contdigitos el if está de más, en general es redundante y puedes trabajar sin el


ya me di cuenta del error XD ejecutas contdigitos(n); antes de leer n... cuentas los digitos antes de leerlos XD
« Última modificación: 21 Abril 2018, 02:52 am por engel lex » En línea

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
Kenji-chan

Desconectado Desconectado

Mensajes: 104


Ver Perfil
Re: invertir el número entero
« Respuesta #9 en: 21 Abril 2018, 04:17 am »

este es el método que yo he utilizado

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int eleva10(int expo);
  5.  
  6. int main(int argc, char *argv[]) {
  7. int num, aux, digitos, i;
  8. int* inverso = NULL;
  9.  
  10. aux = 1;
  11. digitos = 1;
  12.  
  13. fprintf(stdout, "introduzca un numero: ");
  14. fscanf(stdin, "%d", &num);
  15.  
  16. while((aux*=10) < num) digitos++;
  17. inverso = (int*) malloc(digitos*sizeof(int));
  18.  
  19. aux = num;
  20. for(i=digitos; i>0; i--){
  21. inverso[i-1] = aux/eleva10(i);
  22. aux %= eleva10(i);
  23. }
  24.  
  25. for(i=0; i<digitos; i++){
  26. fprintf(stdout, "%d", inverso[i]);
  27. }
  28.  
  29. return 0;
  30. }
  31.  
  32. int eleva10(int expo){
  33. int ret = 1;
  34. if(expo == ret) return ret;
  35. for(int i=0; i<expo-1; i++) ret *= 10;
  36. return ret;
  37. }
  38.  

he creado la función int eleva10(int expo)porque la pow no me funciona bien XD
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Comprobar si un numero es entero
Programación Visual Basic
Neobius 6 30,111 Último mensaje 21 Abril 2006, 08:04 am
por Neobius
Invertir numero de coma flotante
Programación C/C++
jaguirred 5 1,559 Último mensaje 26 Febrero 2017, 22:01 pm
por engel lex
invertir un número con recursividad en java
Java
PleySu 9 14,860 Último mensaje 13 Marzo 2017, 00:38 am
por ivancea96
Ejercicio de invertir un numero en vb.net (algo incomprendido)
.NET (C#, VB.NET, ASP)
DSREY 8 6,480 Último mensaje 25 Junio 2017, 20:34 pm
por okik
Invertir un número dado
Programación C/C++
BortizF 3 1,727 Último mensaje 18 Octubre 2017, 16:20 pm
por BortizF
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines