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);