IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Pascal Discussion :

String : type scalaire ?


Sujet :

Langage Pascal

  1. #21
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Hi,
    Citation Envoyé par Mushroom7
    La table ascii a été vraiment bien pensée et ça rend la vie des programmeurs plus simple .
    Il faut bien attribuer un code à chaque caractère, et il n'y a aucun moyen de faire un classement alpabétique au sens du dictionnaire, quel que soit le codage que tu utiliseras.

    Les compilateurs ne peuvent pas fournir de fonction assurant un tri alphabétique "dictionnaire", car les conversions dépendent du codage utilisé, surtout pour les caractères accentués (tu as bien dû déjà avoir le problème de l'affichage de caractères accentués dans une fenêtre windows et dans une fenêtre console ou MS-DOS).

    D'où la necessité de faire soi-même la conversion vers un format unifié:
    - pas de caractères diacritiques (accents, cédille)
    - tout en majuscules ou minuscules.

    Ceci étant, il est facile de se faire une fois pour toute une fonction qui fera tout cela toute seule.

  2. #22
    Membre chevronné Avatar de Haywire
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2006
    Messages
    462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2006
    Messages : 462
    Par défaut
    Ca ne pose aucun problème de classer des mots dans l'ordre du dictionnaire.
    En plus si tu utilises la fonction ansiUpperCase, les lettres accentuées seront normalement convertie en la majuscule correspondante ( é deviendra E) donc ça marchera même avec les accents.

    Tous les codages de caractères existants reprennent le codage ascii et latin 1 pour les 8 premiers bits. Donc tant qu'on reste dans ces caractères là tous les codages sont compatibles.

    Quand je dis que la table a été bien pensé je ne veux pas dire qu'elle suffit à elle seule à faire le classement. Mais elle a été codée de manière à simplifier grandement toutes ces opérations.

    EDIT: j'ai testé et malheureusement ansiUpperCase ne transforme pas un é en E. C'est bien dommage, il faudra donc faire la conversion soit même.

  3. #23
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Hi,
    Citation Envoyé par Mushroom7
    Tous les codages de caractères existants reprennent le codage ascii et latin 1 pour les 8 premiers bits. Donc tant qu'on reste dans ces caractères là tous les codages sont compatibles.
    Il ne faut pas être aussi catégorique.

    Car la preuve que c'est faux existe, et est facile à montrer : les caractères accentués dans une fenêtre Windows ne s'affichent pas de la même manière dans une fenêtre console ou MS-DOS, même en prenant la peine de n'utiliser que des caractères encodés sur 8 bits, et on ne parlera pas d'autres encodages qui conduisent à d'autres valeurs encore.

    On ne peut compter que sur la compatibilité d'encodage pour les 7 premiers bits, et encore : il existe des encodages qui ne suivent pas la table ASCII 7 bits pour ça.
    Pire, il y a des encodages dans lesquels les lettres ont des codes qui ne suivent pas l'ordre alphabétique.
    Etc...

    Citation Envoyé par Mushroom7
    EDIT: j'ai testé et malheureusement ansiUpperCase ne transforme pas un é en E. C'est bien dommage, il faudra donc faire la conversion soit même.
    Eh oui, c'est pourquoi je n'en ai pas parlé, et dit qu'il faut faire le travail soi-même.

  4. #24
    Membre chevronné Avatar de Haywire
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2006
    Messages
    462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2006
    Messages : 462
    Par défaut
    Ce qui est étrange c'est que si on fait:

    readln(ch1);

    qu'on entre "étage"

    et qu'on fait writeln(ch1)

    la console affiche bien "étage".

    Mais si on fait writeln('étage'), la console affiche "Utage".

    Quelqu'un connaitrait-il la raison?

  5. #25
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Hi,
    Citation Envoyé par Mushroom7
    Ce qui est étrange c'est que si on fait:

    readln(ch1);

    qu'on entre "étage"

    et qu'on fait writeln(ch1)

    la console affiche bien "étage".

    Mais si on fait writeln('étage'), la console affiche "Utage".

    Quelqu'un connaitrait-il la raison?
    Ben oui, je l'ai écrit plus haut : encodage différent entre la fenêtre "windows" d'édition et la console, alors que si tu lis la valeur dans la console avant de l'afficher, l'encodage est évidemment le même.

  6. #26
    Invité de passage
    Inscrit en
    Février 2007
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 1
    Par défaut Aide Delphi
    Bonjour,
    Je suis un programmeur en Delphi, et surtout DELPHI5,
    donc, je propose mon aide à tous les chateurs qui veullent savoir en plus sur DElPHI, ou à qui ont des problèmes dans la programmation en delphi.


    Bonne chance avec DELPHI.

  7. #27
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Hi,
    Citation Envoyé par k810510
    Bonjour,
    Je suis un programmeur en Delphi, et surtout DELPHI5,
    donc, je propose mon aide à tous les chateurs qui veullent savoir en plus sur DElPHI, ou à qui ont des problèmes dans la programmation en delphi.
    On n'est jamais trop de fous !

    Ici, c'est plutôt du "pur" Pascal, même si certains utilisent Delphi.

    Si tu utilises Delphi avec la VCL, il y a un forum dédié à Delphi, qui sera mieux pour toi.

    Je ne suis pas modérateur, de très loin, mais il serait bon de ne pas mettre tes adresses mail en clair. Gare aux robots qui scannent en permanence le web pour trouver ces adresses => du spam à ne plus savoir quoi en faire (si, c'est facile : on laisse tomber l'adresse, et on en crée une nouvelle [mieux, on l'annule chez le fournisseur, pas toujours possible]).
    C'est une habitude sur tous les forums que je connais : pas d'adresse mail en clair dans les posts.

    ps: nous ne sommes pas sur un chat, nous ne sommes donc pas des chateurs mais des "forumeurs", beau néologisme.
    (J'aime m'envoyer des compliments, ça ne coûte pas cher, et au moins j'en reçois de temps en temps )

  8. #28
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 89
    Par défaut
    droggo, puisque tu es connecté peux-tu me parler de tous les cas que je dois prendre en considération pour comparer des strings ? (les é par exemple)
    Si tu as une fonction déjà prête, je suis preneur ! hehe
    merci!

  9. #29
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    8 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 8 049
    Billets dans le blog
    2
    Par défaut
    Bonjour,
    Citation Envoyé par Ultima
    Dans mes cours il est dit que le compilo compare la somme des ord(), mais visiblement c’est une comparaison séquentiel, comme nous le montre Droggo.
    C’est donc presque la même chose que dans les dicos (la seule différence c’est que les majuscules sont plus petites que les minuscules).

    Dans ce cas il est vrai que si on compare deux chaînes, on peut avoir leurs ordre dans les dicos.
    Encore désolé, (je crois que je vais devoir parler a mon prof)
    La comparaison de chaînes est en effet séquentielle : un simple
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  10. #30
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Hello,
    Citation Envoyé par katrena99
    droggo, puisque tu es connecté peux-tu me parler de tous les cas que je dois prendre en considération pour comparer des strings ? (les é par exemple)
    Si tu as une fonction déjà prête, je suis preneur ! hehe
    merci!
    Je l'ai déjà dit dans mes messages précédents:

    - remplacer tous les caractères accentués par leur équivalent sans accent, sans oublier les caractères peu utilisés
    - tout passer en majuscules ou minuscules, au choix.

    Que puis-je ajouter.

    Pour les fonctions nécessaires, je dois avoir ça quelque part, je vais plonger dans mes archives (il y a bien 11 ou 12 que je n'ai pas fait de Pascal).

    ? Veux-tu :
    - une version "pur Pascal" (chaines longueur max = 255, longueur stockée dans l'indice 0),
    - une version capable de travailler également avec les ansiString de Delphi

    Est-ce pour travailler dans une fenêtre Windows, une console, MS-DOS ?

  11. #31
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 89
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function ecs(ch : string):string;
    var i: integer;
    begin
    for i:=1 to length(ch) do
    	case ch[i] of
    	'é','è','ê','Ë','Ê','ë' : ch[i]:='e';
    	'à','â','ä','Â','Ä' : ch[i]:='a';
    	'Ï','Ï','î','ï' : ch[i]:='i';
    	'ù','Ü','Û','ü','û': ch[i]:='u';
    	'Ô','Ö','ô','ö': ch[i]:='o';
    	'ÿ': ch[i]:='y';
    	end;
    ecs:=ch;
    end;
    pour le moment j'ai ça mais il doit y en avoir que j'oublie, je me suis dit que tu dois les connaître tous. Je fais tout cela pour pouvoir trier un tableau de chaînes de caractères, en pascal "pur" de préférence mais bof, l'essentiel pour moi est de connaître l'algorithme avec tous les cas particuliers. Quand c'est en Pascal, ça me permet de l'essayer.

    ++

  12. #32
    Membre chevronné Avatar de Haywire
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2006
    Messages
    462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2006
    Messages : 462
    Par défaut
    Salut, pour voir tous les caractères tu peux aller voir ici: http://fr.wikipedia.org/wiki/ISO_8859-1

  13. #33
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Hi,
    Citation Envoyé par katrena99
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function ecs(ch : string):string;
    var i: integer;
    begin
    for i:=1 to length(ch) do
    	case ch[i] of
    	'é','è','ê','Ë','Ê','ë' : ch[i]:='e';
    	'à','â','ä','Â','Ä' : ch[i]:='a';
    	'Ï','Ï','î','ï' : ch[i]:='i';
    	'ù','Ü','Û','ü','û': ch[i]:='u';
    	'Ô','Ö','ô','ö': ch[i]:='o';
    	'ÿ': ch[i]:='y';
    	end;
    ecs:=ch;
    end;
    pour le moment j'ai ça mais il doit y en avoir que j'oublie, je me suis dit que tu dois les connaître tous. Je fais tout cela pour pouvoir trier un tableau de chaînes de caractères, en pascal "pur" de préférence mais bof, l'essentiel pour moi est de connaître l'algorithme avec tous les cas particuliers. Quand c'est en Pascal, ça me permet de l'essayer.
    Moi, j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
        { code pour les majuscules. tamp est une variable de type char }
     
        'à', 'À','á', 'Á','â', 'Â','ã', 'Ã','ä', 'Ä','å', 'Å' : tamp := 'A' ;
        'ç', 'Ç' : tamp := 'C' ;
        'è', 'È','é', 'É','ê', 'Ê','ë', 'Ë' : tamp := 'E' ;
        'ì', 'Ì','í', 'Í','î', 'Î','ï', 'Ï' : tamp := 'I' ;
        'ñ', 'Ñ' : tamp := 'N' ;
        'ò', 'Ò','ó', 'Ó','ô', 'Ô','õ', 'Õ','ö', 'Ö' : tamp := 'O' ;
        'š', 'Š' : tamp := 'S' ;
        'ù', 'Ù','ú', 'Ú','û', 'Û','ü', 'Ü' : tamp := 'U' ;
        'ý', 'Ý','ÿ', 'Ÿ' : tamp := 'Y' ;
    certains très peu utilisés, mais puisqu'ils existent, autant les gérer.


    Pour ton programme, il serait préféférable de séparer la traduction d'un caractère, et celle d'une string:

    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
     
    { exemple pour majuscules, pour reprendre mon code ci-dessus }
     
    function CharToMaj (c : char) : char ;
    { renvoie la majuscule correspondant à c, en supprimant
      tous les signes diacritiques (accents, cédille) }
     
    var
      temp : char;
    begin
      { on traite les cas possibles }
      case c of
        { les minuscules "standard" }
     
        'a'..'z' : tamp := Chr( Ord(c) - ( Ord('a') - Ord('A') ) );
     
        { et les caractères diacritiques }
     
        'à', 'À','á', 'Á','â', 'Â','ã', 'Ã','ä', 'Ä','å', 'Å' : tamp := 'A' ;
        'ç', 'Ç' : tamp := 'C' ;
        'è', 'È','é', 'É','ê', 'Ê','ë', 'Ë' : tamp := 'E' ;
        'ì', 'Ì','í', 'Í','î', 'Î','ï', 'Ï' : tamp := 'I' ;
        'ñ', 'Ñ' : tamp := 'N' ;
        'ò', 'Ò','ó', 'Ó','ô', 'Ô','õ', 'Õ','ö', 'Ö' : tamp := 'O' ;
        'š', 'Š' : tamp := 'S' ;
        'ù', 'Ù','ú', 'Ú','û', 'Û','ü', 'Ü' : tamp := 'U' ;
        'ý', 'Ý','ÿ', 'Ÿ' : tamp := 'Y' ;
     
        { pour tous les autres, pas de modification, donc on renvoie c }
     
        else  tamp := c;
      end ;
      CharToMaj := tamp;
    end;
     
    function StrToMaj (const s : string) : string;
    var
      tamp : string;
      i : integer;
    begin
      { on va travailler avec une copie locale, pour ne pas modifier
        la chaine d'origine }
     
      tamp := s;
     
      { et on traite tous les caractères de tamp }
     
      for i:=1 to length(tamp) do tamp[i] := CharToMaj(tamp[i]);
     
      StrToMaj := tamp;
    end;
    C'est une habitude à prendre : décomposer une fonction en fonctions plus simples/petites.

    L'avantage ici, est que tu pourras faire la conversion pour une variable de type char, alors qu'en ne faisant que la fonction pour une string, il te faudrait soit ruser (passer par une string, récupérer le caractère modifié), soit effectivement écrire la fonction de conversion pour un caractère.
    Autant le faire tout de suite.

    Et puisque tu y seras, tu pourras faire la même chose pour les minuscules, on finit toukours par avoir besoin des 2.

    Remarque les commentaires dans mon code : il est important d'en mettre, pour les autres programmeurs qui seraient amener à utiliser ton code, et pour toi-même.
    Là, j'en ai mis qui ne serviraient pas beaucoup en pratique, mais comme je ne connais pas ton niveau en Pascal, je n'ai pas hésité.

  14. #34
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Hi,

    Me voilà déjà de retour sur ce problème.

    Dans la transformation d'un char en majuscules (CharToMaj), j'ai omis les lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ...
        'æ' : tamp :=  'Æ' ;
        'œ' : tamp := 'Œ' ;
    ...
    et inversement pour le passage en minuscules.

    Je ne le mets jamais dans mes propres programmes, car je suis toujours parfaitement sûr de ne pas avoir à en tenir compte.

    Mais s'il s'agit de vraiment traiter les mots "comme le dictionnaire", ces caractères posent un problème, puisqu'ils en remplacent 2, et que le classement alphabétique est établi comme si ces 2 caractères étaient là.

    Je ne vois que 2 solutions:

    - la plus simple : écrire oe au lieu de œ, idem pour les autres, et on fait des fautes d'ortographe.

    - l'autre est plus complexe, mais plus satifaisante : il faut faire notre propre fonction de comparaison de chaines de caractères, qui tiendra compte de ceux-là.

    On tient là un bel exercice, qui aura toutefois l'inconvénient qu'on ne pourra plus utiliser les <, >, ... pour comparer les chaines, puisqu'en Pascal, contrairement aux C/C++, on ne peut pas redéfinir les opérateurs.

    On sera donc obligés d'avoir par exemple
    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
     
    const
      cst_superieur =  1;
      cst_egal      =  0;
      cst_inferieur = -1;
     
    function test_chaines(const a,b : string) : integer;
    begin
      { qui devra renvoyer une des valeurs ci-dessus }
      ...
    end;
    ...
     
     
    var
      s1,s2 : string;
      r : integer;
    begin
      { initialisataion }
      ...
     
      { et test }
      r := test_chaines(s1,s2);
     
      { puis agir selon le résultat du test }
      ...
    end.
    Je pense que cette fois, le tour du sujet est fait, mais il est toujours délicat d'affirmer cela, car d'autres personnes peuvent très bien apercevoir un point passé inaperçu jusque là.

    Bon développement.

  15. #35
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 89
    Par défaut
    Merci droggo et Mushroom7.

Discussions similaires

  1. Typage : types scalaires et structures de données
    Par spalovac-mrtvol dans le forum Langage R++
    Réponses: 0
    Dernier message: 18/09/2013, 14h04
  2. Convertir STRING --> Type PROCEDURE
    Par l'elu dans le forum Langage
    Réponses: 37
    Dernier message: 09/07/2007, 17h17
  3. Conversion string -> type procedure
    Par ludovic tambour dans le forum Langage
    Réponses: 5
    Dernier message: 11/05/2005, 19h53
  4. [VB6] creation de variable de type string dynamiquement
    Par da40 dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 12/06/2003, 16h59
  5. Réponses: 2
    Dernier message: 05/06/2002, 12h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo