Ir ao conteúdo

Functions & Procedures


E.M.I.C.I.D.A

Posts recomendados

Postado

Olá pessoal, bom dia !

Estou com um problema um pouco grande.

É um trabalho que estou tentando fazer à uns dias mas não obtenho êxito em minhas tentativas. Vou citar-lhes o enunciado:

" Um pequeno município deseja cadastrar seus contribuintes proprietários de imóveis, verificar se seu IPTU está em dia e calcular a multa daqueles que estão em débito. Fazer um programa para resolver esse problema, considerando que serão fornecidos o nome do proprietário,o número do imóvel,o valor do IPTU e os meses em atraso.

O Programa deverá conter:

* Uma função que faça a entrada dos dados e verifique se há atraso ou não, retornando o número de meses em atraso.

* Uma subrotina que calcule a multa a ser paga caso haja atraso.

* Uma Procedure que mostre na tela o nome do proprietário,o número do imóvel,os meses em atraso,o valor do IPTU e o valor a ser pago já acrescida a multa se houver.

Observações:

A quantidade de dados de entrada é indefinida. Para encerrar o nome do propietário deve ser igual a "9";

A multa deve ser calculada de acordo com a tabela abaixo:;

Valor do IPTU________________________ %por mês em atraso

até 200,00____________________________ 1%

de 200,01 a 400,00________________________ 3%

de 400,01 a 700,00________________________ 5%

de 700,01 a 1.000,00_______________________8%

acima de 1.000,00_________________________ 10%

_________________________________________________________________

Eu não sei como calcular se o cidadão está em atraso, e se está , atribuir essa porcentagem. Não consigo fazer nem um e nem outro. Direto quando tento fazer da um erro.

Alguem consegue me dar ao menos um base desse programa para eu me virar por favor ?

Ao menos um base de como eu posso começar a desenvolver esse bicho de 7 cabeças :wacko:

Postado

Então colega, no próprio enunciado não especifica. Mas sua visão foi interessante,vamos supor que fosse nesse sentido.

O que eu poderia fazer ?

Porque enquanto eu aguardava a resposta de alguem aqui no forum, estava tentando resolver aqui, estou desenvolvendo o programa ainda mas vou colocá-lo aqui para ver se estou no caminho certo :



Program cadastro;
var m_atual:integer;

function ent_dados (i:real):real;
Var porcento: real;
porcento := i;
i := i+porcento;
end;

procedure p;
Var d:real;
begin
d := 900;
writeln (' IPTU = R$ ',d,'00');

d:= d + ent_dados (m_atual);

writeln (' Valor do IPTU com Multa Inclusa: ',d);

end;



procedure y;
Var A,B:string;

Begin

A:= 'Fred';
B:= ' Imóvel 1';

writeln (' ');
writeln (A,' possui o ',B,', com o valor de R$ 500,00 Mensais.');
writeln (' ');

end;

Begin {[COLOR="Red"]agora vem o bloco principal[/COLOR]}

writeln (' Informações do Proprietário: ');
y;
writeln (' Informações IPTU: ');
writeln (' ');
p;
writeln (' ');

m_atual := 900; {[COLOR="red"]estou atribuindo esse valor, que seria o valor do IPTU[/COLOR]}

end.

Então, estou tentando de tudo para conseguir elaborar esse problema mas por enquanto saiu isso. Entendeu ? Está bem complicado.

Postado

Apenas um começo (há muito o que melhorar, como o cálculo da multa):


PROGRAM VERIFIPTU;
USES
CRT, DOS;
VAR
CONTAGEM, IMOVEL: LONGINT;
NOME: STRING;
ATRASO: INTEGER;
VALOR, MULTA, TAXA: REAL;
MES, ANO: WORD;
TECLA: CHAR;

FUNCTION ENTRADA (CONST IN_CONTAGEM: LONGINT; VAR OUT_IMOVEL: LONGINT; VAR OUT_NOME: STRING; VAR OUT_VALOR: REAL; VAR OUT_MES, OUT_ANO: WORD) : INTEGER; {A CONTAGEM NÃO SERÁ ALTERADA}
VAR
STR: STRING;
ERR, ERR2, LUG, MES, ANO, VIRG: INTEGER;
MESHOJE, ANOHOJE, D, S: WORD; {"D" E "S" APENAS PARA RECOLHER A DATA}
BEGIN
WRITELN('CADASTRO N',#233,'MERO ',IN_CONTAGEM:0);
WRITELN('****************');
{COLETAR NOME}
WRITE('DIGITE O NOME: >> ');
LUG := WHEREX; {GUARDAR POSIÇÃO DO CURSOR NA TELA}
READLN(OUT_NOME);
WHILE LENGTH(OUT_NOME) = 0 DO
BEGIN
GOTOXY(LUG, WHEREY-1); {VOLTAR}
CLREOL; {APAGAR}
READLN(OUT_NOME); {LER OUTRA VEZ}
END;
IF OUT_NOME <> '9' THEN {SE NÃO FOR PARA ENCERRAR}
BEGIN
WRITE('DIGITE O N',#233,'MERO DO IM',#224,'VEL (APENAS ALGARISMOS): >> ');
LUG := WHEREX; {GUARDAR POSIÇÃO DO CURSOR NA TELA}
READLN(STR);
VAL(STR, OUT_IMOVEL, ERR);
WHILE ERR <> 0 DO
BEGIN
GOTOXY(LUG, WHEREY-1); {VOLTAR}
CLREOL; {APAGAR}
READLN(STR); {LER OUTRA VEZ}
VAL(STR, OUT_IMOVEL, ERR);
END;
{COLETAR VALOR IPTU}
WRITE('DIGITE O VALOR MENSAL DO IPTU EM REAIS: >> ');
LUG := WHEREX; {GUARDAR POSIÇÃO DO CURSOR NA TELA}
READLN(STR);
WHILE POS(',',STR) <> 0 DO {TROCAR VÍRGULAS POR PONTOS}
BEGIN
VIRG := POS(',',STR);
STR[VIRG] := '.';
END;
VAL(STR, OUT_VALOR, ERR);
WHILE (ERR <> 0) OR (VALOR <=0) DO
BEGIN
GOTOXY(LUG, WHEREY-1); {VOLTAR}
CLREOL; {APAGAR}
READLN(STR); {LER OUTRA VEZ}
VAL(STR, OUT_VALOR, ERR);
END;
GETDATE(ANOHOJE, MESHOJE, D, S); {DATA ATUAL DO SISTEMA}
WRITE('DIGITE O M',#210,'S E O ANO DO ',#233,'LTIMO PAGAMENTO NO FORMATO 12.1999: >> ');
LUG := WHEREX; {GUARDAR POSIÇÃO DO CURSOR NA TELA}
READLN(STR);
VAL(STR[1]+STR[2],OUT_MES,ERR);
VAL(STR[4]+STR[5]+STR[6]+STR[7],OUT_ANO,ERR2);
WHILE (STR[3]<>'.') OR (ERR<>0) OR (ERR2<>0) OR (OUT_MES<1) OR (OUT_MES>12) OR (OUT_ANO>ANOHOJE) OR (OUT_ANO < 1900) OR ((OUT_ANO=ANOHOJE) AND (OUT_MES>MESHOJE)) DO
BEGIN
GOTOXY(LUG, WHEREY-1); {VOLTAR}
CLREOL; {APAGAR}
READLN(STR); {LER OUTRA VEZ}
VAL(STR[1]+STR[2],OUT_MES,ERR);
VAL(STR[4]+STR[5]+STR[6]+STR[7],OUT_ANO,ERR2);
END;
ENTRADA := (12*ANOHOJE + MESHOJE) - (12*OUT_ANO + OUT_MES);
END
ELSE {NOME=9, SAIR}
ENTRADA := -1;
END; {FUNCTION}


FUNCTION CALCULAMULTA (IN_TAXA: REAL; IN_ATRASO: INTEGER; IN_VALOR: REAL) : REAL;
VAR
VALORFINAL, i, n, R: REAL;
BEGIN
i := IN_TAXA;
n := ATRASO;
R := VALOR;
VALORFINAL := R/i * (i+1) * ( EXP(LN(i+1)*n) - 1 );
CALCULAMULTA := VALORFINAL - n*R;
{FALTA ALTERAR O CÁLCULO}
END; {FUNCTION}


PROCEDURE RESULTADO (IN_CONTAGEM: LONGINT; IN_NOME: STRING; IN_IMOVEL: LONGINT; IN_MES, IN_ANO:WORD; IN_ATRASO: INTEGER; IN_TAXA, IN_VALOR, IN_MULTA: REAL);
CONST
NOMEMES: ARRAY [0..12] OF STRING = ('DEZ', 'JAN', 'FEV', 'MAR', 'ABR', 'MAI', 'JUN', 'JUL', 'AGO', 'SET', 'OUT', 'NOV', 'DEZ');
VAR
MESHOJE, ANOHOJE, D, S: WORD; {"D" E "S" APENAS PARA RECOLHER A DATA}
BEGIN
GETDATE(ANOHOJE, MESHOJE, D, S);
WRITELN('CADASTRO ',CONTAGEM:0);
WRITELN('NOME: ',IN_NOME);
WRITELN('IM',#224,'VEL: ',IN_IMOVEL:0);
IF IN_MULTA > 0 THEN
BEGIN
WRITELN('ATRASOS: ',NOMEMES[IN_MES],'/',IN_ANO:0,' A ',NOMEMES[MESHOJE-1],'/',ANOHOJE:0);
WRITELN('MULTA (',IN_TAXA*100:0:0,'% AO M',#210,'S): R$ ',IN_MULTA:0:2);
WRITELN('A PAGAR: R$ ',(IN_ATRASO*IN_VALOR+MULTA):0:2);
END
ELSE
BEGIN
WRITELN('ATRASO: NENHUM');
WRITELN('MULTA: R$ 0.00');
WRITELN('NADA A PAGAR');
END;
END; {PROCEDURE}


BEGIN {PRINCIPAL}
TEXTBACKGROUND(BLUE);
CLRSCR;
TEXTCOLOR(LIGHTGREEN);
CONTAGEM := 1;
REPEAT
ATRASO := ENTRADA(CONTAGEM, IMOVEL, NOME, VALOR, MES, ANO);
WRITELN('------------------');
CLRSCR;
IF ATRASO <> -1 THEN
BEGIN
IF VALOR <= 200 THEN
TAXA := 0.01
ELSE
IF VALOR <= 400 THEN
TAXA := 0.03
ELSE
IF VALOR <= 700 THEN
TAXA := 0.05
ELSE
IF VALOR <= 1000 THEN
TAXA := 0.08
ELSE
TAXA := 0.10;
IF ATRASO = 0 THEN
MULTA := 0
ELSE
MULTA := CALCULAMULTA (TAXA, ATRASO, VALOR); Writeln('Multa = ',multa:0:2);
RESULTADO (CONTAGEM, NOME, IMOVEL, MES, ANO, ATRASO, TAXA, VALOR, MULTA);
INC(CONTAGEM);
REPEAT
TECLA := READKEY;
UNTIL ORD(TECLA) IN [0,13];
END;
CLRSCR;
UNTIL ATRASO = -1;
END. {PRINCIPAL}

Postado

Excelente Vinicius !

Era exatamente o que eu imaginava: " Um programa grande " .

Mas eu também preciso de outro detalhe colega, esqueci de mencionar !

Só posso usar dados do tipo " Real,Boolean,Integer,Char & String ".

E também só comandos simples, como Estrutura de Repetição, Estruturas de Comando de Fluxo (If,Then,Else) Subrotinas (Procedure & Function).

Infelizmente querem o programa com estruturas SIMPLES até demais.

Aí que complica a história da programação.

Matriz não pode, Array, no caso.

Getdate.

Tem que ser algo simples de mais.

Complicou, certo ?

Postado

  • Troque LONGINT e WORD por INTEGER (o resultado é semelhante, porém há diferenças).
  • Para tirar o ARRAY, o procedure RESULTADO só poderá imprimir o número do mês ou então terá que ser bem grande.
  • Como fazer a verificação da data sem o GetDate?

Postado

Também não sei colega.

Porque pelo que me foi passado, tenho que fazer esse programa com comandos simples.

E também tem que ser algo, um tanto menor do que o programa atual.

Acho uma tarefa complicada por ser complexa aos comandos. Pois cada procedure e function tem uma quantidade elevada de linhas.

Vou estudar esse programa estruturado por ti para diminuir o tamanho do mesmo e deixá-lo mais simples.

Agradeço sua atenção para comigo.

  • Membro VIP
Postado

Excelente Vinicius !

Era exatamente o que eu imaginava: " Um programa grande " .

Mas eu também preciso de outro detalhe colega, esqueci de mencionar !

Só posso usar dados do tipo " Real,Boolean,Integer,Char & String ".

E também só comandos simples, como Estrutura de Repetição, Estruturas de Comando de Fluxo (If,Then,Else) Subrotinas (Procedure & Function).

Infelizmente querem o programa com estruturas SIMPLES até demais.

Aí que complica a história da programação.

Matriz não pode, Array, no caso.

Getdate.

Tem que ser algo simples de mais.

Complicou, certo ?

Olá,

Criei uma base pra você.

Ai você pode ir implementando o resto e ajustando...

PROGRAM Cadastro_De_Proprietarios;

(*
"Uma função que faça a entrada dos dados e verifique se há atraso ou não,
retornando o número de meses em atraso."

Obs: A entrada de dados já pede os meses em atraso, logo não precisaria um
"função" para definir isso... só seguir o que eu entendi do enunciado.
*)
function entradaDados(var nomeProp:string; var numeroImov:integer;
var valorIPTU:real):integer;
var
mesesAtraso:integer;
begin
{ler os dados do proprietário}
write('Nome : '); readln(nomeProp);
write('Numero : '); readln(numeroImov);
write('IPTU : '); readln(valorIPTU);
write('Meses atrasado : '); readln(valorIPTU);
{verifia se existe atraso}
if mesesAtraso>0 then
writeln('EXISTE ATRASO')
else
writeln('Proprietario em dias');
{retorna os meses em atraso}
entradaDados:=mesesAtraso;
end;

(*
"Uma subrotina que calcule a multa a ser paga caso haja atraso."
*)
function valorMulta(valorIPTU:real; mesesAtraso:integer):real;
begin

{VOCÊ TEM QUE IMPREMENTAR ESSA PARTE QUE RETORNARÁ O VALOR DA MULTA}

end;

(*
Uma Procedure que mostre na tela o nome do proprietário, o número do imóvel,
os meses em atraso, o valor do IPTU e o valor a ser pago já acrescida a multa
se houver.
*)
procedure mostraDados (nomeProp:string; numeroImov:integer; mesesAtraso:integer;
valorIPTU:real);
var
multa :real;
begin
multa:=valorMulta(valorIPTU,mesesAtraso);

{AQUI VOCÊ IMPLEMENTARÁ O CODIGO PARA EXIBIR OS DADOS}

end;

{ ***** VARIÁVEIS GLOBAIS ***** }
var
nomeProprietario :string;
numeroImovel :integer;
valorIPTU :real;
mesesAtraso :integer;

BEGIN
(*
A quantidade de dados de entrada é indefinida. Para encerrar o nome do propietário deve ser igual a "9";
*)
repeat
entradaDados(nomeProprietario, numeroImovel, valorIPTU);

{IMPLEMENTE A PARTE DO PROGRAMA PRINCIPAL}

until nomeProprietario='9';

END.

No aguardo

Abraços

  • 2 semanas depois...
Postado

Valeu mesmo chapas !

Aí, tentei fazer um aqui mas está faltando algo nele que eu não consigo detectar.

Ele esta rodando, mas ao mesmo tempo só pede para escrever e depois o programa fecha :(

Segue o programa:


Program cadastro;
uses crt;
Var nome_prop:string;
numeroImov:integer;
V_IPTU:longint;
mes_atraso:integer;
inicio:real;

function ent_dados (NomeProprietario:string; NumeroImovel:integer; V_IPTU:real):real;



Begin

writeln ('NOME '); readln (nome_prop);
writeln ('NUMERO IMOVEL '); readln (numeroImov);
writeln ('VALOR DO IPTU '); readln (v_IPTU);
writeln ('MESES EM ATRASO '); readln (mes_atraso);

{Verifica se tem atraso}

if mes_atraso > 0 then
writeln ('Existe Atraso')
else
writeln ('Proprietário em dia !');

ent_dados:= mes_atraso

end;

{Função que calcula a multa}

function valorMulta (va_IPTU:longint):real;
Var mes_atraso:integer;
Begin

if va_IPTU < 200 then
va_IPTU:= (va_IPTU div 100)
else
if va_IPTU < 400 then
va_IPTU:= (va_IPTU*3) div 100
else
if va_IPTU < 700 then
va_IPTU:= (va_IPTU*5) div 100
else
if va_IPTU < 1000 then
va_IPTU:= (va_IPTU*10) div 100;
writeln (va_IPTU);
valorMulta:=va_IPTU;

end;

procedure tela (x:real);

Begin
clrscr;

writeln (' Sr.(a) ',nome_prop,',');
writeln (' Seu imóvel de número ',numeroImov);
writeln (' Com o IPTU de R$',v_IPTU);
writeln (' Está com ',mes_atraso,' meses de atrasado em nosso sistema.');
x:= valorMulta (v_IPTU);
writeln (' Portanto você terá um acrescimo no valor de R$ ',x);
end;


{Bloco Principal}

Begin
clrscr;
inicio:= ent_dados (nome_prop,numeroImov,v_IPTU);
end.

Falta pouco galera, estamos quase lá =S

Alguém sabe o que fazer ? Se souber, por gentileza me ajude.

Agradeço !

Abraço!

Postado

Alterei algumas coisas:


Program cadastro;
uses
crt;

{ agrupando variáveis e adicionando "multa" }

Var nome_prop:string;
numeroImov,mes_atraso:integer;
inicio, V_IPTU, multa:real;
{ o valor do IPTU nem sempre é inteiro! }
tecla: char;
{ para recolher a tecla ENTER }


{ para permitir que a função altere as variáveis, insira "var" }
{ adicionado novo parâmetro "TempoAtraso" }
function ent_dados (var NomeProprietario:string; var NumeroImovel:integer; var IPTU:real; var TempoAtraso:integer):real;
Begin
{ trocando variáveis globais por locais }
writeln ('NOME '); readln (NomeProprietario);
{ parar tudo se o nome for '9' }
if NomeProprietario <> '9' then
begin
writeln ('NUMERO IMOVEL '); readln (NumeroImovel);
writeln ('VALOR DO IPTU '); readln (IPTU);
writeln ('MESES EM ATRASO '); readln (TempoAtraso);
{Verifica se tem atraso}
if TempoAtraso > 0 then
writeln ('Existe Atraso')
else
writeln ('Proprietário em dia !');
ent_dados:= TempoAtraso;
end;
end;

{Função que calcula a multa}

{ a função precisa do tempo de atraso para calcular a multa, portanto adicionado parâmetro }
function valorMulta (va_IPTU:real; tempo: integer):real;
Begin

{
observação:
seu cálculo parece estar errado;
adicione aqui o cálculo correto.
}

end;


{ acrescentando parâmetros necessários para não usar variáveis globais }
{ a multa será calculada antes }
procedure tela ( vNOM: string; vNUM: integer; vVAL: real; vATR:integer; vMUL:real);
Begin
clrscr;
{ trocando as variáveis }
writeln (' Sr.(a) ',vNOM,',');
writeln (' Seu imóvel de número ',vNUM:0);
writeln (' Com o IPTU de R$',vVAL:0:2);
writeln (' Está com ',vATR,' meses de atraso em nosso sistema.');
{ retirado o cálculo da multa, pois terá sido calculada antes }
writeln (' Portanto você terá um acrescimo no valor de R$ ',vMUL:0:2);
end;


{Bloco Principal}

Begin
clrscr;
{ adicionando estruturas de repetição }
repeat
inicio:= ent_dados (nome_prop,numeroImov,v_IPTU,mes_atraso);
if nome_prop <> '9' then
begin
multa := valorMulta (v_IPTU,mes_atraso);
tela(nome_prop,numeroImov,v_IPTU,mes_atraso,multa);
writeln('Pressione Enter para o próximo...');
repeat
tecla := readkey;
until ord(tecla) in [0,13];
end;
clrscr;
until nome_prop = '9';
end.

Falta a função para calcular a multa.

Observações:

O programa aceita números negativos (não deveria aceitar) e fecha caso seja digitado um "não-número" quando é solicitado um número. Pode ser corrigido. No programa que eu havia feito, já está correto, porém é muito grande...:D

Postado

Vinicius o programa ficou ótimo !

Mas eu tinha um prazo até Quinta-Feira, de ultima hora, pegamos uma base e programamos o dito cujo de acordo com o enunciado.

Não estou com ele aqui no momento, mas creio que até terça estarei com e postarei como ficou.

Vinicius eu te agradeço muito, e ao estilingue também agradeço muito !

Se não trabalham na área, deveriam trabalhar !

Pois tem uma ótima lógica ! (não digo só pelo meu tópico,mas já vi outros de vocês e realmente são bons ! )

Obrigado Senhores !

Logo que conseguir o programa, o postarei no mesmo dia !

Boa noite !

  • 2 semanas depois...
Postado

Pessoal, peguei o exercício novamente (após ser entregue ao conseguir fazê-lo) e vou postá-lo aqui.

Está rodando do jeito certo, e simples !

Creio que não dê para deixá-lo menor que isso.

Segue o programa abaixo:


program calc;
uses crt;

var Imov,meses:integer;
iptu,calc_iptu:real;
prop:string;

procedure Calcula;
begin
if iptu <=200 then
calc_iptu:=iptu + ((iptu*0.01)*meses)
else
if iptu<=400 then
calc_iptu:=iptu + ((iptu*0.03)*meses)
else
if iptu<=700 then
calc_iptu:=iptu + ((iptu*0.05)*meses)
else
if iptu<=1000 then
calc_iptu:=iptu +((iptu*0.08)*meses)
else
calc_iptu:=iptu +((iptu*0.01)*meses)
end;

function Atraso:integer;
begin
Atraso:=meses;
end;

procedure Exibe;
begin
if Atraso > 0 then
begin
Calcula;
writeln;
writeln('Nome do Proprietario.: ',prop);
writeln('Numero do Imovel.: ',imov);
writeln('Meses de atraso.:',meses);
writeln('Atualmente Você Paga R$',iptu:6:2,'de IPTU');
writeln('Agora Com o Valor Acrescido da Multa, Você Pagará R$:',calc_iptu:6:2);
writeln;
end
else
begin
writeln;
writeln('O proprietario ',prop,' do imovel numero ',Imov,', está em dia');
writeln;
end

end;

begin
clrscr;

repeat
write('Digite o nome do proprietario:');
readln(prop);
if prop <> '9' then
begin
write('Digite o numero cadastrado do imóvel:');
readln(Imov);
write('Digite o valor do IPTU:');
readln(iptu);
write('Digite o numero de meses em atraso:');
readln(meses);

while meses <0 do
begin
writeln('Valor de meses inválido.Favor informar numero valido:');
readln(meses);
end;
Exibe;

end;

until prop='9';
end.

Galera, novamente eu agradeço o apoio de todos !

Um AbraçO!

Att,

Roger Mayer

Arquivado

Este tópico foi arquivado e está fechado para 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...