Departamento de Ciência da Computação - IME - USP Programação das Aulas Segunda parte Nesta segunda fase da disciplina estudaremos: variáveis do tipo real (float); caracteres (char); operações com números reais e caracteres; funções (protótipos, estrutura e mecanismos de passagem de parâmetros). AULA 1 TÓPICOS: constantes e variáveis do tipo float; aritmética envolvendo números do tipo float; leitura de números do tipo float (%f), impressão de expressões do tipo float (%f); conversão de tipos (casting). PROBLEMA 1. Dadas n > 0 notas de provas de MAC2166, calcular a média aritmética das notas. PROBLEMA 2 (exercício 2 da lista de exercícios sobre reais). Dado um número inteiro n > 0, determinar o número harmônico Hn dado por Hn = 1 + 1/2 + 1/3 + 1/4 + . . . + 1/n. PROBLEMA 3 (exercício 3 da lista de exercícios sobre reais). Os pontos (x,y) que pertencem à figura H (abaixo) são tais que x > 0, x > 0 e x2 + y2 < 1. Dados n pontos reais (x,y), verifique se cada ponto pertence ou não a H. PROBLEMA EXTRA (exercício 10 da lista de exercícios sobre reais). Dado um número inteiro n > 0, calcular o valor da soma Sn = 1/n + 2/(n-1) + 3/(n-2) + ... + n/1 AULA 2 PROBLEMA 4. Dados números reais x ≥ 0 e epsilon > 0, calcular uma aproximação da raiz quadrada de x através da seqüência de números abaixo. Tome r0 = x e rn+1 = 1/2 (rn+ x/rn). Exemplos: Para Para Para Para x = 3, r0 = 3, r1 = 2, r2 = 1.75, r3 = 1.732143, r4 = 1.732051 x = 4, r0 = 4, r1 = 2.5, r2 = 2.05, r3 = 2.000610, r4 = 2.000000 x = 5, r0 = 5, r1 = 3, r2 = 2.33, r3 = 2.238095, r4 = 2.236068 x=0.81, r0=0.81, r1=0.905, r2=0.9000138122, r3=0.9000000001 A aproximação será o primeiro valor rn+1 tal que |rn+1-rn| < e. PROBLEMA 5. Dado um número real x e um número real epsilon > 0, calcular uma aproximação de ex através da seguinte série infinita: ex = 1 + x + x 2/2! + x 3/3! + . . . + x k/k! + . . . Inclua na aproximação todos os termos até o primeiro de valor absoluto (módulo) menor do que epsilon. (exercício 6 da lista de exercícios sobre reais). Dados x real e n natural, calcular uma aproximação para cos x através dos n primeiros termos da seguinte série: PROBLEMA EXTRA Compare com os resultados de sua calculadora! PROBLEMA EXTRA. Dado um número real x tal que 0 <= x <= 1, calcular uma aproximação do arco tangente de x (em radianos) através da série infinita: arctan(x) = x - x 3/3 + x 5/5 - x 7/7 + . . . incluindo todos os termos da série até |xk/k| < 0,0001. AULA 3 TÓPICOS: caracteres - tipo char. PROBLEMA 6. Dados N e uma sequência de N caracteres representando um texto, determinar a frequência relativa de vogais no texto (por exemplo, no texto "Em terra de cego quem tem um olho é caolho", essa frequência é 16/42). PROBLEMA 7. Dada uma frase terminada por '.', imprimir o comprimento da palavra mais longa. PROBLEMA 8. Dada uma seqüência de caracteres terminada por '.', determinar quantas letras minúsculas e maiúsculas aparecem na seqüência. PROBLEMA EXTRA Dada uma frase terminada por '.', determinar quantas letras e quantas palavras aparecem no texto. Por exemplo, no texto "O voo GOL547 saiu com 10 passageiros." há 25 letras e 7 palavras. AULA 4 TÓPICOS: funções; protótipos de funções, estruturas de funções, passagem de parâmetros por valor. PROBLEMA 9. Dados dois números reais x e y e dois números inteiros positivos a e b, calcular o valor da expressão xa + yb + (x-y)a+b. PROBLEMA 9'. Resolver novamente o PROBLEMA 9, mas desta vez utilizando uma função para calcular potência int potencia(int base, int expoente){ . . . } PROBLEMA 10. Escreva uma função que recebe n e calcula n!. Faça uma função que recebe dois números inteiros m e n, e usando a função do item anterior, calcula m!/(n!(m-n)!). Faça um programa que lê um numero inteiro n > 0 e imprime os coeficientes da expansão de (a+b)n. PROBLEMA EXTRA. Usando a função sqrt(x) da biblioteca matemática da linguagem C (#include <math.h>), escreva uma recebe dois pontos no plano através de suas coordenadas cartesianas e devolve a distância entre os pontos. Faça um programa que lê um ponto origem (x0, y0) e uma seqüência de n pontos e determina o ponto mais próximo do ponto origem. PROBLEMA EXTRA. AULA 5 Faça uma função que recebe um número inteiro n e devolve 1 se n é primo e devolve 0 em caso contrário. Faça um programa que lê um número inteiro m e verifica se m pode ser escrito como p+q, onde p e q são números primos. TÓPICOS: funções; protótipos de funções, estruturas de funções, passagem de parâmetros. PROBLEMA 11. (exercício 1 da lista de exercícios com funções - parte I). Um número a é dito ser permutação de um número b se os dígitos de a formam uma permutação dos dígitos de b. Exemplo: 5412434 é uma permutação de 4321445, mas não é uma permutação de 4312455. Obs.: Considere que o dígito 0 (zero) não aparece nos números. Faça uma função contadígitos que dados um inteiro n e um inteiro d, 0 < d < 9, devolve quantas vezes o dígito d aparece em n. Usando a função do item anterior, faça um programa que lê dois números a e b e responde se a é permutação de b. PROBLEMA 12. (exercício 2 da lista de exercícios com funções - parte I). Construa uma função encaixa que dados dois inteiros positivos a e b verifica se b corresponde aos últimos dígitos de a. Exemplo: a b 567890 890 1243 1243 encaixa 2457 245 não encaixa 457 2457 não encaixa encaixa Usando a função do item anterior, faça um programa que lê dois inteiros positivos a e b e verifica se o menor deles é subnúmero do outro. Exemplo: a b 567890 678 b é subnúmero de a 1243 2212435 a é subnúmero de b 235 236 um não é subnúmero do outro PROBLEMA EXTRA. (exercício 3 da lista de exercícios com funções - parte I). Uma seqüência de n números inteiros não nulos é dita piramidal m-alternante se é constituída por m segmentos: o primeiro com um elemento, o segundo com dois elementos e assim por diante até o mésimo, com m elementos. Além disso, os elementos de um mesmo segmento devem ser todos pares ou todos ímpares e para cada segmento, se seus elementos forem todos pares (ímpares), os elementos do segmento seguinte devem ser todos ímpares (pares). Por exemplo, a seqüência com n = 10 elementos: 12 3 7 2 10 4 5 13 5 11 é piramidal 4-alternante. A seqüência com n = 3 elementos: 7 10 2 é piramidal 2-alternante. A seqüência com n = 8 elementos: 1 12 4 3 13 5 12 6 não é piramidal alternante pois o último segmento não tem tamanho 4. Escreva uma função bloco que recebe como parâmetro um inteiro n e lê n inteiros do teclado, devolvendo um dos seguintes valores: 0, se os n números lidos forem pares; 1, se os n números lidos forem ímpares; -1, se entre os n números lidos há números com paridades diferentes. AULA 6 usando a função do item anterior, escreva um programa que, dados um inteiro n > 1 e uma seqüência de n números inteiros, verifica se ela é piramidal m-alternante. O programa deve imprimir o valor de m ou dar a resposta não. TÓPICOS: passagem de endereço como parâmetro. Ilustração de um problema simples para realçar os conceitos de variáveis locais, parâmetros e endereços como parâmetros. Exemplo: função troca, que recebe dois inteiros *a e *b e troca os valor de *a com o valor de *b. PROBLEMA 13. Dizemos que um número natural n é palíndromo se lido da direita para a esquerda ou da esquerda para a direita é o mesmo número. Exemplos: 567765 e 32423 são palíndromos. 567675 não é palíndromo. Socorram-me subi no onibus em Marrocos. Oto come doce seco de mocotó. A diva em Argel alegra-me a vida. Escreva uma função que recebe um inteiro n > 0 e devolve o seu primeiro dígito, seu último dígito e altera o valor de n removendo seu primeiro e último dígitos. Exemplos: valor inicial de n primeiro dígito valor final de n 732 7 2 3 14738 1 8 473 1010 1 0 1 78 7 8 0 7 7 0 7 último dígito Escreva um programa que recebe um inteiro positivo n e verifica se n é palíndromo. Suponha que n não contém o dígito 0. PROBLEMA 14. (Solução). Escreva uma função com protótipo int divide (int *m, int *n, int d); que recebe três inteiros positivos como parâmetros e retorna 1 se d divide pelo menos um entre contrário. Fora isso, se d divide *m, divide *m por d, e o mesmo para *n. Escreva um programa que lê dois inteiros positivos m e n e calcula, usando a função acima, o mínimo múltiplo comum entre m e n. *m e *n, 0 caso PROBLEMA EXTRA. (Solução). Faça uma função com protótipo void somabit (int b1, int b2, int *vaium, int *soma); que recebe três bits (inteiros 0 ou 1) b1, b2 e *vaium e retorna um bit soma representando a soma dos três e o novo um bit "vai-um" em *vaium. AULA 7 Escreva um programa que lê dois números em binário e calcula um número em binário que é a soma dos dois números dados. Utilize a função acima. TÓPICOS: passagem de endereço como parâmetro. PROBLEMA 15. PROBLEMA 16. AULA 8 TÓPICOS: problemas extras da parte 2; simulação de programa com apontadores. Primeira parte Página de MAC2166