Algorithmique-notion de pointeur

Discutez d'informatique ici !
Patrick Yoba Talkibing
Messages: 4
Enregistré le: 12 Avr 2014, 00:40

algorithmique-notion de pointeur

par Patrick Yoba Talkibing » 16 Avr 2014, 14:59

bonjour,
J'ai un problème en algorithmique sur la liste chainée et donc la notion de pointeur que je maitrise pas si je peut avoir votre soutiens.Le problème s’énonce comme suit:

Problème:
1. Créer une structure nommé Étudiant qui est caractérisé par un numéro matricule, un nom et un prénom.
On vous demande de
– créer une procédure qui permet de saisir des étudiants et de les ranger dans une liste chainée ; On veillera à mettre un critère qui permet de stopper la saisi :
– de créer une procédure qui permet d’afficher les informations sur les étudiants saisis.



2. Chaque étudiant a deux notes. On vous demande de créer le nouvel enregistrement nommé Notes qui est caractérisé par NoteCc (Note de contrôle continu) et NoteEx (Note d’exa- men).
Modifier la structure Étudiant afin qu’elle puisse être en relation avec la structure Notes. On vous demande de :
– Créer une procédure de saisi des étudiants ainsi que leurs notes.
– Créer une procédure d’affiche des étudiants avec leurs notes.
– Créer fonction qui renvoie l’étudiant qui a eu la meilleure note d’examen.
– Une fonction qui renvoie la moyenne générale de l’étudiant.
M oyenne = 0.3 ;) noteC C + 0.7 ;) noteEx
– Créer une procédure qui affiche les étudiants par ordre de mérite.
– Afficher la meilleure note d’examen et la moyenne générale de la classe.
– Écrire le programme principal faisant appel aux différents sous programmes



Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 16 Avr 2014, 15:08

slt,

quelle est ta question?
la vie est une fête :)

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 16 Avr 2014, 16:28

Si tu as besoin de réaliser une liste chaînée simple et non doublement chaînée, tu devrais pouvoir aller jeter un coup d'oeil sur les structures de types Pile et File qui sont des listes chainées simples, sauf erreur de ma part x)

Où en es tu ? Qu’est ce qui te bloque précisément ?
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Patrick Yoba Talkibing
Messages: 4
Enregistré le: 12 Avr 2014, 00:40

par Patrick Yoba Talkibing » 17 Avr 2014, 00:19

j'ai pu écrire l'algorithme dans le cas d'une liste de 10 étudiants mais je n’arrive pas à le faire dans le cas d'une liste chainée suite de manque de notion sur le pointeur.Donc si vous pouvez m'aider en débutant la première question,je pourrais m’inspirer pour la suite.

Avatar de l’utilisateur
ampholyte
Membre Transcendant
Messages: 3940
Enregistré le: 21 Juil 2012, 07:03

par ampholyte » 17 Avr 2014, 08:20

Bonjour,

Si tu as besoin de réaliser une liste chaînée simple et non doublement chaînée, tu devrais pouvoir aller jeter un coup d'oeil sur les structures de types Pile et File qui sont des listes chainées simples, sauf erreur de ma part x)


Attention une Pile et File sont plutôt des tableaux sur lequel une variable index vient s'incrémenter et se décrémenter. Bien évidemment il est possible de la construire sur la forme de liste chainée mais personnellement je n'appelle plus ça une pile / file.

Exemple simple (sans realloc et sans pointeur) :
Code: Tout sélectionner
int pile[25];
int index = 0;

void push(int nb) {
    pile[index++] = nb;
}

int pop(void) {
    return pile[--index];
}

int size(void) {
    return index;
}


Dans le cas d'une file, il suffit d'utiliser 2 index et de faire un modulo sur la taille pour boucler sur cette file.


Une liste chainée est plutôt une structure contenant un pointeur sur l'élement suivant ou/et l'élément précédent (doublement chainée).

Exemple simple :
Code: Tout sélectionner
typedef struct List List
struct List {
    int val;
    struct List *next;
};


Donc si vous pouvez m'aider en débutant la première question,je pourrais m’inspirer pour la suite.


Peux-tu nous montrer ton code actuelle, il vaut mieux qu'on t'aide à corriger ton code que de te donner un code tout fait (qui par ailleurs existe déjà dans certains tutos).

Voici quelques tutos qui pourront t'aider :
- http://fr.openclassrooms.com/informatique/cours/les-listes-chainees-2/declaration-en-c-d-une-liste-chainee

- http://www.commentcamarche.net/contents/114-langage-c-les-listes-chainees

- http://chgi.developpez.com/pile/ (ha ba ici il propose un exemple d'une pile sous forme de liste chainée en utilisant non pas un pointeur sur l'élément précédent).

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 17 Avr 2014, 09:32

Salut ampholyte, merci de m'avoir corrigé alors.

Pour moi une liste chaînée c'était une structure avec un pointeur sur l'élément suivant.
Ce dont tu parles avec un pointeur sur l'élément suivant et précédent je pensais qu'il s'agissait d'une liste doublement chaînée. Comme quoi, on en apprend tous les jours ;)
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Avatar de l’utilisateur
ampholyte
Membre Transcendant
Messages: 3940
Enregistré le: 21 Juil 2012, 07:03

par ampholyte » 17 Avr 2014, 10:02

Rockleader a écrit:Salut ampholyte, merci de m'avoir corrigé alors.

Pour moi une liste chaînée c'était une structure avec un pointeur sur l'élément suivant.
Ce dont tu parles avec un pointeur sur l'élément suivant et précédent je pensais qu'il s'agissait d'une liste doublement chaînée. Comme quoi, on en apprend tous les jours ;)


Ba oui, peut-être que je n'étais pas très clair.

Une liste doublement chainée est une structure contenant un pointeur sur l'élement précédent et un pointeur sur l'élément suivant :

Code: Tout sélectionner
typedef struct List List;
struct List {
    int val;
    struct List *prev;
    struct List *next;
};


Une liste chainée est une structure contenant un pointeur vers l'élément suivant OU (exclusif) l'élement précédent.
Code: Tout sélectionner
typedef struct List List;
struct List {
    int val;
    struct List *prev;
};


ou

Code: Tout sélectionner
typedef struct List List;
struct List {
    int val;
    struct List *next;
};


Après c'est juste une appelation, ce qui compte c'est de savoir les manipuler =).

Par contre l'avantage des listes chainées par rapport à des tableaux c'est la facilité et la rapidité pour stocker des élements dans celle-ci.

L'avantage des tableaux c'est la rapidité d'accès aux données (si tu connais la position).

Après il est tout à fait possible pour un tableau d'avoir le comportement d'une liste chainée avec les avantages du tableau mais il faudra jouer avec le realloc.

Après c'est aussi une question de choix. Personnellement, je n'utilise que très rarement les listes chainées et je préfère utiliser des tableaux de structures dynamiques (c'est aussi imposé par mes supérieurs, donc ça me convient :zen: ).

Patrick Yoba Talkibing
Messages: 4
Enregistré le: 12 Avr 2014, 00:40

par Patrick Yoba Talkibing » 18 Avr 2014, 16:04

ampholyte a écrit:Bonjour,



Attention une Pile et File sont plutôt des tableaux sur lequel une variable index vient s'incrémenter et se décrémenter. Bien évidemment il est possible de la construire sur la forme de liste chainée mais personnellement je n'appelle plus ça une pile / file.

Exemple simple (sans realloc et sans pointeur) :
Code: Tout sélectionner
int pile[25];
int index = 0;

void push(int nb) {
    pile[index++] = nb;
}

int pop(void) {
    return pile[--index];
}

int size(void) {
    return index;
}


Dans le cas d'une file, il suffit d'utiliser 2 index et de faire un modulo sur la taille pour boucler sur cette file.


Une liste chainée est plutôt une structure contenant un pointeur sur l'élement suivant ou/et l'élément précédent (doublement chainée).

Exemple simple :
Code: Tout sélectionner
typedef struct List List
struct List {
    int val;
    struct List *next;
};




Peux-tu nous montrer ton code actuelle, il vaut mieux qu'on t'aide à corriger ton code que de te donner un code tout fait (qui par ailleurs existe déjà dans certains tutos).

Voici quelques tutos qui pourront t'aider :
- http://fr.openclassrooms.com/informatique/cours/les-listes-chainees-2/declaration-en-c-d-une-liste-chainee

- http://www.commentcamarche.net/contents/114-langage-c-les-listes-chainees

- http://chgi.developpez.com/pile/ (ha ba ici il propose un exemple d'une pile sous forme de liste chainée en utilisant non pas un pointeur sur l'élément précédent).







j'ai pu déclaré le pointeur qui pointe sur le type tableau puis je l'ai alloué un espace mais les opérations sur ce pointeur me pose encore de problème par rapport au problème surtout la partie des instructions.j'ai vais vous envoié le travail fait et vous allé corrigé là ou y a problème.

Patrick Yoba Talkibing
Messages: 4
Enregistré le: 12 Avr 2014, 00:40

par Patrick Yoba Talkibing » 18 Avr 2014, 18:35

ampholyte a écrit:Ba oui, peut-être que je n'étais pas très clair.

Une liste doublement chainée est une structure contenant un pointeur sur l'élement précédent et un pointeur sur l'élément suivant :

Code: Tout sélectionner
typedef struct List List;
struct List {
    int val;
    struct List *prev;
    struct List *next;
};


Une liste chainée est une structure contenant un pointeur vers l'élément suivant OU (exclusif) l'élement précédent.
Code: Tout sélectionner
typedef struct List List;
struct List {
    int val;
    struct List *prev;
};


ou

Code: Tout sélectionner
typedef struct List List;
struct List {
    int val;
    struct List *next;
};


Après c'est juste une appelation, ce qui compte c'est de savoir les manipuler =).

Par contre l'avantage des listes chainées par rapport à des tableaux c'est la facilité et la rapidité pour stocker des élements dans celle-ci.

L'avantage des tableaux c'est la rapidité d'accès aux données (si tu connais la position).

Après il est tout à fait possible pour un tableau d'avoir le comportement d'une liste chainée avec les avantages du tableau mais il faudra jouer avec le realloc.

Après c'est aussi une question de choix. Personnellement, je n'utilise que très rarement les listes chainées et je préfère utiliser des tableaux de structures dynamiques (c'est aussi imposé par mes supérieurs, donc ça me convient :zen: ).













Algorithme GesEtud
Type
Notes : Enregistrement
noteCc : Réel
noteEx : Réel
Fin Notes
Etudiant : Enregistrement
matricule : Entier
Nom : chaine[30]
Prénom : chaine[20]
Note : Notes
Fin Etudiant


Var

P :*type tableau
Allouer(p)
p -nil

Procédure SaisiNotes
Var

Début

noteEntrer : Réel

Répéter
Ecrire ("donner Note contrôle contenu :) ;
Lire (p.noteEntrer) ;
Jusqu’à p.noteEntrer ;) 0 ET p.noteEntrer ;) 20
E.Note.NoteCc _ p.noteEnter
Répéter
Ecrire ("donner Note examen :),
Lire (p.noteEntrer)
Jusqu’à p.noteEntrer ;) 0 ET p.noteEntrer ;) 20
p.Note.NoteEx p.noteEnter

Fin

Procédure Remplissage (m : Entier ; var T : TAB)
Var i:entier
Début
i : Entier
Pour i de 1 à m faire
Ecrire("matricule : "),
Lire (p.matricule)
Ecrire ("Nom : "),
Lire (p.Nom)
Ecrire ("Prénom : "),
Lire (p.Prénom) p.saisiNote) ;
Fin Pour
Fin
-Procédure AfficheNotes

Début


Ecrire ("Note Contôle Contenu Note Examen ") Ecrire ("************************************")
Ecrire (p.Note.NoteCc," ",p.Note.NoteEx)

fin
-Procédure Affichage (m : Entier)

Début
i : Entier


Ecrire ("matricule: ; Nom: ;Prénom : ")
Ecrire ("****************************************")
Pour i de 1 à n faire
Ecrire (p.matricule," ",)
Lire (p.Nom," ", p.Prénom)
AfficheNotes(p)
Fin Pour

Fin

-Fonction MeilleureNote(m : Entier )

Début

i : Entier
NoteMax : Réel

NoteMax _ p.Note.NoteEx
Pour i de 2 à m Faire
Si p.Note.NoteEx > p. NoteMax Alors
p.NoteMax _ p.Note.NoteEx
Fin Si
Fin Pour
MeilleureNote _NoteMax

fin
-Fonction MoyenneGénérale(m : Entier) : Réel
Var

Début

i : Entier som : Réel


som _ 0
Pour i de 2 à m Faire
som _som + 0.3 x p.Note.noteCc + 0.7 x p.Note.noteEx
Fin Pour
MoyenneGénérale _ som / m

-Programme principal
n : entier
Remplissage (n,ET) Affichage(n,ET)
Ecrire (Meilleur note examen : MeilleureNote(n,ET)) ;
Ecrire( Moyenne générale de la classe : , MoyenneGénérale(n,ET)) ;
Fin



Je demande une correction.

 

Retourner vers ϟ Informatique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite