Ir ao conteúdo

Function Com Passagem de Parametro


Danielcpp

Posts recomendados

Postado

Ola Meu Nome é Daniel Marcos,estou cursando o ensino médio tecnico de informatica, e meu professor apareceu com um problema simples que eu nao vi em lugar nenhum funcionando e ele deu errado na minha prova mesmo eu dizendo a ele que eu compilei o programa assim e nao funcionava, bom vou mostrar a condificaçao é bem simples!.

a) Uma Sub Rotina que receba os dados dos funcionarios;

B) Uma Sub Rotina que calculase 7% de desconto e 30 reais de bonificaçao

pra calcular o salario liquido.

ps*o salario inicial é o bruto

program reg_sub;
uses crt;
type reg=record
cod:integer;
setor:string[20];
salario:real;
end;
var
i:integer;
empregado:array[1..100] of reg;
salarioliq:real;


procedure entrada;
begin
for i:= 1 to 100 do
begin
writeln('Digite O Codigo Do Funcionario ',i,'.');
readln(empregado[i].cod);
writeln('Digite O Setor Do Funcionario ',empregado[i].cod,'.');
readln(empregado[i].setor);
writeln('Digite O Salario Do Funcionario ',empregado[i].cod,'.');
readln(empregado[i].salario);
end;
end;

[B][U]function cal(salario:real):real;
var
rec:real;
begin
rec:=salario*0.07;
cal:=salario-rec+30;
end;
[/U][/B]
begin
clrscr;
entrada;
for i:= 1 to 100 do
begin
salarioliq:=cal(empregado[i].salario);
writeln('O Salario liquido Do Funcionario ',empregado[i].cod{i},'e de ',salarioliq,'.');
end;
end.

Bom O problema esta na Function, essa codificaçao a cima é a que ele deu errado na prova que esta funcional e correta pelo menos ao meu ver, bom ele disse que na function a passagem de parametro tinha que ser assim

function "cal([B][U]empregado[i][/U][/B].salario:real):real;"
var
rec:real;
begin
rec:=salario*0.07;
cal:=salario-rec+30;
end;

e o compilador intende aquela passagem de parametro ali como duas variaveis eu teria que declarar o empregado como registro. assim.

function cal([U]empregado:reg[/U];salario:real):real;

bom mesmo jeito o programa acima que eu fiz esta funcional que realizando

a terefa que era pedida no exercicio

resumindo qeria saber se realmente eu estou completamente enganado ou ele nao tem a menor capacidade de me dar aula de programaçao!,

lembrando a eu só consegui usar empregado.salario no programa principal na hora de receber a function para ela rodar...

begin
clrscr;
entrada;
for i:= 1 to 100 do
begin
[B]salarioliq:=cal(empregado[i].salario);[/B]
writeln('O Salario liquido Do Funcionario ',empregado[i].cod{i},'e de ',salarioliq,'.');
end;

por favor me AJUDAAAAA

  • Membro VIP
Postado

Ola Meu Nome é Daniel Marcos,estou cursando o ensino médio tecnico de informatica, e meu professor apareceu com um problema simples que eu nao vi em lugar nenhum funcionando e ele deu errado na minha prova mesmo eu dizendo a ele que eu compilei o programa assim e nao funcionava, bom vou mostrar a condificaçao é bem simples!.

a) Uma Sub Rotina que receba os dados dos funcionarios;

B) Uma Sub Rotina que calculase 7% de desconto e 30 reais de bonificaçao

pra calcular o salario liquido.

ps*o salario inicial é o bruto


uses crt;
type reg=record
cod:integer;
setor:string[20];
salario:real;
end;
var
i:integer;
empregado:array[1..100] of reg;
salarioliq:real;


procedure entrada;
begin
for i:= 1 to 100 do
begin
writeln('Digite O Codigo Do Funcionario ',i,'.');
readln(empregado[i].cod);
writeln('Digite O Setor Do Funcionario ',empregado[i].cod,'.');
readln(empregado[i].setor);
writeln('Digite O Salario Do Funcionario ',empregado[i].cod,'.');
readln(empregado[i].salario);
end;
end;

[B][U]function cal(salario:real):real;
var
rec:real;
begin
rec:=salario*0.07;
cal:=salario-rec+30;
end;
[/U][/B]
begin
clrscr;
entrada;
for i:= 1 to 100 do
begin
salarioliq:=cal(empregado[i].salario);
writeln('O Salario liquido Do Funcionario ',empregado[i].cod{i},'e de ',salarioliq,'.');
end;
end.
program reg_sub;

Bom O problema esta na Function, essa codificaçao a cima é a que ele deu errado na prova que esta funcional e correta pelo menos ao meu ver, bom ele disse que na function a passagem de parametro tinha que ser assim


var
rec:real;
begin
rec:=salario*0.07;
cal:=salario-rec+30;
end;
function "cal([B][U]empregado[i][/U][/B].salario:real):real;"

e o compilador intende aquela passagem de parametro ali como duas variaveis eu teria que declarar o empregado como registro. assim.

function cal([U]empregado:reg[/U];salario:real):real;

bom mesmo jeito o programa acima que eu fiz esta funcional que realizando

a terefa que era pedida no exercicio

resumindo qeria saber se realmente eu estou completamente enganado ou ele nao tem a menor capacidade de me dar aula de programaçao!,

lembrando a eu só consegui usar empregado.salario no programa principal na hora de receber a function para ela rodar...


clrscr;
entrada;
for i:= 1 to 100 do
begin
[B]salarioliq:=cal(empregado[i].salario);[/B]
writeln('O Salario liquido Do Funcionario ',empregado[i].cod{i},'e de ',salarioliq,'.');
end;
begin

por favor me AJUDAAAAA

Olá Danielcpp,

Vamos aos pontos:

1) Você faz 100 cadastros a cada teste?

2 cadastros está bom demais... ^_^

2) Estrutura do programa

Pelo que foi passado por você seu programa está certo. Eu pelo menos poderia fazer assim também.

O que pode está errado é o parâmetro da "entrada", já que NÃO está passando parâmetro, e sim usando a variável global. Veja são duas situação semelhantes e com comportamento diferente: numa você usa a global, na outra passa o parâmetro. Ou faz logo as duas globais ou faz as duas passando, um ou outro não fica legal.

DICA:

Tente sempre colocar as variáveis globais logo acima do begin principal, assim os procedimentos NÃO vão enxergar essas variáveis, pois elas estarão antes delas... (no Pascal, o código só reconhece o que está acima dele) (antes que você pergunte: sim, pode declarar as variáveis assim)

No pascal o "programa" vai aprendendo "da esquerda para direita, de cima pra baixo"

ex:

program reg_sub;
uses crt;
type reg=record
cod:integer;
setor:string[20];
salario:real;
end;

procedure x;
begin

end;

procedure y;
begin

end;

[COLOR="Red"]var
i :integer;
empregado:array[1..100] of reg;
salarioliq:real;
BEGIN[/COLOR]

END.

Desta forma tudo que for global e os procedimentos precisarem, você vai ter que passar por parâmetro, e assim você evita usar acidentalmente um variável importante. No caso do "i", você teria que declarar localmente, em vez de passar por parâmetro... (tipo, esse "i" é do programa, o "i" dos procedimentos são outros... inclusive pode ter o mesmo nome)

OBS.: Lembre da diferença de usar "var" ou não. Com o "var" a passagem de parâmetro passa a ser por "referência", sem o "var" fica como "valor". (com o "var" é como usa a variável original, sem o "var" ele só copia o valor da original e deixa ela queta). Neste caso,

Uma forma seria também passar o registro (somente, já que o salário já está nele), mas nesse caso estaria passando informações desnecessárias. Logo só precisa do salário, e não de todos os dados do funcionário. (do jeito que está, está certo)

Outra coisa que poderia ser feita é passar TODO O VETOR e calcular TODOS OS SALÁRIOS de uma vez só, mas eu acharia melhor do jeito que tá.

RESUMINDO

-Na minha opinião a forma de calcular e a passagem de parâmetro do calc estão certos

- Você precisa passa os parâmetros do "entrada"

Abaixo seu código com algumas modificações... se quiser dar uma pescadinha.

OBS.:Não copie, use como consulta.


uses
crt; {carrega alguns comandos extras}

const
{max = 100;} {maximo de cadastros}
max = 2; {maximo de cadastros}

type
reg = record
cod :integer; {codigo do cliente}
setor :string[20]; {setor onde trabalha}
salario :real; {salario bruto}
end;
vet_reg = array[1..MAX] of reg; {"banco de dados"}


procedure entrada(var empregados:vet_reg);
{cadastro dos funcionarios}
var
i:integer; {usado no for}
begin
for i:= 1 to MAX do
begin
writeln('Digite O Codigo Do Funcionario ',i,'.');
readln(empregados[i].cod);
writeln('Digite O Setor Do Funcionario ',empregados[i].cod,'.');
readln(empregados[i].setor);
writeln('Digite O Salario Do Funcionario ',empregados[i].cod,'.');
readln(empregados[i].salario);
end;
end;

function cal(salario:real):real;
{calculo do salario liquido}
var
rec :real; {desconto sobre salario... (porque rec?? de recolhimento??)}
bonus:real; {valor do bonus}
begin
rec:=salario*0.07; {calculo do desconto de 7%}
bonus:=30; {bonus de 30 reais}
cal:=salario-rec+bonus; {salario liquido}
end;

{VARIAVEIS GLOBAIS}
var
i :integer;
empregados :vet_reg;
salarioLiq :real;


BEGIN
clrscr;
entrada(empregados);
for i:= 1 to 2 do
begin
salarioliq:=cal(empregados[i].salario);
(*
writeln('O Salario liquido do Funcionario ',empregados[i].cod{i},'e de ',
salarioliq,'.');}

//Para imprimir números reais é possível usar uma formatação com casas decimais
//em vez de notação científica. Usando :x:y depois da variável. onde x é as
//casas reservadas a esquerda e y as cadas decimais.
*)
writeln('O Salario liquido Do Funcionario ',empregados[i].cod,'e de '
,salarioliq:0:2,'.');
end;
readkey; {da um pause antes de fechar}
END.
program reg_sub;

ou ainda modularizando mais ainda


uses
crt; {carrega alguns comandos extras}

const
{max = 100;} {maximo de cadastros}
max = 2; {maximo de cadastros}

type
reg = record
cod :integer; {codigo do cliente}
setor :string[20]; {setor onde trabalha}
salario :real; {salario bruto}
end;
vet_reg = array[1..MAX] of reg; {"banco de dados"}


procedure entrada(var empregados:vet_reg);
{cadastro dos funcionarios}
var
i:integer; {usado no for}
begin
for i:= 1 to MAX do
begin
writeln('Digite O Codigo Do Funcionario ',i,'.');
readln(empregados[i].cod);
writeln('Digite O Setor Do Funcionario ',empregados[i].cod,'.');
readln(empregados[i].setor);
writeln('Digite O Salario Do Funcionario ',empregados[i].cod,'.');
readln(empregados[i].salario);
end;
end;



procedure processamento(var empregados:vet_reg);
{processa e os salarios brutos dos funcionarios}
function cal(salario:real):real; {# procedimento local #}
{calculo do salario liquido}
var
rec :real; {desconto sobre salario... (porque rec?? de recolhimento??)}
bonus:real; {valor do bonus}
begin
rec:=salario*0.07; {calculo do desconto de 7%}
bonus:=30; {bonus de 30 reais}
cal:=salario-rec+bonus; {salario liquido}
end;

var
i :integer;
salarioLiq :real;
begin
for i:= 1 to 2 do
begin
salarioliq:=cal(empregados[i].salario);
(*
writeln('O Salario liquido do Funcionario ',empregados[i].cod{i},'e de ',
salarioliq,'.');}

//Para imprimir números reais é possível usar uma formatação com casas
//decimais em vez de notação científica. Usando :x:y depois da variável.
//onde x é as casas reservadas a esquerda e y as cadas decimais.
*)
writeln('O Salario liquido Do Funcionario ',empregados[i].cod,'e de '
,salarioliq:0:2,'.');
end;
end;

{VARIAVEIS GLOBAIS}
var
empregados :vet_reg;
BEGIN
clrscr;
entrada(empregados);
processamento(empregados);
readkey; {da um pause antes de fechar}
END.
program reg_sub;

Qualquer coisa é só postar

Abraços

Postado

valeu Pela AJuda mais a grande questao é a function

na hora que ele corregiu minha prova, a minha function estava assim

[COLOR="Red"]function cal(salario:real)[/COLOR]:real;
var
rec:real;
begin
rec:=salario*0.07;
cal:=salario-rec+30;
end;

ele falou que estava errado pois eu teria que que colocar empregado.salario assim

function cal([COLOR="Red"]empregado[i].[/COLOR]salario:real):real;
var
rec:real;
begin
rec:=salario*0.07;
cal:=salario-rec+30;
end;

EU disse a ele que o pascal nao iria reconhecer o "i" e iria pra declarar o parametro empregados como se fosse outra variavel qualquer , e como sempre disse que era o dono da verdade e que meu compilador estava maluco... me deixando sem chances de argumentar com ele. isso é o que mais me deixa indignado!!!

  • Membro VIP
Postado

valeu Pela AJuda mais a grande questao é a function

na hora que ele corregiu minha prova, a minha function estava assim


var
rec:real;
begin
rec:=salario*0.07;
cal:=salario-rec+30;
end;
[COLOR="Red"]function cal(salario:real)[/COLOR]:real;

ele falou que estava errado pois eu teria que que colocar empregado.salario assim


var
rec:real;
begin
rec:=salario*0.07;
cal:=salario-rec+30;
end;
function cal([COLOR="Red"]empregado[i].[/COLOR]salario:real):real;

EU disse a ele que o pascal nao iria reconhecer o "i" e iria pra declarar o parametro empregados como se fosse outra variavel qualquer , e como sempre disse que era o dono da verdade e que meu compilador estava maluco... me deixando sem chances de argumentar com ele. isso é o que mais me deixa indignado!!!

Olá Danielcpp,

OK. Ignore tudo que disse antes, vou ser mais claro.

O seu está certo :lol: e o dele não faz o menor sentido :wacko:.

Converse com seus colegas de curso sobre o algoritmo e com ele (pacificamente). Peça para ele justificar ou demonstre-o que ele se equivocou (ou aprendeu errado sei lá), apesar que acredito que no mínimo ele já pesquisou e viu que foi infeliz na correção...

Abraços

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...