exercice delphi...besoin d'un coup de main

exercice delphi...besoin d'un coup de main - Delphi/Pascal - Programmation

Marsh Posté le 14-05-2004 à 14:39:28    

salut, pour mes revisions d'exam j'ai l'examen de l'année derniere mais j'ai du mal a le resoudre...je suis en train de bosser dessus et je posterai les reponses que je trouve au fur et a mesure, mais j'avance vraiment pas vite, alors si vous puviez me filez un coup de main, me donner des pistes...j'ai commencé delphi ce semestre donc pas de trucs hyper compliqués, ce qui me pose surtout probleme c'est les commandes pour manipuler les fichiers, les tableaux ca va...voila le sujet :
 
 
 

Citation :


on considere le type Tmot equivalent à une chaine de caracteres de longueur 20.on considere egalement trois fichiers non vides supposes places dans le repertoire courant de l’application que l’on vous demande d’ecrire.
-le premier fichier pays.dat contient environ 250 donnees de type Tmot correspondant a des noms de pays.
-le deuxieme ville.dat contient environ 3000 donnees de type Tmot correspondant a des noms de ville
-le troisieme fichier pop.dat est constitue d’enregistrements composes de trois champs entiers :
  -le premier entier est le numero d’enregistrement de le ville dans le deuxieme fichier
  -le deuxime fichier est le numero d’enregistrement du pays dans le premier fichier
  -le troisieme est le nombre d’habitants dans cette ville.
 
 
QUESTIONS
a)definir un type Tville pour pouvoir stocker une ville, son pays et sa population(2 TMot et un entier), et un type Ttab pour stocker dans un tableau l’ensemble des donnees sur les villes.
 
b)ecrire une procedure qui remplit la variable data de type Ttab avec les donnees du fichier pop.dat en remplacant les numeros d’enregistrement par leurs valeurs qu’il faut recuperer dans les fichiers ville.dat et pays.dat  
 
c)ecrire une fonction qui renvoie la ville ayant la plus grande population a partir de données de type Ttab.
 
d)ecrire une procedure qui trie une variable data de type Ttab en fonction du nom du pays.
 
e) en supposant que la procedure d) a ete execute, ecrire une fnction qui renvoie le pays ayant la plus grande population calculee a partir des villes reprensentées.
 
f)ecrire une procedure ppour sauvegarder dans un fichier texte une variable data de type Ttab ou les données pour chaque lignes sont separes par « ; ».


 
REPONSES
 
a) type Tville = record
              ville, pays : Tmot ;
         pop :integer ;
 end ;
  Ttab = array of Tville ;
(Est-ce que c’est un tableau dynamique qu’il faut utilisé ?)
 
 

Reply

Marsh Posté le 14-05-2004 à 14:39:28   

Reply

Marsh Posté le 14-05-2004 à 14:50:31    

À part la mise en forme du code qui n'est pas très belle (il ne faut pas d'espace devant les ":" et ";" ) c'est bon je suppose.
Quand à savoir si c'est un tableau dynamique qu'il faut utiliser, vu le peu de détails donnés dans la question "a" je suppose que c'est ça.


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 14-05-2004 à 15:08:07    

antp a écrit :

À part la mise en forme du code qui n'est pas très belle (il ne faut pas d'espace devant les ":" et ";" ) c'est bon je suppose.
Quand à savoir si c'est un tableau dynamique qu'il faut utiliser, vu le peu de détails donnés dans la question "a" je suppose que c'est ça.


 
ok...
j'arrive vraiment pas a faire le b) t'as une idee ?la reponse du c) arrive.

Reply

Marsh Posté le 14-05-2004 à 15:15:04    

Tu déclares une variable comme file of Integer pour lire pop.dat, et des variables file of TMot pour les deux autres.
Puis avec les fonctions de manipulation de fichier (AssignFile, Reset, Read, CloseFile) tu lis tes infos. Pour agrandir le tableau avant de lire tu fais chaque fois un SetLength.


Message édité par antp le 14-05-2004 à 15:16:44

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 14-05-2004 à 15:26:37    

niiico a écrit :

ok...
j'arrive vraiment pas a faire le b) t'as une idee ?la reponse du c) arrive.


 
 
voila le c)
 
function max(data:ttab):string;
 var i,j :integer;
begin
j:=0;
        for i:=j+1 to taille-1 do
          if t[i].pop>t[j].pop then j:=i;
 result:=data[j].ville;
 
end;
 
j c'est l'indice du tableau.
alors c ca?

Reply

Marsh Posté le 14-05-2004 à 15:28:45    

Par exemple, oui
 
Sinon pour la façon de taper le code :
 
http://community.borland.com/artic [...] 80,00.html
 
(quand t'as le temps de le lire, ça vaut le coup pour faire du code lisible et dans le même style que le code qu'on recontre ailleurs)


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 14-05-2004 à 15:37:55    

procedure remplirdata (data :Ttab)
     var fic1:file of integer;
           fic2,fic3: file of Tmot;
begin
assignfile(fic1,pop.dat);
assignfile(fic2,pays.dat);
assignfile(fic3,ville.dat);
 
c ca pour le debut?
bon apres en fait c quoi le principe? est-ce qu'il suffit simplement de lire ces fichiers pour les mettre dans les var fic1,fic2,fic3 et ensuite travailler sur les var? et pour separer les 3 données de chq enregistrements de pop.dat est-ce que ca le fait tout seul ou je dois faire qqchoz?

Reply

Marsh Posté le 14-05-2004 à 15:57:25    

pour la question d) :

Citation :


procedure echange(out e1,e2:Tville);
var aux:Tville;
begin
  aux:=e1;
   e1:=e2;
   e2:=aux;
 end;
 
function min(data:ttab):integer;
 var i :integer;
begin
result:=0;
        for i:=1 to taille-1 do
          if t[i].pays<t[j].pays then result:=i;
 
end;
 
 
 function trier(data:Ttab):Ttab;
var i:integer;
begin
for i:=0 to taille-2 do
echange(t[i],t[min(t)]);
result:=data;
end;


 
le probleme c'est que c'est une fonction et qu'ils demandent une procedure...selon toi quel est le meilleur tri?

Reply

Marsh Posté le 14-05-2004 à 15:59:37    

bon ben t'as plus l'air d'etre la antp alors si tu reviens n'hésite pas hein ;) en tout cas merci pour ton aide...
sinon les autres vous avez des idées ??? :D

Reply

Marsh Posté le 14-05-2004 à 17:54:24    

bon y a plus personne pour m'aider  :cry:  je n'aurai pas acces a internet ce week end mais si vous voulez m'aidez qd meme ce serait gentil (y a bien qq1 pour qui c'est tres facile tout ca hein antp ;) )

Reply

Marsh Posté le 14-05-2004 à 17:54:24   

Reply

Marsh Posté le 14-05-2004 à 18:35:28    

Ta procédure, déclare-la comme ceci :
 
procedure trier(var data: Ttab);
 
de cette manière les modifs que tu fais sur data seront répercutées sur la variable de la fonction qui a appelé trier;
 
De la même manière, ta fonction echange devrait recevoir un var et non un out. Le mot-clé out indique que l'on se fout de la valeur qu'il pourrait y avoir dans la variable, ce qui n'est pas le cas ici (dans certains cas la valeur pourrait ne pas être transmise, ce qui poserait problème ici).
 
Pour les fichiers, le plus simple est de consulter l'aide de Delphi, il doit y avoir des exemples de lecture de fichiers typés (càd des file of qqchose) et des infos utiles dans l'aide des différentes fonctions dont j'ai parlé précédemment...


Message édité par antp le 14-05-2004 à 18:37:33

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 17-05-2004 à 14:59:27    

pour la question b) j'ai essayé de continuer un peu...
 

Citation :


procedure remplirdata (data :Ttab)
     var fic1:file of integer;
           fic2,fic3: file of Tmot;
begin
assignfile(fic1,pop.dat);
assignfile(fic2,pays.dat);
assignfile(fic3,ville.dat);
reset(fic1,1) //le deuxieme parametre pour metre la taille des blocks à 1
blockread(fic1,data[0],taille du fichier pop.dat) ;
//le deuxieme parametre pour copier fic1 dans data (je suis pas sur de devoir mettre le [0]
//le dernier parametre pour dire combien de blocks copier


 
Questions :  
- est-ce que chaque enregistrement sera mis automatiquement dans le tableau sans faire un truc du genre : « data[0].ville :=… »
exemple : si le premier enregistrement de pop.dat est    4     1     285000
est ce que il va faire tout seul de rentrer le 4 dans la premiere colonne du tableau, le 1 dans la deuxieme et le 285000dans la troisieme ?
 
      - la il manque la suite je sais que comme ca, ca ne marchera pas puisque le tableau a 2 champs Tmot et que dans pop.dat y a que des integer et c’est pour cela qu’il faut faire correspondre les chiffres au nom des pays et villes des autres fichiers…mais je ne sais pas du tout comment faire. Est-ce qu’il y a une histoire de clés (un peu comme dans les bases de données) ???

Reply

Marsh Posté le 17-05-2004 à 17:16:36    

A priori il n'y a pas de clé et pas de lien entre les fichiers
 
Quel format ont ces fichiers ? Ce sont des fichiers texte lisibles avec le bloc-notes ? Ou bien des fichiers binaire ? Puis tu parles de blocks de taille 1, tu es sûr de ça ? (j'ai jamais utilisé ces trucs de block, juste les read/write classiques)


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 17-05-2004 à 17:38:14    

antp a écrit :

A priori il n'y a pas de clé et pas de lien entre les fichiers
 
Quel format ont ces fichiers ? Ce sont des fichiers texte lisibles avec le bloc-notes ? Ou bien des fichiers binaire ? Puis tu parles de blocks de taille 1, tu es sûr de ça ? (j'ai jamais utilisé ces trucs de block, juste les read/write classiques)


 
content que tu sois la! ben on sait seulement que ce sont des fichiers .dat, apres il n'est pas précisé si on peut les lire avec le bloc note...pour les blocks je suis pas du tout sur...donc si j'utilise simplement read et write il faudra que je fasse une boucle non?
tu pourrais pas me donner une reponse pour b) parce que je rame trop...j'essaye de chercher en meme temps...

Reply

Marsh Posté le 17-05-2004 à 17:44:43    

un truc dans le genre???

Citation :


begin
assignfile(fic1,pop.dat);
assignfile(fic2,pays.dat);
assignfile(fic3,ville.dat);
reset(fic1) ;
for i :=0 to taille do
read(fic1,data[i]) ;
closefile(fic1);


est-ce que sinon j'ai le droit de faire un truc du genre :

Citation :


for...
read(pop.ville,t[i].ville);
read(pop.pays,t[i].pays);
read(pop.pop,t[i].pop);


 
et comment peux tu faire alors pour remplacer les n° d'enregistrement par leur valeur??? faire correspondre 4 à france par exemple...


Message édité par niiico le 17-05-2004 à 17:48:42
Reply

Marsh Posté le 17-05-2004 à 17:44:57    

ouais


Message édité par antp le 17-05-2004 à 17:45:26

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 17-05-2004 à 17:44:58    

niiico a écrit :

un truc dans le genre???

Citation :


begin
assignfile(fic1,pop.dat);
assignfile(fic2,pays.dat);
assignfile(fic3,ville.dat);
reset(fic1) ;
for i :=0 to taille do
read(fic1,data[i]) ;
closefile(fic1);


est-ce que sinon j'ai le droit de faire un truc du genre :

Citation :


for...
read(pop.ville,t[i].ville);
read(pop.pays,t[i].pays);
read(pop.pop,t[i].pop);


 
et comment peux tu faire alors pour remplacer les n° d'enregistrement par leur valeur??? faire correspondre 4 à france par exemple...

Reply

Marsh Posté le 17-05-2004 à 17:45:53    

Il faut espérer que les fichiers soient stockés dans le même ordre, sinon c'est chiant :D


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 17-05-2004 à 17:46:21    

pour ton for, tu t'en fous de la taille, tu dois faire un while not Eof(fichier)


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 17-05-2004 à 17:47:34    

antp a écrit :

pour ton for, tu t'en fous de la taille, tu dois faire un while not Eof(fichier)

oui je viens de me rendre compte que c'etait bcp mieux

Reply

Marsh Posté le 17-05-2004 à 17:51:04    

antp a écrit :

Il faut espérer que les fichiers soient stockés dans le même ordre, sinon c'est chiant :D


 
non justement...dans l'exemple qu'ils donnent :
 
pays.dat : 0 FRANCE 1 BELGIQUE etc.
ville .dat : 0 GLASGOW 1 VIENNE etc.
pop.dat : 0 (4  1  285000) 1 (3  0  323000) etc.

Reply

Marsh Posté le 17-05-2004 à 17:58:02    

Tels quels dans le fichier ? c'est délimité par des espaces ?  
Ça va être plus chiant à lire, mais toutes ces fonctions du Pascal (c'est pas du Delphi là) je ne les connais pas bien, il y a peut-être moyen de lire ça de manière assez automatique.
À mon avis tu vas devoir faire une liste (array) de pays et une liste de villes à partir des deux fichiers, puis ensuite quand tu lis pop.dat pour chaque info de population tu dois aller chercher le nom de la ville et le nom du pays dans tes listes.


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 17-05-2004 à 18:12:31    

antp a écrit :

Tels quels dans le fichier ? c'est délimité par des espaces ?  
Ça va être plus chiant à lire, mais toutes ces fonctions du Pascal (c'est pas du Delphi là) je ne les connais pas bien, il y a peut-être moyen de lire ça de manière assez automatique.
À mon avis tu vas devoir faire une liste (array) de pays et une liste de villes à partir des deux fichiers, puis ensuite quand tu lis pop.dat pour chaque info de population tu dois aller chercher le nom de la ville et le nom du pays dans tes listes.


non c'est de la forme
0 FRANCE
1 ..
2..
tu veux dire que les fichiers pays et ville je les mets aussi dans des tableaux (array of...)???
si je mets les trois fichiers dans 3 tableaux tels qu'ils sont et que dans le tableau data je fasse data[0].ville:=tville[tpop[0].ville] ca marche?

Reply

Marsh Posté le 17-05-2004 à 18:52:28    

non
 
tu mets tes villes dans un array of string
idem pour les pays
puis quand tu lis tes populations, t'as le n° du pays et de la ville : ça te dira de quelle case des arrays de ville & pays tu dois prendre les chaînes

Reply

Marsh Posté le 17-05-2004 à 18:55:46    

antp a écrit :

non
 
tu mets tes villes dans un array of string
idem pour les pays
puis quand tu lis tes populations, t'as le n° du pays et de la ville : ça te dira de quelle case des arrays de ville & pays tu dois prendre les chaînes


 
ok merci...bon je vais devoir y aller en tout cas tu m'as bien aidé merci heureusement que tu étais la...a bientot

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed