CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013 Capítulo V Comandos For e Switch-Case Outro comando repetitivo: for Sejam os seguintes comandos: Eles podem ser escritos usando-se o comando for:+= num; soma int n, i, num, soma; scanf (“%d”, &n); soma = 0; i = 1; while (i <= n) { scanf (“%d”, &num); soma += num; i++; } equivale a = 0; scanf (“%d”, &n); soma for (i = soma 1; i <==n; i++)+{num; soma scanf (“%d”, &num); soma += num; } i++; equivale a ou: i = i + 1; scanf (“%d”, &n); for (soma = 0, i = 1; i <= n; i++) { scanf (“%d”, &num); Ou outras soma += num; formas } Forma geral do comando for: for ( Inicializações ; Expressão ; Atualizações ) Comando Inicializações e Atualizações: Listas de zero ou mais CmdAtribuição’s, CmdEntrada’s, CmdSaída’s ou ChamadaFunção’s Separados por vírgula e não por ponto e vírgula O CmdFor acima equivale a Inicializações while ( Expressão ) { Comando Atualizações } Fluxograma do comando for: for ( Inicializações ; Expressão ; Atualizações ) Comando #include <stdio.h> Programa 5.1: #include <conio.h> Números perfeitos void main () { int n, i, div, soma; printf ("Digite um numero inteiro positivo: "); scanf ("%d", &n); printf ("\nNumeros perfeitos entre 1 e %d:\n\n", n); i = 1; Número perfeito: a soma de while (i <= n) { seus divisores próprios é igual soma = 0; div = 1; a si mesmo. Exemplos: while (div*2 <= i) { 6=1+2+3 if (i % div == 0) soma += div; 28 = 1 + 2 + 4 + 7 + 14 div++; } if (soma == i) printf ("%12d", i); i++; Usar comando for ao invés de while } printf ("\n\nDigite algo para encerrar: "); getch (); Salvar e executar } Comando condicional de várias alternativas: Expressão Lista de comandos Lista de comandos Lista de comandos Lista de comandos #include <stdio.h> Programa 5.2: #include <conio.h> Levantar o astral void main ( ) { char c; int n; printf ("Levantar o astral? (s/n): "); c = getche(); Salvar e executar while (c == 's' || c == 'S') { printf ("\n\n\tDigite um numero de 1 a 7: "); scanf ("%d", &n); switch (n) { case 1: printf ("\n\tVoce eh inteligente"); break; case 2: printf ("\n\tVoce eh campeao"); break; case 3: printf ("\n\tVoce estah com tudo"); break; case 4: printf ("\n\tSeu destino eh vencer"); break; case 5: printf ("\n\tTudo coopera para seu sucesso"); break; case 6: printf ("\n\tA vida sorri para voce"); break; case 7: printf ("\n\tNada pode impedir sua vitoria"); break; default: printf ("\n\tO numero deve ser de 1 a 7"); } printf ("\n\nLevantar o astral? (s/n): "); c = getche (); Eliminar alguns ou todos os } Trocar o esquema while por for break’s e executar } Exercício 5.1: Resolução de 3 problemas matemáticos Escrever um programa amigável em C para resolver os três seguintes problemas matemáticos escolhidos perante um menu de problemas: 1. Cálculo da média aritmética ponderada de vários números reais 2. Cálculo da soma dos termos de uma progressão aritmética de números reais 3. Cálculo do fatorial de um número inteiro A escolha do problema deve usar o comando switch-case Para cada problema a ser resolvido, o programa deve pedir dados específicos para o operador Media ponderada: – – Usarinsistir o comando O programa deve para ofor sempre que puder operador digitar os dados corretamente Pedir o número de elementos n a participarem da média (n > 0) Pedir cada elemento acompanhado de seu peso (os elementos devem ser reais mas os pesos devem ser inteiros positivos) ■ Soma da progressão aritmética: ■ Pedir o primeiro termo (tipo real), o número de termos (tipo inteiro) e a razão (tipo real) ■ Não usar a fórmula da soma A seguir, sugestão para saída de resultados ■ Fatorial: Pedir o número do qual se deseja o fatorial (deve ser inteiro e 0 e < 13) SOLUCAO DE PROBLEMAS MATEMATICOS Resolver problema? (s/n): s Escolha o problema; Digite 1 - para Media aritmetica ponderada 2 - para Soma de PA 3 - para Fatorial Sua opcao: 1 Media Aritmetica Ponderada Digite o numero de elementos (>0): 0 Numero nao positivo! Digite novamente: 3 Digite o 1o. elemento e seu peso: 3.4 4 Digite o 2o. elemento e seu peso: 5.2 4 Digite o 3o. elemento e seu peso: 9.1 2 Media ponderada = 5.26 Em amarelo a digitação do operador Resolver problema? (s/n): s Escolha o problema; Digite 1 - para Media aritmetica ponderada 2 - para Soma de PA 3 - para Fatorial Sua opcao: 2 Soma de uma Progressao Aritmetica Digite o primeiro termo, o numero de termos e a razao: 3.5 5 2.3 Soma PA = 40.5 Resolver problema? (s/n): s Escolha o problema; Digite 1 - para Media aritmetica ponderada 2 - para Soma de PA 3 - para Fatorial Sua opcao: 3 Fatorial de um numero Digite o numero (>=0): -1 Numero negativo! Digite novamente: 7 Fatorial(7) = 5040 Resolver problema? (s/n): n Digite algo para encerrar: Completar o programa a seguir #include <stdio.h> #include <conio.h> void main () { char c; int problema, nelem, npa, nfat, fat, - - - - - ; float mediapond, a1, razao, somapa - - - - - ; - - - - printf ("SOLUCAO DE PROBLEMAS MATEMATICOS"); printf ("\n\nResolver problema? (s/n): "); c = getche (); while (c == 's' || c == 'S') { printf ("\n\nEscolha o problema; Digite"); printf ("\n\n\t1 - para Media aritmetica ponderada"); printf ("\n\t2 - para Soma de PA"); printf ("\n\t3 - para Fatorial"); printf ("\n\nSua opcao: "); scanf ("%d", &problema); switch (problema) { case 1: printf ("\n\nMedia Aritmetica Ponderada"); printf ("\n\n\tDigite o numero de elementos (>0): "); scanf ("%d", &nelem); while (nelem <= 0) { - - - - } - - - - - // digitacao dos elementos e seus pesos - - - - - // calculo da media ponderada (mediapond) printf ("\n\tMedia ponderada = %g", mediapond); break; case 2: printf ("\n\nSoma de uma Progressao Aritmetica"); printf ("\n\n\tDigite o primeiro termo, o numero de termos e a razao: "); scanf ("%f%d%f", &a1, &npa, &razao); - - - - - // calculo da soma da PA (somapa) printf ("\n\tSoma PA = %g", somapa); break; case 3: } printf ("\n\nFatorial de um numero"); printf ("\n\n\tDigite o numero (>=0): "); scanf ("%d", &nfat); while (nfat < 0 || nfat >= 13) { - - - - } - - - - - // calculo do fatorial (fat) printf ("\n\tFatorial(%d) = %d", nfat, fat); break; default: printf ("\n\nErro na opcao\nDigite novamente:"); } // final do switch printf ("\n\nResolver problema? (s/n): "); c = getche (); } // final do while printf ("\n\nDigite algo para encerrar: "); getch (); // final do programa Substituir todos os comandos while por for Exercício do Lab 5: Resolução de vários problemas matemáticos Acrescentar ao programa anterior a opção de resolver os seguintes problemas: Cálculo de ex por série de MacLaurin Cálculo de sin(x), por série de MacLaurin (x em graus) Cálculo de cos(x), por série de MacLaurin (x em graus) Cálculo de logbx, usando a função log (logaritmo neperiano) do math.h Cálculo de RaizQuadrada(x) sem usar a função sqrt do math.h Série de MacLaurin para ex: Usar o comando for para calcular a somatória ■ Ou seja, ■ Cada novo termo deve ser acrescentado à somatória enquanto ele não for igual a zero ■ Cada novo termo da somatória pode ser calculado em função do termo anterior Séries de MacLaurin para sin(x) e cos(x) com x em radianos: ■ Ou seja, ■ Cada novo termo deve ser acrescentado à somatória enquanto ele não for igual a zero O ângulo deve ser digitado em graus e convertido para radianos ■ Cada novo termo da somatória pode ser calculado em função do termo anterior Usar o comando for para calcular a somatória Cálculo de logbx: ■ Sabe-se que logbx = logex / logeb ■ O arquivo math.h tem a declaração da função log(y) que calcula logey ■ É só usar essa função Cálculo da raiz quadrada de x sem usar a função sqrt: Estipula-se uma precisão (por exemplo, 0.000001) Dá-se um chute inicial para a raiz (por exemplo, 1) Enquanto o chute estiver fora da precisão (por exemplo, |chute2 - x| > 0.000001) calcular um novo chute usando a seguinte fórmula: NovoChute = (ChuteAnterior + x/ChuteAnterior) / 2 ■ Ver exemplo a seguir x = 72 sqrt = 1.00000000; sqrt = 1.00000000 + 72 / sqrt = 36.50000000 + 72 / sqrt = 19.23630137 + 72 / sqrt = 11.48961232 + 72 / sqrt = 8.87807115 + 72 / sqrt = 8.49397041 + 72 / sqrt = 8.48528582 + 72 / Raiz Quadrada (72) = |sqrt^2 - x| = 71.00000000 1.00000000 = 36.50000000; |sqrt^2 - x| = 1260.25000000 36.50000000 = 19.23630137; |sqrt^2 - x| = 298.03529039 19.23630137 = 11.48961232; |sqrt^2 - x| = 60.01119125 11.48961232 = 8.87807115; |sqrt^2 - x| = 6.82014729 8.87807115 = 8.49397041; |sqrt^2 - x| = 0.14753337 8.49397041 = 8.48528582; |sqrt^2 - x| = 0.00007542 8.48528582 = 8.48528137; |sqrt^2 - x| = 0.00000000 Usar o comando for 8.48528137 para as repetições