Débuts difficiles...

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

Débuts difficiles...

Message  Emilie Marrionneau le Ven 31 Oct 2008 - 16:49

Je suis débutant en C.
Pour progresser, j'ai trouvé cet exercice à faire qui regroupe les bases du langage.
Je pense que si je comprends bien comment le résoudre, je pars sur de bonnes bases.

Si quelqu'un pouvais m'aider pour ce problème, ca m'arrangerait beaucoup. Merci d'avance...



On souhaite créer un programme très simplifié qui associe à un nom, un numéro d'étudiant.

1) Créer une structure Etudiant pouvant contenir ces information (nom+No). Le nom peut conenir 32 caractères et le No 16 caractères
2) Créer une nouvelle structure représentant le carnet d'adresse. Cette structure Carnet contiendra un tableau de 20 étudiants et un compteur indiquant le nb d'étudiants dans le tableau
3) Créer une fonction qui crée et qui renvoie une structure Etudiant contenant un nom et un numéro passé en argument
4) Ajouter une fonction qui affiche les informations contenues dans la structure Etudiant passée en argument
5) Créer une fonction qui ajoute un étudiant dans un carnet
6) Créer une fonction qui affiche un carnet
7) Faire un programme qui demande de saisir 5 étudiants, qui les ajoutes dans un carnet puis qui affiche son contenu
8) A partir des étapes précédentes, faire un programme gérant un carnet d'adresse. Créer un menu qui propose d'ajouter un nouvel étudiant, d'afficher le canet ou de quitter.
9) Créer une fonction qui recherche un étudiantdans un carnet à partir de son nom et qui renvoie un pointeur sur l'entrée correspondante. Ajouter au menu la fonctionnalité correspondante, c'est à dire la possibilité de retrouver un numéro d'étudiant à partir d'un nom
10) Modifier le menu du programme principal pour ajouter les fonctionnalités suivantes :
- Modifier une formation (ajouter/supprimer un étudiant). Une formation correspond à un carnet. Chaque formation est enregistrée dans un fichier portant son nom formé de 20 caractères
- Imprimer une formation (afficher à l'écran ou sur une imprimante) la liste des étudiants d'une formation

Emilie Marrionneau

Messages : 5
Date d'inscription : 31/10/2008

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Débuts difficiles...

Message  -ed- le Ven 31 Oct 2008 - 17:29

Je suis débutant en C.
débutante ?

Pour progresser, j'ai trouvé cet exercice à faire qui regroupe les bases du langage.
Je pense que si je comprends bien comment le résoudre, je pars sur de bonnes bases.
A condition de connaitre ces bases qui ne se devinent pas. Il faut une solide formation de base. Comment es-tu formée ?

Si quelqu'un pouvais m'aider pour ce problème, ca m'arrangerait beaucoup. Merci d'avance...
Aider à quoi ? Tu n'as pas posté une seul ligne d'analyse, ni une seule ligne de code.

Soit tu débutes de 0 et cet exercice est trop difficile pour toi, soit tu as les bases du C et tu sais le faire (enfin, tu peux au moins essayer).

Si tu débutes de 0, cet exercice est trop complexe. Il est un principe basique de bonne pédagogie qui veut qu'on aborde les nouveaux sujets un par un.

Si tu penses qu'un exercice couvrant l'ensemble des bases du C va te permettre d'acquérir comme par magie les bases du langage C, tu te trompes. Le C est un langage puissant mais bourré de pièges. Il faut six mois à un an pour le maitriser.

On souhaite créer un programme très simplifié qui associe à un nom, un numéro d'étudiant.
C'est un sujet qui n'a rien de simple.

As-tu au moins des notions de programmation et d'analyse ?


Dernière édition par -ed- le Ven 31 Oct 2008 - 19:28, édité 1 fois

-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: Débuts difficiles...

Message  Emilie Marrionneau le Ven 31 Oct 2008 - 17:45

Ok merci!!!

C'est très gentil de ta part!!!

De mon côté, je vais me pencher plus sérieusement sur le problème ce week-end. J'ai des lacunes en C et c'est pas en laissant travailler les autres que je vais les combler!!! Laughing

Bon week-end! Bisous...

Emilie Marrionneau

Messages : 5
Date d'inscription : 31/10/2008

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Débuts difficiles...

Message  -ed- le Ven 31 Oct 2008 - 19:29

J'ai répondu au-dessus.

-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: Débuts difficiles...

Message  Emilie Marrionneau le Lun 3 Nov 2008 - 12:14

Merci pour ta réponse ed!

Concernant mon niveau en C, comme je l'ai dit il est faible.
En fait je suis en master de math et on a un cours d'initiation au C. Le problème c'est que le prof va super vite (beaucoup trop vite pour moi) et je n'arrive pas à suivre. Ajoutez à ca des méthodes pédagogiques discutables et vous obtenez un module a passer au ratrapage en Juin!!!

Regardons cet exercice pas à pas et dites moi si je me trompe, corrigez moi, ... :

Question 1 & 2 :

Je suppose que la première question consiste à déclarer une variable Etudiant qui est en fait une structure contenant le nom et le numéro d'un étudiant.
De la même manière, la 2ème question me demande de créer la structure Carnet.
Donc je serais tentée de taper ceci :

Code:
#include <stdio.h>
struct Etudiant
{
char Nom[32]
char Numero[16]
}
struct Carnet
{
struct Etudiant ListEtudiant[20]
int compteur
}

Est-ce que pour l'instant je m'en sors bien?

Emilie Marrionneau

Messages : 5
Date d'inscription : 31/10/2008

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Débuts difficiles...

Message  -ed- le Lun 3 Nov 2008 - 15:46

Emilie Marrionneau a écrit:Regardons cet exercice pas à pas et dites moi si je me trompe, corrigez moi, ... :

Question 1 & 2 :

Je suppose que la première question consiste à déclarer une variable Etudiant qui est en fait une structure contenant le nom et le numéro d'un étudiant.
De la même manière, la 2ème question me demande de créer la structure Carnet.
Donc je serais tentée de taper ceci :

Code:
#include <stdio.h>
struct Etudiant
{
char Nom[32]
char Numero[16]
}
struct Carnet
{
struct Etudiant ListEtudiant[20]
int compteur
}

Est-ce que pour l'instant je m'en sors bien?
Pour du pseudocode, c'est correct. C'est pas encore du C, je te laisse voir pourquoi...

Le <stdio.h> est pour le moment inutile, mais il risque de servir par la suite...

-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: Débuts difficiles...

Message  Emilie Marrionneau le Mar 4 Nov 2008 - 11:52

En effet, on ne peut pas dire vraiment que c'est du C puisqu'il n'y a pas de programme réellement : pas de fonction main et autres fonctions, juste des déclarations de variables.

Je modifie en conséquence le code que j'ai précédemment posté, mais après compilation, il y a des erreurs : si tu pouvais m'éclairer a ce sujet, ce serait sympa de ta part... (Merci d'ailleurs de me "tutorer" pour mes débuts en C!!!)

Code:
#include <stdio.h>

/*Création de la structure Etudiant*/
typedef struct
   {
   char Nom[32];
   char Numero[16];
   } Etudiant;
/*Création de la structure Carnet*/
typedef struct
   {
   Etudiant ListEtudiant[20];
   int compteur;
   } Carnet;
   
Etudiant Creer_Etudiant(char nom[32], char numero[16]);

main()
{
/*A compléter...*/
}

Etudiant Creer_Etudiant(char nom[32], char numero[16])
{
Etudiant Etu;

Etu.Nom=nom;
Etu.Numero=numero;
return(Etu);
}
Voici les erreurs renvoyées après compilation :
Code:
EtudAnu.c: Dans la fonction «Creer_Etudiant» :
EtudAnu.c:27: erreur: incompatible types in assignment
EtudAnu.c:28: erreur: incompatible types in assignment

Emilie Marrionneau

Messages : 5
Date d'inscription : 31/10/2008

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Débuts difficiles...

Message  -ed- le Mar 4 Nov 2008 - 12:33

Emilie Marrionneau a écrit:En effet, on ne peut pas dire vraiment que c'est du C puisqu'il n'y a pas de programme réellement : pas de fonction main et autres fonctions, juste des déclarations de variables.
C'était surtout que la syntaxe était incomplète (manquait des ';').

Voici les erreurs renvoyées après compilation :
Code:
EtudAnu.c: Dans la fonction «Creer_Etudiant» :
EtudAnu.c:27: erreur: incompatible types in assignment
EtudAnu.c:28: erreur: incompatible types in assignment
C'est normal. En C, on ne sait pas assigner un tableau avec =. Il faut utiliser une boucle ou une fonction de copie. Pour les chaines de caractères, on utilise strcpy() (<string.h>). Attention, il n'y a pas de contrôle de débordement. Il faut donc peut être mesurer ce qu'il y a à copier avant de faire la copie...

J'ajoute quelques remarques sur ton code.

1 - La présentation du code est améliorable Je recommande d'utiliser un indenteur automatique comme celui de Code::Blocks (Plugins > AStyle)
2 - main() retourne un int explicite. Il faut donc l'indiquer et retourner cet int. 0 est une valeur portable qui signifie OK.
3 - une fonction qui n'a pas de paramètres est définie avec (void)
4 - Il n'est pas utile de séparer le prototype de la fonction dans un code mono-fichier comme celui-ci. Il suffit de définir la fonction avant utilisation. Les prototypes séparés sont utiles quand on fait de la programmation modulaire. Dans ce cas, ils sont placés dans un .h (header).
5 - La fonction de création de fiche est un peu 'naïve', mais correcte (une fois corrigée). Elle retourne une structure, ce qui n'est pas très optimisé. (beaucoup de copies en perspectives...). Il est préférable de passer à la fonction l'adresse de la structure à remplir. Cette structure provient du tableau de structure que tu as créé. Mais pour ça, il faut connaitre les pointeurs, ce qui sera de toutes façons quasiment inévitable pour la suite.

L'interface serait alors :
Code:
void Creer_Etudiant (Etudiant * p_etu, char nom[], char numero[])


Dernière édition par -ed- le Mar 4 Nov 2008 - 12:48, édité 2 fois (Raison : compléments)

-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: Débuts difficiles...

Message  Emilie Marrionneau le Mer 5 Nov 2008 - 12:47

Merci pour ton aide ed!

Je viens de corriger ce que j'ai fait, et ca compile parfaitement!
Le problème c'est que le résultat obtenu ne me convient pas!!!

Voici le code que j'ai créée :
Code:
#include <stdio.h>
#include <string.h>

/*Création de la structure Etudiant*/
typedef struct
   {
   char Nom[32];
   char Numero[16];
   } Etudiant;
/*Création de la structure Carnet*/
typedef struct
   {
   Etudiant ListEtudiant[20];
   int compteur;
   } Carnet;
int Nb_Etudiant=5;
   
Etudiant Creer_Etudiant(char nom[], char numero[]);
void Afficher_Etudiant(Etudiant Etu);
Carnet Ajout_Etudiant(Carnet Carn, Etudiant Etu);
void Afficher_Carnet(Carnet Car);
void Creer_Carnet();

main()
{
char nom[32], no[16];
Etudiant etu;

printf("\nEntrez un étudiant : \nNom : ");
scanf(" %s", &nom);
printf("\nNuméro : ");
scanf(" %s", &no);
etu=Creer_Etudiant(nom, no);
Afficher_Etudiant(etu);
}

Etudiant Creer_Etudiant(char nom[], char numero[])
{
Etudiant Etu;

strcpy(nom, Etu.Nom);
strcpy(numero, Etu.Numero);
return(Etu);
}

void Afficher_Etudiant(Etudiant Etu)
{
printf("\nNOM : %s\nNuméro : %s\n\n", Etu.Nom, Etu.Numero);
return;
}

Carnet Ajout_Etudiant(Carnet Car, Etudiant Etu)
{
int cpt=Car.compteur;

Car.ListEtudiant[cpt+1]=Etu;
Car.compteur=cpt+1;
return(Car);
}

void Afficher_Carnet(Carnet Car)
{
int k, cpt=Car.compteur;

for(k=0; k<=cpt; ++k)
   {
   Afficher_Etudiant(Car.ListEtudiant[k]);
   }
return;
}

void Creer_Carnet()
{
int k;
char nom[32], numero[16];
Etudiant etudiant;
Carnet carnet;

for(k=0; k<=Nb_Etudiant; ++k)
   {
   printf("\nEtudiant %d : \nNom : ", k);
   scanf("%s", &nom);
   printf("\nNuméro : ");
   scanf("%s", &numero);
   etudiant=Creer_Etudiant(nom, numero);
   carnet=Ajout_Etudiant(carnet, etudiant);
   }
Afficher_Carnet(carnet);
return;
}

Et après éxécution, voici ce que j'obtiens :
Code:
Entrez un étudiant :
Nom : Emilie MARRIONNEAU

Numéro :
NOM : 
Numéro : @���/�����
Donc en fait, ce qu'il se passe c'est que quand j'entre mon nom, ca pose pas de problème, mais ensuite, on ne m'invite pas a entrer mon No d'étudiante et l'affichage pose problème également!!!

Je vois pas d'où ca vient, donc ton aide me serait très précieuse...

Merci d'avance!!!
Bon : je viens de modifier puis de remettre exactement mon code précédent et maintenant, je peux saisir et mon nom, et mon No d'étudiante. En revanche, l'affichage laisse toujours a désirer. Ca vient de quoi? Un problème de codage des fontes?

Je viens de réessayer et mon problème de saisie apparait quand je saisis un espace dans la chaîne de caractère correspondant à mon nom...

Emilie Marrionneau

Messages : 5
Date d'inscription : 31/10/2008

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Débuts difficiles...

Message  -ed- le Mer 5 Nov 2008 - 15:13

Emilie Marrionneau a écrit:Merci pour ton aide ed!

Je viens de corriger ce que j'ai fait, et ca compile parfaitement!
Le problème c'est que le résultat obtenu ne me convient pas!!!

Voici le code que j'ai créée :
<...>

Et après éxécution, voici ce que j'obtiens :
Code:
Entrez un étudiant :
Nom : Emilie MARRIONNEAU

Numéro :
NOM : 
Numéro : @���/�����
Ton code est incorrect.

J'attire ton attention sur plusieurs points avant d'aller plus loin.

1 - Je recommande l'usage de l'IDE Code::Blocks et de son compilateur gcc (ou MinGW sous Windows).
2 - Cet IDE possède un module de mise en page automatique qui permet de présenter un code lisible par tous :
Code:

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

/*Création de la structure Etudiant*/
typedef struct
{
    char Nom[32];
    char Numero[16];
} Etudiant;
/*Création de la structure Carnet*/
typedef struct
{
    Etudiant ListEtudiant[20];
    int compteur;
} Carnet;
int Nb_Etudiant=5;

Etudiant Creer_Etudiant(char nom[], char numero[]);
void Afficher_Etudiant(Etudiant Etu);
Carnet Ajout_Etudiant(Carnet Carn, Etudiant Etu);
void Afficher_Carnet(Carnet Car);
void Creer_Carnet();

main()
{
    char nom[32], no[16];
    Etudiant etu;

    printf("\nEntrez un étudiant : \nNom : ");
    scanf(" %s", &nom);
    printf("\nNuméro : ");
    scanf(" %s", &no);
    etu=Creer_Etudiant(nom, no);
    Afficher_Etudiant(etu);
}

Etudiant Creer_Etudiant(char nom[], char numero[])
{
    Etudiant Etu;

    strcpy(nom, Etu.Nom);
    strcpy(numero, Etu.Numero);
    return(Etu);
}

void Afficher_Etudiant(Etudiant Etu)
{
    printf("\nNOM : %s\nNuméro : %s\n\n", Etu.Nom, Etu.Numero);
    return;
}

Carnet Ajout_Etudiant(Carnet Car, Etudiant Etu)
{
    int cpt=Car.compteur;

    Car.ListEtudiant[cpt+1]=Etu;
    Car.compteur=cpt+1;
    return(Car);
}

void Afficher_Carnet(Carnet Car)
{
    int k, cpt=Car.compteur;

    for (k=0; k<=cpt; ++k)
    {
        Afficher_Etudiant(Car.ListEtudiant[k]);
    }
    return;
}

void Creer_Carnet()
{
    int k;
    char nom[32], numero[16];
    Etudiant etudiant;
    Carnet carnet;

    for (k=0; k<=Nb_Etudiant; ++k)
    {
        printf("\nEtudiant %d : \nNom : ", k);
        scanf("%s", &nom);
        printf("\nNuméro : ");
        scanf("%s", &numero);
        etudiant=Creer_Etudiant(nom, numero);
        carnet=Ajout_Etudiant(carnet, etudiant);
    }
    Afficher_Carnet(carnet);
    return;
}
3 - Il est possible de configurer gcc de façon à ce qu'il montre beaucoup d'erreurs de codage (pas toutes, évidemment) :

http://mapage.noos.fr/emdel/codage.htm#cfg_compilo

Code:

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

Compiling: main.c
Linking console executable: bin\Debug\hello.exe
C:\dev\hello\main.c:22: warning: function declaration isn't a prototype
C:\dev\hello\main.c:25: warning: return type defaults to `int'
C:\dev\hello\main.c:25: warning: function declaration isn't a prototype
C:\dev\hello\main.c: In function `main':
C:\dev\hello\main.c:30: warning: char format, different type arg (arg 2)
C:\dev\hello\main.c:32: warning: char format, different type arg (arg 2)
C:\dev\hello\main.c:35: warning: control reaches end of non-void function
C:\dev\hello\main.c: At top level:
C:\dev\hello\main.c:73: warning: function declaration isn't a prototype
C:\dev\hello\main.c: In function `Creer_Carnet':
C:\dev\hello\main.c:82: warning: char format, different type arg (arg 2)
C:\dev\hello\main.c:84: warning: char format, different type arg (arg 2)
Output size is 20.76 KB
Process terminated with status 0 (0 minutes, 14 seconds)
0 errors, 9 warnings
Une fois ces erreurs corrigées, ton code fonctionnera mieux, c'est certain. (ce qui ne signifie pas qu'il sera parfait).

-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

Pas content.

Message  -ed- le Mer 5 Nov 2008 - 15:19

Je viens de constater plusieurs choses désagréables.

1 - Certaines de mes remarques sont des répétitions de remarques faites précédemment (présentation du code).
2 - Certaines erreurs de ton code ont déjà été signalées (main(), par exemple).

Dois-je en conclure que tu ne lis pas mes réponses ?

Si c'est le cas, je vais très clair, j'arrête toute aide. Je n'ai pas de temps à perdre à parler dans le vide.

J'attends ta réponse avant de continuer.

-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: Débuts difficiles...

Message  Totony le Dim 14 Déc 2008 - 19:01

Premièrement, comme ed l'a dit ton main est incorect.

Essaie int main(int argc, char* argv[]).

Deuxièmement, scanf. Fait plutot un project C++. Avec string et cin ou va voir ce tuto.


Dernière édition par -ed- le Dim 21 Déc 2008 - 5:01, édité 1 fois (Raison : réponse hors-sujet barrée.)

Totony

Messages : 1
Date d'inscription : 14/12/2008

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Débuts difficiles...

Message  Contenu sponsorisé Aujourd'hui à 15:29


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