Как добавить переменную за время l oop с той же переменной в al oop (если это возможно) - PullRequest
0 голосов
/ 11 марта 2020

Здесь у меня есть небольшое консольное приложение, которое я хочу, чтобы пользователь набрал свою месячную зарплату, а затем свои «расходы». Чтобы подсчитать, сколько денег у них есть за месяц, как только они забирают свои расходы (калькулятор, который сообщает пользователь, сколько денег у них ежемесячно после оплаты всех счетов). Я хотел бы отнять у int Salary. Я хочу, чтобы расходы продолжали заполняться до тех пор, пока пользователь не введет «false», в bool FinishedAdding в настоящее время переменная Expenses содержит только одно значение, я хочу добавить все расходы и затем вычесть их из зарплаты. Я делаю это правильно или это неправильный подход?

string NewLine = "\n";
bool Finished = false;
var Expenses = default(int);

Console.WriteLine("Enter you earn a month (after tax");
int Salary = Convert.ToInt32(Console.ReadLine());
Console.WriteLine(NewLine);

if (Finished != true)
{
    while (Finished == false)
    {
        Console.WriteLine("What are your expenses");
        Expenses = Convert.ToInt32(Console.ReadLine());

        Console.WriteLine("You are finished?");
        bool FinishedAdding = Convert.ToBoolean(Console.ReadLine());

        if (FinishedAdding == true)
        {
            break;
        }
    }
}

Console.WriteLine(NewLine);
Console.WriteLine("Your total is: " + (Expenses - Salary));

Ответы [ 4 ]

2 голосов
/ 11 марта 2020

С

Expenses = Convert.ToInt32(Console.ReadLine());

вы присваиваете значение Expenses с каждой итерацией. Так как расходы пользователя не равны последней потраченной им сумме, а суммированной сумме, вам придется суммировать расходы

Expenses = Expenses + Convert.ToInt32(Console.ReadLine());

. Это можно упростить с помощью +=, что в принципе "добавить значение к содержимому переменной и присвоить новое значение переменной" . Это дает

Expenses += Convert.ToInt32(Console.ReadLine());

На примечании стороны

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

while(!Finish)
{
    var input = ReadInput("Your message");

    if(ShouldExit(input))
    {
        Finish = true;
    }
    else if(IsValidAmount(input))
    {
        Expenses = input.Amount;
    }
    else
    {
        WriteErrorMessage("Your error message");
    }
}

, если input относится к типу UserInput, например,

class UserInput
{
    // ...

    public bool Finished { get; }

    public Decimal Amount { get; }
}

только для сущности это.

2 голосов
/ 11 марта 2020

Пара изменений, которые я сделал:
1) Самое главное: Expenses += будет добавлять то, что они вводят каждый раз, к сумме, которую они вводили ранее. Это будут ваши общие расходы, которые вы затем сможете вычесть из зарплаты.
2) Вместо использования отдельной переменной для Finished, просто установите переменную Finished на то, вводят ли они "true" или "false".
3) Нет необходимости в операторах if и break, просто пусть критерии while проверяют переменную Finished.

string NewLine = "\n";
bool Finished = false;
var Expenses = default(int);

Console.WriteLine("Enter you earn a month (after tax)");
int Salary = Convert.ToInt32(Console.ReadLine());
Console.WriteLine(NewLine);

while (Finished == false)
{
    Console.WriteLine("What are your expenses");
    Expenses += Convert.ToInt32(Console.ReadLine());

    Console.WriteLine("You are finished?");
    Finished = Convert.ToBoolean(Console.ReadLine());
}

Console.WriteLine(NewLine);
Console.WriteLine($"Your total is: {(Salary - Expenses)}");
2 голосов
/ 11 марта 2020

Давайте реализуем процедуру шаг за шагом . Мы можем начать с чтения decimal (что лучше подходит для финансовых данных, таких как Salary)

// Either enter valid decimal value or press enter (for exit)
private static bool TryReadDecimalOrExit(string title, out decimal value) {
  value = 0m;

  while (true) {
    if (!string.IsNullOrWhiteSpace(title)) 
      Console.WriteLine(title);

    string input = Console.ReadLine();

    if (string.IsNullOrWhiteSpace(input))
      return false;

    if (decimal.TryParse(input, out value))
      return true;

    Console.WriteLine("Sorry, invalid value. Please, try again");
  }
}

private static decimal ReadDecimal(string title) {
  while (true) {
    if (!string.IsNullOrWhiteSpace(title)) 
      Console.WriteLine(title);

    string input = Console.ReadLine();

    if (decimal.TryParse(input, out value))
      return value;

    Console.WriteLine("Sorry, invalid value. Please, try again");
  }
}

Время до l oop:

   decimal Salary = ReadDecimal("Enter you earn a month (after tax");

   Decimal Expenses = 0m;

   // While not exited, ask for a new expense
   while (TryReadDecimalOrExit("What are your expenses", out var expense)) 
     Expenses += expense;

   Console.WriteLine("Your total is: {Salary - Expenses:c2}");
0 голосов
/ 11 марта 2020
string NewLine = "\n";
    bool Finished = false;
    var Expenses = default(int);

    Console.WriteLine("Enter you earn a month (after tax");
    int Salary = Convert.ToInt32(Console.ReadLine());
    Console.WriteLine(NewLine);

    while (!Finished)
    {
        Console.WriteLine("What are your expenses");
        Expenses += Convert.ToInt32(Console.ReadLine());

        Console.WriteLine("You are finished?");
        Finished = Convert.ToBoolean(Console.ReadLine());
    }


    Console.WriteLine(NewLine);
    Console.WriteLine("Your total is: " + (Salary - Expenses));
...