Inscription / Connexion Nouveau Sujet
Niveau algorithmique
Partager :

langage c

Posté par
smir
25-10-14 à 13:34

Bonjour à tous, pouvez vous m'aider pour cet exercice de langage C, j'en sort pas. Merci d'avance

Ecrire un programme en langage C qui contient les opérations suivantes:
- Définir un type structure appelé étudiant permettant  de représenter un étudiant avec les champs nom, prénom, numéro (de type chaine de caractères) et note de type réel;
- Remplir un tableau de 10 étudiants d'une classe avec des informations données par l'utilisateur
- Afficher les noms, prénoms, numéros et notes des 10 étudiants de la classe.
- Chercher et afficher la plus grande note de la classe
- Chercher et afficher le nombre d'étudiants qui ont une note supérieure ou égale à 10.
- Chercher et afficher la moyenne des notes des étudiants de la classe.

Posté par Profil Dlzlogicre : langage c 25-10-14 à 15:46

Bonjour,
Montrez où vous en êtes de votre programme.

Posté par
smir
re : langage c 25-10-14 à 19:39

typedef struct etudient{ 
char nom[10]; 
char prenom[10]; 
int numero[6];
float note;
float pgnote 
int i;
float tabnotes[10] ;
 
} ; 

printf("Entrer le nom de l'etudiat:\n"); 
scanf("%s",&E.nom); 
printf("Entrer le prenom de l'etudiant:\n"); 
scanf("%s",&E.prenom); 
printf("Entrer le numero de l'etudiant‚:\n"); 
scanf("%d",&E.numero); 
printf("Entrer la note de l'etudiant‚:\n"); 
scanf("%d",&n.note);  

for (i = 0 ; i < 10 ; i++)
printf ("donner la note N°" i")
scanf(""%d",&n.tabnotes[i]) ;
if ("pgnote >tabnotes[i]')
printf("la plus grande note est %d",pgnote)


pour le moment voici ce que j'ai fait je ne sais pas est ce que c'est bon. J'ai d'énormes problèmes pour cet exercice

Posté par Profil Dlzlogicre : langage c 25-10-14 à 20:09

Bon,
D'abord, tout programme écrit en C doit comporter une fonction main(...). Je vous laisse regarder votre cours.

Vous utilisez des fonctions (printf, scanf). Le C ne les connait pas, il faut dire où elles se trouvent. C'est à dire qu'il faut rajouter des #include ... Je vous laisse regarder votre cours.

Vous faites référence à une variable E, je n'ai pas vu sa déclaration.
Votre boucle for ne va exécuter que la ligne suivante. Il manque des choses.

il y a un nombre impair de guillemets dans 2 instructions.

Il faut initialiser la variable pgnote.

Pour l'instant, c'est un début.    

Posté par
smir
re : langage c 26-10-14 à 14:03

Bonjour voici ce que j'ai fait
#include <stdio.h>
#include <stdlib.h>
struct Etudiant
{
       char nom[10];
       char prenom[10];
       char numero[20];
       float note[20];
       float moyenne;
      
  };
int main()
{
        struct etudiant etd[N];
        int i, j, somme = 0;
        for (i = 0; i<N; i++)
        {
        printf ("...... Veillez saisir les informations du %d etudiant .....\n" , i+1);
        printf ("Entrer le nom \n" );
        scanf ("%s" ,&etd[i].Nom );
        printf ("Entrer le prenom \n" );
        scanf ("%s" ,&etd[i].prenom );
        for (j = 0; j<M; j++)
        printf ("Entrer la note %d \n" );
        scanf ("%f" ,&etd[i].note[j] );
        somme = somme + etd[i].note[j];
        };
        etd[i].moyenne = somme / N;
Je suis vrément bloqué pour le reste

Posté par Profil Dlzlogicre : langage c 26-10-14 à 14:20

Je ne vais pas faire le programme à votre place.

Est-ce que vous avez un compilateur ?
Si oui, quel est le résultat de la compile ?
Qu'est-ce qui vous a fait passer de la version 1 à la version 2 ?

Vous êtes bloqué, d'accord, mais par quoi ?

Posté par
smir
re : langage c 26-10-14 à 14:33

Oui j'ai un compilateur mais avant de compiler il faut terminer.
Je suis bloqué pour ces deux lignes:    
- Chercher et afficher la plus grande note de la classe
- Chercher et afficher le nombre d'étudiants qui ont une note supérieure ou égale à 10.

Posté par Profil Dlzlogicre : langage c 26-10-14 à 14:43

Commencez par compiler et exécuter la lecture des données.
Quand ça marchera, vous ferez les calculs de moyenne, minimum et maximum de la classe.

Posté par
smir
re : langage c 26-10-14 à 15:48

#include <stdio.h>
#include <stdlib.h>
struct Etudiant
{
       char nom[20];
       char prenom[20];
       char numero[20];
       float note[20];
       float moyenne;
      
  };
main()
{
        struct Etudiant etd[10];
        int i;
        for(i = 0; i<10; i++)
        {
        printf ("...... Veillez saisir les informations du %d etudiant .....\n" , i+1);
        printf ("Entrer le nom \n" );
        scanf ("%s" ,&etd[i].nom );
        printf ("Entrer le prenom \n" );
        scanf ("%s" ,&etd[i].prenom );
        printf ("Entrer la note %d \n" );
        scanf ("%f" ,&etd[i].note);                
        };
        for(i = 0; i<10; i++)
        {
        printf ("votre nom est : %s:\n",etd[i].nom );
        printf ("votre prenom est : %s:\n",etd[i].prenom );
        printf ("votre nom est : %f:\n",etd[i].note );
        }
getch ();

J'ai compilé ceci et ça marche

Posté par Profil Dlzlogicre : langage c 26-10-14 à 15:56

Vous êtes sûr ?
Alors modifiez votre programme pour seulement 2 étudiants et 3 notes et montrez le résultat de l'impression.

Posté par
smir
re : langage c 26-10-14 à 16:29

Voici le resultat

langage c

Posté par Profil Dlzlogicre : langage c 26-10-14 à 17:59

C'est quoi ce très grand nombre après le texte "Entrer la note" ?
Le résultat, c'est que donne les 3 printf.
Pourquoi vous n'avez pas réussi à entrer le nom du 3è étudiant ?
Je veux bien vous aider, mais il faut jouer le jeu.

Posté par
smir
re : langage c 26-10-14 à 18:34

Voici 3 notes mais les nombres après la note viennent directement du compilateur. Je ne sais pas pourquoi?

langage c

Posté par Profil Dlzlogicre : langage c 26-10-14 à 19:00

Evidemment que ce grand nombre ne vient pas du compilateur.
En fait, ce grand nombre correspond à l'adresse du tableau note.

Voila à peu près ce que vous devriez obtenir.

langage c

Posté par
smir
re : langage c 26-10-14 à 20:18

J'ai compilé pour 3 personnes, mais le problème se trouve au niveau des notes. Je ne sais où se trouve l'erreur. Sinon qu'est ce qu'on doit modifier dans le programme

langage c

Posté par Profil Dlzlogicre : langage c 26-10-14 à 20:29

Bon, on avance, mais si vous voulez bien, on continuera demain.
Vous auriez pu corriger la faute de frappe nom -> note.

Posté par
smir
re : langage c 26-10-14 à 20:41

Merci beaucoup, à demain

Posté par Profil Dlzlogicre : langage c 27-10-14 à 10:34

Il me parait nécessaire que vous montriez votre code actuel, et que vous disiez si vous avez exactement ce que vous attendiez.

Posté par
smir
re : langage c 27-10-14 à 19:48

Voici le code actuel

#include <stdio.h>
#include <stdlib.h>
struct Etudiant
{
       char nom[20];
       char prenom[20];
       char numero[20];
       float note[10];
      
      
  };
main()
{
        int i;
        struct Etudiant etd[10];
        
        for(i = 0; i<3; i++)
        {
        printf ("...... Veillez saisir les informations du %d etudiant .....\n" , i+1);
        printf ("Entrer le nom \n" );
        scanf ("%s" ,&etd[i].nom );
        printf ("Entrer le prenom \n" );
        scanf ("%s" ,&etd[i].prenom );
        printf ("Entrer la note %d \n" );
        scanf ("%f" ,&etd[i].note);  
        
                      
        }
        for(i = 0; i<3; i++)
        {
        printf ("...... Affichage .....\n\n" );
        printf ("votre nom est : %s:\n",etd[i].nom );
        printf ("votre prenom est : %s:\n",etd[i].prenom );
        printf ("votre note est : %f:\n",etd[i].note );
        }
getch ();
}

Posté par Profil Dlzlogicre : langage c 27-10-14 à 20:07

Bon, soyons sérieux cinq minutes.
Votre code ne peut pas sortir les impressions que vous avez montrées.
Je vous indique les 4 lignes qui sont fausses (sauf erreur de ma part)
scanf ("%s" ,&etd[i].nom );
scanf ("%s" ,&etd[i].prenom );
scanf ("%f" ,&etd[i].note);  
printf ("votre note est : %f:\n",etd[i].note );

Si vous voulez qu'on vous donne le code, c'est à dire le corrigé, dites-le simplement. Je crois que ce n'est par interdit par la charte, mais moi, je ne ferai pas.

Posté par
smir
re : langage c 27-10-14 à 20:34

je n'ai aucun INTÉRÊT de se tromper moi même. Je ne cherche pas qu'on me donne le corrigé, sinon je ne passe tout mon temps depuis 3 jours sur cet exercice. Je n'ai aucun intérêt de vous de donner une impression que j'ai pas codé. J'utilise DEVC++4.9.9.2. Si vous doutez essayez le avec ce même code. Moi je cherche de l'aide je ne cherche pas qu'on fasse l'exercice à ma place.        

Posté par Profil Dlzlogicre : langage c 27-10-14 à 21:40

Bon, les 4 lignes que j'ai indiquées sont fausses. A vous de les corriger.
Elles sont fausses quel que soit le compilateur.
La fonction scanf est généralement déconseillée. Je crois que tout le monde est d'accord pour utiliser plutôt gets et sscanf, ce qui permet de savoir ce qu'on fait.
Mais je ne suis pas persuadé que là réside le problème.

Petite indication, dans la fonction scanf, pourquoi mettez-vous un '&' avant le nom de la variable ?
Que représente la variable etd[i].note ?

Posté par
smir
re : langage c 27-10-14 à 21:51

Ok je fais chercher les erreurs

Posté par
smir
re : langage c 28-10-14 à 18:46

etd[i].note : nous permet d'accéder à un membre
Pour les 4 lignes je ne vois pas où se situent les erreurs;

Posté par Profil Dlzlogicre : langage c 28-10-14 à 19:07

Bonsoir,
Je repose mes questions
Dans la fonction scanf, pourquoi mettez-vous un '&' avant le nom de la variable ?
etd[i].note représente quoi ? une date, un nom, une appréciation ?

Posté par
lafol Moderateur
re : langage c 28-10-14 à 19:29

Bonjour

Citation :
printf ("Entrer la note %d \n" );


à quoi sert le %d ? Ne serait-ce pas lui le responsable du grand nombre affiché après la question "Entrer la note" ?

Posté par
lafol Moderateur
re : langage c 28-10-14 à 19:33

et pour rentrer une note, il y a vraiment besoin d'un tableau de 10 float ?

Posté par Profil Dlzlogicre : langage c 28-10-14 à 19:48

Oui, le %d dans le printf cité est inutile, naturellement c'est lui qui provoque l'affichage de n'importe quoi. On peut supposer que le code d'origine devait être quelque-chose du genre : printf("entrer la Nème %d note\n",j);

Pour la seconde observation, non, bien-sûr, mais notre ami n'a pas réagi lorsque je lui ai proposé de rentrer 3 notes.
Mais si tu veux, lafol, tu reprends la main.
    

Posté par
lafol Moderateur
re : langage c 28-10-14 à 19:51

j'ai l'impression qu'il a surtout grand besoin de relire son cours, à défaut celui du site du zéro, en particulier sur l'utilisation des pointeurs.

Posté par Profil Dlzlogicre : langage c 28-10-14 à 20:03

Oui, tout à fait d'accord, mais je pense qu'essayer de répondre aux questions que je lui ai posées peut l'aider à comprendre. Une réponse fausse est toujours préférable à pas de réponse du tout. L'important est de se poser la question, par exemple "pourquoi donc j'ai mis une esperluette ? Parce que j'ai copié un bout de code (mauvaise réponse) ; parce que la fonction scanf et ses copines ont besoin d'adresse comme paramètre (bonne réponse).    

Posté par
smir
re : langage c 28-10-14 à 20:40

etd[i].note : pour accéder à la variable  note on fait nom de la variable etuiant puis point puis note ( le point POINT . est un opérateur qui nous permet d'accéder à un membre de la variable étudiant)

je pensais que c'est nécessaire de mettre &. Mais j'ai constaté que si je l'enlève en compilant le résultat ne change pas. Pouvez vous m'expliquer  
  

Posté par
smir
re : langage c 28-10-14 à 20:49

Avec ce code le grand nombre qui affichait a disparu mais l'affichage de note pose encore problème

langage c

Posté par Profil Dlzlogicre : langage c 28-10-14 à 21:00

Rapidement.
'note' est déclaré dans votre structure en tant que tableau de 10 éléments.
Or quand vous faites un lecture (scanf) vous ne donnez qu'une seule valeur, une note en l'occurrence.
Il faut donc préciser le rang de la note que vous lisez et que vous voulez stocker.
Il faut bien vous dire UNE FOIS POUR TOUTES que l'ordinateur est d'une bêtise inimaginable.
Donc si vous voulez lui dire qu'il stocke un valeur, il faut lui dire où.

Le problème n'est pas d'essayer de le retirer, de voir si ça marche ou pas, mais de comprendre ce que vous faites.
Votre seconde réponse est arrivée entre temps. Vous devez ABSOLUMENT comprendre pourquoi et quand on met une esperluette.
Laissez le hasard à ceux qui font des probas. L'informatique demande une rigueur d'une précision extrême.



Vous devez être membre accéder à ce service...

Pas encore inscrit ?

1 compte par personne, multi-compte interdit !

Ou identifiez-vous :


Rester sur la page

Désolé, votre version d'Internet Explorer est plus que périmée ! Merci de le mettre à jour ou de télécharger Firefox ou Google Chrome pour utiliser le site. Votre ordinateur vous remerciera !