Dúvida na linguagem C

Bom dia a todos, tenho um trabalho da faculdade para fazer (Github do projeto), no qual tenho que criar uma fila de vacinação, o código (em grande parte) está pronto, porém tenho uma dúvida:

É possível criar uma tabela “dinâmica” em C? Porque caso testem o código com o seu nome, a não ser que seu nome tenha 5 letras, verá que a tabela ficará desconfigurada, gostaria de saber se tem como formatar para ficar melhor apresentável

Expectativa:

Realidade:

*Perdão caso meu código não seja um dos melhores, sou novato nesse ramo de Engenharia, e ainda vou implementar função de voltar para menu e afins…

3 curtidas

Se eu entendi sua pergunta bem, você quer que a tabela fique com o | garantidamente alinhado, certo?

Se o printf do C tiver essa função do printf do shell, pode fazer %LARGURAs (exemplo do shell):

$ printf '%16s|% 3d|%12s|\n' Mariana 24 Severo
         Mariana| 24|      Severo|
$ printf '%16s|% 3d|%12s|\n' Pedro 22 OK
           Pedro| 22|          OK|

Isso empurra o nome para a direita, mas é até onde eu sei.

1 curtida

Agradeço a resposta, o que eu queria não seria possível fazer em C, até porque queria que movesse tanto o ‘+’ quanto o ‘|’ sem contar os espaços, vou pesquisar mais sobre printf, mas sua resposta já foi de grande ajuda.

1 curtida

Sim, e é relativamente simples, o primeiro passo é dividir seu problema:

Basicamente isso acontece porque você usa uma quantidade fixa de espaços, se a tabela é dinâmica, a quantidade de espaços vazios deve ser dinâmica, então, no seu gerador temos isso:

printf("  | %d    | %s                |  %d   |         %d         |          %d         |\n",P.fase,P.nome,P.idade,P.profissao,P.comorbidades);

O ideal seria você fazer assim:

printf("  | %d    | %s%s |  %d   |         %d         |          %d         |\n",P.fase,P.nome,geradorEspacos(P.nome),P.idade,P.profissao,P.comorbidades);

A função geradora precisa de uma variável global, que representará os espaços, pode ser tipo:

char espacos[50] = "";

E o gerador seria algo assim, eu fiz um sketch:

char*geradorEspacos(char*nome){
    // Reinicia nosso gerador, é o equivalente em C de: 
    // espacos = "";
    espacos[0] = '\0';
    // 29 é a quantidade de espaços de uma margem da célula até a outra
    // Pra medir eu usei a seguinte tática:
    //
    //   1. Coloquei uma célula vazia contendo apenas os caracteres da 
    //      borda (||)
    //
    //   2. Preenchi a célula de espaços e contei quantos espaços deu:
    //      |                                   | = 35 espaços
    //
    //   3. Do valor obtido, descontei 3 espaços para a margem esquerda
    //      e 3 para a margem direita, resultando em 29
    for(int i = 0; i < 29-strlen(nome); i++) {  
        strcat(espacos, " "); 
    }  
    return espacos;
}

Como é um trabalho de faculdade seria desonesto se eu abrisse um PR, mas eu obtive o resultado desejado:

  +-----------------------------------+                                                                                       
  | Nomes                             |                                                                                       
  +-----------------------------------+                                                                                       
  |   Natanael                        |                                                                                       
  |   Pedro                           |                                                                                       
  +-----------------------------------+

Aqui o código que eu usei pra gerar essa tabela você pode acessar aqui

1 curtida

Solução no caso:

void ImprimePessoa(Pessoa P)
{
	printf("  | %d    | %-2d    | %d                 | %d                  | %-30s|\n",P.fase,P.idade,P.profissao,P.comorbidades,P.nome);
}

Basta colocar o “-” e o valor desejado, por exemplo, eu criei um char com tamanho 30, logo limitei no método que ele irá ocupar de qualquer maneira 30 caracteres, assim não foi perdido o formato da tabela.

Agradeço a ajuda de todos…

2 curtidas

Acho que o ideal é vc colocar o padding na formatação do printf. Se vc sabe que o campo tem 10 espaços disponíveis, coloque o quantificador respectivo em cada campo. Se há chance do conteúdo passar desse espaço, corte ele antes da impressão.

ex:
printf(" | %4d | %5d | %17s | %18d | %20s |", 200, 20, "Médico", "0", "João das neves");

Prefira sempre usar os recursos da própria linguagem de programação do que criar uma função para isso. Geralmente o código é muito mais otimizado.

Prefira também ler a documentação da linguagem de programação, pois lá há toda explicação das possibilidades da função. Por exemplo aqui explica que se vc quiser o texto alinhado à esquerda, deve colocar um - na especificação do formato.

Do jeito que foi solucionado, quando chegar na fase “10” vai desalinhar de novo…

3 curtidas