Rechercher : dans
Par :

[Pascal] Tri de fichiers

Dernière réponse le 25 mai 2009 à 10:05:20 carmel001, le 18 jui 2008 à 18:04:13 
 Signaler ce message aux modérateurs

Bonjour,je desire savoir comment trier un fichier en pascal et comment suprimer un element dans un fichier.merci de votre aide .

Configuration: Windows XP
Internet Explorer 6.0

Meilleures réponses pour « [Pascal] Tri de fichiers » dans :
Pascal - Tri par insertion - Récursivité- Voir Voici une procédure récursive qui permet de trier un tableau de n entiers en utilisant la méthode de tri par insertion : Procedure Tri_Ins (Var t: TAB; n: integer); Var aux,i : integer; begin If n > 1 Then begin ...
Tri Shell -Recursive- VoirVoici une procédure récursive qui permet de trier un tableau de n entiers en utilisant la méthode de tri Shell : Procedure Tri_Shell_Rec (Var t: TAB; n,h : integer); Var aux,i : integer; begin If h > 0 Then Begin If n > h...
Windows 7 - Dossiers et fichiers VoirExplorez votre PC : dossiers et fichiers Tous les fichiers nécessaires au fonctionnement de votre ordinateur, qu’il s’agisse de ceux de Windows, des logiciels installés ou des périphériques que vous utilisez, ainsi que vos fichiers personnels, sont...
Apache - Les fichiers .htaccess VoirLes fichiers .htaccess sont des fichiers de configuration d'Apache, permettant de définir des règles dans un répertoire et dans tous ses sous-répertoires (qui n'ont pas de tel fichier à l'intérieur). On peut les utiliser pour protéger un répertoire...
Partage de fichiers sous Windows XP VoirIntérêt Le partage de fichiers consiste à rendre disponible à travers le réseau le contenu d'un ou plusieurs répertoires. Tous les systèmes Windows possèdent en standard des mécanismes permettant de mettre facilement en partage le...

1

KX, le 18 jui 2008 à 19:42:06

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... La confiance n'exclut pas le contrôle

Répondre à KX

2

KX, le 18 jui 2008 à 20:10:20
  • +1

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)

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

Répondre à KX

3

KX, le 18 jui 2008 à 21:49:37
  • +1

Pour supprimer un élément tout en conservant l'ordre du fichier (je n'ai pas vérifié mais ça devrait être bon) :

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

Répondre à KX

4

chatdeba, le 9 jan 2009 à 23:01:37

C DE LA MEEEEEEEEEEEERDE

Répondre à chatdeba

5

seif, le 25 jan 2009 à 20:42:46

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

Répondre à seif

6

Chaw9mar, le 27 mar 2009 à 12:55:16

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.

Répondre à Chaw9mar

7

loulou_89, le 23 mai 2009 à 20:40:03

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;

Répondre à loulou_89

8

KX, le 24 mai 2009 à 14:58:12

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 ! La confiance n'exclut pas le contrôle 

Répondre à KX

9

loulou_89, le 24 mai 2009 à 19:20:50

Et comment ajouter un élément

Répondre à loulou_89

10

 KX, le 25 mai 2009 à 10:05:20

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;
La confiance n'exclut pas le contrôle 

Répondre à KX