Inverser une chaine de caracter en turbo pasc

Résolu/Fermé
zaybakaire Messages postés 3 Date d'inscription mercredi 7 janvier 2009 Statut Membre Dernière intervention 22 janvier 2011 - 7 janv. 2009 à 22:00
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 - 7 janv. 2009 à 22:46
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.
A voir également:

4 réponses

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
7 janv. 2009 à 22:05
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
0
tsss

il faut pas utiliser les réf directes genre S[n]. Comment ça se comporte avec un jeu de caractères multibytes ?
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015 > l00ser
7 janv. 2009 à 22:13
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]...
0
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)
0
bibliomax Messages postés 30 Date d'inscription mercredi 15 octobre 2008 Statut Membre Dernière intervention 23 janvier 2010 3
7 janv. 2009 à 22:15
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.
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
7 janv. 2009 à 22:19
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;
0
l00ser > KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024
7 janv. 2009 à 22:25
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
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015 > l00ser
7 janv. 2009 à 22:30
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.
0
l00ser > KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024
7 janv. 2009 à 22:40
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 !
0
bibliomax Messages postés 30 Date d'inscription mercredi 15 octobre 2008 Statut Membre Dernière intervention 23 janvier 2010 3
7 janv. 2009 à 22:24
tout à fait d'accord mais notre ami cherche à comprendre cela nécessite plus de detail de notre part ..
salut
0
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
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015 > l00ser
7 janv. 2009 à 22:32
Remarque : copy(s,i,1) renvoie la sous-chaine de taille 1 à partir du ième élément... c'est à dire s[i] !
0
l00ser > KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024
7 janv. 2009 à 22:42
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
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015 > l00ser
7 janv. 2009 à 22:46
Chez moi sizeof renvoie une erreur, après tout ce n'est que du Pascal...
0