Exercice

Fermé
eleve96 Messages postés 1 Date d'inscription jeudi 22 août 2013 Statut Membre Dernière intervention 22 août 2013 - 22 août 2013 à 19:57
domda91 Messages postés 4 Date d'inscription mardi 16 février 2010 Statut Membre Dernière intervention 7 novembre 2015 - 23 août 2013 à 15:56
bonsoir,
j'ai un exercice qui consiste à remplir un tableau avec n chaines (3<n<10) et d'afficher la chaine commune la plus longue. exp si n=4 et le tableau contient accumulation,cumule, cumuler et accumuler, le prog affiche 'cumul'.
je me suis arriver à resoudre ce probleme seulement avec n un nombre fixe comme suit:
program ex;
uses wincrt;
var
t:array [4..9] of string;
ch,ph:string;
k,i,j:integer;
begin
for k:=1 to 5 do
begin
write('t[',k,']=');
readln(t[k]);
end;
ch:=''
for j:=1 to length (t[1]) do
begin
for i:=1 to length (t[1]) do
begin
ph:= copy (t[1],j,i);
if (pos(ph,t[2])<>0) and (pos(ph,t[3])<>0) and (pos(ph,t[4])<>0) and (pos(ph,t[5])<>0) and (length(ph)>length(ch)) then ch:=ph;
end;
end;
writeln(ch);
end.
RQ: j'ai pas étudié les sous programme ni la boucle repeat ni while
merci pour votre aide :)

1 réponse

domda91 Messages postés 4 Date d'inscription mardi 16 février 2010 Statut Membre Dernière intervention 7 novembre 2015 4
Modifié par domda91 le 23/08/2013 à 16:02
Remarque générale, tu gagnerais beaucoup à mieux présenter ton code en utilisant l'indentation et des retour ligne judicieux : le compilateur s'en moque éperdument mais c'est d'une meilleure lisibilité pour toi-même, pour ceux qui acceptent de t'aider et surtout pour tes profs et les examinateurs lors des examens.
Par exemple:
for j:=1 to length (t[1]) do begin 
    for i:=1 to length (t[1]) do begin 
        ph:= copy(t[1],j,i); 
        if (pos(ph,t[2])<>0) and 
           (pos(ph,t[3])<>0) and 
           (pos(ph,t[4])<>0) and 
           (pos(ph,t[5])<>0) and 
           (length(ph)>length(ch)) then ch:=ph; 
    end; 
end;


1) Lorsque tu déclare
t:array [4..9] of string;
cela signifie que tu déclare un tableau contenant exactement 6 chaînes de caractères indexées respectivement par les nombres 4, 5, 6, 7, 8 et 9 (et non un tableau de taille variable pouvant contenir de 4 à 9 chaînes). En conséquence, avec cette déclaration, les expressions telle que t[1], t[2], t[3] référencent des élément qui n'existent pas (index hors limites) de même que
readln(T[k])
lorsque k prend les valeurs 1, 2 ou 3.
Pour n = 5, ta déclaration devrait être
t:array [1..5] of string;


2) En ce qui concerne l'approche algorythmique que tu propose, celle-ci me parraît correcte à la base mais peut être améliorée sur certains points:

- Considérant que la longueur de la chaîne résultat (ch) ne pourra en aucun cas
être suppérieure à la plus courte des chaînes saisies il peut être avantageux d'utiliser cette dernière pour initialiser la variable ph au lieu d'utiliser sytématiquement t[1]. Cela économisera de nombreuses itérations inutiles des boucles imbriquées for j, i. La chaîne la plus courte peut être repérée dans la boucle for k.

- Le If à l'intérieur des boucles for j, i peut avantageusement être scindé en deux if imbriqués, le If extérieur testant d'abord length(ph)>length(ch). Cela évite de balayer tout le tableau t lorsque c'est inutile:
if length(ph)>length(ch) then  
   if (pos(ph,t[2])<>0) and 
      (pos(ph,t[3])<>0) and 
      (pos(ph,t[4])<>0) and 
      (pos(ph,t[5])<>0) then ch:=ph; 
0