Lista de Exercícios

Lógica de Programação e Algoritmos • Prof. Me. William Tenório

Sobre esta lista

Esta lista reúne exercícios de todos os assuntos estudados até agora: algoritmos, estrutura sequencial em C, estruturas condicionais, operadores lógicos e estruturas de repetição (while, do-while e for). Além de exercícios para construir programas, há exercícios para ler e analisar código pronto, marcados com Análise de código: prever a saída, encontrar erros e comparar versões diferentes de uma mesma solução.

Dica Nos exercícios de análise, resolva primeiro no papel (teste de mesa), anotando o valor de cada variável linha a linha. Só depois execute o código para conferir sua resposta. Para executar os códigos em C sem instalar nada, use o OnlineGDB.

1. Algoritmos

Resolva usando descrição narrativa, fluxograma e pseudocódigo.

  1. Escreva um algoritmo para trocar uma lâmpada.
  2. Faça um algoritmo para mostrar o resultado da multiplicação de dois números N1 e N2.
  3. Faça um algoritmo para mostrar o resultado da divisão de dois números. Lembre-se: não existe divisão por zero.
  4. Faça um algoritmo para calcular a média aritmética entre duas notas de um aluno e mostrar sua situação, que pode ser aprovado ou reprovado.
  5. Faça um algoritmo para calcular o novo salário de um funcionário. Sabe-se que os funcionários que recebem atualmente salário de até R$ 500 terão aumento de 20%; os demais terão aumento de 10%.
  6. Faça um algoritmo para calcular o IMC a partir do peso e da altura de uma pessoa e exiba a classificação, sabendo que IMC = Peso (kg) / Altura (m)²:
    IMCClassificação
    Abaixo de 18,5Abaixo do peso
    18,5 até 24,9Peso normal
    25 até 29,9Sobrepeso
    30 ou maisObesidade
  7. Faça um algoritmo que receba uma temperatura em graus Celsius e mostre o valor convertido para Fahrenheit, sabendo que F = C × 9 / 5 + 32.
  8. Faça um algoritmo que receba o preço de um produto e o percentual de desconto. Mostre o valor do desconto em reais e o preço final a pagar.
  9. Faça um algoritmo que receba três notas e seus respectivos pesos, calcule e mostre a média ponderada.
  10. Análise de código Faça o teste de mesa e informe os valores exibidos ao final:
    ALGORITMO
    DECLARE X, Y NUMÉRICO
    X ← 5
    Y ← X + 3
    X ← Y * 2
    Y ← X - Y
    ESCREVA X, Y
    FIM_ALGORITMO.
  11. Análise de código Um colega escreveu a seguinte descrição narrativa para calcular a média de um aluno:
    Passo 1 - pegar as notas.
    Passo 2 - fazer a conta.
    Passo 3 - mostrar se passou.
    Aponte pelo menos três ambiguidades nessa descrição (o que não fica claro?) e reescreva a solução em pseudocódigo, sem deixar margem para dúvidas.
  12. Indique quais identificadores abaixo são válidos e quais são inválidos, justificando os inválidos: salario_bruto, 2nota, _total, media final, nota1, x-y, int, IDADE, valor$.

2. Estrutura Sequencial em C

  1. Faça um programa em C que solicite e armazene: nome completo, idade, altura, peso e inicial do sobrenome. Depois, exiba todos os dados informados.
  2. Faça um programa em C que receba o ano de nascimento de uma pessoa e o ano atual, calcule e mostre:
    • a idade dessa pessoa;
    • quantos anos ela terá em 2050.
  3. Um trabalhador recebeu seu salário e o depositou em sua conta bancária. Esse trabalhador fez dois pagamentos distintos. Para o primeiro, houve retenção de um imposto de 4,65%. No segundo, houve retenção de 3,00%. O saldo inicial da conta estava 0. Calcule e informe o saldo atual da conta.
  4. Seja um triângulo retângulo com catetos A e B: calcule e exiba a hipotenusa.
    Dica: use #include <math.h> e a função sqrt().
  5. Faça um programa em C que leia dois números inteiros, A e B, e depois troque os valores entre as duas variáveis. Imprima o antes e o depois.
    Antes da troca:
    A = 10
    B = 20
    Depois da troca:
    A = 20
    B = 10
  6. Faça um programa que leia um valor em reais e a cotação do dólar do dia, e mostre o valor convertido em dólares.
  7. Faça um programa que leia uma quantidade total de segundos e mostre esse tempo no formato horas, minutos e segundos. Exemplo: 3725 segundos → 1h 2min 5s.
    Dica: use os operadores / e %.
  8. Análise de código Qual será a saída do trecho abaixo? Explique por que c e d têm valores diferentes.
    int a = 7, b = 2;
    float c = a / b;
    float d = 7.0 / 2;
    printf("%.1f %.1f %d\n", c, d, a % b);
  9. Análise de código O programa abaixo deveria calcular a média de duas notas, mas exibe um valor errado. Considerando n1 = 8 e n2 = 6, qual valor é exibido? Qual é o problema e como corrigir?
    float n1, n2, media;
    scanf("%f", &n1);
    scanf("%f", &n2);
    media = n1 + n2 / 2;
    printf("Media: %.1f\n", media);
  10. Análise de código O programa abaixo não compila. Encontre todos os erros e reescreva o código corrigido.
    #include <stdio.h>
    
    int main() {
        int idade
        float altura;
        printf("Digite sua idade: ");
        scanf("%d", idade);
        printf("Digite sua altura: ");
        scanf("%d", &altura);
        printf("Idade: %d, altura: %.2f\n", idade, altura)
        return 0;
    }
  11. Análise de código Compare as duas tentativas abaixo de trocar os valores de a e b. Faça o teste de mesa com a = 10 e b = 20 e responda: qual delas funciona? Por que a outra falha?

    Versão A

    a = b;
    b = a;

    Versão B

    a = a + b;
    b = a - b;
    a = a - b;

3. Estrutura Condicional

  1. Leia dois números inteiros e informe qual deles é maior. Caso sejam iguais, informe que os números são iguais.
  2. Leia um número inteiro e informe se ele é par ou ímpar. Além da classificação, informe também o dobro do número se for par.
  3. Leia o peso e a altura de uma pessoa. Calcule o IMC e informe sua classificação:
    • abaixo de 18,5 → Abaixo do peso
    • 18,5 até 24,9 → Peso normal
    • 25 até 29,9 → Sobrepeso
    • 30 ou mais → Obesidade
    Ao final, informe também o valor calculado do IMC.
  4. Faça um programa que leia dois números inteiros e apresente ao usuário um menu com as opções:
    • 1 - Soma
    • 2 - Subtração
    • 3 - Multiplicação
    • 4 - Divisão
    Leia a opção escolhida e realize a operação correspondente, exibindo o resultado. Caso o usuário informe uma opção diferente de 1 a 4, informe que a opção é inválida. Faça duas versões: uma com if / else if e outra com switch.
  5. Leia o valor que uma pessoa deseja sacar. Considere que o caixa possui apenas notas de 100, 50, 20 e 10 reais. Informe se é possível realizar o saque e, caso seja possível, informe quantas notas de cada valor serão utilizadas. Considere que o saque deve ser feito utilizando a menor quantidade possível de notas.
  6. Leia três números inteiros e mostre o maior deles.
  7. Leia a idade de uma pessoa e informe sua faixa etária: criança (0 a 11), adolescente (12 a 17), adulto (18 a 59) ou idoso (60 ou mais). Idades negativas devem ser consideradas inválidas.
  8. Uma loja oferece desconto de acordo com o valor da compra: acima de R$ 500, 15% de desconto; acima de R$ 200 (até R$ 500), 10%; nos demais casos, não há desconto. Leia o valor da compra e mostre o desconto aplicado e o valor final.
  9. Análise de código Compare os dois códigos abaixo. Para cada um, informe a saída quando nota vale 8, 5 e 2. Qual deles está correto? Explique a diferença.

    Código A

    if (nota >= 6) {
        printf("Aprovado\n");
    }
    if (nota >= 4) {
        printf("Recuperacao\n");
    } else {
        printf("Reprovado\n");
    }

    Código B

    if (nota >= 6) {
        printf("Aprovado\n");
    } else if (nota >= 4) {
        printf("Recuperacao\n");
    } else {
        printf("Reprovado\n");
    }
  10. Análise de código O código abaixo testa as condições em uma ordem diferente. Qual mensagem aparece para nota = 9? O que está errado e como corrigir sem alterar os valores das condições?
    if (nota >= 4) {
        printf("Recuperacao\n");
    } else if (nota >= 6) {
        printf("Aprovado\n");
    } else {
        printf("Reprovado\n");
    }
  11. Análise de código O programa abaixo deveria informar se o número digitado é zero. Qual a saída quando o usuário digita 0? E quando digita 5? Explique o que acontece e corrija o erro.
    int x;
    scanf("%d", &x);
    if (x = 0) {
        printf("Zero\n");
    } else {
        printf("Diferente de zero\n");
    }
  12. Análise de código O trecho abaixo exibe "Maior de idade" mesmo com idade = 15. Por quê?
    int idade = 15;
    if (idade >= 18);
    {
        printf("Maior de idade\n");
    }

4. Operadores Lógicos

  1. Número válido. Leia um número inteiro. O número é considerado válido quando estiver fora do intervalo de 10 a 20. Exiba Válido ou Inválido. Faça 2 versões: com e sem o operador de negação (!).
  2. Quadrante do plano cartesiano. Leia as coordenadas x e y de um ponto e informe em qual região ele está: 1º, 2º, 3º ou 4º quadrante, sobre o eixo X, sobre o eixo Y ou na origem.
  3. Validação de uma data. Faça um programa em C que leia dia, mês e ano e determine se a data informada é válida. Considere as seguintes regras:
    • O mês deve estar entre 1 e 12.
    • Os meses 1, 3, 5, 7, 8, 10 e 12 possuem 31 dias.
    • Os meses 4, 6, 9 e 11 possuem 30 dias.
    • Fevereiro possui 28 dias em anos normais e 29 dias em anos bissextos.
    • Um ano é bissexto quando é divisível por 4 e não é divisível por 100, ou é divisível por 400.
    O programa deve exibir Data válida ou Data inválida.
  4. Pode dirigir? Leia a idade de uma pessoa e se ela possui carteira de habilitação (1 para sim, 0 para não). Informe se ela pode dirigir: é preciso ter 18 anos ou mais e possuir habilitação.
  5. Triângulos. Leia três valores que representam os lados de um triângulo. Verifique se eles podem formar um triângulo (cada lado deve ser menor que a soma dos outros dois) e, em caso positivo, classifique-o em equilátero (três lados iguais), isósceles (dois lados iguais) ou escaleno (todos diferentes).
  6. Análise de código Considere a = 5, b = 10 e c = 0. Determine se cada expressão é verdadeira (1) ou falsa (0):
    a > 3 && b < 10
    a > 3 || b < 10
    !(a == 5)
    c || a > b
    !c && (a + b == 15)
  7. Análise de código As três condições abaixo pretendem verificar se x está entre 10 e 20 (inclusive). Quais são equivalentes entre si? Qual delas está errada? Teste com x = 5, x = 15 e x = 50.
    /* A */ if (x >= 10 && x <= 20)
    /* B */ if (!(x < 10 || x > 20))
    /* C */ if (x >= 10 || x <= 20)
  8. Análise de código Um aluno escreveu a condição abaixo, como se faz na matemática. O código compila, mas para x = 50 exibe "Dentro do intervalo". Explique, passo a passo, como o C avalia essa expressão e reescreva a condição corretamente.
    if (10 <= x <= 20) {
        printf("Dentro do intervalo\n");
    }

5. Estruturas de Repetição — Algoritmos

  1. Qual será a saída?
    i ← 1
    Enquanto (i <= 4):
        Escrever i
        i ← i + 1
  2. Qual é o erro? Por que esse algoritmo não termina?
    i ← 10
    Enquanto (i >= 1):
        Escrever i
        i ← i + 1
  3. Faça um algoritmo que mostre os números de 10 até 1.
  4. Quantas vezes o seguinte laço executa?
    i ← 0
    Enquanto (i <= 20):
        Escrever i
        i ← i + 2
  5. Faça um algoritmo que mostre todos os números pares entre 1 e 50. Resolva com duas estratégias lógicas diferentes.
  6. O que os códigos abaixo fazem? Corrija o que for necessário.
    Inicio:
    i = 1
    Enquanto i <= 10:
        Escrever i
    Fim
    Inicio:
    i = 1
    Enquanto i > 10:
        Escrever i
    Fim
  7. Faça um algoritmo que leia um número e mostre a sua tabuada (de 1 a 10).
  8. Faça um algoritmo que leia números até que o usuário digite 0 e, ao final, mostre a soma dos números digitados. Esse é um laço contado ou não contado?
  9. Análise de código Faça o teste de mesa, montando uma tabela com os valores de i e s a cada repetição. Qual valor é escrito ao final?
    s ← 0
    i ← 1
    Enquanto (i <= 5):
        s ← s + i
        i ← i + 2
    Escrever s
  10. Análise de código Analise o algoritmo de senha abaixo:
    Escrever "Digite a senha: "
    Ler senha
    tentativas ← 1
    Enquanto (senha <> 1234 E tentativas < 3):
        Escrever "Senha incorreta. Digite novamente: "
        Ler senha
        tentativas ← tentativas + 1
    • Identifique a(s) variável(is) de controle, a inicialização, a condição e a atualização.
    • Quantas tentativas o usuário tem, no máximo?
    • Ao sair do laço, o algoritmo não informa se o acesso foi liberado ou bloqueado. Complete-o.

6. while e do-while em C

  1. Solicite ao usuário 10 números e conte quantos são positivos.
  2. Leia 5 números do usuário e calcule a soma.
  3. Leia um número e calcule seu fatorial.
  4. Faça um programa que leia dois números inteiros e apresente ao usuário um menu com as opções:
    • 1 - Soma
    • 2 - Subtração
    • 3 - Multiplicação
    • 4 - Divisão
    • 5 - Sair
    Leia a opção escolhida e realize a operação correspondente, exibindo o resultado. Caso o usuário informe uma opção diferente de 1 a 5, informe que a opção é inválida e solicite outra. O programa deve parar de repetir quando for digitado 5.
  5. Jogo da adivinhação. O programa sorteia um número aleatório e o usuário deve adivinhar. Só pare quando o usuário acertar e conte quantas tentativas foram necessárias. A cada palpite errado, informe se o número sorteado é maior ou menor.
    Dica: use a biblioteca stdlib.h e o código rand() % 100 + 1 para sortear um número de 1 a 100.
  6. Usando do-while, leia uma nota e continue pedindo enquanto ela não estiver entre 0 e 10. Ao final, mostre a nota válida digitada.
  7. Leia números até que o usuário digite um número negativo. Mostre a quantidade de números digitados e a média deles (o negativo não entra no cálculo). Trate o caso de nenhum número válido ter sido digitado.
  8. Leia um número inteiro positivo e informe quantos dígitos ele possui. Exemplo: 4581 → 4 dígitos.
    Dica: divida o número por 10 repetidamente.
  9. Leia um número inteiro positivo e mostre-o invertido. Exemplo: 123 → 321.
  10. Análise de código Compare os dois códigos abaixo. Qual a saída de cada um? Explique a diferença.

    Código A

    int i = 10;
    while (i < 5) {
        printf("%d\n", i);
        i++;
    }

    Código B

    int i = 10;
    do {
        printf("%d\n", i);
        i++;
    } while (i < 5);
  11. Análise de código Qual valor é exibido? Quantas vezes o laço executa?
    int n = 1;
    while (n < 100) {
        n = n * 3;
    }
    printf("%d\n", n);
  12. Análise de código O programa abaixo deveria ler números até o usuário digitar 0 e mostrar a média. Ele possui pelo menos quatro problemas. Encontre-os e reescreva o programa corrigido.
    int soma, num, cont = 0;
    printf("Digite numeros (0 para sair): ");
    scanf("%d", &num);
    while (num != 0) {
        soma = soma + num;
        cont++;
    }
    printf("Media: %d\n", soma / cont);

7. for em C

  1. Números primos em uma sequência. Um número primo é aquele que possui exatamente dois divisores positivos distintos: 1 e ele mesmo. Escreva um programa em C que leia um número inteiro N, maior que 1, e exiba todos os números primos entre 2 e N. Ao final, o programa deverá informar:
    • a quantidade de números primos encontrados;
    • a soma de todos os números primos encontrados;
    • o maior número primo encontrado.
  2. Análise de uma sequência de números. Escreva um programa em C que leia um número inteiro positivo N e, em seguida, leia exatamente N números inteiros, um por vez. O programa deverá apresentar:
    • a quantidade de números pares e a soma dos números pares;
    • a quantidade de números ímpares e a soma dos números ímpares;
    • o maior e o menor número digitado;
    • o tamanho da maior sequência consecutiva de números positivos.
  3. Leia um número N e mostre a tabuada de N (de 1 a 10) usando for.
  4. Leia um número N e calcule a soma de 1 até N usando for. Compare o resultado com a fórmula N * (N + 1) / 2.
  5. Leia um número N e mostre os N primeiros termos da sequência de Fibonacci: 0 1 1 2 3 5 8 13 ... (cada termo é a soma dos dois anteriores).
  6. Leia um número N e desenhe um triângulo de asteriscos com N linhas. Exemplo para N = 4:
    *
    **
    ***
    ****
    Dica: use um for dentro de outro for.
  7. Análise de código Qual a saída do trecho abaixo?
    for (int i = 0; i < 10; i += 3) {
        printf("%d ", i);
    }
  8. Análise de código Os três códigos abaixo somam os números pares de 1 a 100. Todos produzem o mesmo resultado? Quantas repetições cada um executa? Qual você considera mais adequado e por quê?

    Código A

    int soma = 0;
    for (int i = 1; i <= 100; i++) {
        if (i % 2 == 0) {
            soma += i;
        }
    }

    Código B

    int soma = 0;
    for (int i = 2; i <= 100; i += 2) {
        soma += i;
    }

    Código C

    int soma = 0, i = 2;
    while (i <= 100) {
        soma += i;
        i += 2;
    }
  9. Análise de código O programador esperava ver os números de 1 a 10, mas a saída foi apenas 11. Explique por quê.
    int i;
    for (i = 1; i <= 10; i++);
    {
        printf("%d\n", i);
    }
  10. Análise de código Informe a saída do código abaixo e reescreva-o usando for, mantendo exatamente o mesmo comportamento.
    int i = 20;
    while (i > 0) {
        printf("%d\n", i);
        i -= 4;
    }

8. Desafios Integradores

Exercícios que combinam estrutura sequencial, condicional e repetição.

  1. Média da turma. Leia a quantidade de alunos de uma turma. Para cada aluno, leia duas notas, calcule a média e informe sua situação (Aprovado: média ≥ 6; Recuperação: média ≥ 4; Reprovado: abaixo de 4). Ao final, mostre quantos alunos ficaram em cada situação e a média geral da turma.
  2. Números perfeitos. Um número é perfeito quando é igual à soma de seus divisores próprios (excluindo ele mesmo). Exemplo: 6 = 1 + 2 + 3. Leia um número N e mostre todos os números perfeitos entre 1 e N.
  3. Caixa eletrônico contínuo. Adapte o exercício 28 (saque) para atender vários saques seguidos, até que o usuário digite 0. Valores que não forem múltiplos de 10 devem ser recusados. Ao final, mostre o total sacado e quantas notas de cada valor foram entregues no total.