Vous n'êtes pas identifié(e).
L'icône rouge permet de télécharger chaque page du wiki visitée au format PDF et la grise au format ODT →
Ceci est une ancienne révision du document !
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.
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'ai voulu écrire :
// Déclarations EnregPièce pièceSaisie = new EnregPièce();
ou
// Déclarations EnregPièce unepiece = new EnregPièce();
tandis que ceci fonctionne :
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]); 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++; } } } }