Bienvenidos sean a este post, hoy veremos como trabajar con printf y los numeros con signos.
En el post anterior vimos una breve explicacion sobre printf y los modificadores disponibles que podemos utilizar para formatear lo que queremos mostrar en pantalla, y en ese mismo post vimos como trabaja con enteros sin signo y en distintas bases, pero hoy nos centraremos en el mismo tipo de numero pero con signos, para ello vamos a crear un nuevo ejemplo y para eso crearemos un nuevo archivo que llamaremos ejemplo30.c y le agregaremos este codigo inicial:
ejemplo30.c
#include <stdio.h>
int main()
{
int entChico = 12;
int entGrande = 0x7fffffff;
int entNegativo = -entChico;
unsigned unoSinSigno = 130;
long long int entMuyGrande = 0x7ffffffffffffff;
}
Al igual que hicimos en el post anterior primero definiremos las variables que iremos utilizando con nuestro codigo, observen que vamos a tener algunas similares a las vistas en el post anterior pero ahora tambien tendremos dos mas grandes como son entGrande que sera una int32 en su maximo tamaño y entMuyGrande que sera una int64 en su tamaño maximo, comencemos a agregar el primer segmento de codigo despues del anterior:
printf("printf pero con signos\n");
printf("Nombre\tAlineado\tAlineado\tCompletado");
printf("\tMinimo\t\tMinimo\t\tLo que sea\n");
printf("\tderecha\t\tizquierda\tcero\t\tderecha\t\tizquierda\n");
printf("Modif.\t%%10d\t\t%%-10d\t\t%%-.10d");
printf("\t\t%%10.3d\t\t%%-10.3d\t\t%%d\n");
printf("\t[%10d]\t[%-10d]\t[%-.10d]\t[%10.3d]\t[%-10.3d]\t[%d]\n",
entChico, entChico, entChico, entChico, entChico, entChico);
printf("\t[%10d]\t[%-10d]\t[%-.10d]\t[%10.3d]\t[%-10.3d]\t[%d]\n",
entGrande, entGrande, entGrande, entGrande, entGrande, entGrande);
printf("\t[%10d]\t[%-10d]\t[%-.10d]\t[%10.3d]\t[%-10.3d]\t[%d]\n",
unoSinSigno, unoSinSigno, unoSinSigno,
unoSinSigno, unoSinSigno, unoSinSigno);
printf("\t[%10d]\t[%-10d]\t[%-.10d]\t[%10.3d]\t[%-10.3d]\t[%d]\n",
entNegativo, entNegativo, entNegativo,
entNegativo, entNegativo, entNegativo);
En este caso nuestras primeras cuatro lineas sera para identificar todo lo que mostraremos en pantalla, nos referimos a donde los ubicaremos, en las primeras dos columnas sera para el alineado, en el medio sera para completar con ceros los valores que pasemos y las siguientes dos columnas son para mostrar el minimo alineado a la derecha e izquierda y por ultimo solo mostraremos el valor pero con un modificador que tambien representa a un entero, equivale a %i por lo menos cuando lo usamos para la salida, despues mostraremos una identificacion del tipo de modificador que usaremos para mostrar el valor, las siguientes cuatro instrucciones son para mostrar cuatro de las variables que definimos anteriormente con todo lo comentado anteriormente, como son todas iguales vamos a tomar una de ejemplo para explicarla:
printf("\t[%10d]\t[%-10d]\t[%-.10d]\t[%10.3d]\t[%-10.3d]\t[%d]\n",
entChico, entChico, entChico, entChico, entChico, entChico);
En este caso volvemos a utilizar distintos tipos de modificadores pero no muy distintos, en el primero establecemos un tamaño de 10 elementos para mostrar y de tipo entero pero a diferencia de como vimos en el post anterior este representa que puede contener un signo y a su vez nos permite manipular enteros de 32 bits, en el tercer caso usamos el punto para indicarle que debe llenarlo de ceros hasta completar los digitos faltantes, en los siguientes dos casos volvemos a asignar 10 elementos para mostrar pero mediante el punto y el numero posterior le inidcamos que solamente mostrara tres, en este casi se aplica al entero de esta forma pero si fuera con decimales nos limitaria la cantidad de valores a mostrar despues de la coma, tambien con el formateador para mostrarlo a la izquierda y derecha respectivamente, todo esto lo volvemos a repetir en las siguientes lineas pero para algunas de las otras variables, compilemos y veamos como es su salida:
tinchicus@dbn001vrt:~/lenguajes/C$ ./prog/ejemplo30
printf pero con signos
Nombre Alineado Alineado Completado Minimo Minimo Lo que sea
derecha izquierda cero derecha izquierda
Modif. %10d %-10d %-.10d %10.3d %-10.3d %d
[ 12] [12 ] [0000000012] [ 012] [012 ] [12]
[2147483647] [2147483647] [2147483647] [2147483647] [2147483647] [2147483647]
[ 130] [130 ] [0000000130] [ 130] [130 ] [130]
[ -12] [-12 ] [-0000000012] [ -012] [-012 ] [-12]
tinchicus@dbn001vrt:~/lenguajes/C$
Si llegan a observar veran que para la mayoria de los casos los datos fueron manejados correctamente, salvo para entGrande, donde al igual que vimos en el post anterior con los modificadores que posee nos devuelve una representacion de un valor que posee el informado, como dijimos con esto cubrimos como minimo hasta los int32 pero que sucede con uno mas grande? para ver como manejarlo vamos a agregar el siguiente segmento de codigo:
printf("\nModif.\t%%20lld\t\t\t%%-20lld\t\t\t%%-.20lld\n");
printf("\t[%20lld]\t[%-20lld]\t[%-.20lld]\n",
entMuyGrande, entMuyGrande, entMuyGrande);
printf("\t%%20.3lld\t\t%%-20.3lld\t\t%%lld\n");
printf("\t[%20.3lld]\t[%-20.3lld]\t[%lld]\n",
entMuyGrande, entMuyGrande, entMuyGrande);
La primera la usaremos para los identificador los modifficadores, en este caso pasaremos veinte espacios pero la doble marca de la l para indicar que es long long y por lo tanto un int de 64 bits, despues mostraremos los resultados de esos modificadores con la variable esMuyGrande, la siguiente linea muestra los nuevos modificadores otra vez con el valor minimo de tres y del mismo tipo que el anterior, por ultimo tambien utilizamos al encargado de cambiar el orden de como se mostrara, tanto en la primera tanda como en la segunda, compilemos y veamos como es su salida:
...
Modif. %20lld %-20lld %-.20lld
[ 576460752303423487] [576460752303423487 ] [00576460752303423487]
%20.3lld %-20.3lld %lld
[ 576460752303423487] [576460752303423487 ] [576460752303423487]
tinchicus@dbn001vrt:~/lenguajes/C$
Tendremos la salida anterior seguida de la nueva del segmento que agregamos ahora, observen como trabaja de forma muy similar a lo visto en la salida anterior donde podremos ubicarlo del lado que necesitemos, asi como completar con ceros los elementos faltantes y como lo maneja a su manera cuando simplemente pasamos el valor con el modificador de tipo, pasemos a agregar el ultimo segmento de codigo:
printf("\nPotencias de 9: 9^1, 9^2, 9^3, 9^4\n");
int k = 9;
for(int i=0; i < 4; i++, k*=9)
{
printf("\t[%6d] [%-6d] [%-.6d] [%6.3d] [%-6.3d] [%d]\n",
k, k, k, k, k, k);
}
Aqui volvemos a repetir el bloque que vimos en el post anterior donde mostramos unas potencias sobre el numero 9, al igual que antes volvemos a establecer una variable con el valor de 9, despues por medio de un bucle for iremos haciendo las distintas potencias, para ello en cada pasada aplicaremos la operacion sobre la variable que definimos anteriormente, despues mostraremos todo lo mismo que hemos hecho anteriormente, y siempre utilizando el valor almacenado en k, compilemos y veamos como es su salida:
...
Potencias de 9: 9^1, 9^2, 9^3, 9^4
[ 9] [9 ] [000009] [ 009] [009 ] [9]
[ 81] [81 ] [000081] [ 081] [081 ] [81]
[ 729] [729 ] [000729] [ 729] [729 ] [729]
[ 6561] [6561 ] [006561] [ 6561] [6561 ] [6561]
tinchicus@dbn001vrt:~/lenguajes/C$
Como se observa volvimos a repetir las operaciones en las potencias que calculamos pero ahora tenemos distintas formas de ordenarlo asi como de presentarlo de acuerdo a nuestras necesidades, con todo esto comentado pasemos a ver el codigo final:
ejemplo30.c
#include <stdio.h>
int main()
{
int entChico = 12;
int entGrande = 0x7fffffff;
int entNegativo = -entChico;
unsigned unoSinSigno = 130;
long long int entMuyGrande = 0x7ffffffffffffff;
printf("printf pero con signos\n");
printf("Nombre\tAlineado\tAlineado\tCompletado");
printf("\tMinimo\t\tMinimo\t\tLo que sea\n");
printf("\tderecha\t\tizquierda\tcero\t\tderecha\t\tizquierda\n");
printf("Modif.\t%%10d\t\t%%-10d\t\t%%-.10d");
printf("\t\t%%10.3d\t\t%%-10.3d\t\t%%d\n");
printf("\t[%10d]\t[%-10d]\t[%-.10d]\t[%10.3d]\t[%-10.3d]\t[%d]\n",
entChico, entChico, entChico, entChico, entChico, entChico);
printf("\t[%10d]\t[%-10d]\t[%-.10d]\t[%10.3d]\t[%-10.3d]\t[%d]\n",
entGrande, entGrande, entGrande, entGrande, entGrande, entGrande);
printf("\t[%10d]\t[%-10d]\t[%-.10d]\t[%10.3d]\t[%-10.3d]\t[%d]\n",
unoSinSigno, unoSinSigno, unoSinSigno,
unoSinSigno, unoSinSigno, unoSinSigno);
printf("\t[%10d]\t[%-10d]\t[%-.10d]\t[%10.3d]\t[%-10.3d]\t[%d]\n",
entNegativo, entNegativo, entNegativo,
entNegativo, entNegativo, entNegativo);
printf("\nModif.\t%%20lld\t\t\t%%-20lld\t\t\t%%-.20lld\n");
printf("\t[%20lld]\t[%-20lld]\t[%-.20lld]\n",
entMuyGrande, entMuyGrande, entMuyGrande);
printf("\t%%20.3lld\t\t%%-20.3lld\t\t%%lld\n");
printf("\t[%20.3lld]\t[%-20.3lld]\t[%lld]\n",
entMuyGrande, entMuyGrande, entMuyGrande);
printf("\nPotencias de 9: 9^1, 9^2, 9^3, 9^4\n");
int k = 9;
for(int i=0; i < 4; i++, k*=9)
{
printf("\t[%6d] [%-6d] [%-.6d] [%6.3d] [%-6.3d] [%d]\n",
k, k, k, k, k, k);
}
}
Ahora les dejo como deberia ser la salida final del codigo:
tinchicus@dbn001vrt:~/lenguajes/C$ ./prog/ejemplo30
printf pero con signos
Nombre Alineado Alineado Completado Minimo Minimo Lo que sea
derecha izquierda cero derecha izquierda
Modif. %10d %-10d %-.10d %10.3d %-10.3d %d
[ 12] [12 ] [0000000012] [ 012] [012 ] [12]
[2147483647] [2147483647] [2147483647] [2147483647] [2147483647] [2147483647]
[ 130] [130 ] [0000000130] [ 130] [130 ] [130]
[ -12] [-12 ] [-0000000012] [ -012] [-012 ] [-12]
Modif. %20lld %-20lld %-.20lld
[ 576460752303423487] [576460752303423487 ] [00576460752303423487]
%20.3lld %-20.3lld %lld
[ 576460752303423487] [576460752303423487 ] [576460752303423487]
Potencias de 9: 9^1, 9^2, 9^3, 9^4
[ 9] [9 ] [000009] [ 009] [009 ] [9]
[ 81] [81 ] [000081] [ 081] [081 ] [81]
[ 729] [729 ] [000729] [ 729] [729 ] [729]
[ 6561] [6561 ] [006561] [ 6561] [6561 ] [6561]
tinchicus@dbn001vrt:~/lenguajes/C$
Hasta aca ya vimos como manejar numeros enteros sin signos en el post anterior y en este post como manejarlos cuando tienen signo a su vez como podemos alinearlos, darle un formato acorde a nuestras necesidades, en el proximo veremos como manejar numeros con decimales.
En resumen, hoy hemos visto nuevamente printf pero esta vez como manipular a los numeros enteros con signo, a su vez como podemos alinearlo de un lado o de otro, como tambien completar con los ceros necesarios y su vez como podemos dar una precision a nuestros numeros enteros, como a su vez tambien hemos visto como manejar valores mucho mas grandes, espero les haya sido de utilidad sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.


Donación
Es para mantenimento del sitio, gracias!
$1.50
