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. #1
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 89
    Par défaut String : type scalaire ?
    Bonsoir,
    Je viens de me rendre compte qu'en Pascal on peut comparer deux chaînes selon l'ordre alphabétique rien qu'en utilisant l'opérateur ">" ou "<". C'est à dire qu'on n'a pas besoin de l'aider pour que le compilateur se rende compte que "arrêter" doit se trouver derrière "arrestation" dans un dictionnaire. Je suis étonné parce que je pensais que les opérateurs "<", ">", ">=" et "<=" ne pouvaient s'utiliser que sur des variables de type scalaire ou sur des réels. En tous les cas, j'aimerais savoir si c'est seulement le cas pour le langage Pascal ou alors pour tous les autres.

  2. #2
    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
    Bonjour, pour répondre à la question du titre: non string n'est pas un type scalaire (ou ordinal).

    Pour la 2e question c'est non également, ne serait-ce que parce qu'il existe des langages ou le type string n'existe pas (Le langage C par exemple).

    Maintenant pourquoi est-ce que ça marche de comparer des string avec les opérateurs relationnels?
    Parce que le compilateur compare les valeurs ascii de chaque caractère. Et les lettres de l'alphabet sont classées par ordre alphabetique dans la table ascii ( a est avant b, donc la valeur ascii de a est plus petite que celle de b, donc a < b est vrai. (c'est pour ça aussi que le type char est scalaire)

  3. #3
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 89
    Par défaut
    J'accepte sans problème le fait que char soit un type scalaire mais pour les chaînes, je ne pensais pas que c'était si automatique. Pour trouver le "minimum" dans un tableau de chaînes, je pensais qu'il fallait comparer lettre par lettre comme je le fais manuellement c'est à dire. En voici l'algorithme :
    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
    function posmin(t:tab; a,b:integer):integer; {pour les string}
    var ok:boolean; min,j,i:integer;
    begin
    min := a;
    for i:=(a+1) to b do
    	begin
    	ok:=false;
    	j:=0;
    	repeat
    		j:=j+1;
    		if (t[i][j]=t[min][j]) then 
    			begin
    			if (j=length(t[min])) then
    				begin
    				ok:=true;
    				if length(t[min])>length(t[i]) then min:=i;
    				end;
                                    end
    		else
    			begin
    			ok:=true;
    			if t[i][j]<t[min][j] then min:=i;
    			end;
    	until (j=length(t[min])) or (ok=true);
    	end;
     
    posmin:=min;
    end;
    J'ai envie de vous poser une question débile, comment on remplit un tableau avec des chaînes de caractères ? Quand j'exécute, ça me sort une erreur et je ne comprends pas pourquoi !
    Merci d'avoir répondu.

  4. #4
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    8 039
    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 039
    Billets dans le blog
    2
    Par défaut
    Bonjour,
    Citation Envoyé par katrena99
    comment on remplit un tableau avec des chaînes de caractères ? Quand j'exécute, ça me sort une erreur et je ne comprends pas pourquoi !
    Merci d'avoir répondu.
    Il est possible que la taille totale de ton tableau soit trop grande. Peux-tu en poster la déclaration, SVP ?
    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]

  5. #5
    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
    je pensais qu'il fallait comparer lettre par lettre comme je le fais manuellement
    C'est ce que le programme fait quand tu utilises les opérateurs relationnels.
    C'est ce qu'on appelle la surcharge des opérateurs, les créateurs de delphi ont prévu que quand tu utilises ces opérateurs avec des chaines ça fait tout ça.
    Tu peux voir les "<" comme une sorte de procédure.

    C'est la même chose quand tu utilises "+" pour concatener 2 chaines au lieu d'utiliser concat.

  6. #6
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 89
    Par défaut
    voici la déclaration
    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
     
    type tab=array [1..50] of string;
     
     
    procedure remptab(var table:tab;n:integer);
    var i:integer;
    begin
    for i:=1 to n do
    	begin
    		write('case numéro ', i,' du tableau : ');
    		read(table[i]);
    	end;
    for i:=1 to n do write(table[i]:4);
    writeln;
    for i:=1 to n do write(i:4)
    end;

  7. #7
    Membre expérimenté Avatar de Ultima
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 223
    Par défaut
    Bonjour,
    sa compile sans problème sur Free Pascal . . .
    Mais ça fait pas ce que tu veux, mais pour l’instant, la n’est pas le problème.
    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
    type tab=array [1..50] of string;
     
     
    procedure remptab(var table:tab;n:integer);
    var i:integer;
    begin
    for i:=1 to n do
        begin
            write('case numéro ', i,' du tableau : ');
            read(table[i]);
        end;//for
    for i:=1 to n do write(table[i]:4);
    writeln;
    for i:=1 to n do write(i:4)
    end;//proc
     
    var t:tab;
     
    begin
     remptab(t,3);
    end.

  8. #8
    Membre expérimenté Avatar de Ultima
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 223
    Par défaut
    Re-Bonjour,
    Conseil, remplace Read par Readln, la fonctionne beaucoup mieux,
    Je sais pas si tu l’as pas remarqué mais on déconseille souvent l’utilisation de Read sur ce forum,
    ce n’est pas pour rien.
    Et puis tes :4, n'utilises ça que pour des chaines dont tu connais la taille,
    Ce n'est pas le cas ici;
    Courage, salut

  9. #9
    Membre Expert
    Avatar de krachik
    Inscrit en
    Décembre 2004
    Messages
    1 964
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 964
    Par défaut
    bonjour tout le monde,
    excuser moi pour le retard mais si j'ai bien compris est ce le but est d'ecrire une procedure qui lit dans un tableau des chaines de caracteres?

  10. #10
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 89
    Par défaut
    oui c'est ça le but
    merci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    begin
    repeat
    write('cases du tableau ?   ');
    readln(n);
    until n in [4..50];
    remptab (t,n);
    il faut le readln avant d'appeler la procédure remp_tab si vous savez pourquoi...
    et effectivement Ultima, dans la procedure de remplissage elle-même, il faut un readln pour que ça fonctionne normalement.

  11. #11
    Membre expérimenté Avatar de Ultima
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 223
    Par défaut
    Bonjour,
    Remp_tab prend comme paramètre n, il vaut donc que n ait une valeur avant l’appel de Remp_tab,
    Il est dont tout à fait normal que tu doives faire un readln (ou même un read) avant d’appeler Remp_tab.


    Je voulais rajouter une petite précision sur ce que tu disais sur le premier post,
    Tu disais que le compilo connait l’ordre des mots dans un dico, c’est faut !
    En fait les opérateurs (>, <,=, <=,>=) compare l’addition des ordres des caractères qui compose une chaine, ainsi :
    "ABC" < "abc" < "zaa" < "azz"

  12. #12
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 89
    Par défaut
    j'ai mis ln en rouge parce qu'il faut readln, read ne suffit pas car avec read, il m'affiche :
    valeur numéro 1 valeur numéro 2 _
    etc
    c'est à dire qu'il ne me laisse pas entrer la première valeur en plaçant le curseur directement après valeur numéro 2
    Allez on s'en fout puisque c'est réglé grâce à toi, j'arrive enfin à remplir un tableau de chaînes...

    Tu disais que le compilo connaît l'ordre des mots dans un dico, c'est faux !
    Intéressant mais je n'ai pas compris ton argumentation, peux-tu préciser ?

    Merci.

  13. #13
    Membre expérimenté Avatar de Ultima
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 223
    Par défaut
    voici un cas concret;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    var c,
        s : STRING;
    begin
      c:= 'abc';  // ord(a) = 97, ord(b) = 98, ord(c) = 99
                  // total_1 = (97+98+99) = 294
     
      s:= 'ZAB';  // ord(Z) = 90, ord(A) = 65, ord(B)= 66;
                  // toltal_2 = (90+65+66) = 221
     
    // Total_1 > Total_2  Donc 'abc' > 'ZAB'
    // Dans les dicos ça aurait été le contraire c-à-d 'abc'<'ZAB'

  14. #14
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 89
    Par défaut
    Merci pour la réponse !
    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
    program string_comp;
    uses wincrt;
    var string1,string2:string; t1,t2,i:integer;
    begin
    writeln('string 1'); readln(string1);
    for i:=1 to length(string1) do t1:=t1+ord(string1[i]);
     
    writeln('total 1 = ', t1);
    writeln('string 2');
    readln(string2);
    for i:=1 to length(string2) do t2:=t2+ord(string2[i]);
    writeln('total 2 = ', t2);
     
    if string1>string2 then writeln(string1, '  >   ', string2) else writeln(string2 ,'   >   ', string1);
    end.
    Utilises le programme ci-dessus pour comparer deux chaînes.
    Ce n'est pas si évident que cela Ultima. La chaîne vers laquelle est orientée le signe ">" n'est pas toujours celle qui a un plus grand total des "ord" de ces caractères. La preuve compare abcdefg et abd, et tu auras abd > abcdefg.
    Par contre quand on compare abc à ZAB on obtient abc > ZAB. J'en conclue que ça ne dépends pas de la somme des ord mais je ne sais pas quoi.
    A suivre...

  15. #15
    Expert confirmé

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

    Nouveau venu sur le forum (ne vous fiez pas à la date de mon inscription, en fait j'avais oublié l'existence de ce forum ), j'y ai vu plein de choses intéressantes, et je pense que je pourrai vous aider de temps en temps.

    Citation Envoyé par Ultima
    voici un cas concret;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    var c,
        s : STRING;
    begin
      c:= 'abc';  // ord(a) = 97, ord(b) = 98, ord(c) = 99
                  // total_1 = (97+98+99) = 294
     
      s:= 'ZAB';  // ord(Z) = 90, ord(A) = 65, ord(B)= 66;
                  // toltal_2 = (90+65+66) = 221
     
    // Total_1 > Total_2  Donc 'abc' > 'ZAB'
    // Dans les dicos ça aurait été le contraire c-à-d 'abc'<'ZAB'
    Ce n'est pas ainsi que la comparaison se fait, c'est à dire pas sur la somme des valeurs des codes des caractères, ça se montre facilement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    var c,
        s : STRING;
    begin
      c:= 'abc';  // ord(a) = 97, ord(b) = 98, ord(c) = 99
                    // total_1 = (97+98+99) = 294
      s:= 'bca'; // ord(a) = 97, ord(b) = 98, ord(c) = 99
                    // total_1 = (97+98+99) = 294
    c et s seraient égales, et il serait impossible de faire un classement.

    L'algorithme est
    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
     
    { s1 et s2 sont des string }
     
    { toutes les comparaisons se font bien sûr en faisant attention
      de ne pas dépasser la longueur des chaînes. }
     
      n = 1
      si s1[n] < s2[n]
      alors résultat = s1 < à s2
      sinon
        si s1[n] > s2[n]
        alors résultat = s1 > à s2
        sinon
           passer au caractère suivant : inc(n)
     
      si on arrive à la fin de la plus courte chaine sans avoir pu décider
        laquelle est inférieure,
        alors c'est la plus courte qui l'est
     
      si par hasard les deux chaines avaient la même longueur,
        et qu'en arrivant à la fin on n'a pas pu décider,
        alors elles sont égales
    J'ose espérer que c'est clair.


    Cela n'empêche pas le problème dû aux majuscules/minuscules, auquel s'ajoute celui des caractères accentués, puisque que c'est le code numérique des caractères qui est testé.

    D'où, pour avoir un véritable classement alphabétique "comme dans le dictionnaire", il faut:

    - remplacer tous les caractères accentués par leur équivalent sans accent
    - convertir toutes les chaines soit en minuscules, soit en majuscules.

    A partir de là, la comparaison des chaines donnera le résultat attendu.

    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
     
    var
      s1, s2 : string;
    begin
      s1 = 'étape';
      s2:= 'Étage';
     
      { en remplaçant les caractères accentués, on a : }
     
      s1 = 'etape';
      s2:= 'Etage';
     
      { en passant tout en majuscules (ou minuscules, au choix) }
     
      s1 = 'ETAPE';
      s2:= 'ETAGE';
     
      { en suivant l'agorithme pas à pas, on déduit que
        s2 < s1,
       car au 4ème caractère, qui la prmière position
       où apparaît une différence,
       on trouve 'G' < 'P' }
    end.
    N'hésitez pas à poser des questions, je tacherai d'y répondre, si je connais la réponse.

  16. #16
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 89
    Par défaut
    C'est exactement ce que j'ai écrit sur le forum algorithmes, à la seule différence que je n'ai pris en considération le fait qu'il faille mettre toutes les lettres en majuscule ou en minuscule.

    Spécification de la fonction pos_min

    Résultat : la position de la chaîne la mieux classée dans l'ordre alphabétique entre la case a et b d'un tableau de chaînes.

    Traitement : Tant qu'on est pas sûr de quelle chaîne est la première entre les cases a et b du tableau, il faut parcourir tout le tableau (utilisation d'un boucle pour) ensuite comparer la chaîne supposée minimale avec l'élément du tableau en cours. Comparer deux chaînes signifie les comparer lettre par lettre de même rang j, jusqu'à pouvoir conclure laquelle est placée devant l'autre.
    Exemple : la lettre "b" quand on compare "abbe" et "abba"
    Ce qui signifie qu'on a deux cas :
    1) la lettre comparée de rang j est la même
    -Soit c'est la dernière lettre de l'une des deux chaînes et là on peut conclure que la moins longue en nombre de caractère est plus petite
    -Soit ce n'est pas la dernière lettre, ce qui nous oblige à comparer la lettre de rang j+1 (donc pas de conclusion)
    2) ou la lettre comparée de rang j est différente
    Là nous pouvons tout de suite conclure:
    -Soit la lettre est plus petite ; nous supposons alors que cette chaîne comparée est la chaîne minimale (en affectant i à posmin)
    -Soit la lettre est plus grande, nous ne changeons pas de supposition

    Données : les positions de début et de fin a et b : entiers
    T : tab
    En pascal ça donne comme j'ai écrit plus haut.

    Bon alors, j'en conclue que pour trier un tableau de chaînes de caractères comme le ferait un dictionnaire, il ne suffit pas d'utiliser les opérateurs ">" ou "<", n'est-ce pas ?

    Merci droggo!

  17. #17
    Membre expérimenté Avatar de Ultima
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 223
    Par défaut
    Bonjour,

    Excusez moi, car je viens de relire mes polys de cours sur les CHAINES de CARACTERES et visiblement, mon prof c’est trompé (ou peut être qu’il a confondu avec Ada, je ne sais pas).
    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)

  18. #18
    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
    Bonjour, comme je l'ai dis hier, le compilateur compare la valeur ascii de chaque caractère, dans l'ordre.
    Comme les majuscules viennent avant les miniscules dans la table ascii le résultat n'est effectivement pas correcte si on mélange les deux.

    Le mieux c'est donc de mettre toutes les lettres en majuscules avant de comparer, avec la fonction upperCase.
    Et si il y a aussi des caractère accentués, donc des caractères sur 8 bit il faut utiliser ansiUpperCase.

    La table ascii a été vraiment bien pensée et ça rend la vie des programmeurs plus simple .

  19. #19
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 89
    Par défaut
    Bonjour, comme je l'ai dis hier, le compilateur compare la valeur ascii de chaque caractère, dans l'ordre.
    Comme les majuscules viennent avant les miniscules dans la table ascii le résultat n'est effectivement pas correcte si on mélange les deux.
    Parfois j'ai l'impression qu'on répond sans lire ce que les autres ont écrit!


  20. #20
    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
    Si tu dis ça pour moi c'est plutôt vous qui n'avez pas lu ce que j'ai écris hier

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