Ir ao conteúdo
  • Cadastre-se

Subprogramação Pascal


Posts recomendados

Comecei a aprender hoje subprogramação e estou com algumas dificuldades.. Preciso resolver este exercicios, alguem pode dar uma força?

Faça uma função que ao serem passados como parâmetros um ano e um mês, seja

retornado quantos dias existem naquele mês (cuidado com ano bissexto).

Program p6 ;
procedure auxiliar (var bissexto:boolean; ano:integer);
begin
if (ano mod 400=0) then
bissexto:=true;
if (ano mod 4=0) and (ano mod 100 <> 0) then
bissexto:=true
else
bissexto:=false;
end;
var
mes,aux,anoX:integer;
biss:boolean;
begin
writeln('Entre com o ano: ');
readln(anoX);
auxiliar (biss,anoX);
writeln('Entre com o mes: ');
readln(mes);
if (mes) > 12 then
writeln ('Mes invalido');
if (mes) <= 12 then
begin
if (biss=false) and (mes = 2) then
aux:=28;
end
else
begin
if (mes = 01) then aux:= 31;
if (mes = 02) then aux:= 29;
if (mes = 03) then aux:= 31;
if (mes = 04) then aux:= 30;
if (mes = 05) then aux:= 31;
if (mes = 06) then aux:= 30;
if (mes = 07) then aux:= 31;
if (mes = 08) then aux:= 31;
if (mes = 09) then aux:= 30;
if (mes = 10) then aux:= 31;
if (mes = 11) then aux:= 30;
if (mes = 12) then aux:= 31;
end;
writeln('O mes ',mes,' do ano de ',anoX,'possui ',aux,'dias. ');
end.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP
O que preciso modificar para compilar

Então... compile, traduza as mensagens de erros, analise se são coerentes ao caso (nem sempre são, mas geralmente bate com o erro real) e corrija o código.

Vá repetindo o processo até que esteja tudo certo.

Ex.: Ao compilar, deu os seguintes erros:

_FCH.PAS(5,4) Error: Duplicate identifier "bissexto"

_FCH.PAS(29,25) Error: Identifier not found "bissexto"

_FCH.PAS(47,40) Error: Identifier not found "ano"

_FCH.PAS(47,55) Fatal: String exceeds line

Fatal: Compilation aborted

<<< Process finished.

Nesse caso o meu compilador está acusando que existe uma "duplicidade de identificação" com o termo bissexto" na linha 5, coluna 4, ou seja, tem duas "coisas" diferentes que estão com o mesmo nome para um mesmo escopo. (no caso, tem uma variável "bissexto" na passagem do parâmetro da procedure e tem outra variável declarada dentro da procedure com o mesmo nome.)

Obs.: Erro de compilação se refere a sintaxe, ou seja, não necessariamente a lógica referente ao seu problema vai está certa.

No aguardo.

Abraços.

Link para o comentário
Compartilhar em outros sites

  • 3 anos depois...

(você precisa declarar a varialvel  aux:=0;)

program p6 ;
uses crt;
procedure auxiliar (var bissexto:boolean; ano:integer);
begin
    if (ano mod 400=0) then
           bissexto:=true;
    if (ano mod 4=0) and (ano mod 100 <> 0) then
           bissexto:=true
     else
        bissexto:=false;
end;
    var
        mes,aux,anoX:integer;
        biss:boolean;
    begin

                writeln('Entre com o ano: ');
        readln(anoX);
        auxiliar (biss,anoX);
        writeln('Entre com o mes: ');
        readln(mes);
        if (mes) > 12 then
        writeln ('Mes invalido');
        if (mes) <= 12 then
        begin
            if (biss=false) and (mes = 2) then
            aux:=28;
        end
        else
                aux:=0;
        begin
            if (mes = 01) then
                        aux:= 31
            else if (mes = 02) then
                        aux:= 29
            else if (mes = 03) then
                        aux:= 31
            else if (mes = 04) then
                        aux:= 30
            else if (mes = 05) then
                        aux:= 31
            else if (mes = 06) then
                        aux:= 30
            else if (mes = 07) then
                        aux:= 31
            else if (mes = 08) then
                        aux:= 31
            else if (mes = 09) then
                        aux:= 30
            else if (mes = 10) then
                        aux:= 31
            else if (mes = 11) then
                        aux:= 30
            else if (mes = 12) then
                        aux:= 31;
        end;
        writeln('O mes ',mes,' do ano de ',anoX,' possui ',aux,' dias. ');
                readkey;
    end.

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá a todos.

Complementando...

program p6;
uses
  CRT;
procedure auxiliar (var bissexto:boolean; ano:integer);
  begin
  if (ano mod 400=0) then
    bissexto:=true
  {if (ano mod 4=0) and (ano mod 100 <> 0) then} //sem o else, o if acima não tem utilidade
  else  
    if (ano mod 4=0) and (ano mod 100 <> 0) then
      bissexto:=true
    else
      bissexto:=false;
  end;
var
  mes,
  aux,
  anoX :integer;
  biss :boolean;
begin
writeln('Entre com o ano: ');
readln(anoX);
auxiliar(biss,anoX);
writeln('Entre com o mes: ');
readln(mes);
if (mes) > 12 then
  writeln('Mes invalido')
{if (mes) <= 12 then} //é o oposto da condição acima. Não precisa verificar
else
  {begin} //não precisa
  if (biss=false) and (mes = 02) then
    aux:=28
  {end}
  else
    {aux:=0;} //não precisa, aux sempre vai receber um dos valores (se fosse para inicializar ela, teria que ser antes do bissesto, já que lá ainda tb n foi iniciado
    {begin} //[1]esse begin não estava vinculado a nada (quanto tinha o acho:=0)
    if (mes = 01) then aux:= 31
    else if (mes = 02) then aux:= 29
    else if (mes = 03) then aux:= 31
    else if (mes = 04) then aux:= 30
    else if (mes = 05) then aux:= 31
    else if (mes = 06) then aux:= 30
    else if (mes = 07) then aux:= 31
    else if (mes = 08) then aux:= 31
    else if (mes = 09) then aux:= 30
    else if (mes = 10) then aux:= 31
    else if (mes = 11) then aux:= 30
    else if (mes = 12) then aux:= 31;
    {end;} //[1]
  writeln('O mes ',mes,' do ano de ',anoX,' possui ',aux,' dias. ');
  readkey;
end.



Código resumido e com pequenos ajustes
 

Spoiler

program p6;
uses
  CRT;
procedure auxiliar (var bissexto:boolean; ano:integer);
  begin
  if (ano mod 400=0) then
    bissexto:=true
  else  
    if (ano mod 4=0) and (ano mod 100 <> 0) then
      bissexto:=true
    else
      bissexto:=false;
  end;
var
  mes,
  aux,
  anoX :integer;
  biss :boolean;
begin
writeln('Entre com o ano: ');
readln(anoX);
auxiliar(biss,anoX);
writeln('Entre com o mes: ');
readln(mes);
if (mes) > 12 then
  writeln('Mes invalido')
else
  if (mes = 01) then aux:= 31
  else if (mes = 02) then //dentro de fevereiro, verifico se é bissext ou não
    if (biss = false)
      then aux:= 28
      else aux:= 29
  else if (mes = 03) then aux:= 31 //esse else aqui é do if mes 02
  else if (mes = 04) then aux:= 30
  else if (mes = 05) then aux:= 31
  else if (mes = 06) then aux:= 30
  else if (mes = 07) then aux:= 31
  else if (mes = 08) then aux:= 31
  else if (mes = 09) then aux:= 30
  else if (mes = 10) then aux:= 31
  else if (mes = 11) then aux:= 30
  else if (mes = 12) then aux:= 31;
  writeln('O mes ',mes,' do ano de ',anoX,' possui ',aux,' dias. ');
  readkey;
end.

 

 

 

Veja, os begin/end só são necessários quando temos mais de uma instrução vinculada ao comando (if/else é considerado como uma instrução só, tanto que cada um desses if/else estão dentro do outro, e nem por isso precisou colocar um begin/end em cada um). Abaixo, inserir propositalmente para demonstrar mais ou menos com funcionariam... creio que pode ser útil para dar uma revisada.
 

Spoiler

if (mes) > 12 then
  writeln('Mes invalido')
else
  if (mes = 01) then aux:= 31
  else
    begin
    if (mes = 02) then
      begin
      if (biss = false) then
        begin
        aux:= 28
        end //if biss
      else
        begin
        aux:= 29
        end //else of biss        
      end //if mes 02
  else if (mes = 03) then aux:= 31
  else if (mes = 04) then aux:= 30
  else if (mes = 05) then aux:= 31
  else if (mes = 06) then aux:= 30
  else if (mes = 07) then aux:= 31
  else if (mes = 08) then aux:= 31
  else if (mes = 09) then aux:= 30
  else if (mes = 10) then aux:= 31
  else if (mes = 11) then aux:= 30
  else if (mes = 12) then aux:= 31;
  end; //else if mes 02

 

 

Veja que esses begin/end extras podem ser removidos sem nenhum prejuízo ao algoritmo... lembrando que devem ser sempre apagados o begin com o seu end correspondente... (deixei um comentário indicado para cada um). O do "else if mes 02" é o que parece ser mais estranho, mas é assim mesmo. "Cada else externo tem os outros elses dentro deles... como uma cadeia... veja outro exemplo abaixo:

Spoiler

program p6;
uses
  CRT;
procedure auxiliar (var bissexto:boolean; ano:integer);
  begin
  if (ano mod 400=0) then
    bissexto:=true
  else  
    if (ano mod 4=0) and (ano mod 100 <> 0) then
      bissexto:=true
    else
      bissexto:=false;
  end;
var
  mes,
  aux,
  anoX :integer;
  biss :boolean;
begin
writeln('Entre com o ano: ');
readln(anoX);
auxiliar(biss,anoX);
writeln('Entre com o mes: ');
readln(mes);
if (mes) > 12 then
  writeln('Mes invalido')
else
  if (mes = 01) then aux:= 31
  else
    begin
    if (mes = 02) then
      begin
      if (biss = false) then
        begin
        aux:= 28
        end //if biss
      else
        begin
        aux:= 29
        end //else of biss        
      end //if mes 02
  else if (mes = 03) then aux:= 31
  else if (mes = 04) then aux:= 30
  else if (mes = 05) then aux:= 31
  else if (mes = 06) then aux:= 30
  else if (mes = 07) then aux:= 31
  else //se precisada colocar um begin nesse else, veja onde iria cair o end dele
    begin
    if (mes = 08) then aux:= 31  
  else if (mes = 09) then aux:= 30
  else if (mes = 10) then aux:= 31
  else //e um begin aqui...
    begin
    if (mes = 11) then aux:= 30  
  else if (mes = 12) then aux:= 31;
    end;//else if mes 10
    end;//else if mes 07
  end; //else if mes 02
  writeln('O mes ',mes,' do ano de ',anoX,' possui ',aux,' dias. ');
  readkey;
end.

 



Uma maneira mais organizada, seria usar um case. Pois os "if são simples e mutuamente exclusivos entre si", ou seja, não pode ser mais de uma coisa a mesmo tempo (só um ou nenhum if é verdadeiro)

Spoiler

program p6;
uses
  CRT;
procedure diasiliar (var bissexto:boolean; ano:integer);
  begin
  if (ano mod 400=0) then
    bissexto:=true
  else  
    if (ano mod 4=0) and (ano mod 100 <> 0) then
      bissexto:=true
    else
      bissexto:=false;
  end;
var
  ano,
  mes,
  dias :integer;
  biss :boolean;
begin
write  ('Entre com o ano: '); readln(ano);
diasiliar(biss,ano);
write  ('Entre com o mes: '); readln(mes);
case mes of
  01 :dias:=31;
  02 :begin //esse begin/end não é necessário, pois só temos "um comando" (if/else)
      if (biss = false)
        then dias:=28
        else dias:=29;
      end;
  03 :dias:=31;
  04 :dias:=30;
  05 :dias:=31;
  06 :dias:=30;
  07 :dias:=31;
  08 :dias:=31;
  09 :dias:=30;
  10 :dias:=31;
  11 :dias:=30;
  12 :dias:=31;
  else
    writeln ('Mes invalido');
  end;
  writeln('O mes ',mes,' do ano de ',ano,' possui ',dias,' dias. ');
  ReadKey;
end.

 


Por ai vai...

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...