Programme Next fit .

Voir le sujet précédent Voir le sujet suivant Aller en bas

Programme Next fit .

Message  Darkavanger le Sam 17 Avr 2010 - 13:32

Un client passe une commande en transmettant deux informations : son nom et le poids de
la commande. Le programme associe un numéro à la commande puis la traite en utilisant un
1
algorithme qui détermine soit :
– si la commande est placée dans un paquet qui peut la contenir ou
– s’il faut ouvrir un nouveau paquet et placer la commande dans celui-ci.
Les paquets sont représentés par un liste chaînée. Chaque paquet ouvert contient son numéro,
le poids restant et un pointeur vers le paquet suivant. Pour éviter de manipuler des nombres
flottants, le poids des paquets et des commandes sera représenter par des entiers. Pour les deux
premières parties, considérez que les paquets ont une contenance de 100. Également, chaque
paquet mémorise les commandes qui lui sont associées sous la forme d’une liste chaînée. Vous
pouvez voir un exemple d’une telle structure dans la figure 1 ; cette structure a été obtenue
après avoir traité 11 commandes avec l’algorithme FIRST FIT (nous en parlerons plus en détail
dans la partie suivante). Il faut donc utliser deux structures différentes : une pour les paquets et
une pour les commandes. Cette façon de procéder devra permettre de passer facilement d’un
algorithme à un autre, il suffit pour cela de changer la fonction qui décide où doit être placé le
paquet.

Le but de cette partie est de programmer les algorithmes 1 et 2. L’algorithme NEXT FIT place la
commande dans le dernier paquet qui a été ouvert si celui-ci peut le contenir, sinon il ouvre un
nouveau paquet. L’algorithme FIRST FIT place la commande dans le premier paquet pouvant
le contenir.
Algorithm 1 NEXT FIT.
ENTRÉES: un pointeur p vers le paquet 1, une commande com comprenant, entre autre, un
champ poids com:po
Code:
1: tantque p ! suivant 6= NULL faire
2: p = p ! suivant
3: fin tantque
4: si p ! reste  com:po alors
5: rajouter la commande dans le paquet pointé par p
6: sinon
ouvrir un nouveau paquet et placer la commande dans celui-ci
7: finsi

J'ai réaliser un programme nextfit mais j'ai du mal a le terminer. Pourriez vous m'aider? Je vous met mon programme ci dessous.
Code:

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

typedef struct Commande
{
    int numero;
    char nom[100];
    int poi;
    struct Commande *suivant;
}Commande;

typedef struct Paquet
{
    int numero;
    int reste;
    struct Paquet *suivant;
    struct Commande *Pcommande;
}Paquet;

void nextFit(struct Commande X);

int main()
{
    char rien[20],nom[20]
    Paquet alpha;
    alpha.numero = 1;
    alpha.rest = 100;
    alpha.nom = "al";
    alpha.suivant = NULL;
    alpha.Pcommande = NULL;
    Paquet *p = NULL;
    p = α
    while(fscanf ("Commandes.txt","%s%s%d",&rien,&nom,&poidscom)!= EOF)
    {
        nextFit(nom,poidscom,p);
    }
    return 0;
}

void nextFit(char nom[20],int poidscom)
{
    Paquet *Pactuel = NULL;
    Pactuel = p;
    commande *com = NULL;

            if(Pactuel->reste >= poidscom)
            {
                com = Pactuel->Pcommande
                while(com = NULL)
                {
                    com = Pactuel->Pcommande->suivant;
                   
                while(X.suivant != NULL)
                {
                    commande = commande.suivant;
                }
                commande.suivant = X;
            }
            else
            {
                Paquet.p2;
                p->suivant = p->numero + 1;
                p2.reste = 100 - X.poi;
                p2.commande = X;
            }
        }
    }
}
[-mod- Merci d'utiliser les balises de code ...]

Darkavanger

Messages : 2
Date d'inscription : 17/04/2010

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Programme Next fit .

Message  -ed- le Dim 25 Avr 2010 - 10:40

Attention. Ce messages d'erreur me font penser que tu compiles avec un compilateur C++ et non C comme il se doit (sinon, tu ne posterais pas ici). Veiller à bien créer un projet C avec Code::Blocks (par défaut, c'est C++).
Code:

-------------- Build: Debug in hello ---------------

Compiling: main.c
Linking console executable: bin\Debug\hello.exe
C:\dev\hello\main.c:23: warning: function declaration isn't a prototype
C:\dev\hello\main.c: In function `main':
C:\dev\hello\main.c:25: error: syntax error before "Paquet"
C:\dev\hello\main.c:26: error: `alpha' undeclared (first use in this function)
C:\dev\hello\main.c:26: error: (Each undeclared identifier is reported only once
C:\dev\hello\main.c:26: error: for each function it appears in.)
C:\dev\hello\main.c:31: warning: ISO C90 forbids mixed declarations and code
C:\dev\hello\main.c:32: error: stray '\206' in program
C:\dev\hello\main.c:32: error: stray '\177' in program
C:\dev\hello\main.c:33: error: syntax error before "while"
C:\dev\hello\main.c:24: warning: unused variable `rien'
C:\dev\hello\main.c:25: warning: unused variable `nom'
C:\dev\hello\main.c: At top level:
C:\dev\hello\main.c:41: error: conflicting types for 'nextFit'
C:\dev\hello\main.c:20: error: previous declaration of 'nextFit' was here
C:\dev\hello\main.c:41: error: conflicting types for 'nextFit'
C:\dev\hello\main.c:20: error: previous declaration of 'nextFit' was here
C:\dev\hello\main.c: In function `nextFit':
C:\dev\hello\main.c:43: error: `p' undeclared (first use in this function)
C:\dev\hello\main.c:44: error: `commande' undeclared (first use in this function)
C:\dev\hello\main.c:44: error: `com' undeclared (first use in this function)
C:\dev\hello\main.c:49: error: syntax error before "while"
C:\dev\hello\main.c:53: error: `X' undeclared (first use in this function)
C:\dev\hello\main.c:61: error: syntax error before '.' token
C:\dev\hello\main.c:63: error: `p2' undeclared (first use in this function)
C:\dev\hello\main.c: At top level:
C:\dev\hello\main.c:40: warning: unused parameter 'nom'
C:\dev\hello\main.c:67: error: syntax error before '}' token
Process terminated with status 1 (0 minutes, 0 seconds)
19 errors, 5 warnings
Ceci-dit, il y a quand même beaucoup d'erreurs dans le codage ...

Début de correction commentée (-ed-) :
Code:

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

typedef struct Commande
{
  int numero;
  char nom[100];
  int poi;
  struct Commande *suivant;
}
Commande;

typedef struct Paquet
{
  int numero;
  int reste;
  struct Paquet *suivant;
  struct Commande *Pcommande;
}
Paquet;

/* -ed- inutile ici de faire un prototype séparer.
        Il suffit de définir avant d'utiliser */
void nextFit (char nom[20], int poidscom)
{
  Paquet *Pactuel = NULL;
  Commande *com = NULL;        /* -ed- Attention, en C, 'commande' est <> de
                                  'Commande' !
                                  Deplacé, car en C, on ne peut melanger
                                  definition de variables et instructions.
                                */

  Pactuel = p;                /* -ed- 'p' est inconnu. Quelle etait ton
                                  intention ?
                                */

  if (Pactuel->reste >= poidscom)
  {
      com = Pactuel->Pcommande; /* -ed- manquait un ';' */

      while (com == NULL)      /* -ed- Attention, en C '=' est <> de '==' ! */
      {
        com = Pactuel->Pcommande->suivant;

        while (X.suivant != NULL) /* -ed- 'X' n'est pas défini ... */
        {
            commande = commande.suivant; /* 'commande' n'est pas défini ... */
        }
        commande.suivant = X;
      }

      /* -ed- Il ne peut y avoir un else après un while. Uniquement
        après un if. */
      {
        Paquet.p2;
        p->suivant = p->numero + 1;
        p2.reste = 100 - X.poi;
        p2.commande = X;
      }
  }
}

/* -ed- une '}' en trop ... */

int main (void)
{
  char rien[20], nom[20];      /* -ed- manquait un ';' */
  Paquet alpha;
  alpha.numero = 1;
  alpha.reste = 100;          /* -ed- c'est pas 'rest' mais 'reste' */
  alpha.nom = "al";            /* -ed- Il n'y a pas de 'nom' dans une structure
                                  de type Paquet */
  alpha.suivant = NULL;
  alpha.Pcommande = NULL;

  {                            /* -ed- ajouté bloc, car en C, on ne peut melanger
                                  definition de variables et instructions. */
      Paquet *p = NULL;
      p = α              /* -ed- manquait le ';'
                                  Et c'est 'alpha' et non la lettre grecque.
                                  C::B a failli avoir une attaque ...

                                  Enfin, pour avoir l'adresse, on utilise
                                  l'operateur '&'.
                                */

      /* -ed- 'poidscom' n'est pas défini,

        Le 1er argument de fscanf() doit être de type FILE*. Relire le cours
        sur les fichiers ... Ajouté le code nécessaire.
      */
      {
        FILE *fp = fopen ("Commandes.txt", "r");
        if (fp != NULL)
        {
            /* -ed- "%s" attends l'adresse d'un char. Un nom de tableau de char
              est deja de type char * (adresse de char). Il ne faut donc pas
              mettre de '&'.
            */
            while (fscanf (fp, "%s%s%d", rien, nom, &poidscom) != EOF)
            {
              nextFit (nom, poidscom, p);
            }
            fclose (fp);
        }
      }
  }
  return 0;
}
Il reste ceci à corriger :
Code:

-------------- Build: Debug in hello ---------------

Compiling: main.c
Linking console executable: bin\Debug\hello.exe
C:\dev\hello\main.c: In function `nextFit':
C:\dev\hello\main.c:33: error: `p' undeclared (first use in this function)
C:\dev\hello\main.c:33: error: (Each undeclared identifier is reported only once
C:\dev\hello\main.c:33: error: for each function it appears in.)
C:\dev\hello\main.c:45: error: `X' undeclared (first use in this function)
C:\dev\hello\main.c:47: error: `commande' undeclared (first use in this function)
C:\dev\hello\main.c:55: error: syntax error before '.' token
C:\dev\hello\main.c:57: error: `p2' undeclared (first use in this function)
C:\dev\hello\main.c: At top level:
C:\dev\hello\main.c:24: warning: unused parameter 'nom'
C:\dev\hello\main.c: In function `main':
C:\dev\hello\main.c:71: error: structure has no member named `nom'
C:\dev\hello\main.c:100: error: `poidscom' undeclared (first use in this function)
C:\dev\hello\main.c:102: error: too many arguments to function `nextFit'
Process terminated with status 1 (0 minutes, 0 seconds)
10 errors, 1 warnings


Dernière édition par -ed- le Dim 25 Avr 2010 - 14:09, édité 1 fois

_________________
C is a sharp tool !

-ed-
Admin
Admin

Messages : 289
Date d'inscription : 26/05/2008
Age : 60
Localisation : Paris 6eme arrondissement (75, France)

Voir le profil de l'utilisateur http://bien-programmer.fr

Revenir en haut Aller en bas

Re: Programme Next fit .

Message  Darkavanger le Dim 25 Avr 2010 - 14:01

Bonjour, et merci de ta reponse, je vais essayer de voir ce que je peux faire pour la suite du programme. Et j'utilise deja codeblock^^

Darkavanger

Messages : 2
Date d'inscription : 17/04/2010

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Programme Next fit .

Message  -ed- le Dim 25 Avr 2010 - 14:14

Oui, je crois qu'il faut que tu revois les notions de "portée des variables" et de "paramètres de fonctions" ...

_________________
C is a sharp tool !

-ed-
Admin
Admin

Messages : 289
Date d'inscription : 26/05/2008
Age : 60
Localisation : Paris 6eme arrondissement (75, France)

Voir le profil de l'utilisateur http://bien-programmer.fr

Revenir en haut Aller en bas

Re: Programme Next fit .

Message  Contenu sponsorisé Aujourd'hui à 15:30


Contenu sponsorisé


Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum