A linguagem C é uma das mais importantes e influentes da história da computação. Além disso, mesmo tendo sido criada na década de 1970, ela continua amplamente utilizada, servindo, inclusive, como base para muitas outras linguagens modernas, como C++, Java e até Python. Por esse motivo, compreender a estrutura de um programa em C é fundamental não apenas para quem deseja aprender essa linguagem, mas também para quem quer dominar os princípios essenciais da programação.
Por que a linguagem C é importante ?
Aprender a estrutura de um programa em C é importante porque ela ajuda o programador a entender como o computador executa instruções de forma organizada e eficiente. A linguagem C se comunica diretamente com o hardware por meio de instruções de baixo nível, mas ainda mantém características de uma linguagem de alto nível. Assim, o estudo da linguagem ensina conceitos essenciais, como tipos de dados, funções, controle de fluxo e manipulação de memória.
Além disso, muitos sistemas operacionais, compiladores e softwares de alto desempenho são escritos em C. Portanto, compreender como um programa em C é estruturado fornece uma base sólida para entender como as máquinas realmente funcionam e como o software se conecta ao hardware.
Estrutura de um programa em C
Um programa em C segue uma estrutura simples, porém lógica. Ele normalmente é composto por quatro partes principais: bibliotecas, funções, variáveis e instruções. A espinha dorsal de qualquer programa é a função principal, chamada main(), pois é nela que a execução realmente começa. Vejamos o exemplo abaixo.
#include <stdio.h>
int main() {
printf("Olá, mundo!\n");
return 0;
}
Esse é o exemplo clássico do “Olá, mundo!” e, por isso, costuma ser o primeiro programa que a maioria dos alunos escreve ao aprender qualquer linguagem de programação.
Inclusão de bibliotecas
A primeira linha do programa utiliza #include <stdio.h>. Ela indica ao compilador que deve incluir o conteúdo da biblioteca padrão de entrada e saída, responsável por funções como printf() e scanf(). O uso do símbolo # mostra que se trata de uma diretiva de pré-processamento, ou seja, algo que é executado antes mesmo da compilação.
Sem bibliotecas, o C seria bem limitado, pois grande parte das suas funcionalidades vem dessas coleções de funções prontas. Existem várias bibliotecas disponíveis, como math.h (para funções matemáticas), string.h (para manipulação de strings) e stdlib.h (para gerenciamento de memória e utilidades diversas).
A função principal main
Todo programa em C deve conter uma função chamada main. É nela que a execução começa.
Assim quando o sistema operacional carrega o programa na memória, ele procura essa função para saber onde iniciar.
A função main pode ser escrita de duas formas válidas
int main() { ... }
int main(void) { ... }
Ambas são equivalentes na maioria dos casos.
Declarando variáveis
Dentro de main(), podemos criar variáveis para armazenar informações da seguinte forma
int idade = 25;
float altura = 1.75;
char inicial = 'M';
As variáveis precisam ser declaradas com um tipo (como int, float, char, etc.). Uma das características do C é que o tipo deve ser conhecido no momento da compilação, pois o compilador precisa saber quanto espaço reservar na memória.
Comandos e instruções
O corpo de uma função em C é formado por comandos e instruções que são executados linha a linha. Além disso, cada instrução precisa terminar com ponto e vírgula (;), o que é obrigatório e ajuda o compilador a identificar onde um comando termina. Para ilustrar, abaixo temos um exemplo de soma de dois valores.
int x = 10;
int y = 20;
int soma = x + y;
printf("A soma é: %d\n", soma);
Estruturas de controle
As estruturas de controle são elementos fundamentais em C, pois permitem alterar o fluxo de execução de um programa, ou seja, decidir quais instruções serão executadas e quantas vezes. Sem elas, o código seguiria sempre uma sequência linear, de cima para baixo, o que limitaria sua utilidade. Podemos dividir essas estruturas em dois grandes grupos: estruturas condicionais e estruturas de repetição.
Estruturas condicionais
Existem três principais estruturas condicionais: if, else e switch. Além disso, as duas primeiras, dependendo do problema a ser solucionado, costumam trabalhar juntas.
O IF ELSE e ELSE IF
As estruturas condicionais, como if, else if e else, permitem que o programa execute blocos de código diferentes conforme certas condições sejam verdadeiras ou falsas.
int nota = 7;
if (nota >= 6) {
printf("Aprovado!\n");
} else {
printf("Reprovado!\n");
}
Nesse trecho, primeiramente, o programa verifica se a variável nota é maior ou igual a 6. Se isso acontecer, a mensagem exibida será “Aprovado!”. Caso contrário, o sistema imprime “Reprovado!”.
O comando SWITCH
A estrutura switch, usada quando há várias condições possíveis para um mesmo valor. Veja!
int opcao = 2;
switch (opcao) {
case 1:
printf("Opção 1 selecionada\n");
break;
case 2:
printf("Opção 2 selecionada\n");
break;
default:
printf("Opção inválida\n");
}
O switch compara o valor de opcao com cada case. Em seguida, quando encontra uma correspondência, executa o bloco correspondente. Além disso, o comando break evita que o programa continue executando os casos seguintes.
Estruturas de repetição
As estruturas de repetição, ou laços, permitem executar um mesmo bloco de código várias vezes, até que uma condição seja satisfeita.
O comando FOR
O comando for é bastante utilizado quando o número de repetições é conhecido. Por exemplo, no trecho abaixo, a variável i inicia em 1 e é incrementada até chegar a 5. Como resultado, o programa imprime os números de 1 a 5 na tela.
for (int i = 1; i <= 5; i++) {
printf("Contagem: %d\n", i);
}
O comando WHILE
O laço while repete um bloco enquanto uma condição for verdadeira. No exemplo apresentado abaixo note que enquanto o contador for menor que 3 uma mensagem é mostrada na tela após isso, o programa encerra.
int contador = 0;
while (contador < 3) {
printf("Repetição %d\n", contador);
contador++;
}
Essas estruturas dão poder e flexibilidade à linguagem, permitindo que programas realizem tomadas de decisão, percorram dados, processem listas e executem tarefas complexas de forma controlada e eficiente.
Comentários de código
Os comentários não são executados. Servem para explicar o código, tornando-o mais legível. Existem duas formas de adicionar comentários.
// Comentário de linha única
/*
Comentário de múltiplas linhas
*/
Dessa maneira, usar comentários de forma inteligente é uma boa prática, especialmente em códigos mais longos e complexos.
Como fazer uma calculadora em C
Diante do conteúdo apresentado até aqui, vamos entender como fazer uma calculadora usando esses conceitos. Para isso, desenvolveremos uma calculadora em linguagem C que será capaz de realizar as quatro operações básicas: adição, subtração, multiplicação e divisão.
Vamos então definir a estrutura principal junto com o menu que será mostrado ao usuário.
#include <stdio.h>
int main(){
int opcao;
float resultado, num1, num2;
//MENU CALCULADORA
printf("=====CALCULADORA====\n");
printf("1 - Soma\n");
printf("2 - Subtracao\n");
printf("3 - Multiplicacao\n");
printf("4 - Divisao\n");
printf("0 - Sair\n");
printf("Escolha uma opcao: ");
scanf("%d", &opcao);
}
O trecho apresentado acima, inicia com a função main que atua como o ponto de entrada da execução, começando pela alocação de memória através da declaração de variáveis: um inteiro (opcao) destinado ao controle de fluxo do menu e variáveis de ponto flutuante (num1, num2, resultado) para processar operações aritméticas com precisão decimal. Além da definição de dados, a função constrói a camada de interação visual utilizando múltiplos comandos printf para exibir um menu textual hierarquizado, que orienta o usuário sobre as funcionalidades disponíveis (subtração, multiplicação, divisão e saída).
O bloco se encerra com a instrução scanf, que suspende a execução para capturar a entrada do teclado e armazená-la na variável opcao, preparando o estado do programa para as estruturas de decisão lógica que serão implementadas na sequência.
Verifica se a opcão é válida
O próximo passo é ler os valores que o usuário vai digitar para realização do cálculo, porém, só faz sentido ler se o valor armazenado na variável opcao for diferente de 0. Nesse sentido, iremos adicionar um bloco condicional para verificar isso e, se o valor armazenado em opcao estiver entre 1 a 4 então seguiremos com a leitura dos números. Abaixo podemos verificar como ficará.
#include <stdio.h>
int main(){
int opcao;
float resultado, num1, num2;
//MENU CALCULADORA
printf("=====CALCULADORA====\n");
printf("1 - Soma\n");
printf("2 - Subtracao\n");
printf("3 - Multiplicacao\n");
printf("4 - Divisao\n");
printf("0 - Sair\n");
printf("Escolha uma opcao: ");
scanf("%d", &opcao);
if(opcao!=0){
printf("Digite o primeiro numero: ");
scanf("%f", &num1);
printf("Digite o segundo numero: ");
scanf("%f", &num2);
}
}
Note que, essa condicional vai verificar se o valor selecionado pelo usuário é algumas das operações apresentadas no menu, se for ele lê dois valores pois esses serão parte da operação aritmética que será feita. Caso contrário ele não lê pois certamente o usuário digitou zero e quer finalizar o programa.
Implementando a lógica de operações
O objetivo agora é implementar uma estrutura que reconheça qual operação o usuário quer fazer e pegue os valores armazenados nas variáveis num1 e num2 e aplique a operação em cima deles armazenando o valor na variável resultado. Para isso, utilizaremos a estrutura condicional switch.
#include <stdio.h>
int main(){
int opcao;
float resultado, num1, num2;
//MENU CALCULADORA
printf("=====CALCULADORA====\n");
printf("1 - Soma\n");
printf("2 - Subtracao\n");
printf("3 - Multiplicacao\n");
printf("4 - Divisao\n");
printf("0 - Sair\n");
printf("Escolha uma opcao: ");
scanf("%d", &opcao);
if(opcao!=0){
printf("Digite o primeiro numero: ");
scanf("%f", &num1);
printf("Digite o segundo numero: ");
scanf("%f", &num2);
}
switch(opcao){
case 1:
resultado = num1 + num2;
printf("O resultado do calculo e: %.2f\n", resultado);
break;
case 2:
resultado = num1 - num2;
printf("O resultado do calculo e: %.2f\n", resultado);
break;
case 3:
resultado = num1 * num2;
printf("O resultado do calculo e: %.2f\n", resultado);
break;
case 4:
if(num2 !=0){
resultado = num1 / num2;
printf("O resultado do calculo e: %.2f\n", resultado);
}else{
printf("Erro! Nao e possivel dividir por zero\n");
}
break;
case 0:
printf("Encerrando programa..\n");
break;
}
}
O trecho acima implementa o núcleo de processamento lógico da calculadora, utilizando a estrutura de controle de fluxo switch para gerenciar a tomada de decisão baseada no valor da variável opcao. Essa estrutura avalia a entrada do usuário e direciona a execução para o bloco (case) correspondente, onde as operações aritméticas elementares (soma, subtração e multiplicação) são calculadas e exibidas com formatação de precisão dupla.
Um ponto crítico de robustez do algoritmo é observado no case 4 (divisão), onde uma validação condicional aninhada (if/else) é inserida para verificar se o divisor é diferente de zero, prevenindo erros matemáticos e falhas de execução. Por fim, o uso sistemático do comando break em cada segmento assegura o encerramento imediato da estrutura após a execução da tarefa escolhida, evitando o processamento indesejado dos casos subsequentes.
Código completo com implementação do laço
Por fim, iremos implementar um laço de repetição afim de que todo esse processo se repita até que o usuário digite 0 e o programa se encerre. Por isso, usaremos o comando do while e sua condicional será enquanto a variável opção for diferente de zero.
#include <stdio.h>
int main(){
int opcao;
float resultado, num1, num2;
do{
//MENU CALCULADORA
printf("=====CALCULADORA====\n");
printf("1 - Soma\n");
printf("2 - Subtracao\n");
printf("3 - Multiplicacao\n");
printf("4 - Divisao\n");
printf("0 - Sair\n");
printf("Escolha uma opcao: ");
scanf("%d", &opcao);
if(opcao!=0){
printf("Digite o primeiro numero: ");
scanf("%f", &num1);
printf("Digite o segundo numero: ");
scanf("%f", &num2);
}
switch(opcao){
case 1:
resultado = num1 + num2;
printf("O resultado do calculo e: %.2f\n", resultado);
break;
case 2:
resultado = num1 - num2;
printf("O resultado do calculo e: %.2f\n", resultado);
break;
case 3:
resultado = num1 * num2;
printf("O resultado do calculo e: %.2f\n", resultado);
break;
case 4:
if(num2 !=0){
resultado = num1 / num2;
printf("O resultado do calculo e: %.2f\n", resultado);
}else{
printf("Erro! Nao e possivel dividir por zero\n");
}
break;
case 0:
printf("Encerrando programa..\n");
break;
}
}while(opcao!=0);
return 0;
}
Execução do algoritmo
Clique na imagem abaixo para observar a execução desse código

Assista o curso completo de Linguagem C
A linguagem C possui inúmeros recursos que a torna uma ferramenta extremante poderosa e eficiente para resolver problemas da computação. Diante disso, esse artigo teve como objetivo expor alguns conceitos elementares para o estudo e compreensão da linguagem. Por isso, para executar os códigos que foram apresentados acima e ter uma experiência prática, recomendo a leitura do artigo Como instalar o CodeBlocks tanto no Windows como no Linux. Além disso, caso prefira, é possível assistir vídeos da playlist "Linguagem C" do canal Descomplicando Algoritmos.
