2. Estamento nobiliario
2.1.6. Ascenso militar y permanencia en el ejército de Cataluña
1. O programa para determinar o número de dias de um mês (exemplo 7 da seção anterior) poderia
utilizar o comando switch:
/* Programa para determinar o numero de dias de um mes*/ #include <stdio.h>
main() {
int Mes, Ano, NumDias; printf("Digite o mes \n"); scanf("%d", &Mes); switch (Mes) { case 2 : printf("Digite o ano"); scanf("%d", &Ano); if (Ano % 4 != 0) NumDias = 28; else NumDias = 29; break; case 4 : case 6 : case 9 :
case 11 : NumDias = 30; break; default : NumDias = 31; }
printf("O mes de numero %d tem %d dias \n", Mes, NumDias); }
Observe que se o mês de entrada for 2, o programa pede o ano para determinar se ele é bissexto. Aí, determina o número de dias e a instrução break encerra o comando switch. Se a entrada for 4, com a sequência de comandos vinculada ao case 4 é vazia (e, portanto, não contém break) as sequências vinculadas aos cases seguintes são executadas até o break do case 11 (para os meses 4, 6, 9 e 11 o número de dias é igual a 30!). Se a entrada não for 2, 4, 6, 9 e 11 a opção default será executada e, portanto, o mês terá 31 dias. Evidentemente, fica faltando discutir a possibilidade de uma entrada inválida como, por exemplo, 13. Isto será discutido no próximo capítulo.
2. Vejamos um exemplo onde a expressão do comando switch retorna um valor do tipo char. Trata-se
da geração de uma calculadora para as quatro operações aritméticas básicas. /*Calculadora eletrônica*/
#include <conio.h> main()
{
float Op1, Op2, Res; char Operador; clrscr();
printf("Digite a opera‡ao desejada\n");
scanf("%f %c %f", &Op1, &Operador, &Op2); switch (Operador)
{ case '+':
Res = Op1 + Op2; break; case '-':
Res = Op1 - Op2; break; case '*':
Res = Op1 * Op2; break; case '/':
if (Op2 != 0)
Res = Op1 / Op2; break; }
clrscr();
if (Operador == '/' && Op2 == 0) printf("Divisao por zero!!!"); else
printf("%.2f %c %.2f = %.2f \n", Op1, Operador, Op2, Res); getch();
}
3. Um outro exemplo interessante de utilização do comando switch é um programa que determine o
dia da semana de uma data dada. Tomando como base o ano de 1600 (em 1582 o Papa Gregorio III instituiu mudanças no calendário então vigente) e sabendo que o dia primeiro daquele ano foi um sábado, para se determinar o dia da semana de uma data dada basta se calcular o número de dias decorridos entre a data dada e o dia 01/01/1600. Como a associação do dia da semana a uma data é periódica, de período 7, o resto da divisão do número de dias referido acima por 7 indica a relação entre o dia da semana procurado e o sábado: se o tal resto for 0 (zero), o dia da semana é sábado; se o resto for 1 o dia da semana é domingo, e assim sucessivamente.
Para calcular o número de dias entre uma data dada e 01/01/1600 basta multiplicar o número de anos por 365 e acrescentar a quantidade de anos bissextos e o número de dias decorridos no ano corrente.
Para calcular a quantidade de anos bissextos entre 1600 e o ano da data dada basta calcular a expressão Quantidade de múltiplos de 4 – Quantidade de múltiplos de 100 + Quantidade de múltiplos de 400, onde Quantidade de múltiplos de x refere-se à quantidade de múltiplos de x compreendidos entre 1600 e o ano da data dada, como discutido no exemplo 5 da seção 2.10.
Para calcular o número de dias decorridos no ano da data dada basta ...(isto está explicado nos comentários do programa).
/* Programa para determinar o dia da semana de uma data dada */ #include <stdio.h>
#include <conio.h> main()
{
int Dia, Mes, Ano, DiasDoAno, Dias31, AnosBiss, Aux, Mult4, Mult100, Mult400; long int Anos, NumDias;
clrscr();
printf("Digite a data no formato dd/mm/aaaa\n"); scanf("%d/%d/%d", &Dia, &Mes, &Ano); Anos = Ano - 1600;
/* Numero de meses com 31 dias ate o mês dado */ if (Mes < 9)
Dias31 = Mes/2; else
Dias31 = (Mes + 1)/2;
/*Numero de dias do ano dado, considerando fevereiro com tendo 30 dias*/ DiasDoAno = 30*(Mes - 1) + Dia + Dias31;
/*Retifica o numero de dias de fevereiro*/ if (Mes > 2)
if ((Ano % 4 != 0) || ((Ano % 100 == 0) && (Ano % 400 != 0))) DiasDoAno = DiasDoAno - 2;
else
DiasDoAno = DiasDoAno - 1;
/*Numero de anos bissextos entre o ano dado e 1600*/ Aux = Ano - 1;
Mult4 = (Aux - (Aux % 4) - 1600)/4; Mult100 = (Aux - (Aux % 100) - 1600)/100; Mult400 = (Aux - (Aux % 400) - 1600)/400; AnosBiss = Mult4 - Mult100 + Mult400;
/*Numero de dias entre a data dada e 01/01/1600*/ NumDias = Anos*365 + DiasDoAno + AnosBiss; /*Dia da semana*/
printf("\nData: %d/%d/%d Dia da semana:", Dia, Mes, Ano); switch(NumDias % 7)
{
case 0 : printf(" Sabado"); break; case 1 : printf(" Domingo"); break; case 2 : printf(" Segunda"); break; case 3 : printf(" Terca"); break; case 4 : printf(" Quarta"); break; case 5 : printf(" Quinta"); break; case 6 : printf(" Sexta"); break; }
getch(); }
Vale observar que este programa dará uma “resposta” mesmo que a data dada não seja uma data válida, como 29/02/2009 por exemplo. Isto será discutido no próximo capítulo.
Vale observar também que o programa realiza pelo menos duas ações com objetivos específicos e raciocínios próprios: o cálculo do número de anos bissextos entre 1600 e ano da data dada e a determinação do número de dias decorridos no referido ano. No capítulo 5 vamos mostrar que se pode (se deve) escrever subprogramas (funções) para realizar cada uma destas ações.
3.8 Exercícios propostos
1. Reescreva o programa do exemplo zero da seção 3.5 de modo que os instantes sejam dados (e o
intervalo de tempo fornecido) em horas minutos e segundos.
2. Escreva um programa que realize arredondamentos de números utilizando a regra usual da
matemática: se a parte fracionária for maior do que ou igual a 0,5, o número é arredondado para o inteiro imediatamente superior, caso contrário, é arredondado para o inteiro imediatamente inferior.
3. Escreva um programa para verificar se um inteiro dado é um quadrado perfeito, exibindo, nos casos
afirmativos, sua raiz quadrada.
4. Escreva um programa para determinar o maior de três números dados.
5. Escreva um programa para classificar um triângulo de lados de comprimentos dados em escaleno
(os três lados de comprimentos diferentes), isósceles (dois lados de comprimentos iguais) ou equilátero (os três lados de comprimentos iguais).
exibindo, nos casos afirmativos, sua hipotenusa e seus catetos.
7. Escreva um programa para determinar as raízes reais ou complexas de uma equação do segundo
grau, dados os seus coeficientes.
8. Escreva um programa para determinar a idade de uma pessoa, em anos meses e dias, dadas a data
(dia, mês e ano) do seu nascimento e a data (dia, mês e ano) atual.
9. Escreva um programa que, recebendo as duas notas bimestrais de um aluno da escola referida no
exemplo 5 da seção 3.5, forneça a nota mínima que ele deve obter na prova final para que ele seja aprovado.
Observação
Propostas de soluções dos exercícios propostos podem ser solicitadas através de mensagem eletrônica para [email protected] com assunto RESPOSTAS LIVRO C, anexando o formulário abaixo devidamente preenchido.
Nome Categoria1 Instituição2 Curso2 Cidade/Estado 1Categoria: docente, estudante, autodidata