L'algorithme a implémenter :
Structurer des données associées à des pièces. Constantes // Dimension des tableaux MAX_TAB_IdPièce = 10 MAX_TAB_IdNoSérie = 10 MAX_TAB-PIECE = 100000 Types // Types énumérés TE_FormePièce = (sphère, cube, cylindre) TE_Couleur = (jaune, vert, bleu, rouge, orange, mauve) TE_NomJour = (lundi, mardi, mercredi, jeudi, vendredi, samedi, dimanche) // Types tableaux TabIdPièce = Tableau [MAX_TAB_IdPièce] de Caractères // Tableau pour identifiant pièce TabIdNoSérie = Tableau [MAX_TAB_IdNoSérie] de Caractères // Tableau pour numéro de série de fabrication TabPièce = Tableau [MAX_TAB_PIECE] de EnregPièce // Tableau pour stocker les descriptions de pièces fabriquées // Type structures EnregPièce = Enregistrement Id : TabIdPièce // Identifiant de la pièce Couleur : TE_Couleur // Couleur de la pièce NoSérie : TabIdNoSérie // Numéro de série de fabrication DateFab : EnregDate // Date de fabrication Dim : Mesures FinEnregistrement EnregDate = Enregistrement NomJour : TE_NomJour Jour : Entier Mois : Entier Année : Entier FinEnregistrement Mesures = Enregistrement // structure de dimensions d'un cylindre Forme : TE_FormePièce Rayon : Entier // rayon (sphère ou cylindre) Hauteur : Entier // hauteur (du cube ou du cylindre) FinEnregistrement Variables ProductionPièces : TabPièce
namespace PiècesUsine { public struct EnregPièce // Déclaration d'une structure de stockage d'un descriptif de pièce { public string Id; // Identifiant de la pièce public int numeroSerie; // numéro de série des pièces public couleur couleurPièce; // Voir liste énumérée 'couleur' public date DateFab; // Voir structure 'date' utilisant deux listes énumérée, // 'jourSemaine' et 'moisAnnée' public mesure dimension; // Voir structure 'mesure' utilisant la liste énumérée 'forme' } public enum couleur { Jaune, Vert, Bleu, Rouge, Orange, Mauve }; public struct date { public jourSemaine NomJour; // Voir Liste énumérée 'jourSemaine' public moisAnnée Mois; // Voir Liste énumérée 'moisAnnée' public int jourChiffre; // le numéro du jour public int Annee; // numéro de l'année } public enum jourSemaine { Lundi, Mardi, Mercredi, Jeudi, Vendredi, Samedi, Dimanche }; public enum moisAnnée { Janvier, Février, Mars, Avril, Mai, Juin, Juillet, Août, Septembre, Octobre, Novembre, Décembre }; public struct mesure // tout ce qui constitue les mesures des pièces { public forme forme; // forme des pièces public double rayon; // rayon pour les pièces cylindriques et sphériques public double cote; // côté pour les pièces cubiques public double hauteur; // hauteur pour les pièces cylindriques } public enum forme { Cubique, Cylindrique, Sphérique }; class Program { public const int taille = 1000; static void Main(string[] args) { int indice; EnregPièce[] Tableaupiece; EnginDePieces.RemplirTableauPiece(out Tableaupiece, out indice); EnginDePieces.AfficherTableauPiece(Tableaupiece, indice); Console.ReadLine(); Console.WriteLine(); } } }
Où j'ai rédigé le programme des procédures :
On crée un tableau de type “EnregPièce”.
Qu'est-ce que le type “EnregPièce” ?
En c# on peut créer des types utilisateurs. Cela correspond au enregistrement en algo.
C'est un type qui définit une structure de donnée composée de type prédéfini (int
; char
; string
…)
ou composé d'autres de types créés par l'utilisateur (liste énuméré enum
, sous structure struct
)
public static void RemplirTableauPiece(out EnregPièce[] piece_tableau, out int indi) { piece_tableau = new EnregPièce[MAX_TAB_PIECE]; indi = 0; do { piece_tableau[indi] = SaisirPièce(ref piece_tableau[indi]); indi++; } while (veutContinuer()); }
La fonction RemplirTableauPiece
renverra en sortie (out
):
piece_tableau
;int
) nommé indi
;
Pour remplir toutes les cases du tableau de pièce qui contiendra les informations choisies par l'utilisateur, on affecte les cases du tableau piece_tableau
au moyen d'une fonction nommée : SaisirPièce
.
Loupe sur l'appel de fonction : SaisirPièce
Elle prend en entrée/sortie (ref
) le tableau piece_tableau
afin de pouvoir en modifier chaque variable.
Le tableau piece_tableau
étant de type EnregPièce,
il devra “suivre” la structure de ce type créé par l'utilisateur. C'est-à-dire être “composée”:
string
;int
;couleur
: c'est là une liste énumérée (comme ça contrôle sur ce que rentre l'utilisateur ; sûr que la couleur est dans les stocks, et pas d'erreur de frappe à la saisie).date
; ce type est à créer, ce sera une structure.
La fonction veutContinuer
sert à demander à l'utilisateur s'il souhaite remplir des informations sur une autre pièce.
Pour son code qui n'a pas de rapport avec l'implémentation de l'algo voir l'annexe.
L'analyse et une correction possible en note plus bas.
internal static EnregPièce SaisirPièce(ref EnregPièce unepiece) { // Déclarations EnregPièce pièceSaisie = new EnregPièce(); // initialisation de la structure pièceSaisie // Titre Console.Write("Saisie d'un descriptif de pièce." + LF); Console.Write("--------------------------------" + LF); // Identifiant pièceSaisie.Id= Lire.Chaine("Entrez l'identifiant"); // Couleur pièceSaisie.couleurPièce = SaisirCouleur("Choisissez la couleur pièce (Jaune, Vert, Bleu, Rouge, Orange, Mauve)"); // Numéro de série pièceSaisie.numeroSerie = Lire.Entier("Entrez le n° de série de la pièce (Voir au dos de la pièce)"); // Date pièceSaisie.DateFab = SaisirDate(); // Forme et dimensions pièceSaisie.dimension.forme = SaisieForme("Donnez la forme de la pièce (Cubique, Cylindrique, Sphérique)"); switch (unepiece.dimension.forme) { case forme.Cubique: unepiece.dimension.cote = Lire.Double("Votre pièce à une forme Cubique, quelle est la longueur d'un côté?"); break; case forme.Sphérique: unepiece.dimension.rayon = Lire.Double("Votre pièce à une forme Sphérique, quel est son rayon?"); break; case forme.Cylindrique: unepiece.dimension.rayon = Lire.Double("Votre pièce est Cylindrique, quel est son rayon?"); unepiece.dimension.hauteur = Lire.Double("et quelle sa hauteur?"); break; default: Console.ReadLine(); break; } return pièceSaisie; }
J'ai mis :
pièceSaisie.Id= Lire.Chaine(“Entrez l'identifiant”);
pièceSaisie.couleurPièce = SaisirCouleur(“Choisissez la couleur pièce (Jaune, Vert, Bleu, Rouge, Orange, Mauve)”);
Il faut corriger en1) :
unepiece.Id= Lire.Chaine(“Entrez l'identifiant”);
unepiece.couleurPièce = SaisirCouleur(“Choisissez la couleur pièce (Jaune, Vert, Bleu, Rouge, Orange, Mauve)”);
⇒ Et pour affecter chaque variable effective unepiece.Id ; unepiece.couleurPièce etc, il est inutile d'initialiser une variable effective de type EnregPièce
2).
J'avais donc faux de charger un emplacement mémoire en cherchant à faire 3) :
// Déclarations EnregPièce pièceSaisie = new EnregPièce();
ou
// Déclarations EnregPièce unepiece = new EnregPièce();
mais il me semble qu'il est nécessaire de conserver au moins emplacement mémoire :4)
internal static EnregPièce SaisirPièce(ref EnregPièce unepiece) { // Titre Console.Write("Saisie d'un descriptif de pièce." + LF); Console.Write("--------------------------------" + LF); // Identifiant unepiece.Id = Lire.Chaine("Entrez l'identifiant"); // on fait confiance à l'utilisateur pour le format // Couleur unepiece.couleurPièce = SaisirCouleur("Choisissez la couleur pièce (Jaune, Vert, Bleu, Rouge, Orange, Mauve)"); // Numéro de série unepiece.numeroSerie = Lire.Entier("Entrez le n° de série de la pièce (Voir au dos de la pièce)"); // Date unepiece.DateFab = SaisirDate(); // Forme et dimensions unepiece.dimension.forme = SaisieForme("Donnez la forme de la pièce (Cubique, Cylindrique, Sphérique)"); switch (unepiece.dimension.forme) { case forme.Cubique: unepiece.dimension.cote = Lire.Double("Votre pièce à une forme Cubique, quelle est la longueur d'un côté?"); break; case forme.Sphérique: unepiece.dimension.rayon = Lire.Double("Votre pièce à une forme Sphérique, quel est son rayon?"); break; case forme.Cylindrique: unepiece.dimension.rayon = Lire.Double("Votre pièce est Cylindrique, quel est son rayon?"); unepiece.dimension.hauteur = Lire.Double("et quelle sa hauteur?"); break; default: Console.ReadLine(); break; } return unepiece; }
⇒ on pourrait ne saisir par quelle magie la variable effective unepiece
de type EnregPièce
a un emplacement en mémoire.
Le problème disparaît quand on analyse les paramètres passés aux fonctions :
On va renvoyé au programme principal un tableau de type EnregPièce[]
EnregPièce
définit dans le programme principal.public struct EnregPièce // Déclaration d'une structure de stockage d'un descriptif de pièce { public string Id; public int numeroSerie; public couleur couleurPièce; public date DateFab; }
private static couleur SaisirCouleur(String invite) { Boolean ok = false; String s; couleur val = (couleur)0; do // cette boucle obtient une chaine correcte { Console.Write(invite + " : "); s = Console.ReadLine(); // je transforme la chaine au format attendu s = Char.ToUpper(s[0]) + s.Substring(1, s.Length - 1).ToLower(); if (Enum.TryParse<couleur>(s, out val)) // je récupère la valeur associée à la chaine { ok = true; } else { Console.WriteLine("Saise erronée, veuillez recommencer"); } } while (!ok); return val; }
private static date SaisirDate() { date dateRetournée; // déclaration d'une variable de type 'structurée' date // Saisie du nom du jour dateRetournée.NomJour = SaisieNomJour("Donnez le jour de la semaine (Lundi, Mardi, Mercredi, Jeudi, Vendredi, Samedi, Dimanche)"); // Saisie du jour dateRetournée.jourChiffre = Lire.Entier("Donnez le n° du Jour (de 1 à 30/31 "); // Saisie du mois dateRetournée.Mois = SaisieMois("Donnez le mois"); // Saisie de l'année dateRetournée.Annee = Lire.Entier("Donnez l'année"); return dateRetournée; }
private static moisAnnée SaisieMois(string invite) { Boolean ok = false; String s; moisAnnée Mois = (moisAnnée)0; do // cette boucle obtient une chaine correcte { Console.Write(invite + " : "); s = Console.ReadLine(); // je transforme la chaine au format attendu s = Char.ToUpper(s[0]) + s.Substring(1, s.Length - 1).ToLower(); if (Enum.TryParse<moisAnnée>(s, out Mois)) // je récupère la valeur associée à la chaine { ok = true; } else { Console.WriteLine("Saise erronée, veuillez recommencer"); } } while (!ok); return Mois; }
private static jourSemaine SaisieNomJour(string invite) { Boolean ok = false; String s; jourSemaine NomJour = (jourSemaine)0; do // cette boucle obtient une chaine correcte { Console.Write(invite + " : "); s = Console.ReadLine(); // je transforme la chaine au format attendu s = Char.ToUpper(s[0]) + s.Substring(1, s.Length - 1).ToLower(); if (Enum.TryParse<jourSemaine>(s, out NomJour)) // je récupère la valeur associée à la chaine { ok = true; } else { Console.WriteLine("Saise erronée, veuillez recommencer"); } } while (!ok); return NomJour; }
private static forme SaisieForme(string invite) { Boolean ok = false; String s; forme forme = (forme)0; do // cette boucle obtient une chaine correcte { Console.Write(invite + " : "); s = Console.ReadLine(); // je transforme la chaine au format attendu s = Char.ToUpper(s[0]) + s.Substring(1, s.Length - 1).ToLower(); if (Enum.TryParse<forme>(s, out forme)) // je récupère la valeur associée à la chaine { ok = true; } else { Console.WriteLine("Saise erronée, veuillez recommencer"); } } while (!ok); return forme; }
private static double SaisieRayon(string invite) { double leRayon; leRayon = Lire.Double("Donnez le rayon de la pièce"); return leRayon; }
internal static void AfficherTableauPiece(EnregPièce[] Tableaupiece, int indice) { int cpteur; //compteur de piece cpteur = indice++; // indice de parcours Console.WriteLine("Vous avez saisi " + cpteur + " pièce(s). Tapez entrée pour voir toutes les caractéristiques saisies."); Console.ReadLine(); indice = 0; //init indice while (indice < cpteur) { Console.WriteLine("Identifiant : " + Tableaupiece[indice].Id + " || Numéro de série : " + Tableaupiece[indice].numeroSerie + " || Couleur : " + Tableaupiece[indice].couleurPièce + " || Date de fabrication : " + Tableaupiece[indice].DateFab.NomJour + " " + Tableaupiece[indice].DateFab.jourChiffre + " " + Tableaupiece[indice].DateFab.Mois + " " + Tableaupiece[indice].DateFab.Annee); Console.WriteLine("\nType : " + Tableaupiece[indice].dimension.forme); switch (Tableaupiece[indice].dimension.forme) { case forme.Sphérique: Console.WriteLine(" avec un rayon de " + Tableaupiece[indice].dimension.rayon); break; case forme.Cylindrique: Console.WriteLine(" avec un rayon de " + Tableaupiece[indice].dimension.rayon + " et une hauteur de " + Tableaupiece[indice].dimension.hauteur); break; case forme.Cubique: Console.WriteLine(" avec un côté de " + Tableaupiece[indice].dimension.cote); break; default: Console.ReadLine(); break; } indice++; }
Voici donc donc le résultat qui selon mes tests fonctionne.
Nous voilà avec deux classes que je laisse en téléchargement:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace PiècesUsine { public struct EnregPièce // Déclaration d'une structure de stockage d'un descriptif de pièce { public string Id; // Identifiant de la pièce public int numeroSerie; // numéro de série des pièces public couleur couleurPièce; // Voir liste énumérée 'couleur' public date DateFab; // Voir structure 'date' utilisant deux listes énumérée, 'jourSemaine' et 'moisAnnée' public mesure dimension; // Voir structure 'mesure' utilisant la liste énumérée 'forme' } public enum couleur { Jaune, Vert, Bleu, Rouge, Orange, Mauve }; public struct date { public jourSemaine NomJour; // Voir Liste énumérée 'jourSemaine' public moisAnnée Mois; // Voir Liste énumérée 'moisAnnée' public int jourChiffre; // le numéro du jour public int Annee; // numéro de l'année } public enum jourSemaine { Lundi, Mardi, Mercredi, Jeudi, Vendredi, Samedi, Dimanche }; public enum moisAnnée { Janvier, Février, Mars, Avril, Mai, Juin, Juillet, Août, Septembre, Octobre, Novembre, Décembre }; public struct mesure // tout ce qui constitue les mesures des pièces { public forme forme; // forme des pièces public double rayon; // rayon pour les pièces cylindriques et sphériques public double cote; // côté pour les pièces cubiques public double hauteur; // hauteur pour les pièces cylindriques } public enum forme { Cubique, Cylindrique, Sphérique }; class Program { public const int taille = 1000; static void Main(string[] args) { int indice; EnregPièce[] Tableaupiece; EnginDePieces.RemplirTableauPiece(out Tableaupiece, out indice); EnginDePieces.AfficherTableauPiece(Tableaupiece, indice); Console.ReadLine(); Console.WriteLine(); } } // Class Program }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace PiècesUsine { public class EnginDePieces { public const char LF = '\u000A';// caractère de retour à la ligne public const int MAX_TAB_PIECE = 100; // Tableau contenant les decriptifs de pièces public static bool veutContinuer() { bool résultat; bool réponseOK; char réponse; résultat = false; // inutile, mais demandé par C# réponseOK = false; // passera à VRAI dès que l'opérateur saisi est accepté // et permettra la sortie de la boucle. do { réponse = Char.ToUpper(Lire.Caractere(LF + "Voulez-vous continuer (O ou N) ?")); if (réponse == 'O') { résultat = true; réponseOK = true; } else if (réponse == 'N') { résultat = false; réponseOK = true; } } while (!réponseOK); // arrêt quand la réponse est OK (O, o, N ou n). return résultat; } // fin veutContinuer public static void RemplirTableauPiece(out EnregPièce[] piece_tableau, out int indi) { piece_tableau = new EnregPièce[MAX_TAB_PIECE]; indi = 0; do { piece_tableau[indi] = SaisirPièce(ref piece_tableau[indi]); // le tableau est déjà passé en référence indi++; } while (veutContinuer()); } internal static EnregPièce SaisirPièce(ref EnregPièce unepiece) { // Déclarations //EnregPièce pièceSaisie = new EnregPièce(); // initialisation de la structure pièceSaisie // Titre Console.Write("Saisie d'un descriptif de pièce." + LF); Console.Write("--------------------------------" + LF); // Identifiant unepiece.Id = Lire.Chaine("Entrez l'identifiant"); // on fait confiance à l'utilisateur pour le format // Couleur unepiece.couleurPièce = SaisirCouleur("Choisissez la couleur pièce (Jaune, Vert, Bleu, Rouge, Orange, Mauve)"); // Numéro de série unepiece.numeroSerie = Lire.Entier("Entrez le n° de série de la pièce (Voir au dos de la pièce)"); // on fait confiance à l'utilisateur pour le format // Date unepiece.DateFab = SaisirDate(); // Forme et dimensions unepiece.dimension.forme = SaisieForme("Donnez la forme de la pièce (Cubique, Cylindrique, Sphérique)"); switch (unepiece.dimension.forme) { case forme.Cubique: unepiece.dimension.cote = Lire.Double("Votre pièce à une forme Cubique, quelle est la longueur d'un côté?"); break; case forme.Sphérique: unepiece.dimension.rayon = Lire.Double("Votre pièce à une forme Sphérique, quel est son rayon?"); break; case forme.Cylindrique: unepiece.dimension.rayon = Lire.Double("Votre pièce est Cylindrique, quel est son rayon?"); unepiece.dimension.hauteur = Lire.Double("et quelle sa hauteur?"); break; default: Console.ReadLine(); break; } return unepiece; } private static couleur SaisirCouleur(String invite) { Boolean ok = false; String s; couleur val = (couleur)0; do // cette boucle obtient une chaine correcte { Console.Write(invite + " : "); s = Console.ReadLine(); // je transforme la chaine au format attendu s = Char.ToUpper(s[0]) + s.Substring(1, s.Length - 1).ToLower(); if (Enum.TryParse<couleur>(s, out val)) // je récupère la valeur associée à la chaine { ok = true; } else { Console.WriteLine("Saise erronée, veuillez recommencer"); } } while (!ok); return val; } private static date SaisirDate() { date dateRetournée; // déclaration d'une variable de type 'structurée' date // Saisie du nom du jour dateRetournée.NomJour = SaisieNomJour("Donnez le jour de la semaine (Lundi, Mardi, Mercredi, Jeudi, Vendredi, Samedi, Dimanche)"); // Saisie du jour dateRetournée.jourChiffre = Lire.Entier("Donnez le n° du Jour (de 1 à 30/31 "); // Saisie du mois dateRetournée.Mois = SaisieMois("Donnez le mois"); // Saisie de l'année dateRetournée.Annee = Lire.Entier("Donnez l'année"); return dateRetournée; } private static moisAnnée SaisieMois(string invite) { Boolean ok = false; String s; moisAnnée Mois = (moisAnnée)0; do // cette boucle obtient une chaine correcte { Console.Write(invite + " : "); s = Console.ReadLine(); // je transforme la chaine au format attendu s = Char.ToUpper(s[0]) + s.Substring(1, s.Length - 1).ToLower(); if (Enum.TryParse<moisAnnée>(s, out Mois)) // je récupère la valeur associée à la chaine { ok = true; } else { Console.WriteLine("Saise erronée, veuillez recommencer"); } } while (!ok); return Mois; } private static jourSemaine SaisieNomJour(string invite) { Boolean ok = false; String s; jourSemaine NomJour = (jourSemaine)0; do // cette boucle obtient une chaine correcte { Console.Write(invite + " : "); s = Console.ReadLine(); // je transforme la chaine au format attendu s = Char.ToUpper(s[0]) + s.Substring(1, s.Length - 1).ToLower(); if (Enum.TryParse<jourSemaine>(s, out NomJour)) // je récupère la valeur associée à la chaine { ok = true; } else { Console.WriteLine("Saise erronée, veuillez recommencer"); } } while (!ok); return NomJour; } private static forme SaisieForme(string invite) { Boolean ok = false; String s; forme forme = (forme)0; do // cette boucle obtient une chaine correcte { Console.Write(invite + " : "); s = Console.ReadLine(); // je transforme la chaine au format attendu s = Char.ToUpper(s[0]) + s.Substring(1, s.Length - 1).ToLower(); if (Enum.TryParse<forme>(s, out forme)) // je récupère la valeur associée à la chaine { ok = true; } else { Console.WriteLine("Saise erronée, veuillez recommencer"); } } while (!ok); return forme; } private static double SaisieRayon(string invite) { double leRayon; leRayon = Lire.Double("Donnez le rayon de la pièce"); return leRayon; } internal static void AfficherTableauPiece(EnregPièce[] Tableaupiece, int indice) { int cpteur; //compteur de piece cpteur = indice++; // indice de parcours Console.WriteLine("Vous avez saisi " + cpteur + " pièce(s). Tapez entrée pour voir toutes les caractéristiques saisies."); Console.ReadLine(); indice = 0; //init indice while (indice < cpteur) { Console.WriteLine("Identifiant : " + Tableaupiece[indice].Id + " || Numéro de série : " + Tableaupiece[indice].numeroSerie + " || Couleur : " + Tableaupiece[indice].couleurPièce + " || Date de fabrication : " + Tableaupiece[indice].DateFab.NomJour + " " + Tableaupiece[indice].DateFab.jourChiffre + " " + Tableaupiece[indice].DateFab.Mois + " " + Tableaupiece[indice].DateFab.Annee); Console.WriteLine("\nType : " + Tableaupiece[indice].dimension.forme); switch (Tableaupiece[indice].dimension.forme) { case forme.Sphérique: Console.WriteLine(" avec un rayon de " + Tableaupiece[indice].dimension.rayon); break; case forme.Cylindrique: Console.WriteLine(" avec un rayon de " + Tableaupiece[indice].dimension.rayon + " et une hauteur de " + Tableaupiece[indice].dimension.hauteur); break; case forme.Cubique: Console.WriteLine(" avec un côté de " + Tableaupiece[indice].dimension.cote); break; default: Console.ReadLine(); break; } indice++; } } } // celui de class EnginDePieces }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace PieceUsineCorrThib { public struct EnregPièce // Déclaration d'une structure de stockage d'un descriptif de pièce { public string Id; // Identifiant de la pièce public int numeroSerie; // numéro de série des pièces public couleur couleurPièce; // Voir liste énumérée 'couleur' public date DateFab; // Voir structure 'date' utilisant deux listes énumérée, 'jourSemaine' et 'moisAnnée' public mesure dimension; // Voir structure 'mesure' utilisant la liste énumérée 'forme' } public enum couleur { Jaune, Vert, Bleu, Rouge, Orange, Mauve }; public struct date { public jourSemaine NomJour; // Voir Liste énumérée 'jourSemaine' public moisAnnée Mois; // Voir Liste énumérée 'moisAnnée' public int jourChiffre; // le numéro du jour public int Annee; // numéro de l'année } public enum jourSemaine { Lundi, Mardi, Mercredi, Jeudi, Vendredi, Samedi, Dimanche }; public enum moisAnnée { Janvier, Février, Mars, Avril, Mai, Juin, Juillet, Août, Septembre, Octobre, Novembre, Décembre }; public struct mesure // tout ce qui constitue les mesures des pièces { public forme forme; // forme des pièces public double rayon; // rayon pour les pièces cylindriques et sphériques public double cote; // côté pour les pièces cubiques public double hauteur; // hauteur pour les pièces cylindriques } public enum forme { Cubique, Cylindrique, Sphérique }; class Program { public const int taille = 1000; static void Main(string[] args) { int indice; EnregPièce[] Tableaupiece; EnginDePieces.RemplirTableauPiece(out Tableaupiece, out indice); EnginDePieces.AfficherTableauPiece(Tableaupiece, indice); Console.ReadLine(); Console.WriteLine(); } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace PieceUsineCorrThib { public class EnginDeClass { public const char LF = '\u000A';// caractère de retour à la ligne public const int MAX_TAB_PIECE = 100; // Tableau contenant les decriptifs de pièces public static bool veutContinuer() { bool résultat; bool réponseOK; char réponse; résultat = false; // inutile, mais demandé par C# réponseOK = false; // passera à VRAI dès que l'opérateur saisi est accepté // et permettra la sortie de la boucle. do { réponse = Char.ToUpper(Lire.Caractere(LF + "Voulez-vous continuer (O ou N) ?")); if (réponse == 'O') { résultat = true; réponseOK = true; } else if (réponse == 'N') { résultat = false; réponseOK = true; } } while (!réponseOK); // arrêt quand la réponse est OK (O, o, N ou n). return résultat; } // fin veutContinuer public static void RemplirTableauPiece(out EnregPièce[] piece_tableau, out int indi) { piece_tableau = new EnregPièce[MAX_TAB_PIECE]; indi = 0; do { piece_tableau[indi] = SaisirPièce(ref piece_tableau[indi]); indi++; } while (veutContinuer()); } internal static EnregPièce SaisirPièce(ref EnregPièce unepiece) { // Déclarations EnregPièce pièceSaisie = new EnregPièce(); // initialisation de la structure pièceSaisie // Titre Console.Write("Saisie d'un descriptif de pièce." + LF); Console.Write("--------------------------------" + LF); // Identifiant pièceSaisie.Id= Lire.Chaine("Entrez l'identifiant"); // on fait confiance à l'utilisateur pour le format // Couleur pièceSaisie.couleurPièce = SaisirCouleur("Choisissez la couleur pièce (Jaune, Vert, Bleu, Rouge, Orange, Mauve)"); // Numéro de série pièceSaisie.numeroSerie = Lire.Entier("Entrez le n° de série de la pièce (Voir au dos de la pièce)"); // on fait confiance à l'utilisateur pour le format // Date pièceSaisie.DateFab = SaisirDate(); // Forme et dimensions pièceSaisie.dimension.forme = SaisieForme("Donnez la forme de la pièce (Cubique, Cylindrique, Sphérique)"); switch (unepiece.dimension.forme) { case forme.Cubique: unepiece.dimension.cote = Lire.Double("Votre pièce à une forme Cubique, quelle est la longueur d'un côté?"); break; case forme.Sphérique: unepiece.dimension.rayon = Lire.Double("Votre pièce à une forme Sphérique, quel est son rayon?"); break; case forme.Cylindrique: unepiece.dimension.rayon = Lire.Double("Votre pièce est Cylindrique, quel est son rayon?"); unepiece.dimension.hauteur = Lire.Double("et quelle sa hauteur?"); break; default: Console.ReadLine(); break; } return pièceSaisie; } private static couleur SaisirCouleur(String invite) { Boolean ok = false; String s; couleur val = (couleur)0; do // cette boucle obtient une chaine correcte { Console.Write(invite + " : "); s = Console.ReadLine(); // je transforme la chaine au format attendu s = Char.ToUpper(s[0]) + s.Substring(1, s.Length - 1).ToLower(); if (Enum.TryParse<couleur>(s, out val)) // je récupère la valeur associée à la chaine { ok = true; } else { Console.WriteLine("Saise erronée, veuillez recommencer"); } } while (!ok); return val; } private static date SaisirDate() { date dateRetournée; // déclaration d'une variable de type 'structurée' date // Saisie du nom du jour dateRetournée.NomJour = SaisieNomJour("Donnez le jour de la semaine (Lundi, Mardi, Mercredi, Jeudi, Vendredi, Samedi, Dimanche)"); // Saisie du jour dateRetournée.jourChiffre = Lire.Entier("Donnez le n° du Jour (de 1 à 30/31 "); // Saisie du mois dateRetournée.Mois = SaisieMois("Donnez le mois"); // Saisie de l'année dateRetournée.Annee = Lire.Entier("Donnez l'année"); return dateRetournée; } private static moisAnnée SaisieMois(string invite) { Boolean ok = false; String s; moisAnnée Mois = (moisAnnée)0; do // cette boucle obtient une chaine correcte { Console.Write(invite + " : "); s = Console.ReadLine(); // je transforme la chaine au format attendu s = Char.ToUpper(s[0]) + s.Substring(1, s.Length - 1).ToLower(); if (Enum.TryParse<moisAnnée>(s, out Mois)) // je récupère la valeur associée à la chaine { ok = true; } else { Console.WriteLine("Saise erronée, veuillez recommencer"); } } while (!ok); return Mois; } private static jourSemaine SaisieNomJour(string invite) { Boolean ok = false; String s; jourSemaine NomJour = (jourSemaine)0; do // cette boucle obtient une chaine correcte { Console.Write(invite + " : "); s = Console.ReadLine(); // je transforme la chaine au format attendu s = Char.ToUpper(s[0]) + s.Substring(1, s.Length - 1).ToLower(); if (Enum.TryParse<jourSemaine>(s, out NomJour)) // je récupère la valeur associée à la chaine { ok = true; } else { Console.WriteLine("Saise erronée, veuillez recommencer"); } } while (!ok); return NomJour; } private static forme SaisieForme(string invite) { Boolean ok = false; String s; forme forme = (forme)0; do // cette boucle obtient une chaine correcte { Console.Write(invite + " : "); s = Console.ReadLine(); // je transforme la chaine au format attendu s = Char.ToUpper(s[0]) + s.Substring(1, s.Length - 1).ToLower(); if (Enum.TryParse<forme>(s, out forme)) // je récupère la valeur associée à la chaine { ok = true; } else { Console.WriteLine("Saise erronée, veuillez recommencer"); } } while (!ok); return forme; } private static double SaisieRayon(string invite) { double leRayon; leRayon = Lire.Double("Donnez le rayon de la pièce"); return leRayon; } internal static void AfficherTableauPiece(EnregPièce[] Tableaupiece, int indice) { int cpteur; //compteur de piece cpteur = indice++; // indice de parcours Console.WriteLine("Vous avez saisi " + cpteur + " pièce(s). Tapez entrée pour voir toutes les caractéristiques saisies."); Console.ReadLine(); indice = 0; //init indice while (indice < cpteur) { Console.WriteLine("Identifiant : " + Tableaupiece[indice].Id + " || Numéro de série : " + Tableaupiece[indice].numeroSerie + " || Couleur : " + Tableaupiece[indice].couleurPièce + " || Date de fabrication : " + Tableaupiece[indice].DateFab.NomJour + " " + Tableaupiece[indice].DateFab.jourChiffre + " " + Tableaupiece[indice].DateFab.Mois + " " + Tableaupiece[indice].DateFab.Annee); Console.WriteLine("\nType : " + Tableaupiece[indice].dimension.forme); switch (Tableaupiece[indice].dimension.forme) { case forme.Sphérique: Console.WriteLine(" avec un rayon de " + Tableaupiece[indice].dimension.rayon); break; case forme.Cylindrique: Console.WriteLine(" avec un rayon de " + Tableaupiece[indice].dimension.rayon + " et une hauteur de " + Tableaupiece[indice].dimension.hauteur); break; case forme.Cubique: Console.WriteLine(" avec un côté de " + Tableaupiece[indice].dimension.cube); break; default: Console.ReadLine(); break; } indice++; } } } }
En quatre points :
piece_tableau[indi] = SaisirPièce(ref piece_tableau[indi]);
* la fonction SaisirPièce : qu'on met en
void pour qu'elle ne renvoie rien au de lui faire renvoyé une variable de type
EnregPièce
* fonction SaisirPièce dont on commente
RemplirTableauPiece
on commente
return unepiece;
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace PieceUsineCorrThib { public struct EnregPièce // Déclaration d'une structure de stockage d'un descriptif de pièce { public string Id; // Identifiant de la pièce public int numeroSerie; // numéro de série des pièces public couleur couleurPièce; // Voir liste énumérée 'couleur' public date DateFab; // Voir structure 'date' utilisant deux listes énumérée, 'jourSemaine' et 'moisAnnée' public mesure dimension; // Voir structure 'mesure' utilisant la liste énumérée 'forme' } public enum couleur { Jaune, Vert, Bleu, Rouge, Orange, Mauve }; public struct date { public jourSemaine NomJour; // Voir Liste énumérée 'jourSemaine' public moisAnnée Mois; // Voir Liste énumérée 'moisAnnée' public int jourChiffre; // le numéro du jour public int Annee; // numéro de l'année } public enum jourSemaine { Lundi, Mardi, Mercredi, Jeudi, Vendredi, Samedi, Dimanche }; public enum moisAnnée { Janvier, Février, Mars, Avril, Mai, Juin, Juillet, Août, Septembre, Octobre, Novembre, Décembre }; public struct mesure // tout ce qui constitue les mesures des pièces { public forme forme; // forme des pièces public double rayon; // rayon pour les pièces cylindriques et sphériques public double cote; // côté pour les pièces cubiques public double hauteur; // hauteur pour les pièces cylindriques } public enum forme { Cubique, Cylindrique, Sphérique }; class Program { public const int taille = 1000; static void Main(string[] args) { int indice; EnregPièce[] Tableaupiece; EnginDePieces.RemplirTableauPiece(out Tableaupiece, out indice); EnginDePieces.AfficherTableauPiece(Tableaupiece, indice); Console.ReadLine(); Console.WriteLine(); } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace PieceUsineCorrThib { public class EnginDePièces { public const char LF = '\u000A';// caractère de retour à la ligne public const int MAX_TAB_PIECE = 100; // Tableau contenant les decriptifs de pièces public static bool veutContinuer() { bool résultat; bool réponseOK; char réponse; résultat = false; // inutile, mais demandé par C# réponseOK = false; // passera à VRAI dès que l'opérateur saisi est accepté // et permettra la sortie de la boucle. do { réponse = Char.ToUpper(Lire.Caractere(LF + "Voulez-vous continuer (O ou N) ?")); if (réponse == 'O') { résultat = true; réponseOK = true; } else if (réponse == 'N') { résultat = false; réponseOK = true; } } while (!réponseOK); // arrêt quand la réponse est OK (O, o, N ou n). return résultat; } // fin veutContinuer public static void RemplirTableauPiece(out EnregPièce[] piece_tableau, out int indi) { piece_tableau = new EnregPièce[MAX_TAB_PIECE]; indi = 0; do { //piece_tableau[indi] = SaisirPièce(ref piece_tableau[indi]); SaisirPièce(ref piece_tableau[indi]); indi++; } while (veutContinuer()); } internal static void SaisirPièce(ref EnregPièce unepiece) { // Déclarations // EnregPièce pièceSaisie = new EnregPièce(); // initialisation de la structure pièceSaisie // Titre Console.Write("Saisie d'un descriptif de pièce." + LF); Console.Write("--------------------------------" + LF); // Identifiant unepiece.Id = Lire.Chaine("Entrez l'identifiant"); // on fait confiance à l'utilisateur pour le format // Couleur unepiece.couleurPièce = SaisirCouleur("Choisissez la couleur pièce (Jaune, Vert, Bleu, Rouge, Orange, Mauve)"); // Numéro de série unepiece.numeroSerie = Lire.Entier("Entrez le n° de série de la pièce (Voir au dos de la pièce)"); // on fait confiance à l'utilisateur pour le format // Date unepiece.DateFab = SaisirDate(); // Forme et dimensions unepiece.dimension.forme = SaisieForme("Donnez la forme de la pièce (Cubique, Cylindrique, Sphérique)"); switch (unepiece.dimension.forme) { case forme.Cubique: unepiece.dimension.cote = Lire.Double("Votre pièce à une forme Cubique, quelle est la longueur d'un côté?"); break; case forme.Sphérique: unepiece.dimension.rayon = Lire.Double("Votre pièce à une forme Sphérique, quel est son rayon?"); break; case forme.Cylindrique: unepiece.dimension.rayon = Lire.Double("Votre pièce est Cylindrique, quel est son rayon?"); unepiece.dimension.hauteur = Lire.Double("et quelle sa hauteur?"); break; default: Console.ReadLine(); break; } //return unepiece; } private static couleur SaisirCouleur(String invite) { Boolean ok = false; String s; couleur val = (couleur)0; do // cette boucle obtient une chaine correcte { Console.Write(invite + " : "); s = Console.ReadLine(); // je transforme la chaine au format attendu s = Char.ToUpper(s[0]) + s.Substring(1, s.Length - 1).ToLower(); if (Enum.TryParse<couleur>(s, out val)) // je récupère la valeur associée à la chaine { ok = true; } else { Console.WriteLine("Saise erronée, veuillez recommencer"); } } while (!ok); return val; } private static date SaisirDate() { date dateRetournée; // déclaration d'une variable de type 'structurée' date // Saisie du nom du jour dateRetournée.NomJour = SaisieNomJour("Donnez le jour de la semaine (Lundi, Mardi, Mercredi, Jeudi, Vendredi, Samedi, Dimanche)"); // Saisie du jour dateRetournée.jourChiffre = Lire.Entier("Donnez le n° du Jour (de 1 à 30/31 "); // Saisie du mois dateRetournée.Mois = SaisieMois("Donnez le mois"); // Saisie de l'année dateRetournée.Annee = Lire.Entier("Donnez l'année"); return dateRetournée; } private static moisAnnée SaisieMois(string invite) { Boolean ok = false; String s; moisAnnée Mois = (moisAnnée)0; do // cette boucle obtient une chaine correcte { Console.Write(invite + " : "); s = Console.ReadLine(); // je transforme la chaine au format attendu s = Char.ToUpper(s[0]) + s.Substring(1, s.Length - 1).ToLower(); if (Enum.TryParse<moisAnnée>(s, out Mois)) // je récupère la valeur associée à la chaine { ok = true; } else { Console.WriteLine("Saise erronée, veuillez recommencer"); } } while (!ok); return Mois; } private static jourSemaine SaisieNomJour(string invite) { Boolean ok = false; String s; jourSemaine NomJour = (jourSemaine)0; do // cette boucle obtient une chaine correcte { Console.Write(invite + " : "); s = Console.ReadLine(); // je transforme la chaine au format attendu s = Char.ToUpper(s[0]) + s.Substring(1, s.Length - 1).ToLower(); if (Enum.TryParse<jourSemaine>(s, out NomJour)) // je récupère la valeur associée à la chaine { ok = true; } else { Console.WriteLine("Saise erronée, veuillez recommencer"); } } while (!ok); return NomJour; } private static forme SaisieForme(string invite) { Boolean ok = false; String s; forme forme = (forme)0; do // cette boucle obtient une chaine correcte { Console.Write(invite + " : "); s = Console.ReadLine(); // je transforme la chaine au format attendu s = Char.ToUpper(s[0]) + s.Substring(1, s.Length - 1).ToLower(); if (Enum.TryParse<forme>(s, out forme)) // je récupère la valeur associée à la chaine { ok = true; } else { Console.WriteLine("Saise erronée, veuillez recommencer"); } } while (!ok); return forme; } private static double SaisieRayon(string invite) { double leRayon; leRayon = Lire.Double("Donnez le rayon de la pièce"); return leRayon; } internal static void AfficherTableauPiece(EnregPièce[] Tableaupiece, int indice) { int cpteur; //compteur de piece cpteur = indice++; // indice de parcours Console.WriteLine("Vous avez saisi " + cpteur + " pièce(s). Tapez entrée pour voir toutes les caractéristiques saisies."); Console.ReadLine(); indice = 0; //init indice while (indice < cpteur) { Console.WriteLine("Identifiant : " + Tableaupiece[indice].Id + " || Numéro de série : " + Tableaupiece[indice].numeroSerie + " || Couleur : " + Tableaupiece[indice].couleurPièce + " || Date de fabrication : " + Tableaupiece[indice].DateFab.NomJour + " " + Tableaupiece[indice].DateFab.jourChiffre + " " + Tableaupiece[indice].DateFab.Mois + " " + Tableaupiece[indice].DateFab.Annee); Console.WriteLine("\nType : " + Tableaupiece[indice].dimension.forme); switch (Tableaupiece[indice].dimension.forme) { case forme.Sphérique: Console.WriteLine(" avec un rayon de " + Tableaupiece[indice].dimension.rayon); break; case forme.Cylindrique: Console.WriteLine(" avec un rayon de " + Tableaupiece[indice].dimension.rayon + " et une hauteur de " + Tableaupiece[indice].dimension.hauteur); break; case forme.Cubique: Console.WriteLine(" avec un côté de " + Tableaupiece[indice].dimension.cube); break; default: Console.ReadLine(); break; } indice++; } } } }
EnregPièce pièceSaisie = new EnregPièce();
: La aussi merci, je suis tout à fait d'accordEnregPièce pièceSaisie = new EnregPièce();
, c'est cela que je ne comprenais pas !!!