[Pascal] Tri de fichiers
Fermé
carmel001
-
18 juil. 2008 à 18:04
KX Messages postés 16741 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 30 mai 2024 - 25 mai 2009 à 10:05
KX Messages postés 16741 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 30 mai 2024 - 25 mai 2009 à 10:05
A voir également:
- [Pascal] Tri de fichiers
- Wetransfer gratuit fichiers lourd - Guide
- Turbo pascal download - Télécharger - Édition & Programmation
- My pascal - Télécharger - Édition & Programmation
- Explorateur de fichiers - Guide
- Tri excel - Guide
9 réponses
KX
Messages postés
16741
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
30 mai 2024
3 016
18 juil. 2008 à 20:10
18 juil. 2008 à 20:10
Pour de gros fichiers, il est préférable de prendre en compte la compléxité du tri, la meilleure étant en n.log n, le programme qui suit est un tri par fusion qui admet une complexité en n.log n !
Le type Elem peut être n'importe quoi du moment que l'opération < est un sens entre deux éléments...
Le tri par fusion est très efficace cependant il prend de la place, c'est pourquoi le programme utilise un fichier auxiliaire qu'il créé puis efface (il prends autant de place que le fichier à trier)
La confiance n'exclut pas le contrôle
Le type Elem peut être n'importe quoi du moment que l'opération < est un sens entre deux éléments...
Le tri par fusion est très efficace cependant il prend de la place, c'est pourquoi le programme utilise un fichier auxiliaire qu'il créé puis efface (il prends autant de place que le fichier à trier)
program TriParFusion; type Elem=string; // par exemple Fichier=file of Elem; procedure Attribuer(var F,F2:Fichier;i,j:integer); // F[i]:=F2[j] var s:Elem; begin seek(F2,j); read(F2,s); seek(F,i); write(F,s); end; function Comparer(var F,F2:Fichier;i,j:integer):boolean; // F[i]<F2[j] ? var s,t:Elem; begin seek(F,i); read(F,s); seek(F2,j); read(F2,t); result:=(s<t); end; procedure TriFusionAux(var F,F2:Fichier; G,D:Integer); var m,i,j,k:Integer; begin if D>G then begin m:=(G+D) div 2; TriFusionAux(F,F2,G,m); TriFusionAux(F,F2,m+1,D); for i:=m downto G do Attribuer(F2,F,i,i); for j:=m+1 To D do Attribuer(F2,F,d+m+1-j,j); i:=G; j:=D; for k:=G to D do begin if Comparer(F2,F2,i,j) then begin Attribuer(F,F2,k,i); inc(i); end else begin Attribuer(F,F2,k,j); dec(j); end; end; end; end; procedure TriFusion(Source,Auxiliaire:String); var F,F2:Fichier; s:Elem; begin assign(F,Source); reset(F); assign(F2,Auxiliaire); rewrite(F2); while not eof(F) do begin read(F,s); write(F2,s); end; TriFusionAux(F,F2,0,filesize(F)-1); close(F2); erase(F2); close(F); end; var source,auxiliaire:string; begin write('Fichier a trier : '); readln(source); TriFusion(source,source+'.tmp'); end.--
La confiance n'exclut pas le contrôle
KX
Messages postés
16741
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
30 mai 2024
3 016
18 juil. 2008 à 21:49
18 juil. 2008 à 21:49
Pour supprimer un élément tout en conservant l'ordre du fichier (je n'ai pas vérifié mais ça devrait être bon) :
La confiance n'exclut pas le contrôle
type Elem=string; // par exemple Fichier=file of Elem; procedure Supprimer(source:string;e:Elem); var f:Fichier; i,k:integer; s:Elem; begin assign(f,source); reset(f); i:=-1; while not eof(f) do begin read(f,s); if s=e then i:=filepos(f); end; if i>=0 then begin for k:=i to filesize(f)-2 do begin seek(f,k+1); read(f,s); seek(f,k); write(f,s); end; truncate(f); end; close(f); end;--
La confiance n'exclut pas le contrôle
KX
Messages postés
16741
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
30 mai 2024
3 016
18 juil. 2008 à 19:42
18 juil. 2008 à 19:42
Tout d'abord, il faut savoir qu'il existe deux types de fichiers qui ne se manipulent pas pareil :
Les fichiers "Text" et les les fichiers "File of Elem" où Elem est un type quelconque.
Pour le tri, il existe plusieurs méthodes, plus ou moins facile à mettre en place, plus ou moins rapide...
Quant à la suppression d'un élément tout dépend si tu souhaites conserver le tri après la suppression...
Précise nous le type de fichier que tu utilises, ainsi que sa taille (ça peut servir), ainsi que ce que tu veux faire pendant la supression...
Les fichiers "Text" et les les fichiers "File of Elem" où Elem est un type quelconque.
Pour le tri, il existe plusieurs méthodes, plus ou moins facile à mettre en place, plus ou moins rapide...
Quant à la suppression d'un élément tout dépend si tu souhaites conserver le tri après la suppression...
Précise nous le type de fichier que tu utilises, ainsi que sa taille (ça peut servir), ainsi que ce que tu veux faire pendant la supression...
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
apré avoir ouvrir le fichier à trier:
tanque(non fin fichier (f)) faire
*********on fait l'appel a procédure tri a votre choisir en méme typede paramétre)
*exp:
tri_sel(ch1,.)................
merci
tanque(non fin fichier (f)) faire
*********on fait l'appel a procédure tri a votre choisir en méme typede paramétre)
*exp:
tri_sel(ch1,.)................
merci
Je veux savoir comment écrire un programme qui permet de représenter une table ASCII particulière à partir d'une matrice carrée d'ordre n (n étant une constante=8).
Les étapes de ce programme sont:
1- Remplir la matrice par le caractère "0" ou "1".
2- Transférer dans un fichier FL stocké physiquement sous "D:\lignes.txt". la réprésentation de la séquence binaire formant chaque ligne de la matrice.
FL est un fichier d'ascii.un ascii est une structure qui remferme les champs suivant:
num:numéro de la ligne ou existe la séquence binaire dans la matrice.
code_bin: séquence binaire sur une ligne donnée de la matrice.
code_dec: l'équivalent en décimal de la séquence binaire.
code_duo: l'équivalent en duodécimal (base 12) de la séquence binaire.
car: caractère équivalent de séquence binaire.
3- Transférer dans un fichier FC stocké physiquement sous "D:\colonnes.txt". la représentation de la séquence binaire formant chaque colonnes de la matrice.
FC est un fichier d'ascii.
4- Programmer un petit jeu qui consiste à deviner un caractère choisi aléatoirement par l'ordinateur, des caractères existants dans le fichier "lignes.txt" ou "colonnes.txt" et de calculer et afficher le nombre de coups pris pour le deviner ainsi que à qui appartient ce caractère (au fichier lignes ou colonnes).
S'IL VOUS PLAIT RÉPOND MOI VITE ET MERCI.
Les étapes de ce programme sont:
1- Remplir la matrice par le caractère "0" ou "1".
2- Transférer dans un fichier FL stocké physiquement sous "D:\lignes.txt". la réprésentation de la séquence binaire formant chaque ligne de la matrice.
FL est un fichier d'ascii.un ascii est une structure qui remferme les champs suivant:
num:numéro de la ligne ou existe la séquence binaire dans la matrice.
code_bin: séquence binaire sur une ligne donnée de la matrice.
code_dec: l'équivalent en décimal de la séquence binaire.
code_duo: l'équivalent en duodécimal (base 12) de la séquence binaire.
car: caractère équivalent de séquence binaire.
3- Transférer dans un fichier FC stocké physiquement sous "D:\colonnes.txt". la représentation de la séquence binaire formant chaque colonnes de la matrice.
FC est un fichier d'ascii.
4- Programmer un petit jeu qui consiste à deviner un caractère choisi aléatoirement par l'ordinateur, des caractères existants dans le fichier "lignes.txt" ou "colonnes.txt" et de calculer et afficher le nombre de coups pris pour le deviner ainsi que à qui appartient ce caractère (au fichier lignes ou colonnes).
S'IL VOUS PLAIT RÉPOND MOI VITE ET MERCI.
loulou_89
Messages postés
2
Date d'inscription
mercredi 18 mars 2009
Statut
Membre
Dernière intervention
24 mai 2009
23 mai 2009 à 20:40
23 mai 2009 à 20:40
Bonjour
S'il vous plaît
Si possible, expliquez-moi Cette partie de la solution
la solution
if i>=0 then begin
for k:=i to filesize(f)-2 do
begin
seek(f,k+1);
read(f,s);
seek(f,k);
write(f,s);
end;
truncate(f);
end;
close(f);
end;
S'il vous plaît
Si possible, expliquez-moi Cette partie de la solution
la solution
if i>=0 then begin
for k:=i to filesize(f)-2 do
begin
seek(f,k+1);
read(f,s);
seek(f,k);
write(f,s);
end;
truncate(f);
end;
close(f);
end;
KX
Messages postés
16741
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
30 mai 2024
3 016
24 mai 2009 à 14:58
24 mai 2009 à 14:58
if i>=0 then begin // si i positif for k:=i to filesize(f)-2 do // pour k de i à la fin du fichier -1 begin seek(f,k+1); // aller à la position k+1 dans le fichier f read(f,s); // lire la donnée (à k+1) dans s seek(f,k); // revenir à la position k write(f,s); // écrite la donnée s à la position k end; truncate(f); // découper f (à la fin du fichier -1) end; close(f); // fermer f end;En fait tu prends une donnée, et tu l'écris juste à la position d'avant ce qui fait un décalage de 1, et à la fin tu "coupes" le fichier...
Exemple :
f=[1,2,3,4,5,6] i=2 k=2 -> f=[1,2,4,4,5,6] k=3 -> f=[1,2,4,5,5,6] k=3 -> f=[1,2,4,5,6,6] truncate f=[1,2,4,5,6]Et voilà comment on fait une suppression dans un tableau tout en conservant le tri
ps. j'ai pas vraiment vérifié si l'algo était juste, mais si tu dis que c'est la solution... ça doit être ça !
loulou_89
Messages postés
2
Date d'inscription
mercredi 18 mars 2009
Statut
Membre
Dernière intervention
24 mai 2009
24 mai 2009 à 19:20
24 mai 2009 à 19:20
et comment ajouter un élément
KX
Messages postés
16741
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
30 mai 2024
3 016
25 mai 2009 à 10:05
25 mai 2009 à 10:05
On fait l'inverse (ici j'insère un élément s0)
for k:=filesize(f) downto 1 do begin seek(f,k-1); read(f,s); seek(f,k); // ps. ce déplacement est inutile if (s>s0) then write(f,s); else begin write(f,s0); break; // on sort de la boucle end; end; close(f); end;