Как исправить цикл, который не будет работать дважды с одним и тем же входом - PullRequest
1 голос
/ 19 апреля 2019

Я пытаюсь создать простую программу, которая запрашивает целое число и, если это целое число является простым числом, выводит свои коэффициенты.Если ввод пользователя не является основным фактором, он просит пользователя ввести главный фактор.Проблема в том, что если я дважды введу действительный простой множитель подряд, это не даст мне правильного результата.Я работал над этим некоторое время, и я думаю, что должно быть что-то очевидное, что я скучаю, потому что я не могу понять это.

class Program
{
    static void Main(string[] args)
    {
        List<int> factors = new List<int>();
        int a, b, c;
        Console.Write("Hello,\n Please enter an integer: ");
        string userInput = Console.ReadLine();
        while (userInput != "quit")
        {
            try
            {
                a = int.Parse(userInput);
                c = a;
                bool negative = a < 0;
                int letter = Convert.ToInt32(Int32.TryParse(userInput, out letter));
                if (!negative && letter != 0)
                {
                    for (b = 2; a > 1;)
                        if (a % b == 0)
                        {                
                            while (c % b == 0)
                            {
                                c /= b;
                                factors.Add(c);
                            }
                            Console.WriteLine($"{a} has factors: { String.Join(", ", factors)}");
                            Console.Write("Please enter another integer: ");
                            factors.Clear();
                            userInput = Console.ReadLine();
                            a = int.Parse(userInput);


                        }
                }
                else
                {
                    Console.Write("Please enter a valid prime factor: ");
                    userInput = Console.ReadLine();
                }

            }
            catch
            {
                Console.Write("Please enter a valid prime factor: ");
                userInput = Console.ReadLine();
            }
        }
    }
}

Здравствуйте, пожалуйста, введите целое число: 64 ...
64 имеет множители: 32, 16, 8, 4, 2, 1 Пожалуйста, введите другое целое число: y ...
Пожалуйста, введите действительный простой множитель:

сейчас, если я сделаю два действительных простых множителя подряд

Здравствуйте, Пожалуйста, введите целое число: 64 ...
64 имеет множители: 32,16, 8, 4, 2, 1 Пожалуйста, введите другое целое число: 8 ...
8 имеет факторы: Пожалуйста, введите другое целое число:

однако ....

Здравствуйте, пожалуйставведите целое число: 64 ...
64 имеет множители: 32, 16, 8, 4, 2, 1 Пожалуйста, введите другое целое число: y ...
Пожалуйста, введите действительное простое число: 8 8 имеет множители:4, 2, 1 Пожалуйста, введите другое целое число:

1 Ответ

1 голос
/ 19 апреля 2019

Обычно я просто не могу дать ответ, потому что для разработчика важно иметь возможность решить эти проблемы самостоятельно.Но я не могу ответить в комментариях.Поэтому я предоставлю некоторые отзывы, которые привели меня к решению, и некоторые общие комментарии.

Если вы потратите время на отладку, вы сможете увидеть проблемы в коде.Добавление простых Console.WriteLines для указания того, где в потоке кода вещи начинают работать не так.

Вам также необходимо предоставить более подходящие имена для переменных.a, b, c не имеют смысла и их трудно понять.Лучшие имена переменных означают, что мы можем лучше понять проблему, с которой вы столкнулись, а также то, что пытается сделать код.Хорошо написанный блок кода должен быть читаемым и в целом понятным в течение 5 секунд.Я приложил все усилия, чтобы применить его к вашему коду в целом, не перестраивая слишком много, чтобы вы могли видеть точки избыточности в коде для сравнения.

Проблема заключалась в том, что когда я отлаживал ваш код, это было похоже на бесконечный циклпроисходит или какая-то странность с анализом int.Поскольку я не хотел тратить слишком много времени на понимание причин, по которым это происходит, я сделал приведенные выше предложения к коду, чтобы просто уменьшить сложность кода и улучшить читабельность, чтобы снизить риск возникновения ошибки.

Приведенное ниже решение не может быть на 100% в соответствии с тем, что вам нужно, трудно понять это из-за отсутствия ожидаемых результатов.

using System;
using System.Collections.Generic;

public class Program
{
    public static void Main(string[] args)
    {
        List<int> factors = new List<int>();
        while (true)
        {
            Console.WriteLine("Please enter an integer: ");
            var userInput = Console.ReadLine();
            if (userInput.Equals("quit"))
                break;

            if (!Int32.TryParse(userInput, out var firstOut)
               || !Int32.TryParse(userInput, out var secondOut))
                continue; 

            if (firstOut % 2 != 0 || firstOut < 0)
                continue;

            while (secondOut % 2 == 0)
            {
                secondOut /= 2;
                factors.Add(secondOut);
            }

            Console.WriteLine($"{firstOut} has factors: {String.Join(", ", factors)}");
            factors.Clear();
        }
    }
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...