Justificar correctamente a produção em C++

Jinku Hu 12 outubro 2023
  1. Utilizar std::right e std::setw para Right Justify Output in C++
  2. Utilize a função printf para justificar a saída em C++
Justificar correctamente a produção em C++

Este artigo irá demonstrar múltiplos métodos sobre como justificar correctamente o fluxo de saída em C++.

Utilizar std::right e std::setw para Right Justify Output in C++

A biblioteca padrão C++ fornece funções de ajuda do manipulador de E/S para controlar melhor os fluxos quando utilizado com operadores << >>, e estão incluídos no ficheiro de cabeçalho <iomanip>. O std::right é um dos manipuladores de fluxo que define a posição dos caracteres de preenchimento. Assim, deve ser utilizado em conjunto com a função manipuladora std::setw, que é utilizada para definir a largura do fluxo. std::setw toma um único número inteiro como argumento para especificar o número de caracteres a atribuir para a largura do fluxo.

No próximo exemplo de código, inicializamos um vector de double com valores arbitrários que têm uma precisão diferente e depois emitimos todos eles como justificado no lado direito da consola.

#include <iomanip>
#include <iostream>
#include <vector>

using std::cout;
using std::endl;
using std::fixed;
using std::right;
using std::setw;
using std::vector;

int main() {
  vector<double> d_vec = {123.231,       2.2343, 0.324,     0.012,
                          26.9491092019, 11013,  92.001112, 0.000000234};

  for (auto &i : d_vec) {
    cout << right << setw(20) << fixed << i << endl;
  }
  cout << endl;

  return EXIT_SUCCESS;
}

Resultado:

  123.231000
    2.234300
    0.324000
    0.012000
   26.949109
11013.000000
   92.001112
    0.000000

Utilize a função printf para justificar a saída em C++

Outra função poderosa para lidar com a formatação I/O é printf. Embora o printf não seja utilizado com fluxos de cin/cout, pode formatar argumentos variáveis separadamente. Note-se que utilizamos o especificador de formato %f para os valores de ponto flutuante, e utilizamos um número arbitrário 20 para adicionar caracteres de preenchimento a cada elemento. Como resultado, cada linha tem 20 caracteres de largura, e uma vez que o número é positivo, os caracteres de preenchimento são anexados a partir da esquerda.

#include <iomanip>
#include <iostream>
#include <vector>

using std::cout;
using std::endl;
using std::fixed;
using std::right;
using std::setw;
using std::vector;

int main() {
  vector<double> d_vec = {123.231,       2.2343, 0.324,     0.012,
                          26.9491092019, 11013,  92.001112, 0.000000234};

  for (auto &i : d_vec) {
    printf("%20f\n", i);
  }

  return EXIT_SUCCESS;
}

Resultado:

  123.231000
    2.234300
    0.324000
    0.012000
   26.949109
11013.000000
   92.001112
    0.000000

Em alternativa, podemos inserir um inteiro negativo no especificador de formato para preencher caracteres do lado direito, justificando a saída à esquerda. Outra característica poderosa do printf é a formatação de valores literais de string, como demonstrado no seguinte código de amostra. Note-se que %c é o especificador de formato char, e o valor 0x20 é hexadecimal para um caractere de espaço.

#include <iomanip>
#include <iostream>
#include <vector>

using std::cout;
using std::endl;
using std::fixed;
using std::right;
using std::setw;
using std::vector;

int main() {
  vector<double> d_vec = {123.231,       2.2343, 0.324,     0.012,
                          26.9491092019, 11013,  92.001112, 0.000000234};

  for (auto &i : d_vec) {
    printf("%-20f\n", i);
  }

  printf("%60s\n", "this ought to be justified right");
  printf("%-20s|%20c|%20s\n", "wandering", 0x20, "the tower");

  return EXIT_SUCCESS;
}

Resultado:

123.231000          
2.234300            
0.324000            
0.012000            
26.949109           
11013.000000      
92.001112           
0.000000            
                            this ought to be justified right

wandering           |                    |           the tower
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Artigo relacionado - C++ IO