Ir ao conteúdo
  • Cadastre-se

Problema com ordenação em arquivo de texto


Posts recomendados

Bem, é o seguinte:
 
Meu professor passou esse execício:
 
1) •  Faça um programa que leia um número N e gere
um arquivo com N nomes e idades aleatórios
– Faça uso de dois arquivos criados na mão: um que
contenha 20 nomes e outro que contenha 20
sobrenomes
– Gere aleatoriamente de 0 a 2 iniciais de nome do meio
e a idade
– Cada linha deve conter um nome completo e a sua
idade
 
Eu resolvi ele dessa forma

program sorting;var    nomes, sobrenomes, nomes_sobrenomes: text;    nome, sobrenome: string;    num, i, j, k, aux: integer;    vetor_nomes: array [1..20] of string;    vetor_sobrenomes: array [1..20] of string;begin    randomize();    write('Quantos nomes e idades deseja gerar?: ');    readln(num);    assign(nomes, 'Nomes.txt');    assign(sobrenomes, 'Sobrenomes.txt');    assign(nomes_sobrenomes, 'Nomes_Sobrenomes.txt');    reset(nomes);    reset(sobrenomes);    rewrite(nomes_sobrenomes);    i:=1;    while not eof(nomes) do    begin        readln(nomes, nome);        vetor_nomes[i]:= nome;        i:= i + 1;    end;    j:= 1;    while not eof(sobrenomes) do    begin        readln(sobrenomes, sobrenome);        vetor_sobrenomes[j]:= sobrenome;        j:= j + 1;    end;    for k:= 1 to num do    begin        aux:= random(3);        if aux = 0 then            writeln(nomes_sobrenomes, vetor_nomes[1 + random(20)], ' ', vetor_sobrenomes[1 + random(20)], ' ', 1 + random(100))        else if aux = 1 then            writeln(nomes_sobrenomes, vetor_nomes[1 + random(20)], ' ', chr(65 + random(25)),'.', ' ', vetor_sobrenomes[1 + random(20)], ' ', 1 + random(100))        else            writeln(nomes_sobrenomes, vetor_nomes[1 + random(20)], ' ', chr(65 + random(25)),'.', ' ', chr(65 + random(25)),'.', ' ', vetor_sobrenomes[1 + random(20)], ' ', 10 + random(80));    end;    close(nomes);    close(sobrenomes);    close(nomes_sobrenomes);readln;end.


 
Queria qual seria a melhor maneira pra resolver esse exercício. Tenho certeza que não é a maneira mais inteligente de se fazer isso, mas foi a única forma que encontrei.
 
Logo em seguida, meu professor passou esse:
 
2) Faça um programa que leia o arquivo de nomes e
idades aleatórios do exercício anterior e gere um
arquivo de índice ordenado por nome
– Cada linha do arquivo de índice deve conter o número
da linha equivalente do arquivo aleatório
•  Faça um programa que leia o arquivo de nomes e
idades aleatórios do exercício anterior e gere um
arquivo de índice ordenado por idade
– Cada linha do arquivo de índice deve conter o número
da linha equivalente do arquivo aleatório
 
Eu só consegui fazer o da ordenação por nome, que ficou assim:

program sorting;var    ordnome, nomes: text;    nome, aux: string;    vetornome: array[1..10] of string;    i, j, k: integer;begin    assign(nomes, 'Nomes_Sobrenomes.txt');    assign(ordnome, 'Ordenação por nome.txt');    reset(nomes);    rewrite(ordnome);    i:= 1;    while not eof(nomes) do    begin        readln(nomes, nome);        vetornome[i]:= nome;        i:= i + 1;    end;    for j:= 1 to 10 do    for k:= j+1 to 10 do    if vetornome[j] > vetornome[k] then    begin        aux:= vetornome[j];        vetornome[j]:= vetornome[k];        vetornome[k]:= aux;    end;    for i:= 1 to 10 do    writeln(ordnome, vetornome[i], ' ');    close(nomes);    close(ordnome);readln;end.


 
Também tenho certeza que essa não é a melhor forma. Queria saber como posso ordenar por nome e por idade elementos de um arquivo.txt. Obrigado ai à quem se dispor à ajudar =D.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá.

 

Analisei superficialmente e achei que o código está bom... está dando algum erro?

 

Uma sugestão: acho que seria melhor iniciar os "contadores" com 0, em vez de 1... daí basta ajustar dentro do laço, exemplo:
 

    i:=0;    while not eof(nomes) do    begin        i:= i + 1;        readln(nomes, nome);        vetornome[i]:= nome;    end;

Desta forma, o "i" está com a "quantidade correta.

 

E lá no método de ordenação, creio que precisa de um pequeno ajuste... (se não me engano, se trata do princípio do código do Bubble Sort*)

    for j:= 1 to 10 do       for k:=j+1 to 10 do

Acho que o <j> vai somente até 9, já que não existe "k=11", correto? (o último deve ser i:=9 e k=10)
 

 

*Por sinal, creio que o código do Wikipédia esteja errado.. :|

 

 

No aguardo.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Tá compilando de boa e funcionando normalmente. Mas é aquilo, eu acho que essa não é a melhor forma de se fazer esse exercício. E eu também não consegui ordenar por idade.

Eu não faço a mínima ideia de como ler os valores do arquivo e desprezar a parte de string e só pegar a idade la no final.

 

Valeu ai, ajustei o código aqui conforme voce disse.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá.
 

Tá compilando de boa e funcionando normalmente. Mas é aquilo, eu acho que essa não é a melhor forma de se fazer esse exercício. E eu também não consegui ordenar por idade.
Eu não faço a mínima ideia de como ler os valores do arquivo e desprezar a parte de string e só pegar a idade la no final.
 
Valeu ai, ajustei o código aqui conforme voce disse.


Como você mesmo sugere, os dados estão armazenados como string... mas, em relação a esse problema, já tem duas informações importantes: 1) as idades são números, e nomes não contém eles. 2) a idade sempre é a "última palavra" da lista. Ou seja, você pode tanto tentar achar a idade localizando o "primeiro número" ou "copiar a última 'palavra'" da lista... por ai vai..

 

Comandos que podem ser úteis:
- copy();

- pos();

- chr();

- ord;

- Length();

etc

 

No aguardo.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...