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 :

aide pour miniprojet


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Novembre 2005
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 30
    Par défaut aide pour miniprojet
    salut
    dans le cadre de mes etudes je suis amené à réaliser une calculette simple avec + * / - et puissance. le probleme c'est que au debut je dois lire l'expression sous forme de chaine de caractere et par la suite trensformer les caractere en entier pour pourvoir faire des opérations donc moi au debut j ai fais
    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
     
    printf("entrez une expression         :          ");
    fgets(expr,80,stdin);
              do
               {
                  if(istype(*expr))
                    {
                       num[i]=*expr-'0';
                       i++;
                       expr++;
                     }
                  else
                     {
                       num[i]=*expr;
                       i++;
                       expr++;
                 }while(*expr!='=');
    le probleme c'est que j ai declaré num[i] comme etant un tableau d'entier
    donc lors du passage de la chaine de caractere à une chaine d'entier meme les opérateurs auront des valeurs entiere je me suis dis peut etre qu il serait preferable d utiliser les structure j espere que j etais claire .merci d avance

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2003
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2003
    Messages : 75
    Par défaut
    bonjour

    Je ne vois pas en quoi les structures interviendraient ici?

    Il suffit d'utiliser un tableau de caractères pour mémoriser les opérations, ou encore tester si l'entier a la valeur du caractère '+', '*',...

    Par contre il ne faut pas oublier de décaler les chiffres, si la chaine contient 12, l' opérande sera 1*10+2...

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2006
    Messages : 10
    Par défaut
    J'ai pas tres bien compris ton probleme, j'ai essayé de faire en sorte d'avoir une chaine de caractere initiale de type : '1+34+6'
    et a partir de ça faire le calcul. Je me suis lancé ds une tentative bizzare, qui gere les nombre a virgule mais presantant 2 'bug' ak le signe * et / :

    "4+3+1/4+1*5+3" sera interpreté4+3+1/(4+1*(5+3)) :S

    bref,

    voila mon code :

    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
    79
    80
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <math.h>
     
    double compute(char * input)
    	{
    		int i, exp , size , virg;
    		double nb ;
    		virg = 0 ;
    		nb = 0 ;
    		size = strlen(input) ;
    		exp = size ;
     
    				printf("%s\n",input);
    		for(i = 0 ; i < size ; i++)
    			{
    				// Factor d'exposant de puissance 10 :
    				exp-- ;
     
    				// Si c'est un nombre :
     
    				if(input[i] > 47 && input[i] <60)
    					nb += pow(10,exp)*((int) input[i] - 48 ) ;
     
    				// Si c'est une virgule ou un point ( , ou . ) :
     
    				if(input[i] == 44 || input[i] == 46)
    					{
    						// 'ajustement' du compte actuel :
    						nb /= pow(10,size-i);
    						// Debut d'un compte < 1
    						exp = 0;
    						// Signaler un changement de virgule :
    						virg = 1;
    					}
     
    				// Si c'est un + ou - ou * ou / :
     
    				if(	input[i] == 42 ||
    						input[i] == 43 ||
    						input[i] == 45 ||
    						input[i] == 47 )
    					{
    						if(!virg) nb /= pow(10,size-i);
     
    						switch(input[i])
    							{
    								case 42 :
    									nb *= compute(input + i + 1) ;
    									return nb ;
    								case 43 :
    									nb += compute(input + i + 1) ;
    									return nb ;
    								case 45 :
    									nb -= compute(input + i + 1) ;
    									return nb ;
    								case 47 :
    									nb /= compute(input + i + 1) ;
    									return nb ;
    							}
    					}
    			}
     
    		return nb;
     
     
     
    	}
     
    int main()
    	{
    		char *input     		;
     
    		// expression sous forme de chaine de charactere :
    		input = "1+2+3+4";
    		printf("Le resultat est : %f ( je vous conseille tt de"
    					 "meme de reverifier le resultat lol",compute(input)) ;
    		return 0 ;
    	}

  4. #4
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par chetane
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    				if(input[i] > 47 && input[i] <60)
    					nb += pow(10,exp)*((int) input[i] - 48 ) ;
     
    				if(input[i] == 44 || input[i] == 46)
     
    				if(	input[i] == 42 ||
    						input[i] == 43 ||
    						input[i] == 45 ||
    						input[i] == 47 )
    					{
    Et en EBCDIC, on fait quoi ? On réécrit le code? Ta maman ne t'a jamais dit qu'il fallait utiliser les constantes caractères ?
    Pas cohérent. Tu aurais dû écrire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    input ="\61\53\62\53\63\53\64";

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2006
    Messages : 10
    Par défaut
    ahh on apprend tous, j'ai reflechi aux probleme est essayé de le resoudre alors je suis venu ak cette solution originale. En plus une fonction recursive j'étais content Surtout pr la gestion de virgule...faut reconaitre ke c pas mal

    Enfin bref, chui sur qu'en utilisant les expressions regulieres ca doit etre plus simple, mais j'ai jamais vraiment utilisé ca en C
    en tk jdoi y aller A+

  6. #6
    Membre chevronné
    Avatar de bigquick
    Profil pro
    Inscrit en
    Août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 356
    Par défaut
    Mmm ?
    Personne n'a commenté la structure du code ni parlé de regex je crois, juste du fait d'utiliser le caractère (par exemple 'a') au lieu de son codage ASCII (97):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if(input[i] == 44 || input[i] == 46)
    ->
    if(input[i] == ',' || input[i] == '.')
    C'est quand même vachement plus lisible Et surtout tu ne dépends plus du codage utilisé comme l'a dit Emmanuel Delahaye.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2006
    Messages : 10
    Par défaut
    ouais mais bon faudra changer aussi pr les nombre :
    a cause du :

    Mais c'est vrai que ce serai plus 'correct'.

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2006
    Messages : 10
    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
    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
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <math.h>
     
    int char2nb(char input)
    	{
    		switch(input)
    			{
    				case '0' : return 0 ;
    				case '1' : return 1 ;
    				case '2' : return 2 ;
    				case '3' : return 3 ;
    				case '4' : return 4 ;
    				case '5' : return 5 ;
    				case '6' : return 6 ;
    				case '7' : return 7 ;
    				case '8' : return 8 ;
    				case '9' : return 9 ;
    			}
    		return -1 ;
    	}
     
    double compute(char * input)
       {
          int i, exp , size , virg;
          double nb ;
          virg = 0 ;
          nb = 0 ;
          size = strlen(input) ;
          exp = size ;
     
                printf("%s\n",input);
          for(i = 0 ; i < size ; i++)
             {
                // Factor d'exposant de puissance 10 :
                exp-- ;
     
                // Si c'est un nombre :
     
                if(input[i] > 47 && input[i] <60)
                   nb += pow(10,exp)*( char2nb(input[i]) ) ;
     
                // Si c'est une virgule ou un point ( , ou . ) :
     
                if(input[i] == ',' || input[i] == '.')
                   {
                      // 'ajustement' du compte actuel :
                      nb /= pow(10,size-i);
                      // Debut d'un compte < 1
                      exp = 0;
                      // Signaler un changement de virgule :
                      virg = 1;
                   }
     
                // Si c'est un + ou - ou * ou / :
     
                if(   input[i] == '*' ||
                      input[i] == '/' ||
                      input[i] == '+' ||
                      input[i] == '-' )
                   {
                      if(!virg) nb /= pow(10,size-i);
     
                      switch(input[i])
                         {
                            case '*' :
                               nb *= compute(input + i + 1) ;
                               return nb ;
                            case '+' :
                               nb += compute(input + i + 1) ;
                               return nb ;
                            case '-' :
                               nb -= compute(input + i + 1) ;
                               return nb ;
                            case '/' :
                               nb /= compute(input + i + 1) ;
                               return nb ;
                         }
                   }
             }
     
          return nb;
     
     
     
       }
     
    int main()
       {
          char *input           ;
     
          // expression sous forme de chaine de charactere :
          input = "4+3+1/4+1*5+3";
          printf("Le resultat est : %f ( je vous conseille tt de"
                    "meme de reverifier le resultat lol",compute(input)) ;
          return 0 ;
       }

  9. #9
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par chetane
    #include <stdio.h>

Discussions similaires

  1. aide pour un miniprojet
    Par foufi5 dans le forum C
    Réponses: 5
    Dernier message: 09/01/2006, 13h23
  2. [TP]besoin d'aide pour commandes inconnues
    Par Upal dans le forum Turbo Pascal
    Réponses: 15
    Dernier message: 03/10/2002, 10h48
  3. Besoin d'aide pour l'I.A. d'un puissance 4
    Par Anonymous dans le forum C
    Réponses: 2
    Dernier message: 25/04/2002, 17h05
  4. Une petite aide pour les API ?
    Par Yop dans le forum Windows
    Réponses: 2
    Dernier message: 04/04/2002, 21h45

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