Null en c

Fermé
gdavis - 12 juin 2008 à 18:01
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 24 juin 2008 à 09:56
Bonjour,

Je vous rappelle que je rampe encore en c.

Mon prob est d'écrire un algo me permettant de retrouver la représentation fonctionnelle d'un arbre abstrait à partir de sa représentation préfixée d'une part et de sa représentation postfixée d'autre part.

Corriger mes erreur dans le prog ci-dessous pour que je puisse résoudre mon pro.

/* Les composantes de l'arbre seront donc soit des opérateurs (noeuds),*/
/* soit des opérandes (feuilles). Nous allons choisir les déclarations suivantes :*/

#include <stdio.h>


typedef float type_feuille;
typedef struct s_noeud_2
{char op_c;
struct s_comp*fils1;
struct s_comp*fils2;
}type_noeud_2;

typedef struct s_noeud_1
{char op_c;
struct s_comp*fils;
}type_noeud_1;

typedef struct s_comp
{int arite;
union
{type_noeud_2 n2;
type_noeud_1 n1;
type_feuille f;
}val;
}composante;

typedef composante *lien;



main
{
lien saisie_prefixe(char **deb);
affiche_prefixe(lien x);
lien saisie_postfixe(char **deb);
affiche_postfixe(lien x;
affiche_fonctionnelle(lien x);
}


/* Fonction créant l'arbre à partir d'une chaîne de caractères préalablement saisie,*/
/* contenant l'expression en notation préfixée on donne une chaîne de caractère contenant*/
/*l'expression en notation préfixée. les opérateurs possibles sont +,-,*,/(deuxaires), */
/* C,S(cos,sin,unaires).*/
/* Les nombres sont séparés par des blancs (optionnels pour les opérateurs) */
/* Les nombres commencent par un chiffre (exemple 0.7 au lieu de .7). */
/* deb pointe sur le début de chaîne, il pointera ensuite sur le reste de la chaîne */
/* (pas encore traitée) donc passage par adresse d'un pointeur */


lien saisie_prefixe(char **deb)

{
lien x;
printf("entrez op‚randes (nombres) et op‚rateurs (+,-,*,/,C (cos),S)\n");
printf("s‚par‚s par des blancs\n");
printf(" \n");
/* char c; */
while(**deb==' '||**deb==',') (*deb)++;
if(**deb==0) /* on est arrivé en fin de chaîne */
{puts("erreur : il doit manquer des opérandes");
return(NULL);}
x=(composante*)malloc(sizeof(composante));
if(isdigit(**deb))
{
x->arite=0;
sscanf(*deb,"%f",&(x->val.f));
while(isdigit(**deb)||**deb=='.') (*deb)++;
}
else
{
c=toupper(*((*deb)++));
if(c=='*'||c=='/'||c=='+'||c=='-')
{
x->arite=2;
x->val.n2.op_c=c;
x->val.n2.fils1=saisie_prefixe(deb);
x->val.n2.fils2=saisie_prefixe(deb);
}
else if(c=='C'||c=='S')
{
x->arite=1;
x->val.n1.op_c=c;
x->val.n1.fils=saisie_prefixe(deb);
}
else printf("erreur, '%c'n'est pas un opérateur prévu\n",c);
}
return(x);
}



/* Fonction créant l'arbre à partir d'une chaîne de caractères préalablement saisie, contenant l'expression en notation postfixée */


lien saisie_postfixe(char **deb)

{
lien x;
printf("entrez op‚randes (nombres) et op‚rateurs (+,-,*,/,C (cos),S)\n");
printf("s‚par‚s par des blancs\n");
char c;
while(**deb==' '||**deb==',') (*deb)++;
if(**deb==0) /* on est arrivé en fin de chaîne */
{puts("erreur : il doit manquer des opérandes");
return(NULL);}
x=(composante*)malloc(sizeof(composante));
if(isdigit(**deb))
{
x->arite=0;
sscanf(*deb,"%f",&(x->val.f));
while(isdigit(**deb)||**deb=='.') (*deb)++;
}
else
{
c=toupper(*((*deb)++));
if(c=='*'||c=='/'||c=='+'||c=='-')
{
x->arite=2;
x->val.n2.fils1=saisie_prefixe(deb);
x->val.n2.fils2=saisie_prefixe(deb);
x->val.n2.op_c=c;
}
else if(c=='C'||c=='S')
{
x->arite=1;
x->val.n1.fils=saisie_prefixe(deb);
x->val.n1.op_c=c;
}
else printf("erreur, '%c'n'est pas un opérateur prévu\n",c);
}
return(x);
}




/* Utilisation de l'arbre pour afficher sa représentation fonctionnelle. */
/* On afficher la valeur du noeud puis le fils gauche et le fils droit séparés*/
/* par une virgule et tous deux entre parenthèse. */


void affiche_prefixe(lien x)
{

switch(x->arite)
{
case 0:printf("%6.1f ",x->val.f);break;

case 1:printf(" %C ",x->val.n1.op_c);
affiche_prefixe(x->val.n1.fils);
break;

case 2:printf(" %c ",x->val.n2.op_c);
affiche_prefixe(x->val.n2.fils1);
affiche_prefixe(x->val.n2.fils2);
}
}

void affiche_postfixe(lien x)
{

switch(x->arite)
{
case 0:printf("%6.1f ",x->val.f);break;

case 1:affiche_postfixe(x->val.n1.fils);
printf(" %C ",x->val.n1.op_c);
break;

case 2:affiche_postfixe(x->val.n2.fils1);
affiche_postfixe(x->val.n2.fils2);
printf(" %c ",x->val.n2.op_c);
}
}

void affiche_fonctionnelle(lien x)
{
switch(x->arite)
{
case 0:printf("%6.1f ",x->val.f);break;

case 1:printf(x->val.n1.op_c," %C( ");
affiche_fonctionnelle(x->val.n1.fils);
putch(')');
break;

case 2:printf(" %c ",x->val.n2.op_c);

if(x->val.n2.fils1->arite!=0)putch('(');
affiche_fonctionnelle(x->val.n2.fils1);
if(x->val.n2.fils1->arite!=0)putch(')');

putch(',')


if(x->val.n2.fils2->arite!=0)putch('(');
affiche_fonctionnelle(x->val.n2.fils2);
if(x->val.n2.fils2->arite!=0)putch(')');
putch(',')
}
}

Quand je compile, les erreurs ne me laissent pas respirer en commençant par le char de lien saisie_postfixe(char **deb) qu'il ignore carrément.

Je veut voir quelque chose qui marche avant de dormir.

Merci d'avance pour lami qui m'a permis de décoller.

A plus mes profs

5 réponses

Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
13 juin 2008 à 09:02
Salut.
Bons points pour toi : tu as déjà travaillé le sujet et tu continue, tu nous présente ton code et tout.
Mauvais points : ton code est super long, tu n'explicite pas les erreurs que uas, si elles sont de type compilation, algorithmique ou d'exécution.

Ton programme est long, pas indenté donc pas très lisible (utilise les balises code à l'avenir). Il faut don pas mal de temps pour comprendre ce qu'il fait ce qu'il devrai faire, l'analyser et le corriger. Peu de gens sont disposé à passer autant de temps sur ton problème (moi le premier).

Je te conseil donc de préciser le type d'erreur, et à quel endroit du programme elle se produit.
4
Bonjour prof.

Je pense qu'en parcourant mon code comme un journal; les programmeurs en c détecteront certainement les erreurs.

Quand je parcours un code en fortran, je détecte avec mon expérience dans ce langage pas tout les probs mais quelques prosbs quand même.

En plus, j'ai fait un copier/coller de mon éditeur vers l'environnement de comment çà marche. Si les imbrications ne ressortent pas dans ce code c'est du à cela.

Bonne journée Char
0
gdavis Messages postés 4 Date d'inscription samedi 7 juin 2008 Statut Membre Dernière intervention 13 juin 2008 3
13 juin 2008 à 08:49
Voici mon état d'évolution.

Reppel de l'objectif

Mon prob est d'écrire un algo me permettant de retrouver la représentation fonctionnelle d'un arbre abstrait à partir de sa représentation préfixée d'une part et de sa représentation postfixée d'autre part.

Mais y a tjours des erreurs

/* Les composantes de l'arbre seront donc soit des opérateurs (noeuds),*/
/* soit des opérandes (feuilles). Nous allons choisir les déclarations suivantes :*/

#include <stdio.h>
#include<stdlib.h>

typedef float type_feuille;
typedef struct s_noeud_2
{char op_c;
struct s_comp*fils1;
struct s_comp*fils2;
}type_noeud_2;

typedef struct s_noeud_1
{char op_c;
struct s_comp*fils;
}type_noeud_1;

typedef struct s_comp
{int arite;
union
{type_noeud_2 n2;
type_noeud_1 n1;
type_feuille f;
}val;
}composante;

typedef composante *lien;


lien saisie_prefixe(char **deb);
void affiche_prefixe(lien x);
lien saisie_postfixe(char **deb);
void affiche_postfixe(lien x);
void affiche_fonctionnelle(lien x);

/*Noeud *alloc (); */

/* PARTIE PRINCIPALE */
main ()
{

/* Noeud *racine;*/
int n;

racine = NULL;

printf ("CHOIX DU TYPE DE REPRESENTATION \n");
printf (" \n");
printf ("Entrer 1 pour une représentation préfixée \n");
printf ("Entrer 2 pour une représentation postfixée \n");

switch(n)

/* Saisie de l'expression préfixée */

case 1: printf ("Saisie une expression préfixée ");
lien saisie_prefixe(char);

printf ("La représentation préfixée est : ");
affiche_prefixe(x);

printf ("Sa représentation fonctionnelle est : ");
affiche_fonctionnelle(lien x);
break;

case 2: printf ("Saisie une expression postfixée ");
lien saisie_postfixe(char);

printf ("La représentation postfixée est : ");
affiche_postfixe(x);

printf ("Sa représentation fonctionnelle est : ");
affiche_fonctionnelle(lien x);
break;

return 0;
}

/* Fonction créant l'arbre à partir d'une chaîne de caractères préalablement saisie,*/
/* contenant l'expression en notation préfixée on donne une chaîne de caractère contenant*/
/*l'expression en notation préfixée. les opérateurs possibles sont +,-,*,/(deuxaires), */
/* C,S(cos,sin,unaires).*/
/* Les nombres sont séparés par des blancs (optionnels pour les opérateurs) */
/* Les nombres commencent par un chiffre (exemple 0.7 au lieu de .7). */
/* deb pointe sur le début de chaîne, il pointera ensuite sur le reste de la chaîne */
/* (pas encore traitée) donc passage par adresse d'un pointeur */

lien saisie_prefixe(char **deb)

{
lien x;
printf("entrez op‚randes (nombres) et op‚rateurs (+,-,*,/,C (cos),S)\n");
printf("s‚par‚s par des blancs\n");
printf(" \n");

char c;
while(**deb==' '||**deb==',') (*deb)++;
if(**deb==0) /* on est arrivé en fin de chaîne */
{puts("erreur : Il doit manquer des opérandes");
return(NULL);}
x=(composante*)malloc(sizeof(composante));
if(isdigit(**deb))
{
x->arite=0;
sscanf(*deb,"%f",&(x->val.f));
while(isdigit(**deb)||**deb=='.') (*deb)++;
}
else
{
c=toupper(*((*deb)++));
if(c=='*'||c=='/'||c=='+'||c=='-')
{
x->arite=2;
x->val.n2.op_c=c;
x->val.n2.fils1=saisie_prefixe(deb);
x->val.n2.fils2=saisie_prefixe(deb);
}
else if(c=='C'||c=='S')
{
x->arite=1;
x->val.n1.op_c=c;
x->val.n1.fils=saisie_prefixe(deb);
}
else printf("erreur, '%c'n'est pas un opérateur prévu\n",c);
}
return(x);
}

/* Fonction créant l'arbre à partir d'une chaîne de caractères préalablement saisie, contenant l'expression en notation postfixée */


lien saisie_postfixe(char **deb)

{
lien x;
printf("entrez opérandes (nombres) et opérateurs (+,-,*,/,C (cos),S)\n");
printf("séparés par des blancs\n");

char c;
while(**deb==' '||**deb==',') (*deb)++;
if(**deb==0) /* on est arrivé en fin de chaîne */
{puts("erreur : il doit manquer des opérandes");
return(NULL);}
x=(composante*)malloc(sizeof(composante));
if(isdigit(**deb))
{
x->arite=0;
sscanf(*deb,"%f",&(x->val.f));
while(isdigit(**deb)||**deb=='.') (*deb)++;
}
else
{
c=toupper(*((*deb)++));
if(c=='*'||c=='/'||c=='+'||c=='-')
{
x->arite=2;
x->val.n2.fils1=saisie_prefixe(deb);
x->val.n2.fils2=saisie_prefixe(deb);
x->val.n2.op_c=c;
}
else if(c=='C'||c=='S')
{
x->arite=1;
x->val.n1.fils=saisie_prefixe(deb);
x->val.n1.op_c=c;
}
else printf("erreur, '%c'n'est pas un opérateur prévu\n",c);
}
return(x);
}

/* Utilisation de l'arbre pour afficher sa représentation fonctionnelle. */
/* On affiche la valeur du noeud puis le fils gauche et le fils droit séparé*/
/* par une virgule et tous deux entre parenthèse. */



void affiche_prefixe(lien x)
{

switch(x->arite)
{
case 0:printf("%6.1f ",x->val.f);break;

case 1:printf(" %C ",x->val.n1.op_c);
affiche_prefixe(x->val.n1.fils);
break;

case 2:printf(" %c ",x->val.n2.op_c);
affiche_prefixe(x->val.n2.fils1);
affiche_prefixe(x->val.n2.fils2);
break;
}
}

void affiche_postfixe(lien x)
{

switch(x->arite)
{
case 0:printf("%6.1f ",x->val.f);break;

case 1:affiche_postfixe(x->val.n1.fils);
printf(" %C ",x->val.n1.op_c);
break;

case 2:affiche_postfixe(x->val.n2.fils1);
affiche_postfixe(x->val.n2.fils2);
printf(" %c ",x->val.n2.op_c);
}
}

void affiche_fonctionnelle(lien x)
{
switch(x->arite)
{
case 0:printf("%6.1f ",x->val.f);
break;

case 1:printf(x->val.n1.op_c," %C( ");
affiche_fonctionnelle(x->val.n1.fils);
putch(')');
break;

case 2:printf(" %c ",x->val.n2.op_c);

if(x->val.n2.fils1->arite!=0) putch('(');
affiche_fonctionnelle(x->val.n2.fils1);
if(x->val.n2.fils1->arite!=0)putch(')');

putch(',');

if(x->val.n2.fils2->arite!=0) putch('(');
affiche_fonctionnelle(x->val.n2.fils2);

if(x->val.n2.fils2->arite!=0)putch(')');
putch(',');
}
}

0
Bosoir à tous.

J'ai pu débloquer mon prob. Merci à tous ceux qui me permettent d'évoluer en c, plu particulièrement à lami

Cependant, j'aimerais aussi programmer l'effet inverse.
C'est à dire

un programme en c qui :
A - prend en entrée une expression arithmétique sous la forme fonctionnelle

B - et produit en sortie
1 - sa forme préfixée et;
2 - sa forme postfixée.

Salut à tous
0
Bonjour et merci à tous ceux qui me sont venu en aide jusqu'ici.
J'ai pu trouvé une solution à mon premier prob précédemment posé.

J'aimerai effectuer l'opération inverse.
C'est à dire
Un programme qui lit une expression sous la forme fonctionnelle et
affiche sa forme préfixée et sa forme post fixée

En fait: voici mon programme.
Les parties marquée en gras me donnent encore des maux de tête

Dans le main
l'appel des fonction,
- saisie_fonctionnelle(deb, y)
- affichage_prefixe(y)
- affichage_postfixe(y)

présentent des erreurs suivant:
- suspicious pointer conversion in function ...
- possible use of 'deb' before definition function
- possible use of 'y' before definition function

/* PROGRAMME PERMETTANT DE LIRE UNE EXPRESSION SOUS LA FORME FONCTIONNELLE */
/* ET AFFICHE SA REPRESENTATION SOUS LA FORME PREFIXEE D4UNE PART */
/* ET SOUS LA FORME POSTFIXEE D4AUTRE PART */

#include <stdio.h>
#include<stdlib.h>
#include<alloc.h>


/* Les composantes de l'arbre seront donc soit des opérateurs (noeuds),*/
/* soit des opérandes (feuilles). Nous allons choisir les déclarations suivantes :*/


typedef float type_feuille;
typedef struct s_noeud_2
{char op_c;
struct s_comp*fils1;
struct s_comp*fils2;
}type_noeud_2;

typedef struct s_noeud_1
{char op_c;
struct s_comp*fils;
}type_noeud_1;

typedef struct s_comp
{int arite;
union
{type_noeud_2 n2;
type_noeud_1 n1;
type_feuille f;
}val;
}composante;

typedef composante *lien;


lien saisie_fonctionnelle(char **deb, lien x);
void affiche_prefixe(lien x);
void affiche_postfixe(lien x);

type_noeud_2 *alloc();


/* PARTIE PRINCIPALE */

main ()

{

type_noeud_2 *deb;
lien y;

/*deb = NULL; /*

printf ("ENTRER L'EXPRESION FONCTIONNELLE \n");
printf (" \n");


/* Saisie de l'expression fonctionnelle */


printf ("Saisie une expression fonctionnelle \n ");

do
{
lien saisie_fonctionnelle(deb, y); ;
}
while (deb == '&');



/* Affichage de la forme préfixée */
printf ("La representation préfixée est : ");
affiche_prefixe(y);

/* Affichage de la forme prostfixée */
printf ("La représentation postfixée est : ");
affiche_postfixe(y);

return 0;
}

/* Fonction créant l'arbre à partir d'une chaîne de caractères préalablement saisie.*/
/* de l'expression fonctionnelle*/
/* Les opérateurs possibles sont +,-,*,/(deuxaires), C,S(cos,sin,unaires).*/
/* Les caractères '(', ')' et ',' sont des séparateurs */
/* Un nombre commence par un chiffre (exemple 0.7 au lieu de .7). */
/* deb pointe sur le début de chaîne, il pointera ensuite sur le reste de la chaîne */
/* (pas encore traitée) donc passage par adresse d'un pointeur */

lien saisie_fonctionnelle(char **deb, lien x)
{
printf("entrez opérandes (nombres) et opérateurs (+,-,*,/,C (cos),S)\n");
printf("séparés par parenthèses ouvrantes, fermantes ou des virgules \n");
printf(" \n");

while(**deb=='('||**deb==')'||**deb==',') (*deb)++;
if(**deb==0) /* on est arrivé en fin de chaîne */
{puts("erreur : Il doit manquer des opérandes");
return(NULL);}
x=(composante*)malloc(sizeof(composante));
if(isdigit(**deb))
{
x->arite=0;
sscanf(*deb,"%f",&(x->val.f));
while(isdigit(**deb)||**deb=='.') (*deb)++;
}
else
{
char c;
c=toupper(*((*deb)++));
if(c=='*'||c=='/'||c=='+'||c=='-')
{
x->arite=2;
x->val.n2.op_c=c;
x->val.n2.fils1=saisie_fonctionnelle(deb,x);
x->val.n2.fils2=saisie_fonctionnelle(deb,x);
}
else if(c=='C'||c=='S')
{
x->arite=1;
x->val.n1.op_c=c;
x->val.n1.fils=saisie_fonctionnelle(deb,x);
}
else printf("erreur, '%c'n'est pas un opérateur prévu\n",c);
}
return(x);
}



/* Utilisation de l'arbre pour afficher sa représentation fonctionnelle. */
/* On affiche la valeur du noeud puis le fils gauche et le fils droit séparé*/
/* par une virgule et tous deux entre parenthèse. */



void affiche_prefixe(lien x)
{

switch(x->arite)
{
case 0:printf("%6.1f ",x->val.f);break;

case 1:printf(" %C ",x->val.n1.op_c);
affiche_prefixe(x->val.n1.fils);
break;

case 2:printf(" %c ",x->val.n2.op_c);
affiche_prefixe(x->val.n2.fils1);
affiche_prefixe(x->val.n2.fils2);
break;
}
}

void affiche_postfixe(lien x)
{

switch(x->arite)
{
case 0:printf("%6.1f ",x->val.f);break;

case 1:affiche_postfixe(x->val.n1.fils);
printf(" %C ",x->val.n1.op_c);
break;

case 2:affiche_postfixe(x->val.n2.fils1);
affiche_postfixe(x->val.n2.fils2);
printf(" %c ",x->val.n2.op_c);
}
}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
24 juin 2008 à 09:56
do
{
lien saisie_fonctionnelle(deb, y); ;
}
while (deb == '&');

pourquoi mettre lien devant ? Je ne pense pas que ça soit la peine.
et deb=='&' est étrange sachant que deb est de type char**, aurait tu voulu mettre **deb=='&' ?
en fait, j'avais pas vu, au début du main tu déclare deb comme un pointeur sur une structure, et ensuite tu le traite comme un char**. Je doute que ça fasse ce que tu veux.
0