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 :

Récupérer des caractères dans une chaîne


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 8
    Points : 3
    Points
    3
    Par défaut Récupérer des caractères dans une chaîne
    Salut,
    je voudrai faire une calculatrice "normale" en quelque sorte. Je dis "normale" du fait que j'aimerai qu'elle soit différente de celles qui nous demandent à l'exécution de choisir le type d'opération à effectuer. Mais je n'arrive pas à associer chaque étape de fonctionnement du programme à une fonction.
    Je m'explique:
    -Le programme s'ouvre (type Console)
    -Aucun menu, rien, l'utilisateur a juste à taper l'opération. Par exemple 123+27. L'opération serait stockée dans un char.

    C'est à partir d'ici que ça devient flou.

    -J'ai lu que pour trouver un caractère dans une chaine on utilisait la fonction find() de String.h. Donc on cherche l'opérateur (+,-,*,/...) et à partir de là, on détermine le type d'opération à effectuer.
    Ma question pour cette étape: Peut-on, une fois l'opérateur "trouvé" avec find() le stocker dans un char afin de la comparer avec une autre chaine.

    char* add = '+'; // ici on à l'opérateur + créé. Déclaré hors de toute fonction.
    char* operateurDetermine = '+'; // Stocké ici après avoir été trouvé avec find().
    Enfin on compare les deux chaines ( strcmp(add,operateurDetermine); ) et on détermine de cette manière le type d'opération à effectuer.

    - Passons maintenant à ma 2e "prise de tête": Comment peut-on récupérer les nombres présents dans le string de départ (123+27) et les stocker dans n'importe quel type de variable (float...) ?
    J'ignore quelle fonction utiliser.

    Voilà, j'espère que la longueur du message ne vous découragera pas
    Merci de votre aide,
    LoiL

  2. #2
    Membre régulier
    Avatar de mac&cheese
    Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 98
    Points : 96
    Points
    96
    Par défaut
    Bonsoir,

    Je repond à ta première prise de tete pour le moment...
    Sachant qu'il ne sagit que d'UN caractere, un char monChar suffit.
    Tu peux faire un simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (monChar=='+') { TODO }
    En esperant avoir repondu a ta premiere question.

    PS: je jete un oeil à la seconde et te tiens au courant

    Voila, pour ta deuxieme prise de tete...
    Tu peux utiliser la fonction atoi()
    convertit une chaine en un entier!

    En revanche est tu bien sûr que ta fonction find() existe en C?
    World's greatest inventors: Franklin, Edison and this REESE guy.

  3. #3
    Rédacteur
    Avatar de darrylsite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 299
    Points : 2 501
    Points
    2 501
    Par défaut
    Pour récuperer un nombre dans une chaine, tu peux utiliser atoif pour les reels, atoi pour les entiers, ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    float nombre=atoif("12.14+452");
    Le recopie s' arrete au premier caractere non numerique trouvé.

    J' ai eu à faire un programme pareil mais en pascal :
    http://www.developpez.net/forums/sho...d.php?t=487290

    Mais c' est un peu plus compliqué que tu le crois, puisqu' il faut aussi gerer la priorité des operateurs.

  4. #4
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut
    Citation Envoyé par mac&cheese
    Voila, pour ta deuxieme prise de tete...
    Tu peux utiliser la fonction atoi()
    convertit une chaine en un entier!
    Citation Envoyé par darrylsite
    Pour récuperer un nombre dans une chaine, tu peux utiliser atoif pour les reels, atoi pour les entiers, ...
    Ces fonctions là sont maintenant obsolètes au profit des fonctions strtol(), strtod(), strtof() etc..

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Bonjour,
    je tiens à vous remercier pour vos différents aiguillages. Voici ce que j'ai pu en tirer:

    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
    73
    74
    75
    76
    77
    78
    #include "stdafx.h"
    #include <string>
     
    // Déclaration des chaines
    char szCalcul[50]; // Chaine stockant l'opération
     
    // Membres de l'opération
    float flNombre1 = 0.0f;
    float flNombre2 = 0.0f;
     
    // Prototype
    float flExecute( int iType, float flNombre1, float flNombre2 );
     
    int main(int argc, char* argv[])
    {
    	// Boucle infinie
    	while( 1 )
    	{
            // On récupère l'opération
    	    fgets(szCalcul, sizeof(szCalcul),stdin);
    	    // On récupère les caractères numériques
    	    flNombre1 = atof(szCalcul); // Premier membre
    	    flNombre2 = 6.0f; // Deuxième membre
    		// On détermine l'opérateur en le cherchant dans la chaine
    		if ( strstr( szCalcul, "+" ) ) // Addition
    		{
    			flExecute(1,flNombre1,flNombre2);
    		}
    		else if ( strstr( szCalcul, "-" ) ) // Soustraction
    		{
    			flExecute(2,flNombre1,flNombre2);
    		}
    		else if ( strstr( szCalcul, "*" ) ) // Multiplication
    		{
    			flExecute(3,flNombre1,flNombre2);
    		}
    		else if ( strstr( szCalcul, "/" ) ) // Division
    		{
    			flExecute(4,flNombre1,flNombre2);
    		}
    		else if ( strstr( szCalcul, "about") ) // Informations sur la super-calculette
    		{
    			printf("Simple calculatrice pouvant gerer 2 membres\nainsi que les 4 operations basiques (+,-,*,/).\n\n");
    		}
    		else
    		{
    			printf("Erreur: Operateur/Commande inconnu(e)\n"); // Opérateur alien
    		}
    	}
    	return 0;
    }
     
    float flExecute( int iType, float flNombre1, float flNombre2 ) // Super-fonction :x
    {
    	float flResultat = 0.0f;
     
    	switch( iType )
    	{
    	case 1:
    		flResultat = flNombre1+flNombre2;
    		break;
    	case 2:
    		flResultat = flNombre1-flNombre2;
    		break;
    	case 3:
    		flResultat = flNombre1*flNombre2;
    		break;
    	case 4:
    		flResultat = flNombre1/flNombre2;
    		break;
    	default:
    		printf("Erreur: Operation inconnue");
    		break;
    	}
     
    	printf("    %2.2f \n\n", flResultat);
    	return flResultat;
    }
    C'est un peu différent de ce que je comptais faire au début mais ça m'a permis de raccourcir le code (de plus j'arrivais pas à utiliser find(), j'ai donc privilégié strstr).
    J'aurai encore une question ( ): Comment récupérer le second membre de l'opération car, comme vous avez certainement du le constater, flNombre2 vaut 6 (je lui ai attribué cette valeur pour voir si le programme fonctionnait bien. Je pensais à retourner la chaine afin d'utiliser à nouveau atof() mais je pense que cela ne marchera pas: 123+12 -> 21+321 non ?

    Voila, dites moi ce que vous en pensez
    A bientôt,
    LoiL

  6. #6
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ( strstr( szCalcul, "+" ) ) // Addition
    strstr renvoie l'adresse où il a trouvé la chaîne ou NULL en son absence. A partir de cette adresse, on sait où doit commencer le second membre (en 1 de plus) .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if ( p = strstr( szCalcul, "+" ) )
    {
         flNombre2 = atof(p+1); //si tu tiens absolument à atof
         flExecute(1,flNombre1,flNombre2);
    }
    La fonction strcspn peut te faciliter la tache en cherchant l'un quelconque des caractères spécifiés et en te renvoyant sa position. On aurait alors quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    n1 = atof(Chaine2);
    size_t p = strcspn(Chaine2,"+-*/");
    if(Chaine2[p]!=0)
    {
       n2 = atof(Chaine2+p+1);
       float res = flExecute(Chaine2[p],n1,n2);
    ....
    }
    else ...//pas d'opérateur
    avec pour flExecute un test sur le caractère opérateur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ...
    	switch(iType )
    	{
    	case '+':
    		flResultat = flNombre1+flNombre2;
    		break;
    ....
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Ok, merci pour ces précisions. J'ai fait ce code sans connexion, je n'ai donc pas pu me renseigner sur les différentes fonctions. J'avais trouvé "strpbrk" mais je ne sais pas si l'on peut l'utiliser avec un size_t ( structure que je ne connais pas ). En tout cas merci je file m'instruire et je vous tiens au courant

    EDIT: Aussi, j'ai oublié, en attendant votre réponse j'ai fait un autre code avec un fonctionnement similaire mais pouvant supporter des opérations avec plus de deux membres ( ne gérant pas les priorités ). Les nombres sont récupérés dans un tableau de type int ( int nombre[1] ). Une boucle est faite pour récupérer les membres et leur nombre. Le problème est que je ne sais pas comment les additionner. Un indice ?

    Merci,
    loiL

  8. #8
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Citation Envoyé par LoiL Reborn Voir le message
    Ok, merci pour ces précisions. J'ai fait ce code sans connexion, je n'ai donc pas pu me renseigner sur les différentes fonctions. J'avais trouvé "strpbrk" mais je ne sais pas si l'on peut l'utiliser avec un size_t ( structure que je ne connais pas ). En tout cas merci je file m'instruire et je vous tiens au courant
    strpbrk rerourne l'adresse (char *) du caractère trouvé ou NULL si il n'en trouve pas. Il conviendra très bien avec des modifications minimes du code
    size_t est le type retourné par l'opérateur sizeof. C'est un type entier non signé.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    J'ai édité le post:

    EDIT: Aussi, j'ai oublié, en attendant votre réponse j'ai fait un autre code avec un fonctionnement similaire mais pouvant supporter des opérations avec plus de deux membres ( ne gérant pas les priorités ). Les nombres sont récupérés dans un tableau de type int ( int nombre[50] ). Une boucle est faite pour récupérer les membres et leur nombre. Le problème est que je ne sais pas comment les additionner. Un indice ?
    Merci,
    loiL

  10. #10
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Tu cherches en fait à écrire un interpréteur d'expressions mathématique. Cet exercice peut devenir relativement complexe si tu veux tenir compte de la précédence et de l'associativité des opérateurs, des parenthèses, etc.

    Pour construire un interpréteur simple, il faut avoir quelques notions de ce qu'est un analyseur lexical et un analyseur syntaxique. N'importe quel cours sur les compilateurs explique ces concepts en détails. On trouve notamment un cours sur l'analyse syntaxique ici. Ce document est également de bonne qualité.

    Tu trouveras un exemple d'interpréteur d'expressions mathématiques ici: http://www.developpez.net/forums/sho...00&postcount=2.

    Bonne chance

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

Discussions similaires

  1. Réponses: 4
    Dernier message: 17/07/2008, 16h15
  2. Réponses: 2
    Dernier message: 24/03/2008, 23h00
  3. [RegEx] Récupérer un prix dans une chaîne de caractère
    Par Tazerty dans le forum Langage
    Réponses: 1
    Dernier message: 11/03/2008, 07h41
  4. Récupérer un nombre dans une chaîne de caractères
    Par yougoudai dans le forum Général Python
    Réponses: 9
    Dernier message: 23/09/2007, 21h01
  5. Réponses: 5
    Dernier message: 08/03/2006, 22h20

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