[Pascal] Problème Algorithme "mot mirroir"
Répondre à la discussion
Affichage des résultats 1 à 5 sur 5

[Pascal] Problème Algorithme "mot mirroir"



  1. #1
    invite7095df61

    [Pascal] Problème Algorithme "mot mirroir"


    ------

    Bonjour ou bonsoir, c'est la première fois que je poste ici!

    Je faisais ma série de TD, arrivée a l'exercice du mot mirroir, dont voici l'algorithme que j'ai fait:

    Program mirroir;
    VAR
    mirror,ch:String;
    j,i:integer;

    BEGIN
    WriteLn('Saisir le mot');
    ReadLn(ch);

    j:=1;

    For i:=length(ch) downto 1 do
    begin
    mirror[j]:=ch[i];
    j:=j+1;
    end;


    WriteLn('Le mirroir du mot',ch,' est', mirror);
    END.


    Et là quand je l'essaye: Nom : jesaispas.PNG
Affichages : 138
Taille : 4,1 Ko

    Si quelqu'un peut m'aider à trouver le problème, ce serait génial. Merci d'avance et bonne soirée!

    -----

  2. #2
    invite6486d7bd

    Re : [Pascal] Problème Algorithme "mot mirroir"

    La longueur de la chaine mirror n'a pas été définie, donc vous écrivez en dehors de la zone d'allocation de la chaine.(Pour ch, la valeur a été automatiquement définie lors du readln)

    Il faudrait rajouter quelque-chose comme : setlength(mirror, length(ch)) après le readln(ch);

  3. #3
    invite7095df61

    Re : [Pascal] Problème Algorithme "mot mirroir"

    J'ai essayé avec SetLength et ça a effectivement marché! Mais je n'ai pas bien compris l'utilité de la fonction set length. Merci pour votre aide cependant.

  4. #4
    JPL
    Responsable des forums

    Re : [Pascal] Problème Algorithme "mot mirroir"

    Juste une petite remarque en passant : mirror... mais miroir
    Rien ne sert de penser, il faut réfléchir avant - Pierre Dac

  5. A voir en vidéo sur Futura
  6. #5
    invite6486d7bd

    Re : [Pascal] Problème Algorithme "mot mirroir"

    Comme son om l'indique ça sert à définir la longueur (il y a deux possibilités, cad deux fonctions possibles) :
    Citation Envoyé par FreePascal
    SetLength sets the length of the string S to Len. S can be an ansistring, a short string or a widestring. For ShortStrings, Len can maximally be 255. For AnsiStrings it can have any value. For AnsiString strings, SetLength \emph{must} be used to set the length of the string.
    In the case of a dynamical array A, setlength sets the number of elements. The elements are numbered from index 0, so the count runs from 0 to Len-1. If Zero is specified, the array is cleared.
    https://www.freepascal.org/docs-html...setlength.html

    De manière générale, les variables de type string, ou les tableaux n'ont pas leur taille initialisées au moment de leur définition (à moins de le spécifier).
    Par exemple, si vous écrivez :
    Code:
    var
      s : string;
      a : array of integer;
    begin
    Après le begin, la longueur de s est de 0 et la taille du tableau a est de 0 éléments.
    Vous ne pouvez donc pas accéder à a[0] ou à s[1] qui sont censés représenter la première valeur du tableau ou de la chaine.
    Mais vous pouvez écrire :
    Code:
    var
      s : string[6];
      a : array[0..5] of integer;
    begin
    Et dans ce cas, vous pouvez accéder aux 6 valeurs de s ou de a.

    Si vous définissez s ou a en tant que constantes, par exemple :
    Code:
    const s='bonjour";
    La chaine est fixe, vous pouvez accéder aux 6 valeurs de la chaine s, mais vous ne pouvez plus redéfinir sa taille.
    Il est d'ailleurs conseillé d'employer les chaines et tableaux dynamiques puisque leur taille n'est plus limitée.

    Setlength permet également de redéfinir la taille d'une chaine ou d'un tableau sans détruire son contenu.

    De plus, Setlength est un élément du langage du Pascal qui le rend particulièrement performant (il faut donc en abuser...)
    Puisque contrairement au c et ses malloc, setlength fait tout ça à la place du programmeur.
    Pour stocker des valeurs dans un tableau "dynamique" (dont la taille a été définie par setlength), il y a "derrière" un gestionnaire qui s'occupe d'allouer de la mémoire pour les données, et chaque donnée est référencée dans le tableau par son pointeur.
    Les données ne sont donc pas "dans le tableau", à des emplacements mémoire nécéssairement successifs, mais le gestionnaire trouve de la place en mémoire (de manière successive, de préférence), selon l'espace mémoire disponible.
    Sinon, si les données sont importantes en terme d'occupation mémoire, il se peut qu'on ne puisse pas trouver suffisamment de mémoire libre contiguë. (si on n'a pas utilisé setlength)..
    Lorsque les données sont en mémoire, le gestionnaire stocke le pointeur vers ces données, dans le tableau.
    C'est transparent pour le programmeur, qui travaille avec les indices du tableau (et on croit que l'indice "contient les données", mais en fait "il contient un pointeur").

    Il faut d'ailleurs se méfier des setlength employés pour redéfinir la taille d'un tableau, puisque si on avait défini des pointeurs vers les données contenues dans ce tableau, rien ne dit que suite à la réorganisation du tableau les données seront encore à la même place en mémoire.
    C'est "dynamique".

Discussions similaires

  1. Programmer un site avec un ""ALGORITHME"" qui parcourt plusieurs site pour afficher des resultats
    Par invite8481e418 dans le forum Programmation et langages, Algorithmique
    Réponses: 5
    Dernier message: 11/08/2018, 16h45
  2. VB mettre le micro en mode " ecoute" "veille" et "stop" sous visual basic
    Par invite5ea368ff dans le forum Programmation et langages, Algorithmique
    Réponses: 1
    Dernier message: 14/12/2015, 13h45
  3. Réponses: 3
    Dernier message: 09/10/2015, 17h07
  4. Problème avec Skype : fonctionne en compte "invité"-se bloque en "administrateur"
    Par Peio64 dans le forum Logiciel - Software - Open Source
    Réponses: 0
    Dernier message: 27/05/2013, 12h43
  5. programmation en pascal "aidez moi svp"
    Par invite8fa7543b dans le forum Logiciel - Software - Open Source
    Réponses: 9
    Dernier message: 13/05/2009, 23h39