STRUCTURE EN C++

cs_smar Messages postés 1 Date d'inscription vendredi 22 juin 2007 Statut Membre Dernière intervention 9 avril 2010 - 9 avril 2010 à 07:39
uaip Messages postés 1466 Date d'inscription mardi 20 février 2007 Statut Membre Dernière intervention 7 février 2011 - 10 avril 2010 à 11:31
VOICI MOT CODE EN C++
#include<stdio.h>
struct date
{int jour;
int mois;
int annee;
};
struct Etudiant
{ char nom[50];
char prenom[50];
int cin;
date d;
int niveau;
int groupe;
char spec[20];
float moy_gen;
};
void main()
{
struct Etudiant etud[20];
int i;
for(i=0;i<20;i++)
{
printf("donner les informations du premier étudiant n° %d: \n",i+1);
printf("donner le nom: ");
scanf("%s",etud[i].nom);
printf("donner le prenom: ");
scanf("%s",etud[i].prenom);
printf("donner le numéro cin: ");
scanf("%d",&etud[i].cin);
printf("donner la date de naissance: ");
scanf("%d %d %d",&etud[i].d.jour,&etud[i].d.mois,&etud[i].d.annee);
printf("donner le niveau: ");
scanf("%d",&etud[i].niveau);
printf("donner le groupe: ");
scanf("%d",&etud[i].groupe);
printf("donner la spécialité: ");
scanf("%s",etud[i].spec);
printf("donner le moyenne générale: ");
scanf("%f",&etud[i].moy_gen);


}
}


CHAQUE FOIS IL FAIT LA LECTURE DU MOYENNE GÉNÉRALE DU PREMIER ETUDIANT ET ENSUITE UN MESSAGE D'ERREUR S'AFFICHE
QUEL EST LE PROBLÈME ET MERCI D'AVANCE

4 réponses

cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
9 avril 2010 à 09:47
Voilà ton code une fois corrigé. Ce n'est pas du C++ !
#include <stdio.h>

typedef struct _Date
{
int jour;
int mois;
int annee;
} Date;

typedef struct _Etudiant
{
char nom[26];
char prenom[26];
int cin;
Date d;
int niveau;
int groupe;
char spec[21];
float moy_gen;
} Etudiant;

void DebugEtudiant(Etudiant* etud)
{
printf(	"DebugEtudiant:\n-- Nom=%s\n-- Prenom=%s\n-- CIN=%d\n-- Danai=%d/%d/%d\n-- Niveau=%d\n-- Groupe=%d\n-- Spec=%s\n-- Moy=%f\n",
etud->nom,etud->prenom,etud->cin,etud->d.jour,etud->d.jour,etud->d.annee,etud->niveau,
etud->groupe,etud->spec,etud->moy_gen);
}

int main(int argc, char* argv[])
{
Etudiant etud[20];
int i;

for(i=0;i<20;i++)
{
printf("Entrez les informations de l'etudiant #%d :\n",i+1);

printf("-- Nom: ");
scanf_s("%25s",etud[i].nom,25);
printf("-- Prenom: ");
scanf_s("%25s",etud[i].prenom,25);
printf("-- Numero CIN: ");
scanf_s("%d",&etud[i].cin,1);
printf("-- Date de naissance: ");
scanf_s("%d %d %d",&etud[i].d.jour,&etud[i].d.mois,&etud[i].d.annee,3);
//TODO: vérifier la validité de la date.
printf("-- Niveau: ");
scanf_s("%d",&etud[i].niveau,1);
printf("-- Groupe: ");
scanf_s("%d",&etud[i].groupe,1);
printf("-- Specialite: ");
scanf_s("%20s",etud[i].spec,20);
printf("-- Moyenne generale: ");
scanf_s("%f",&etud[i].moy_gen,1);

DebugEtudiant(&etud[i]);
printf("\n");
}

return 0;
} 

---
VB.NET is good ... VB6 is better
0
uaip Messages postés 1466 Date d'inscription mardi 20 février 2007 Statut Membre Dernière intervention 7 février 2011
10 avril 2010 à 10:30
Salut,
C'est bien joli de corriger le code à la demande, mais sans rien expliquer, ça ne va rien lui apprendre du tout (et il reviendra poser le même genre de question à chaque petit soucis).
En plus, scanf_s n'est pas standard, il ne fonctionne que sous Visual, je crois.


Cordialement, uaip.
0
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
10 avril 2010 à 11:11
@uaip: Ah je savais pas que cette fonction était spécifique à VS ...

J'ai modifié quelques éléments dans ton code :[list][*] La taille max du nom/prénom est passée à 25. (pre)nom[26] dans le code car il faut compter le \0 final.

[*] Les typedefs devant les définitions de structures : vu que c'est du C et non du C++, tu n'as pas le choix.

[*] L'indentation : tu ne t'en sors déjà pas avec 43 lignes alors avec plus faut pas rêver. Plus ton code sera aéré et commenté (ce que je n'ai pas fait, mais demande si tu en as besoin) plus tu auras de facilité à y revenir.

[*] La saisie sécurisée : dans un format scanf, tu dois placer la taille max entre le % et le caractère. Ceci t'évitera un dépassement de buffer et la corruption des données qui suivent dans la structure en mémoire :
scanf("%25s",etud[i].nom);


[*] Une fonction DebugEtudiant permettant d'afficher le contenu d'une structure pointée passée en paramètre.

/list
Remplace la fonction main par ceci :
int main(int argc, char* argv[])
{
Etudiant etud[20];
int i;

for(i=0;i<20;i++)
{
printf("Entrez les informations de l'&#8218;tudiant nø%d :\n",i+1);

printf("-- Nom: ");
scanf("%25s",etud[i].nom);
printf("-- Pr&#8218;nom: ");
scanf("%25s",etud[i].prenom);
printf("-- Num&#8218;ro CIN: ");
scanf("%d",&etud[i].cin);
printf("-- Date de naissance: ");
scanf("%d %d %d",&etud[i].d.jour,&etud[i].d.mois,&etud[i].d.annee);
//TODO: vérifier aussi la validité de la date mais tout faire dans une fonction séparée.
printf("-- Niveau: ");
scanf("%d",&etud[i].niveau);
printf("-- Groupe: ");
scanf("%d",&etud[i].groupe);
printf("-- Sp&#8218;cialit&#8218;: ");
scanf("%20s",etud[i].spec);
printf("-- Moyenne g&#8218;n&#8218;rale: ");
scanf("%f",&etud[i].moy_gen);

DebugEtudiant(&etud[i]);
printf("\n");
}

return 0;
} 

---
VB.NET is good ... VB6 is better
0
uaip Messages postés 1466 Date d'inscription mardi 20 février 2007 Statut Membre Dernière intervention 7 février 2011
10 avril 2010 à 11:31
Outch.
Je ne pensais pas avoir autant d'influence
Bravo en tout cas pour l'explication.


Cordialement, uaip.
0
Rejoignez-nous