Prévia do material em texto
Universidade Tecnológica Federal do Paraná Departamento Acadêmico de Informática IF61C – Fundamentos de Programação 1 (2013-2) Prof. Bogdan Tomoyuki Nassu Lista de Exercícios – Aula 2 (*) 1. Dado o código-fonte do “Hello World!”, gerado automaticamente pelo Code::Blocks... a) O que acontece se tirarmos o \n do argumento do printf? b) O que acontece se em vez do \n tentarmos simplesmente pular uma linha, como abaixo? printf("Hello world! "); c) O que acontece se colocarmos um \n entre as palavras, como abaixo? printf("Hello\nworld!\n"); d) O que acontece se usarmos 2 printf's? printf("Hello "); printf("world!\n"); e) Modifique o programa para que a sua saída seja exatamente igual ao código-fonte do Hello world!. Dica: use a sequência de escape \t para imprimir uma tabulação. Dica: use a sequência de escape \\ para imprimir uma barra invertida. Dica: você não pode simplesmente colocar aspas duplas (") dentro de uma string. O compilador interpreta essas aspas como sendo o final da string, não como algo a ser impresso. Tente consultar a referência para descobrir o que fazer para poder imprimir as aspas. (*) 2. Modifique o código-fonte do Hello World!, acrescentando ou removendo espaços e linhas entre símbolos. Por exemplo: #include <stdio.h> #include<stdlib.h> int main () { printf ( "Hello world!\n") ;return 0; } Tente observar quando a alteração não tem efeito sobre o programa, quando a saída é modificada, e quando a alteração impede a compilação do programa. (*) 3. Escreva 3 programas em C que mostrem os números no intervalo [1, 5], separados por vírgulas: a) Um programa que use 5 variáveis para armazenar os números. b) Um programa que use 5 constantes numéricas, mas nenhuma variável. c) Um programa que não use nem variáveis nem constantes numéricas. (*) 4. Escreva 3 programas em C que calculem e mostrem a média de 5 números reais: a) Um que use 5 variáveis para armazenar os números e 1 variável para armazenar o resultado. b) Um que use 5 variáveis para armazenar os números, mas não usa variáveis para armazenar o resultado. c) Um que não use variáveis, apenas constantes numéricas. (*) 5. Modifique o programa da questão 4.a para que ele mostre a média dos 2 primeiros números, dos 3 primeiros números, e dos 4 primeiros números, antes de mostrar a média total. Por exemplo, se os números forem 1, 2, 3, 4 e 5, as médias serão: 1 e 2 – 1.5 1 a 3 – 2 1 a 4 – 2.5 1 a 5 – 3 O programa deve usar uma única variável para todas as médias. (*) 6. Escreva um programa em C que atribua a uma variável um valor e mostre na tela o quadrado deste valor. (**) 7. Um sub-problema básico e recorrente em programação é a troca dos valores de duas variáveis. Por exemplo, se no começo do programa tivermos que var1 tem valor 1 e var2 tem valor 2; no final do programa var1 deve ter o valor 2 e var2 o valor 1. Escreva um programa que realiza esta troca, mostrando os valores das variáveis antes e depois da troca. Os valores iniciais só podem ser digitados uma única vez. (**) 8. O que será impresso pelo programa abaixo? (Importante: tente descobrir somente analisando o código, só execute o programa para conferir o resultado.) #include <stdio.h> int main () { int x, y, z; x = 10; y = x; z = y; y = 15; x = z; printf ("%d %d %d\n", x, y, z); return (0); } (**) 9. Escreva um programa que converta um dado número de segundos em dias, horas, minutos e segundos. Por exemplo, 7322 segundos correspondem a 0 dia, 2 horas, 2 minutos e 2 segundos. (***) 10. Sabendo o custo de fábrica de um carro e que são pagos sobre este custo (a) 45% de imposto e (b) 12% de lucro do distribuidor, escreva um programa que mostre o preço de um carro ao consumidor e os valores pagos pelo imposto e pelo lucro. Universidade Tecnológica Federal do Paraná Departamento Acadêmico de Informática IF61C – Fundamentos de Programação 1 (2013-2) Prof. Bogdan Tomoyuki Nassu Lista de Exercícios 2 – Aula 2 - Respostas 1. a) A diferença é sutil – com o \n, o programa pula uma linha entre o Hello world! impresso e as informações de execução (Process returned 0...). b) O programa nem sequer compila. Você não pode “quebrar” a string desta forma, e pular uma linha entre aspas não é igual a fazer o programa pular uma linha. c) A saída fica sendo: Hello world! d) A saída fica igual à original. Usar 2 printf's não faz com que uma linha seja pulada, apenas o \n tem este efeito. printf("Hello\n"); printf("world!\n"); e) #include <stdio.h> #include <stdlib.h> int main() { printf("#include <stdio.h>\n"); printf("#include <stdlib.h>\n\n"); printf("int main()\n"); printf("{\n"); printf("\tprintf(\"Hello world!\\n\");\n"); printf("\treturn 0;\n"); printf("}\n"); return 0; } 2. Teste e investigue! O que se pode afirmar é que as únicas alterações que modificam a saída do programa são aquelas feitas dentro da string passada como parâmetro à função printf. Qualquer outra alteração não tem efeito ou impede a compilação do programa. 3. a) #include <stdio.h> int main () { int num1 = 1; int num2 = 2; int num3 = 3; int num4 = 4; int num5 = 5; printf ("%d, %d, %d, %d, %d\n", num1, num2, num3, num4, num5); return (0); } b) #include <stdio.h> int main () { /* Passamos os números diretamente como parâmetros para a função printf. */ printf ("%d, %d, %d, %d, %d\n", 1, 2, 3, 4, 5); return (0); } c) #include <stdio.h> int main () { /* Ao colocar os números dentro da string (entre aspas), eles não são interpretados como constantes numéricas, e sim como texto. */ printf ("1, 2, 3, 4, 5\n"); return (0); } 4. a) #include <stdio.h> int main () { double num1 = 10.4, num2 = 8.5, num3 = 7.2, num4 = 9.9, num5 = 3.2, media; /* A média é a soma dos valores dividida pelo número de valores. Atenção aos parêntesis! Se você não colocá-los, apenas o último termo (num5) será dividido por 5.*/ media = (num1 + num2 + num3 + num4 + num5)/5; printf ("%.2f\n", media); return (0); } b) #include <stdio.h> int main () { double num1 = 10.4, num2 = 8.5, num3 = 7.2, num4 = 9.9, num5 = 3.2; printf ("%.2f\n", (num1 + num2 + num3 + num4 + num5)/5); return (0); } c) #include <stdio.h> int main () { printf ("%.2f\n", (10.4 + 8.5 + 7.2 + 9.9 + 3.2)/5); return (0); } 5. #include <stdio.h> int main () { double num1 = 1, num2 = 2, num3 = 3, num4 = 4, num5 = 5, media; media = (num1 + num2)/2; printf ("%.2f\n", media); media = (num1 + num2 + num3)/3; printf ("%.2f\n", media); media = (num1 + num2 + num3 + num4)/4; printf ("%.2f\n", media); media = (num1 + num2 + num3 + num4 + num5)/5; printf ("%.2f\n", media); return (0); } 6. /* Note que eu posso multiplicar a variável por ela mesma, e jogar o resultado direto no printf. Se você tem algum conhecimento sobre programação e usou a função pow, tente refletir sobre como a solução que está aqui é mais simples, direta, e eficiente. */ #include <stdio.h> int main () { int x = 4; printf ("%d\n", x*x); return (0); } 7. /* A ideia mais simples para resolver este problema envolve uma analogia, que é a mesma dos "copos de suco" da lista anterior. Existe uma outra solução, mais matemática. Suponha que começamos com var1=x e var2=y: var1 = var1 + var2; -> var1 = x+y; var2 = var1 - var2; -> var2 = (x+y)-y = x; var1 = var1 - var2; -> var1 = (x+y)-x = y; */ #include <stdio.h> int main () { int var1, var2, tmp; var1 = 2; var2 = 4; printf ("%d\t%d\n", var1, var2); tmp = var1; var1 = var2; var2 = tmp; printf ("%d\t%d\n", var1, var2); return (0); }8. Resposta: 10 15 10. Mais importante do que adivinhar o resultado é entender que executando o algoritmo passo a passo, podemos descobrir o que ele faz. 9. /* Note que as variáveis aqui têm nomes mnemônicos. É fácil entender o que cada variável representa. Se usássemos coisas como a, b e c, o significado de cada variável para o programa seria bem menos claro. */ #include <stdio.h> int main () { int segundos_total = 180122; int dias, horas, minutos, segundos; /* 1 dia tem 24 horas, 1 hora tem 60 minutos, 1 minuto tem 60 segundos. */ /* Note que, quando usado com inteiros, o operador / dá somente a parte inteira da divisão. */ /* Desconta os dias do total de segundos. */ dias = segundos_total / (24 * 60 * 60); segundos_total = segundos_total - (dias * 24 * 60 * 60); /* Desconta as horas do total de segundos. */ horas = segundos_total / (60 * 60); segundos_total = segundos_total - (horas * 60 * 60); /* Desconta os minutos do total de segundos. */ minutos = segundos_total / 60; segundos = segundos_total - (minutos * 60); printf ("%d dias, %d horas, %d minutos, %d segundos\n", dias, horas, minutos, segundos); return (0); } 10. /* Usamos aqui doubles para representar os valores, o que garante mais precisão do que teríamos usando apenas inteiros. Novamente, os nomes mnemônicos ajudam a deixar claro o funcionamento do programa. */ #include <stdio.h> int main () { double custo = 10000; double imposto, lucro, preco; imposto = custo * 0.45; /* 45% de imposto. */ lucro = custo * 0.12; /* 12% de lucro. */ preco = custo + imposto + lucro; /* O preço é a soma dos 3. */ printf ("Imposto: %.2f\n", imposto); printf ("Lucro: %.2f\n", lucro); printf ("Preco: %.2f\n", preco); return (0); }