Lista de Exercícios — while
Esta página reúne exercícios sobre a estrutura de repetição while em C#. Leia cada enunciado com atenção e desenvolva os programas conforme solicitado. Utilize apenas while, variáveis simples e operações básicas — sem vetores ou funções.
Selecione um exercício no menu lateral ou abaixo para começar.
Exercício 01 - Calculadora de dobros
Escreva um programa em C# que leia um número inteiro e exiba o seu dobro. Ao final, o programa deve perguntar: "Deseja calcular outro? (S/N)". Enquanto o usuário responder S, o programa repete. Qualquer outra resposta encerra.
Exemplo de Entrada e Saída
Entrada:
Número: 7
Deseja calcular outro? (S/N): S
Número: 3
Deseja calcular outro? (S/N): N
Saída:
O dobro de 7 é 14.
O dobro de 3 é 6.
O loop deve continuar enquanto a resposta for "S". Inicialize a variável de controle com "S" antes do while para que a primeira iteração ocorra. A condição do while compara essa variável com "S".
resposta = "S"
enquanto (resposta == "S")
ler numero
exibir "O dobro de {numero} é {numero * 2}."
ler resposta
A solução será revelada em etapas. Tente completar cada passo antes de avançar.
Declare a variável de resposta já com "S" para que o loop entre na primeira vez:
string resposta = "S";
O loop continua enquanto o usuário confirmar.
Dica: Use ToUpper() para aceitar tanto "s" quanto "S":
while (resposta.ToUpper() == "S")
{
Dentro do loop, leia o número e exiba o resultado:
int numero = Convert.ToInt32(Console.ReadLine());
Console.WriteLine($"O dobro de {numero} é {numero * 2}.");
Ao final de cada iteração, leia a decisão do usuário para controlar a próxima verificação:
resposta = Console.ReadLine(); }
Exercício 02 - Contagem progressiva
Escreva um programa em C# que leia um número inteiro N, com N > 0. Caso o valor seja inválido, informe "Valor inválido" e encerre.
Com um valor válido, exiba todos os números de 1 até N, um por linha, usando um while.
Exemplo de Entrada e Saída
Entrada:
N: 5
Saída:
1
2
3
4
5
Entrada:
N: -3
Saída:
Valor inválido
Valide N antes de entrar no loop. Se for válido, use um contador que começa em 1 e incrementa a cada iteração. A condição do while é contador <= N.
ler N
se (N <= 0)
exibir "Valor inválido"
senão
contador = 1
enquanto (contador <= N)
exibir contador
contador = contador + 1
A solução será revelada em etapas. Tente completar cada passo antes de avançar.
int N = Convert.ToInt32(Console.ReadLine());
if (N <= 0)
{
Console.WriteLine("Valor inválido");
}
No bloco else, inicialize o contador em 1:
else
{
int contador = 1;
Exiba o valor do contador e incremente-o até atingir N:
while (contador <= N)
{
Console.WriteLine(contador);
contador++;
}
}
Exercício 03 - Soma de salários
Escreva um programa em C# que leia a quantidade de funcionários N (N > 0). Em seguida, leia o salário de cada funcionário um por vez.
Ao final, exiba:
- A soma total dos salários
- A média salarial, com duas casas decimais
Considere que todos os salários são maiores que zero. Caso algum valor seja inválido, informe "Salário inválido" e encerre o programa.
Exemplo de Entrada e Saída
Entrada:
Funcionários: 3
Salário 1: 2000
Salário 2: 3500
Salário 3: 1500
Saída:
Total: R$ 7000.00
Média: R$ 2333.33
Entrada:
Funcionários: 2
Salário 1: 1800
Salário 2: -500
Saída:
Salário inválido
Use um único while para percorrer os N funcionários. Dentro do loop, leia cada salário e valide imediatamente — se inválido, exiba a mensagem e encerre com um return (ou break e uma flag). Acumule a soma a cada iteração e calcule a média após o loop.
ler N
soma = 0, contador = 1
enquanto (contador <= N)
ler salario
se (salario <= 0)
exibir "Salário inválido"
encerrar
soma = soma + salario
contador++
media = soma / N
exibir total e media
A solução será revelada em etapas. Tente completar cada passo antes de avançar.
int N = Convert.ToInt32(Console.ReadLine()); double soma = 0; int contador = 1;
while (contador <= N)
{
soma += salario; é um operador de atribuição composto que acumula o valor de salario em soma, sendo equivalente a soma = soma + salario;.
double salario = Convert.ToDouble(Console.ReadLine());
if (salario <= 0)
{
Console.WriteLine("Salário inválido");
return;
}
soma += salario;
contador++;
}
double media = soma / N;
Console.WriteLine($"Total: R$ {soma:F2}");
Console.WriteLine($"Média: R$ {media:F2}");
Exercício 04 - Classificação de ângulos
Escreva um programa em C# que leia um ângulo em graus. O valor deve estar no intervalo de 0 a 360. Enquanto o valor digitado estiver fora desse intervalo, o programa deve exibir "Ângulo inválido. Digite um valor entre 0 e 360." e pedir novamente.
Com um ângulo válido, classifique-o como:
- Nulo: igual a 0°
- Agudo: entre 1° e 89°
- Reto: igual a 90°
- Obtuso: entre 91° e 179°
- Raso: igual a 180°
- Reflexo: entre 181° e 359°
- Completo: igual a 360°
Exemplo de Entrada e Saída
Entrada:
Ângulo: 400
Ângulo: -10
Ângulo: 45
Saída:
Ângulo inválido. Digite um valor entre 0 e 360.
Ângulo inválido. Digite um valor entre 0 e 360.
Ângulo agudo.
Entrada:
Ângulo: 180
Saída:
Ângulo raso.
O while aqui serve para forçar uma entrada válida — não para repetir o programa inteiro. Leia o ângulo antes do while; a condição verifica se está fora do intervalo. Quando o loop terminar, a variável já contém um valor válido, pronto para classificação.
ler angulo
enquanto (angulo < 0 OU angulo > 360)
exibir "Ângulo inválido. Digite um valor entre 0 e 360."
ler angulo
se (angulo == 0) exibir "Ângulo nulo."
senão se (angulo < 90) exibir "Ângulo agudo."
senão se (angulo == 90) exibir "Ângulo reto."
senão se (angulo < 180) exibir "Ângulo obtuso."
senão se (angulo == 180) exibir "Ângulo raso."
senão se (angulo < 360) exibir "Ângulo reflexo."
senão exibir "Ângulo completo."
A solução será revelada em etapas. Tente completar cada passo antes de avançar.
int angulo = Convert.ToInt32(Console.ReadLine());
O loop pede novamente enquanto o valor estiver fora do intervalo:
while (angulo < 0 || angulo > 360)
{
Console.WriteLine("Ângulo inválido. Digite um valor entre 0 e 360.");
angulo = Convert.ToInt32(Console.ReadLine());
}
Com o valor garantidamente válido, classifique usando if/else if encadeados:
if (angulo == 0) Console.WriteLine("Ângulo nulo.");
else if (angulo < 90) Console.WriteLine("Ângulo agudo.");
else if (angulo == 90) Console.WriteLine("Ângulo reto.");
else if (angulo < 180) Console.WriteLine("Ângulo obtuso.");
else if (angulo == 180) Console.WriteLine("Ângulo raso.");
else if (angulo < 360) Console.WriteLine("Ângulo reflexo.");
else Console.WriteLine("Ângulo completo.");
Exercício 05 - Adivinhe o número
Escreva um programa em C# que sorteie um número inteiro entre 1 e 100
usando int numero_sorteado = new Random().Next(1, 101);.
O usuário deve tentar adivinhar o número sorteado.
A cada tentativa errada, informe se o número sorteado é maior ou menor do que o chute. Quando o usuário acertar, exiba uma mensagem de parabéns e o total de tentativas realizadas.
Exemplo de Entrada e Saída
Entrada:
Chute: 50
Chute: 75
Chute: 63
Saída:
Muito baixo!
Muito alto!
Parabéns! Você acertou em 3 tentativas.
Antes do loop, sorteie o número e leia o primeiro chute. O while continua enquanto chute != numero_sorteado. Dentro do loop, dê a dica (maior/menor) e leia o próximo chute. Incremente um contador a cada iteração — o acerto também conta como tentativa.
sortear numero (1 a 100)
tentativas = 1
ler chute
enquanto (chute != numero)
se (chute < numero) exibir "Muito baixo!"
senão exibir "Muito alto!"
ler chute
tentativas++
exibir "Parabéns! Você acertou em {tentativas} tentativas."
A solução será revelada em etapas. Tente completar cada passo antes de avançar.
int numero_sorteado = new Random().Next(1, 101); int tentativas = 1; int chute = Convert.ToInt32(Console.ReadLine());
while (chute != numero_sorteado)
{
if (chute < numero_sorteado)
Console.WriteLine("Muito baixo!");
else
Console.WriteLine("Muito alto!");
chute = Convert.ToInt32(Console.ReadLine());
tentativas++;
}
Console.WriteLine($"Parabéns! Você acertou em {tentativas} tentativas.");
Exercício 06 - Caixa registradora
Escreva um programa em C# que simule uma caixa registradora. O usuário digita o preço de um produto por vez. Digitar 0 encerra o registro.
Ao final, exiba:
- A quantidade de itens registrados
- O valor total da compra
- O preço médio dos itens, com duas casas decimais
Caso nenhum item seja registrado (o usuário digitar 0 imediatamente), exiba "Nenhum item registrado."
Exemplo de Entrada e Saída
Entrada:
Preço: 12.50
Preço: 8.00
Preço: 19.90
Preço: 0
Saída:
Itens: 3
Total: R$ 40.40
Preço médio: R$ 13.47
Entrada:
Preço: 0
Saída:
Nenhum item registrado.
Leia o primeiro preço antes do while. A condição é preco != 0. Dentro do loop, acumule o total, incremente o contador e leia o próximo preço. Após o loop, verifique se o contador é zero antes de calcular a média — isso cobre o caso de nenhum item registrado.
total = 0, itens = 0
ler preco
enquanto (preco != 0)
total = total + preco
itens++
ler preco
se (itens == 0)
exibir "Nenhum item registrado."
senão
exibir itens, total, total/itens
A solução será revelada em etapas. Tente completar cada passo antes de avançar.
double total = 0; int itens = 0; double preco = Convert.ToDouble(Console.ReadLine());
while (preco != 0)
{
total += preco;
itens++;
preco = Convert.ToDouble(Console.ReadLine());
}
if (itens == 0)
{
Console.WriteLine("Nenhum item registrado.");
}
else
{
Console.WriteLine($"Itens: {itens}");
Console.WriteLine($"Total: R$ {total:F2}");
Console.WriteLine($"Preço médio: R$ {total / itens:F2}");
}
Exercício 07 - Sequência de Collatz
A Conjectura de Collatz afirma que, a partir de qualquer inteiro positivo, aplicando repetidamente as regras abaixo, o valor sempre chegará a 1:
- Se N for par: N = N / 2
- Se N for ímpar: N = 3 * N + 1
Escreva um programa em C# que leia um número inteiro N > 1. Caso o valor seja inválido, informe "Valor inválido" e encerre.
Com um valor válido, exiba cada número da sequência (incluindo o N inicial e o 1 final) e, ao terminar, informe o total de passos realizados.
Exemplo de Entrada e Saída
Entrada:
N: 6
Saída:
6 → 3 → 10 → 5 → 16 → 8 → 4 → 2 → 1
Total de passos: 8
Entrada:
N: 1
Saída:
Valor inválido
O operador % verifica paridade: N % 2 == 0 significa par. Use-o dentro do while para decidir qual regra aplicar. Exiba N antes de modificá-lo em cada passo. Conte os passos com uma variável — um passo é cada transformação, então a sequência com k números tem k-1 passos.
ler N
se (N <= 1)
exibir "Valor inválido"
senão
passos = 0
exibir N (sem quebra de linha)
enquanto (N != 1)
se (N % 2 == 0) N = N / 2
senão N = 3 * N + 1
exibir " → " + N
passos++
exibir "Total de passos: {passos}"
A solução será revelada em etapas. Tente completar cada passo antes de avançar.
int N = Convert.ToInt32(Console.ReadLine());
if (N <= 1)
{
Console.WriteLine("Valor inválido");
return;
}
int passos = 0; Console.Write(N);
Aplique as regras, exiba o próximo valor e conte os passos:
while (N != 1)
{
if (N % 2 == 0)
N = N / 2;
else
N = 3 * N + 1;
Console.Write($" → {N}");
passos++;
}
Console.WriteLine();
Console.WriteLine($"Total de passos: {passos}");
Exercício 08 - Maior placar da turma
Em uma gincana escolar, cada equipe registrou sua pontuação final. Escreva um programa em C# que leia a quantidade de equipes N (N > 0) e, em seguida, leia a pontuação de cada uma.
As pontuações são inteiros maiores ou iguais a zero. Ao final, exiba a maior pontuação registrada e o número da equipe que a obteve. Em caso de empate, considere a primeira equipe com aquela pontuação.
Exemplo de Entrada e Saída
Entrada:
Equipes: 4
Pontuação da equipe 1: 320
Pontuação da equipe 2: 475
Pontuação da equipe 3: 390
Pontuação da equipe 4: 475
Saída:
Maior pontuação: 475 (Equipe 2)
Entrada:
Equipes: 3
Pontuação da equipe 1: 100
Pontuação da equipe 2: 250
Pontuação da equipe 3: 180
Saída:
Maior pontuação: 250 (Equipe 2)
Inicialize o maior com a pontuação da primeira equipe (não com zero). A cada nova pontuação, use > — e não >= — para manter a primeira equipe em caso de empate. Guarde o número da equipe junto com a pontuação ao atualizar o maior.
ler N
ler pontuacao da equipe 1
maior = pontuacao, equipeVencedora = 1
contador = 2
enquanto (contador <= N)
ler pontuacao
se (pontuacao > maior)
maior = pontuacao
equipeVencedora = contador
contador++
exibir "Maior pontuação: {maior} (Equipe {equipeVencedora})"
A solução será revelada em etapas. Tente completar cada passo antes de avançar.
Em exercícios que envolvem identificar o maior (ou menor) número, é comum criarmos uma variável maior (ou menor) que vai armazenar ao longo da execução o maior (ou menor) valor até aquele ponto da execução. Por isso, neste exercício, logo no início atribuímos à variável maior o valor lido da primeira pontuação.
int N = Convert.ToInt32(Console.ReadLine()); int pontuacao = Convert.ToInt32(Console.ReadLine()); int maior = pontuacao; int vencedora = 1; int contador = 2;
while (contador <= N)
{
Se a pontuação que acabamos de ler for maior que a maior pontuação até então (variável maior), vamos atualizar o seu valor. Isto é, o valor maior até este ponto agora será a pontuação que acabamos de ler.
pontuacao = Convert.ToInt32(Console.ReadLine());
if (pontuacao > maior)
{
maior = pontuacao;
vencedora = contador;
}
contador++;
}
Ao sair do laço, temos certeza que a variável maior está mantendo o maior valor dentre todos que foram lidos.
Console.WriteLine($"Maior pontuação: {maior} (Equipe {vencedora})");
int.MinValue
Uma estratégia alternativa é inicializar a variável maior com
int.MinValue, que representa o menor valor possível para um inteiro.
Como as pontuações válidas são maiores ou iguais a zero, a primeira pontuação lida
será obrigatoriamente maior que esse valor inicial. Assim, na primeira verificação,
a variável maior será atualizada com certeza para um valor real informado
pelo usuário.
int N = Convert.ToInt32(Console.ReadLine());
int maior = int.MinValue;
int vencedora = 0;
int contador = 1;
while (contador <= N)
{
int pontuacao = Convert.ToInt32(Console.ReadLine());
if (pontuacao > maior)
{
maior = pontuacao;
vencedora = contador;
}
contador++;
}
Console.WriteLine($"Maior pontuação: {maior} (Equipe {vencedora})");
Essa solução evita ler a primeira pontuação antes do laço. O próprio while
trata todas as equipes, inclusive a primeira. O cuidado importante é escolher um valor
inicial que não atrapalhe a primeira comparação.
Exercício 09 - Menor tempo de prova
Em uma corrida escolar, cada atleta teve seu tempo registrado em segundos. Escreva um programa em C# que leia a quantidade de atletas N (N > 0) e, em seguida, leia o tempo de cada um.
Os tempos são inteiros maiores que zero. Caso algum tempo seja inválido, informe "Tempo inválido" e encerre o programa.
Ao final, exiba o menor tempo registrado e o número do atleta vencedor. Em caso de empate, considere o primeiro atleta com aquele tempo.
Exemplo de Entrada e Saída
Entrada:
Atletas: 4
Tempo do atleta 1: 58
Tempo do atleta 2: 47
Tempo do atleta 3: 52
Tempo do atleta 4: 47
Saída:
Menor tempo: 47 segundos (Atleta 2)
Entrada:
Atletas: 3
Tempo do atleta 1: 60
Tempo do atleta 2: -5
Saída:
Tempo inválido
Similar ao exercício anterior, mas buscamos o menor valor. Inicialize o menor com o tempo do primeiro atleta (validando-o primeiro). Use < na comparação para manter o primeiro em caso de empate. Valide cada tempo antes de comparar — se inválido, encerre imediatamente.
ler N
ler tempo do atleta 1
se (tempo <= 0) exibir "Tempo inválido" e encerrar
menor = tempo, atletaVencedor = 1
contador = 2
enquanto (contador <= N)
ler tempo
se (tempo <= 0) exibir "Tempo inválido" e encerrar
se (tempo < menor)
menor = tempo
atletaVencedor = contador
contador++
exibir "Menor tempo: {menor} segundos (Atleta {atletaVencedor})"
A solução será revelada em etapas. Tente completar cada passo antes de avançar.
int N = Convert.ToInt32(Console.ReadLine());
int tempo = Convert.ToInt32(Console.ReadLine());
if (tempo <= 0)
{
Console.WriteLine("Tempo inválido");
return;
}
int menor = tempo;
int vencedor = 1;
int contador = 2;
while (contador <= N)
{
tempo = Convert.ToInt32(Console.ReadLine());
if (tempo <= 0)
{
Console.WriteLine("Tempo inválido");
return;
}
if (tempo < menor)
{
menor = tempo;
vencedor = contador;
}
contador++;
}
Console.WriteLine($"Menor tempo: {menor} segundos (Atleta {vencedor})");
int.MaxValue
Uma estratégia alternativa é inicializar a variável menor com
int.MaxValue, que representa o maior valor possível para um inteiro.
Como qualquer tempo válido será menor que esse valor inicial, o primeiro tempo lido
substituirá menor obrigatoriamente na primeira verificação.
int N = Convert.ToInt32(Console.ReadLine());
int menor = int.MaxValue;
int vencedor = 0;
int contador = 1;
while (contador <= N)
{
int tempo = Convert.ToInt32(Console.ReadLine());
if (tempo <= 0)
{
Console.WriteLine("Tempo inválido");
return;
}
if (tempo < menor)
{
menor = tempo;
vencedor = contador;
}
contador++;
}
Console.WriteLine($"Menor tempo: {menor} segundos (Atleta {vencedor})");
Essa solução mantém todas as leituras dentro do laço. O valor int.MaxValue
funciona como um ponto de partida artificial: ele não é uma resposta real, apenas garante
que o primeiro tempo válido atualize a variável menor.


