Création de pile avec INTERFACE

Résolu
rosettesouna Messages postés 12 Date d'inscription jeudi 12 novembre 2009 Statut Membre Dernière intervention 1 juin 2010 - 5 déc. 2009 à 16:34
rosettesouna Messages postés 12 Date d'inscription jeudi 12 novembre 2009 Statut Membre Dernière intervention 1 juin 2010 - 6 déc. 2009 à 15:33

slt tous le monde
je suis debutante en C;et je veux savoir comment créer une pile on utilisant un tableau(pointeur) avec interface qui contient un menu(empiler,depiler,quitter),merci c tres urgent

10 réponses

lural Messages postés 131 Date d'inscription samedi 6 janvier 2007 Statut Membre Dernière intervention 4 janvier 2011 2
5 déc. 2009 à 17:07
Salut
Je suppose que tu dois créer un programme simulant une pile (sans t'appuyer sur une quelconque librairie). Donc il va falloir que tu créer une fonction main pour lancer ton programme avec l'affichage d'un menu (pour tes 3 fonctionnalités) qui lira l'entrée de l'utilisateur.
Pour sa réponse, tu devra faire un switch/case qui appelera suivant le choix, la fonctionnalité demandé. Et il ne te restera donc qu'a coder tes fonctions empiler/dépiler/quitter qui utiliseront un tableau pour stocker les informations.
Le principe d'une pile, c'est que tu n'as accès qu'à la dernière infos que tu viens d'y mettre, donc dans le principe c'est un tableau vide, et une variable qui indiquera le nombre d'élément.
Lorsque tu veux empiler tu rajoutes la variables donné par l'utilisateur dans ton tableau à l'indice de ta variable donnant le nombre d'élement, puis tu rajoutes 1 à cette dernière.
Pour dépiler, tu affiche l'élément de ton tableau à l'indice de ta variable, et tu décrémente celle-çi.
Pour ne pas avoir d'erreur, tu dois vérifier toutes les entrées de l'utilisateur, et surtout vérifier qu'on ne peut dépiler une pile que si elle contient au moins un élément. Après suivant ton niveau, tu devras gérer l'allocation de ton tableau de façon statique ou dynamique...
Pour quitter un <<return 0;>> devrait suffir.

Bon courage
Bye
3
cs_Chouchou182 Messages postés 252 Date d'inscription vendredi 13 juin 2003 Statut Membre Dernière intervention 25 avril 2011 1
6 déc. 2009 à 14:44
Salut,

Ton interface peut être, par exemple (pile.h):
#ifndef PILE_H
#define PILE_H 1

struct pile ;

struct pile* nouvelle();
void detruire(struct pile*);
int est_vide(struct pile*);
int empiler(struct pile*, int);
int depiler(struct pile*);
void afficher(struct pile*);


#endif // ! PILE_H


Ce qui permettrait de faire un joli programme (main.c):
#include<stdio.h>
#include"pile.h"

struct pile* la_pile;

int
main(int argc, char** argv)
{
  int encore = 1;
  la_pile = nouvelle();
  if (la_pile == NULL)
    return 1;
  do
  {
    int ch = getchar();
    int val;
    switch(ch)
    {
      case 'q':
encore = 0;
break;
      case 'a':
afficher(la_pile);
break;
      case 'e':
if (
    scanf("%d", &val) != 1
 ||	
    empiler(la_pile, val)
   )
  fputs("Ne peut empiler", stderr);
break;
      case 'd':
val = depiler(la_pile);
printf("-> %d\n", val);
break;
      case 'v':
if (est_vide(la_pile))
  puts("vide");
else
  puts("non-vide");
break;
      default:
fprintf(stderr, "Commande inconnue: %c\n", ch);
    }
  } while (encore);

  detruire(la_pile);
  return 0;
}


Ensuite, il ne resterait plus qu'à écrire les fonctions de manipulation des piles, ce qui pourrait se faire avec des listes chaînées (pile_l.c):
#include<stdio.h>
#include<stdlib.h>
#include"pile.h"

struct __pile {
  int val;
  struct __pile* next;
};

struct pile {
  struct __pile *p;
};

struct pile*
nouvelle()
{
  struct pile* p;
  p = malloc(sizeof(*p));
  if (p == NULL)
    return NULL;
  p->p = NULL;
  return p;
}

void
__detruire(struct __pile* p)
{
  while (p != NULL)
  {
    struct __pile* aux = p->next;
    free(p);
    p = aux;
  }
}

void
detruire(struct pile* p)
{
  __detruire(p->p);
  free(p);
}

int
est_vide(struct pile* p)
{
  return (p->p == NULL);
}

int
empiler(struct pile* p, int val)
{
  struct __pile* n;
  n = malloc(sizeof(*n));
  if (n == NULL)
    return 1;
  n->val = val;
  n->next = p->p;
  p->p = n;
  
  return 0;
}

int
depiler(struct pile* p)
{
  struct __pile* n = p->p;
  int val = n->val;
  p->p = n->next;
  free(n);
  return val;
}

void
afficher(struct pile* p)
{
  struct __pile* n;
  printf("<");
  for (n = p->p; n != NULL; n = n->next)
  {
    printf("%d; ", n->val);
  }
  printf(">\n");
}


ou encore avec des tableaux (pile_t.c):
#include"pile.h"
#include<stdlib.h>
#include<stdio.h>

#define TAILLE 4

struct pile {
  int data[TAILLE];
  int* top;
};

struct pile*
nouvelle()
{
  struct pile* p;
  p = malloc(sizeof(*p));
  if (p == NULL)
    return NULL;
  p->top = p->data;
  return p;
}

void
detruire(struct pile* p)
{
  free(p);
}

int
est_vide(struct pile* p)
{
  return (p->top == p->data);
}

int
empiler(struct pile* p, int val)
{
  if (p->top - p->data >= TAILLE)
    return 1;
  *(p->top) = val;
  ++(p->top);
  return 0;
}

int
depiler(struct pile* p)
{
  --(p->top);
  return *(p->top);
}

void
afficher(struct pile* p)
{
  int *i = p->top;
  printf("<");
  while (i != p->data)
  {
    --i;
    printf("%d; ", *i);
  }
  printf(">\n");
}


Bonne prog,
3
rosettesouna Messages postés 12 Date d'inscription jeudi 12 novembre 2009 Statut Membre Dernière intervention 1 juin 2010
6 déc. 2009 à 11:18

merci lural,c'est un peu prés le meme principe que j ai analyser,mais le probleme est le code?et ca doit tounré en turbo C avec l'interface???
merci
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
6 déc. 2009 à 12:59
Lural t'a expliqué le principe, à toi et à toi seul d'en faire le code. Si tu bloques sur un point précis, nous t'aiderons en corrigeant le code existant, ou en t'aident à le concrétiser.
Mais aucune ligne de code ne te sera donnée.
0

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

Posez votre question
rosettesouna Messages postés 12 Date d'inscription jeudi 12 novembre 2009 Statut Membre Dernière intervention 1 juin 2010
6 déc. 2009 à 14:13
oui ca c'est sur,c'est a moi d'ecrir le code,juste j ai jamais fait un exercice en turbo C ou il ya interface ???
merci



0
rosettesouna Messages postés 12 Date d'inscription jeudi 12 novembre 2009 Statut Membre Dernière intervention 1 juin 2010
6 déc. 2009 à 14:50

merci beaucoup chouchou
je vais comparer maintenant et je vais l'essayer,et je vais voir
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
6 déc. 2009 à 14:52
C'est très mal exprimée, mais je pense que par "interface", rosettesouna voulait parler de "menu" utilisateur.

En revanche, lui cracher comme cela, la solution, sans lui laisser chercher, sans aucune réflection de sa part, c'est particulièrement anti-pédagogique !
0
rosettesouna Messages postés 12 Date d'inscription jeudi 12 novembre 2009 Statut Membre Dernière intervention 1 juin 2010
6 déc. 2009 à 15:10

mais j ai chercher et j ai ecris le code de la pile,mais comment avoir l interface que j ai jamais entendu parlé c pourquoi!!!
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
6 déc. 2009 à 15:15
mais j ai chercher et j ai ecris le code de la pile,mais comment avoir l interface que j ai jamais entendu parlé c pourquoi!!!

Surveille ton orthographe et relis toi, s'il te plaît.

Il était attendu de toi, que tu postes ton code, notamment la partie qui te faisait défaut. Le processus normal étant que l'on t'aide à parvenir, par toi même, à trouver la solution. Cette démarche à malheureusement été court-circuité...
0
rosettesouna Messages postés 12 Date d'inscription jeudi 12 novembre 2009 Statut Membre Dernière intervention 1 juin 2010
6 déc. 2009 à 15:33

d'accord je le ferais la prochaine fois
merci en tous cas.
0
Rejoignez-nous