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

 C++ Discussion :

[Debutant] case '\r' :


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 18
    Par défaut [Debutant] case '\r' :
    Bonjour,
    je fais des exos de C++ avec un livre de 1991
    et dans ce livre,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    switch
    {
       case '\r' : //ou case '\n' :
       .......;
    }
    est censé réagir à -> appui sur 'entrée' <-
    Mais dans la réalité de Visual Studio 2005, il ne se passe rien.
    En parcourant le forum, j'ai cru comprendre qu'il y avait une histoire d'ASCII 13 pour entrée ? mais j'imagine qu'il faut insérer un fichier .h, ou ?
    N'y a-t-il pas une commande aussi simple que case '\r' ?

    De même, default ne tient pas compte de ' ' comme espace blanc, et case ' ' : n'est jamais validé..
    Je ne comprends pas

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    Normalement dans un switch, il y a une expression entre parenthèses. C'est à cette expression que \r doit être comparé.

    Et il est probable que cette expression contienne un appel à la fonction non-standard getch(), qui permet de saisir au vol n'importe quelle touche, alors que les fonctions standard ne réagissent qu'après un appui sur [entrée] pour terminer la ligne en cours.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Par défaut
    Si tu veux apprendre le C++, tu devrais regarder des livres C++ plus récents ( voir sur le site, et regarde la FAQ déjà par exemple )

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 18
    Par défaut
    Je me suis plantée dans ma question -> swich (ch)
    Donc ça, c'est un truc un peu archaïque, histoire de compter le nombre de 'ss', 'sa' et 'se' dans un texte.

    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
    #include "stdafx.h"
    #include <iostream>
    #include <string.h>
    using namespace std;
     
    enum Comb {s='s', S='S', a='a', A='A', e='e', E='E'};
     
    void main()
    {
    	char ch;
    	int sCnt = 0, aCnt = 0, eCnt = 0,
    		ssCnt = 0, saCnt = 0, seCnt = 0;
    	int tmp = 0;
     
    	while (std::cin>>ch)
    	{
    		switch (ch)
    		{
    			case S :
    			case s :
    				if (sCnt == 1)
    				{
    					ssCnt++;
    					tmp = 1;
    				}
    				if ((sCnt == 0) && (tmp == 0))
    				{
    					sCnt++;
    				}
    				tmp = 0;
    				break;	
     
    			case a :
    			case A :
    				if (sCnt == 1)
    				{
    					saCnt++;
    					sCnt--;
    				}
    				break;
     
    			case e :
    			case E : 
    				if (sCnt == 1)
    				{
    					seCnt++;
    					sCnt--;
    				}
    				break;
     
    			case ' ': //MARCHE PAS
    				sCnt = 0;
    				break;
     
    			default :
    				sCnt = 0;
    				break;
     
    			case '=' :
    			/*case VK_RETURN :*/
    				std::cout<<endl<<"ss = "<<ssCnt;
    				std::cout<<endl<<"sa = "<<saCnt;
    				std::cout<<endl<<"se = "<<seCnt<<endl;
    				sCnt = 0;
    				ssCnt = 0;
    				saCnt = 0;
    				seCnt = 0;
    				break;
    		};
    	}
    }
    Pour la phrase "Seule dans sa forêt, la salamandre tisse."
    ss = 2
    sa = 2
    se = 2
    Ca marche.. Mais avec 2 problèmes :
    - "danS Sa" est compté comme ss -> l'espace entre n'est pas pris en compte
    par "default", ni par case ' ' :
    - Pour avoir le résultat, il faut que je fasse '=' + 'Enter'..
    Du coup, j'ai essayé avec VK_RETURN, mais j'obtiens :
    VK_RETURN : undeclared identifier.
    Voilà... Je sais pas si c'est beaucoup plus clair là..

    Mais.. : Non, ça ne sert à rien, c'est juste un exercice ^^

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Par défaut
    C'est normal, cin>>char utilise des règles assez spéciale pour la lecture de caractère. En gros par défaut ça saute les caractères "blancs" (espace, retour à la ligne, tabulation,...).
    Il y a un gros pavé dans la faq pour tuner les flux C++.
    Néanmoins, pour être honnète avec toi, je n'ai jamais compris l'utilité de ce genre de réglage . Alors en général j'utilise getline(cin,un_string) et je lis ligne par ligne.
    Sinon:
    - ton enum la, c'est assez limite comme bidule.
    - un \r ne doit normalement jamais se retrouver dans une chaine de caractère C ou C++, c'est le second caractère utilisé exclusivement dans les fichiers windows après le classique \n, mais il disparait lors d'une utilisation en mémoire. On ne devrait s'en servir que dans le cas où on est confronté à un mauvais encodage.
    - crois tu vraiment que ce soit nécessaire de faire des pieds et des mains pour utiliser un switch à tout prix? Imagine que tu doives identifier n'importe quelle lettre de l'alphabet, tu vas taper 2x26 cases? Une suite de if/else if/else est plus lisible, plus naturel et est tout aussi optimisé qu'un switch (quoi que quand tu déclare plein de cases inutiles, ça peut même l'être plus). Cette structure ne devrait être utilisée quand dans le cas d'enums justifiés.
    - je ne sais plus si c'est obligatoire, mais par convention le case default on le met toujours à la fin.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 18
    Par défaut
    Merci bcp zais_ethael pour ces précieuses explications.

    J'ai utilsé getline, ça fonctionne et c'est plus clair maintenant :
    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
     
    #include "stdafx.h"
    #include <iostream>
    #include <string>
    using namespace std;
     
    void main()
    {
    	begin :
    	char cinput[100];
    	int sCnt = 0 , saCnt = 0 , seCnt = 0, ssCnt = 0;
    	std::cout << "Enter anything: "<<endl;
    	std::cin.getline(cinput,50); 
     
    	for (int i =0; i<= 100; i++)
    	{
    		if ((cinput[i] == 's')||(cinput[i] == 'S'))
    		{
    			sCnt = 1;
    			i++;
    			if ((cinput[i] == 'a')||(cinput[i] == 'A'))
    			{
    				saCnt++;
    				sCnt = 0;
    			}
    			if ((cinput[i] == 'e')||(cinput[i] == 'E'))
    			{
    				seCnt++;
    				sCnt = 0;
    			}
    			if ((cinput[i] == 's')||(cinput[i] == 'S'))
    			{
    				ssCnt++;
    			}
    			i--;
    		}
    	}
    	std::cout <<"sa ="<< saCnt <<endl<<"se ="<< seCnt <<endl<<"ss ="<< ssCnt <<endl;
    	goto begin;
    }
    Je suis encore loin des class template, des structures et de la récursivité, mais... Un jour peut-être

  7. #7
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Pour le coup du if else if, on peut discuter (perso, je préfère utiliser un switch ... case chaque fois que possible)

    Par contre, tu peux déjà essayer de limiter les tests (que ce soit en if... else if ou en switch ... case) en forçant la transformation, soit en majuscule (avec toupper) soit en minuscule (avec tolower).

    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
     
    std::string str;
    std::getline(std::cin,str);
    for(size_t i=0;i<str.size();i++)
    {
        char verif=toupper(str[i]);
        switch(verif)
        {
            case 'S':
                /*...*/   
                break;
            case 'E':
                /*...*/   
                break;
            case ' ':
                /*...*/   
                break;
           /* case ' blabla ':*/
        }
    }
    Pense aussi à sortir du switch tout ce qui se répète dans tous les cas, soit en le mettant avant le switch, soit en le mettant après... Finalement, pourquoi répéter 10 fois le même code quand le fait de l'écrire une fois suffit

    De par le jeu des inclusions en cascades, je sais que toupper est disponible dans <iostream> et je serais surpris qu'il n'apparaisse pas dans <string>.

    Il semble exister aussi bien dans l'espace de nommage général que dans l'espace de nommage std
    [EDIT]dans la mesure du possible, préfère l'utilisation de la std::string à celle d'un char[un nombre] dés qu'il s'agit de gérer des chaînes de caractères
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  8. #8
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Pour moi switch et il else "n" fois c'est kif kif...
    Sauf que bien souvent, ces switch peuvent être éviter avec du polymorphisme grâce aux fonctions virtuelles.
    Donc bien souvent, une erreur de conception!

    J'ai dit souvent, pas tout le temps, hein !

  9. #9
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Je comprend bien que ce n'est pas "tout le temps", mais il y a même de nombreux cas qui n'ont rien à voir avec le polymoprhisme...

    L'exemple "classique" est
    Est il justifié de créer une classe "homme", une classe "femme" et une clase "fille", toutes trois dérivées de "personne" juste pour savoir si on doit s'adresser en à quelqu'un "monsier, mademoiselle ou madame"
    Malgré tout, le polymorphisme reste un mécanisme relativement lourd à gérer alors qu'un simple switch fera très bien l'affaire

    L'exemple qui consiste à tester séparément les caractères d'une chaîne en est un autre... surtout si seules quelques valeurs nous intéressent.

    Te semblerait il cohérent de créer une interface "caractere" dont dériveraient les classes "sS"(sans jeu de mots, hein ),"aA","eE", "space" etc, implémentant chacune la méthode DoSomething(), simplement pour utiliser le polymoprhisme au lieu d'un switch
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 18
    Par défaut
    à koala01 : tolower () est une petite merveille, merci

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

Discussions similaires

  1. [Debutant] Case à cocher & source de données.
    Par ylarvor dans le forum IHM
    Réponses: 2
    Dernier message: 07/01/2008, 13h35
  2. [Debutant] Case à cocher. . .
    Par nicou50 dans le forum Access
    Réponses: 7
    Dernier message: 04/09/2006, 11h20
  3. debutant besoin de cibler chaque case de ma grille
    Par nassimmm dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 27/07/2006, 19h37
  4. [Débutant] Case à cocher
    Par Glixer dans le forum Access
    Réponses: 6
    Dernier message: 22/05/2006, 10h21
  5. [Debutant] URL utilisable depuis une case d'un tableau de BD
    Par Marc_3 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 03/04/2005, 19h06

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