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

Turbo Pascal Discussion :

Un caractère qui n'est pas une lettre [Turbo Pascal]


Sujet :

Turbo Pascal

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Octobre 2011
    Messages : 72
    Points : 38
    Points
    38
    Par défaut Un caractère qui n'est pas une lettre
    Bonjour !

    Voilà, j'ai un petit problème : je viens de commencer l'algo en Pascal avec la fac, et en ce moment on voit les chaînes de caractères.

    Le bol, c'est que je suis à l'aise donc je ne vous demande pas de rédiger l'exo pour moi Par contre, le prof nous a donné une question bonus, et ça ne me poserait pas non plus problème si au moins je pouvais comprendre la question

    Voilà l'énoncé : "Ecrire un programme qui demande de saisir une chaîne, puis qui indique le nombre de voyelles et de consonnes contenues dans la chaîne".
    Alors là je me dis, simple, voilà le code (tout à fait fonctionnel) :

    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
    program voy_cons;
    var mot : string;
    	i, long, compteurVoy, compteurCons : integer;
    begin
    	write('Entrez un mot :');
    	readln(mot);
    	long := length(mot);
    	i := 1;
    	compteurVoy := 0;
    	compteurCons := 0;
    	while (i <= long) do
    	begin
    		case mot[i] of
    			'a','e','i','o','u','y' : compteurVoy := compteurVoy + 1;
    		else
    			compteurCons := compteurCons + 1
    		end;
    		i := i + 1
    	end;
    	writeln('Il y a ',compteurVoy,' voyelle(s) dans votre mot et ',compteurCons,' consonne(s).')
    end.
    Seulement, la question bonus est :"Modifier le programme afin qu'il indique également le nombre de caractères qui ne sont pas des lettres".

    Alors là je sais même pas par où commencer, j'ai essayé un truc du genre :

    if ((mot[i] mod 2) = 0) or ((mot[i] mod 2) = 1) then compteurNonLettres := compteurNonLettres + 1;

    Je me disais que si on pouvait diviser le caractère au rang i c'est que c'était un nombre. Seulement, le compilateur plantait pour faute de syntaxe. Bah oui, tu m'étonnes, je me doute bien que j'ai pas le droit, c'était juste pour essayer

    Du coup, je ne sais pas comment résoudre le problème.
    Si une âme charitable passant par là daignait se pencher sur mon petit problème de rien du tout ce serait génial Merci d'avance !

  2. #2
    Modérateur
    Avatar de l_autodidacte
    Homme Profil pro
    Retraité : Directeur de lycée/Professeur de sciences physiques
    Inscrit en
    Juillet 2009
    Messages
    2 415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Retraité : Directeur de lycée/Professeur de sciences physiques
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 2 415
    Points : 5 805
    Points
    5 805
    Par défaut
    Tu dois parcourir la chaîne et tester chaque caractère si le code ascii de sa majuscule (UpCase) n'est pas dans l'intervalle [65..90], le nombre de caractères qui ne sont pas des lettres sera incrémenté de 1.(Bien sûr si on ne tient pas compte des lettres accentuées)
    Ne pas oublier le tag si satisfait.
    Voter pour toute réponse satisfaisante avec pour encourager les intervenants.
    Balises CODE indispensables. Regardez ICI
    Toujours utiliser la clause Option Explicit(VBx, VBS ou VBA) et Ne jamais typer variables et/ou fonctions en VBS.
    Vous pouvez consulter mes contributions
    Ne pas oublier de consulter les différentes FAQs et les Cours/Tutoriels VB6/VBScript
    Ne pas oublier L'Aide VBScript et MSDN VB6 Fr

  3. #3
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Un eclaircissement a propos de ce qu'a dit l'autodidacte.

    Dans une chaine de caractere, chaque caractère est stocké sur un octet. C'est a dire qu'il prend une valeur allant de 0 à 255. Ce caractère peut très bien être une lettre, un chiffre, une ponctuation, un caractere non affichable, etc. La valeur de chaque caractère est définie par la norme ASCII. Note que les chiffres sont encodés de 48 à 57.



    Pour obtenir le code associé a un caractere, tu peux utiliser Ord. Par exemple, Ord('A') renverra 65.

    Ton exercice est donc de trouver les caracteres qui ne sont pas des lettres, donc qui ne sont pas compris entre 65 et 90 (majuscules), ou 97 et 122 (minuscules).

    Tu peux donc comparer chaque caractere de ta chaine avec ces valeurs.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if not(((Ord(Mot[i])>=65) and (Ord(Mot[i])<=90)) or ((Ord(Mot[i])>=97) and (Ord(Mot[i])<=122))) then
    Pour simplifier ta tâche, tu peux directement utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if not(((Mot[i]>='A') and (Mot[i]<='Z')) or ((Mot[i]>='a') and (Mot[i]<='z'))) then
    ou encore :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if not (Mot[i] in ['A'..'Z','a'..'z']) then
    Bonne chance !

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Octobre 2011
    Messages : 72
    Points : 38
    Points
    38
    Par défaut
    Génial merci ça marche très bien ^^
    Au début j'avais un peu peur quand j'ai lu "Ascii" je me suis dit "Oulà, on a pas vu ça, donc je dois pas avoir le droit de l'utiliser"
    En fait, j'avais pensé à écrire mot[i]>='a' et mot[i] <='z'
    Mais étant donné que le prof nous a dit qu'un caractère n'avait pas de valeur, je ne pensais pas pouvoir utiliser une relation d'ordre comme "<=".
    Enfin, il nous a dit que si, ils avaient une valeur, mais que c'était un peu particulier et qu'on verrait ça plus tard, alors je n'avais pas cherché plus loin.
    Merci à vous en tous cas

  5. #5
    Modérateur
    Avatar de l_autodidacte
    Homme Profil pro
    Retraité : Directeur de lycée/Professeur de sciences physiques
    Inscrit en
    Juillet 2009
    Messages
    2 415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Retraité : Directeur de lycée/Professeur de sciences physiques
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 2 415
    Points : 5 805
    Points
    5 805
    Par défaut
    J'avais pensé qu'il avait les premières bases de la programmation. C'est pour cela que je n'ai pas détaillé. Merci donc à mick605 de l'avoir fait à ma place.

    Voici ce que j'allais proposer s'il aurait posé d'autres questions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    uses crt;
    Var i,c:integer;
        st:String;
    Begin
       Write('Ecrire une chaine : ');Readln(St);
       For i:=1 to length(st) Do
         Begin
           If Not (Ord(UpCase(St[i])) IN [65..90]) Then {s'il n'y a pas de lettre}
               c:=c+1;
         End;
       Writeln('Nombre = ',c);
       Readln;
    End.
    Ne pas oublier le tag si satisfait.
    Voter pour toute réponse satisfaisante avec pour encourager les intervenants.
    Balises CODE indispensables. Regardez ICI
    Toujours utiliser la clause Option Explicit(VBx, VBS ou VBA) et Ne jamais typer variables et/ou fonctions en VBS.
    Vous pouvez consulter mes contributions
    Ne pas oublier de consulter les différentes FAQs et les Cours/Tutoriels VB6/VBScript
    Ne pas oublier L'Aide VBScript et MSDN VB6 Fr

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 34
    Dernier message: 24/09/2014, 20h26
  2. Construire un objet qui n est pas une chaine de caractères
    Par adel25 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 06/11/2013, 10h57
  3. [11g] To_date d'une chaine qui n'est pas une date
    Par d4voisin dans le forum SQL
    Réponses: 5
    Dernier message: 28/03/2013, 14h24
  4. Police de caractère qui n'est pas standard
    Par mikadom dans le forum Mise en page CSS
    Réponses: 6
    Dernier message: 28/01/2009, 16h27

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