Seja Bem-Vindo. Este site tem recursos de leitura de texto, basta marcar o texto e clicar no ícone do alto-falante   Click to listen highlighted text! Seja Bem-Vindo. Este site tem recursos de leitura de texto, basta marcar o texto e clicar no ícone do alto-falante

Linguagem de Programação II C – AULA 02

📚 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óximo printf() 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?

  1. Monte uma tabela com as colunas: Passo, Comando, Valores das Variáveis e Saída.
  2. Acompanhe a execução linha a linha, anotando mudanças nas variáveis.
  3. Analise o resultado final para ver se o programa se comporta como esperado.

📌 2. Exemplo de Teste de Mesa

📌 Código a ser analisado:

#include <stdio.h> int main() { int x = 5, y = 10; if (x > y) printf("X é maior\n"); else printf("Y é maior\n"); return 0; }

📝 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:

Y é maior

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:

#include <stdio.h>

int main() {
int i = 1;

while (i <= 3) {
printf("Iteração %d\n", i);
i++;
}

return 0;
}

📝 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:

Iteração 1
Iteração 2
Iteração 3
Conclusão: O programa imprime "Iteração 1", "Iteração 2", "Iteração 3" e encerra o laço ao atingir i = 4.

📌 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:

int a = 5,
b = 10;
int soma = a - b; // ERRO! A operação deveria ser soma
printf("A soma é: %d\n", soma);

 
Correção: int soma = a + b;

📌 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

  1. Abra o Code::Blocks e carregue seu código.
  2. Adicione Breakpoints (clicando na lateral esquerda).
  3. Execute em modo de depuração (Debug Mode).
  4. Use Step Into (F7) para avançar linha a linha.
  5. Veja os valores das variáveis mudando ao longo da execução.

🔗 Ferramenta:

🛠️ Como Depurar Código no GDB (Linux Terminal)

  1. Compile com a flag -g:
     
    gcc -g programa.c -o programa
    
  2. Execute o GDB:
    gdb ./programa
    
  3. Defina um breakpoint:
    break main
    
  4. Inicie a depuração:
    run
    
  5. Avance linha por linha:
    next
    

🔗 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:

 

Click to listen highlighted text!