Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Justificar a la derecha

Estas en el tema de Justificar a la derecha en el foro de C/C++ en Foros del Web. Hola, Algo que me llama la atención ¿Como hacer un programa que justifique la salida de datos a la derecha usando printf() o cout? El ...
  #1 (permalink)  
Antiguo 02/06/2008, 07:55
 
Fecha de Ingreso: mayo-2008
Ubicación: Caracas
Mensajes: 35
Antigüedad: 16 años, 5 meses
Puntos: 1
Pregunta Justificar a la derecha

Hola,

Algo que me llama la atención

¿Como hacer un programa que justifique la salida de datos a la derecha usando printf() o cout?

El siguiente es un programa sencillo que crea dos vectores e imprime su suma. Ahí podrán ver como los datos se imprimen justificándose a la izquierda. Pero desearía que se justificasen a la izquierda.

Código:
#include <cstdlib>
#include <iostream>
#include <vector>

#define max 500000

using namespace std;

int main(int argc, char *argv[])
{
    vector<double> Datos(max); 
    vector<double> Grid(max); 
    
    for(int i=0; i<10; ++i)
    {
        for (int j=0; j<3; ++j)
        {
             Datos[i,j] = i;
             cout << "\t" << Datos[i,j];
        }
        cout << endl;
    }
    cout << endl;
    for(int i=0; i<10; ++i)
    {
        for (int j=0; j<3; ++j)
        {
             Grid[i,j] = -i;
             cout << "\t" << Grid[i,j];
        }
        cout << endl;
    }
    cout << endl;
    for(int i=0; i<10; ++i)
    {
        for (int j=0; j<3; ++j)
        {
             cout << "\t" << Grid[i,j]+Datos[i,j];
        }
        cout << endl;
    }
    cout << endl;
    
             
    system("PAUSE");
    return EXIT_SUCCESS;
}
Saludos y gracias :)
  #2 (permalink)  
Antiguo 02/06/2008, 17:16
 
Fecha de Ingreso: septiembre-2007
Mensajes: 52
Antigüedad: 17 años, 2 meses
Puntos: 2
Respuesta: Justificar a la derecha

Personalmente no programo mucho en C++, y no sé cómo manipular el formato de la salida con cout, pero puedo hablarte un poco sobre cómo hacerlo con printf().

El tema de las justificaciones depende directamente del espacio disponible (o que planeas usar) para imprimir tu texto. Por ejemplo, justificar a la derecha un mensaje en un espacio de 10 caracteres es diferente a justificar a la derecha un mensaje en un espacio de 20 caracteres, ¿cierto?

Pues bien, en tu ejemplo estás usando tabulaciones (\t) para separar las columnas, lo cual es una forma aceptable de organizar tus tablas de vectores, pero se presta para confusiones a la hora de controlar manualmente la justificación de las columnas. La razón es que las tabulaciones no producen una cantidad fija de espacios, sino que depende de la cantidad de caracteres que se han impreso hasta el momento, e imprime espacios hasta la siguiente columna que sea múltiplo de 8.

Espero no confundirte con esto, pero en realidad no es muy importante conocer los detalles de cómo trabajan las tabulaciones en algunas terminales de salida. Lo menciono porque entonces mi primera recomendación es que no uses tabulaciones, y en su lugar controles el espacio de cada columna manualmente.

Antes de continuar, aquí te muestro un ejemplo de cómo se podría justificar a la derecha tus números, planeando que cada columna tenga un ancho de 6 caracteres:

Código:
#include <cstdlib>
#include <iostream>
#include <vector>

#define max 500000

using namespace std;

int main(int argc, char *argv[])
{
    vector<double> Datos(max);
    vector<double> Grid(max);

    // Una cabecera para guiarnos sobre cómo se imprimen los vectores
    printf("%6s %6s %6s\n", "Col 1", "Col 2", "Col 3");
    printf("------ ------ ------\n");

    for(int i=0; i<10; ++i)
    {
        for (int j=0; j<3; ++j)
        {
             Datos[i,j] = i;
             printf("%6.0f ", Datos[i, j]);
        }
        cout << endl;
    }
    cout << endl;
    for(int i=0; i<10; ++i)
    {
        for (int j=0; j<3; ++j)
        {
             Grid[i,j] = -i;
             printf("%6.0f ", Grid[i, j]);
        }
        cout << endl;
    }
    cout << endl;
    for(int i=0; i<10; ++i)
    {
        for (int j=0; j<3; ++j)
        {
             printf("%6.0f ", Grid[i, j] + Datos[i, j]);
        }
        cout << endl;
    }
    cout << endl;

    system("PAUSE");
    return EXIT_SUCCESS;
}
Como te darás cuenta, el corazón del asunto está en el printf(), y el formato que se usa para imprimir los números:

Código:
printf("%6.0f ", Datos[i, j]);
El formato %6.0f quiere decir: imprima un número float o double hasta un máximo de 6 dígitos enteros, y con cero dígitos decimales. Con este formato, los números son justificados a la derecha en un espacio de 6 caracteres de forma predeterminada.

Puedes jugar un poco con ese formato para probar qué otro tipo de alternativas existen para imprimir tus números. Por ejemplo:

Código:
// Justificar a la izquierda
printf("%-6.0f ", Datos[i, j]);

// Imprimir con dos dígitos decimales
printf("%6.2f ", Datos[i, j]);

// Rellenar con ceros los espacios no usados de la columna
printf("%06.0f ", Datos[i, j]);
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:57.