Exercício 1
Comentário: (digite uma frase para facilitar a busca)
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.
O formato geral do comando de repetição while é:
while (expressão_lógica) {
bloco_de_comandos
}
O que ocorre na execuçã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);
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?
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.
Seu programa deve produzir uma única linha, contendo um único inteiro, o maior número de vezes que uma música foi tocada.
Entrada
4 1000 4000 500 2500 |
Saída
4000 |
Entrada
6 0 1 6 6 2 3 |
Saída
6 |
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
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.
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.
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
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.
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).
Seu programa deve produzir uma única linha, contendo o nome do aluno que conseguiu a maior nota da prova.
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 |
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.
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.
Seu programa deve imprimir uma única linha, contendo um único inteiro, indicando o número total de copos que o garçom quebrou.
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
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.
A entrada consiste de uma linha, com um único inteiro, L, o número de centímetros do lado do quadrado.
Se programa deve produzir uma única linha, contendo um único inteiro, igual ao número total de pedaços obtidos pela Anamaria.
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
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 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 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 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 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 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);