Prévia do material em texto
Exercícios de Revisão 3.1 Responda às seguintes perguntas. a) Um procedimento para resolver um problema em termos das ações a serem executadas e a ordem em que elas devem ser realizadas é chamado um _______________. b) Especificar a ordem de execução das instruções pelo computador é chamado _________. c) Todos os programas podem ser escritos em termos de três estruturas de controle _______________, _______________ e _______________. d) A estrutura de seleção _______________ é usada para executar uma ação quando uma condição for verdadeira e outra ação quando a condição for falsa. e) Várias instruções agrupadas entre chaves ({ e }) são chamadas _______________. f) A estrutura de repetição _______________ especifica que uma instrução ou grupo de instruções deve ser executado repetidamente enquanto uma condição permanecer verdadeira. g) A repetição de um conjunto de instruções um número específico de vezes é chamada repetição _______________. h) Quando não se sabe de antemão quantas vezes um conjunto de instruções será repetido, um valor _______________ pode ser usado para finalizar a repetição. 3.2 Escreva quatro instruções diferentes em C que adicionem 1 a uma variável inteira x. 33 Escreva uma instrução simples em C que faça cada uma das tarefas seguintes: a) Atribua a soma de x e y a z e incremente o valor de x de 1 depois do cálculo. b) Multiplique a variável produto por 2 usando o operador *=. c) Multiplique a variável produto por 2 usando os operadores = e *. d) Verifique se o valor da variável contagem é maior que 10. Se for, imprima "Contagem maior que 10". e) Decremente a variável x de 1 e depois a subtraia da variável total. f) Adicione a variável x à variável total e depois decremente a variável x de 1. g) Calcule o resto depois de q ser dividido por divisor e atribua o resultado a q. Escreva essa instrução de duas maneiras diferentes. Imprima o valor 123 .4567 com 2 dígitos de precisão. Que valor é impresso? Imprima o valor de ponto flutuante 3.14159 com três dígitos à direita do ponto decimal. Que valor é impresso? 3.3 Escreva uma instrução em C que realize as seguintes tarefas. a) Declare as variáveis soma e x do tipo int. b) Inicialize a variável x com o valor 1. c) Inicialize a variável soma com o valor 0. d) Adicione a variável x à variável soma e atribua o resultado à variável soma. e) Imprima "A soma e :" seguido do valor da variável soma. 3.4 Combine as instruções escritas no Exercício 3.4 em um programa que calcule a soma dos inteiros de 1 a 10. Use a estrutura while para fazer um loop através das instruções de cálculo e incremento. O loop deve ter minar quando o valor de x se tornar 11. 3.5 Determine os valores de cada variável após o cálculo ser realizado. Admita que no início da execução de cada instrução todas as variáveis possuem o valor 5. a) produto *= x++; b) resultado = ++x + x; 3.6 Escreva instruções simples em C que a) Obtenha uma variável inteira x com scanf. b) Obtenha uma variável inteira y com scanf. c) Inicialize a variável inteira i com o valor 1.
d) Inicialize a variável inteira potência com o valor 1. e) Multiplique a variável potência por x e atribua o resultado a potência. f) Incremente a variável y de 1. g) Verifique se y é menor que ou igual a x. h) Forneça a variável inteira potência com printf. 3.7 Escreva um programa em C que use as instruções do Exercício 3.7 para calcular x elevado à potência y. O programa deve ter a estrutura dc controle de repetição while. 3.8 Identifique c corrija os erros em cada um dos itens seguintes: a) while (c <= 5) < produto *= c; b) scanf("%.4f", &valor); c) if (gênero == 1) printf("Feminino\n") else; printf("Masculino\n"); 3.9 O que há de errado com a seguinte estrutura de repetição while? while (z >= 0) soma += z;
Respostas dos Exercícios de Revisão 3.1 a) Algoritmo, b) Controle do programa, c) Seqüência, seleção, repetição, d) if/else. e) Instrução composta, f) while. g) Controlada por contador, h) Sentinela. 3.2 x = x + 1; x + = 1 ; ++x; x+-; 3.3 a) z = x++ + y; b) produto *= 2; c) produto = produto * 2; d) if (contagem > 10) printf("Contagem maior que 10.\n"); e) total -= --x; 0 total += x--; g) q %= divisor; q = q % divisor; . h) printf("%.2f", 123.4567); 123 .46 é exibido, i) printf("%.3f", 3.14159); 3 .142 é exibido. 3.4 a) int soma, x; b) x = 1; c) soma = 0; d) soma += x; ou soma = soma + x; e) printf("A soma e : %d\n", soma); 3.5 /* Calcula a soma dos inteiros de 1 a 10 */ #include <stdio.h> main() { int soma, x; x = 1; soma = 0; while (x <= 10) { soma <= x; + +x; } printf("A soma e : %ã\n", soma); } 3.6 a) produto = 25, x = 6; b) resultado = 12, x = 6; 3.7 a) scanf("%d", &x) ; b) scanf("%d", &y) ; c) i = 1; d) potência = 1; e) potência *= x; f) y++; g) if (y <= x) h) printf("%d", potência); 3.8 /* eleva x a potência y */ #include <stdio.h> main() { int x,y,i,potência; i = 1; potência = 1;
scanf("%d", &x) ; scanf("%d", &y); while (i <= y) { potência *= x; + + i; } printf{"%d", potência); return 0; } 3.9 a) Erro: Faltando a chave direita para fechamento do corpo do while. Correção: Adicionar a chave direita após a instrução + + c; b) Erro: Precisão usada em uma especificação de conversão scanf. Correção: Remover . 4 da especificação de conversão. c) Erro: Ponto-e-vírgula após o segmento else da estrutura if/else resulta em um erro lógico. O segundo printf será sempre executado. Correção: Remova o ponto-e-vírgula após o else. 3.10 O valor da variável z nunca é modificado na estrutura while. Portanto, é criado um loop infinito. Para evitar loops infinitos, z deve ser decrementado para que posteriormente se torne 0.
Exercícios 3.11 Identifique e corrija os erros em cada um dos itens seguintes (Nota: pode haver mais de um erro em cada conjunto de linhas de código): a) if (idade >= 65); printf("Idade e maior que ou igual a 65\n"); else printf("Idade e menor que 65\n"); b) int x = 1, total; while (x <= 10) { total += x; + +x; } c) While (x <= 100) total += x; + +x; d) while (y > 0) { printf("%d\n", y); ++y; } 3.12 Preencha as lacunas em cada um dos itens seguintes: a) A solução de qualquer problema envolve a realização de uma série de ações em uma específica, § b) Um sinônimo para procedimento (procedure) é . c) Uma variável que acumula a soma de vários números é um . d) O processo de definir valores específicos a determinadas variáveis no início de um programa é chamado | e) Um valor especial usado para indicar o "final da entrada de dados" é chamado um valor _____________________, ______________,________ou______. f) Um é uma representação gráfica de um algoritmo. g) Em um fluxograma, a ordem em que os passos devem ser realizados é indicada pela h) O símbolo de terminação indica o e o de qualquer algoritmo. i) Os símbolos retangulares correspondem aos cálculos realizados normalmente por instruções de 1 e operações de entrada/saída realizadas normalmente por chamadas às funções da biblioteca padrão. j) O item escrito no interior de um símbolo de decisão é chamado . 3.13 O que o seguinte programa imprime? ttinclude <stdio.h> main() { int x = 1, total = 0, y; while (x <= 10) { y = x * x printf("%ã\n", y); total += y); ++x; } printf("O total e %d\n", total); return 0; }
3.14 Escreva uma instrução simples em pseudocódigo que indique cada uma das ações seguintes: a) Exiba a mensagem "Entre com dois inteiros". b) Atribua a soma das variáveis x, y e z à variável p. c) Teste a seguinte condição em uma estrutura de seleção if/else: O valor atual da variável m é maior que duas vezes o valor atual da variável v. d) Obtenha os valores das variáveis s, r e t a partir do teclado. 3.15 Formule um algoritmo em pseudocódigo que faça o seguinte: a) Obtenha dois números a partir do teclado, calcule a soma dos números e exiba o resultado. b) Obtenha dois números a partir do teclado, determine o maior (se houver) e o exiba. c) Obtenha umasérie de números positivos a partir do teclado, determine sua soma e a exiba. Admita que o usuário deve digitar o valor sentinela 1 para indicar.o "final da entrada de dados". 3.16 Determine se cada uma das sentenças seguintes é verdadeira ou falsa. Se a sentença for falsa, explique por quê. a) A experiência demonstrou que a parte mais difícil de resolver um problema em computador é produzir um programa em C. b) O valor sentinela deve ser tal que não possa ser confundido com um valor válido de dados. c) As linhas de fluxo indicam as ações a serem realizadas. d) As condições escritas no interior dos símbolos de decisão sempre contêm operadores aritméticos (i.e., +, -, *, / e %). e) No refinamento top-down em etapas, cada refinamento é uma representação completa do algoritmo. Para os Exercícios 3.17 a 3.21, realize cada um dos seguintes passos: 1. Leia a definição do problema. 2. Formule o algoritmo usando o pseudocódigo e o refinamento top-down em etapas. 3. Escreva um programa em C. 4. Teste, depure e execute o programa em C.
3.17 Tendo em vista o alto preço da gasolina, os motoristas estão preocupados com a quilometragem percorrida por seus automóveis. Um motorista fez o controle recompletando várias vezes o tanque e registrando os quilômetros percorridos e os litros de gasolina necessários para encher o tanque. Desenvolva um programa em C que receba como dados a quilometragem dirigida e os litros usados para recompletar o tanque. O programa deve calcular e exibir a quilometragem por litro obtida para cada recompletamento. Depois de processar todas as informações, o programa deve calcular e exibir a média de quilômetros por litro obtida para todos os recompletamentos. Entre com os litros consumidos (-1 para finalizar): 12.8 Entre com os km percorridos: 287 A taxa km/litro para esse tanque foi 22.421875 Entre com os litros consumidos (-1 para finalizar): 10.3 Entre com os km percorridos: 200 A taxa km/litro para esse tanque foi 19.417475 Entre com os litros consumidos (-1 para finalizar): 5 Entre com os km percorridos: 120 A taxa km/litro para esse tanque foi 24.000000 Entre com os litros consumidos (-1 para finalizar): -1 A taxa total de km/litro foi 21.601423 3.18 Desenvolva um programa em C que determine se um cliente de uma loja de departamentos excedeu o limite de crédito de sua conta. Os seguintes dados de cada cliente estão disponíveis: Número da conta 2. Saldo devedor no início do mês 3. Total de itens cobrados do cliente no mês em questão 4. Total de créditos aplicados à conta do cliente no mês cm questão. 5. Limite de crédito permitido. O programa deve receber esses dados, calcular o novo saldo (= saldo devedor inicial + cobranças créditos) e determinar se o novo saldo supera o limite de crédito do cliente. Para os clientes cujo limite de crédito foi excedido, o programa deve exibir o número da conta do cliente, o limite de crédito e a mensagem "Limite de Crédito Excedido". Entre com o numero da conta (-1 para finalizar): 100 Entre com o saldo inicial: 5394.78 Entre com o total de cobranças: 1000.00 Entre com o total de créditos: 500.00 Entre com o limite de credito: 5500.00 Conta: 100 Limite de credito: 5500.00 Saldo: 5894.78 Limite de Credito Excedido. Entre com o numero da conta (-1 para finalizar): 200 Entre com o saldo inicial: 1000.00 Entre com o total de cobranças: 123.45 Entre com o total de créditos: 321.00 Entre com o limite de credito: 1500.00 Entre com o numero da conta (-1 para finalizar): 300 Entre com o saldo inicial: 500.00 Entre com o total de cobranças: 274.73 Entre com o total de créditos: 100.00 Entre com o limite de credito: 800.00 Entre com o numero da conta (-1 para finalizar): -1
3.19 Uma grande companhia química paga seus vendedores por comissão. Os vendedores recebem $200 por semana mais 9 por cento de suas vendas brutas naquela semana. Por exemplo, um vendedor que vender o equivalente a $5000 em produtos químicos em uma semana recebe $200 mais 9 por cento de $5000, ou um total de $650. Desenvolva um programa em C que receba as vendas brutas de cada vendedor na última semana, calcule seu salário e o exiba. Processe os dados de um vendedor de cada vez. Entre com a venda em dólares (-1 para finalizar): 5000.00 Salário: $650.00 Entre com a venda em dólares (-1 para finalizar): 1234.56 Salário: $311.11 Entre com a venda em dólares (-1 para finalizar): 1088.89 Salário: $298.00 Entre com a venda em dólares (-1 para finalizar): -1 3.20 Os juros simples em um empréstimo são calculados pela fórmula juros = capital * taxa * dias / 365 A fórmula anterior admite que taxa c a taxa anual de juros e portanto inclui a divisão por 365 (dias). Desenvolva um programa em C que receba os valores de capital, taxa e dias de vários empréstimos, calcule os juros simples de cada empréstimo e os exiba, usando a fórmula anterior. Entre com o valor do empréstimo (-1 para finalizar): 1000.00 Entre com a taxa de juros: .1 Entre com o periodo do empréstimo em dias: 365 O valor dos juros é: $100.00 Entre com o valor do empréstimo (-1 para finalizar): 1000.00 Entre com a taxa de juros: .08375 Entre com o periodo do empréstimo em dias: 224 O valor dos juros é: $51.40 Entre com o valor do empréstimo (-1 para finalizar): 10000.00 Entre com a taxa de juros: .09 Entre com o periodo do empréstimo em dias: 1460 O valor dos juros e: $3600.00 Entre com o valor do empréstimo (-1 para finalizar): -1 3.21 Desenvolva um programa em C que determine o pagamento bruto de cada um de vários empregados. A companhia paga o valor de uma "hora normal" pelas primeiras 40 horas trabalhadas de cada empregado e paga o valor de uma "hora extra" (uma vez e meia a hora normal) para cada hora trabalhada depois de completadas as primeiras 40 horas. Você recebeu uma lista de empregados da companhia, o número de horas que cada empregado trabalhou durante a semana passada e o valor da "hora normal" de cada empregado. Seu programa deve receber essas informações de cada empregado além de determinar e exibir o pagamento bruto do empregado.
Entre com o numero de horas trabalhadas (-1 para finalizar): 39 Entre com o valor da hora normal do trabalhador C$00.00): 10.00 Salário: $390.00 Entre com o numero de horas trabalhadas (-1 para finalizar): 40 Entre com o valor da hora normal do trabalhador ($00.00): 10.00 Salário: $400.00 Entre com o numero de horas trabalhadas (-1 para finalizar): 41 Entre com o valor da hora normal do trabalhador ($00.00): 10.00 Salário: 415.00 Entre com o numero de horas trabalhadas (-1 para finalizar): -1 3.22 Escreva um programa em C que demonstre a diferença entre pré-decrementar e pós-decrementar usando o operador de decremento - -. 3.23 Escreva um programa em C que utilize um loop para imprimir os números de 1 a 10, lado a lado na mesma linha e com 3 espaços entre eles. 3.24 O processo de encontrar o maior número (i.e., o máximo de um conjunto de números) é usado freqüentemente em aplicações computacionais. Por exemplo, um programa que determinasse o vencedor de um concurso de vendas receberia o número de unidades vendidas por vendedor. O vendedor que tivesse vendido mais unidades venceria o concurso. Escreva um pseudocódigo e depois um programa em C que receba uma série* de 10 números, determine o maioj deles e o imprima. Sugestão: Seu programa deve usar três variáveis da seguinte maneira: contador: Um contador para contar até 10 (i.e., para controlar quantos números foram fornecidos e para determinar quando todos os 10 números foram processados), num: O número atual fornecido ao programa, maior: O maior número encontrado em cada instante. 3.25 Escreva um programa em C que utilize um loop para imprimir a seguinte tabela de valores: N 10*N 100*N 1000*N 1 10 100 1000 2 20 200 2000 3 30 300 3000 4 40 400 4000 5 50 500 5000 6 7 8 9 10 60 70 80 90 100 600 700 800 900 1000 6000 7000 8000 9000 10000 O caractere de tabulação, \t, pode ser usado na instrução printf para separaras colunas por tabulações. 3.26 Escreva um programa em C que utilize um loop para produzir a seguinte tabela de valores:
3.27 Usando um método similar ao do Exercício 3.24, encontre os dois maiores valores de 10 números. Nota: Cada número só pode ser fornecido uma única vez. A A+2 A+4 A+6 3 5 7 9 6 8 10 12 9 11 13 15 12 14 16 18 15 17 19 21
3.28 Modifique o programa da Fig. 3.10 para validar suas entradas. Em qualquer entrada, se o valor fornecido for diferente de 1 ou 2, permaneça no loop até que o usuário forneça um valor válido. 3.29 O que o seguinte programa imprime? #include <stdio.h> main() { int contador = 1; while (contador <= 10) { printf("%s\n", contador % 2 ? "****" : "+ + + + + + + +"); ++contador; } return 0; } 3.30 O que o seguinte programa imprime? #include <stdio.h> main() { int linha = 10, coluna; while (linha >= 1) { coluna = 1; while (coluna <= 10) { printf ("?&s", linha % 2 ? "<" : ">"); ++coluna; } --linha; printf("\n"); } return 0; } 3.31 (Problema de Else Oscilante) Determine a saída de cada um dos programas seguintes quando x é 9 e y é 11 e quando xélleyé9. Observe que o compilador ignora os recuos em um programa em C. Além disso, o compilador C sempre associa o else com o if anterior, a menos que tenha sido dito algo em contrário pela colocação de chaves { }. Como, à primeira vista, o programador pode não ter certeza de a que if um else corresponde, isso é chamado problema do "else oscilante". Eliminamos os recuos dos códigos a seguir para tornar o problema mais interessante. (Sugestão: Aplique as convenções de recuos que você aprendeu.) a) if (x < 10) if (y < 10 ) printf("*****\n"); else
printf("#####\n"); printf("$$$$$\ b) if (x < 10) < if (y > 10) printf("*****\n"); else { printf("#####\n"); printf("$$$$$\n"); } 3.32 (Outro Problema de Else Oscilante) Modifique o código a seguir para produzir a saída mostrada. Use as técnicas apropriadas para os recuos. Você não pode fazer nenhuma modificação além de inserir chaves. O compilador ignora os recuos em um programa C. Eliminamos os recuos do código a seguir para tornar o programa mais interessante. Nota: E possível que não seja necessário fazer nenhuma modificação. if (y == 8) if (x == 5) printf("@@@@@\n"); t a else printf("#####\ \n"); printf("&&&&&\n"); a) Admitindo x = 5ey = 8, a seguinte saída é produzida. @@@@@ $ $ $ $ $ & & & & & b) Admitindo x = 5 e y = 8, a seguinte saída é produzida. @@@@@ c) Admitindo x = 5 e y =8, a seguinte saída é produzida. @@@@@ &&&&& d) Admitindo x = 5 e y = 8, a seguinte saída é produzida.Nota: As três últimas instruções printf são parte de uma instrução composta. # # # # # # $ $ $ $ $ & & & & & 3.33 Escreva um programa que leia o lado de um quadrado e então imprima o quadrado com asteriscos. Seu programa deve funcionar com quadrados de todos os tamanhos entre 1 e 20. Por exemplo, se seu programa lesse um tamanho 4, deveria imprimir
**** **** **** **** 3.34 Modifique o programa escrito no Exercício 3.33 de forma que seja impresso um quadrado vazado. Por exemplo, se seu programa lesse um tamanho 5, deveria imprimir ***** ***** ***** ***** ***** 3.35 Um palíndromo é um número ou texto que é lido da mesma forma tanto da direita para a esquerda como da esquerda para a direita. Por exemplo, cada um dos inteiros seguintes, de cinco dígitos, é palíndromo: 12321,55555,45554 e 11611. Escreva um programa que leia um inteiro de cinco dígitos e determine se ele é palíndromo ou não. (Sugestão: Use os operadores divisão e resto, ou modulus, para separar o número em seus algarismos isolados.) 3.36 Obtenha um inteiro contendo apenas Os e ls (i.e., um inteiro "binário") e imprima seu valor equivalente na base dez. (Sugestão: Use os operadores resto e divisão para selecionar um a um os dígitos do número "binário", da direita para a esquerda. Da mesma forma que o sistema decimal de numeração onde o dígito da ex-tremidade direita tem um valor posicionai 1 e o dígito imediatamente à sua esquerda tem um valor posicionai 10, e depois 100 e depois 1000 etc, no sistema binário o dígito da extremidade direita tem o valor posicionai 1, o dígito imediatamente à sua esquerda tem o valor posicionai 2, e depois 4, e depois 8 etc. Assim, o número 234 pode ser interpretado como 4*1+3*10 + 2*100. O equivalente decimal do binário 1101 é 1 * 1 + 0*2 + 1*4+1*8 ou 1+0 + 4 + 8 ou 13.) 3.37 Ouvimos sempre como os computadores são velozes. Como você pode determinar a rapidez com que seu equipamento realmente funciona? Escreva um programa com um loop while que conte de 1 a 3.000.000, de 1 em 1. Toda vez que a contagem atingir um múltiplo de 1.000.000, imprima este número na tela. Use seu relógio para cronometrar quanto tempo leva cada milhão de repetições do loop. 3.38 Escreva um programa que imprima 100 asteriscos, um de cada vez. A cada dez asteriscos, seu programa deve imprimir um caractere de nova linha. (Sugestão: Conte de 1 a 100. Use o operador resto para reconhecer cada vez que o contador atingir um múltiplo de dez.) 3.39 Escreva um programa em C que leia um inteiro, determine quantos dígitos são
iguais a 7 e imprima esta informação. 3.40 Escreva um programa que exiba o seguinte padrão quadriculado * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Seu programa só pode usar três instruções printf, uma da forma printf("* "); uma da forma printf(" ") e uma da forma printf("\n"); 3.41 Escreva um programa que fique imprimindo múltiplos de 2, ou seja, 2,4, 8, 16, 32,64 etc. Seu loop não deve terminar (i.e., você deve criai' um loop infinito). O que acontece quando esse programa é executado? 3.42 Escreva um programa que leia o raio de um círculo (como um valor float), calcule seu diâmetro, seu perímetro (circunferência) e sua área e imprima estes valores. Use o valor 3.14.159 para pi. 3.43 O que há de errado com a seguinte instrução? Escreva-a novamente para realizar o que provavelmente o programador está tentando fazer. printf {"%d", ++(xx + y) ) ; 3.44 Escreva um programa que leia três valores float diferentes de zero e depois determine e imprima se eles podem representar os lados de um triângulo. 3.45 Escreva um programa que leia três inteiros diferentes de zero e depois determine e imprima se eles podem ser os lados de um triângulo retângulo. 3.46 Uma empresa deseja transmitir dados através do telefone, mas existe a preocupação de que seus telefones possam estar grampeados. Todos os seus dados são transmitidos como inteiros de quatro dígitos. A empresa pediu a você que escrevesse um programa para criptografar os dados de forma que eles possam ser transmitidos com mais segurança. Seu programa deve ler um inteiro de quatro dígitos e criptografá-lo da seguinte maneira: Substitua cada dígito pelo resultado da expressão (soma daquele dígito com 7) modulus 10 (ou seja, o resto da divisão por 10 do número obtido pela soma daquele dígito com 7). Depois, troque o primeiro dígito pelo terceiro e troque o segundo dígito com o quarto. A seguir, imprima o inteiro criptografado. Escreva um programa separado que receba um inteiro criptografado e decriptografe-o para que seja obtido o número original.
3.47 O fatorial de um inteiro não-negativo n é escrito n! (lido como "fatorial de n") e é definido da seguinte maneira: n! = n-(n l)*(n 2) 1 (para valores de n maiores que ou iguais a 1) e n! = 1 (para n = 0). Por exemplo, 5! = 5*4*3*2*1 que é 120. a) Escreva um programa que leia um inteiro não-negativo e depois calcule e imprima seu fatorial. b) Escreva um programa que calcule o valor da constante matemática e usando a fórmula: e = 1 + 1/1! + 1/2!+ ... c) Escreva um programa que calcule o valor de ex usando a fórmula ex = 1 + x/1! + x*x/2!+ (X*X*X)/3!