Programmer une fonction en C

Fermé
sdfsam Messages postés 60 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 29 mai 2011 - 22 janv. 2011 à 22:55
mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 - 28 janv. 2011 à 20:55
bonsoir,
j'ai une fonction que je dois programmer .
le rôle de ma fonction est de faire une opération "BINAIRE" entre deux deux autres qui présentent deux diagramme binaire (DDB)
j'ai l'algorithme et les sous fonctions utilisées:
F,G,H sont des fonctions connues(portes logiques par exemple avec comme argument leurs entrées)

Algorithm:

Diagramme Binaire-OP(F,G,op)

Debut

    If (F =1 or F =0) and(G =1 or G =0) then
           
            Return(F op G)
   
         else
           
                R := T [F,G]

                 If (R = NULL)    / *le Diagramme Binaire de( F op G) est déjà calculé*/
                  
                 Return(R)

                else

                      R :=creer un new Diagramme Binaire

                      T [F,G]:= R  /* stoker le resultat dans une  T */
                      index(R):=min(index(F),index(G))

                              If (index(F)= index(R)) then

                                L1:= Fr F ; H1:= Fr F

                                   [b]Dans le cas contraire/b

                                  L1:= F; H1:= F

                              End if

                    If (index(G)= index(R)) then

                         L2:= Gr G ; H2:= Gr G

                                 [b]Dans le cas contraire/b

                                  L2:= G; H2:= G

                   Fin if

                      Rr R :=BDD-OP-1(L1,L2,op)

                     Rr R :=BDD-OP-1(H1,H2,op)

                     Return(R)

       Fin if

     Fin if

End


merci d'avance


A voir également:

26 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
27 janv. 2011 à 01:34
Sur ce coup je ne vois pas comment t'aider. Ce n'est pas mon domaine, je ne comprends pas les notations de ton fichier pdf etc... Je peux juste te débloquer sur des questions précises.

Est-ce que tu as au moins codé une structure de graphe ? Et est-ce que tu comprends les algorithmes qu'il y a dans ton document pdf ? Est-ce que tu as compris comment utiliser le code que je t'ai donné ?
1
mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 7 812
22 janv. 2011 à 23:42
Quelle est la question ?
0
sdfsam Messages postés 60 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 29 mai 2011
22 janv. 2011 à 23:56
ma question est comment puisse-je programmer cette fonction en langage C
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
Modifié par mamiemando le 23/01/2011 à 00:08
Ben il faut commencer à l'écrire dans un fichier (par exemple main.c) et compiler le tout par exemple avec code::blocks si tu es sous windows, et enfin l'exécuter.

Pour moi qui programme en C tes notations ne me parlent pas trop. Notamment
- comment sont notées les variables associées aux entrées de F, G,?
- quels sont les types des variables d'entrées ?
- quel est le type de retour de leur réponse ?
- que signifie ta notation T[F,G] ?
- que signifie ta notation "Fr F" ?

Je pense que dans un premier temps tu devrais t'exercer à faire quelques programme simples en langage C pour apprendre la syntaxe, apprendre à compiler etc... Et ensuite dans un second temps, tu pourras traduire ton programme.

Voici par exemple pour commencer à découvrir la syntaxe avec les fonctions :

#include <stdio.h> // permet d'appeler printf 

// Cette fonction reçoit un paramètre entier 
// (noté x dans le code de la fonction valeur_absolue 
// et retourne un entier x 
int valeur_absolue(int x){ 
  if (x < 0){ 
    return -x; 
  }else{ 
    return x; 
  } 
} 

// La fonction main est celle dans laquelle démarre 
// le programme 
int main(){ 
  // Début du programme 
  int y = -7; 
  printf("Coucou je vais calculer la valeur absolue de y = %d\n", y); 
  int val_abs_y = valeur_absolue(y); 
  printf("|y| = %d\n", val_abs_y); 
  printf("Et maintenant je quitte !\n"); 

  // Ceci met le programme en pause ce qui est utile sous windows 
  // quand on lance le programme depuis l'explorateur 
  // (sinon il quitte directement la console !) 
  getchar(); 

  // Le programme s'est terminé correctement 
  // Par convention on retourne 0 si tout va bien 
  return 0; 
}


Bonne chance
0

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

Posez votre question
sdfsam Messages postés 60 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 29 mai 2011
23 janv. 2011 à 00:30
merci bien pour les remarques et les conseilles, moi c'est pas la première fois car j'ai déjà exercé sur programme simples
revenant à la fonction et pour vous dire que cette fonction fait parti de mon programme globale c'est une fonction intermédiaire car moi je veux faire un programme qui fait la lecture d'un fichier de données (données logique par exemples: portes logiques et leur entrées ...) et recupérer les données puis les traduire en un Diagramme Binaire et ansi de suite

pouvez vous m'aider???
merci de votre reponse
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
23 janv. 2011 à 12:32
Bah ce que je ne comprends pas c'est comment t'aider en fait. Personnellement je n'ai pas compris le pseudo code que tu avais donné (cf les points que j'ai énuméré) et je n'ai pas compris ce qui te bloquait à ce stade si tu sais développer en C.

Pour lire un fichier il faut utiliser les fonctions fopen, fscanf et fclose. Parfois des outils comme getline peuvent être pratiques (mais pas forcément standard). Avant de parler de diagramme binaire il faudrait définir la structure de données associée en langage C (personnellement je ne sais pas ce que tu appelles un diagramme binaire, si tu as un lien à me faire parvenir...).
0
sdfsam Messages postés 60 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 29 mai 2011
23 janv. 2011 à 13:22
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
24 janv. 2011 à 01:07
Ok je vois ce que c'est. Mais ça ne m'explique pas ce qui te bloque à ce stade et comment je peux t'aider.

Pour moi tu dois commencer par faire un module (ddb.h et ddb.c) qui permettra de gérer une structure de graphe de décision binaire. En C++ tu pourrais même exploiter la librairie boost pour éviter d'avoir à recoder une structure de graphe.

Ensuite pour l'algorithme en lui même vu que certaines notations ne sont pas claires je ne les comprends toujours pas trop.

Enfin vu que tu ne parles pas trop des formats de fichiers que tu as à traiter c'est difficile de te guider. Afin que tu ne te fasses pas de faux espoirs, je n'aurai clairement pas le temps de coder ce genre de chose pour toi. Je peux juste te débloquer si tu cales sur un point précis.

Il faut donc que tu m'indiques clairement un problème concret qui te gêne. Est-ce comment architecturer ton code ? Un problème de compilation ? Une erreur à l'exécution ? Etc...
0
sdfsam Messages postés 60 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 29 mai 2011
24 janv. 2011 à 14:22
Mes données sont dans un fichier txt qui représentent un Arbre de la manière suivante avec des portes logiques (OU par p*1,ET par p+2) et leurs entrées sur chaque ligne , en faite chaque ligne presente une porte logique ( portes ou des événements simple ou leurs complément (e+1 ou e-1) c'est des appellations)

Exemple :

p+0 e+1 e+2 e+3 p*1 p*2

p*1 p+4 p*5

p*2 p+6 p+7

p*3 p+8 p*9

p+4 e+16 e+18 g+10

p*5 e+4 e+5e+6 e+10 e+12 e+14

p+7 e+7 e+8 e+9 e+11 e+13 e+15

p+8 e+17 e+19 g+13

p*9 e+4 e+5

p+10 e+4 e+5 e+6 e+10 e+12 e+14

p*11 e-4 e-5 e-6

mon but est de faire le traitement pour transformer cette arbre à un arbre binaire et d'extraire les coupes minimales selon des algorithmes bien défini.
j'ai un algorithme qui fait ça: mais j'arrive pas à l'implementer

AdD-to-BDD(node)
Start
If (node is a basic event)
then
R := ite(node, 1, 0)
If not /* node is an operator*/
op := the operator associated with node
j := ?rst children of node
R := AdD-to-BDD(j )
For (for all the threads i of node and i is not egal to j)
Make
F := AdD-to-BDD(i )
R := BDD-OP(R,F,op) /* fonction qui définie*/
End for
End if
Return(R)
End

NB:la fonction qui définie BDD-OP(R,F,op) est définie en haut

merci bien
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
24 janv. 2011 à 18:44
Bah il faut que tu lises ton fichier ligne par ligne et que tu appelles une fonction qui extrait une porte tant que cette ligne n'est pas complètement lue. La fonction qui extrait une porte s'attend à lire une lettre (un char), un opérateur (un autre char), et un entier (un int) et le fait grâce à un fscanf. À chaque fois que tu extraies une porte, tu la câbles dans ta structure de graphe.

Personnellement je ne comprends toujours rien aux notations car ce n'est pas du tout mon domaine. Je peux juste te donner les grandes lignes.

Bonne chance
0
sdfsam Messages postés 60 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 29 mai 2011
24 janv. 2011 à 19:47
c'est très gentil de votre part,

svp comment je dois commencer la lecture et comment la je câble dans ma

structure de graphe les extraits que j'ai fait.

car j'ai reussi à faire la lecture mais pas le traitement car ce qui je fais est fopen mais reelement moi je veux le traitement et l'extraction de mes données


merci bien pour vos information
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
24 janv. 2011 à 21:13
Bah c'est là que scanf entre en action pour extraire les triplets (lettre, opérateur, nombre). Arrives-tu déjà à extraire ces triplets ? Ensuite comme je ne sais pas comment se construit le graphe je ne peux pas trop te dire.
0
sdfsam Messages postés 60 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 29 mai 2011
24 janv. 2011 à 21:29
l'algorithme ci dessous explique la transformation;
pendant la lecture cmt puisse je faire cette extraction des triplets .
example svp
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
25 janv. 2011 à 01:31
Ci-dessous le parseur, maintenant à toi de jouer :

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

int main(){
    FILE *fp = fopen("toto.txt","r");
    size_t n = 255;
    char *buffer  = malloc(n * sizeof(char));
    char *triplet = malloc(n * sizeof(char));
    char *pos;
    char lettre;
    char operande;
    int  valeur;
    unsigned no_ligne;

    for(no_ligne = 0; getline(&buffer, &n, fp) != -1; ++no_ligne){
        printf("Ligne %d: %s", no_ligne, buffer);
        pos = buffer;
        while(sscanf(pos, "%s ", triplet) == 1){
            if(sscanf(triplet,  "%c%c%d", &lettre, &operande, &valeur) == 3){
                printf("(%c, %c, %d)\n", lettre, operande, valeur);
            }
            pos += strlen(triplet) + 1;
        }   
    }

    free(buffer);
    free(triplet);
    return 0;
}


toto.txt

p+0 e+1 e+2 e+3 p*1 p*2
p*1 p+4 p*5


Résultat :

Ligne 0: p+0 e+1 e+2 e+3 p*1 p*2
(p, +, 0)
(e, +, 1)
(e, +, 2)
(e, +, 3)
(p, *, 1)
(p, *, 2)
Ligne 1: p*1 p+4 p*5 
(p, *, 1)
(p, +, 4)
(p, *, 5)


Bonne chance
0
sdfsam Messages postés 60 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 29 mai 2011
25 janv. 2011 à 09:51
bonjour,
merci pour votre aide,
qd je compile sous DevC++ il me rend des erreur suivantes:

cannot convert 'int*' to 'const char*' for argument '1' to 'int sscanf(const char*, const char*, ...)'
invalid conversion from 'void*' to 'int*'
'getline' undeclared (first use this function)

merci bien une autre fois
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
25 janv. 2011 à 14:33
Pour getline elle n'est pas vraiment standard tu peux avoir un #define à faire ou devoir recoder la fonction.

https://linux.die.net/man/3/getline

#define _GNU_SOURCE
#include <stdio.h>

...


Pour le sscanf à mon avis tu t'es trompé en recopiant.
0
sdfsam Messages postés 60 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 29 mai 2011
25 janv. 2011 à 22:45
bonsoir et merci bien ,

pour les premières erreurs il fallait mettre :

char *buffer =(char*) malloc(n * sizeof(char));

char *triplet = (char*)malloc(n * sizeof(char));

mais pour la fonction :

getline(&buffer, &n, fp) != -1 j'arrive pas ;

je pense que mon compilateur Dev C++ ne l'accepte pas.

quel'elle est son equivalence ou bien comment on peut la remplacer.

Mr mamiemando ,

j'ai eu un code en C via un ami (cet ami je l'ai perdu)qui est plein de fonctions de

genre expliquer en haut et je veux bien le compiler mais malheureusement ça

marche pas car il manque quelques déclarations.(comme la struct de file à lire ....)

est ce que il y a une possibilité de vous l'envoyer pour me le corriger si c'est

possible votre email, car je vous trouve que vous pouvez bien m'aider.

merci d'avance
0
sdfsam Messages postés 60 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 29 mai 2011
27 janv. 2011 à 08:04
bonjour;

Est-ce que tu as au moins codé une structure de graphe ? Et est-ce que tu comprends les algorithmes qu'il y a dans ton document pdf ? Est-ce que tu as compris comment utiliser le code que je t'ai donné ?

mais bien sur j'ai compris les algorithme , mon probleme est comment je

l'implemente;

je vous explique:

Algorithm 1. Construction of the BDD from the FT

il fait la transformation d'un arbre (ici appelé FT or c'est Fault Tree =arbre de

défaillance) à un arbre binaire donc moi je dois introduire mon arbre sous form

txt par example puis mon algorithme test le type des données exemple les

triplets (node dans l'algorithme) ,si un triplet est une n'est pas une porte faire

ceci et cela sinon le triplet est une porte donc fais ceci et cela

et ansi de suite

por le deuxieme algorithme : c'est une fonction utilisée dans le premier


moi ce qui me bloque c'est comment commencer

c'est tout pas d'autre chose

merci bien
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
27 janv. 2011 à 14:02
Il faut que tu commences par implémenter une structures d'arbre. Dans le cas d'un arbre binaire. On va faire deux fichiers pour ce faire : binary_tree.h et binary_tree.c par exemple. Notons l le fils gauche (left) et r le fils droit (right). Voici à quoi ressemblerait tree.h :

#ifndef BINARY_TREE_H
#define BINARY_TREE_H

typedef struct _binary_tree_node_t{
  struct _binary_tree_node_t *l; /// Fils gauche
  struct _binary_tree_node_t *r; /// Fils droit
  void *data; /// Adresse de la donnée stockée dans le noeud
} binary_tree_node_t;

typedef struct _binary_tree_t{
  binary_tree_node_t * root; /// Racine de l'arbre
} binary_tree_t;

// Noeuds
void free_binary_tree_node(binary_tree_node_t *node);
binary_tree_node_t * alloc_binary_tree_node();

// Arbre
binary_tree_t * alloc_binary_tree();
void free_binary_tree(binary_tree_t *tree);

// Alloue un noeud fils
binary_tree_node_t * add_child_node(
  binary_tree_node_t *node,
  char where /// 'r' ou 'l'
);

// Alloue un noeud parent de l et r
binary_tree_node_t * add_parent_node(
  binary_tree_node_t *l,
  binary_tree_node_t *r
);

#endif


Et le binary_tree.c :

#include "binary_tree.h"
#include <stdlib.h>

binary_tree_node_t * alloc_binary_tree_node(){
  return calloc(1, sizeof(binary_tree_node_t));
}

binary_tree_t * alloc_binary_tree(){
  return calloc(1, sizeof(binary_tree_t));
}

void free_binary_tree_node(binary_tree_node_t *node){
  if(node->r) free_binary_tree_node(node->r);
  if(node->l) free_binary_tree_node(node->l);
  free(node);
}

void free_binary_tree(binary_tree_t *tree){
  if(tree){
    if(tree->root){
      free_binary_tree_node(tree->root);
      free(tree->root);
    }
    free(tree);
  }
}

binary_tree_node_t * add_child_node(
  binary_tree_node_t *node, /// Le noeud sur lequel on greffe child
  char where /// 'l' ou 'r'
){
  binary_tree_node_t *child = NULL;
  if(node){
    binary_tree_node_t *p = NULL;
    switch(where){
      case 'l': p = node->l; break;
      case 'r': p = node->r; break;
    }
    if(p){
      child = alloc_binary_tree_node();
      p = child;
    }
  }
  return child;
}

binary_tree_node_t * add_parent_node(
  binary_tree_node_t *l,
  binary_tree_node_t *r
){
  binary_tree_node_t *parent = alloc_binary_tree_node();
  if(parent){
    parent->l = l;
    parent->r = r;
  }
  return parent;
}


Je n'ai pas testé le code c'est juste pour te donner de quoi démarrer mais dans l'idée ça ressemble à ça.

Ensuite quand tu parses ton fichier tu dois en déduire un morceau de l'arbre. Tu peux le construire en partant des feuilles en appelant comme il faut add_parent_node ou en partant de la racine en appelant add_child_node.

Bonne chance
0
sdfsam Messages postés 60 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 29 mai 2011
27 janv. 2011 à 15:50
merci pour le code mais ou est le main
je le voix pas
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
28 janv. 2011 à 13:14
Il n'y en a pas pour la bonne et simple raison que ceci est un module. Un projet écrit en C comporte un fichier ".c" avec un main et à côté de ça des couples de fichiers ".h" et ".c" qu'on appelle module.

Je crois qu'il faut vraiment que tu lises un cours de langage C avant de commencer sinon tu vas bloquer toutes les 5min.
0