Programação em C

Material de Programação em C - Sumário

Clique nos tópicos listados abaixo para ir diretamente para o texto!

Estilos de Codificação

Prof. André Grégio


Um estilo de codificação estabelece algumas regras para escrever código que ajudam os desenvolvedores a organizar sua produção. É importante seguir um estilo para manter a clareza dos códigos escritos. A indústria em geral escolhe algum estilo de codificação apropriado para adotar, de forma a manter a consistência e facilitar o desenvolvimento conjunto de sistemas e programas complexos. O kernel do Linux tem um estilo de codificação bastante simples e específico que pode servir de exemplo para quem está aprendendo a programar em C. 


A seguir, são listadas as principais regras que o estilo de codificação do kernel do Linux [1] estabelece para programação em Linguagem C, adaptadas, quando oportuno, com regras do estilo de codificação do Google [2] (mais voltado para C++, mas ainda assim com regras aproveitáveis em C):


1. Indentação: Use TAB com comprimento de 8 caracteres para a indentação. Não use espaços para indentação.


if (condicao) {

minhaFuncao();

}


2. Linhas e Comprimento: Não se recomenda que cada linha de código ultrapasse 80 caracteres. Se uma linha de código parecer muito longa (veja a parte em negrito abaixo), é um bom indício de que a função esteja muito complexa e que você deve considerar refatorá-la (veremos isso futuramente).


for (int i = 0; i < conta; i++) {

var += umaFuncao(argumento1, argumento2, argumento3, arg4,

algum_argumento_funcao_ou_estrutura,

outro_argumento_grande, argumento7);


3. Comentários: Use comentários de forma que façam sentido. Eles devem explicar o "porquê" e não o "como". Comentários devem ser escritos antes do código a que se referem.


/* Calcula a média, assumindo que a soma não irá ultrapassar o limite do int e que o total seja diferente de zero */

int media = soma / total;

4. Espaçamento: Inclua um espaço depois de palavras-chave como "if", "switch", "case", "for", "do", "while". Não coloque espaços ao redor de operadores dentro de parênteses.


/* Correto */

if (a > b) {

}


/* Não recomendado */

if(a>b){

}


5. Chaves: As chaves de abertura para estruturas de controle ("if", "for", "while", etc.) devem ficar na mesma linha que a instrução. As chaves de fechamento devem começar uma linha nova. Funções tanto podem ter suas chaves de abertura na mesma linha (estilo de codificação do Google), quanto na próxima linha (estilo de codificação do kernel do Linux) no mesmo nível da indentação.


/* Correto */

if (a > b) {

fazAlgo();

}


/* Não recomendado */

if (a > b)

{

fazAlgo();

}


6. Nomeação de Variáveis: Prefira nomes de variáveis e funções em minúsculas. Você pode utilizar underscores (o caracter “_”) para separar palavras em nomes de variáveis, que é a chamada notação snake case. Você também pode utilizar a notação camel case, na qual a primeira palavra do nome da variável começa com letra minúscula e as demais são juntas, isto é, sem espaços ou qualquer outro separador, e iniciam com a primeira letra em maiúsculo. Mais informações sobre estilos de nomeação em [3]. De qualquer forma, escolha um estilo de nomeação e seja consistente ao longo de seu código.


/* Notação snake case */

int minha_variavel = 10;


/* Notação camel case */

int minhaVariavel = 10;



7. Operadores e Expressões: Adicione espaços ao redor dos operadores (exceto operadores de precedência). Não deixe espaços em branco no final das linhas.


/* Correto */

a = b + c;


/* Não recomendado */

a=b+c;


8. Estrutura de Programa: Cada programa deve ter um único propósito. Se houver várias tarefas a serem realizadas, elas devem ser divididas em funções. Um programa pode ser segmentado em várias bibliotecas. Veremos exemplos mais adiante no curso.


/* Em vez de fazer: */


int main() {

/* Código para ler dados */

/* Código para processar dados */

/* Código para mostrar dados processados */

}


/* Prefira estruturar melhor seu código: */


void lerDados() {

/* Código para ler dados */

}


void processarDados() {

/* Código para processar dados */

}


void mostrarResultados() {

/* Código para mostrar os dados processados */

}


int main() {

lerDados();

processarDados();

mostrarResultados();

}


9. Funções: Tente manter as funções pequenas e com um único propósito. Uma função que executa muitas tarefas diferentes é difícil de entender e manter.


/* Em vez de fazer uma função assim: */


void fazerTudoComMaisUmPouco() {

/* Código que faz muitas, mas muitas coisas diferentes */

}


/* Prefira compartimentalizar: */


void fazUmaCoisa() {

/* Código que faz apenas uma coisa */

}


void fazOutraCoisa() {

/* Código que faz somente outra coisa */

}


int main() {

fazUmaCoisa();

fazOutraCoisa();

}


10. Typedef: Não use typedef neste curso. Você poderá usá-lo mais para frente. Talvez você ainda não saiba o que é typedef, e nem deve se preocupar com isso neste momento. Aqui, você só utilizará structs (um tópico a ser discutido em aulas futuras) e elas não necessitarão de opacidade, pois todos os seus membros ou elementos serão diretamente acessíveis. Se você não entendeu nada do que está escrito nesse parágrafo (ainda!), apenas lembre-se: neste curso, NÃO USE typedef. Seu código ficará mais legível e possíveis usos futuros de typedef ficarão mais claros no momento certo.


IMPORTANTE: A legibilidade do código é fundamental. Outros programadores (ou você no futuro) devem ser capazes de entender o que seu código sem dificuldades. Quando estiver em dúvida, tente focar na clareza e simplicidade de seu código. Se um dia você for trabalhar na indústria como desenvolvedor, é altamente provável que um estilo de codificação deva ser seguido… =)


Referências

[1] https://www.kernel.org/doc/html/latest/process/coding-style.html

[2] https://google.github.io/styleguide/cppguide.html

[3] https://www.freecodecamp.org/news/snake-case-vs-camel-case-vs-pascal-case-vs-kebab-case-whats-the-difference/

Tutorial VIM

Prof. André Grégio


O “vim” é um editor de texto com a possibilidade de se fazer personalizações e que pode ser utilizado para desenvolvimento de programas. A seguir, apresenta-se alguns dos comandos básicos do vim.


Em um terminal, ao digitar somente vim, você irá entrar no editor de texto em modo comando. Isto significa que você não deve sair digitando texto diretamente, pois para fazer isso, deve colocar o editor vim em  modo de inserção. Como alternar entre os modos? Usando as teclas “:” (dois pontos), “ESC” e “i” (a letra i).


ATENÇÃO: nos comandos apresentados em cada modo do vim, não digite as aspas duplas (“)!


Modos do Vim:


Abrir e Fechar o Vim:


Movimentação no Vim (Modo Normal, acessível com ESC):


Edição de Texto (Modo Normal, acessível com ESC):


Pesquisa (Modo Normal, acessível com ESC):


Substituição (Modo Comando, acessível com “:”):


Gravação de Arquivos (Modo Comando, acessível com “:”):


Note que este não é um guia definitivo ou mesmo completo. O editor vim possui diversos recursos interessantes para o desenvolvimento de programas que estão descritos em tutoriais avançados, livros ou até mesmo no manual do vim (acessível internamente ao editor em modo comando ao se digitar “:help”)...

Básico de GCC

Prof. André Grégio


O gcc é um compilador de código aberto muito popular para a linguagem C, suportando também outras linguagens, como C++. Um compilador para C é um programa que transforma código escrito na linguagem de programação C em um programa que o seu computador consegue entender e executar. 


Quando você escreve um programa em C, você está essencialmente escrevendo instruções detalhadas que você quer que o computador execute. Porém, o computador não entende diretamente código escrito em C, mas um conjunto específico de instruções chamado código de máquina. Portanto, para que o computador seja capaz de executar seu programa escrito em C, o código C precisa ser traduzido para código de máquina. É aí que entra o compilador.


Um compilador como o GCC pega o seu código C, verifica se está tudo sintaticamente correto (ou seja, se segue todas as regras da linguagem C) e traduz as instruções para código de máquina. O resultado da compilação (tradução) é um arquivo binário, também chamado de executável, que pode ser executado no seu computador. Superficialmente, um compilador possui três tarefas principais feitas por analisadores:





Voltando ao GCC e pressupondo que você já está com seu ambiente para programação pronto, vamos compilar e executar um programa via linha de comando em três passos:



#include <stdio.h>


int main() {

    printf("Alô Mundo!\n");

    return 0;

}



$ gcc alomundo.c -o alomundo


O comando acima diz ao gcc para compilar o arquivo alomundo.c e gerar um executável chamado alomundo. A opção -o é usada para especificar o nome do arquivo de saída (output). Sem esta opção, o compilador gera por padrão um executável cujo nome é a.out.



$ ./alomundo


Se tudo correr bem, você verá a frase Alô Mundo! aparecer no seu terminal…


Algumas das flags mais usadas do gcc estão listadas abaixo, mas lembre-se: o manual é seu amigo! Digite man gcc no seu terminal para entender o ditado. ;-)


-o arquivo: Especifica o nome do arquivo de saída. Se você não usar esta opção, o gcc criará um arquivo chamado a.out por padrão.


-Wall: Habilita todos os alertas mais comuns do compilador (Warning all). Isso pode ajudar a identificar problemas potenciais no seu código.


-Wextra: Habilita alertas extras que não são ativados pelo -Wall.


-lm: Vincula a biblioteca de matemática (libm), necessária se você precisar usar funções matemáticas como sqrt (raiz quadrada) no seu código.


É possível combinar várias flags de compilação em um único comando do gcc. Por exemplo, o comando a seguir compila o arquivo codigo.c com todos os avisos de alerta habilitado, inclusive alertas extras, inclui a biblioteca de matemática e gera um arquivo de saída chamado programa:


gcc -Wall -Wextra codigo.c -o programa -lm



Meu primeiro código em C no VSCode!

Prof. André Grégio


Instalação de um IDE para programação no Linux


Este tutorial foi feito para o Linux Mint 21 e pode precisar de ajustes para outras versões do sistema operacional, principalmente as não baseadas em Debian.



Instalação do Visual Studio Code no Linux


O Visual Studio Code (VSCode) é um editor de código fonte criado pela Microsoft e disponibilizado gratuitamente. O editor não é necessário para a criação de programas, mas pode facilitar o desenvolvimento, principalmente para iniciantes.


Para sistemas baseados em Debian (como o Linux Mint), baixe o arquivo .deb (o botão grande do lado esquerdo da Figura 1).



Figura 1. Download do pacote .deb do VSCode no site oficial.



cd /home/SEU_USUARIO/Downloads


Depois, para instalar o VSCode, execute:


sudo dpkg -i [NOME_ARQUIVO].deb


Lembre-se de substituir [NOME_ARQUIVO] pelo nome do arquivo que você baixou. Veja um exemplo na Figura 2.

Figura 2 - Instalação do VSCode



Figura 3 - Aplicativo do VSCode no menu de início do Linux Mint



Figura 4 - Instalação de extensões para o VSCode (veja canto superior esquerdo).


Executando o primeiro programa no VSCode


Este tutorial tem o objetivo de introduzir o método de criação de projetos no VSCode, e serve tanto para sistemas Windows quanto Linux.



Figura 5 - Abertura de Pasta no VSCode.



Figura 6 - Auto-confiança é tudo! =P


Figura 7 - Criação de Novo Arquivo no VSCode no Diretório “Aula”



Figura 8 - Arquivo “teste.c” aberto para edição


Figura 9 - Um programa simples em C.



Figura 10 - Compile e execute seu código.