MSDN.WhiteKnight - Stack Overflow answers
Ответ на "Корректировка кода консольного калькулятора на C#"
Answer 985029
В дополнение:
A = Convert.ToInt32(AT); B = Convert.ToInt32(BT);
При использовании методов класса Convert единственный способ обработки неверного ввода - исключения. Генерация исключений является несколько тяжелой операцией, поэтому лучше использовать метод TryParse.
Console.WriteLine("Числа имеют значение 0, продолжать работу программы нет смысла, завершение");
Такая проверка не имеет смысла, арифметические операции с нолями вполне допустимы (кроме деления). 0+0 должно выдавать 0, а не ошибку.
char[] NumUs = new char[Longe] { '+', '-', '*', ':' }; //... for (byte i = 0; i < Longe; i++)
Если массив зашит в коде, нет смысла также зашивать в коде его константную длину. Длину массива можно определить программно методом Length, так что при добавлении элементов не придется менять код в двух местах
Console.WriteLine("Хватит шалить, вводи число от 1 до 4 включительно");
Вы предлагаете пользователю ввести число, а затем преобразуете его в символ. Почему бы сразу не вводить символ? Это намного проще и удобнее.
Console.WriteLine("Close program? y/n"); answer = Console.ReadLine();
Так как вы просите пользователя ввести один из символов, оба из которых требуют одиночного нажатия клавиши, можно сделать его ввод чуть более удобным с использованием Console.ReadKey.
private static void StartProgramm()//полагает начало программы { MathGetNumber(); MathOperation(); }
Этот код привносит в программу "повторную входимость": StartProgramm вызывает MathGetNumber, который, в свою очередь, вызывает StartProgramm. Это приводит к тому, что стек вызовов в ходе работы программы будет постепенно расти. Для реализации повторяемости лучше использовать циклы, а не повторно входимые методы.
Мой вариант улучшения с учетом этих замечаний:
using System; using System.Text; namespace ConsoleApp1 { class Program { private static int A; private static int B; static void Main(string[] args) { bool success; while (true) { while (true) { success = MathGetNumber(); if (success) break; } while (true) { success = MathOperation(); if (success) break; } if (Close()) break; } } private static bool MathGetNumber()//получаем число { string AT; string BT; Console.WriteLine("Первое число"); AT = Console.ReadLine(); Console.WriteLine("Второе число"); BT = Console.ReadLine(); if (Int32.TryParse(AT, out A) == false || Int32.TryParse(BT, out B) == false) { Console.WriteLine("Не шали, вводи только числа!"); return false; } for (byte i = 0; i < 4; i++)//это я решил сделать отступ в несколько строк { Console.WriteLine(); } return true; } private static bool MathOperation()//производим операцию с числом { char[] NumUs = new char[] { '+', '-', '*', ':' }; Console.WriteLine("Введите один из знаков операций: "); for (byte i = 0; i < NumUs.Length; i++) { Console.Write(NumUs[i]+" "); } Console.WriteLine(); string sign = Console.ReadLine(); switch (sign) { case "+": Console.WriteLine("Ваше число = " + (A + B)); break; case "-": Console.WriteLine("Ваше число = " + (A - B)); break; case "*": Console.WriteLine("Ваше число = " + (A * B)); break; case ":": if (B == 0) Console.WriteLine("Делить на ноль нельзя"); else Console.WriteLine("Ваше число = " + (A / B)); break; default: Console.WriteLine("Не шали, введи один из допустимых знаков операции!"); return false; } return true; } private static bool Close()//завершение работы программы { char answer; Console.WriteLine("Close program? y/n"); while (true) { answer = Console.ReadKey(true).KeyChar; if (answer == 'y') { return true; } else if (answer == 'n') { return false; } } } } }
Content is retrieved from StackExchange API.
Auto-generated by ruso-archive tools.