210 likes | 295 Views
CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013. Capítulo V Comandos For e Switch-Case. Sejam os seguintes comandos: int n, i, num, soma; scanf (“%d”, &n); soma = 0; i = 1; while (i <= n) { scanf (“%d”, &num); soma += num; i++; }.
E N D
CES-10 INTRODUÇÃO À COMPUTAÇÃOAulas Práticas – 2013 Capítulo V Comandos For e Switch-Case
Sejam os seguintes comandos: int n, i, num, soma; scanf (“%d”, &n); soma = 0; i = 1; while (i <= n) { scanf (“%d”, &num); soma += num; i++; } Eles podem ser escritos usando-se o comando for: scanf (“%d”, &n); soma = 0; for (i = 1; i <= n; i++) { scanf (“%d”, &num); soma += num; } ou: scanf (“%d”, &n); for (soma = 0, i = 1; i <= n; i++) { scanf (“%d”, &num); soma += num; } soma += num; equivale a soma = soma + num; i++; equivale a i = i + 1; Outro comando repetitivo: for Ou outras 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 CmdForacima equivale a Inicializações while ( Expressão ) { Comando Atualizações }
Fluxograma do comando for: • for ( Inicializações ; Expressão ; Atualizações ) Comando
Programa 5.1: Números perfeitos #include <stdio.h> #include <conio.h> 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; while (i <= n) { soma = 0; div = 1; while (div*2 <= i) { if (i % div == 0) soma += div; div++; } if (soma == i) printf ("%12d", i); i++; } printf ("\n\nDigite algo para encerrar: "); getch (); } Número perfeito: a soma de seus divisores próprios é igual a si mesmo. Exemplos: 6 = 1 + 2 + 3 28 = 1 + 2 + 4 + 7 + 14 Usar comando for ao invés de while Salvar e executar
Comando condicional de várias alternativas: Expressão Outros V11, V12, ... , V1i V21, V22, ... , V2j Vn1, Vn2, ... , Vnp Lista de comandos Lista de comandos Lista de comandos Lista de comandos
Programa 5.2: Levantar o astral Salvar e executar #include <stdio.h> #include <conio.h> void main ( ) { char c; int n; printf ("Levantar o astral? (s/n): "); c = getche(); while (c == 's' || c == 'S') { printf ("\n\n\tDigite um numero de 1 a 7: "); scanf ("%d", &n); switch (n) { case 1: printf ("\n\tVoceeh inteligente"); break; case 2: printf ("\n\tVoceehcampeao"); break; case 3: printf ("\n\tVoceestah 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 break’s e executar Trocar o esquema while por for
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: • Cálculo da média aritmética ponderada de vários números reais • Cálculo da soma dos termos de uma progressão aritmética de números reais • Cálculo do fatorial de um número inteiro A escolha do problema deve usar o comando switch-case
Usar o comando for sempre que puder O programa deve insistir para o operador digitar os dados corretamente Para cada problema a ser resolvido, o programa deve pedir dados específicos para o operador • Media ponderada: • 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 • Fatorial: Pedir o número do qual se deseja o fatorial (deve ser inteiro e 0 e < 13) A seguir, sugestão para saída de resultados
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\nMediaAritmetica 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 ProgressaoAritmetica"); 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 expor 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
Usar o comando for para calcular a somatória • Série de MacLaurin para ex: • 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 • Cada novo termo da somatória pode ser calculado em função do termo anterior O ângulo deve ser digitado em graus e convertido para radianos 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^2 - x| = 71.00000000 sqrt = 1.00000000 + 72 / 1.00000000 = 36.50000000; |sqrt^2 - x| = 1260.25000000 sqrt = 36.50000000 + 72 / 36.50000000 = 19.23630137; |sqrt^2 - x| = 298.03529039 sqrt = 19.23630137 + 72 / 19.23630137 = 11.48961232; |sqrt^2 - x| = 60.01119125 sqrt = 11.48961232 + 72 / 11.48961232 = 8.87807115; |sqrt^2 - x| = 6.82014729 sqrt = 8.87807115 + 72 / 8.87807115 = 8.49397041; |sqrt^2 - x| = 0.14753337 sqrt = 8.49397041 + 72 / 8.49397041 = 8.48528582; |sqrt^2 - x| = 0.00007542 sqrt = 8.48528582 + 72 / 8.48528582 = 8.48528137; |sqrt^2 - x| = 0.00000000 Raiz Quadrada (72) = 8.48528137 Usar o comando for para as repetições