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:
"i" entra no modo de inserção, permitindo que você comece a digitar seu texto;
"ESC" sai do modo de inserção e volta para o modo normal.
":" entra no modo de comando, onde você pode digitar comandos para, por exemplo, realizar substituição de caracteres.
Abrir e Fechar o Vim:
"vim <nome_do_arquivo>" a ser executado em um terminal, abre o arquivo chamado "nome_do_arquivo" no vim.
":q" sai do vim (quit).
":q!" sai do vim sem salvar as mudanças.
":wq" salva o arquivo e sai do vim (write and quit).
Movimentação no Vim (Modo Normal, acessível com ESC):
"0" (zero) move para o início da linha.
"$" move para o final da linha.
"gg" move para o início do arquivo.
"G" move para o final do arquivo.
"Ctrl + f" avança uma tela inteira (forward).
"Ctrl + b" retrocede uma tela inteira (backward).
Edição de Texto (Modo Normal, acessível com ESC):
"dd" exclui a linha atual; Ndd exclui N linhas (exemplo 4dd apaga quatro linhas contando com a do cursor).
"D" exclui do cursor até o final da linha.
"yy" copia a linha atual; Nyy copia N linhas a partir do cursor (exemplo 10yy copia dez linhas contando com a do cursor).
"o" insere uma linha na linha abaixo do cursor e muda o modo para modo de inserção.
"a" muda para o modo de inserção um caracter depois do cursor.
"A" muda para o modo de inserção ao final da linha do cursor, depois do último caracter da linha.
"p" cola o texto copiado depois do cursor.
"P" cola o texto copiado antes do cursor.
"u" desfaz a última ação.
"Ctrl + r" refaz a última ação.
Pesquisa (Modo Normal, acessível com ESC):
"/palavra" procura por "palavra" no documento. A barra “/” entra na funcionalidade de busca
"n" vai para a próxima ocorrência da palavra buscada (next).
"N" vai para a ocorrência anterior da palavra buscada.
Substituição (Modo Comando, acessível com “:”):
":%s/antigo/novo/g" substitui todas as ocorrências de "antigo" por "novo" no documento inteiro.
%s entra na funcionalidade de substituição
/ é usada para separar os termos da expressão de busca
O primeiro termo, no exemplo, a palavra “antigo”, é a palavra a ser procurada para substituição
O segundo termo, no exemplo, a palavra “novo”, é a palavra que substituirá a palavra a ser encontrada (se existir). Caso a palavra a ser substituída (“antigo”) não exista no texto, o vim mostrará um erro de padrão não encontrado.
O terceiro termo, “g”, diz à expressão de busca que a substituição de “antigo” por “novo” deve ser feita no texto inteiro, e não somente na primeira ocorrência.
Gravação de Arquivos (Modo Comando, acessível com “:”):
":w" salva o arquivo.
":w novo_nome" salva o arquivo como "novo_nome".
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:
Analisador Léxico: lê o código-fonte e divide-o em partes menores chamadas tokens, como variáveis, funções e operadores.
Analisador Sintático: verifica se os tokens gerados no passo anterior estão organizados de uma maneira que faça sentido de acordo com as regras da linguagem de programação (verificador gramatical).
Analisador Semântico: verifica se as instruções do programa fazem sentido em um dado contexto (por exemplo, se o programador tenta somar um número inteiro com uma palavra) e atribui significado a essas instruções.
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:
Crie um arquivo chamado alomundo.c com o seguinte conteúdo:
#include <stdio.h>
int main() {
printf("Alô Mundo!\n");
return 0;
}
Em um terminal do Linux, por exemplo, compile seu código da maneira mais básica possível com o seguinte comando (o sinal de cifrão, $, mostrado em um terminal shell, é também chamado de prompt e indica que você pode executar comandos; não se preocupe, veremos mais assuntos relacionados à shell no decorrer deste curso):
$ 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.
Após compilar o seu código no passo dois, você pode executá-lo com o seguinte comando, também escrito em um terminal:
$ ./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.
Baixe o VSCode do site oficial https://code.visualstudio.com
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.
Abra um terminal apontando para o mesmo diretório onde se encontra o arquivo .deb baixado. Se necessário, execute um comando para que o diretório de trabalho atual seja o mesmo onde se encontra o arquivo baixado.
Por exemplo, se você baixou o arquivo .deb dentro do diretório /home/SEU_USUARIO/Downloads, abra um terminal e execute o comando:
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
Encontre e abra o VSCode (exemplo na Figura 3).
Figura 3 - Aplicativo do VSCode no menu de início do Linux Mint
Caso queira instalar extensões no VSCode, acesse Arquivo -> Preferências -> Extensões (ou File -> Preferences -> Extensions, caso sua instalação esteja em inglês). Por exemplo, você pode instalar a extensão de emulação do VIM (um editor de texto em linha de comando muito popular), ou mesmo a de C (ver Figura 4).
Figura 4 - Instalação de extensões para o VSCode (veja canto superior esquerdo).
Agora prossiga para a continuação deste tutorial na próxima página, onde você irá fazer um programa simples em C chamado “Olá mundo” para testar se tudo está funcionando corretamente com seu VSCode… ;)
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.
No seu sistema operacional, crie um novo diretório vazio em algum local de sua preferência. Essa pasta vai conter os arquivos do seu programa.
Abra o VSCode e vá em Arquivo -> Abrir Pasta e abra a pasta/diretório que você acabou de criar (Figura 5).
Figura 5 - Abertura de Pasta no VSCode.
Se for perguntado se você confia nos autores, marque a caixa “Confiar nos autores … ”, e depois clique em “Sim, confio nos autores” (Figura 6). Espera-se que, como foi você que criou a pasta/diretório, o autor seja confiável. Em caso de falta de confiança em si próprio, procure ajuda profissional.
Figura 6 - Auto-confiança é tudo! =P
Na parte lateral esquerda do VSCode, clique no Botão Novo Arquivo (ver Figura 7).
Figura 7 - Criação de Novo Arquivo no VSCode no Diretório “Aula”
Chame o novo arquivo de teste.c.
Certifique-se de que você está editando o arquivo teste.c. Para isso, você pode clicar duas vezes no arquivo na lateral esquerda do VSCode, ou ainda verificar se a aba aberta para edição no VSCode se refere a esse arquivo (veja Figura 8).
Figura 8 - Arquivo “teste.c” aberto para edição
Escreva o código visto na Figura 9. Discutiremos em classe cada uma das linhas.
Figura 9 - Um programa simples em C.
Salve seu código e o compile. Clique no botão Run C/C++ File (ícone de “PLAY” no canto superior direito da janela do VSCode, conforme Figura 10).
Figura 10 - Compile e execute seu código.
Observe a porção inferior da Figura 10. Uma aba chamada Terminal foi aberta na parte inferior do VSCode, na qual pode-se executar comandos do Linux e, inclusive, o programa compilado a partir do seu código (com ./<NOME_DO_EXECUTÁVEL>). No caso, foi digitado ./teste e o resultado foi a impressão do texto na tela, de acordo com o esperado pelo seu programa.
Parabéns, você executou o seu primeiro programa em linguagem C com sucesso!