Exercício nº 3
Calculadora de Idade
Objetivos do Programa
Este programa tem como objetivo calcular a idade do utilizador.
Para isso é pedido ao utilizador que indique o ano em que nasceu e lhe é perguntado se já fez anos este ano. Em caso afirmativo, é perguntado também o mês (em algarismo(s)), em caso negativo é dada logo a resposta de quantos anos e meses tem.
O programa é interrompido, isto é, a pessoa pode sair do programa quando indicar um ano ou mês negativo ou se pressionar uma letra, sendo que esta informação é dada ao utilizador, de modo a contornar os erros fatais.Caso o utilizador marque um ano superior a 2016 ou um mês superior a 12 o programa reporta o erro mas não sai do programa, volta ao início.
Algoritmia
Programa idade;
(Inserir variáveis necessárias)
Começar
Escrever (informar ao utilizador) o objetivo do programa;
Escrever qual é a condição para sair do programa: ano negativo;
Pedir que o utilizador indique o ano completo em que nasceu em número;
Ler o ano que o utilizador introduz;
Se o ano for menor que zero, reportar erro (escrever "Erro, este programa só calcula a idade depois do ano de nascimento de Cristo") e sair;
Se o ano for superior a 2016 reportar erro (escrever "Erro. Este programa calcula a idade de pessoas que já tenham nascido");
Se o ano for entre zero e 2016 :
Começar
Escrever (perguntar) "Já fez anos este ano? se sim-s se nao-n";
Ler resposta;
Caso a resposta seja s então
Começar
Perguntar o mês
Ler o mês
Se o mês for menor que 1, então sair, se for maior que 12 reportar erro;
Se o mês for entre 1 e 12 então:
A idade será = 2016-ano; Os meses serão =12- mes;
Escrever"A sua idade é: ", idade, " anos e", meses, " meses";
Acabar;
Caso a resposta seja n então
Começar
A idade será = 2016-ano;
Escrever "A sua idade é ", idade " anos e 11 meses". (Porque estamos em Dezembro-Limitação do programa);
Acabar
Caso a resposta seja outra coisa escrever que essa opção não existe;
Acabar case;
Repetir até o ano ou o mes;
Fim.
Codificação
Program idade ;
var idade,ano,mes,meses: integer;
fez: char;
Begin
repeat
writeln('Este programa indica a sua idade cronológica.');
writeln('Para sair, digite um ano ou um mes negativo ou uma letra.');
writeln('');
Write('Indique o ano completo em que nasceu (em número): ');
Readln(ano);
If ano<0 then writeln('Erro. Este programa apenas calcula a idade de pessoas que tenham nascido depois de Cristo')
else
If ano>2016 then writeln('Erro! Este programa foi feito para utiizadores que tenham nascido.')
else
begin
writeln('Já fez anos este ano (responda s ou n)?'); Readln(fez);
Case fez of
's': begin
writeln('Em que mês? '); readln(mes);
if mes<1 then exit
else
if mes>12 then writeln('Erro! Os meses começam em 1 e terminam em 12.')
else
begin idade:=2016-ano; meses:=12-mes;
writeln('A sua idade é: ', idade, ' anos e', meses, ' meses');
end;
end ;
'n': begin
idade:=2016-ano;
writeln(' A sua idade é: ', idade,'anos e 11 meses.');
end
else writeln('Essa opção não existe');
end;
end;
writeln('');
until ano<0;
End.
Obs.: Em caso de não ser legível, existe, nas imagens abaixo, um print do programa feito no Pascal.
Explicaçãoo
(alternativas e limitações)
Para que o programa descubra a idade da pessoa , este precisa de ter o conhecimento do ano e do mês em que nasceu.Para isso, o programa pede, primeiramente, o ano e, aqui encontramos a primeira limitação deste programa: não adivinha a idade da pessoa caso essa tenha nascido antes de Cristo, no entanto, diz isso assim que o ano negativo for introduzido e, automaticamente, sai do programa, uma vez que a inserção de um ano ou um mês negativo (ou uma letra) conduz à saída do programa, tal como lhe é informado logo no início, de modo a contornar os erros fatais. E, se o ano for superior a 2016 o programa diz que não calcula a idade de pessoas que ainda não tenham nascido, o que eu não considero uma limitação pois não existe idade negativa.Para estes "se" eu utilizei o if uma vez que temos apenas três opções (menor que zero, superior a 2016 ou outro). Assim, se o ano for entre zero e 2016 o programa pergunta ao utilizador se este já fez anos este ano. Caso a resposta seja s (é dito ao utilizador que este pode responder s ou n) o programa pergunta em que mês e, utilizei ifs em relação ao mês porque só existem 3 opções: ou o mês é negativo e o programa diz que os meses vão de 1 a 12 e sai do programa porque isso é uma condição para se sair ou o mês é superior a 12 e o programa apenas reporta o erro mas não sai ou outro (o mês está entre 1 e 12- o 12 entre porque a pessoa pode já ter feito anos este mês). Portanto, imaginemos que a pessoa indica, em algarismos, um mês entre 1 e 12, inclusive, o programa faz as contas e indica a idade da pessoa, em anos e em meses. Caso a resposta à pergunta seja "n" o programa faz a operação e diz que a pessoa tem x anos e 11 meses (porque estamos em Dezembro- mais uma limitação: o programa só é válido até 31 de Dezembro de 2016). Caso a resposta for outra coisa, o programa diz que essa opção não existe, isto porque, nos case, as variáveis têm de ser integer ou char, se a pessoa escrever mais do que uma letra , o programa lê unicamente a primeira letra introduzida e se não for uma palavra que começa com s ou n então o programa diz que essa opção não existe e continua a correr, voltando ao início. E, se for introduzido um número, acontece o mesmo "essa opção não existe". Por isso, resolvi apenas dar ao utilizador a informação que só pode responder s ou n. Aqui utilizei o case porque não vi vantagens do if e o case oferece, neste parte, uma estrutura mais organizada, a meu ver. O programa continua até a pessoa escrever um ano ou um mês negativo ou na pergunta se já fez anos responder um inteiro ou uma string (limitação). Para o programa ser menos limitado, poderíamos, em alternativa, utilizar functions ou procedures já feitas do Pascal que indicam o tempo real, assim, o programa seria válido não só até 31 de Dezembro de 2016. No entanto, as minhas tentativas de fazer isso não foram bem sucedidas já que é necessário recorrer a ficheiros já existentes na aplicação, que eu não tinha- as bibliotecas.No entanto, apesar de todas as limitações do meu programa, eu penso que este está bastante completo, lógico e fácil de utilizar para quem não conhece como funcionam os compiladores Pascal, já que está toda a informação escrita, e alguns erros fatais evitados. Está o máximo user-friendly possível, a meu ver e, para reduzirmos algumas das limitações, bastaria tirar a parte do mês no entanto, eu resolvi mantê-la para testar se com muitos ifs o computador baralha-se. Neste programa, não se baralhou, o programa está lógico e penso que seja fácil também de perceber.
Funcionamento do Programa

(Aconselho a ampliar a página)

Início

Até ser verificada uma determinada condição, dita ao utilizador, o programa continua em funcionamento.

(Aconselho a ampliar a página)