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