Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- program testeArq;
- uses crt;
- type
- registro = record
- nome: string;
- idade: integer;
- end;
- tipoArq = file of registro;
- {====================================================================}
- procedure procurarItem (var arq: tipoArq; nome: string; var poscicaoItem: integer);
- var
- regAux: registro; // registro auxiliar para comparar o nome procurado com o nome do registro. o auxiliar se move pelo arquivo da turma
- achou: boolean; // variavel que indica se o aluno foi encontrado (<ACHOU> = TRUE) ou não encontrado (<ACHOU> = FALSE)
- begin
- seek(arq,0); // posiciona no começo do arquivo
- poscicaoItem:= -1; // para quando começar o contador na primeira posicao do arquivo, poscicaoItem = 0;
- achou:= false; // inica a variável de encontro como FALSE
- while (achou = false) and not eof(arq) do // enquanto não achou o aluno ou o arquivo não acabou -->
- begin
- read(arq,regAux); // --> lê uma linha (aponta pra i --> aponta pra i+1)
- if (nome = regAux.nome) then achou:= true; // --> se achou ... muda a variável de encontro
- poscicaoItem:= poscicaoItem + 1; // --> contador da posicao do aluno
- end;
- if achou = false then poscicaoItem:= -1; // se não achou --> define a posição como -1
- end;
- {====================================================================}
- procedure adicionarItem (var arq: tipoArq);
- var
- nome: string; // variáveis que receberam os dados informados pelo usuário
- idade: integer;
- regTemp,aux1,aux2: registro; // Registro temporário para armazenar os dados antes de salvar no arquivo
- poscicaoItem: integer; // variável usada para verificar se o item já se encontra no arquivo. se ele não está no arquivo (poscicaoItem = -1)
- begin
- write('nome: ');
- readln(nome); // Recebe e passa por tratamento de erro o nome
- procurarItem(arq,nome,poscicaoItem); // Procura se existe um item com mesmo nome no arquivo (retorna a posição se encontrar e -1 se encontrar)
- if poscicaoItem >= 0 then writeln('O item já está cadastrado nessa turma.'#13#10) // Se já exsite o item no arquivo: mensagem
- else // Se não existe -->
- begin
- write('idade: '); // --> recebe os dados restantes
- readln(idade);
- regTemp.nome:= nome; // --> armazena os dados em um registro temporário antes de salvar no arquivo
- regTemp.idade:= idade;
- // Inserir ordenado
- if filesize(arq)=0 then // --> se o arquivo da turma está vaio ...
- begin // --> ... grava os dados na primeira posição
- seek(arq, 0);
- write(arq,regTemp);
- end
- else // --> se já existiam outros itens no arquivo ...
- begin
- reset(arq);
- while not eof(arq) do // --> ... até o final do arquivo ***
- begin
- read(arq,aux1); // --> ... *** grava o item da posição atual num registro auxiliar temporário
- if aux1.nome>regTemp.nome then // --> ... *** compara os nomes dos itens (ordenção por ordem alfabética)
- begin
- seek(arq, filepos(arq)-1); // --> ... *** volta posição ponteiro para se escrever na posição desejada
- aux2:=aux1; // --> ... *** (o ultimo item não é gravado dentro do while)
- write(arq,regTemp);
- regTemp:=aux2;
- end;
- end;
- seek(arq, filesize(arq)); // --> ... grava o ultimo item no arquivo
- write(arq, regTemp);
- end;
- writeln(#13#10'Item adicionado com sucesso!');
- end;
- end;
- {====================================================================}
- // Ordena os registros de um arquivo
- procedure ordenarArquivo(var arq: tipoArq);
- var
- aux, valorProx, valorPos: registro;
- indicePos, indicePosProx: integer; // indice de posição, indice da próxima posição
- begin
- for indicePos:=0 to filesize(arq)-1 do
- begin
- for indicePosProx:=indicePos+1 to filesize(arq)-1 do
- begin
- seek(arq,indicePos);
- read(arq,valorPos);
- seek(arq,indicePosProx);
- read(arq,valorProx);
- if valorProx.nome < valorPos.nome then
- begin
- aux.nome:= valorProx.nome;
- aux.idade:= valorProx.idade;
- valorProx.nome:= valorPos.nome;
- valorProx.idade:= valorPos.idade;
- valorPos.nome:= aux.nome;
- valorPos.idade:= aux.idade;
- seek(arq,indicePos);
- write(arq,valorPos);
- seek(arq,indicePosProx);
- write(arq,valorProx);
- end;
- end;
- end;
- end;
- {====================================================================}
- procedure excluirItemArquivo(var arq: tipoArq; posicaoAluno: integer);
- var
- posicao: integer; // indice da posição, usado para ir da posição do aluno até a penultima posição
- regAux: registro; // registro auxiliar, usado para salvar temporariamente registros no processo de exclusão
- begin
- if filesize(arq)=1 then // se o arquivo da turma só tem 1 aluno -->
- begin
- rewrite(arq); // --> apaga o arquivo antigo e cria um novo arquivo vazio
- end
- else
- begin
- if posicaoAluno = filesize(arq) - 1 then // se o aluno a ser exluido se encontra na ultima posição do registro -->
- begin
- seek(arq,posicaoAluno); // --> posiciona na penultima posição
- truncate(arq); // --> apaga tudo abaixo da penultima posição
- end
- else // se não se encontra na ultima posição -->
- begin
- seek(arq,posicaoAluno); // --> posiciona no aluno
- for posicao:= posicaoAluno to filesize(arq) - 2 do // --> da posição do aluno (i) até a penultima posição ...
- begin
- seek(arq,posicao+1); // --> ... pula para a proxima posicao (i + 1)
- read(arq,regAux); // --> ... salva o proximo
- seek(arq,posicao); // --> ... volta pra posicao do aluno (i)
- write(arq,regAux); // --> ... substitui o aluno a ser excluido pelo aluno seguinte
- end;
- // [ no final, o ultimo e o penultimo aluno vao ser iguais, por isso: ]
- seek(arq,filesize(arq)-1); // --> posiciona na penultima posição
- truncate(arq); // --> apaga tudo abaixo da penúltima posição
- end;
- end;
- end;
- {====================================================================}
- {====================================================================}
- var
- rec,recAux: registro;
- arq: tipoArq;
- op: integer;
- nome: string;
- i,posicaoItem: integer;
- begin
- assign(arq,'dados.dat');
- {$I-}
- reset(arq);
- {$I+}
- if ioresult = 2 then rewrite(arq);
- repeat
- begin
- clrscr;
- writeln('1. Inserir');
- writeln('2. Inserir ordenado');
- writeln('3. Ordenar');
- writeln('4. Excluir');
- writeln('5. Imprimir');
- write('op: '); readln(op);
- case op of
- 1:begin
- write('Nome: ');
- readln(recAux.nome);
- write('Idade: ');
- readln(recAux.idade);
- seek(arq,filesize(arq));
- write(arq,recAux);
- end;
- 2:begin
- adicionarItem(arq);
- end;
- 3:begin
- ordenarArquivo(arq);
- end;
- 4:begin
- write('nome: ');
- readln(nome);
- procurarItem(arq,nome,posicaoItem);
- excluirItemArquivo(arq,posicaoItem);
- end;
- 5:begin
- for i:= 0 to filesize(arq)-1 do
- begin
- seek(arq,i);
- read(arq,recAux);
- writeln(recAux.nome,' - ',recAux.idade);
- end;
- end;
- 0:begin
- end;
- end;
- readkey;
- end;
- until op = 0;
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement