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

202
09 апреля 2017, 00:22

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

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;
        } 
    }
}
Answer 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}");
}
READ ALSO
Сохранение кол-ва полей ввода и сохранение данных из них

Сохранение кол-ва полей ввода и сохранение данных из них

Доброго времени сутокЕсть код, который при нажатии на кнопку добавляет новые textbox

248
Удалить все файлы в каталоге кроме обьявленных

Удалить все файлы в каталоге кроме обьявленных

приветствуюсуть вопроса в заголовке

234
Зачем нужен обьект SqlDataAdapter

Зачем нужен обьект SqlDataAdapter

сколько не читал мсдн так и не понял зачем при заполнении datagridview прописывать еще и SqlDataAdapter а DataTable недостаточно? Может вопрос глупый но я хочу...

250
VS Code перестал компилировать программы на C#

VS Code перестал компилировать программы на C#

После мартовского обновления VSCode и обновления dotnet пакета, если пытаюсь запустить программу через терминал командой dotnet run, получаю ошибку:

230