Mohit Tomar Ответов: 2

Верен ли мой код? Что еще я могу улучшить


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

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

Я написал следующий код c# для преобразования десятичного числа в двоичное.

using System;

namespace Ch6ExQ16
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Write("Enter the number: ");// THE NUMBER TO BE ENTERED FOR CONVERTING TO BINARY
            int num = int.Parse(Console.ReadLine());// PARSING OF NUMBER
            int[] revArr = new int[8];// SET THE ARRAY EQUAL TO THE SIZE OF A BYTE I.E. 8BITS
            bool onlyOnceTrue = true;// THIS IS USED SO THAT THE NESTED SECOND FOR LOOP (CHILD LOOP) DO NOT GO INTO LOOPING CYCLES MORE THEN ONCE // BECAUSE IF IT DOES THEN THAT WILL RESULT IN THE ARRAY (REVARR) GIVEN ABOVE TO FILL ONLY ONE VALUE OF REM IN ALL ITS ELEMENTS I.E. THE VALUE CALCULATED DURING 1ST ITERATION OF THE ORIGINAL PARENT LOOP // AND ONLY AFTER FILLING THE COMPLETE BYTE (ARRAY) IT WILL ALLOW THE FIRST, PARENT FOR LOOP TO DO FURTHER CALCULATIONS WHICH THEN WILL BE USELESS AS OUR ARRAY WOULD HAVE BEEN FULL WITH REPEATED VALUES OF REM
            int index = -1;// THIS IS USED SO THAT THE VALUE IN THE CHILD FOR LOOP WHILE REVERSING THE ARRAY AND INITIALISING IT WITH CORRECT REM VALUE REMAINS SYNCRONISED WITH THE CORRESPONDING INDEX // IT IS USEFUL FOR THIS SENTENCE ((revArr[revArr.Length - index - 1] = rem;))

            for (int quot = num; quot > 0;)// THIS IS THE 1ST LOOP OR THE PARENT LOOP
            {
                int rem = quot % 2;
                quot /= 2;
                onlyOnceTrue = true;// THIS RESETS THE VALUE OF ONLYONCETRUE BACK TO TRUE WHICH WAS PREVIOUSLY CHANGED FROM TRUE TO FALSE IN THEE 2ND LOOP GIVEN BELOW // THIS RELATES TO THE EXPLANATION GIVEN ABOVE ABOUT DISABLING THE 2ND FOR LOOP TO GO INTO LOOPING CYCLES

                for (index++; onlyOnceTrue == true;)// THIS IS THE CHILD LOOP OR THE 2ND LOOP
                {
                    revArr[revArr.Length - index - 1] = rem; // THIS IS USED SO THAT THE ARRAY IS INITIALISED FROM THE LAST INDEX TO THE FIRST I.E. IN REVERSE ORDER// THE FIRST REM VALUE CALCULATED WILL BE PUT IN THE LAST INDEX OF THE ARRAY // THIS KEEPS ON DECREASING THE INDEX NUMBER TILL IT REACHES ZERO '0'
                    onlyOnceTrue = false; // AFTER THIS LOOP RUNS ONCE THIS VALUE WILL KEEP IT FROM RUNNING AGAIN AS IT CHANGES THE ONLYONCETRUE TO FALSE AND THUS THE EXECUTION GOES BACK TO THE FIRST LOOP
                }
            }
            for (int i = 0; i < revArr.Length; i++) // THIS IS A COMMON FOR LOOP THAT IS USED TO PRINT THE VALUES OF ARRAY
            {
                Console.Write(revArr[i]);
            }
            Console.WriteLine();
        }
    }
}


Что я уже пробовал:

Любой ответ будет очень признателен.. И если кто-то может указать мне на какую-то ссылку или форум, где я могу поделиться своим будущим кодом для обзора, это будет большим подспорьем. :-)

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

Заранее спасибо.. :-)

Afzaal Ahmad Zeeshan

Обзоры кода, как правило, не по теме, так как нет "одного правила", чтобы сделать его лучше.

2 Ответов

Рейтинг:
2

Jochen Arndt

Это было бы правильно, если введенное число не превышает 255 (0xff). В противном случае размер вашего массива будет превышен.

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

Целые числа уже являются двоичными. Вы просто должны обработать каждый бит. Нет необходимости использовать операцию по модулю. Вы можете просто использовать битовую маску, чтобы проверить, установлен ли определенный бит.

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

Складывая все это вместе:

List<int> intList = new List<int()>;
while (num)
{
    // Mask out the lowest bit and append that to the list
    intList.Add(num & 1);
    // Shift out the lowest bit
    num >>= 1;
}
intList.Reverse();
Теперь вы можете распечатать элементы списка.

Другие варианты использования списка bool, или - когда результат должен быть только напечатан - a String или StringBuilder объект. Вы также можете использовать массив вместо списка при установке соответствующего размера (32 или 64).


Mohit Tomar

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

Однако я скопировал свой код, внес некоторые коррективы и включил в него BigIntegers, а также увеличил размер массива до размера QWORD (нашел слово "QWORD" в моем калькуляторе программистов Windows 10) хе-хе...: -): -) и сделал массив длиной 64 элемента.. :-) :-)

Таким образом, после корректировки массив был 64-битным, и код успешно отображал двоичные файлы чисел больше 255.

Самое большое число, которое он теперь может преобразовать в двоичный код, - это:

Десятичная дробь = 9,999,999,999,999,999,999

Двоичные = 1000101011000111001000110000010010001001111001111111111111111111


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

Спасибо за вашу помощь.. :-)

Рейтинг:
1

RmcbainTheThird

Эта строка вызовет исключение, если входные данные не являются числом

t num = int.Parse(Console.ReadLine());// 


используйте tryParse для проверки наличия числа, прежде чем что-либо делать со значением