Aide projet : langage C
Fermé
Gryzzly
-
30 nov. 2005 à 09:08
mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 - 18 déc. 2005 à 23:04
mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 - 18 déc. 2005 à 23:04
A voir également:
- Aide projet : langage C
- Filigrane projet - Guide
- Exemple d'un projet déjà monté - Forum Programmation
- Film projet x a telecharger gratuitement - Télécharger - Outils professionnels
- Musique projet x - Forum Musique / Radio / Clip
- Gantt projet - Télécharger - Gestion de projets
15 réponses
mamiemando
Messages postés
33446
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
20 décembre 2024
7 812
30 nov. 2005 à 16:16
30 nov. 2005 à 16:16
Ton sujet est bien posé en ce sens qu'il suffit de faire les étapes une par une enrichissant progressivement ce que tu as déjà coder. Première étape, la partie interface, ensuite implémenter la partie commande, puis la partie calcul, et enfin la partie fonction.
Le sujet est assez long donc il faut en effet t'y mettre rapidement.
Pour la partie interface, il faut scaner une chaine rentree au clavier sur stdin (man scanf) et la parser (man sscanf) dans une fonction qui fera office d'analyseur syntaxique.
- Dans un premier temps, implémente juste les commandes et la déclaration et initialisation de variable.
- Ensuite implémente les opérations de base (+, - ...) en stockant les opérations dans un struct lors du sscanf. Puis fais la fonction qui fait le calcul sur une opération lémentaire.
- Puis, définir une structure d'arbre pour travailler sur des opérations non élémentaire (ensemble d'opérations élémentaires).
- Etape suivante, définir les intersections et unions d'intervalle, l'operateur d'appartenance etc... pour implementer les fonctions. On peut utiliser pour celà unestructure definissant un intervalle, ouvert ou fermé.
- Dernière étape, les fonctions ! Mais une fois que tu auras fait tout ça je pense que tu t'en sortiras seul ;-)
Si tu as des questions sur des points précis n'hesite pas a repasser)
Bonne chance
Le sujet est assez long donc il faut en effet t'y mettre rapidement.
Pour la partie interface, il faut scaner une chaine rentree au clavier sur stdin (man scanf) et la parser (man sscanf) dans une fonction qui fera office d'analyseur syntaxique.
- Dans un premier temps, implémente juste les commandes et la déclaration et initialisation de variable.
- Ensuite implémente les opérations de base (+, - ...) en stockant les opérations dans un struct lors du sscanf. Puis fais la fonction qui fait le calcul sur une opération lémentaire.
- Puis, définir une structure d'arbre pour travailler sur des opérations non élémentaire (ensemble d'opérations élémentaires).
- Etape suivante, définir les intersections et unions d'intervalle, l'operateur d'appartenance etc... pour implementer les fonctions. On peut utiliser pour celà unestructure definissant un intervalle, ouvert ou fermé.
- Dernière étape, les fonctions ! Mais une fois que tu auras fait tout ça je pense que tu t'en sortiras seul ;-)
Si tu as des questions sur des points précis n'hesite pas a repasser)
Bonne chance
mamiemando
Messages postés
33446
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
20 décembre 2024
7 812
3 déc. 2005 à 00:40
3 déc. 2005 à 00:40
Euh ben mets le ici. Je ne donne pas mon mail sur les forums.
Ça va etre dur car il y a des centaines de lignes de codes.
Sinon est ce que tu pourrais m'indiquer une manière de faire car je bloque sur l'evaluation des fonctions et sur les fonctions avec intervalle.
Merci
Sinon est ce que tu pourrais m'indiquer une manière de faire car je bloque sur l'evaluation des fonctions et sur les fonctions avec intervalle.
Merci
mamiemando
Messages postés
33446
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
20 décembre 2024
7 812
4 déc. 2005 à 00:35
4 déc. 2005 à 00:35
1) Définis dans un premier temps des struct intervalles, prenant en compte :
- les bornes inf et sup de l'intervalle.
- si l'intervalle est fermé ou ouvert pour chaque borne.
2) Ensuite définis une fonction sans prendre en compte le domaine de définition. C'est là qu'entre en jeu l'évaluation des littéraux, mais ça normalement tu l'as déjà fais avec les opérations.
3) Les fonctions définies par morceaux seront donc une liste de paires formée d'un struct fonction et d'un struct intervalle. La fonction d'évaluation sera donc un appelle à celle d'une fonction simple, appliquée à la fonction concernant l'intervalle adéquat (si elle existe).
Rq : En particulier les fonctions restreinte à un sous ensemble de leur domaine de définition entreront dans la catégorie des fonctions définies par morceaux : ex : x -> x^2 définie juste sur R+.
Bonne chance
- les bornes inf et sup de l'intervalle.
- si l'intervalle est fermé ou ouvert pour chaque borne.
2) Ensuite définis une fonction sans prendre en compte le domaine de définition. C'est là qu'entre en jeu l'évaluation des littéraux, mais ça normalement tu l'as déjà fais avec les opérations.
3) Les fonctions définies par morceaux seront donc une liste de paires formée d'un struct fonction et d'un struct intervalle. La fonction d'évaluation sera donc un appelle à celle d'une fonction simple, appliquée à la fonction concernant l'intervalle adéquat (si elle existe).
Rq : En particulier les fonctions restreinte à un sous ensemble de leur domaine de définition entreront dans la catégorie des fonctions définies par morceaux : ex : x -> x^2 définie juste sur R+.
Bonne chance
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
@mamiemando
Salut,
comme il n'est pas possible d'envoyer de message privé,je voudrais savoir si tu es également inscrit sur un autre forum info comme ça je pourrais t'envoyer mes sources via ce forum et ton mail ne sera pas connu.
Si c'est le cas,quel est ce forum?
Salut,
comme il n'est pas possible d'envoyer de message privé,je voudrais savoir si tu es également inscrit sur un autre forum info comme ça je pourrais t'envoyer mes sources via ce forum et ton mail ne sera pas connu.
Si c'est le cas,quel est ce forum?
mamiemando
Messages postés
33446
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
20 décembre 2024
7 812
6 déc. 2005 à 19:41
6 déc. 2005 à 19:41
Non ce n'est pas le cas désolé :/ Mets le sur une parge perso ou sur un ftp, donne moi l'adresse, et je le téléchargerai.
Je te mets le lien sur un forum auxquel je participe:
www.maths-forum.com
une fois sur le site,tu descends sur autres matières ,informatiques puis tu cliques que sur Morpheus(c'est mon pseudo) pour m'envoyer un MP dans lequel tu pourras mettre ton mail pour que je t'envoies mes sources car j'ai vraiment besoin d'aide.
Merci d'avance
www.maths-forum.com
une fois sur le site,tu descends sur autres matières ,informatiques puis tu cliques que sur Morpheus(c'est mon pseudo) pour m'envoyer un MP dans lequel tu pourras mettre ton mail pour que je t'envoies mes sources car j'ai vraiment besoin d'aide.
Merci d'avance
Pour faire plus simple,je te mets le lien direct:
http://www.maths-forum.com/member.php?u=1842
puis envoyer un message privé à Morpheus
http://www.maths-forum.com/member.php?u=1842
puis envoyer un message privé à Morpheus
mamiemando
Messages postés
33446
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
20 décembre 2024
7 812
7 déc. 2005 à 19:26
7 déc. 2005 à 19:26
C'est fait
mamiemando
Messages postés
33446
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
20 décembre 2024
7 812
8 déc. 2005 à 17:35
8 déc. 2005 à 17:35
Ok je vais regarder ça
mamiemando
Messages postés
33446
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
20 décembre 2024
7 812
8 déc. 2005 à 18:31
8 déc. 2005 à 18:31
1) fais un makefile (pour compiler tu auras juste a taper make).
Exemple simple de makefile :
Pour compiler la premiere fois, tape :
Par la suite :
2) Dans Analyse.c, ligne 178
Je pense que là il y a un soucis : c'est soit %s(%c si tu lis un caractère, soit %s(%s mais en utilisant un atoi pour convertir la chaine en valeur numerique.
Idem ligne 182
Ligne 62
char **pp = (char **) malloc (sizeof(char *) * n);
Ligne 73
(p != NULL) ? p = NULL : (void) 0;
Ca ne veut rien dire, que veux tu faire ?
3) Dans Environnement.h
Il ne faut pas déclarer Env, ligne 29, juste la structure. Tu déclares la variable dans main.c
Si tu peux mettre des espaces pour aérer ce sera encore mieux ;-)
Essaye de ne pas trop utilier les variables globales parce que là j'ai un peu de mal à m'y retrouver.
Pour les opérations tu as fait des pointeurs de fonctions, c'est une bonne idée. Mais je pense que pour l'instant tu pouvais juste de faire un switch sur le caractere de l'operation et retourner le resultat en consequence...
Corrige déjà tout ça et maile moi quand ta nouvelle version.
Bonne chance
Exemple simple de makefile :
OBJ= Analyse.o Environnement.o Expression.o Operation.o SRC= Analyse.c Environnement.c Expression.c Operation.c APP=plop CC=g++ CFLAGS=-W -Wall -lm depend: $(CC) -MM $(SRC) > .dependfile %.o:%.c $(CC) $(CFLAGS) -c $< all: $(OBJ) main.c $(CC) $(CFLAGS) -o $(APP) main.c $(OBJ) clean: rm -f *.o $(APP) run: ./$(APP) ifeq (.dependfile,$(wildcard .dependfile)) include .dependfile endif
Pour compiler la premiere fois, tape :
make clean depend all
Par la suite :
make
2) Dans Analyse.c, ligne 178
char*parametres; //... /*affichage de la fonction avec ces parametres et sa definition*/ printf("%s(%s",ligne,parametres[0]);
Je pense que là il y a un soucis : c'est soit %s(%c si tu lis un caractère, soit %s(%s mais en utilisant un atoi pour convertir la chaine en valeur numerique.
Idem ligne 182
Ligne 62
char **pp = (char **) malloc (sizeof(char *) * n);
Ligne 73
(p != NULL) ? p = NULL : (void) 0;
Ca ne veut rien dire, que veux tu faire ?
3) Dans Environnement.h
Il ne faut pas déclarer Env, ligne 29, juste la structure. Tu déclares la variable dans main.c
Si tu peux mettre des espaces pour aérer ce sera encore mieux ;-)
Essaye de ne pas trop utilier les variables globales parce que là j'ai un peu de mal à m'y retrouver.
Pour les opérations tu as fait des pointeurs de fonctions, c'est une bonne idée. Mais je pense que pour l'instant tu pouvais juste de faire un switch sur le caractere de l'operation et retourner le resultat en consequence...
Corrige déjà tout ça et maile moi quand ta nouvelle version.
Bonne chance
Comment créer un programme antiviral en C++?
J'aime créer un programme antiviral qui nomme "BitKillVir AntiVirus"!
J'aime créer un programme antiviral qui nomme "BitKillVir AntiVirus"!
mamiemando
Messages postés
33446
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
20 décembre 2024
7 812
9 déc. 2005 à 11:24
9 déc. 2005 à 11:24
Ouvre un nouveau sujet.
mamiemando
Messages postés
33446
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
20 décembre 2024
7 812
9 déc. 2005 à 11:25
9 déc. 2005 à 11:25
Ok Grizzly je regarde ca ce soir
Salut,
j'aimerais savoir si quelqu'un pouvait m'aider
à débugger mon code car le compilateur (utilisation de
gdb) m'indique des erreurs lignes 119,169 et 252 mais
je n'arrive pas à résoudre
Merci
j'aimerais savoir si quelqu'un pouvait m'aider
à débugger mon code car le compilateur (utilisation de
gdb) m'indique des erreurs lignes 119,169 et 252 mais
je n'arrive pas à résoudre
Merci
#include<stdio.h> #include<stdlib.h> #include<float.h> #include<string.h> #include<ctype.h> #define MAX 100 enum Type {Operateur, Constante, Variable}; union Info { double cte; char *nom; char op; }; struct noeud{ enum Type type; union Info info; struct noeud *gauche; struct noeud *droit; }; typedef struct noeud Noeud; typedef struct noeud * Expression; typedef struct _Symbole{ int type; char *nom; double val; int nb_parametres; char **parametres; Expression e; } Symbole; /* Fonction qui gere les espaces */ void espace(char **ligne) { while(*ligne[0] == ' ') ++(*ligne); } int EstReel(char *ligne, double *val) { double v; char *endptr; v=strtod(ligne,&endptr); /* la chaine commence par un chiffre */ if(endptr!=ligne) { /* la chaine ne contient pas que des chiffres */ if(*endptr!='\0') { fprintf(stderr,"erreur\n"); return 1; } /* la chaine ne contient que des chiffres */ if(v<=DBL_MIN||v>=DBL_MAX) { fprintf(stderr,"debordement\n"); return 1; } /* on recupere la valeur */ *val=v; return 0; } else return 1; } /* Fonction qui teste si la chaine passee en parametre est une variable */ int EstVariable(char *ligne) { if(isalpha(*ligne)) { ++ligne; while(isalnum(*ligne)) ligne++ ; } if(*ligne=='\0') return 0 ; else return 1; } /* Analyse d'une expression:creation de l'arbre */ Expression AnalyseExpression(char **ligne) { Expression e; char *sep=NULL; double val; char c; espace(ligne); e = (Expression)malloc(sizeof(Noeud)); if(e == NULL) return NULL; /* c'est un chiffre */ if(isdigit((*ligne)[0])) { /* on cherche le premier blanc pour recuperer la valeur */ if(!(sep = strchr(*ligne,' '))) { fprintf(stderr,"erreur\n"); return NULL; } *sep = '\0'; /* verifie que le reel est bien ecrit */ if(EstReel(*ligne,&val)) { fprintf(stderr,"erreur\n"); return NULL; } e->type = Constante; e->info.cte = val; e->gauche = NULL; e->droit = NULL; *ligne = (sep+1); espace(ligne); } else { /* c'est une lettre */ if(isalpha((*ligne)[0])) { /* on cherche le premier blanc pour recuperer le nom */ if(!(sep = strchr(*ligne,' '))) { fprintf(stderr,"erreur\n"); return NULL; } *sep = '\0'; /* verifie que la variable est bien ecrite */ if(EstVariable(*ligne)) { fprintf(stderr,"erreur\n"); return NULL; } e->type = Variable; e->info.nom = *ligne; e->gauche = NULL; e->droit = NULL; *ligne = (sep+1); espace(ligne); } else{ /* le caractere est un operateur */ c=(*(*ligne)++); if(c == '+' || c == '-' || c == '*' || c == '/') { e->type = Operateur; e->info.op = c; e->gauche = AnalyseExpression(ligne); e->droit = AnalyseExpression(ligne); } else if(c == '@' || c == '~') { e->type = Operateur; e->info.op = c; e->gauche = AnalyseExpression(ligne); e->droit = NULL; } else printf("Erreur,'%c' n'est pas un operateur prevu\n",c); } } return e; } /* Affichage de l'arbre en infixe */ void Infixe(Expression e) { switch(e->type) { case Constante: printf("%f",e->info.cte); break; case Variable: printf("%s",e->info.nom); break; case Operateur: switch(e->info.op){ case'+': case'-':/* affichage infixe sans () */ Infixe(e->gauche); if(e->info.op == '+') printf("+"); else printf("-"); Infixe(e->droit); break; case'*': case'/':/* affichage infixe avec () */ if(e->gauche->type != Operateur) Infixe(e->gauche); else { printf("("); Infixe(e->gauche); printf(")"); } if(e->info.op == '*') printf("*"); else printf("/"); if(e->droit->type != Operateur) Infixe(e->droit); else { printf("("); Infixe(e->droit); printf(")"); } break; case'@':/* affichage prefixe */ printf("@"); Infixe(e->gauche); break; case'~': printf("~"); Infixe(e->gauche); break; } } } int main(void) { char *ligne = " + * 1 2 7"; Expression e = NULL; if(AnalyseExpression(&ligne)==NULL) { fprintf(stderr,"erreur\n"); return 1; } e=AnalyseExpression(&ligne); return 0; }
mamiemando
Messages postés
33446
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
20 décembre 2024
7 812
10 déc. 2005 à 19:47
10 déc. 2005 à 19:47
Tu devrais ouvrir un nouveau post en fait maintenant que tout le monde voit ton code et puisse t'aider.
Bonjour mamiemando ,
j'ai réussi à coder tout ce qu'il faut à part les fonctions avec intervalles (cf énoncé en 1ère page).
Est ce que tu pourrais m'écrire en pseudo-code la manière de procéder.
Merci d'avance
j'ai réussi à coder tout ce qu'il faut à part les fonctions avec intervalles (cf énoncé en 1ère page).
Est ce que tu pourrais m'écrire en pseudo-code la manière de procéder.
Merci d'avance
mamiemando
Messages postés
33446
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
20 décembre 2024
7 812
18 déc. 2005 à 23:04
18 déc. 2005 à 23:04
Tu peux utiliser une structure du genre :
Ou inf désigne la borne inférieure (sauf si c'est -l'infini) et sup la borne supérieure (sauf si c'est +l'infini).
C'est pas trop dur là quand même... Faut chercher un peu ;-)
struct intervalle{ unsigned int type_inf;//0 si inf inclu, 1 si inf=-l'infini, 2 si inf exclu unsigned int type_sup;//0 si sup inclu, 1 si sup=+l'infini, 2 si sup exclu double inf; double sup; };
Ou inf désigne la borne inférieure (sauf si c'est -l'infini) et sup la borne supérieure (sauf si c'est +l'infini).
int est_dans_intervalle(struct intervalle i,double val){ return ( i.inf==1 || val > inf || (val==i.inf && i.inf == 0)) && ( i.sup==1 || val < sup || (val==i.sup && i.sup == 0)); }
C'est pas trop dur là quand même... Faut chercher un peu ;-)
1 déc. 2005 à 12:21
je voudrais savoir si tu accepterais que je t'envoies ce que j'ai fait par mail.