A linguagem C é muito utilizada em cursos de Informática, principalmente nos primeiros semestres de curso. Muitas vezes nesse início nos sentimos com poucas ferramentas, então aqui vão algumas dicas de como melhorar seus códigos e também o resultado final das suas aplicações.
A biblioteca “stdbool.h” insere variáveis do tipo bool, que podem assumir o valor de “true” ou “false”. Embora não seja uma essencial para a programação, pois a linguagem C apresenta os conceitos de verdadeiro e falso como 1 ou 0, a biblioteca “stdbool.h” irá facilitar seu trabalho em separar o que é definitivamente um número e o que é uma condição de verdadeiro ou falso.
2 – Biblioteca iso646.h
Aproveitando a onda de deixar os valores booleanos em um “mais alto nível”, não posso deixar de comentar sobre a biblioteca “iso646.h”. Esta biblioteca permite utilizar os operadores lógicos escrevendo-os por extenso, facilitando tanto o entendimento quanto a escrita do código. Olhe abaixo um trecho de código e uma tabela com os operadores lógicos.
Embora já seja um comando muito popular entre as pessoas que já programam na linguagem C, esse comando acaba sendo muito útil para quem está começando, devido ao fato de deixar no console apenas a informação desejada, deixando os resultados dos seus programas muito mais interessantes.
A função “system( );” faz parte da biblioteca “stdlib.h”, ela basicamente irá aplicar comandos no console/terminal. O problema que enfrentamos é que os comandos de limpar o console serão diferentes para Windows e sistemas Unix! Para isso precisaremos utilizar o comando “system(“cls”);” para Windows e “system(“clear”);” para sistemas Unix. Então sempre saiba qual o sistema destino para a aplicação a ser desenvolvida. Mas caso queira superar esse problema, dê uma olhada no Item 5 deste artigo, sobre Diretivas de Compilação.
4 – Função Sleep( ) ou usleep( )
De maneira similar ao tópico anterior, as funções Sleep( ) e usleep( ), funcionam em sistemas operacionais diferentes, embora ambas apresentem a mesma funcionalidade: parar o tempo de execução. Mas com uma questão a mais, elas pertencem a bibliotecas diferentes. E novamente ressalto a possibilidade da utilização de Diretivas de Compilação no tópico seguinte, caso queira criar um código que funcione em ambos os sistemas operacionais.
Dessa vez vamos falar de uma de cada vez, primeiramente a função Sleep( ), isso mesmo, a letra S é maiúscula, ela funciona apenas em Windows e pertence a biblioteca “windows.h”, como parâmetro para a função deve-se passar um valor inteiro referente à quantidade de milissegundos que irá parar a execução do programa. Logo, caso eu execute o comando Sleep(500); o programa irá parar a sua execução durante meio segundo.
A outra função é a usleep( ), funcionando em sistemas Unix, a função está contida na biblioteca “unistd.h” e, diferente da função anterior, o valor inteiro informado como parâmetro da função indicará em microssegundos o tempo a ser parada a execução do programa, então se atente sempre a conversão de unidades. Portanto, caso eu execute usleep(500 *1000); o programa irá novamente parar a execução durante meio segundo, note que realizei uma multiplicação por 1000 para trabalhar com o tempo de micro para milissegundos.
Além do mais, a combinação das funções printf, Sleep e system(“cls”), ou suas respectivas versões para Linux, permite a criação de animações no terminal. Veja o exemplo.
5 – Diretivas de Compilação
Nos itens anteriores foi falado um pouco sobre o uso de diferentes códigos para diferentes sistemas operacionais, mas como driblar essa barreira? Como fazer um código que possa ser usado em ambos os sistemas? Simples, basta usarmos as diretivas de compilação.
Você já deve ter se perguntado em algum momento ao iniciar a programação em C o porquê de os includes e os defines terem uma sintaxe, ou ainda se você já estiver avançado criando novos projetos, o porquê de existirem alguns itens nos headers. Essas são as diretivas de compilação, não vamos entrar em muitos detalhes, vamos utilizar apenas a parte básica.
Primeiro vamos entender basicamente que as diretivas de compilação é tudo que irá rodar antes do código, ou seja, todas as inclusões de bibliotecas, definições de constantes, nessas diretivas não podemos utilizar variáveis, mas podemos fazer testes lógicos. Veja o exemplo abaixo, que criamos uma função para gerenciar as funções de sleep:
Nessa função temos a inclusão das diretivas de #ifdef que funciona da mesma maneira que um if, porém chega a constante (definição) do sistema operacional e assim por diante, repare que existe a necessidade do uso do #endif uma vez que não existem chaves para delimitar o fim do código em cada bloco. E repare que o uso é feito duas vezes, dentro e fora da função em questão.
Veja esse outro exemplo, onde aplicamos a mesma ideia dentro de uma função chamada “clear_screen” onde direcionamos a função a ser utilizada de acordo com o sistema operacional.