sexta-feira, 31 de agosto de 2012

Resposta da Questão 3 FILA B - LTP1 2º TRIM 2012


{ Crie um algoritmo que preencha um vetor de 10 posicoes de elementos inteiros.
   Calcule e mostre:

   a) os elementos pares;
   b) a soma dos elementos de indice impar;
   c) a media dos elementos;
   d) a quantidade de elementos iguais a 30;
   e) a quantidade de elementos maiores que a media
   f) os elementos do vetor ordenado (crescente)
   g) uma pesquisa sequencial de um elemento da lista, iniciando a posicao onde se encontra.                    }


program vetor_10_posicoes;

uses crt;

var
   x                              : array[1..10] of integer;
   i,j,aux,elem_par,soma_eleind_impar,quant_30,quant_elem_mmedia,num_pesq    : integer;
   soma,media_elementos                          : real;
   resp                                                                         : char;
   achou                                                                        : boolean;
begin
   soma:=0;
   clrscr;
   {**** CADASTRAMENTO DOS ELEMENTOS DE UM VETOR DE 10 POSICOES ****}
   writeln ('Cadastramento dos elementos em um vetor de 10 elementos: ');
   writeln;
   write ('Digite os elementos deste vetor: ');
   for i:= 1 to 10 do
    begin
      write (' '); readln (x[i]);
  soma:= soma + x[i]; {esta variável sera utilizada para calcular a media dos elementos da tabele (item c) }
    end;
   {**** c) a media dos elementos; ****}
   media_elementos:=soma/10;

   clrscr;
   {**** LISTAGEM DOS ELEMENTOS DE UM VETOR DE 10 POSICOES ****}
   writeln ('Elementos em um vetor de 10 elementos: ');
   writeln;
   writeln ('Elementos deste vetor: ');
   for i:= 1 to 10 do
    write (' ',x[i]);

   {**** Solucao dos itens de "a" ate a letra "g" ****}
   elem_par:= 0;
   soma_eleind_impar:=0;
   quant_30:= 0;
   quant_elem_mmedia:=0;
   for i:= 1 to 10 do
    begin
       {**** a) os elementos pares; ****}
     if (x[i] mod 2 = 0) then
    elem_par:= elem_par + 1;
       {**** b) a soma dos elementos de indice impar; ****}
       if (i mod 2 <> 0) then
    soma_eleind_impar:=soma_eleind_impar + x[i];
 {**** d) a quantidade de elementos iguais a 30; ****}
       if x[i] = 30 then
          quant_30:= quant_30 + 1;
 {**** e) a quantidade de elementos maiores que a media ****}
       if x[i] > media_elementos then
   quant_elem_mmedia:= quant_elem_mmedia + 1;
end;
   writeln;
   writeln;
   {**** Apresentacao do resultado obtido nas questoes : "a,b,d,e" ****}
   writeln ('a) os elementos pares                    : ',elem_par);
   writeln ('b) a soma dos elementos de indice impar  : ',soma_eleind_impar);
   writeln ('c) a media dos elementos                 : ',media_elementos);
   writeln ('d) a quantidade de elementos iguais a 30 : ',quant_30);
   writeln ('e) a quantidade de elementos maiores que a media: ',quant_elem_mmedia);
   writeln;
   writeln;
   {**** f) os elementos do vetor ordenado (crescente) ****}
 
   {**** rotina de troca dos elementos ****}
   for i:= 1 to 9 do
     for j:= i+1 to 10 do
       begin
          if x[i] > x[j] then
            begin
               aux:=x[i];
               x[i]:=x[j];
               x[j]:=aux;
            end;
       end;
   writeln;
   writeln;
   {*** rotina para listar os elementos da matriz ordenado (crescente) ****}
   writeln ('Listagem dos elementos ordenados (crescente): ');
   write ('Elementos: ');
   for i:= 1 to 10 do
    write (' ',x[i],' ');

   {*** g) uma pesquisa sequencial de um elemento da lista, iniciando a posicao onde se encontra. ***}

   resp:= 'S';
   while (resp = 'S') or (resp = 's') do
      begin
         {*** ROTINA DE PESQUISA ***}
         writeln;
         write ('Entre com o numero a ser pesquisado: '); readln (num_pesq);
         i:=1;
         achou:= false;
         while (i<=10) and (achou = false) do
           begin
              if (num_pesq = x[i]) then
                 achou := true
              else
                 i:= i+1;
              if (achou = true) then
                 writeln (num_pesq,' foi localizado na posicao ',i)
              else
                 writeln (num_pesq,' não foi localizado');
           end;
      end;
   {*** FIM DA ROTINA DE PESQUISA ***}
   writeln;
   write ('Tecle <ENTER> para continuar ');
   readln;
 
end.

Resposta questão 2 Fila B - LTP1 2º TRIM 2012


{ Crie um algoritmo que preencha um vetor de 10 posicoes de elementos inteiros.
   Calcule e mostre:

   a) os elementos pares;
   b) a soma dos elementos de indice impar;
   c) a media dos elementos;
   d) a quantidade de elementos iguais a 30;
   e) a quantidade de elementos maiores que a media
   f) os elementos do vetor ordenado (crescente)
   g) uma pesquisa sequencial de um elemento da lista, iniciando a posicao onde se encontra.                    }


program vetor_10_posicoes;

uses crt;

var
   x                          : array[1..10] of integer;
   i,j,aux,elem_par,soma_eleind_impar,quant_30,quant_elem_mmedia,soma      : integer;
   media_elementos                          : real;
 
begin
   soma:=0;
   clrscr;
   {**** CADASTRAMENTO DOS ELEMENTOS DE UM VETOR DE 10 POSICOES ****}
   writeln ('Cadastramento dos elementos em um vetor de 10 elementos: ');
   writeln;
   writeln ('Digite os elementos deste vetor: ');
   for i:= 1 to 10 do
    begin
      readln (x[i]);
  soma:= soma + x[i]; {esta variável sera utilizada para calcular a media dos elementos da tabele (item c) }
    end;
    clrscr;
   {**** c) a media dos elementos; ****}
    media_elementos:=soma/10;

   {**** LISTAGEM DOS ELEMENTOS DE UM VETOR DE 10 POSICOES ****}
   writeln ('Elementos em um vetor de 10 elementos: ');
   writeln;
   writeln ('Elementos deste vetor: ');
   for i:= 1 to 10 do
    write (' ',x[i]);

   {**** Solucao dos itens de "a" ate a letra "g" ****}
   elem_par:= 0;
   soma_eleind_impar:=0;
   quant_30:= 0;
   quant_elem_mmedia:=0;
   for i:= 1 to 10 do
    begin
       {**** a) os elementos pares; ****}
     if (x[i] mod 2 = 0) then
    elem_par:= elem_par + 1;
       {**** b) a soma dos elementos de indice impar; ****}
       if (i mod 2 <> 0) then
    soma_eleind_impar:=soma_eleind_impar + x[i];
 {**** d) a quantidade de elementos iguais a 30; ****}
       if x[i] = 30 then
          quant_30:= quant_30 + 1;
 {**** e) a quantidade de elementos maiores que a media ****}
       if x[i] > media_elementos then
   quant_elem_mmedia:= quant_elem_mmedia + 1;
end;
   writeln;
   writeln;
   {**** Apresentacao do resultado obtido nas questoes : "a,b,d,e" ****}
   writeln ('a) os elementos pares                    : ',elem_par);
   writeln ('b) a soma dos elementos de indice impar  : ',soma_eleind_impar);
   writeln ('c) a media dos elementos                 : ',media_elementos:2:1);
   writeln ('d) a quantidade de elementos iguais a 30 : ',quant_30);
   writeln ('e) a quantidade de elementos maiores que a media: ',quant_elem_mmedia);
   writeln;
   writeln;
   {**** f) os elementos do vetor ordenado (crescente) ****}
 
   {**** rotina de troca dos elementos ****}
   for i:= 1 to 9 do
     for j:= i+1 to 10 do
       begin
          if x[i] > x[j] then
            begin
               aux:=x[i];
               x[i]:=x[j];
               x[j]:=aux;
            end;
       end;
   writeln;
   writeln;
   {*** rotina para listar os elementos da matriz ordenado (crescente) ****}
   writeln ('Listagem dos elementos ordenados (crescente): ');
   write ('Elementos: ');
   for i:= 1 to 10 do
    write (' ',x[i],' ');

   writeln;
   write ('Tecle <ENTER> para continuar ');
   readln;
 
end.

Resposta da questão 2 Fila B - LTP1 2ºTRIM 2012


{ Crie um algoritmo qu preencha uma matriz de 3x4 do tipo real. Calcule e mostre:
    - a soma dos elementos da 1a. e da 2a. linha.
    - o produto dos elementos da 4a. coluna.
   
    - listar os elementos da 1a. e da 2a. linha
    - listar os elementos da 4a. coluna                                           }

program matriz_3X4;

uses crt;

var                          
   x                      : array [1..3,1..4] of integer;
   i,j,soma,produto       : integer;

begin
   clrscr;
   writeln ('Matriz 3X4');

   {**** CADASTRAMENTO DOS ELEMENTOS ****}

   for i:= 1 to 3 do
     begin
       writeln ('Digite os elementos da ',i,'a. linha: ');
       for j:= 1 to 4 do
          begin
             write (j,'o. elemento de um total de 4 elementos: '); readln (x[i,j]);
          end;
end;
   writeln;
   writeln;

   {**** listagem dos elementos da matriz 3X4 ****}

   writeln ('Listagem dos elementos cadatrados: ');
   writeln;
   for i:= 1 to 3 do
     begin
       writeln ('Elementos da ',i,'a. linha: ');
       for j:= 1 to 4 do
         writeln (j,'o. elemento de um total de 4 elementos: ',x[i,j]);
     end;

   {**** a soma dos elementos da 1a. e 2a. linhas e o produto dos elementos da 4a. coluna  ***}

   soma :=0;
   produto:=1;
   for i:= 1 to 3 do
      for j:= 1 to 4 do
         begin
           {**** soma dos elementos da 1a. e 2a. linha ****}
           if (i>=1) and (i<=2) then
             soma:=soma+x[i,j];
           {**** produto dos elementos da 4a. coluna ****}
             if j= 4 then
               produto:=produto*x[i,j];
         end;
   writeln;

   {**** Exibir o resultado da soma dos elementos da 1a. e da 2a. linha ****}

   writeln ('Soma dos elementos da 1a. e da 2a. linhas: ');
   writeln ('Soma = ',soma);
   writeln ('Produto dos elementos da 4a. coluna: ',produto);

   {*** Listar os elementos cadastrados da 1a. e da 2a. linha ****}
 

   {**** listar os elementos da 1a. e 2a. linha ****}
   writeln ('Elementos da 1a. e da 2a. linha: ');
   writeln ('Elementos: ');
   for i:= 1 to 3 do
      for j:= 1 to 4 do
         if (i>=1) and (i<=2) then
             write (' ',x[i,j],' ');
   writeln;

   {**** listar os elementos da 4a. coluna ****}
   writeln ('Elementos da 1a. e da 2a. linha: ');
   writeln ('Elementos: ');
   for i:= 1 to 3 do
      for j:= 1 to 4 do
         if j= 4 then
             write (' ',x[i,j],' ');
   writeln;
 
   writeln;
   writeln ('Tecle <ENTER> para sair do programa ');
   readln;

end.

Prova de R. paralela de LTP1 do 2º Trimestre de 2012

A prova de recuperação paralela será no dia 04/09/2012

Conteúdo da prova:

1. Vetor
               1.1 - Cadastrar elementos
               1.2 - Listar elementos cadastrados
               1.3 - Pesquisa sequencial dos elementos não ordenados
               1.4 - Ordenar elementos cadastrados
               1.5 - Pesquisa sequencial dos elementos ordenados
2. Matriz
               2.1 - Cadastrar os elementos na matriz
               2.2 - Listar os elementos cadastrados
             
A prova terá 4 questões, sendo:
1ª. Questão - 2 perguntas sobre Vetor e matriz -                                                                      1 ponto
2ª. Questão - 1 programa para identificar os valores que estão armazenados nas variáveis -      2 pontos
3ª. Questão - 1 algoritmo para criar e trabalhar com as informações de um vetor -                    3 pontos
4ª. Questão - 1 programa para criar e trabalhar coma as informações de uma matriz -              4 pontos
                                                                                                                                              -----------
                                                                                                                                       Total = 10 pontos

A prova será realizada na sala de aula. Horario: 08:40 até 12:00.

Ainda hoje (Sábado -01/09), estarei postando material para prova, o que poderá acontecer até Domingo (02/09) a noite.

Boa prova.

Obs. A prova de RP é para todos da turma 1212 de LTP1. Todos os alunos tem direito de fazer a prova.



segunda-feira, 20 de agosto de 2012

Sites - Material para estudo de Algorítmo e Pascal

Estes sites são apenas alguns dos milhares que podem ser encontrados nas internet, que  podem ser utilizados par estudar algorítmo e pascal

http://pt.scribd.com/doc/50978145/Algoritmos-exercicios-resolvidos
http://algoritmizando.com/desenvolvimento/40-exercicios-de-algoritmos-resolvidos-para-estudo/
http://forum.imasters.com.br/topic/341519-resolvido%26nbsp%3Bmatriz-visualg/
http://pt.scribd.com/doc/56275894/48/Exercicios-Resolvidos
http://ebookbrowse.com/al/algoritmo

terça-feira, 14 de agosto de 2012

Exercício - Vetor

{Elabore um programa para cadastrar 10 elementos do tipo inteiro em um vetor
  de 10 posições. E depois calcule:

   a) a media de todos os elementos
   b) exiba os elementos acima da média e a posição dele no vetor
   c) o total de elementos acima da média                           }
   

program vetor_1;

uses crt;

const
     TAM = 10;

var
     numeros            : array[1..TAM] of integer;
     qtde, soma, i      : integer;
     media              : real;

begin
     clrscr;
     soma:=0;
     qtde:=0;

     {**** Cadastramento dos numeros ****}
     for i:= 1 to TAM do
     begin
          write ('Informe o ',i,'§  numero de 10: ');
          readln (numeros[i]);
          soma:= soma + numeros[i];
     end;

     {**** Calculo da media dos elementos ****}
     media := soma / TAM;

     writeln;
     writeln;

     {**** Exibir os números acima da média ****}
     writeln ('Numeros digitados acima da media dos demais: ');
     for i := 1 to TAM do
     begin
         if (numeros[i] > media) then
         begin
            qtde := qtde + 1;
            writeln ('Posicao ',i,' e o numero e ',numeros[i]);
         end;
     end;

     writeln;
     writeln;
     writeln ('A media dos numeros digitados e : ',media:6:2);
     writeln ('Quantidade de numeros acima da media: ',qtde);
     writeln;
     writeln ('Tecle <ENTER> para SAIR...');
     readkey;

end.

Estruturas de: Controle, Condicional e Vetor

 Estrutura IF

A estrutura de controle condicional IF executa trechos finitos de um programa se for satisfeita uma ou mais condições. No Pascal, a estrutura IF equivale à estrutura SE do Portugol.

Quando temos apenas uma instrução, utilizamos a estrutura IF sem o BEGIN/END. Quando temos mais de uma instrução dentro da estrutura IF, usamos o BEGIN/END.

Exemplo 1 : Escreva um programa em Pascal que verifique qual é o maior número de três números A,B e C.

program acha_maior;

uses crt;

var

  A, B, C : Integer;

begin

  write('Digite o valor de A : '); readln (A);
  write('Digite o valor de B : '); readln (B);
  write('Digite o valor de C : '); readln (C);
  if ((A>B) and (A>C)) then
     writeln('A é o maior')
  else
    if (B>C) then
      writeln ('B é o maior')
    else
      writeln('C é o maior') ;
end.

Exemplo 2 : Faça um programa que exiba nome e e-mail de um aluno se a sua idade for maior que 16 anos;

Program Exibe_aluno;
Uses crt;
Var
  nome , e_mail : string[30];
  Idade         : integer;
Begin
   Write (' Nome  :’);  Readln(nome);
   Write (‘E-mail :’);  Readln(e_mail);
   Write (‘Idade  : ‘); Readln(idade);

If idade >16 then

 Begin
    Writeln(nome);
    Writeln(e_mail);
 End;

End;

Estrutura WHILE

É uma estrutura de controle que mantém uma repetição enquanto uma condição for verdadeira. É equivalente à estrutura de controle de repetição ENQUANTO do Portugol.

Exemplo : Faça um programa em Pascal que leia os votos para prefeito e para vereador enquanto o horário for diferente de 17 horas.No final, o programa deverá exibir o número total de eleitores que vieram votar.

program eleicao;
uses crt;
var
  numprefeito,numvereador : Integer;
  numvotos, horario : integer;
{ o horario só pode ter valores como : 0, 1 2, 3, 4... 17, 23}
begin
     numvotos:=0;
    while horario<17 do
          begin
              write('Prefeito : '); readln (numprefeito);
              write('Vereador : '); readln (numvereador);
              numvotos:=numvotos + 1;
              writeln ('FIM!!!');
              writeln;
              write('Qual é o horário???'); readln(horario);
          end;
   write ('O número total de eleitores que vieram votar é :');
   writeln(numvotos);
end.

Estrutura de controle de repetição 

REPEAT

A estrutura REPEAT mantém uma repetição de instruções até que uma condição seja satisfeita. É equivalente à estrutura REPITA do Portugol.

Exemplo : Faça um programa que ache o maior número entre vários números lidos. O programa deverá ficar lendo números até que seja digitado ‘N’ para a pergunta : Deseja Continuar?

program Acha_maiordetodos;
uses crt;
var
 num, maior : Integer;
 resposta : char;
begin
  maior:=0;
  repeat
     write ('Numero:'); readln(num);
     if (num>maior) then
        maior:=num;
     write ('Deseja Continuar(s/n) :' ); readln(resposta);
  until (resposta='n') or (resposta='N');
  Write(' o maior número lido foi : ');
  write (maior);
end.

Estrutura de controle de repetição FOR

A estrutura FOR mantém uma repetição de instruções por determinado número de vezes. È equivalente à Estrutura PARA do Portugol.

Exemplo : Faça um programa que leia a nota final de dez alunos da CONTEC e, ao final, exiba a maior e a menor nota da turma.

program Acha_maior_menor;
uses crt;
var
  nota, menor, maior : real;
  i                             : integer;

begin
  maior:=0;
  menor :=100;
  for i:=1 to 10 do
    begin
      write ('Nota:'); readln(nota);
      if (nota>maior) then
        maior:=nota;
      If (nota<menor) then
        menor := nota;
    end;
  Write(' A maior nota foi : ');
  writeln (maior:4:2);
  Write(' A menor nota foi : ');
  writeln (menor:4:2);
end.

Vetores

Um vetor é um conjunto enumerável e indexado de informações do mesmo tipo.
Um vetor deverá ter um tamanho, um tipo, um limite inferior e um limite superior.

Quando declaramos uma variável como vetor, isto é , como ARRAY (em Pascal), estamos dizendo ao programa para armazenar um espaço na memória para armazenar uma quantidade finita de informações do mesmo tipo.

São exemplo de Vetores:

| 2 | 3 |5 |10 |8 7|2 | - Vetor do tipo INTEGER e de tamanho 6.

|True | False | True | False | True | True | - Vetor do tipo Boolean e de tamanho 6.

|8.7 |8.2 |7.7 |9.3 |8.1 |8.3 |5.7 | - Vetor do tipo Real e de tamanho 7.

Para termos acesso às informações de um vetor, precisamos ter um índice, que indica a posição de uma informação em um vetor.

Exemplo : Dado o vetor A : | 2 | 7 |6 |5 |4 |2 |1 |, podemos acessar seus elementos atribuindo valores a um índice.

A[1] = 2
A[4] = 5
A[6] = 2

Preenchendo (lendo) e exibindo um vetor do tipo Integer em Pascal
O Programa a seguir coloca dez valores em um vetor e, em seguida, exibe esses valores.

program Le_exibe_vetor;
uses crt;
var
  vet_int : array[1..10] of Integer; {vetor de 10 posições que armazena                                        numeros inteiros}
  i       : integer; {índice de um vetor}

begin
  for i:=1 to 10 do
    begin
      Write ('Valor ', i, ' ');
      readln(vet_int[i]); {Le informação da posição i do vetor vet_int}
    end;
  Writeln (' Os elementos lidos foram : ');
    for i:=1 to 10 do
      begin
        writeln(vet_int[i]); {Exibe informação da posição i do vetor vet_int}
      end;
end.

Acessando informações em um vetor através do índice

No programa a seguir, o usuário fará pesquisas em um vetor preenchido com dez valores inteiros. O usuário digitará um índice e o programa exibirá o que há dentro da posição indicada. O usuário poderá fazer várias tentativas. Quando quiser parar, deverá digitar 0 no valor do índice que está sendo lido pelo programa.

program Procura_por_indice;
uses crt;
var
  vet_int   : array[1..10] of Integer; {vetor de 10 posições que armazena                                              numeros inteiros}
  i         : integer; {índice de um vetor}
begin
  for i:=1 to 10 do
    begin
      Write ('Valor ', i, ' ');
      readln(vet_int[i]); {Le informação da posição i do vetor vet_int}
    end;
  while (i<>0) do
    begin
      write ('Digite um indice(1 a 10) para pesquisa: '); {pede ao um suário                                                             indice}
      readln(i); {Le o valor do Índice}
      if (i>0) and (i<=10) then
        writeln('Conteúdo da posição ', i, ' vale : ', vet_int[i])
      else
        if i=0 then
          writeln ('Sai do programa!!!')
        else
          writeln('Valor não válido!!!!'); {Se i <0 ou i>10}
    end;
end.

Exercícios - Desafios

1) Faça o OU lógico de todos os elementos de um vetor do tipo lógico.

Dicas:
  a) Preencha o vetor com valores lógicos FALSO ou VERDADEIRO.
  b) Crie uma variável do tipo lógica para acumular o OU lógico.

2) Escreva um programa que identifique o maior valor dentro de um vetor de 20 elementos do tipo real.

3) Escreva um programa que simule as eleições para prefeito. O programa deve ler os votos dos eleitores até às 17h. Ao final, conte e exiba o número de votos do candidato 1, do candidato 2 e do candidato 3.

4) Escreva um programa que armazene várias letras em um vetor. Em seguida, peça ao usuário o valor de duas posições. Faça a troca dos elementos dessas posições e, em seguida, exiba o vetor com essas alterações.

Exercício - vetor

{Elabore um programa para ler um vetor de 10 posições  de elementos inteiros.

Calcule e mostre:

a) os elementos das posicoes de indices impar;
b) a soma dos elementos de indice par;
c) a media dos elementos de indice impar;
d) a quantidade de elementos iguais a 33;
e) a quantidade de elementos maiores que a media de todos os elementos da matriz;
f) os elementos do vetor ordenado (decrescente);
g) uma pesquisa sequencial de um elemento da lista, indicando a posicao
   onde se encontra.
h) a soma dos elementos impares e a soma dos elementos pares.  }

program vetor70posicoes;

uses crt;

var
   elementos,aux_pesq                                : array [1..10] of integer;
   i,j,aux,soma,quant33,qmaior_media                 : integer;
   soma_imp,soma_par,pesq,cont_impar,cont_par,cont   : integer;
   resp                                              : char;
   acha                                              : boolean;
   media                                             : real;

begin
  clrscr;
  writeln ('Cadastramento dos elementos de um vetor:');
  writeln;

  {**** CADASTRAMENTO DOS ELEMENTOS ****}

  writeln ('Digite os numeros: ');
  writeln;
  for i:= 1 to 10 do
    readln (elementos[i]);

  {**** LISTAGEM DOS ELEMENTOS ****}

  writeln;
  writeln ('Listagem dos numeros cadastrados: ');
  writeln;
  for i:= 1 to 10 do
    write (' ',i,'o. ',elementos[i],' ');

  writeln;
  writeln ('Tecle <ENTER> para continuar ....');
  readln;

  {**** a) IDENTIFICAR OS ELEMENTOS DAS POSICOES DE INDICE IMPAR ****}

  writeln ('Listagem dos elementos das posicoes de indice impar: ');
  writeln;
  for i:= 1 to 10 do
    if (i mod 2 <> 0) then
      writeln (' ',i,'o. ',elementos[i],' ');

  writeln;
  writeln ('Tecle <ENTER> para continuar ....');
  readln;

  {**** b) SOMA DOS ELEMENTOS DAS POSICOES DE INDICE PAR ****}
  cont:=0;
  soma:=0;
  writeln ('Soma dos elementos das posicoes de indice par: ');
  writeln;
  for i:= 1 to 10 do
    if (i mod 2 = 0) then
      begin
        soma:= soma + elementos[i];
        cont:= cont + 1;
      end;

  writeln;
  writeln ('O total de elementos de indice par e: ',cont);
  writeln ('O resulado da soma dos elementos de indice par e: ',soma);
  writeln;
  writeln ('Tecle <ENTER> para continuar ....');
  readln;


  {**** C) MEDIA DOS ELEMENTOS DAS POSICOES DE INDICE IMPAR ****}

  media:=0;
  soma:=0;
  cont_impar:=0;
  writeln ('Soma dos elementos das posicoes de indice impar: ');
  writeln;
  for i:= 1 to 10 do
    if (i mod 2 <> 0) then
      begin
        cont_impar:= cont_impar + 1;
        soma:= soma+elementos[i];
      end;
  media:= soma/cont_impar;
  writeln ('Soma dos elementos: ',soma);
  writeln ('Total de elementos de indice impar: ',cont_impar);
  writeln ('A media dos elementos e: ',media:2:1);

  writeln;
  writeln ('Tecle <ENTER> para continuar ....');

  readln;


  {**** d) a quantidade de elementos iguais a 33 ****}

  quant33:=0;
  writeln;
  for i:= 1 to 10 do
    if elementos[i] = 33 then
      quant33:= quant33 + 1;
  writeln ('Quantidade de elementos iguais a 33 e: ',quant33);

  writeln;
  writeln ('Tecle <ENTER> para continuar ....');
  readln;

  {**** e) a quantidade de elementos maiores que a media de todos os elementos da matriz****}

  media:=0;
  soma:=0;
  writeln;
  writeln ('Elementos maiores que a media de todos os elementos da matriz: ');
  {**** CALCULO DA MEDIA DE TODOS OS ELEMENTOS ****}
  for i:= 1 to 10 do
    soma:= soma+elementos[i];
  media:= soma/10;
  writeln;
  writeln ('Media dos elementos: ',media:10:1);
  writeln;
  {**** SOMA DOS ELEMENTOS MAIORES QUE A MEDIA DE TODOS ELEMENTOS DA MATRIZ ****}
  soma:=0;
  cont:=0;
  for i:= 1 to 10 do
    if elementos[i] > media then
     begin
       soma:= soma+elementos[i] ;
       cont:= cont+1;
     end;
  writeln ('Soma dos elementos maiores que a media: ',soma);
  writeln ('Total de numeros maiores que a media  : ',cont);
  writeln;
  writeln ('Tecle <ENTER> para continuar ....');
  readln;

  {**** f) os elementos do vetor ordenado (decrescente) ****}

  writeln;
  writeln ('Ordenando os vetores na ordem "CRESCENTE": ');
  for i:= 1 to 9 do
    for j:= i+1 to 10 do
      if (elementos[i] < elementos[j]) then
        begin
          aux:=elementos[i];
          elementos[i]:= elementos[j];
          elementos[j]:= aux;
        end;
  {**** LISTAGEM DOS ELEMENTOS ORDENADOS - ORDEM DECRESCENTE ****}
  writeln ('Listagem dos numeros cadastrados - ordenados: ordem decrescente ');
  writeln;
  for i:= 1 to 10 do
    write (' ',i,'o. ',elementos[i],' ');

  writeln;
  writeln ('Tecle <ENTER> para continuar ....');
  readln;

  {**** g) uma pesquisa sequencial de um elemento da lista, indicando a posicao
   onde se encontra. ****}

     {**** PESQUISA SEQUENCIAL NAO ORDENADA****}

     writeln;
     resp:= 'S';
     while (resp = 'S') or (resp = 's') do
        begin
           {**** ROTINA DE PESQUISA ****}
           writeln;
           write ('Entre com o numero a ser pesquisado: '); readln (pesq);
           i:=1;
           acha:=false;
           while (i<=10) and (acha = false) do
             if (pesq = elementos[i]) then
               acha:= true
             else
               i:= i + 1;

           if (acha = true) then
             writeln (pesq,' foi localizado na posicao ',i)
           else
             writeln (pesq,' nao foi localizado');
           {**** FIM DA ROTINA DE PESQUISA ****}

           writeln;
           write ('Deseja continuar pesquisando: S/N: ');
           readln(resp);
        end;


  {**** h) a soma dos elementos impares e a soma dos elementos pares. ****}

  soma:=0;
  cont_par:=0;
  cont_impar:=0;
  writeln;
  writeln ('Soma dos elementos impares e pares: ');
  writeln;
  for i:= 1 to 10 do
    if (elementos[i] mod 2 <> 0) then
      begin
        soma_imp:= soma_imp+elementos[i];
        cont_par:= cont_par+1;
      end
    else
      begin
        soma_par:= soma_par + elementos[i];
        cont_impar:= cont_impar+1;
      end;
    writeln ('Total de elementos impares e: ',cont_impar);
    writeln ('Soma dos elementos impares e: ',soma_imp);
    writeln ('Total de elementos pares e: ',cont_par);
    writeln ('Soma dos elementos pares e: ',soma_par);

    writeln;
    writeln ('Tecle <ENTER> para continuar ....');
    readln;




end.




Vetor de 10 posições - Nomes

 {Elabore um programa para cadastrar 10 nomes. Este programa deverá ter uma rotina de pesquisa a qual
terá que mostrar o nome cadastrado e a posição deste nome dentro do vetor de 10 posições. Caso o nome não seja enctrado, deverá exibir uma mensagem dizendo que  o nome não foi encontrado.
Ao final deverá listado todos os nomes ordenados em ordem crescente.    }

program pesquisa_sequencial;

uses crt;

var
   nome           : array [1..10] of string[120];
   i,j            : integer;
   pesq,aux_nome  : string[120];
   resp           : char;
   acha           : boolean;

begin
     clrscr;
     writeln ('Pesquisa Sequencial');
     writeln;

     {**** ROTINA DE CADASTRAMENTO ****}

     writeln ('Cadastramento: ');
     writeln;
     for i:= 1 to 10 do
       begin
         write ('Digite o ',i,'o. nome: '); readln (nome[i]);
       end;

     {**** ROTINA DE LISTAGEM DOS NOMES CADASTRADOS - NAO ORDENADOS ****}

     writeln;
     writeln ('Listagem dos nomes cadastrados: ');
     writeln;
     for i:= 1 to 10 do
       writeln (i,'o.: ',nome[i]);

     {**** PESQUISA SEQUENCIAL NAO ORDENADA****}

     writeln;
     resp:= 'S';
     while (resp = 'S') or (resp = 's') do
        begin
           {**** ROTINA DE PESQUISA ****}
           writeln;
           write ('Entre com o nome a ser pesquisado: '); readln (pesq);
           i:=1;
           acha:=false;
           while (i<=10) and (acha = false) do
             if (pesq = nome[i]) then
               acha:= true
             else
               i:= i + 1;

           if (acha = true) then
             writeln (pesq,' foi localizado na posicao ',i)
           else
             writeln (pesq,' nao foi localizado');
           {**** FIM DA ROTINA DE PESQUISA ****}

           writeln;
           write ('Deseja continuar pesquisando: S/N: ');
           readln(resp);
        end;

        {**** ORDENANDO OS VALORES ARMAZENADOS DENTRO DO VETOR ****}

        for i:= 1 to 9 do
          for j:= i+1 to 10 do
            if nome[i] > nome[j] then
              begin
                aux_nome := nome[i];
                nome[i] := nome[j];
                nome[j] := aux_nome;
              end;

     {**** ROTINA DE LISTAGEM DOS NOMES CADASTRADOS - ORDENADOS ****}

     writeln;
     writeln ('Listagem dos nomes cadastrados - ORDENADOS : ');
     writeln;
     for i:= 1 to 10 do
       writeln (i,'o.: ',nome[i]);

     writeln;
     write ('Tecle <ENTER> para sair...'); readln;

end.




Exercício matriz 6X6

{Crie um algoritmo que preencha uma matriz de 6X6 do tipo real. Calcule e  mostre:

 a) a soma dos elementos da 1a., 3a. e 5a. linha.
 b) o produto dos elementos da 3a. coluna.
 c) subtrair o resultado [produto - item b)] pela resultado da soma [item a)]      }

program matriz_6X6;

uses crt;

var
   matriz       : array [1..6,1..6] of real;
   soma,produto : real;
   i,j          : integer;

begin
  clrscr;
  writeln ('Construindo uma matriz 6X6');
  writeln;
  soma:=0;
  produto:=1;

  {****** CADASTRAMENTO DOS NUMEROS ******}

  writeln ('Cadastramento dos numeros: ');
  writeln;
  for i:= 1 to 6 do
    begin
      writeln('Numeros da ',i,'a. linha: ');
      for j:= 1 to 6 do
        begin
          write (j,'a. coluna: ');
          readln (matriz[i,j]);

          {**** soma itens das linhas 1, 3 e 5 *****}

          if i=1 then
           soma:= soma + matriz[i,j]
          else
            if i= 3 then
             soma:= soma + matriz[i,j]
            else
              if i= 5 then
               soma:= soma + matriz[i,j];

          {****** calcula o produto dos itens da 3a. coluna ******}
          if (j=3) then
           produto:= produto * matriz[i,j];


        end;
    end;

  {****** LISTAGEM DOS NUMEROS CADASTRADOS ******}

  clrscr;
  writeln ('Listagem dos numeros cadastrados: ');
  writeln;
  for i:= 1 to 6 do
    begin
      writeln('Numeros da ',i,'a. linha: ');
      for j:= 1 to 6 do
        write (j,'o.: ',matriz[i,j]:2:1,' ');
      writeln;
    end;
  writeln;
  writeln ('A soma dos elementos da 3a. coluna e: ',soma:20:1);
  writeln ('O produto dos elementos da 4a. e 5a. linha e: ',produto:20:1);
  writeln;
  writeln ('Tecle <ENTER> para sair');
  readln;
end.

Exercício - Matriz 5X8

{Crie um programa que preencha matriz 5X8 do tipo real. Calcule e mostre:

a) a soma dos elementos da 3a. coluna.
b) o produto dos elementos  da 1a. e 2a. coluna.
                                                          }

program matriz_5X8;

uses crt;

var
   matriz                 : array [1..5,1..8] of real;
   soma,produto1,produto2 : real;
   i,j                    : integer;

begin
     clrscr;
     soma:=0;
     produto1:=1;
     produto2:=1;

     {****** CADASTRAMENTO DO NUMEROS ******}

     writeln ('Montar uma matriz de 5X8 : ');
     writeln;
     for i:= 1 to 5 do
       begin
         writeln;
         writeln (i,'a. Linha: ');
         writeln;
         for j:= 1 to 8 do
           begin
             write (' ',j,'o. '); readln (matriz[i,j]);
             if i=1 then
                produto1:=produto1*matriz[i,j];
             if i=2 then
                produto2:=produto2*matriz[i,j];
             if j=3 then
               soma:=soma+matriz[i,j];
           end;
         writeln;
       end;



     {****** LISTAGEM DO NUMEROS CADASTRADOS ******}

     writeln ('Matriz de 5X8 : ');
     writeln;
     for i:= 1 to 5 do
       begin
         writeln (i,'a. Linha: ');
         writeln;
         for j:= 1 to 8 do
           write (' ',j,'o. ',matriz[i,j]:2:1);
         writeln;
       end;
     writeln;
     writeln ('Produto dos elementos da 1a. linha: ',produto1:15:1);
     writeln ('Produto dos elementos da 2a. linha: ',produto2:15:1);
     writeln ('A soma dos elementos da 3a. coluna: ',soma:15:1);
     writeln;
     writeln ('Tecle <ENTER> para sair ...');
     readln;

end.

sexta-feira, 10 de agosto de 2012

Arquivo deverá ser do tipo Text e a variável do tipo String


Arquivos em disco.

IX.1 - O tipo File

O tipo file ou arquivo, é uma estrutura constituída de elementos do mesmo tipo dispostos seqüencialmente. Essa estrutura é utilizada para comunicação com o meio externo, principalmente com discos magnéticos.

IX.1.1 - Definição do tipo File

A sintaxe geral para definir uma variável com esse tipo de estrutura é:

                Type Arquivo = File of <Tipo>;

                Var a : Arquivo

Após as declarações  acima, a variável 'a' passa a representar um arquivo de elementos do tipo <Tipo>.

        Exemplos:

        Exemplo 1: Arquivo com números inteiros:

                Type Arq = File Of Integer;
                Var  Arquivo : Arq;

        Ou

                Var Arquivo : File Of Integer;

        Exemplo 2: Arquivo de números reais:

                Type Arq = File Of Real;
                Var  Arquivo : Arq;
        Exemplo 3: Arquivo de records:

                Type Pessoa = Record
                                  Nome   : String[30];
                                  Idade   : Integer;
                                  Sexo    : Char;
                                  Altura   : Real;
                              End;

                Var Arquivo : File Of Pessoa;

         e assim por diante...

IX.2 - Procedimentos para operações em arquivos

O acesso a arquivos sempre segue a mesma seqüência, a saber:

        1-) Abertura do arquivo
        2-) Leitura e/ou escrita de dados no arquivo
        3-) Fechamento do arquivo

Para tanto, existem diversas procedures para executar tais operações e que passaremos a examinar agora.

IX.2.1 - Assign

Esta procedure tem a finalidade de atribuir um nome lógico ao arquivo físico, ou seja, ao nome do arquivo em disco. Sintaxe:

                Assign(Variável_do_tipo_file,Nome_do_arquivo);

        Exemplo:

Program Exemplo;
        Uses CRT;
        Type Arquivo = File Of Integer;
        Var Arq : Arquivo;
        Begin
                Assign(Arq,'B:EXEMPLO.DTA');

(* a partir desse instante, todas as operações de escrita ou leitura que forem realizadas com a variável Arq, será automaticamente feitas no arquivo EXEMPLO.DTA no drive B *)

                . . .
                . . .
        End.

IX.2.2 - Abertura de arquivos ( Rewrite e Reset )

        Para abrir arquivos, dispomos de duas procedures, a saber:

Rewrite(<Arq>);

Esta procedure apaga o arquivo em disco associado à variável Arq e cria um novo arquivo.
Exemplo:

        Program Exemplo;
        Uses CRT;
        Type Arquivo = File Of Integer;
        Var Arq : Arquivo;
        Begin
                Assign(Arq,'B:EXEMPLO.DTA');
                Rewrite(Arq);
                (* Após estas declarações, teremos um novo arquivo no drive  B com o nome 'EXEMPLO.DTA' *)
                . . .
                . . .
        End.

Reset(Arq);

{Esta procedure abre o arquivo em disco associado à variável Arq para leitura ou escrita. Esta procedure parte do princípio que o arquivo exista em disco, caso ele não exista, haverá erro. }

Exemplo:

        Program Exemplo;
        Uses CRT;
        Type Arquivo = File Of Integer;
        Var Arq : Arquivo;
        Begin
                Assign(Arq,'B:EXEMPLO.DTA');
                Reset(Arq);

(* Após estas declarações, o arquivo no drive B com o nome 'EXEMPLO.DTA' está aberto e pronto para as operações de entrada e saída *)
                . . .
                . . .
        End.

IX.2.3 - Escrevendo e lendo dados no arquivo ( Write,Read )

A procedure utilizada para escrever dados em um arquivo é Write. Sua sintaxe é:

Write(Arq,var);

Os dados são gravados seqüencialmente no arquivo, ou seja, um após o outro e isto é feito automaticamente pela procedure Write. Para tanto a linguagem Pascal mantém um apontador de registro de arquivo que aponta sempre para o número de registro, onde será gravado ou lido um dado.



Exemplo:

Program Exemplo;
        Uses CRT;
        Type Arquivo = File Of Integer;
        Var Arq : Arquivo;
            i   : Integer;
        Begin
                Assign(Arq,'B:EXEMPLO.DTA');
                Rewrite(Arq);
                For i:=1 to 100 do Write(Arq,i);
(* com a instrução acima, teríamos escrito seqüencialmente no arquivo B:EXEMPLO.DTA os números de 1 a 100 *)
                . . .
                . . .
        End.

Como já dissemos anteriormente, a linguagem Pascal mantém um apontador de registro que indica o próximo registro que será lido ou escrito, e toda vez que fazemos uma leitura ou escrita num registro, o apontador é incrementado de um, isto é automático. No entanto, dispomos de uma procedure que nos permite alterar o valor desse apontador e portanto, nos permite acessar qualquer registro que quisermos. Essa procedure chama-se Seek. A propósito, o número do primeiro registro é zero. A sintaxe desta procedure é:

        Seek(Arq,número_do_registro);

        Para ler dados do arquivo,dispomos da procedure Read cuja sintaxe é:

        Read(Arq,Var);

        Exemplo:

Program Exemplo;
        Uses CRT;
        Type Arquivo = File Of Integer;
        Var Arq : Arquivo;
            i   : Integer;
        Begin
                Assign(Arq,'B:EXEMPLO.DTA');
                Rewrite(Arq);
                For i:=1 to 100 do Write(Arq,i);
                Seek(Arq,0);  (* posiciona o apontador de registro no registro número 0 *)
                Read(Arq,i);  (* a variável i fica igual ao conteúdo do registro número 0 que no presente exemplo valeria 1,a propósito,
                              o apontador de registro já está valendo 1 *)
                Read(Arq,i);  (* i agora está valendo 2 *)
                . . .
                . . .
        End.

IX.2.4 - Fechamento do arquivo

Como já foi visto, após a abertura do arquivo, leitura e/ou escrita de dados, devemos fechá-lo. Para tanto, dispomos da procedure close cuja sintaxe é:

Close(Arq);

        Exemplos de programas:

        Exemplo 1:

PROGRAMA Grava --> Lê números do teclado e em seguida os grava num arquivo em disco AUTOR : Thelmo J. M. Mesquita

        Program grava;
        Uses CRT;
        Var arquivo : File Of Integer;
            i       : Integer;
        Begin
           ClrScr;
           Assign(arquivo,'arquivo.dta');
           ReWrite(arquivo);
           Repeat
              Write('Numero --> ');
              Readln(i);
              Write(arquivo,i);
           Until i=0;
           Close(arquivo);
        End.

(* O próximo programa lê os números gravados pelo programa anterior *)

PROGRAMA : Le.pas ---> Le numeros de um arquivo em disco
         AUTOR    : Thelmo J. M. Mesquita

        Program le;
        Uses CRT;
        Var arquivo : File Of Integer;
            i       : Integer;
        Begin
           ClrScr;
           Assign(arquivo,'arquivo.dta');
           Reset(arquivo);
           Repeat
              Read(arquivo,i);
              Writeln(i);
           Until i=0;
           Close(arquivo);
        End.

        Exemplo 2:

Program Exemplo_2;
        Uses CRT;
{Programa que grava num arquivo em disco, o quadrado dos números de 0 a 100 e depois permite consulta através da instrução seek}

        Var Arq : File of Real;
            i : Integer;
            s : real;
        Begin
           Assign(Arq,'Arquivo.dta');
           Rewrite(Arq);
           For i:=0 to 100 do Begin
                                 s:=i*i;
                                 Write(Arq,s);
                              End;
           Close(Arq);
           Reset(Arq);
           ClrScr;
           While i>=0 do
           Begin
              Write('Numero --> ');
              Readln(i);
              if (i>=0) And (i<=100)
                 Then Begin
                         seek(Arq,i);
                         Read(Arq,s);
                         Writeln;
                         Writeln(s:10:0);
                         Writeln;
                      End;
          End;
          Close(Arq);
        End.

        Exemplo 3:

ARQUIVO.PAS : Este programa tem a finalidade de gerenciar um arquivo em disco cujos registros contém dois campos, a saber:
                       NOME   : 20 caracteres
                       IDADE  : integer

         O programa apresenta inicialmente o seguinte menu:
                       1 - ) Sair do programa
                       2 - ) Entrar com registros
                       3 - ) Listar todos os registros
                       4 - ) Pesquisa por nome
(*$I-*) (* esta diretiva de compilação tem a finalidade de indicar ao compilador que os erros de I/O  (entrada/saída)  serão verificados pelo programador, ou seja, se houver algum erro de I/O durante a execução do programa, o programa não irá abortar. Para que o programador saiba se uma determinada operação de I/O funcionou corretamente, ele deverá verificar o valor da variável IORESULT. Se ela for diferente de zero, então ocorreu algum erro e o programador deverá então tomar alguma providência *)

        Program Exemplo_De_Arquivo;
        Uses CRT;
        Type Pessoa = Record
                         Nome   : String[20];
                         Idade  : Integer;
                      End;
             Frase  = String[80];
        Var  Arquivo    : File Of Pessoa;
             P               : Pessoa;
             escolha      : Integer;
        Procedure Linha; (* traça uma linha na posição atual do
                            cursor *)
        Var i : Integer;
        Begin
           For i:=1 to 80 Do Write('-');
        End;
        Procedure Centro(S:Frase); (* centra string S na tela *)
        Var x:integer;
        Begin
           x:=40+(Length(S)) DIV 2; (* lenght retorna o número de
                                       caracteres do parâmetro *)
           Writeln(S:x);
        End;
        Procedure InReg; (* procedimento p/ incluir registros *)
        Var resposta:char;
        Begin
           ClrScr;
           Linha;
           Centro('ROTINA PARA ENTRAR REGISTROS');
           Reset(arquivo);
(*Neste trecho do programa, iremos utilizar uma função nova : FILESIZE(arq) retorna quantos registros possui o arquivo "arq"     *)
           Seek(arquivo,FileSize(arquivo));  (* posiciona o apontador de registros no final do arquivo *)
           resposta:='s';
           Linha;
           While resposta='s' Do
           Begin
              gotoxy(1,5);clreol; (* limpa até final da linha *)
              gotoxy(1,6);clreol;
              gotoxy(1,5);
              Buflen:=20; (* estou limitando o buffer do teclado  em 20 caracteres, o normal é 126 *)
              Write('Nome da pessoa ---> ');
              Readln(P.Nome);
              Buflen:=2;
              clreol;
              Write('Idade da pessoa --> ');
              Readln(P.Idade);
              Linha;
              Write(arquivo,P);
              Write('Deseja Continuar ? -->':50);
              Readln(resposta);
           end;
           close(arquivo);
           Buflen:=126;
        End;
        Procedure LiReg; (* procedimento para listar os registros na tela *)
        Begin
           Reset(arquivo);
           Clrscr;
           Linha;
           writeln('NOME':15,'IDADE':18);
           linha;
           While not eof(arquivo) do
           Begin
              read(arquivo,P);
              Writeln(P.nome:21,' - - - ',P.idade);
           end;
           Linha;
           Close(arquivo);
           Write('Digite uma tecla --> ');
           repeat until keypressed;
        End;
        Procedure PeNo;  (* pesquisa por nome *)
        Var nome : string[20];
        Begin
           Reset(arquivo);
           nome:='1';
           While nome<>'0' Do
           Begin
              Clrscr;
              Linha;
              Centro('PESQUISA POR NOME');
              linha;
              Write('Nome (0=fim) --> ');
              Readln(nome);
              if nome<>'0'
              Then Begin
                      linha;
                      seek(arquivo,0);
                      While not eof(arquivo) do
                      Begin
                         read(arquivo,P);
                         if Pos(nome,P.nome)<>0
                            Then Writeln(P.nome:21,' - - - ',P.idade);
                      End;
                      Linha;
                      Write('Digite uma tecla --> ');
                      repeat until keypressed;
                   End;
           End;
           close(arquivo);
        End;

(* aqui começa o nosso programa, inicialmente devemos verificar se o arquivo "arquivo.dta" existe, se não existir, então ele deverá ser criado *)

        Begin
           Assign(arquivo,'arquivo.dta');
           Reset(arquivo);
           If IOresult <> 0 Then ReWrite(arquivo);
           Close(arquivo);
           Repeat
              ClrScr;
              Linha;
              Writeln('..... Programa para gerenciar um arquivo contendo nomes e');
              Writeln('      idades de pessoas');
              Writeln('..... Escrito em 06/09/93 por Thelmo J.M.Mesquita');
              Linha;
              Gotoxy(24,12);Writeln('1 - Sair do programa');
              Gotoxy(24,14);Writeln('2 - Entrar com registros');
              Gotoxy(24,16);Writeln('3 - Listar todos os registros');
              Gotoxy(24,18);Writeln('4 - Pesquisar por nome');
              Gotoxy(33,10);LowVideo;
              Writeln('SUA ESCOLHA :');NormVideo;
              Repeat
                Gotoxy(47,10);
                read(escolha);
              Until (escolha > 0 ) and (escolha < 5);
              Case escolha of
                 2 : InReg;
                 3 : LiReg;
                 4 : PeNo;
              end;
           Until escolha=1;
           ClrScr;
           Gotoxy(33,12);Writeln('T C H A U . . . . . ');
        End.


        Exemplo 4:

{Este programa tem a finalidade de gerenciar um arquivo em disco com a seguida estrutura:}

                       Nome  : frase;
                       Idade  : Integer;
                       Sexo   : Char;
                       Altura  : Real;
        Program Arquivo;
        Uses CRT;
        Type Frase  = string[20];
             Pessoa = Record
                         Nome   : frase;
                         Idade   : Integer;
                         Sexo    : Char;
                         Altura  : Real;
                      End;
        Var Arq : File Of Pessoa;
            escolha : char;
            p : pessoa;
            s : frase;
        Procedure tecla;
        Begin
           Write(chr(7));
           Write('Digite uma tecla --> ');
           Repeat until keypressed;
        End;
        Procedure Linha;
        Var i:byte;
        Begin
           For i:=1 to 80 do write('-');
        End;
        Function Maiuscula(s:frase):frase;
        var i:byte;
        Begin
           for i:=1 to length(s) do s[i]:=upcase(s[i]);
           maiuscula:=s;
        end;
        Function Acha_Nome(s:frase):integer;
        Label fim;
        Begin
           Acha_Nome:=-1;
           While not eof(arq) do
              Begin
                 Read(arq,p);
                 if pos(s,p.nome) > 0 Then Begin
                                              Acha_Nome:=Filepos(arq)-1;
                                              Goto fim;
                                           End;
              End;
        fim:
        End;
        Procedure Consulta;
        Var escolha : Char;
        Procedure lireg;
        Begin
           Seek(Arq,0);
           ClrScr;
           Linha;
           lowvideo;
           Writeln('NOME':18,'IDADE':12,'SEXO':5,'ALTURA':10);
           Normvideo;
           linha;
           While not eof(arq) do
           Begin
              Read(arq,p);
              With p do
                 Writeln(nome:22,idade:6,sexo:5,altura:10:2);
           End;
           linha;
           tecla;
        End;
        Procedure peno;
        label fim;
        Begin
           Repeat
              clrscr;
              write('Nome para pesquisa (0=fim) -> ');
              readln(s);
              s:=maiuscula(s);
              if s='0' then goto fim;
              Seek(Arq,0);
              ClrScr;
              Linha;
              lowvideo;
              Writeln('NOME':18,'IDADE':12,'SEXO':5,'ALTURA':10);
              Normvideo;
              linha;
              While not eof(arq) do
              Begin
                 Read(arq,p);
                 if pos(s,p.nome)>0 then
                 With p do
                    Writeln(nome:22,idade:6,sexo:5,altura:10:2);
              End;
              linha;
              tecla;
        fim:
           until s='0';
        End;
        Procedure lidade;
        label fim;
        var i1,i2:byte;
        Begin
           Repeat
              clrscr;
              write('Idade no.1 (0=fim) -> ');
              readln(i1);
              if i1=0 then goto fim;
              write('Idade no.2 ---------> ');
              readln(i2);
              Seek(Arq,0);
              ClrScr;
              Linha;
              lowvideo;
              Writeln('NOME':18,'IDADE':12,'SEXO':5,'ALTURA':10);
              Normvideo;
              linha;
              While not eof(arq) do
              Begin
                 Read(arq,p);
                 if ((p.idade>=i1) and (p.idade<=i2)) then
                 With p do
                    Writeln(nome:22,idade:6,sexo:5,altura:10:2);
              End;
              linha;
              tecla;
        fim:
           until i1=0;
        End;
        Procedure lisexo;
        label fim;
        var s:char;
        Begin
           Repeat
              clrscr;
              write('Sexo para pesquisa (0=fim) -> ');
              readln(s);
              s:=maiuscula(s);
              if s='0' then goto fim;
              Seek(Arq,0);
              ClrScr;
              Linha;
              lowvideo;
              Writeln('NOME':18,'IDADE':12,'SEXO':5,'ALTURA':10);
              Normvideo;
              linha;
              While not eof(arq) do
              Begin
                 Read(arq,p);
                 if p.sexo=s then
                 With p do
                    Writeln(nome:22,idade:6,sexo:5,altura:10:2);
              End;
              linha;
              tecla;
        fim:
           until s='0';
        End;
        Procedure lialtura;
        label fim;
        var i1,i2:real;
        Begin
           Repeat
              clrscr;
              write('Altura no.1 (0=fim) -> ');
              readln(i1);
              if i1=0 then goto fim;
              write('Altura no.2 ---------> ');
              readln(i2);
              Seek(Arq,0);
              ClrScr;
              Linha;
              lowvideo;
              Writeln('NOME':18,'IDADE':12,'SEXO':5,'ALTURA':10);
              Normvideo;
              linha;
              While not eof(arq) do
              Begin
                 Read(arq,p);
                 if ((p.altura>=i1) and (p.altura<=i2)) then
                 With p do
                    Writeln(nome:22,idade:6,sexo:5,altura:10:2);
              End;
              linha;
              tecla;
        fim:
           until i1=0;
        End;
        Begin
           Repeat
              ClrScr;
              Gotoxy(32,3);LowVideo;Write('MENU DE CONSULTA');NormVideo;
              Gotoxy(23, 6);Write('1 - Voltar ao menu anterior');
              Gotoxy(23,8);Write('2 - Listar todos os registros na tela');
              Gotoxy(23,10);Write('3 - Pesquisa por nome');
              Gotoxy(23,12);Write('4 - Listar Registros  de  pessoas com');
              Gotoxy(27,13);Write('certa idade');
              Gotoxy(23,15);Write('5 - Listar Registros  de  pessoas  de');
              Gotoxy(27,16);Write('determinado sexo');
              Gotoxy(23,18);Write('6 - Listar registros  de  pessoas  de');
              Gotoxy(27,19);Write('certa altura');
              Gotoxy(32,21);Write('SUA ESCOLHA -> ');
              Repeat
                 escolha:=readkey;
              Until escolha IN ['1','2','3','4','5','6'];
              Write(chr(7));
              Case escolha of
                 '2' : lireg;
                 '3' : peno;
                 '4' : lidade;
                 '5' : lisexo;
                 '6' : lialtura;
              End;
           Until escolha='1';
        End;
        Procedure Altera;
        Var escolha : Char;
        Procedure Inreg;
        Label fim;
        Begin
           seek(Arq,filesize(Arq));
           ClrScr;
           Gotoxy(25,6);LowVideo;
           Write('INTRODUCAO DE UM NOVO REGISTRO');NormVideo;
           Gotoxy(5, 9);Write('NOME (0=fim) --> ');
           Gotoxy(5,11);Write('IDADE ---------> ');
           Gotoxy(5,13);Write('SEXO ----------> ');
           Gotoxy(5,15);Write('ALTURA --------> ');
           Repeat
              Gotoxy(26, 9);write('....................');
              Gotoxy(26,11);write('...');
              Gotoxy(26,13);write('.');
              Gotoxy(26,15);write('....');
              Gotoxy(26, 9);Read(p.nome);
              If p.nome='0' Then Goto Fim;
              Gotoxy(26,11);Read(p.idade);
              Gotoxy(26,13);Read(p.sexo);
              Gotoxy(26,15);Read(p.altura);
              p.nome:=maiuscula(p.nome);
              p.sexo:=maiuscula(p.sexo);
              Write(Arq,p);
        Fim:
           Until p.nome='0';
        End;
        Procedure Delreg;
        label fim;
        var r,i:integer;
            resp,resposta:char;
            temp:file of pessoa;
        Begin
           seek(arq,0);
           Repeat
              ClrScr;
              Gotoxy(25,2);LowVideo;
              Write('ROTINA PARA DELETAR REGISTROS');NormVideo;
              Gotoxy(10,6);Write('Nome (0=fim) --> ');
              Readln(s);
              s:=maiuscula(s);
              if s='0' then goto fim;
              repeat
                 r:=acha_nome(s);
                 if r=-1
                 Then Begin
                         Gotoxy(40,23);
                         lowvideo;
                         write('FIM DE ARQUIVO. . ');
                         normvideo;
                         seek(arq,0);
                         tecla;
                      End
                 Else Begin
                         gotoxy(10, 6);clreol;Write('NOME ...: ',p.nome);
                         gotoxy(10, 8);clreol;Write('IDADE ..: ',p.idade);
                         gotoxy(10,10);clreol;write('SEXO ...: ',p.sexo);
                         gotoxy(10,12);clreol;write('ALTURA .: ',p.altura:6:2);
                         gotoxy(1,16) ;clreol; write('POSSO DELETAR -->');
                         Readln(resposta);
                         resposta:=maiuscula(resposta);
                         if (resposta='S')
                            Then Begin
                                    assign(temp,'tempor');
                                    rewrite(temp);
                                    seek(arq,0);
                                    while not eof(arq) do
                                       if filepos(arq)<>r
                                          then begin
                                                  read(arq,p);
                                                  write(temp,p);
                                               end
                                           else read(arq,p);
                                    close(arq);
                                    close(temp);
                                    erase(arq);
                                    rename(temp,'dados.dta');
                                    reset(arq);
                                 end
                            else Begin
                                    gotoxy(1,16);clreol;
                                    write('CONTINUA A PESQUISA ? --> ');
                                    readln(resp);
                                    resp:=maiuscula(resp);
                                    if  (resp='N')
                                       Then r:=-1;
                                  End;
                      end;
              until r=-1;
        fim:
           Until s='0';
        End;
        Procedure Modreg;
        label fim;
        var r,i:integer;
            resp,resposta:char;
            temp:file of pessoa;
        Begin
           seek(arq,0);
           Repeat
              ClrScr;
              Gotoxy(25,2);LowVideo;
              Write('ROTINA PARA MODIFICAR REGISTROS');NormVideo;
              Gotoxy(10,6);Write('Nome (0=fim) --> ');
              Readln(s);
              s:=maiuscula(s);
              if s='0' then goto fim;
              repeat
                 r:=acha_nome(s);
                 if r=-1
                 Then Begin
                         Gotoxy(40,23);
                         lowvideo;
                         write('FIM DE ARQUIVO. . ');
                         normvideo;
                         seek(arq,0);
                         tecla;
                      End
                 Else Begin
                         gotoxy(10, 6);clreol;Write('NOME ...: ',p.nome);
                         gotoxy(10, 8);clreol;Write('IDADE ..: ',p.idade);
                         gotoxy(10,10);clreol;write('SEXO ...: ',p.sexo);
                         gotoxy(10,12);clreol;write('ALTURA .: ',p.altura:6:2);
                         gotoxy(1,16) ;clreol; write('MODIFICA ? ----->');
                         Readln(resposta);
                         resposta:=maiuscula(resposta);
                         if (resposta='S')
                            Then Begin
                                    gotoxy(20, 6);
                                    read(p.nome);clreol;
                                    gotoxy(20, 8);
                                    read(p.idade);clreol;
                                    gotoxy(20,10);read(p.sexo);
                                    clreol;
                                    gotoxy(22,12);
                                    read(p.altura);clreol;
                                    p.nome:=maiuscula(p.nome);
                                    p.sexo:=maiuscula(p.sexo);
                                    seek(arq,r);
                                    write(arq,p);
                                 end
                            else Begin
                                    gotoxy(1,16);clreol;
                                    write('CONTINUA A PESQUISA ? --> ');
                                    readln(resp);
                                    resp:=maiuscula(resp);
                                    if  (resp='N')
                                       Then r:=-1;
                                  End;
                      end;
              until r=-1;
        fim:
           Until s='0';
        End;
        Begin
           Repeat
              Clrscr;
              Gotoxy(27,10);Write('1 - Voltar ao menu anterior');
              Gotoxy(27,12);Write('2 - Entrar com um registro');
              Gotoxy(27,14);Write('3 - Deletar um registro');
              Gotoxy(27,16);Write('4 - Modificar um registro');
              Gotoxy(31,7);Lowvideo;Write('MENU DE ALTERACAO');NormVideo;
              Gotoxy(32,19);Write('SUA ESCOLHA -> ');
              Repeat
                 escolha:=readkey;
              Until escolha IN ['1','2','3','4'];
              Write(chr(7));
              Case escolha of
                 '2' : Inreg;
                 '3' : Delreg;
                 '4' : Modreg;
              End;
           Until escolha='1';
        End;
        Begin
           Assign(Arq,'dados.dta');
           (*$I-*)
           Reset(Arq);
           If IORESULT <> 0 Then Rewrite(Arq);
           (*$I+*)
           Repeat
              ClrScr;
              Gotoxy(29,10);Write('1 - Sair do programa');
              Gotoxy(29,12);Write('2 - Consulta de dados');
              Gotoxy(29,14);Write('3 - Alteracao de dados');
              Gotoxy(33,7);LowVideo;Write('MENU PRINCIPAL');NormVideo;
              Gotoxy(32,17);Write('SUA ESCOLHA -> ');
              Repeat
                 escolha:=readkey;
              Until escolha IN ['1','2','3'];
              Write(chr(7));
              Case escolha of
                 '2': Consulta;
                 '3': Altera;
              End;
           Until escolha='1';
           Close(Arq);
           ClrScr;
        End.
IX.2.5 - Erase

        Esta procedure permite deletar um arquivo em disco. Sintaxe:

                Erase( Arq : File of tipo);

        ou

                Erase( Arq : File );

        Exemplo:

Program Exemplo;
        Uses CRT;
        Var arq : file;
        Begin
           assign(arq,'thelmo.001');
           erase(arq);
               (* após a execuçäo deste trecho de programa, o arquivo 'thelmo.001' seria eliminado do disco *)
        End.

IX.2.6 - Rename

        Procedure utilizada para trocar o nome de um arquivo. Sintaxe:

            Rename( Arq : File , Novo_Nome);
        onde
        Arq deve ser uma variável do tipo file e
        Novo_nome uma string.

        Exemplo:
Program Exemplo_2;
        Uses CRT;
        Var Arq : File;
        Begin
          Assign(Arq,'teste.001');
          Rename(Arq,'soma.dta');
(* após a execução deste trecho de programa, o arquivo 'thelmo.001' teria seu nome trocado para 'soma.dta' *)
        End.

IX.2.7 - BlockWrite e BlockRead

A procedure BlockRead lê um no. especificado de blocos de 128 bytes de um arquivo não tipado para uma variável. O n.º de registros lidos é retornado numa variável inteira que é opcional. BlockWrite Escreve ao invés de ler. Sintaxe:

        BlockWrite(Arquivo,Variável,No_de_Regs,Resultado);

        BlockRead(Arquivo,Variável,No_de_Regs,Resultado);

        Exemplo:

Program Exemplo;
        Uses CRT;

{Programa para copiar um arquivo para outro, em seguida é feita uma verificação se a cópia foi bem feita}

        Const Buf_Regs = 100;   (* Número de blocos de 128 bytes que serão transferidos pelo BlockRead ou pelo Block-Write *)
        Label FIM;
        Var Fonte,              (* Nome do arquivo fonte    *)
            Destino             (* Nome do arquivo destino  *)
                       : String[33];
            F,                  (* Nome lógico do arq. fonte *)
            D                   (* Nome lógico do arq. destino *)
                       : File;  (* Arquivos não tipados  *)
            No_Regs_restantes,  (* No. de  registros que faltam  para serem transferidos *)
            Regs_para_ler,      (* No. de registros que serão lidos e/ou escritos *)
            i,r,r1              (* Variáveis auxiliares *)
                       : Integer;
            Buffer,             (* Variável que receberá o blocos de registros lidos pelo Block-Read *)
            Buffer1             (* Idem ao anterior *)
                       : Array[1..12800] Of Byte;
        Procedure Erro(x:integer);
        Begin
           Writeln('. . . . . . Problemas com a copia');
           If x=1
              Then Writeln('. . . . . . Arquivos de tamanhos diferentes')
              Else Writeln('. . . . . . .Arquivos diferentes');
           Writeln('Tente novamente');
        End;
        Begin
           ClrScr;
           Lowvideo;
           Writeln('Copiador de arquivos':50);
           NormVideo;
           Write('Fonte ----> ');
           Readln(Fonte);
           Assign(F,Fonte);
        {$I-}                     (* já explicado em programa anterior *)
           Reset(F);
        {$I+}
           If IORESULT <> 0
              Then Begin
                      Writeln('..... Este arquivo não existe');
                      Writeln('..... Operacao nao realizada');
                      Goto FIM;
                   End;
           Write('Destino --> ');
           Readln(Destino);
           Assign(D,Destino);
           Rewrite(D);
           No_Regs_Restantes := Filesize(F);
        (* FileSize retorna o número de registros que contém o arquivo *)
           While No_Regs_Restantes > 0 do
              Begin
                 If Buf_Regs < No_Regs_Restantes
                    Then Regs_para_ler := Buf_regs
                    Else Regs_para_ler := No_Regs_Restantes;
                 BlockRead(F,Buffer,Regs_para_ler);
                 BlockWrite(D,Buffer,Regs_para_ler);
                 No_Regs_restantes := No_regs_restantes-Regs_para_ler;
              End;
           Close(F);
           Close(D);
           Reset(F);
           Reset(D);
           No_Regs_Restantes := Filesize(F);
           While No_Regs_Restantes > 0 do
              Begin
                 If Buf_Regs < No_Regs_Restantes
                    Then Regs_para_ler := Buf_regs
                    Else Regs_para_ler := No_Regs_Restantes;
                 BlockRead(F,Buffer,Regs_para_ler,r);
                 BlockRead(D,Buffer1,Regs_para_ler,r1);
                 No_Regs_restantes := No_regs_restantes-Regs_para_ler;
                 If r<>r1
                    Then Begin
                            Erro(1);
                            Goto FIM;
                         End;
                 For i:=1 to 128*r do
                    if buffer[i]<>buffer1[i]
                       Then Begin
                               Erro(2);
                               Goto FIM;
                            End;
              End;
        FIM:
        End.

IX.2.8 - Truncate

Esta procedure trunca o arquivo a partir do registro corrente.

        Sintaxe:

        Truncate(Arq);


        Exemplo:

        Program Exemplo;
        Uses CRT;
        Var a : file of integer;
            i : integer;
        Begin
           Assign(a,'Arquivo.Dta');
           Rewrite(a);
           For i:=1 to 100 do write(a,i);
           Close(a);
(* O arquivo 'Arquivo.Dta' contem 100 números inteiros de 1 até 100 *)
           Reset(a);
           Seek(a,10);
          truncate(a); (* o arquivo foi truncado a partir do registro 10 *)
           Seek(a,0);
           while not eof(a) do   (* eof() está explicado logo abaixo *)
           Begin
              read(a,i);
              writeln(i); (* será escrito de 1 até 10 no vídeo *)
           end;
        end.





IX.3 - Funções para operações em arquivos

IX.3.1 - Eof()

Esta função retorna um TRUE, caso tenha se alcançado um fim de arquivo, caso contrário, retorna um FALSE. Um exemplo de aplicação foi mostrado no último programa.

IX.3.2 - SeekEof()

Função semelhante ao Eof() exceto que ela pula brancos e tabulações, checando somente o marcador de fim de arquivo (CTRL-Z).

IX.3.3 - FilePos

Retorna o número do registro corrente. Lembramos novamente, que o primeiro registro recebe o número zero. Sintaxe:

        FilePos(Arquivo);

IX.3.4 - FileSize

Retorna o número de registros de determinado arquivo. Retorna zero se o arquivo estiver vazio. Caso o arquivo não seja tipado, então a função FileSize considera que os registros tenham 128 bytes cada um

        Sintaxe:
        FileSize(Arquivo);

Esta função em conjunto com a procedure Seek, nos permite colocar o apontador de registros para o final do arquivo. Isto é muito útil quando desejamos adicionar mais registros num arquivo. Para tanto, basta declarar a seguinte instrução:
        Seek(Arquivo,FileSize(Arquivo));

IX.3.5 - IORESULT

IORESULT é uma variável pré-definida no Turbo Pascal que assume determinados valores inteiros, quando algum erro de Entrada/Saída ocorre.

        IORESULT pode assumir os seguintes valores:

01       Arquivo não existe
02       Arquivo não foi aberto para entrada Provavelmente, você está tentando ler de um arquivo que ainda não foi aberto.
03       Arquivo não foi aberto para saída  Provavelmente, você está tentando escrever num arquivo que ainda não foi aberto.
04       Arquivo não aberto Este tipo de erro costuma acontecer quando tentamos utilizar as procedures BlockRead ou BlockWrite sem antes usarmos Reset ou Rewrite.
16       Erro no formato numérico Quando tentamos ler uma string de um arquivo texto, para uma variável numérica que não está de acordo com o formato numérico.
32       Operação não permitida para um dispositivo lógico. Por exemplo, você tenta ler de um arquivo que foi assinalado para a impressora.
33       Não permitido no modo direto.
34       Não permitido assinalação para arquivos standards.
144     Erro de comprimento de registros. Por exemplo, você tenta ler um registro que contém um número inteiro, e uma string para uma variável de estrutura diferente.
145     Seek dado para uma posição posterior ao final do arquivo.
153     Fim de arquivo foi alcançado antes de se encontrar o CTRL-Z.
240     Erro de escrita no disco.
241     Diretório cheio
242     Overflow do comprimento do arquivo.
243     Arquivo desapareceu.
Imagine que antes de se executar um close() você troque o disco.

IX.3.6 - LongFilePos

Esta função deve ser utilizada em lugar da FilePos quando o arquivo em questão tiver mais de 32K.

IX.3.7 - LongFileSize

Esta função deve ser utilizada em lugar de FileSize quando o arquivo em questão tiver mais de 32K.

IX.3.8 - LongSeek

Esta função deve ser utilizada em lugar de Seek para arquivos maiores de 32K.

IX.4 - Arquivos Textos

IX.4.1 - Definição

Os arquivos textos são utilizados para uma série de aplicações, que não são cobertas pelos arquivos, cujos conteúdos são dados binários. Exemplo: Wordstar, Word, Dbase III etc.
Para declarar um arquivo como sendo do tipo Texto, procedemos da seguinte forma:
                Var Arquivo : Text;
Após esta declaração, o Turbo Pascal aloca um buffer de 128 bytes para as operações de entrada e saída com relação ao arquivo. Nós podemos modificar o tamanho desse buffer da seguinte forma:

                Var Arquivo : Text[256];

Da mesma forma que nos arquivos não textos, devemos assinalar o nome lógico e em seguida, abrir o arquivo para então podermos ler ou escrever dados no arquivo.

IX.4.2 - Procedures e Functions para arquivos texto

IX.4.2.1 - Append

Esta procedure abre um arquivo do tipo texto para inclusão de dados no final do arquivo.

Sintaxe:

                Append(Arquivo);

IX.4.2.2 - Readln

Lê uma linha de dados de um arquivo de texto, isto é, lê dados do arquivo até que se encontre um fim de linha.

Sintaxe:

                Readln(Arquivo,Variável);

        Arquivo deverá ser do tipo Text e a variável do tipo String.

IX.4.2.3 - Writeln

Escreve uma linha de dados no arquivo, isto é, escreve dados e mais o fim de linha.

Sintaxe:

        Writeln(Arquivo,Variável);

        Arquivo deverá ser do tipo Text e a variável do tipo String.

        Exemplo:

Program Exemplo;
        Uses CRT;
        Var frase : String[200];
            a     : Text;
        Begin
           ClrScr;
           Assign(a,'arquivo.dta');
           ReWrite(a);
           Frase:=' ';
           While Frase<>'fim' do
           Begin
              Write('Frase --> ');
              Readln(frase);
              Writeln(a,frase);
           End;
           Close(a);
           Reset(a);
           ClrScr;
           While not eof(a) do
           Begin
              Readln(a,frase);
              Writeln(frase);
           End;
           Close(a);
        End.

IX.4.2.4 - Eoln

Esta função retorna um TRUE se foi alcançado um fim de linha no arquivo texto. Sintaxe:

        Eoln(arquivo);

        Onde arquivo tem que ser do tipo texto.