Cassic

Estrutura de Dados Homogêneos

Autor: Tadeu Pereira


  Quando se deseja criar uma quantidade grande de variáveis de um mesmo tipo e com função semelhante torna-se muito difícil cria e controla todas como mostrado abaixo:

  var
   nome1, nome2, nome3, ..., nome100: string;

  Para evitar-se esse tipo de transtorno podemos usar a criação de um agrupamento de variáveis de um mesmo tipo, essa estrutura de dados recebe diversos nomes:

  - Variáveis indexadas
  - Variáveis compostas
  - Variáveis subscritas
  - Arranjos
  - Vetores
  - Matrizes
  - Tabela em memória
  - etc

  Sintaxe:
  Nome_Matriz: array [quantidade de ocorrências] of Tipo;

  var
   nome: array [1..100] of string;

Matriz de uma Dimensão

  As matrizes de uma dimensão, também conhecida como matriz unidimensional, guarda cada valor desejado em uma linha (uma coluna e várias linhas).

Nº Aluno – Índice
Média – Tipo Real
1
4,5
2
6,5
3
7,0
4
7,5
5
5,0
6
9,5
7
8,0
8
3,5
9
7,5
10
8,5
Média da Turma
6,75
Tabela 1 – Exemplo de matriz de uma dimensão

  Em um novo projeto coloque um BitBtn e configure conforme indicado:

Formulário
Propriedade
Valor
Height
133
Width
225
BitBtn
Propriedade
Valor
Kind
bkOK
Left
71
Name
BtnOk
Top
37

Figura 1 – Projeto Matriz

Entre com código a seguir no evento OnClick do BitBtn, após compile e teste o programa utilizando a tabela 1:

01
procedure TForm1.BtnOkClick(Sender: TObject);
02
var
03
  Media: array [1..10] of Real;
04
  Soma, MdFinal: Real;
05
  Contador: Integer;
06
  MdEntrada: string;
07
begin
08
  for Contador := 1 to 10 do
09
   begin
10
   MdEntrada := '';
11
   InputQuery('Média geral', 'Informe a média do aluno ' +
12
    IntToStr( Contador ), MdEntrada );
13
   Media[ Contador ] := StrToFloat( MdEntrada );
14
   end;
15
  Soma := 0;
16
  for Contador := 1 to 10 do Soma := Soma + Media[ Contador ];
17
  MdFinal := Soma / 10;
18
  MessageDlg('A média geral da turma é ' +
19
   FloatToStr( MdFinal ), mtInformation, [mbOk], 0);
20
end;

  A declaração da matriz é feita na linha 03, a matriz Media é do tipo real e tem tamanho 10, a entrada de valor nessa matriz é feito dentro do looping que inicia na linha 08 e termina na linha 14.

  Na linha 11 temos a função InputQuery, essa função abre uma caixa de diálogo onde o titulo é o primeiro parâmetro(Média geral), essa caixa de diálogo também tem um rotulo com uma informação(Informe a média do aluno n) acima de uma caixa de texto que recebe o valor de uma variável(MdEntrada) e retorna o valor digitado pelo usuário na mesma variável.

  A linha 16 totaliza as médias digitadas pelo usuário para calcular a média geral na linha 17.

  Por fim a linha 18 mostra a média geral através da função MessageDlg, essa função é uma caixa de diálogo onde a string "A média geral da turma é x" é a mensagem da caixa de diálogo, mtInformation é o tipo e ícone que será mostrado na caixa de dialogo, mbOk o botão que será utilizado e o ultimo parâmetro é a página do help(zero) que seria chamada caso tivesse sido informado mbHelp no terceiro parâmetro.

Matriz com mais de uma Dimensão

  Uma matriz de duas dimensões estará sempre fazendo menção a colunas e linhas (várias colunas e várias linhas).

Nº Aluno
Índice
Nota 01
Tipo Real
Nota 02
Tipo Real
Nota 03
Tipo Real
Nota 04
Tipo Real
Média
Tipo Real
1
3,5
5,0
7,5
2,0
4,5
2
7,5
8,0
3,0
7,5
6,5
3
7,0
6,5
7,5
7,0
7,0
4
5,5
7,0
8,0
9,5
7,5
5
7,0
5,0
4,5
3,5
5,0
6
9,5
9,0
10
9,5
9,5
7
7,0
8,0
9,0
8,0
8,0
8
2,5
2,5
1,0
8,0
3,5
9
7,5
9,0
6,5
7,0
7,5
10
8,0
9,0
7,5
9,5
8,5
Média da Turma
6,75
Tabela 2 – Exemplo de matriz com mais de uma dimensão

  Utilizando o projeto anterior, altere apenas o código existente no evento OnClick do componente BitBtn, após compile e teste o programa utilizando a tabela 2:

01
procedure TForm1.BtnOkClick(Sender: TObject);
02
var
03
  Media: array [1..10,1..5] of Real;
04
  Soma, MdFinal: Real;
05
  Linha, Coluna: Integer;
06
  MediaAluno, Nota: string;
07
begin
08
  for Linha := 1 to 10 do
09
   begin
10
   for Coluna := 1 to 4 do
11
    begin
12
     Nota := '';
13
     InputQuery('Média geral', 'Informe a ' +
14
      IntToStr( Coluna ) + 'ª nota do aluno ' +
15
       IntToStr( Linha ), Nota );
16
     Media[ Linha, Coluna ] := StrToFloat( Nota );
17
     end;
18
   Media[ Linha, 5 ] := 0;
19
   end;
20
  for Linha := 1 to 10 do
21
   begin
22
   for Coluna := 1 to 4 do
23
    begin
24
     Media[ Linha, 5 ] :=  Media[ Linha, 5 ] +
25
      Media[ Linha, Coluna ];
26
     end;
27
   Media[ Linha, 5 ] :=  Media[ Linha, 5 ] / 4;
28
   end;
29
  Soma := 0;
30
  MediaAluno := '';
31
  for Linha := 1 to 10 do
32
   begin
33
   Soma := Soma + Media[ Linha, 5 ];
34
   MediaAluno := MediaAluno + 'Média do Aluno ' +
35
    IntToStr( Linha ) + ' : ' +
36
     FloatToStr( Media[ Linha, 5 ] ) +#13;
37
   end;
38
  MdFinal := Soma / 10;
39
  MessageDlg( MediaAluno +#13+
40
   'A média geral da turma é ' +
42
   FloatToStr( MdFinal ), mtInformation, [mbOk], 0);
43
end;

  Na linha 03 é feita a declaração da matriz que nesse caso tem duas dimensões e apelidaremos de linha e coluna respectivamente, a entrada dos valores propostos na tabela 2 é feito nas linhas 08 à 19 onde temos dois loopings aninhados, o primeiro passar por todas as linhas, já o segundo looping passará pelas quatro primeiras colunas que serão responsáveis por guardar as notas do aluno.

  Os loopings aninhados farão com que a matriz seja completada uma linha por vez até a quinta coluna, ou seja, quando o looping externo estiver na linha 1 o looping interno tratará de preencher as colunas 1, 2, 3 e 4 com os dados digitado pelo usuário e iguala a 5ª coluna a zero, em seguida vai a linha 2 e preenche as colunas 1, 2, 3 e 4 com os dados digitado pelo usuário e iguala a 5ª coluna a zero, repetindo esse processo em todas as 10 linhas da matriz.

  Nas linhas 20 à 28 semelhante as linhas 08 à 19 temos dois loopings aninhados, mas nesse caso eles são responsáveis por calcular a media e colocar o resultado na quinta coluna da matriz.

  O looping iniciado na linha 31 tem a função de fazer a soma de todas as médias e colocar na variável Soma ao mesmo tempo em que a variável MediaAluno acumula o número da linha e a média da mesma sempre entrando com uma quebra de linha no final da atribuição a cada iteração.

  Por fim a linha 39 mostra a média de cada linha(aluno) assim como a média final(geral da turma).