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>
Implementando o algoritmo em Delphi:
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.
Muito bom este post...como sempre o estaçãoZN arrebenta!!
ResponderExcluirShow!!
Estudar sempre!!!