📚 Estruturas Fundamentais da Programação em C
🎯 Objetivo: Apresentar os fundamentos da entrada e saída de dados, estruturas condicionais e de repetição, além de abordar testes de mesa e depuração para garantir a correta execução de algoritmos em C.
📌 1.Entrada e Saída de Dados em C: scanf
e printf
A entrada e saída de dados são essenciais para que um programa interaja com o usuário. Sem elas, um programa apenas executaria cálculos internos sem exibir informações ou permitir a personalização de resultados.
Em C, essas operações são feitas por meio das funções printf()
(saída de dados) e scanf()
(entrada de dados), ambas pertencentes à biblioteca stdio.h
(Standard Input Output).
🔹 Saída de Dados com printf()
A função printf()
é usada para exibir mensagens e valores de variáveis no terminal.
📌 Sintaxe Básica
printf("texto ou formato", lista_de_variáveis);
"texto ou formato"
: Define o que será impresso, podendo conter textos fixos e especificadores de formato.lista_de_variáveis
: Representa os valores que serão exibidos, combinados com os especificadores.
📌 Exemplo 1: Exibindo Textos e Quebra de Linha
#include <stdio.h>
int main() {
printf("Olá, mundo!\n");
printf("Bem-vindo à programação em C!\n");
return 0;
}
📌 Saída no terminal:
Olá, mundo!
Bem-vindo à programação em C!
Explicação:
- O
\n
serve para quebrar a linha, garantindo que o próximoprintf()
exiba o conteúdo na linha seguinte.
📌 Exemplo 2: Exibindo Números e Caracteres
#include <stdio.h>
int main() {
int idade = 25;
float altura = 1.75;
char inicial = 'A';
printf("Idade: %d anos\n", idade);
printf("Altura: %.2f metros\n", altura);
printf("Inicial do nome: %c\n", inicial);
return 0;
}
📌 Saída no terminal:
Idade: 25 anos
Altura: 1.75 metros
Inicial do nome: A
Explicação:
%d
→ Exibe um número inteiro.%.2f
→ Exibe um número decimal com duas casas decimais.%c
→ Exibe um caractere.
📌 Especificadores de Formato em printf()
Especificador | Tipo de Dado | Exemplo |
%d ou %i |
Inteiro | printf("%d", 10); |
%f |
Float (ponto flutuante) | printf("%.2f", 3.1415); |
%c |
Caractere | printf("%c", 'A'); |
%s |
String (texto) | printf("%s", "Olá"); |
%x |
Inteiro em hexadecimal | printf("%x", 255); |
%o |
Inteiro em octal | printf("%o", 8); |
🔗 Leitura Adicional:
📌 Exemplo 3: Formatando Espaçamento na Impressão
#include <stdio.h>
int main() {
printf("%10s | %10s | %10s\n", "Nome", "Idade", "Altura");
printf("%10s | %10d | %10.2f\n", "Ana", 30, 1.65);
printf("%10s | %10d | %10.2f\n", "Bruno", 25, 1.80);
return 0;
}
📌 Saída no terminal:
Nome | Idade | Altura
Ana | 30 | 1.65
Bruno | 25 | 1.80
Explicação:
%10s
→ Define um espaçamento de 10 caracteres para alinhar colunas.%10d
→ Garante que os números inteiros tenham espaçamento fixo.
🔹 Entrada de Dados com scanf()
A função scanf()
permite que o usuário digite valores no teclado, armazenando-os em variáveis.
📌 Exemplo 1: Lendo um Número Inteiro
#include <stdio.h>
int main() {
int idade;
printf("Digite sua idade: ");
scanf("%d", &idade);
printf("Você tem %d anos.\n", idade);
return 0;
}
📌 Entrada do usuário: 30
📌 Saída no terminal: Você tem 30 anos.
Explicação:
&idade
→ O&
(operador de endereço) é necessário para armazenar o valor digitado diretamente na variável.
📌 Exemplo 2: Lendo Vários Tipos de Dados
#include <stdio.h>
int main() {
int idade;
float altura;
char inicial;
printf("Digite sua idade, altura e inicial do nome: ");
scanf("%d %f %c", &idade, &altura, &inicial);
printf("Idade: %d anos\n", idade);
printf("Altura: %.2f metros\n", altura);
printf("Inicial do nome: %c\n", inicial);
return 0;
}
📌 Entrada do usuário: 28 1.75 A
📌 Saída no terminal:
Idade: 28 anos
Altura: 1.75 metros
Inicial do nome: A
Explicação:
scanf("%d %f %c", &idade, &altura, &inicial);
→ Lê um inteiro, um float e um caractere de uma única vez.
📌 Erros Comuns ao Usar scanf()
❌ Esquecer o &
(operador de endereço)
int idade;
scanf("%d", idade); // ERRO! Deveria ser &idade
✅ Correção:
scanf("%d", &idade);
❌ Ler um caractere logo após um número (bug do buffer)
int idade;
char inicial;
scanf("%d", &idade);
scanf("%c", &inicial); // ERRO! O ENTER anterior será capturado
✅ Correção: Usar getchar()
para limpar o buffer.
scanf("%d", &idade);
getchar(); // Captura o ENTER
scanf("%c", &inicial);
📢 Conclusão
printf()
exibe informações na tela, permitindo formatação avançada.scanf()
recebe dados do usuário, armazenando-os em variáveis.- O uso correto de formatadores e endereços de memória (
&
) evita erros. - O tratamento de entrada de dados é essencial para garantir robustez no código.
📌 1. O que é um Teste de Mesa?
O Teste de Mesa (Dry Run) é uma técnica manual para verificar como um algoritmo ou código se comporta antes de ser executado no computador.
🔹 Objetivo do Teste de Mesa
✔️ Simular a execução linha por linha.
✔️ Rastrear valores das variáveis em cada etapa.
✔️ Identificar erros lógicos antes de rodar o código.
✔️ Evitar desperdício de tempo com testes desnecessários no compilador.
🔹 Como Realizar um Teste de Mesa?
- Monte uma tabela com as colunas: Passo, Comando, Valores das Variáveis e Saída.
- Acompanhe a execução linha a linha, anotando mudanças nas variáveis.
- Analise o resultado final para ver se o programa se comporta como esperado.
📌 2. Exemplo de Teste de Mesa
📌 Código a ser analisado:
📝 Execução Manual do Teste de Mesa
Passo | Comando | Variáveis | Saída |
1 | int x = 5, y = 10; |
x = 5, y = 10 |
– |
2 | if (x > y) (5 > 10) → FALSO |
x = 5, y = 10 |
– |
3 | else printf("Y é maior"); |
x = 5, y = 10 |
"Y é maior" |
📌 Saída esperada no terminal:
✅ Conclusão: Como 5
não é maior que 10
, a condição if (x > y)
é falsa, e o programa executa a parte do else
, imprimindo "Y é maior"
.
📌 4. Estruturas de Repetição: while
, do-while
, for
As estruturas de repetição permitem que o código execute instruções várias vezes.
🔹 while
(Executa enquanto a condição for verdadeira)
int i = 0;
while (i < 5) {
printf("%d\n", i);
i++;
}
🔹 do-while
(Executa pelo menos uma vez antes de verificar a condição)
int i = 0;
do {
printf("%d\n", i);
i++;
} while (i < 5);
🔹 for
(Laço com contador definido)
for (int i = 0; i < 5; i++) {
printf("%d\n", i);
}
📌 Quando usar?
Estrutura | Uso ideal |
while |
Quando o número de repetições é desconhecido. |
do-while |
Quando queremos executar pelo menos uma vez. |
for |
Quando o número de repetições é conhecido. |
🔗 Referências:
📌 5. Estruturas Aninhadas e Combinadas
Podemos combinar estruturas para resolver problemas mais complexos.
🔹 for
dentro de if
for (int i = 1; i <= 10; i++) {
if (i % 2 == 0) {
printf("%d é par\n", i);
}
}
🔹 while
dentro de for
for (int i = 1; i <= 3; i++) {
int j = 0;
while (j < i) {
printf("*");
j++;
}
printf("\n");
}
📌 6. Teste de Mesa com Estruturas de Repetição
Além de condições, o Teste de Mesa é essencial para verificar laços de repetição, evitando loops infinitos e verificando o número exato de iterações.
📌 Código a ser analisado:
📝 Execução Manual do Teste de Mesa
Passo | Comando | Variáveis | Saída |
1 | int i = 1; |
i = 1 |
– |
2 | while (i <= 3) → Verdadeiro |
i = 1 |
– |
3 | printf("Iteração %d\n", i); |
i = 1 |
"Iteração 1" |
4 | i++ (agora i = 2 ) |
i = 2 |
– |
5 | while (i <= 3) → Verdadeiro |
i = 2 |
– |
6 | printf("Iteração %d\n", i); |
i = 2 |
"Iteração 2" |
7 | i++ (agora i = 3 ) |
i = 3 |
– |
8 | while (i <= 3) → Verdadeiro |
i = 3 |
– |
9 | printf("Iteração %d\n", i); |
i = 3 |
"Iteração 3" |
10 | i++ (agora i = 4 ) |
i = 4 |
– |
11 | while (i <= 3) → FALSO (para de executar) |
i = 4 |
– |
📌 Saída esperada no terminal:
📌 7. O que é Depuração?
A depuração (debugging) é o processo de encontrar e corrigir erros no código.
🔹 Tipos de Erros Corrigidos na Depuração
🔴 Erro de Sintaxe – Código mal escrito.
🔴 Erro de Execução – Causa travamento do programa.
🔴 Erro Lógico – O código roda, mas com resultado incorreto.
📌 Exemplo de Erro Lógico:
📌 8. Depuração no Code::Blocks e GDB
Os depuradores permitem analisar linha por linha o que acontece no código.
🛠️ Como Depurar Código no Code::Blocks
- Abra o Code::Blocks e carregue seu código.
- Adicione Breakpoints (clicando na lateral esquerda).
- Execute em modo de depuração (Debug Mode).
- Use Step Into (
F7
) para avançar linha a linha. - Veja os valores das variáveis mudando ao longo da execução.
🔗 Ferramenta:
🛠️ Como Depurar Código no GDB (Linux Terminal)
- Compile com a flag
-g
: - Execute o GDB:
- Defina um breakpoint:
- Inicie a depuração:
- Avance linha por linha:
🔗 Ferramenta:
📢 Conclusão
- Testes de Mesa evitam erros antes de rodar o código.
- Depuração ajuda a encontrar e corrigir problemas de execução.
- Breakpoints e Debugging Tools facilitam a inspeção de variáveis.
- Praticar esses conceitos é essencial para programadores iniciantes.
📢 Conclusão
✅ Você aprendeu sobre entrada e saída de dados, condições, testes de mesa e laços de repetição.
🔗 Recursos Adicionais
🔗 Referências:
- Livro: “Algoritmos e Programação: Teoria e Prática”
- Exercícios de Repetição – Programiz
- Documentação Oficial: printf