Aula 9 - Comando de repetição while
  • Resumo
  • Exercício 1
  • Exercício 2
  • Exercício 3
  • Exercício 4
  • Exercício 5
  • Soluções
Avalie esta aula

O comando de repetição while

O comando de repetição while serve para executar repetidamente, de maneira controlada, um bloco de comandos. O bloco de comandos é executado enquanto o resultado de uma expressão lógica é verdadeira.

Formato Geral

O formato geral do comando de repetição while é:

while (expressão_lógica) {
    bloco_de_comandos
}

O que ocorre na execução:

  1. o valor da expressão_lógica computado, e se o resultado é verdadeiro os comandos do bloco_de_comandos são executados.
  2. ao terminar a execução do bloco de comandos, volta a executar o passo 1 acima.
Note que o bloco_de_comandos deve produzir alteração no valor de expressão_lógica, caso contrário ocorre uma repetição infinita do bloco de comandos (e o programa "trava"). A expressão_lógica no comando de repetição é chamada também de condição de parada, já que ela controla a parada da repetição.

Um exemplo de uso de comando de repetição é dado abaixo. Esse exemplo escreve na saída uma lista de números de 1 a 100,

var contador;

contador = 1;
while (contador <= 100) {
  printf("%d\n", contador);
  contador = contador + 1;
}

Vamos escrever um programa para calcular a média de notas dos alunos da classe. Suponha que a entrada contenha na primeira linha um inteiro N que indica o número de alunos na turma. A seguir, são dadas as N notas dos alunos, uma por linha.

Uma solução para essa tarefa é mostrada a seguir:

// Média da turma
var N, soma, nota, contador;

scanf(“%d”, “N”);
soma = 0.0;
contador = 1;
while (contador <= N) {
    scanf(“%f”, “nota”);
    soma = soma + nota;
    contador = contador + 1;
}

// escreve o resultado
printf(“%.1f\n”, soma/N);

Vamos resolver outra tarefa. Suponha que ao invés de calcular a média, desejemos saber qual a nota mais alta (considerando a entrada do problema anterior).

Uma solução para esse problema é dada a seguir. Nesse solução, a variável maior armazena o maior valor que já encontramos enquanto estivermos processando a lista. Assim, ao final, a variável maior vai conter o maior valor presente na lista.

Um outro ponto a notar é com que valor devemos iniciar a variável maior. Como nada foi especificado sobre os limites para os possíveis valores desta tarefa, a melhor alternativa para o valor inicial da variável maior é um dos valores da própria lista -- e o mais fácil é obviamente utilizar o primeiro valor da lista.

Note ainda que como um dos valores da lista já foi utilizado, o comando de repetição deve ser repetido N-1 vezes, e não N vezes. Conseguimos isso inicializando o valor da variável contador com 1, e utilizando a condição de parada (contador < N-1).

// Maior valor de uma lista de valores

var N,                   // Número de notas
    maior,               // armazena maior valor conhecido 
    valor, 
    contador;

scanf(“%d”, “N”);        // quantidade de valores
scanf(“%d”, “maior”);    // inicializa maior
contador = 1;
while (contador < N) {   // repete N-1 vezes
    scanf(“%d”, “valor”);
    if (valor > maior)
       maior = valor;    // encontramos novo maior
}

// escreve o resultado
printf(“%d\n”, maior/N);

 

 

 

Avalie este exercício

Campeã de streaming

A internet possibilitou o surgimento de uma nova maneira de escutar música, conhecida por streaming, em que a música é transmitida pela Internet em tempo real, ou on-line, sem ser armazenada pelo usuário (aliás, como ocorre com o rádio).

Leonardo encontrou, no site de uma revista sobre música, a lista com o número de vezes que músicas foram tocadas on-line durante a semana passada. Leandro ficou então curioso em saber qual foi o maior número de vezes que uma música foi tocada (em outras palavras, quantas vezes a música mais tocada foi tocada). O problema é que a lista não está ordenada, e o número de músicas é muito grande. Você pode ajudá-lo?

Entrada

A primeira linha da entrada contém um inteiro N, que indica o número de músicas. A segunda linha contém N inteiros Xi, indicando quantas vezes cada música foi tocada.

Saída

Seu programa deve produzir uma única linha, contendo um único inteiro, o maior número de vezes que uma música foi tocada.

Restrições

  • 1 ≤ N ≤ 100
  • 0 ≤ Xi ≤ 106, para 1 ≤ i ≤ N

Exemplos

Entrada
4
1000 4000 500 2500
Saída
4000

Entrada
6
0 1 6 6 2 3
Saída
6

 

 

Avalie este exercício

OBI

O principal prêmio da Olimpíada Brasileira de Informática é o convite para os cursos de programação oferecidos no Instituto de Computação da Unicamp, com todas as despesas pagas pela Fundação Carlos Chagas, patrocinadora da OBI. São convidados apenas os competidores que atingem um certo número mínimo de pontos, consideradas as duas fases de provas. Você foi contratado pela Coordenação da OBI para fazer um programa que, dados os números de pontos obtidos por cada competidor em cada uma das fases, e o número mínimo de pontos para ser convidado, determine quantos competidores serão convidados para o curso na Unicamp. Você deve considerar que

  • todos os competidores participaram das duas fases;
  • o total de pontos de um competidor é a soma dos pontos obtidos nas duas fases.
Por exemplo, se a pontuação mínima para ser convidado é 435 pontos, um competidor que tenha obtido 200 pontos na primeira fase e 235 pontos na segunda fase será convidado para o curso na Unicamp. Já um competidor que tenha obtido 200 pontos na primeira fase e 234 pontos na segunda fase não será convidado.

Entrada

A primeira linha da entrada contém dois números inteiros N e P, representando respectivamente o número de competidores e o número mínimo de pontos para ser convidado. Cada uma das N linhas seguintes contém dois números inteiros X e Y indicando a pontuação de um competidor em cada uma das fases.

Saída

Seu programa deve produzir uma única linha contendo um único inteiro, indicando o número de competidores que serão convidados a participar do curso na Unicamp.

Restrições

  • 1 ≤ N ≤ 1000
  • 1 ≤ P ≤ 1000
  • 0 ≤ X ≤ 400
  • 0 ≤ Y ≤ 400

Exemplos

Entrada
3 100
50 50
100 0
49 50
Saída
2

Entrada
4 235
100 134
0 0
200 200
150 150
Saída
2

Tarefa da OBI2008, Modalidade Programação Júnior, Fase 1

 

 

Avalie este exercício

Melhor aluno

Dona Vilma é uma professora muito querida pelos alunos. Além de ser uma ótima professora, ela costuma distribuir balas e bombons para quem tira a melhor nota nos testes. Ela pediu para você escrever um programa que, dada uma lista com os nomes dos alunos e as respectivas notas, determina o nome do aluno que tirou a maior nota.

Entrada

A primeira linha da entrada contém um inteiro N, indicando o número de alunos Cada uma das N linhas seguintes contém uma cadeia de caracteres S e um número X com duas casas decimais, indicando o nome a nota de um aluno. Todos os nomes são distintos e apenas um aluno vai ter a maior nota (isto é, não há empate para a maior nota).

Saída

Seu programa deve produzir uma única linha, contendo o nome do aluno que conseguiu a maior nota da prova.

Restrições

  • 1 ≤ N ≤ 20
  • 0.00 ≤ X ≤ 10.00
  • 1 ≤ comprimento de S ≤ 20
  • S contém apenas letras maiúsculas e minúsculas, sem acentos

Exemplos

Entrada
3
Beatriz 9.0
Carlos 8.2
Clara 9.4
Saída
Clara

Entrada
4
Alberto 8.5
Aline 5.0
Eduardo 6.0
Berenice 7.0
Saída
Alberto

 

 

Avalie este exercício

Garçom

Parte do treinamento de um novo garçom é carregar uma grande bandeja com várias latas de bebidas e copos e entregá-las todas numa mesa do restaurante. Durante o treinamento é comum que os garçons deixem cair as bandejas, quebrando todos os copos.

A SBC -- Sociedade Brasileira de Copos -- analisou estatísticas do treinamento de diversos garçons e descobriu que os garçons em treinamento deixam cair apenas bandejas que têm mais latas de bebidas que copos. Por exemplo, se uma bandeja tiver 10 latas e 4 copos, certamente o garçom em treinamento a deixará cair, quebrando os 4 copos. Já se a bandeja tiver 5 latas e 6 copos, ele conseguirá entregá-la sem deixar cair.

Escreva um programa que, dado o número de latas e copos em cada bandeja que o garçom tentou entregar, imprime o total de copos que ele quebrou.

Entrada

A primeira linha da entrada contém um inteiro N representando o número de bandejas que o garçom tentou entregar. As N linhas seguintes representam as N bandejas. Cada linha contém dois inteiros L e C, indicando o número de latas e o número de copos naquela bandeja, respectivamente.

Saída

Seu programa deve imprimir uma única linha, contendo um único inteiro, indicando o número total de copos que o garçom quebrou.

Restrições

  • 1 ≤ N ≤ 100
  • 0 ≤ L, C ≤ 100

Exemplos

Entrada
3
10 5
6 8
3 3
Saída
5

Entrada
4
10 6
8 8
5 1
100 100
Saída
7

Tarefa da OBI2010, Modalidade Programação Júnior, Fase 1

 

 

Avalie este exercício

Chocolate

Por lei, no reino da Nlogônia todas as barras de chocolate são quadradas. Anamaria tem uma barra quadrada de chocolate de lado L, que ela quer compartilhar com alguns colegas da obi. Mas ela é uma boa cidadã e cumpre a lei. Então, ela divide a barra em quatro pedaços quadrados, de lado L=L/2. Depois, ela repete esse procedimento com cada pedaço gerado, sucessivamente, enquanto o lado for maior do que, ou igual a 2cm.

Você deve escrever um programa que, dado o lado L da barra inicial, em centímetros, determina quantos pedaços haverá ao final do processo.

Entrada

A entrada consiste de uma linha, com um único inteiro, L, o número de centímetros do lado do quadrado.

Saída

Se programa deve produzir uma única linha, contendo um único inteiro, igual ao número total de pedaços obtidos pela Anamaria.

Restrições

  • 2 ≤ L ≤ 104

Exemplos

Entrada
4
Saída
16

Entrada
9
Saída
64

Entrada
2
Saída
4

Tarefa da OBI2012, Modalidade Programação Júnior, Fase 2

 

 

Avalie esta aula

Soluções para os exercícios

Nesta seção você encontra exemplos de soluções para os exercícios. Mas antes de ver a solução para um exercício tente resolvê-lo, criando a sua própria solução.

Solução do Exercício 1
Solução do Exercício 1
// Solução para o exercício 1 da Aula 9
// Campeã de streaming

var N,      // número de músicas
    x,      // número de vezes uma música foi tocada
    max,    // maior número de vezes que uma música foi tocada
    i;      // contador

// lê número de músicas
scanf("%d", "N");

max = 0;    // inicializa maior número de vezes com zero
i = 0;      // inicializa contador

while (i < N ) {
    // lê número de vezes  música foi tocada
    scanf("%d", "x"); 
    if (x > max) {
	max = x;     // encontramos um novo máximo
    }
    i = i + 1;
}

// escreve o resultado
printf("%d\n", max);

 

Solução do Exercício 2
Solução do Exercício 2
// Solução para o exercício 2, Aula 9
// OBI

var N,   // número de competidores e pontos mínimos
    P,   // pontos mínimos
    x,   // pontos fase 1
    y,   // pontos fase 2
    tot, // total de competidores
    i;   // contador

// lê número de competidores e pontos mínimos
scanf("%d%d","N","P");

tot = 0;  // inicializa total de competidores com zero
i = 1;    // inicializa contador
while (i <= N) {
   // lê pontuações do competidor
   scanf("%d%d", "x", "y");
   if ((x+y) >= P)
      tot = tot + 1;          // mais um convidado
  i = i + 1;
}

// resultado é o número total de convidados
printf("%d\n",tot);

 

Solução do Exercício 3
Solução do Exercício 3
// Solução para o exercício 3 da Aula 9
// Melhor aluno

var N,      // número de alunos
    nome,   // nome de um aluno
    nota,   // nota de um aluno
    melhor, // nome do melhor aluno
    max,    // nota do melhor aluno
    i;      // contador

// lê número de alunos
scanf("%d", "N");

max = -1.0;   // inicializa melhor nota conhecida até o momento
              // com um valor menor do que a menor nota possível,
              // que é 0.0
i = 0;        // inicializa contador

while (i < N ) {
    // lê nome e nota de um aluno
    scanf("%s%f", "nome", "nota"); 
    if (nota > max) {
	melhor = nome;  // encontramos um aluno com nota
	max = nota;     // maior, armazena esse nome e nota
    }
    i = i + 1;
}

// escreve o resultado
printf("%s\n", melhor);

 

Solução do Exercício 4
Solução do Exercício 4
// Solução para o exercício 4, Aula 9
// Garçom

var N,         // número de bandejas
    latas,     // número de latas em uma bandeja
    copos,     // número de copos em uma bandeja
    quebrados, // total de copos quebrados
    i;         // contador

// lê número de bandejas
scanf("%d","N");

quebrados = 0;  // inicializa total de copos quebrados
i = 0;          // inicializa contador
while (i < N) {
   scanf("%d%d", "latas", "copos");   // latas e copos desta bandeja
   if (latas>copos)
      quebrados = quebrados + copos;  // quebra os copos
   i = i + 1;
}

// escreve o resultado
printf("%d\n", quebrados);

 

Solução do Exercício 5
Solução do Exercício 5
// Solução para o exercício 5 da Aula 9
// Chocolate

var L,      // comprimento do lado
    res;    // resposta

// lê comprimento do lado 
scanf("%d", "L");

res = 1;         // no início temos um pedaço
                 // de tamanho L
// note que para esta repetição não precisamos de um contador
while (L >= 2) {
    L = L/2;     // divide a barra em pedaços de lado L/2
    res = res*4; // gerando 4 vezes mais pedaços
}

// escreve o resultado
printf("%d\n", res);

 

 

 
Área de Trabalho
Entrada
Programa
Saída