if (Structures C++ == danger) {

Vous en avez marre d'être limité à des types C++ "primaires" tels que les int, les float ou encore les char ? Vous aimeriez passer à la vitesse supérieure ? Ouvrir les portes de l'infini ? de l'illimité ? Les structures sont ce qu'il vous faut (en attendant les classes!). En effet, grâce aux structures, vous pourrez composer vos propres types de variables ! C'est cool n'est-ce pas ?
.....

Définir un type à soi : Pour cela, vous devez d'abord déclarer votre type en utilisant le mot-clé C++ struct.

Exemple 1:
struct eleve {
	char nom[50];
	char prenom[50];
	char diplome[20];
	int age;
	int moyenneT1;
	int moyenneT2;
};

Bon, je vous explique! Je viens de déclarer un nouveau type. Ce nouveau type, je l'ai appelé eleve. Le nom de votre type doit suivre le mot-clé struct puis vous créez un bloc (entre { }) afin de définir votre type.
Ici, mon type eleve est composé de 6 champs. Pour chaque champ, vous devez préciser son type et son nom. Vous voyez que ça a une autre gueule allure qu'un simple int ! Attention de ne pas oublier le ; à la fin du bloc de définition!
Donc, une fois déclaré mon type eleve, je peux déclarer des variables de ce type. Toutes ces variables auront ces 6 champs. Un exemple ?

Exemple 2:
struct eleve {
	char nom[50];
	char prenom[50];
	char diplome[20];
	int age;
	int moyenneT1;
	int moyenneT2;
};

int main() {
	eleve e1, e2, e3;
	eleve classe[13];
	return 0;
}

Dans l'exemple ci-dessus, j'ai déclaré mon nouveau type eleve puis dans mon main, j'ai créé 3 variables de type eleve (e1, e2 et e3), j'ai également déclaré une variable nommée classe de type "tableau de 13 éléments, chaque élément étant de type eleve". Les 3 variables e1, e2, e3 ainsi que chaque élément du tableau classe ont les 6 champs nom, prenom, ..., moyenneT2.

- Ok mais comment j'accède aux différents champs d'une variable de type eleve ?!
- C'est très simple ! Pour accéder à un des champs d'une variable de type eleve, il suffit d'écrire le nom de votre variable suivi du "." puis le nom du champ auquel vous voulez accéder. Je vous donne un exemple !

Exemple 3:
struct eleve {
	char nom[50];
	char prenom[50];
	char diplome[20];
	int age;
	int moyenneT1;
	int moyenneT2;
};

int main() {
	eleve e1, e2, e3;
	eleve classe[13]; // La variable classe est un tableau de 13 éléments. Chaque élément étant de type (srtucture) eleve.
	// Le champ age de l'eleve e1 prend la valeur 15
	e1.age = 15;
	cout << "Donner un nom à l'élève e1 : ";
	// Le champ nom de l'eleve e1 prend pour valeur ce qu'a saisi l'utilisateur
	cin >> e1.nom;
	for(int i=0; i<13; i++) {
		// Le champ age de chaque eleve du tableau classe prend la valeur 20+i
		classe[i].age = 20+i;
	}
	return 0;
}

Le programme ci-dessus montre comment accéder à quelques champs d'une variable de type eleve.
La seule difficulté est la variable classe. Et encore...
Répondez aux questions suivantes et vous verrez que ce n'est pas si compliqué que ça !
- Quel est le type de cette variable ?
- Un tableau !!!
- Oui mais un tableau de quoi ?! N'oubliez pas une chose : Quand vous parlez de tableau, il est très important de toujours préciser le type des éléments du tableau !!! TOUJOURS !
- Ah ! pardon... Tu as tout à fait raison. La variable classe est de type tableau d'eleve.
- Bien. Maintenant, de quel type est "classe[i]" ?
- "classe[i]" est le i+1ème élément du tableau classe. Comme tous les éléments du tableau classe sont de type eleve, j'en conclue que "classe[i]" est de type eleve.
- Exact ! Et "classe[i]" étant de type eleve, je peux accéder à n'importe lequel de ses champs. Si, par exemple, je veux accéder au champ moyenneT2, il me suffit d'écrire "classe[i].moyenneT2". Ou encore, si je veux accéder au champ prenom du 3ème eleve de classe, j'écrirai "classe[2].prenom".
- Ahhh j'ai tout compris !
- Je résume : classe est un tableau d'eleve. "classe[0]", "classe[1]", ou encore "classe[i]" sont tous de type eleve. Donc "classe[0].nom" me permet d'accéder au champ nom du 1er eleve de mon tableau classe, comme "classe[9].diplome" me permet d'accéder au champ diplome du 10è eleve...

.....

Pour résumer : En C++, on peut définir nos propres types de variables grâce au mot-clé struct. Une structure est un type complexe contenant un ou plusieurs champs. Pour accéder à un des champs d'une structure, il suffit d'écrire le nom de la variable suivi d'un point "." et indiquer le nom du champ désiré. C'est aussi simple que ça !
Il est important de noter que les champs d'une structure peuvent être de n'importe quel type: int, char, string ou même structure! Vous verrez dans les exercices ci-dessous quelques exemples.

.....
Exercice 1
  1. Declarez le type matiere composé de 2 champs "nomMatiere" de type tableau de 50 caractères et "note" de type réél.
  2. Cliquer pour voir le corrigé
  3. Declarez le type eleve composé de 2 champs "nomEleve" de type tableau de 50 caractères et "matieres" de type tableau de 3 matiere.
  4. Cliquer pour voir le corrigé
  5. Écrivez la fonction "matiere creerMatiere(char nom[50], float n)". Cette fonction aura pour but de créer une variable de type matiere, de remplir ses champs (grâce aux paramètres passés à la fonction) puis de retourner cette variable. Dans l'ordre, elle devra:
    • Créer une variable "m" (par exemple) de type matiere.
    • Remplir le champ nomMatiere de m avec le paramètre nom. Ce point est un peu compliqué car le champ nomMatiere est de type tableau de caractères. Nous sommes contraints de passer par la fonction strcpy pour affecter une valeur à notre tableau de caractères nomMatiere.
    • Remplir le champ note de m avec le paramètre n.
    • Retourner m.
  6. Cliquer pour voir le corrigé
  7. Écrivez la fonction "eleve creerEleve(char nom[50])". Cette fonction aura pour but de créer une variable de type eleve, de remplir son champ nomEleve grâce au paramètre nom passé à la fonction. Elle doit également remplir le champ matieres ! C'est là que ça se complique : pour ce faire, vous utiliserez la fonction creerMatiere codée précédemment. En détails, ça donne:
    • Créer une variable "e" (par exemple) de type eleve.
    • Remplir le champ nomEleve de e avec le paramètre nom (utilisez strcpy). Voir l'exercice précédent.
    • Parcourir le tableau matieres de e: Ainsi vous affecterez à chaque élément du tableau le retour de la fonction creerMatiere. Comme la fonction creerMatiere prend 2 paramètres, vous demanderez à l'utilisateur de les saisir avant d'appeler cette fonction.
    • Retourner e
  8. Cliquer pour voir le corrigé
  9. Écrivez la fonction "float calculMoyenne(eleve e)" qui calcule la moyenne des notes d'un eleve passé en paramètre. Elle retournera le résultat trouvé.
  10. Cliquer pour voir le corrigé
  11. Il manque à notre programme la fonction main. Celle-ci va d'ailleurs nous servir à tester nos fonctions. Donc, à l' intérieur de la fonction main
    • déclarez une variable "e" (par exemple) de type eleve.
    • Affectez lui le retour de la fonction creerEleve en lui passant en paramètre le nom que vous souhaitez.
    • Affichez sa moyenne (en faisant appel à la fonction calculMoyenne)
    Cliquer pour voir le corrigé
  12. Pour conclure ce chapitre en beauté, je vous demanderai un p'tit peu de créativité ! Nous avons défini le type eleve et le type matiere. Seriez-vous capable de créer un nouveau type classe qui contiendrait 2 champs : "nomClasse" qui serait tout simplement un tableau de 50 caractères et "eleves" un tableau de 10 eleve ? Après tout ce que vous avez enduré, je n'en doute pas une seconde !
    Ensuite, une fois le type classe créé, vous coderez la fonction "classe creerClasse(char nom[50])" puis la fonction "float moyenneClasse(classe c)". Inspirez-vous des fonctions creerEleve et calculMoyenne. Je ne vous en dis pas plus.
  13. Cliquer pour voir le corrigé

Ouf ! On y est arrivé sain et sauf ! Encore bravo si vous êtes parvenu à faire ces exercices. Je vous invite à souffler un peu et quand vous serez remis, vous pourrez aller jeter un oeil du côté des pointeurs :D !

} else {

return nextChapter;

}

C++, C, exercices corrigés, danger, fonctions, terrorisé, paramètres, pointeurs, mémoire, tas, bss, variable, arguments, référence, adresse, structures, déclaration, solution, peur, zéro, langage, expert, cours, tutoriel, tutorial, aide, besoin, dangereux, correction, examen, programmation, POO, objet, type, retour, informatique, bas niveau, programmation orientée objet...