Exercice
eleve96
Messages postés
1
Date d'inscription
Statut
Membre
Dernière intervention
-
domda91 Messages postés 4 Date d'inscription Statut Membre Dernière intervention -
domda91 Messages postés 4 Date d'inscription Statut Membre Dernière intervention -
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 :)
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 :)
A voir également:
- Exercice
- Transmath 3eme exercice ✓ - Forum Études / Formation High-Tech
- Corrigé d'un exercice du livre transmaths 3e - Forum Loisirs / Divertissements
- Fleur d'encre 5eme corrigé exercice - Forum PDF
- Corrigés 350 exercices niveau moyen ✓ - Forum Loisirs / Divertissements
- Livre du professeur 5eme fleur d'ancre ✓ - Forum PDF
1 réponse
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:
1) Lorsque tu déclare
Pour n = 5, ta déclaration devrait être
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:
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;