Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: erest0r en 6 Septiembre 2013, 06:20 am



Título: Mostrar ceros a la izquierda en un entero en C++
Publicado por: erest0r en 6 Septiembre 2013, 06:20 am
Buenas noches mi problema es que no encuentro como hacer para que un entero muestre n cantidad de ceros (0) a la izquierda, lo mas que he encontrado es de la cabecera <iomanip>, setfill(); setw(); pero setfill() recibe como parametro un char, y queria saber si existia algo parecido como setprecision(); fixed;  pero para el lado izquierdo de los enteros.

Les dejare mi codigo para que vean mejor a que me refiero

Código:
#include <iostream>

using namespace std;

int main( int argc, char* args[] )
{
    int numero, digito[4], temp, i, numerocifrado;
    cout << "Ingrese un numero de 4 digitos: ";
    cin >> numero;

    // Obtenemos cada digito por separado
    digito[0] = numero / 1000;
    digito[1] = ( numero % 1000 ) / 100;
    digito[2] = (( numero % 1000 ) % 100 ) / 10;
    digito[3] = (( numero % 1000 ) % 100 ) % 10;

    // Codificamos cada digito
    digito[0] = ( digito[0] + 7 ) %10;
    digito[1] = ( digito[1] + 7 ) % 10;
    digito[2] = ( digito[2] + 7 ) % 10;
    digito[3] = ( digito[3] + 7 ) % 10;

    // Intercambiamos las posiciones de cada digito

    // El primer digito con el tercero
    temp = digito[0];
    digito[0] = digito[2];
    digito[2] = temp;

    // Y el segundo digito con el cuarto
    temp = digito[1];
    digito[1] = digito[3];
    digito[3] = temp;

    // Pasamos los valores segun la posicion de la variable digito[] a numerocifrado
    numerocifrado = ( digito[0] * 1000 ) + ( digito[1] * 100 ) + ( digito[2] * 10 ) + digito[3];

    // Mostramos el numero cifrado
    cout << "Numero original: " << numero << endl
         << "Numero cifrado:  " << numerocifrado << endl;

   

    cin.get();
return 0;
}


Si introducen el numero 1234, deberia mostrar 0189, pero solo muestra 189, a eso me estoy refiriendo, ¿Como mostrar ese cero a la izquierda faltante?

Muchas gracias.


Título: Re: Mostrar ceros a la izquierda en un entero en C++
Publicado por: eferion en 6 Septiembre 2013, 07:23 am
El ejemplo que te pongo a continuación debería imprimir 00025

Código
  1. cout << setfill('0') << setw(5) << 25;

* setfill configura el caracter de relleno.
* setw configura la longitud en caracteres de los valores que se pasen a continuación.


Título: Re: Mostrar ceros a la izquierda en un entero en C++
Publicado por: erest0r en 6 Septiembre 2013, 07:40 am
De esa forma ya la habia hecho, pense que existia otra solucion, gracias.


Título: Re: Mostrar ceros a la izquierda en un entero en C++
Publicado por: Stereo en 6 Septiembre 2013, 11:37 am
También:

Código
  1. printf("%02d", 1);


Título: Re: Mostrar ceros a la izquierda en un entero en C++
Publicado por: eferion en 6 Septiembre 2013, 11:57 am
También:

Código
  1. printf("%02d", 1);

Eso no es c++


Título: Re: Mostrar ceros a la izquierda en un entero en C++
Publicado por: Eternal Idol en 6 Septiembre 2013, 12:34 pm
C++ es un mejor C como indica su nombre y la biblioteca cstdio (propia de C++ y no de C) declara la funcion de estilo C printf.


Título: Re: Mostrar ceros a la izquierda en un entero en C++
Publicado por: ecfisa en 6 Septiembre 2013, 12:36 pm
Hola erest0r.

Citar
...lo mas que he encontrado es de la cabecera <iomanip>, setfill(); setw(); pero setfill() recibe como parametro un char, y queria saber si existia algo parecido como setprecision(); fixed;  pero para el lado izquierdo de los enteros.

Es que numéricamente no tiene ningún sentido usar ceros a la izquierda. Es decir, si es a efectos de presentación, tratá el valor como una secuencia de caracteres.

Saludos. :)




Título: Re: Mostrar ceros a la izquierda en un entero en C++
Publicado por: eferion en 6 Septiembre 2013, 12:42 pm
C++ es un mejor C como indica su nombre y la biblioteca cstdio (propia de C++ y no de C) declara la funcion de estilo C printf.

Lo se, pero si estás haciendo prácticas en c++... céntrate en programar c++.

printf, aunque sea algo perfectamente válido en c++, es c.

A mi me ha venido gente diciendo que sabía programar en c++ sólo porque mezclaban algunas instancias de string en código c puro... eso le duela a quien le duela no es programar en c++.


Título: Re: Mostrar ceros a la izquierda en un entero en C++
Publicado por: Eternal Idol en 6 Septiembre 2013, 13:01 pm
En fin, cualquier codigo que no compile en C no es C y cualquier codigo que compile en C++ lo es. Guste o no C++ es un lenguaje multiparadigma y muy versatil.


Título: Re: Mostrar ceros a la izquierda en un entero en C++
Publicado por: eferion en 6 Septiembre 2013, 13:09 pm
En fin, cualquier codigo que no compile en C no es C y cualquier codigo que compile en C++ lo es. Guste o no C++ es un lenguaje multiparadigma y muy versatil.

Ya, pero si no aprovechas las características que diferencian c++ de c... estás programando realmente en c.

Código
  1. void main( )
  2. {
  3.  printf ( "Programa en C\n" );
  4. }

Código
  1. void main( )
  2. {
  3.  printf( "Programa en C++\n" );
  4. }

Realmente el segundo ejemplo es programar en c++??? el compilador te generará un ejecutable válido... está claro, pero eso no es c++. El estándar aceptó en su momento todas las librerías de c entre otras cosas para facilitar la migración del código... fuera de eso no tiene sentido porque entonces te encuentras con que es el único estándar que tiene la mitad de su biblioteca con funciones duplicadas.


Título: Re: Mostrar ceros a la izquierda en un entero en C++
Publicado por: Eternal Idol en 6 Septiembre 2013, 13:37 pm
No siempre ni necesariamente, por algo C++ es multiparadigma, obviamente si no usas POO ni programacion generica (ni funcional desde C++11; tanto C como C++ siguiron evolucionando desde que surgio C con clases) estas desaprovechando la potencia de C++ pero es fundamental comprender que algo que no compila en C no es C independientemente de lo que haga y como lo haga.


Título: Re: Mostrar ceros a la izquierda en un entero en C++
Publicado por: eferion en 6 Septiembre 2013, 13:41 pm
Lo se, precisamente por eso, si alguien está aprendiendo y quiere hacerlo con c++, lo más lógico es que intente solucionar la tarea usando las características exclusivas de c++... porque si no, realmente, no estás aprendiendo c++.

No creo que haya muchos exámenes serios de universidad en los que aparezcan printf, scanf, strlen, etc.


Título: Re: Mostrar ceros a la izquierda en un entero en C++
Publicado por: Eternal Idol en 6 Septiembre 2013, 13:58 pm
Sinceramente desconozco los motivos de la creacion del hilo. Igual si quiere aprender C++ el autor del hilo le recomiendo The C++ Programming Language de Bjarne Stroustrup.

¿Y tenes una idea aproximada de cuantas millones de lineas de codigo C++ llamando a esas funciones hay?


Título: Re: Mostrar ceros a la izquierda en un entero en C++
Publicado por: eferion en 6 Septiembre 2013, 14:00 pm
No tengo ni idea, pero en el proyecto en el que estoy que tiene 13 millones de líneas... no hay ni una sola.


Título: Re: Mostrar ceros a la izquierda en un entero en C++
Publicado por: Eternal Idol en 6 Septiembre 2013, 14:05 pm
¿Y es un una universidad seria o tambien participan de esos que mezclan algunas instancias de string en código c puro ?


Título: Re: Mostrar ceros a la izquierda en un entero en C++
Publicado por: eferion en 6 Septiembre 2013, 14:12 pm
¿Y es un una universidad seria o tambien participan de esos que mezclan algunas instancias de string en código c puro ?

En mi caso es una empresa privada y no, el código c puro esta prohibido salvo por razones de fuerza mayor... y desde que se migró el código desde fortran hace una década no se han dado motivos para ello.


Título: Re: Mostrar ceros a la izquierda en un entero en C++
Publicado por: amchacon en 6 Septiembre 2013, 14:41 pm
¿Y tenes una idea aproximada de cuantas millones de lineas de codigo C++ llamando a esas funciones hay?
Pues porque lo programaría un paleto... (o un vago que no quería portar todo el código).

Es absurdo usar funciones de C cuando C++ también tiene y bastantes más completas (y más fáciles de manipular entre ellas).


Título: Re: Mostrar ceros a la izquierda en un entero en C++
Publicado por: Eternal Idol en 6 Septiembre 2013, 14:59 pm
Pues porque lo programaría un paleto... (o un vago que no quería portar todo el código).

Es absurdo usar funciones de C cuando C++ también tiene y bastantes más completas (y más fáciles de manipular entre ellas).

Si, por suerte el codigo heredado es solo un recuerdo del pasado con el que nadie se topa jamas. Y obviamente eso tambien es cierto, todos los que alguna vez hemos llamado a una de esas funciones somos unos idiotas sin remedio, vagos y paletos.

Por ejemplo vi como alguien uso wcslen para procesar las multiples cadenas devueltas por SetupDiGetDeviceRegistryProperty(W) y empujarlas en un vector de wstring. ¿Increible, no?


Título: Re: Mostrar ceros a la izquierda en un entero en C++
Publicado por: amchacon en 6 Septiembre 2013, 15:19 pm
Por ejemplo vi como alguien uso wcslen para procesar las multiples cadenas devueltas por SetupDiGetDeviceRegistryProperty(W) y empujarlas en un vector de wstring. ¿Increible, no?
Estamos hablando de la librería estándar *_*

Las Windows API están hechas en C, de modo que si quieres usarlas no tienes más remedio que mezclar lenguajes. Lo cual me irrita un poco por la política que tiene Windows con el C++.

Muchas de las librerías de terceros actuales tienen ya una versión en C++.


Título: Re: Mostrar ceros a la izquierda en un entero en C++
Publicado por: Eternal Idol en 6 Septiembre 2013, 15:23 pm
http://foro.elhacker.net/programacion_cc/error_al_comparar_cadenas-t381725.0.html;msg1822249#msg1822249

Un abrazo.



Hola, disculpen la tardanza, bueno el motivo por el cual pensaba que el programa podria guardar un numero de esa forma, era porque despues tenia que hacer otro programa que decodificara ese numero, entonces el usuario al colocar un numero con alguna cantidad de cero a la izquierda el programa solo reconoceria desde donde haya uno distinto a cero, aunque pense que tendria que leerlo como string para poder solucionarlo... Bueno ahora si creo que no hay nada mas que decir,  :)  buen dia.