sábado, 15 de março de 2008

Algoritmo III – Um passo além da teoria

Prosseguindo com a série sobre Introdução a Programação, especificamente ao tema Algoritmos, vamos dar mais um passo no sentido de aprofundarmos mais nesse assunto.


Usando estrutura de decisão:

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.


Programa MEDIA_FINAL;
Constantes
MediaAprovacaoZN = 6;
Variaveis
NOTA1Zn, NOTA2Zn, NOTA3Zn, NOTA4Zn, MEDIAZn: REAL;
NOMEZn : CARACTERE [35]
INICIO
LER (NOMEZn);
LER (NOTA1Zn, NOTA2Zn, NOTA3Zn, NOTA4Zn);
MEDIAZn := (NOTA1Zn + NOTA2Zn + NOTA3Zn + NOTA4Zn) / 4;
SE MEDIAZn (>= 6) ENTÃO
ESCREVER (‘APROVADO’)
SENÃO
ESCREVER (‘REPROVADO’);

ESCREVER (NOMEZn, MEDIAZn)
FIM.


Desvio condicional aninhado:

Usados para tomadas de decisões para mais de 2 opções.

Exemplo:

SE <<CONDIÇÃO>> ENTÃO
inicio
<<COMANDO 1>>;
<<COMANDO 2>>;
.
.
<<COMANDO N>>;
fim
SENÃO SE <<CONDIÇÃO>> ENTÃO
inicio
<<COMANDO 1>>;
<<COMANDO 2>>;
.
.
<<COMANDO N>>;
fim
SENÃO
início
<<COMANDO 1>>;
<<COMANDO 2>>;
.
.
<<COMANDO N>>;

fim;


Implementação em PL/SQL:


create or replace procedure CalculaMedia(
Nota1 in out NUMBER,
Nota2 in NUMBER,
Nota3 in NUMBER,
Nota4 in NUMBER,
ValorAprovacao IN NUMBER,
Media out NUMBER,
ResultadoAprovacao OUT Varchar2) is
begin
Media := (Nota1 + Nota2 + Nota3 + Nota4)/ 4;
IF (Media >= ValorAprovacao) THEN
ResultadoAprovacao := 'Aprovado';
ELSE
ResultadoAprovacao := 'Reprovado';
END IF;
end CalculaMedia;


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




Implementação em Javascript:


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title> Estação ZN - Algoritmos III </title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<script type= "text/javascript">
var ZnNota1 = 0;
var ZnNota2 = 0;
var ZnNota3 = 0;
var ZnNota4 = 0;
var ZnMediaAprovacao = 6;
var Aprovacao, MediaCalculadaZn;

// Input de Dados
// Lendo o valor da primeira nota
ZnNota1 = window.prompt( "Digite a primeira Nota:", "0" );
// Lendo o valor da segunda nota
ZnNota2 = window.prompt( "Digite a Segunda Nota:", "0" );
//Lendo o valor da 3° nota
ZnNota3 = window.prompt( "Digite a Terceira Nota:", "0" );
//Lendo o valor da 4° nota
ZnNota4 = window.prompt( "Digite a Quarta Nota:", "0" );

<!-- Processamento - Calculando a Média | convertendo os valore para numérico -->
MediaCalculadaZn = (parseInt(ZnNota1) + parseInt(ZnNota2) +
parseInt(ZnNota3) + parseInt(ZnNota4)) / 4;
//MediaCalculadaZn = (ZnNota1 + ZnNota2 + ZnNota3 + ZnNota4) / 4;

alert("Calculo media = " + MediaCalculadaZn);

<!-- Verificando Aprovação do Aluno -->
if (MediaCalculadaZn >= ZnMediaAprovacao) {
Aprovacao = "Parabéns, aluno Aprovado!!!!!"}
else { Aprovacao = "Lamento, aluno Reprovado."};

alert(" Verificando Aprovação do Aluno = " + Aprovacao);
// Saída - Exibindo o resultado formatado numa tabela
document.writeln( "<h1> <center>Estação ZN - Resultado </center></h1>" );
document.writeln("<table border=2>" );
document.writeln("<table border =1 width =100%>" );
document.writeln( "<tr><td> Nota na 1° prova = " + ZnNota1 + "</td></tr>" );
document.writeln( "<td> Nota na 2° prova = " + ZnNota2 + "</td></tr>" );
document.writeln( "<td> Nota na 3° prova = " + ZnNota3 + "</td></tr>" );
document.writeln( "<td> Nota na 4° prova = " + ZnNota4 + "</td></tr>" );
document.writeln( "<tr><td> Média = " + MediaCalculadaZn + "</td></tr>" );
document.writeln( "<tr bgcolor=#000066> <td> <font face=Courier New, Courier, mono color=#FFFFFF> Resultado : " + Aprovacao + "</font> </td></tr>" );
document.writeln( "</table>" );

</script>
</head>
<body>

</body>
</html>




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.

Um comentário:

  1. Muito bom este post...como sempre o estaçãoZN arrebenta!!
    Show!!
    Estudar sempre!!!

    ResponderExcluir

 
BlogBlogs.Com.Br