Exercício 1
Comentário: (digite uma frase para facilitar a busca)
Em Javascript, o comando de atribuição que soma um a uma variável de nome nome_var pode ser abreviado pela expressão nome_var++ (ou seja, o nome da variável seguido de dois sinais "+" consecutivos). Por exemplo, o comando
i = i + 1;
pode ser abreviado por
i++;
De forma similar, o comando de atribuição que subtrai um de uma variável de nome nome_var pode ser abreviado pela expressão nome_var++ (ou seja, o nome da variável seguido de dois sinais "-" consecutivos). Por exemplo, o comando
contador = contador - 1;
pode ser abreviado por
contador--;
Note que são apenas abreviações, e você pode usar ou não, dependendo da conveniência.
O comando de repetição for pode ser visto também como uma abreviação do comando de repetição while. O comando for à direita executa exatamente o mesmo que o comando while à esquerda.
i = 1;
while (i<=10) {
printf("i=%d\n", i);
i = i + 1;
}
|
for (i=1; i<=10; i++) {
printf("i=%d\n", i);
}
|
O formato geral do comando de repetição for é:
for (comando inicial ; expressão_lógica ; incremento) {
bloco_de_comandos
}
(note os caracteres ponto-e-vírgula separando os componentes do comando for; eles são importantes!).
O que ocorre na execução:
Note mais uma vez a semelhança com o comando while no exemplo abaixo, em que o comando inicial está colorido com azul, a expressão lógica está colorida com rosa, o incremento está colorido com verde, e o bloco de comandos está colorido com amarelo:
i = 1; while (i<=10) { printf("i=%d\n", i); i = i + 1; } |
for (i=1 ; i<=10 ; i++) { printf("i=%d\n", i); } |
Como último exemplo, vejam um programa que usa dois comandos de repetição encaixados para escrever na saída um retângulo de 3 linhas por 5 colunas de caracteres asteriscos, como abaixo:
***** ***** *****
implementado usando comandos while e comandos for:
var i, j; i = 1; while (i<=3) { // para cada linha, escreve a // linha com um outro comando while j = 1; while (j<=5) { // para cada coluna escreve um '*' printf("*"); j = j + 1; } // ao final da linha, // escreve caractere final-de-linha printf("\n"); i = i + 1; } |
var i, j; for (i=1; i<=3; i++) { // para cada linha, escreve a // linha com um outro comando for for (j=1; j<=5; j++) { // para cada coluna escreve um '*' printf("*"); } // ao final da linha, // escreve caractere final-de-linha printf("\n"); } |
Quando precisamos interromper a execução de um comando de repetição, usamos o comando break.
Como um exemplo simplório, o trecho de programa abaixo escreve apenas três valores na saída (10, 11 e 12) apesar de a expressão lógica do comando for indicar que a repetição deveria acontecer enquanto i<=1000:
var i; for (i=10; i<=1000; i++) { printf("%d\n", i); if (i===12) break; } printf("fim\n");
Quando i é igual a 12, o comando break é executado, e isso faz com que a execução do comando for termine. O próximo comando executado é então o comando de escrita printf que escreve "fim", de forma que o programa acima escreve na saída quatro linhas:
10 11 12 fim
O comando break interrompe somente o comando de repetição no qual está inserido. Ou seja, se o comando break é usado em um comando de repetição encaixado, apenas o comando de repetição mais interno é interrompido.
Joana criou um canal no YouTube, que tem feito muito sucesso! Desde o primeiro dia, diariamente Joana anota o número de visualizações de vídeos do seu canal, no que ela chamou de Lista de Audiência.
Joana quer saber se sua Lista de Audiência é estritamente crescente (ou seja, se cada elemento na lista é maior do que o elemento imediatamente anterior). Você pode ajudá-la?
A entrada consiste de duas linhas. A primeira linha contém um número inteiro N que indica o comprimento da Lista de Audiência. A segunda linha descreve os elementos da Lista de Audiência. Ela contém N inteiros Xi, indicando o número de visualizações em dias consecutivos.
Seu programa deve escrever uma única linha na saída contendo apenas um caractere: "S" se a Lista de Audiência é estritamente crescente, ou "N" caso contrário.
Entrada
5 10 30 40 41 80 |
Saída
S |
Entrada
4 1 1000 1000 10000 |
Saída
N |
Entrada
3 3 2 1 |
Saída
N |
Zinho quer ser comerciante quando crescer. Como todo comerciante, Zinho gosta de negociar, especialmente quando as duas partes ficam satisfeitas com o resultado da negociação. E, claro, também é bom poder ganhar dinheiro fazendo o que se gosta!
Apesar da pouca idade, Zinho já percebeu que pode ganhar dinheiro com compras e vendas pela Internet. Zinho quer comprar e revender uma série de itens, ganhando dinheiro ao final da sequência de compras e vendas. Zinho acredita que consegue comprar por exemplo uma console de jogos e vendê-la logo em seguida por um valor um pouco maior do que pagou, usar o dinheiro para comprar um outro item e novamente vendê-lo por um pouco mais do que pagou, e assim ir ganhando dinheiro. O segredo está na propaganda, diz Zinho.
Zinho já fez inclusive uma lista com a sequência de itens a serem comprados e revendidos, na ordem que deseja efetuar as transações. No entanto, Zinho não tem o dinheiro inicial para comprar o primeiro item de sua lista, e pediu ao seu avô o dinheiro emprestado. O avô de Zinho é bem legal mas foi também um grande comerciante, e disse que somente empresta o dinheiro sob as seguintes condições:
A lista de Zinho indica o valor pelo qual ele pretende comprar e vender cada item; na lista, todos os itens comprados são revendidos (ou seja, o número de transações de compra é igual ao número de transações de venda).
Mas a lista tem uma grande quantidade de itens, e antes de mostrá-la a seu avô ele quer ter a certeza de que a lista obedece às restrições impostas. Você pode ajudá-lo?
A entrada consiste de duas linhas. A primeira linha contém um número inteiro N e um número real C, com duas casas decimais, que indicam respectivamente o comprimento da sequência de transações e o valor emprestado pelo avô. A segunda linha contém N valores Xi, com precisão de duas casas decimais, indicando os valores das transações. Uma transação de compra é dada como um número negativo, e uma transação de venda é dada como um número positivo.
Seu programa deve escrever uma única linha na saída contendo
Entrada
6 100.00 -100.00 110.00 -90.00 100.00 -10.00 20.00 |
Saída
30.00 |
Entrada
2 200.00 -150.00 140.00 |
Saída
* |
Entrada
4 100.00 -50.00 100.00 -200.00 500.00 |
Saída
* |
Entrada
4 10.00 -5.00 -5.00 500.00 500.00 |
Saída
990.00 |
A sequência de Fibonacci é uma das sequências de números mais famosas. Ela começa assim:
1, 1, 2, 3, 5, 8, 13, 21, 34, ...
À primeira vista pode ser difícil perceber a regra de formação da sequência, mas ela é muito simples: os dois primeiros elementos são 1 e a partir do terceiro cada elemento é a soma dos dois elementos precedentes:
A entrada consiste de duas linhas. A primeira linha contém um número inteiro N que indica o comprimento da sequência de números. A segunda linha contém N números inteiros Xi, descrevendo a sequência encontrada nas escavações.
Seu programa deve imprimir uma única linha contendo um único caractere, 'S' se a sequência encontrada é uma sequência de Fibonacci, e 'N' caso contrário.
Entrada
6 1 1 2 3 5 8 |
Saída
S |
Entrada
10 1 1 2 3 5 8 13 21 33 55 |
Saída
N |
Entrada
2 1 2 |
Saída
N |
Entrada
12 1 1 2 3 5 8 13 21 34 55 89 144 |
Saída
S |
A cada dia uma quantidade enorme de informação é postada na Internet. Sobre tudo e sobre todos! Luísa recentemente descrobriu uma página que disponibiliza uma tabela com o volume de água em algumas represas do país. A tabela contém, para cada represa, para cada dia, a porcentagem de água represada em relação à capacidade total.
Cada linha da tabela representa a medição de um dia, cada coluna representa uma represa. A figura abaixo mostra um exemplo da tabela para as represas 1, 2, 3 e 4, com dados de cinco dias.
Represa | |||
1 | 2 | 3 | 4 |
80.0 | 90.1 | 78.0 | 60.2 |
81.9 | 89.9 | 79.1 | 60.8 |
82.0 | 89.8 | 79.0 | 59.9 |
81.5 | 89.6 | 79.3 | 58.2 |
80.3 | 89.5 | 78.8 | 56.6 |
Luísa está interessada nos dados da represa de sua região (uma coluna da tabela). Ela quer verificar se é verdade uma notícia que ela leu no jornal: que a o volume de água represada em caindo continuamente, dia após dia, desde o início das medições, mesmo tendo chovido normalmente.
Como são muitos dados, ela pediu que você faça um programa para fazer a análise.
A primeira linha contém dois inteiros N, M e C que indicam respectivamente o número de dias (linhas da tabela), o número de represas (colunas da tabela), e a coluna de interesse de Luísa. As represas são identificadas por números de 1 a M. Cada uma das N linhas seguintes contém M números inteiros Xi,j, representando o volume de água para cada represa em um dia.
Seu programa deve imprimir uma única linha contendo um único caractere, que deve ser 'S' se as medições para a coluna de interesse são estritamente decrescentes, ou o caractere 'N' caso contrário.
Entrada
4 3 1 90.0 90.8 90.2 89.0 88.1 89.3 88.0 88.1 90.4 87.0 87.2 89.7 |
Saída
S |
Entrada
4 3 2 90.0 90.8 90.2 89.0 88.1 89.3 88.0 88.1 90.4 87.0 87.2 89.7 |
Saída
N |
Entrada
4 3 3 90.0 90.8 90.2 89.0 88.1 89.3 88.0 88.1 90.4 87.0 87.2 89.7 |
Saída
N |
O famoso cientista Dr. Ding Dong anunciou uma invenção extraordinária. A partir de uma pequena amostra do DNA de uma pessoa o Dr. Ding Dong desenvolveu um procedimento que permite testar se essa pessoa tem alergia a qualquer substância. A descoberta desse teste vai beneficiar milhões de pessoas que sofrem de alergia e não conseguem determinar a causa.
Mais especificamente, o processo do Dr. Ding Dong gera, a partir da amostra de DNA, uma sequência de letras minúsculas, de 'a' a 'z'. O Dr. Ding Dong precisa, para terminar sua invenção, de um programa que, dada a sequência de letras, determina qual o maior número de letras 'a' consecutivas.
Por exemplo, para a sequência "b a a a a c d" o resultado é 4, pois o maior número de letras 'a' consecutivas é esse. Já para a sequência "x a a a x x a a a x" o resultado é 3.
O Dr. Ding Dong promete repartir os louros e os lucros da invenção com quem ajudá-lo. Quem se interessa?
A entrada consiste de duas linhas. A primeira linha contém um inteiro N que indica o comprimento da sequência de letras. A segunda linha contém N letras Xi, separadas por um espaço em branco.
Seu programa deve imprimir uma única linha contendo um único inteiro, o comprimento da maior sequência consecutiva de letras 'a'.
Entrada
5 a a a b a |
Saída
3 |
Entrada
8 a z a y a z a a |
Saída
2 |
Entrada
4 b c d e |
Saída
0 |
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, Aula 13 // Audiência crescente // Autor: Ricardo Anido var N, // comprimento da lista i, // contador para a repetição corrente, // valor do elemento corrente anterior, // valor do elemento anterior resultado; // resultado (S ou N) scanf("%d", "N"); // comprimento da lista scanf("%d", "anterior"); // primeiro valor resultado = "S"; // assume que é crescente for (i=2; i<=N; i++) { scanf("%d", "corrente"); if (corrente <= anterior) { resultado = "N"; // não é crescente break; // pode parar de ler! } anterior = corrente; } // imprime o resultado printf("%s\n", resultado);
Solução do Exercício 2
// Solução para o exercício 2, aula 13 // Comércio pela Internet var i, // usado como contador N, // comprimento da sequência transacao, // valor da transação corrente caixa_inicial, // valor em caixa no início caixa; // valor em caixa corrente // lê comprimento da sequência e valor inicial do caixa scanf("%d%f", "N", "caixa_inicial"); // inicializa valor do caixa corrente caixa = caixa_inicial; // percorre todas as transações da sequência for (i=1; i<=N; i++) { scanf("%f","transacao"); caixa = caixa + transacao; if (caixa < 0) // se não consegue comprar interrompe a repetição break; } // escreve o resultado if (caixa > caixa_inicial) printf("%.2f\n", caixa - caixa_inicial); else printf("*\n");
Solução do Exercício 3
// Solução para o exercício 3, aula 13 // Fibonacci var i, // usado como contador N, // comprimento da sequência resultado, // armazena o resultado, S ou N antecessor, // valor antecessor ante_antecessor; // valor ante_antecessor // vamos assumir que a sequência está correta resultado = "S"; // lê comprimento da sequência scanf("%d", "N"); // lê os dois primeiros elementos, que devem ser 1 scanf("%d%d", "ante_antecessor", "antecessor"); if (ante_antecessor!=1 || antecessor != 1) // sequência não está correta resultado = "N"; else { // percorre todas os outros elementos da sequência for (i=3; i<=N; i++) { // lê elemento scanf("%d", "corrente"); // verifica se tem valor esperado if (corrente != antecessor+ante_antecessor) { // sequência não está correta resultado = "N"; break; } // atualiza valores ante_antecessor = antecessor; antecessor = corrente; } } // escreve o resultado printf("%s\n", resultado);
Solução do Exercício 4
// Solução para o exercício 4, aula 13 // Volume decrescente var i, j, // usados como contadores N, // número de linhas da tabela M, // número de colunas da tabela C, // coluna de interesse corrente, // valor corrente de medição ultimo, // último valor lido resultado; // armazena o resultado, S ou N // lê número de linhas e de colunas da tabela scanf("%d%d%d", "N", "M", "C"); // inicializa último valor lido ultimo=101; // vamos assumir que a coluna é estritamente decrescente resultado = "S"; // percorre todos as linhas da tabela for (i=1; i<=N; i++) { // percorre todos as colunas da tabela for (j=1; j<=M; j++) { // lê um valor da tabela scanf("%f","corrente"); if (j===C) { // é a coluna de interesse? if (corrente>=ultimo) { resultado = "N"; // marca que coluna não é decrescente break; } ultimo = corrente; } } } // escreve o resultado printf("%s\n", resultado);
Solução do Exercício 5
// Solução para o exercício 4, aula 13 // O teste perfeito var i, // usado como contador N, // comprimento da sequência corrente, // a letra corrente lido da sequência ultimo, // a última letra lido da sequência max_corrente, // a maior número de 'a' consecutivos corrente max_total; // a maior número de 'a' consecutivos total // lê comprimento da sequência scanf("%d", "N"); // inicializa alguns valores max_total=0; max_corrente=0; ultimo='x'; // percorre todos as letras da sequência for (i=1; i<=N; i++) { scanf("%s","corrente"); if (corrente===ultimo) { if (corrente === "a") // encontramos outro 'a' consecutivo max_corrente++; } else if (corrente==="a") { // ultimo é diferente de "a", corrente é "a" // iniciamos uma nova sub-sequência de 'a' consecutivos max_corrente = 1; } else { // ultimo é "a", corrente é diferente de "a" // terminou uma sub-sequência de "a" consecutivos // verifica se seu comprimento é o maior conhecido até o momento if (max_corrente>max_total) max_total = max_corrente; // encontramos uma sub-sequência maior } ultimo = corrente; } if (ultimo==="a") { // se ultima letra é "a", a sub-sequência de "a" terminou com o final da sequência // verifica se seu comprimento é o maior conhecido até o momento if (max_corrente>max_total) max_total = max_corrente; // encontramos uma sub-sequência maior } // escreve o resultado printf("%d\n", max_total);