Buscar

3 - Exercícios de Estruturas de Controle

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 11 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 11 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 11 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Exercícios de Revisão 
4.1 Preencha as lacunas em cada uma das seguintes expressões. a) A repetição controlada por contador também é conhecida como repetição _____________ porque sabe-se de antemão quantas vezes o loop será executado. b) A repetição controlada por sentinela também é conhecida como repetição _____________ porque não se sabe de antemão quantas vezes o loop será executado. c) Em uma repetição controlada por contador, utiliza-se um _____________ para contar o número de vezes que um grupo de instruções deve ser repetido. d) A instrução __________ , quando executada em uma estrutura de repetição, faz com que a próxima iteração do loop seja realizada imediatamente. e) A instrução __________ , quando executada em uma estrutura de repetição ou instrução switch causa a saída imediata da estrutura. f) A _____________ é usada para examinar cada um dos valores constantes inteiros que uma determinada variável ou expressão pode assumir. 
4.2 Diga se cada uma das seguintes afirmações é verdadeira ou falsa. Se a afirmação for falsa, explique por quê. a) A estrutura de seleção switch exige o caso default. b) O caso default de uma estrutura de seleção switch exige a instrução break. c) A expressão (x>y&&a<b) é verdadeira se x>y for verdadeiro ou se a<b for verdadeiro. d) Uma expressão contendo o operador I I é verdadeira se um ou ambos os operandos forem verdadeiros. 
4.3 Escreva uma instrução ou um conjunto de instruções em C para realizar cada uma das seguintes tarefas: a) Somar os inteiros ímpares entre 1 e 99 usando uma estrutura for. Admita que as variáveis inteiras soma e contagem já foram declarados. b) Imprima o valor 333.546372 em um campo com 15 caracteres com precisões de 1, 2, 3, 4 e 5. Alinhe (justifique) a saída pela esquerda. Quais os cinco valores impressos? c) Calcule o valor de 2,5 elevado ao cubo (potência 3) usando a função pow. Imprima o resultado com uma precisão de 2 em um campo com largura de 10 posições. Qual o valor impresso? d) Imprima os inteiros de 1 a 20 usando um loop while e a variável x. Considere que a variável x já foi declarada, mas não inicializada. Imprima somente 5 inteiros por linha. Sugestão: Use o cálculo x % 5. Quando o valor desse cálculo for 0, imprima um caractere de nova linha; caso contrário, imprima um caractere de tabulação. Repita o exercício 4.3(d) usando uma estrutura for. 
4.4 Encontre o erro em cada um dos segmentos de código a seguir e explique como corrigi-lo. a) x = 1; while (x <= 10) ; x++; } g) for (y = .1; y != 1.0; y += .1) printf("%f\n", y); c) switch (n) { case 1: printf("O numero e 1\n"); case 2: printf("O numero e 2\nn); break; 
default: printf ("O numero nao e 1 nem 2\n"); break; } d) O código a seguir deve imprimir valores de 1 a 10. n = 1; while (n < 10) printf("%d ", n++); 
 
Respostas dos Exercícios de Revisão 
4.1 a) definida. b) indefinida. c) variável de controle ou contador. d) continue. e) break. f) estrutura de seleção switch. 
4.2 a) Falso. O caso default é opcional. Se não forem necessárias ações default, não há necessidade de um caso default. b) Falso. A instrução break é usada para sair da estrutura switch. A instrução break não é exigida quando o caso default é o último. c) Falso. Ambas as expressões relacionais devem ser verdadeiras para que toda a expressão seja verdadeira quando o operador && é utilizado. Verdadeiro. 
4.3 a) soma = 0; for (contagem = 1; contagem <= 99; contagem += 2) soma += contagem; b) printf ("%-15.1f\n", 333.546372); /* imprime 333.5 */ printf("%-15.2f\n", 333.546372); /* imprime 333.55 */ printf("%-15.3f\n", 333.546372); /* imprime 333.546 */ printf("%-15.4f\n", 333.546372); /* imprime 333.5464 */ printf("%-15.5f\n", 333.546372); /* imprime 333.54637 */ c) printf("%10.2f\n", pow (2.5, 3)); /* imprime 15.63 */ d) x = 1; while (x <= 20) { printf("%d", x); if (x % 5 == ) printf("\n"); else printf("\t") ; x++; } ou x = 1; while (x <= 20) if (x % 5 == 0) printf("%d\n", x++); else printf("%d\t", x++): ou x = 0; while (++x <= 20) if (x % 5 == 0) printf("%d\n", x); else printf("%d\t", x) 49. for (x = 1; x <= 20; x++) { printf("%d", x); if (x % 5 == 0) printf("\n"); else } printf("\t"); ou for (x = 1; x <= 20; x++) if (x % 5 == 0) printf("%d\n", x); else printf("%d\t", x); 
 
4.4 a) Erro: O ponto-e-vírgula depois do cabeçalho do while causa um loop infinito. Correção: Substituir o ponto-e-vírgula por um { ou remover tanto o ; como o } b) Erro: Usar um número de ponto flutuante para controlar uma estrutura de repetição for Correção: Usar um número inteiro e realizar o cálculo adequado para obter os valores desejados. for (y = 1; y != 10; y++) printf("%f\n",(float)y /10); c) Erro: Falta a instrução break nas instruções do primeiro case. Correção: Adicionar uma instrução break no final das instruções do primeiro case. Note que isto não é necessariamente um erro se o programador quiser que a instrução do case 2 : seja executada sempre que a instrução de case 1: for executada. 2. Erro: Operador relacionai inadequado na condição de repetição do while. Correção: Usar <= em vez de <. 
 
Exercícios 
4.4 Ache o erro em cada uma das opções a seguir: (Obs.: pode haver mais de um erro.) a) For (x = 100, x >= 1, x++) printf("%d\n" , x); b) O código a seguir deve imprimir se o número dado é ímpar ou par: switch (valor % 2) { case 0: printf("Inteiro par\n"); case 1: printf ("Inteiro impar\n"); } c) O código a seguir deve receber como entrada de dados um inteiro e um caractere e imprimi-los. Admita que o usuário digitou 100 A como entrada de dados. scanf("%d", &intVal); charVal = getchar ( ); printf("Inteiro: %d\nCaractere: %c\n", intVal, charVal); d) for (x = .000001; x <= .0001; x += .000001) printf("%.7f\n", x); e) O código a seguir deve fornecer como saída os inteiros ímpares de 999 até 1: for (x = 999; x >= 1; x += 2) printf("%d\n", x); f) O código a seguir deve fornecer como saída os inteiros pares de 2 até 100: contador = 2; Do { if (contador % 2 == 0) printf ("%d\n", contador); contador += 2; } While (contador < 100); 
4.5 O código a seguir deve somar os inteiros de 100 até 150 (admita que total foi inicializado como 0): for (x = 100; x <= 150; x+ + ); total += x; 
4.6 Diga que valores da variável de controle x são impressos por cada uma das seguintes instruções: a) for(x = 2; x <= 13; x+= 2) printf("%d\n", x); b) for(x = 5; x <= 22; x+= 7) printf("%â\n", x); c) for(x = 3; x <= 15; x+= 3) printf("%d\n", x); d) for(x = 1; x <= 5; x+= 7) printf("%d\n", x); e) for(x = 12; x <= 2; x -= 3) printf("%d\n", x); 
4.7 Escreva instruções for que imprimam as seguintes series de valores: a) 1,2,3,4,5,6,7 b) 3,8,13,18,23 c) 10,14,8,2,-4,-10 d) 19, 27,35,43,51 
4.8 O que o seguinte programa faz? #include <stdio.h> main ) { int i, j, x, y; printf("Entre com inteiros no intervalo 1-20: "); scanf("%d%d", &x, &y) ; for (i = 1; i <= y; i++) { for (j = 1; j <= x; j++) printf("@") ; printf("\n"); } return 0; } 
4.9 Escreva um programa que some uma seqüência de inteiros. Admita que o primeiro inteiro lido com scanf especifica o número de valores que ainda devem ser fornecidos. Seu programa deve ler apenas um valor cada vez que scanf for executado. Uma seqüência típica de entrada poderia ser 5 100 200 300 400 500 onde o 5 indica que os valores subseqüentes 5 devem ser somados. 
4.10 Escreva um programa que calcule e imprima a média de vários inteiros. Admita que o último valor lido com scanf é o sentinela 9999. Uma seqüência típica de entrada poderia ser 10 8 11 7 9 9999 indicando que a média de todos os valores que aparecem antes de 9999 deve ser calculada. 
4.11 Escreva um programa que encontre o menor valor entre vários inteiros. Admita que o primeiro valor lido especifica o número de valores restantes. 
4.12 Escreva um programa que calcule e imprima a soma dos inteirospares de 2 a 30. 
4.13 Escreva um programa que calcule e imprima o produto dos inteiros ímpares de 1 a 15. 
4.14 A função fatorial é usada com freqüência em problemas de probabilidade. O fatorial de um número positivo n (escrito n! e pronunciado "fatorial de n") é igual ao produto dos inteiros positivos de 1 a n. Escreva um programa que calcule os fatoriais dos inteiros de 1 a 5. Imprima o resultado no formato de uma tabela. Que problema pode evitar que você possa calcular o fatorial de 20? 
4.15 Modifique o programa de juros compostos da Seção 4.6 para repetir seus passos para taxas de juros de 5 por cento, 6 por cento, 7 por cento, 8 por cento, 9 por cento e 10 por cento. Use um loop for para variar a taxa de juros. 
 
4.16 Escreva um programa que imprima os seguintes padrões separadamente, um abaixo do outro. Use loops for para gerar os padrões. Todos os asteriscos (*) devem ser impressos por uma única instrução printf na forma printf ("*"); (isto faz com que os asteriscos sejam impressos lado a lado). Sugestão: Os dois últimos padrões exigem que cada linha comece com um número adequado de espaços em branco. (A) (B) (C) (D) 
4.17 Economizar dinheiro se torna muito difícil em períodos de recessão, portanto as empresas podem reduzir seus limites de crédito para evitar que suas contas a receber (dinheiro que lhes é devido) se tornem muito grandes. Em resposta a uma recessão prolongada, uma companhia reduziu o limite de crédito de seus clientes à metade. Desta forma, se um cliente tinha um limite de crédito de $2000, agora seu limite passou a ser | $1000. Se um cliente tinha um limite de crédito de $5000, seu limite passou a ser $2500. Escreva um programa que analise a situação do crédito de três clientes dessa companhia. De cada cliente você recebe 1. O número de sua conta 2. Seu limite de crédito antes da recessão 3. Seu saldo atual (i.e., a quantia que o cliente deve à companhia). Seu programa deve calcular e imprimir o novo limite de crédito de cada cliente e determinar (e imprimir) | que clientes possuem saldos que excedem seus novos limites de crédito. 
4.18 Uma aplicação interessante dos computadores é para desenhar gráficos de linhas e de barras (chamados algumas vezes "histogramas"). Escreva um programa que leia cinco números (cada um deles entre 1 e 30). Para cada número lido, seu programa deve imprimir uma linha contendo aquele número de asteriscos adjacentes. Por exemplo, se seu programa ler o número sete, deve imprimir *******. 
4.19 Uma loja de venda de produtos por reembolso postal vende cinco produtos diferentes cujos preços de varejo são mostrados na tabela seguir: Número do produto Preço de varejo 1 2 3 4 5 
$ 2,98 4,50 9,98 4,49 6,87 Escreva um programa que leia uma série de pares de números como se segue: Número do produto Quantidade vendida em um dia Seu programa deve usar uma instrução switch para ajudar a determinar o preço de varejo de cada produto. Seu programa deve calcular e mostrar o valor total a varejo de todos os produtos vendidos na semana passada. 
4.20 Complete as seguintes tabelas de verdade preenchendo cada espaço em branco com 0 ou 1. expressão1 expressão2 expressão 1 && expressão2 0 0 Diferente de zero Diferente de zero 
0 Diferente de zero 0 Diferente de zero 
0 0 _ _ expressão1 expressão2 expressão 1 | | expressão2 0 0 Diferente de zero Diferente de zero 
0 Diferente de zero 0 Diferente de zero 
0 0 _ _ 
expressão !expressão 0 Diferente de zero 1 _ 
 4.21 Escreva novamente o programa da Fig. 4.2 de modo que a inicialização da variável contador seja feita na declaração e não na estrutura for. 
4.22 Modifique o programa da Fig. 4.7 de forma que ele calcule o grau médio da turma. 
4.23 Modifique o programa da Fig. 4.6 de forma que ele use somente inteiros para calcular os juros compostos. (Sugestão: Trate todas as quantias monetárias como números inteiros de pennies, sabendo que um penny é um centésimo de um dólar. A seguir, "divida" o resultado em suas partes de dólares e cents usando as operações de divisão e resto, respectivamente. Insira um ponto.) 
4.24 Admita que i = 1, j = 2, k = 3 e m = 2. O que cada uma das seguintes instruções imprime? a) printf("%d", i == 1); b) printf("%d", j == 3); c) printf("%d", i >= 1 && j < 4); d) printf("%d", m <= 99 && k < m); e) printf("%d", j >= i I I k == m); f) printf("%d", k + m < j | | 3 - j >= k) ; g) printf("%d", !m); h) printf("%d", ! (j - m)); i) printf ("%d", ! (k > m) ) ; j) printf("%d", ! (j > k)); 
 
4.25 Imprima uma tabela de valores equivalentes decimais, binários, octais e hexadecimais. Se você não está familiarizado com estes sistemas de numeração, leia inicialmente o Apêndice D se quiser tentar solucionar este exercício. 
4.26 Calcule o valor de ir a partir da série infinita . 4,4 4,4 4 , 3 5 7 9 11 Imprima uma tabela que mostra o valor de (pi) aproximado por 1 termo dessa série, por dois termos, por três termos etc. Quantos termos dessa série são necessários para obter 3.14? 3.141? 3.1415? 3.14159? 
4.27 (Números de Pitágoras) Um triângulo retângulo pode ter lados que sejam todos inteiros. O conjunto de três valores inteiros para os lados de um triângulo retângulo é chamado números de Pitágoras. Esses três lados j devem satisfazer o relacionamento de que a soma dos quadrados dos dois lados (catetos) deve ser igual ao quadrado da hipotenusa. Encontre todos os números de Pitágoras para cateto1, cateto2 e hipotenusa menores que 500. Use três loops for aninhados que simplesmente experimentem todas as possibilidades. Este é um exemplo de cálculo por "força bruta". Ela não é esteticamente agradável para muitas pessoas. Mas há muitas razões para estas técnicas serem importantes. Em primeiro lugar, com o poder da computação crescendo a um ritmo tão acelerado, as soluções que levariam anos ou mesmo séculos de tempo de cálculo para serem produzidas com a tecnologia de apenas alguns anos atrás podem ser produzidas atualmente em horas, minutos ou mesmo segundos. Os chips recentes de microprocessadores podem processar mais de 100 milhões de instruções por segundo! E é provável que chips capazes de processar bilhões de instruções por segundo apareçam ainda nos anos 90. Em segundo lugar, como você aprenderá em cursos mais avançados de ciência da computação, há um número grande de problemas interessantes para os quais não há método conhecido para um algoritmo diferente daquele utilizado pela força bruta. Investigamos muitos tipos de metodologias para resolução de problemas neste livro. Levaremos em consideração muitos métodos de força bruta em vários problemas interessantes. 
4.28 Uma empresa paga seus empregados como gerentes (que recebem um salário fixo mensal), trabalhadores comuns (que recebem um salário fixo por hora para as primeiras 40 horas de trabalho e 1,5 vez seu salário por hora normal para as horas extras trabalhadas), trabalhadores por comissão (que recebem $250 mais 5,7% de suas vendas brutas) ou trabalhadores por empreitada (que recebem uma quantia fixa por item para cada um dos itens produzidos cada trabalhador por empreitada dessa empresa trabalha com apenas um tipo dei item). Escreva um programa que calcule o pagamento semanal de cada empregado. Você não sabe de antemão o número de empregados. Cada tipo de empregado tem seu código próprio de pagamento: gerentes possuem o código 1, trabalhadores comuns, o código 2, trabalhadores por comissão, o código 3, e trabalhadores por empreitada, o código 4. Use switch para calcular o pagamento de cada empregado com base em seu código de pagamento. Dentro do switch peça ao usuário (i.e., o responsável pela folha de pagamento) para entrar com os fatos adequados à necessidade de seu programa para calcular o pagamento de cada empregado com base em seu código. 
4.29 (Leis de De Morgan) Neste capítulo, analisamos os operadores lógicos &&, II e !. As Leis de De Morgan podem fazer com que algumas vezes nos seja maisconveniente exprimir uma expressão lógica. Estas lei afirmam que a expressão ! (condição 1 && condição2) é logicamente equivalente à expressão (!condição1 I I ! condição2). Além disso, a expressão ! (condição1 | | condição2) é logicamente equilente à expressão ( ! condição1 | | ! condição2). Use as Leis de De Morgan para escrever expressões equivalentes a cada um dos itens seguintes e depois escreva um programa que mostre que a expressão original e a nova expressão em cada caso são equivalentes. 
 a) ! (x < 5) && ! (y >= 7) b) !(a == b) II !(g != 5) c) !((x <= 8) && (Y > 4)) d) !( (i > 4) II (j <= 6) ) 
4.30 Escreva novamente o programa da Fig. 4.7 substituindo a instrução switch por uma instrução if/else aninhada: tenha o cuidado de lidar adequadamente com o caso default. Depois escreva novamente esta nova versão substituindo a instrução if/else aninhada por uma série de instruções if; aqui, também, tenha o cuidado de lidar apropriadamente com o caso default (isso é mais difícil do que com a versão if/else aninhada). Este exercício demonstra que switch é uma comodidade e que qualquer instrução switch pode ser escrita apenas com instruções de seleção simples. 431 
4.31 Modifique o programa escrito no Exercício 4.31 para ler um número ímpar de 1 a 19 para especificar o número de linhas no losango. Seu programa deve então exibir um losango do tamanho apropriado. 
4.32 Se você está familiarizado com numerais romanos, escreva um programa que imprima uma tabela de todos os números romanos equivalentes aos números decimais de 1 a 100. 
4.33 Escreva um programa que imprima uma tabela de números binários, octais e hexadecimais equivalentes aos números decimais no intervalo de 1 a 256. Se você não estiver familiarizado com esses sistemas de numeração, leia primeiro o Apêndice D se é seu desejo tentar fazer este exercício. 
4.34 Descreva o processo que você gostaria de usar para substituir um loop do/while por um loop while equivalente. Que problema ocorre quando se tenta substituir um loop while por um loop do/while equivalente? Suponha que você deve remover um loop while e substituí-lo por um do/while. Que estrutura adicional de controle seria necessária utilizar e como ela seria usada para assegurar que o programa resultante se comporte exatamente como o original? 
4.35 Escreva um programa que receba como entrada o ano no intervalo de 1994 a 1999 e use o loop for para produzir um calendário condensado e impresso de uma forma organizada. Tome cuidado com os anos bissextos. 
4.36 Uma crítica às instruções break e continue é que cada uma delas não é estruturada. Realmente as instruções break e continue sempre podem ser substituídas por instruções estruturadas, embora fazer isto possa ser esquisito. Descreva de uma forma geral como qualquer instrução break poderia ser removida de um loop de um programa e substitua essa instrução por alguma instrução estruturada equivalente. (Sugestão: A instrução break abandona um loop de dentro de seu corpo. A outra maneira de fazer isto é impondo uma falha no teste de continuação do loop. Pense em utilizar, no teste de continuação do loop, um segundo teste que indique "saída prematura devido a uma condição idêntica ao break".) Use a técnica desenvolvida aqui para remover a instrução break do programa da Fig. 4.11. 
4.37 Que faz o seguinte segmento de programa? for (i = 1; i <= 5; i++) { for (j = 1; j <= 3; { for (k = 1, k <= 4; k++) printf("*") ; printf("\n"); } 
printf("\n" ); 
4.38 Descreva de uma maneira geral como você removeria todas as instruções continue de um loop de um programa e substituiria essas instruções por outras instruções estruturadas equivalentes. Use a técnica desenvolvida aqui para remover a instrução continue do programa da Fig. 4.12. 
4.39 Descreva de uma maneira geral como você removeria as instruções break de uma estrutura switch e as substituiria por instruções estruturadas equivalentes. Use a técnica (talvez estranha) desenvolvida aqui para remover as instruções break do programa da Fig. 4.7. 
4.40 Escreva um programa que imprima o seguinte losango. Você pode usar instruções printf que imprimam tanto um único asterisco como um único espaço em branco. Maximize seu uso de repetições (com estruturas for aninhadas) e minimize o número de instruções printf. * *** ***** ******* ******** ******* ***** *** *

Outros materiais