ВНИМАНИЕ. Следующая статья может показаться бесконечной (и бесконечной), и я не возьму на себя оскорбление, если вы не прочитаете ее целиком. Однако путешествие было важным, так как (спойлер) я очень доволен результатом.

Итак, давайте отправим это шоу в путь. Как я уже сказал, я думаю, что совершил ошибку в первый раз (или во второй раз), просто сосредоточившись на обучении и не уделив некоторое время, сразу после того, как я чему-то научился, чтобы создать что-то простое с ним, в самой Visual Studio. Итак, вместо того, чтобы просто пройти через два урока в заключительном, базовом калькуляторе разделе Условия и циклы (в приложении SoloLearn), давайте просто сделайте это в Visual Studio!

Возвращаясь к тому, как будет работать этот базовый калькулятор, он многократно попросит пользователя ввести два значения, а затем отобразит их сумму, пока пользователь не введет «выход». Вот мои первые мысли:

  • Он говорит неоднократно, что предполагает использование некоторого вида цикла.
  • Пользователь вводит два значения, это будет означать две переменные.
  • Проверка того, является ли первое значение словом «выход», будет важна, чтобы определить, следует ли выходить из программы.
  • Нам понадобится третья переменная, равная сумме двух других.

Хотя моей первой мыслью было бы использовать оператор if, когда я запускал страницу в SoloLearn, она уже говорила использовать цикл do-while (и теперь это приходит мне в голову что эти две вещи на самом деле не являются набором одного или другого). Я предполагаю, что вы могли бы использовать оператор if, но это может быть не самым эффективным решением. Когда я пишу это, мне также приходит в голову, что цикл do-while действительно сочетает в себе как цикл, так и оператор if, поэтому это действительно эффективнее.

ОК…запуск Visual Studio. Прежде чем мы сможем ввести какой-либо код, нам нужно начать новый проект. Я ни в какой форме не являюсь экспертом по Visual Studio, поэтому уверен, что в какой-то момент мне придется обратиться в Google. Тем не менее, давайте просто поговорим о нескольких вещах:

  • Во-первых, вам необходимо скачать и установить Visual Studio здесь: https://visualstudio.microsoft.com/downloads/ (обязательно выберите бесплатную версию Community!) Будьте готовы к эта установка займет какое-то время. То, что вы загружаете, на самом деле просто установщик. Как только начинается фактическая установка, она загружает данные на гиги. Кроме того, когда вас спросят, какие рабочие нагрузки вы хотите установить, я просто выбрал две рабочие нагрузки в верхней части диалогового окна: Разработка универсальной платформы Windows и Разработка рабочего стола .NET.

  • Перед запуском я создал папку, которую хотел использовать в качестве папки проекты. Поскольку я использую Google Диск, я настроил там свой, чтобы все, что я создаю, синхронизировалось с облаком, а также отображалось на нескольких компьютерах, на которых у меня установлено приложение Google Диск.
  • После запуска приложения я сделал две вещи: (1) Щелкните раскрывающееся меню Инструменты и выберите Параметры. На появившейся странице в разделе Окружающая средаОбщие я щелкаю раскрывающееся меню рядом с пунктом Цветовая тема (в разделе Visual Experience) и выберите темный. Это просто то, что мне нравится, но, конечно, не требование.

  • (2) В том же диалоговом окне слева я раскрываю раздел Проекты и решения и выбираю Местоположения. Когда страница появится справа, я нажму на поле с тремя точками (называемое многоточием) и выберу место, которое я установил на первом шаге. Это просто эффективность, которая заставит Visual Studio по умолчанию использовать одно и то же место каждый раз, когда вы сохраняете свою работу.

  • Чтобы начать новый проект, нажмите раскрывающееся меню Файл, наведите курсор на Создать и выберите Проект.

ВОА! Вариантов масса (фактически шаблоны)! Что ж, во-первых, давайте удостоверимся, что Visual C# выбран слева. Это немного сузит выбор до, знаете ли, 22!! Поскольку мы только начинаемначинать, давайте выберем Получить Начало слева. ОК, 2 варианта. Намного лучше!

Мы можем выбрать либо Консольное приложение, либо Настольное приложение. При выборе любого из них справа появляется описание. Выберите Консольное приложение. «Консоль» точно так же, как ключевое слово, которое мы видели раньше, называется Console.WriteLine, и это еще один способ сказать «Консольное окно», то есть это черное окно, которое появляется на экране, когда вы говорите ваш код для печати на экран. Кроме того, когда вы выбираете Настольное приложение, описание справа относится к графическому пользовательскому интерфейсу, чего мы ТОЧНО пока не делаем.

В любом случае, выбрав Консольное приложение, в нижней части диалогового окна рядом с надписью Имя введите basicCalculator (это метод именования которые используют программисты). Обратите внимание, что название решения также было изменено на basicCalculator. Мы собираемся оставить это, но чтобы вы знали, поле Имя относится ко всему проекту, который содержит различные программы (которые могут работать вместе), настройки, ссылки, изображения и т. д. Однако пока оставим ему то же имя и нажмем ОК.

Через несколько секунд (и несколько полей прогресс) вы увидите код на экране. А мы ещё ничего не сделали!! Вверху вы заметите пять операторов using, за которыми следуют несколько слов. Слова после ключевого слова using — это названия библиотек функциональных возможностей. Многое из того, что можно сделать в программе, требует инструкций как это сделать где-то еще. Поскольку эти библиотеки очень большие, они разбиты на подразделы, поэтому вам не нужно загружать все. Итак, в данном случае загружаются следующие библиотеки и подразделы:

  • используя System; — загружает функции верхнего уровня библиотеки с именем System.
  • используя System.Collections.Generic; – загружает функции из раздела Generic, который является подразделом раздела Collections, который является подразделом библиотеки под названием System.

С приведенной выше информацией вы можете догадаться, что происходит с оставшимися тремя строками кода.

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

  • namespace basicCalculator — как упоминалось ранее, пространства имен — это просто заборы вокруг именованных объектов, так что вы можете сказать: «Я говорю о Фидо, стоящем за ЭТИМ». забор» или «Я думаю, что то, что мне нужно, находится за ТАКИМ забором».
  • Программа класса — опять же, как упоминалось ранее, класс — это такжеобласть, которая обычно включает поля данных и методы, определяющие характеристики и поведение. Хотя имя этого класса по умолчанию отображается как Program, его можно переименовать (хотя мы оставим его как Program).
  • static void Main(string[] args) — и, наконец, как упоминалось ранее:
static — This means that the given method or variable is not instance-related, but class-related. It can be accessed without creating the instance of a class.
Void — This means that this particular method will not return any value.
main — This is simply the name of the method. That said, it’s important because a method with the name main is what is searched for by the C# compiler as the starting point for the application.
string args[] — this is the parameter to the main method.

Внутри функции Main написан некоторый код, и поскольку это всего лишь код-заполнитель, мы его удалим.

Итак, давайте создадим несколько переменных:

  • x и установите для него тип данных integer.
  • y и установите для него тип данных integer.
  • sum и установите тип данных integer.

Я написал это внутри фигурных скобок метода Main:

int x;
int y;
int sum;

Затем давайте скажем пользователю (на самом деле спросим), что мы хотим, чтобы он ввел:

Console.WriteLine(“Enter the first value: “);

Теперь мы должны взять число и назначить его в качестве значения переменной с именем x. . Нам также нужно убедиться, что введенное число является числом:

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

Переводить:

  • x — переменная
  • Convert.ToInt32() преобразует ввод пользователя в число (если это не так)
  • Console.Readline() получает запись от пользователя

Я чувствую, что на данный момент я хочу посмотреть, могу ли я ввести значение и убедиться, что оно было присвоено x. Итак, я собираюсь ввести следующую строку, а затем нажать кнопку Пуск с зеленым треугольником, чтобы запустить ее:

Console.WriteLine(x);

Окно выскочило, попросило число, я ввел его, нажал клавишу Enter, и оно исчезло. Если я правильно помню, если вы добавите строку Console.Read, окно консоли останется открытым.

Я добавил его, запустил программу и…..ЭТО РАБОТАЛО!! Хорошо! Написана первая программа! Ну что ж, первая часть первой программы, а все равно настроение хорошее!

(Кстати, снова нажмите клавишу Enter, чтобы закрыть окно консоли.)

Так что я оставлю эти две «тестовые» строки кода, потому что, вероятно, захочу использовать их снова. Теперь я собираюсь добавить еще две строки, чтобы запросить второе число, назначив его переменной y и также преобразовав его в 32-битное число. . Я также собираюсь добавить третью часть, сложив два числа вместе и присвоив это значение переменной с именем sum, например так:

Console.WriteLine(“Enter the second value: “);
y = Convert.ToInt32(Console.ReadLine());
sum = x + y;

Чтобы продолжить тестирование, я добавил Console.WriteLine(y) и Console.WriteLine(sum), а затем запустил программу.

Ааааа….ЭТО СНОВА ЗАРАБОТАЛО!!!

Следующая часть состоит в том, чтобы он запрашивал два числа снова и снова, пока пользователь не введет слово «выход». Поэтому мне нужно добавить цикл и условие для оценки. Как я упоминал ранее, я уже видел код в приложении SoloLearn, поэтому я знаю, что оно хочет, чтобы мы использовали цикл do-while. Это хорошо, и я это сделаю, но сначала я хочу пройтись по своему мыслительному процессу:

  • Когда я вижу необходимость в цикле, я сразу же думаю о том, чтобы иметь счетчик, чтобы я мог сказать: если счетчик равен такому-то числу, выйти из этого цикла.
  • Однако в этом случае (и зная то, что я знаю о том, что они хотят использовать), предложение действительно должно быть таким, пока значение x НЕ равно «выходу», продолжайте с добавлением чисел, показом результата, а затем запросом еще двух чисел. Таким образом, цикл do-while имеет смысл.

Возвращаясь к своим заметкам из Часть 4c, я должен обернуть два запроса чисел, а также их добавление в цикл do-while , нравится:

do {
     Console.WriteLine(“Enter the first value: “);
     x = Convert.ToInt32(Console.ReadLine());
     
     Console.WriteLine(“Enter the second value: “);
     y = Convert.ToInt32(Console.ReadLine());
     sum = x + y;
     Console.WriteLine(x);
     Console.WriteLine(y);
     Console.WriteLine(sum);
     Console.Read();
} while (x != “exit” || y != “exit”);

Да, это не сработало. Это дает мне следующую ошибку:

Оператор ‘!=’ нельзя применять к операндам типа ‘in’ и ‘string’

Если я правильно интерпретирую это, это говорит о том, что я пытаюсь сравнить переменную, имеющую тип данных integer, с переменной, имеющей тип данных string, и вы не можете этого сделать. Что, если я проверю значение перед преобразованием его в целое число?

Поскольку я хочу, чтобы пользователь мог ввести слово «выход», я должен установить тип данных x, чтобы он начинался как строка, поэтому я изменил int x в string x. Затем после Console.WriteLine("Введите первое значение: "); я написал:

x = Console.WriteLine(“Enter the first value: “);
This takes in the value.
if (x == “exit”)
     break;
These last two lines say, if the value of x is exit, break out of this loop.

Однако на данный момент проблема заключается в том, что даже если значение, введенное для x, было целым числом, тип данных x является строка. Поэтому, чтобы добавить его к значению другой переменной (чей тип данных уже установлен на целое число), мне нужно преобразовать его в целое число. Однако при преобразовании мне нужно установить его как значение переменной new, тип данных которой integer.

  • Для согласованности я собираюсь установить тип данных x обратно на integer и инициализировать новую переменную с именем str (для начального значения, полученного от пользователя), и установите его тип данных как string.
  • В результате мне нужно заменить x = Console.ReadLine(); на str = Console.ReadLine();
  • Мне также нужно заменить if (x == «exit») на if (str == «exit»)
  • Если значение strне равно «выходу», мне нужно преобразовать его в целое число (чтобы его можно было добавить ко второму значение, которое будет целым числом), и установите его как значение x. Итак, мне нужно изменить это:
x = Convert.ToInt32(Console.ReadLine());

к этому:

x = Convert.ToInt32(str);

Когда код доходит до конца, я хочу, чтобы он вернулся наверх и снова прошел через цикл, и продолжал идти вверх и снова проходить через цикл. В этом случае оператор if с ключевым словом break вырвет нас из цикла do-while, не условие, которое обычно появляется в круглых скобках после ключевого слова while (например, то, что у меня было изначально, это: while (x != «exit» || y ! = «выход»);

Тем не менее, вам все равно нужно поместить что-то в круглые скобки, чтобы запустить цикл заново. Поэтому я добавлю в конец цикла do-while следующее:

} while (true);

Я также закомментирую две строки о выводе значений x и y на экран.

Теперь, когда я запускаю код, он работает с первого раза, но когда я нажимаю клавишу Enter и ожидаю, что он снова запустится с самого начала, появляется сообщение об ошибке: «Введите строка имеет неправильный формат». и это относится к строке кода, в которой говорится:

x = Convert.ToInt32(str);

Я погуглил ошибку и один ответ на аналогичный вопрос:

…строка, из которой я пытался разобрать целое число, на самом деле не содержит допустимого целого числа.

Сначала я подумал, что то, что я пытался сделать, на самом деле было противоположным, но ошибка все еще актуальна, например:

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

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

Теперь проблема в том, что мне нужно преобразовать целое число обратно в строку, чтобы иметь возможность оценить, является ли исходный ввод словом «выход». Все эти преобразования казались слишком сложными, и, уже увидев код в приложении SoloLearn, я понял, что правильным решением было бы объявить переменную и установить ее тип данных одновременно время, когда я запрашивал у пользователя значение.

Во-первых, я должен удалить четыре объявления переменных вверху. Ниже показана каждая строка кода до (слева) и после (справа) ее изменения:

  • ул = Console.ReadLine(); ›››› string str = Console.ReadLine();
  • х = Convert.ToInt32 (строка); ›››› int x = Convert.ToInt32(str);
  • y = Convert.ToInt32(Console.ReadLine()); ›››› int y = Convert.ToInt32(Console.ReadLine());
  • сумма = х + у; ›››› int sum = x + y;

Это необходимо сделать, потому что каждый раз, когда программа запрашивает у пользователя первое значение, она присваивает это значение переменной str, которую затем можно проверить, равно ли оно "выйти".

После внесения этих изменений и запуска кода я все еще получаю ту же ошибку. Сравнивая код решения в приложении с моим, одно отличие состоит в том, что у меня есть Console.Read();, чтобы сохранить значение на экране (т.е. оставить окно консоли открытым после добавления двух чисел). После комментирования этой строки и повторного запуска кода программа работает успешно.

Мне очень хотелось узнать больше о Console.Read(); поэтому я погуглил. Я думаю, что наиболее подходящим моментом здесь является то, что, поскольку Console.Read(); принимает одиночный символ (в отличие от Console.ReadLine() ; который занимает целую строку), обычно при нажатии одной клавиши окно консоли закрывается. Однако в этом случае цикл do-while вызывает повторный запуск кода внутри этого цикла. Я вижу, где это может быть конфликт, но я до сих пор не уверен, почему показанная ошибка указывает то, что она утверждает.

Во всяком случае, еще одно различие между моим кодом и кодом SoloLearn заключается в том, что вместо Console.WriteLine(); они используют Console.Write(); разница между ними заключается в следующем. что с Console.WriteLine(); когда пользователь вводит значение, оно будет на следующей строке.

С помощью Console.Write(); введенное значение будет в той же строке, что и вопрос.

Имеет смысл, и поэтому я обновил свой код.

Единственное другое различие между моим кодом и кодом SoloLearn заключается в том, что у меня есть:

Console.WriteLine(sum);

…они имеют:

Console.WriteLine(“Result: {0}”, sum);

Хотя я понимаю, что {0} заменяется первым значением переменной sum, я не уверен, зачем вам это нужно, поскольку переменная sum в любом случае имеет только значение 1. Возможно, это просто более эффективный (и, как я видел другие описания, описывающий то, к чему я клоню, более элегантный) способ написания кода для подготовки к будущему использованию. Я бы хотел, чтобы это подтвердилось.

В любом случае, вот мой окончательный, полностью рабочий код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace basicCalculator {
     class Program {
          static void Main(string[] args) {
               do {
                    Console.Write(“Enter the first value (type ‘exit’ to close the app): “);
                    string str = Console.ReadLine();
                    if (str == “exit”)
                         break;
                    int x = Convert.ToInt32(str);
                    Console.Write(“Enter the second value: “);
                    int y = Convert.ToInt32(Console.ReadLine());
                    int sum = x + y;
                    Console.WriteLine(“Total: {0}”,sum);
               } while (true);
          }
     }
}

Должен сказать, что, несмотря на то, что ход моих мыслей (как написано выше) может показаться состоящим из множества остановок и шагов, это действительно первая работающая программа, которую я написал с тех пор, как начал это путешествие. И это довольно интересно.

Если в моем мыслительном процессе есть что-то, что, по вашему мнению, не совсем верно, или вы считаете, что нужно дополнительное объяснение, пожалуйста, дайте мне знать.

Кроме того, вот ссылка на предыдущую статью. Изучение кода — Часть 4d: Условные операторы и циклы — Break & Continue, а также логические и условные операторы.