6
votes

Comment boucler une déclaration IF avec beaucoup d'autre si des conditions

J'ai un problème en boucle la déclaration if-inscrite dans mon code. J'ai regardé d'autres discussions sur Stackoverflow, mais je ne pouvais pas le faire fonctionner plusieurs fois. Le programme que j'essaie de créer est un convertisseur de base pour une société de casting. Ce que j'ai essayé de faire, c'est que l'utilisateur puisse entrer le type de conversion nécessaire, puis le poids de la cire. Il donnerait ensuite à l'utilisateur la quantité correcte de grammes de métal précieux à utiliser. Le problème est que j'en ai besoin pour courir depuis le début jusqu'à ce que l'utilisateur soit effectué en l'utilisant. J'ai essayé d'utiliser une déclaration de temps, mais cela boucit simplement l'autre partie de la déclaration IF-IF. Voici mon code pour référence:

static void Main(string[] args)
    {
        double waxWeight, bronzeWeight, silverWeight, fourteenkGoldWeight,
            eighteenkGoldWeight, twentytwokGoldWeight, platinumWeight;
        string wW;

        bool doesUserWantToLeave = false;

        Console.WriteLine("Please specify the type of conversion you would like to accomplish:" 
            + "\n(Bronze, Silver, 14k Gold, 18k Gold, 22k Gold, Platinum, or Exit):");

        string conversionType = Console.ReadLine();

        //bool B = conversionType == "Bronze";
        //bool S = conversionType == "Silver";
        //bool ftG = conversionType == "14k Gold";
        //bool etG = conversionType == "18k Gold";
        //bool ttG = conversionType == "22k Gold";
        //bool P = conversionType == "Platinum";

        while (!doesUserWantToLeave)
        {

            if (conversionType == "Bronze")
            {
                Console.WriteLine("What is the weight of the wax model?");
                wW = Console.ReadLine();
                waxWeight = double.Parse(wW);

                bronzeWeight = waxWeight * 10;
                Console.WriteLine("You need " + bronzeWeight + " grams of bronze.");
                Console.ReadLine();
            }

            else if (conversionType == "Silver")
            {
                Console.WriteLine("What is the weight of the wax model?");
                wW = Console.ReadLine();
                waxWeight = double.Parse(wW);

                silverWeight = waxWeight * 10.5;
                Console.WriteLine("You need " + silverWeight + " grams of silver.");
                Console.ReadLine();
            }

            else if (conversionType == "14k Gold")
            {
                Console.WriteLine("What is the weight of the wax model?");
                wW = Console.ReadLine();
                waxWeight = double.Parse(wW);

                fourteenkGoldWeight = waxWeight * 13.5;
                Console.WriteLine("You need " + fourteenkGoldWeight + " grams of 14 Karat gold.");
                Console.ReadLine();
            }

            else if (conversionType == "18k Gold")
            {
                Console.WriteLine("What is the weight of the wax model?");
                wW = Console.ReadLine();
                waxWeight = double.Parse(wW);

                eighteenkGoldWeight = waxWeight * 15;
                Console.WriteLine("You need " + eighteenkGoldWeight + " grams of 18 Karat gold.");
                Console.ReadLine();
            }

            else if (conversionType == "22k Gold")
            {
                Console.WriteLine("What is the weight of the wax model?");
                wW = Console.ReadLine();
                waxWeight = double.Parse(wW);

                twentytwokGoldWeight = waxWeight * 17.3;
                Console.WriteLine("You need " + twentytwokGoldWeight + " grams of 22 Karat gold.");
                Console.ReadLine();
            }

            else if (conversionType == "Platinum")
            {
                Console.WriteLine("What is the weight of the wax model?");
                wW = Console.ReadLine();
                waxWeight = double.Parse(wW);

                platinumWeight = waxWeight * 21.5;
                Console.WriteLine("You need " + platinumWeight + " grams of platinum.");
                Console.ReadLine();
            }

            else if (conversionType == "Exit")
            {
                doesUserWantToLeave = true;
            }

            else
            {
                Console.WriteLine("Sorry! That was an invalid option!");
                Console.ReadLine();
            }
        }
    }


2 commentaires

En fait, je suis un peu jaloux que cette question semble facilement obtenir trois upvotes.


@Uwekeim Eh bien, voyant les réponses ... Il est incroyable à quel point il est facile de manquer à tant de personnes de manquer complètement le point sur une question aussi simple et une telle pièce simple.


3 Réponses :


-1
votes

Vous pouvez extraire cette pièce de code dans une méthode séparée qui sera appelée à partir de la boucle du programme principal, voir le pseudo-code ci-dessous:

public double ConvertMethod(string type, double weight)
{
   switch(type) {
      case "Silver":
         return weight * 10.5;
      case "Bronze":
         return weight * 10;

     // etc...
   }
}


0 commentaires

3
votes

Vous devez ré-attribuer l'option utilisateur à la fin de la boucle, sinon elle ne changera jamais:

while (!doesUserWantToLeave)
{
    if (conversionType == "Bronze")
    {
        //....
    }
    // ...
    else if (conversionType == "Exit")
    {
        doesUserWantToLeave = true;
    }
    else
    {
        Console.WriteLine("Sorry! That was an invalid option!");
    }
    conversionType = Console.ReadLine();
}


0 commentaires

5
votes

Vous ne demandez que le type de métal une fois. Déplacez les deux lignes dans lesquelles vous invitez et recevez, la saisie de l'utilisateur à l'intérieur du pendant boucle: xxx

Vous mentionnez que vous êtes nouveau à la programmation et que vous êtes conscient que vous se répètent vous-même. Vous priorisez-vous correctement l'obtention du code d'abord. C'est bon. Après avoir travaillé, vous devriez ensuite regarder l'amélioration du code.

Premièrement, les trois lignes suivantes sont répétées après chaque si et ne doivent donc pas être posées une fois au sommet de la boucle: xxx

Suivant, les deux dernières lignes de chaque si se répètent en grande partie, mais la seule partie qui change (le nom métallique) est connu. . Donc, ils peuvent tous être supprimés et remplacés par une seule copie à la fin de la boucle: xxx

ceci puis laisse une ligne par si . Il se répète trop et les valeurs nécessaires pourraient être stockées dans le dictionnaire. Faites tout cela et que vous pourriez vous retrouver avec une solution comme: xxx

ceci pourrait être amélioré davantage (les nombreux pourraient être supprimés; vous Ne testez pas si l'entrée de poids est une double analyse valide avant d'analyser), mais cela vous mettra sur le chemin droit.


1 commentaires

J'aimerais vraiment vous donner plus que +1 pour vous priorisez correctement l'obtention du code qui fonctionne d'abord. Une bonne réponse :)