Страницы

Поиск по вопросам

суббота, 4 января 2020 г.

Упростить код на C#

#c_sharp #инспекция_кода


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

using System;

class Program
{
    static void Main()
    {
        int maxSum = 700;
        int payment = 0;
        int previousPayment = 0;
        int moneyToPay = 0; 

        while(maxSum != 0)
        {
            do
            {
                Console.WriteLine("Введите сумму платежа");

                 payment = int.Parse(Console.ReadLine());
                //previousPayment = payment;

                 moneyToPay = debt(payment, ref maxSum, ref previousPayment);

                if (moneyToPay == 0)
                {
                    break;
                }
            } while (false);

            if(moneyToPay == -1)
            {
                break;
            }

        }

        Console.ReadKey();
    }


    static int debt(int a,ref int maxSum, ref int previousPayment)
    {
        if (a == maxSum) 
        {
            Console.WriteLine("Долг погашен");
            return maxSum = 0;
        }
        else if (a < maxSum)
        {
            int Debt = maxSum - a;
            if(a < previousPayment)
            {
                Console.WriteLine("Вы должны оплатить сумму больше чём {0}", previousPayment);
                return -1;
            }

            Console.WriteLine("Ваш долг составляет:{0}", Debt);
            maxSum = Debt;
            previousPayment = a;

            return Debt;
        }
        else
        {
            Console.WriteLine("Долг погашен");
            Console.WriteLine("Переполнение составляет:{0}", a - maxSum);
            return maxSum = 0;
        } 
    }
}

    


Ответы

Ответ 1



Ваш код действительно излишне запутан, большая часть ошибок типична для новичков, главное что вы САМИ нашли решение задачи, это уже огромный плюс. Немного об ошибках. конструкция do{...}while(false) выполняется строго один раз, таким образом бесполезна и может быть удалена. while(maxSum != 0) осторожнее с использованием такого условия, т.к. цикл будет завершен строго при maxSum == 0, в данной задаче лучше было использовать условие while(maxSum > 0). static int debt(int a,ref int maxSum, ref int previousPayment) очень хорошо, что вы смогли разобраться с передачей параметров по ссылке, но в данном случае было бы правильнее объявить maxSum и previousPayment приватными статическими полями класса, и обращаться к ним напрямую из метода. Это похоже на глобальные переменные, но только в пределах класса. немного запутана последовательность действий и видно, так сказать, ход ваших мыслей в процессе поиска. Нужно было еще раз посмотреть на найденное решение и постараться найти повторяющиеся моменты. Но это нормально для начала и придет с опытом, если не будете останавливаться на достигнутом. Код можно изрядно сократить без ущерба "читаемости", например вот так: void Main() { int debt = 700; int lastPayment = 0; while(debt > 0) { Console.WriteLine("Введите сумму платежа"); int payment = int.Parse(Console.ReadLine()); while(payment <= lastPayment) { Console.WriteLine($"Вы должны оплатить сумму больше чём {lastPayment}"); payment = int.Parse(Console.ReadLine()); } lastPayment = payment; debt -= payment;//debt = debt - payment на всякий случай } Console.WriteLine("Долг погашен"); //как только долг стал меньше или равен 0, его модуль равен сумме переплаты, этим и воспользуемся. if(debt < 0) Console.WriteLine($"Переплата составляет:{-debt}"); }

Комментариев нет:

Отправить комментарий