Inverser une chaine de caracter en turbo pasc [Résolu/Fermé]

Signaler
Messages postés
3
Date d'inscription
mercredi 7 janvier 2009
Statut
Membre
Dernière intervention
22 janvier 2011
-
Messages postés
16068
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
24 octobre 2020
-
Bonjour,
je viens de commencer a aprendre le turbo pascal et je ne connais pas trop de commande qui concernent le type string.je voudrais savoir comment faire pour inverser une chaine de caracter en turbo pascal
merci.

4 réponses

Messages postés
16068
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
24 octobre 2020
2 701
Tu as besoin de connaitre trois choses fondamentales sur les strings :

la taille n (de type integer) du string S s'obtient avec n:=length(S);
chaque caractère qui compose un string est numéroté de 1 à n, ainsi S[3] est de type char.
si tu as un string S et un caractère C tu peut faire S:=S+C

Il te faut donc faire une boucle parcourant tous les éléments, et les ajouter un par un à ton string résultat
tsss

il faut pas utiliser les réf directes genre S[n]. Comment ça se comporte avec un jeu de caractères multibytes ?
Messages postés
16068
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
24 octobre 2020
2 701 > l00ser
Je n'ai jamais parler de passer S par référence, S[i] est une valeur de caractère...
Après ton histoire de caractères multibytes je vois pas ce que ça vient faire là...

Implémente ta fonction mid (s,i,1); et tu verras que tu es obligé d'utiliser des S[i]...
hello

ya rien en TP pour inverser ta chaine de caracteres.
tu vas devoir créer ta fonction tout seul comme un grand.
du genre

function f_InverserString(s: string): string;
var i: integer;
begin
Result := '';
for i := 1 to length(s) do
Result := mid(s, i, 1) + Result;
end;

(à débugger bien évidement)
Messages postés
30
Date d'inscription
mercredi 15 octobre 2008
Statut
Membre
Dernière intervention
23 janvier 2010
3
bonjour
par exemple one on veut inverser [ casablanca] ça devrait donner [ acnalbasac ] d'accord

program test ;

var s,s1 : string ;
var i,L: integer ;

begin

writeln(' donner une chaine de caractères '); (* saisir par exemple casablanca*);
readln(s);

L=length(s) (* càd la longeur de la chaine de caractères *);
s1='' (* càd une chaine vide pour une chaine de caractères vide on met ('') *);

for i:=1 to l do
begin
s1:=s1+copy(s,L-i+1,1);
end;

writeln(' le resultat est ', s1); (*voila*);
readln;
end.
Messages postés
16068
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
24 octobre 2020
2 701
Un peu trop compliqué, il n'est pas nécessaire d'utiliser copy...
L'idée de l00ser était meilleur, même si sa fonction mid(s,i,1) peut être remplacé par s[i]
Ce qui donne :
function Inverser(s: string):string;
var i:integer;
begin
Result := '';
for i:=1 to length(s) do
    Result := s[i]+Result;
end;
>
Messages postés
16068
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
24 octobre 2020

merci, mais le mid que j'ai écrit, mes doigts ont fourché : ils voulaient écrire Copy
Copy te renvoie ton caractère sur un, deux ou quatre octets (ANSI / UTF-8 / UTF-16 / BIG5 etc)
S[x] ne renvoie qu'un octet
Messages postés
16068
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
24 octobre 2020
2 701 > l00ser
Pour inverser une chaîne de caractère en Pascal, il faut inverser tous les caractères un par un, c'est pourquoi je préfère utiliser directement s[i] qu'une fonction copy.
Mais sinon le code de bibliomax comme il l'a écrit avec sa fonction copy marche aussi (aux := près), mais la fonction copy est comme tu l'a dit plus spécifique à le recopie de plusieurs octets à la fois, alors qu'ici un octet à la fois nous suffit.
>
Messages postés
16068
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
24 octobre 2020

J'étais d'accord avec toi, il ya des années.
L'utilisation de Copy() empile des paramètres puis appelle une fonction qui met en jeu des dizaines d'instructions... tout ça consomme infiniment plus de temps CPU que la simple référence à un élément du tableau.
Néanmoins, cette référence directe ne convient plus lorsque l'on évolue dans des jeux de caractères susceptibles d'être codés sur plusieurs octets, on est alors obligé de passer par Copy() qui elle assure que le (les) caractères seront récupérés qu'ils soient sur un, deux ou x octets... doc mieux vaut prendre l'habitude dès maintenant tout en montrant ce qui se faisait auparavant pour pouvoir décrypter d'anciens sources.

Parce qu'à travailler en octets, on aurait plus vite fait d'écrire une fonction, voire une macro, inline !
Messages postés
30
Date d'inscription
mercredi 15 octobre 2008
Statut
Membre
Dernière intervention
23 janvier 2010
3
tout à fait d'accord mais notre ami cherche à comprendre cela nécessite plus de detail de notre part ..
salut
ok

pour inverser la chaine on peut :

1. partir de la fin de la chaine initiale et 'descendre' les indices jusqu'à 1 en ajoutant les caractères les uns *derrière* les autres
ie for i :=length(s) downto 1 do Result := Result + Copy(s, i, 1)
2. partir du début de la chaine et 'monter' les indices en ajoutant les car les uns *devant* les autres
ie for i :=1 to length(s) do Result := Copy(s, i, 1) + Result

en plus, on s'évite la torture mentale de L - i + 1 pour calculer le rang du car à prendre
Messages postés
16068
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
24 octobre 2020
2 701 > l00ser
Remarque : copy(s,i,1) renvoie la sous-chaine de taille 1 à partir du ième élément... c'est à dire s[i] !
>
Messages postés
16068
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
24 octobre 2020

et sizeof(S[i]), ça renvoie quoi ...
1. chez toi ?
2. chez lui ?

chez moi, j'en sais rien, j'ai plus TP depuis belle lurette
Messages postés
16068
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
24 octobre 2020
2 701 > l00ser
Chez moi sizeof renvoie une erreur, après tout ce n'est que du Pascal...