J'ai toujours un problème avec les traitement de chaines (niveau débutant, prière s'arme de patience )
Donc, il s'agit d'écrire un programme qui lit une 'phrase' sous forme de chaîne de caractères et l'inverse:
entrée: le monde est petit
sortie: petit est monde le
sachant que deux 'mots' sont séparés par un seul espace, et que la chaine ne doit pas commencer ni finir par un espace
Mon (pseudo:p) prg est constitué de trois parties controle et modification de l'entrée selon les critère ci-dessus, comptage du nb de 'mots' contenus, ensuite, ben, le traitment qui inverse la chaine en utilisant le nb de mots..
Alors voilà:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
 
program aaa;
uses wincrt; (* euh, oui j'utilise TPW :p *)
 
var
i,j,c,  (*compteurs*)   
l, (*longuer de notre chaine*)
nb,  (* nb d'esapces*)
nbm,  (*nb de mots =nb d'espace +1*)
p,  (*pos du 1er espace*)
x  (*longuer du 1er mot *)   : integer;
 
ch,espace,res,m : string;
esp: boolean ; (*s'il existent deux espaces qui se suivent ou non *)
 
 
 
begin
write('entrer votre chaine')     ;
read(ch);
l:=length(ch);
 
 
for j:= 1 to l do
if (ch[j]=' ') and (ch[j-1]=' ') then
 
delete(ch,j,1);   
 
  (* autre possiblité, qui ne fonctionne pas non plus apparemment:
j:=0;esp:=false;
repeat
j:=j+1;
if (ch[j]=espace) and (ch[j-1]=espace) then
begin esp:=true;
delete(ch,j,1);
end;
until (esp=false) or (j=l) ;       *)
 
 
 
 
if ch[1]=' ' then delete(ch,1,1);
if ch[l]=' ' then delete(ch,l,1)  ;
 
 
 i:=0; nb:=0;
repeat
i:=i+1;
if ch[i]=' ' then nb:=nb+1;
until (i=length(ch)-1);
 
writeln(nb,'espaces');  (* juste pour voir :p *)
nbm:=nb+1;
writeln(nbm, 'mots');
 
res:=''; (*chaine vide qui contiendra la nvlle chaine inversée *)
 
for c:=1 to nbm do
 
espace:=' ';
p:=pos(espace,ch);   (* position du 1er espace, précédé donc du 1er mot*)
m:=copy(ch,1,p);     (* exrait le 1er mot dans 'm' *)
x:=length(m);
delete(ch,1,x);      (* supprime le 1er mot*)
res:=m+res;
 
writeln('chaine inversée',res)
 
end.
Merci