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
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
A voir également:
- Inverser une chaine de caracter en turbo pasc
- Turbo pascal download - Télécharger - Édition & Programmation
- Inverser ecran pc - Guide
- Chaine tnt gratuite sur mobile - Guide
- Plus de chaine tv - Guide
- Nouvelle chaîne tnt gratuite 2024 - Guide
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
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
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
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)
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)
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
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.
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.
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
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 :
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;
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
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
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
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
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.
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.
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
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 !
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 !
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
7 janv. 2009 à 22:24
tout à fait d'accord mais notre ami cherche à comprendre cela nécessite plus de detail de notre part ..
salut
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
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
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
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] !
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
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
1. chez toi ?
2. chez lui ?
chez moi, j'en sais rien, j'ai plus TP depuis belle lurette
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
7 janv. 2009 à 22:46
Chez moi sizeof renvoie une erreur, après tout ce n'est que du Pascal...
7 janv. 2009 à 22:07
il faut pas utiliser les réf directes genre S[n]. Comment ça se comporte avec un jeu de caractères multibytes ?
7 janv. 2009 à 22:13
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]...