Я сделал задачу из одного известного курса. Задача заключается в том, что у нас есть долг и мы можем оплатить его сразу либо по частям. Но условие состоит в том, что твой следующий платёж должен быть больше чём предыдущий. С самой задачей я справился, но смотря на код, думаю, что он очень запутанный и сложный.
Вот он:
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;
}
}
}
Ваш код действительно излишне запутан, большая часть ошибок типична для новичков, главное что вы САМИ нашли решение задачи, это уже огромный плюс.
Немного об ошибках.
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}");
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Доброго времени сутокЕсть код, который при нажатии на кнопку добавляет новые textbox
сколько не читал мсдн так и не понял зачем при заполнении datagridview прописывать еще и SqlDataAdapter а DataTable недостаточно? Может вопрос глупый но я хочу...
После мартовского обновления VSCode и обновления dotnet пакета, если пытаюсь запустить программу через терминал командой dotnet run, получаю ошибку: