Segue um Algoritmo que lê o nome e as 4 notas bimestrais de um aluno. Em seguida o Algoritmo calcula e escreve a média obtida pelo aluno escrevendo também se o aluno foi aprovado ou reprovado.
Usados para tomadas de decisões para mais de 2 opções.
PL/SQL é a linguagem de programação do Oracle. Para debuggar no Developer, no object browser, selecione a procedure criada, “CalculaMedia”, com o botão direito do mouse sobre ela selecione “Add debugger information”, em seguida, ainda no mesmo menu popup, selecione “Test”. Passe valores para os argumentos (parâmetros) e pressione F9, para ir para o próximo comando pressione “ctrl + n”.
Inicie uma nova aplicação. Na seção implementation da página de código digite conforme ilustrado abaixo:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
procedure FormPaint(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm;
ZnNota1, ZnNota2, ZnNota3, ZnNota4, ZnMedia: Double;
ResultadoAprovacaoZN: string;
implementation
{$R *.dfm}
const
ValorAprovacao = 6;
procedure CalculaMediaZN;
const
Aprovado = 'Parabéns!!! Aluno Aprovado.';
Reprovado = 'Lamento!!! Aluno Reprovado. Vai estudar e RAFM.';
begin
(* Entrada de dados - Input*)
{Preciso converter o valor retornado pela função "InputBox" de string para float}
ZnNota1 := StrToFloat(InputBox('Estação Zn | Algoritmo III',
'Digite a 1° Nota do Aluno:', '0'));
ZnNota2 := StrToFloat(InputBox('Estação Zn | Algoritmo III',
'Digite a 2° Nota do Aluno:', '0'));
ZnNota3 := StrToFloat(InputBox('Estação Zn | Algoritmo III',
'Digite a 3° Nota do Aluno:', '0'));
ZnNota4 := StrToFloat(InputBox('Estação Zn | Algoritmo III',
'Digite a 4° Nota do Aluno:', '0'));
ZnMedia := (ZnNota1 + ZnNota2 + ZnNota3 + ZnNota4) / 4;
(* Processamento *)
if (ZnMedia >= unit1.ValorAprovacao) then
ResultadoAprovacaoZN := Aprovado
else
ResultadoAprovacaoZN := Reprovado;
end;
procedure TForm1.FormPaint(Sender: TObject);
begin
(* Sída de dados - Outpu*)
Form1.Canvas.TextOut(12, 12, Format('1° Nota: %f', [ZnNota1]));
Form1.Canvas.TextOut(12, 32, Format('2° Nota: %f', [ZnNota2]));
Form1.Canvas.TextOut(12, 52, Format('3° Nota: %f', [ZnNota3]));
Form1.Canvas.TextOut(12, 72, Format('4° Nota: %f', [ZnNota4]));
Form1.Canvas.TextOut(12, 92, Format('Média: %f', [ZnMedia]));
Form1.Canvas.TextOut(12, 102, '*******************************');
Form1.Canvas.TextOut(12, 132, Format('Resultado: %s', [ResultadoAprovacaoZN]));
end;
initialization
CalculaMediaZN;
end.
No exemplo acima, note que implementei de uma forma completamente diferente de outros programas que construímos no Estação Zn. Meu principal objetivo, além de mostrar como o algoritmo pode ser implementado, foi fazer com que uma pessoa iniciante no Delphi possa perceber alguns detalhes difíceis de explicar e de fazer entender. Vamos agora chamar a tenção para a relação entre o que é declarado na unit, de uma forma independente, e a unit como um todo. Por exemplo, existe uma tendência das pessoas interpretarem que a unit inteira é uma área de definição exclusiva ao form1. Isso não é verdade, o form é somente mais uma declaração dentre outras declarações possíveis numa unit. Observe, o form1 não conhece a procedure “CalculaMediaZN”. Tente fazer um teste, no evento “FormPaint” experimente chamar a execução dela. Veja o exemplo abaixo, a segunda linha da procedure “FormPaint”,você acha que vai compilar?
procedure CalculaMediaZN;
const
Aprovado = 'Parabéns!!! Aluno Aprovado.';
Reprovado = 'Lamento!!! Aluno Reprovado. Vai estudar e RAFM.';
begin
(* Entrada de dados - Input*)
{Preciso converter o valor retornado pela função "InputBox" de string para float}
ZnNota1 := StrToFloat(InputBox('Estação Zn | Algoritmo III',
'Digite a 1° Nota do Aluno:', '0'));
ZnNota2 := StrToFloat(InputBox('Estação Zn | Algoritmo III',
'Digite a 2° Nota do Aluno:', '0'));
ZnNota3 := StrToFloat(InputBox('Estação Zn | Algoritmo III',
'Digite a 3° Nota do Aluno:', '0'));
ZnNota4 := StrToFloat(InputBox('Estação Zn | Algoritmo III',
'Digite a 4° Nota do Aluno:', '0'));
ZnMedia := (ZnNota1 + ZnNota2 + ZnNota3 + ZnNota4) / 4;
(* Processamento *)
if (ZnMedia >= unit1.ValorAprovacao) then
ResultadoAprovacaoZN := Aprovado
else
ResultadoAprovacaoZN := Reprovado;
end;
procedure TForm1.FormPaint(Sender: TObject);
begin
CalculaMediaZN;
(* Sída de dados - Outpu*)
Form1.Canvas.TextOut(12, 12, Format('1° Nota: %f', [ZnNota1]));
Form1.Canvas.TextOut(12, 32, Format('2° Nota: %f', [ZnNota2]));
Form1.Canvas.TextOut(12, 52, Format('3° Nota: %f', [ZnNota3]));
Form1.Canvas.TextOut(12, 72, Format('4° Nota: %f', [ZnNota4]));
Form1.Canvas.TextOut(12, 92, Format('Média: %f', [ZnMedia]));
Form1.Canvas.TextOut(12, 102, '*******************************');
Form1.Canvas.TextOut(12, 132, Format('Resultado: %s', [ResultadoAprovacaoZN]));
end;
Você esta correto se respondeu sim. Mas, isso não prova que o que acabei de afirmar está errado. Só está compilando porque a “CalculaMediaZN” está declarada primeiro que o evento “FormPaint” na unit. Logo, basta você inverter a ordem dos procedimentos para perceber que o form1 não conhece a procedure que está declarada separadamente na unit. Tente compilar novamente para receber a mensagem “Undeclared identifier: ‘CalculaMediaZN’”. Exemplo:
procedure TForm1.FormPaint(Sender: TObject);
begin
CalculaMediaZN;
(* Sída de dados - Outpu*)
Form1.Canvas.TextOut(12, 12, Format('1° Nota: %f', [ZnNota1]));
Form1.Canvas.TextOut(12, 32, Format('2° Nota: %f', [ZnNota2]));
Form1.Canvas.TextOut(12, 52, Format('3° Nota: %f', [ZnNota3]));
Form1.Canvas.TextOut(12, 72, Format('4° Nota: %f', [ZnNota4]));
Form1.Canvas.TextOut(12, 92, Format('Média: %f', [ZnMedia]));
Form1.Canvas.TextOut(12, 102, '*******************************');
Form1.Canvas.TextOut(12, 132, Format('Resultado: %s', [ResultadoAprovacaoZN]));
end;
procedure CalculaMediaZN;
const
Aprovado = 'Parabéns!!! Aluno Aprovado.';
Reprovado = 'Lamento!!! Aluno Reprovado. Vai estudar e RAFM.';
begin
(* Entrada de dados - Input*)
{Preciso converter o valor retornado pela função "InputBox" de string para float}
ZnNota1 := StrToFloat(InputBox('Estação Zn | Algoritmo III',
'Digite a 1° Nota do Aluno:', '0'));
ZnNota2 := StrToFloat(InputBox('Estação Zn | Algoritmo III',
.
.
.
Mesmo que você referencie a “unit1” ao chamar a procedure que calcula a média não adiantará, visto que o ela não está declarada na seção “interface”.
procedure TForm1.FormPaint(Sender: TObject);
begin
unit1.CalculaMediaZN;// Ainda assim não vai compilar
.
.
Estou forçando uma barra somente para ilustrar o que estou tentando explicar, mas não faz o menor sentido chamar a procedure “CalculaMediaZN” novamente. Finalizando argumentação, para a provar de uma vez por todas, declare na seção “interface”, em qualquer lugar antes da palavra reservada “implementation”, desde que não seja dentro do escopo da seção “type” onde a classe TForm1 esta declarada, codifique conforme exemplificado abaixo:
type
TForm1 = class(TForm)
procedure FormPaint(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
(* Ao ter declarado o cabeçalho deste procedimento na interface ele passou
a estar visível não só para toda unit, mas também para outras que a referenciarem.*)
procedure DesenhaPoligono;
var
Form1: TForm;
.
.
Agora, codifique o corpo do porcedimento “DesenhaPoligono” na seção “implementation”.
procedure DesenhaPoligono;
var
X, Y, DX, DY: Integer;
begin
Randomize;
X := Random(Form1.Width - 10);
Y := Random(Form1.Height - 250);
Randomize;
Form1.Canvas.Pen.Color := Random(65535);
Form1.Canvas.Pen.Width := Random(7);
DX := Random(400);
DY := Random(400);
Form1.Canvas.RoundRect(X, Y, X + DX, Y + DY, DX div 2, DY div 2);
end;
Bem, agora o Form1 ainda não conhece esse novo procedimento, contudo neste momento se você fizer referência a unit1 ele estará visível ao Form1. O compilador, desta forma, não irá reclamar. Segue o código completo da unit1 com as últimas alterações:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
procedure FormPaint(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
(* Ao ter declarado o cabeçalho deste procedimento na interface ele passou
a estar visível não só para toda unit, mas também para outras que a referenciarem.*)
procedure DesenhaPoligono;
var
Form1: TForm;
.
.
Agora, codifique o corpo do porcedimento “DesenhaPoligono” na seção “implementation”.
procedure DesenhaPoligono;
var
X, Y, DX, DY: Integer;
begin
Randomize;
X := Random(Form1.Width - 10);
Y := Random(Form1.Height - 250);
Randomize;
Form1.Canvas.Pen.Color := Random(65535);
Form1.Canvas.Pen.Width := Random(7);
DX := Random(400);
DY := Random(400);
Form1.Canvas.RoundRect(X, Y, X + DX, Y + DY, DX div 2, DY div 2);
end;
Prosseguindo, o Form1 ainda não conhece esse novo procedimento, contudo neste momento se você fizer referência a unit1 ele estará visível ao Form1. O compilador, desta forma, não irá reclamar. Segue o código completo da unit1 com as últimas alterações:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
procedure FormPaint(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
(* Ao ter declarado o cabeçalho deste procedimento na interface ele passou
a estar visível não só para toda unit, mas também para outras que a referenciarem.*)
procedure DesenhaPoligono;
var
Form1: TForm;
ZnNota1, ZnNota2, ZnNota3, ZnNota4, ZnMedia: Double;
ResultadoAprovacaoZN: string;
implementation
{$R *.dfm}
const
ValorAprovacao = 6;
procedure TForm1.FormPaint(Sender: TObject);
begin
unit1.DesenhaPoligono;
(* Sída de dados - Outpu*)
Form1.Canvas.TextOut(12, 12, Format('1° Nota: %f', [ZnNota1]));
Form1.Canvas.TextOut(12, 32, Format('2° Nota: %f', [ZnNota2]));
Form1.Canvas.TextOut(12, 52, Format('3° Nota: %f', [ZnNota3]));
Form1.Canvas.TextOut(12, 72, Format('4° Nota: %f', [ZnNota4]));
Form1.Canvas.TextOut(12, 92, Format('Média: %f', [ZnMedia]));
Form1.Canvas.TextOut(12, 112, '*******************************');
Form1.Canvas.TextOut(12, 132, Format('Resultado: %s', [ResultadoAprovacaoZN]));
end;
procedure CalculaMediaZN;
const
Aprovado = 'Parabéns!!! Aluno Aprovado.';
Reprovado = 'Lamento!!! Aluno Reprovado. Vai estudar e RAFM.';
begin
(* Entrada de dados - Input*)
{Preciso converter o valor retornado pela função "InputBox" de string para float}
ZnNota1 := StrToFloat(InputBox('Estação Zn | Algoritmo III',
'Digite a 1° Nota do Aluno:', '0'));
ZnNota2 := StrToFloat(InputBox('Estação Zn | Algoritmo III',
'Digite a 2° Nota do Aluno:', '0'));
ZnNota3 := StrToFloat(InputBox('Estação Zn | Algoritmo III',
'Digite a 3° Nota do Aluno:', '0'));
ZnNota4 := StrToFloat(InputBox('Estação Zn | Algoritmo III',
'Digite a 4° Nota do Aluno:', '0'));
ZnMedia := (ZnNota1 + ZnNota2 + ZnNota3 + ZnNota4) / 4;
(* Processamento *)
if (ZnMedia >= unit1.ValorAprovacao) then
ResultadoAprovacaoZN := Aprovado
else
ResultadoAprovacaoZN := Reprovado;
end;
procedure DesenhaPoligono;
var
X, Y, DX, DY: Integer;
begin
Randomize;
X := Random(Form1.Width - 10);
Y := Random(Form1.Height - 250);
Randomize;
Form1.Canvas.Pen.Color := Random(65535);
Form1.Canvas.Pen.Width := Random(7);
DX := Random(400);
DY := Random(400);
Form1.Canvas.RoundRect(X, Y, X + DX, Y + DY, DX div 2, DY div 2);
end;
initialization
CalculaMediaZN;
end.
Execute o programa e teste.