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