{ TIPOS DE DADOS } Const FILA_TAM = 10; Type TFila_Dado = Integer; TFila = Record Dado: Array [1..FILA_TAM] of TFila_Dado; Inicio, Fim: Integer; Qtde: Integer; End; { ROTINAS } Procedure Fila_Inicializa (Var F: TFila); Begin F.Inicio := 1; F.Fim := 0; F.Qtde := 0; End; Function Fila_Insere (Var F: TFila; Dado: TFila_Dado): Boolean; Begin IF F.Qtde = FILA_TAM THEN Fila_Insere := False ELSE Begin F.Fim := (F.Fim MOD FILA_TAM) + 1; { Faz índice circular } F.Dado [F.Fim] := Dado; F.Qtde := F.Qtde + 1; Fila_Insere := True; End; { Sobre o indice circular: F.Fim := (F.Fim MOD FILA_TAM ) + 1; poderia ser reescrito assim... que teria o mesmo resultado IF F.Fim = FILA_TAM THEN F.Fim := 1 ELSE F.Fim := F.Fim +1 } End; Function Fila_Retira (Var F: TFila; Var Dado: TFila_Dado): Boolean; Begin IF F.Qtde = 0 THEN Fila_Retira := False ELSE Begin Dado := F.Dado [ F.Inicio ]; F.Inicio := ( F.Inicio MOD FILA_TAM ) + 1; F.Qtde := F.Qtde - 1; Fila_Retira := True; End; End; Procedure Fila_Exibe (F: TFila); Var cont, i: Integer; Begin i := F.Inicio; FOR cont := 1 to F.Qtde DO Begin Writeln ( F.Dado [i] ); i := ( i MOD FILA_TAM ) + 1 End; End; Procedure Fila_Esvazia (F: TFila); Var Dado: TFila_Dado; Begin WHILE Fila_Retira(F,Dado) DO ; End; (* Rotinas complementares... Function Fila_Vazia (F: TFila): Boolean; { Testa para ver se a fila está vazia } Function Fila_Quantidade (F: TFila): Integer; { Indica quantos dados tem na fila } Procedure Fila_Inverte (Var F: TFila); { Inverte a ordem dos dados da fila } Procedure Fila_Grava (Var ArqTxt: Text; F: TFila); { Salva em disco os dados } Function Fila_Le (Var ArqTxt: Text; Var F:TFila); { Le do disco os dados } *)