Создание проекта консольного приложения С++Create a C++ console app project

Обычной отправной точкой для программиста на C++ является приложение "Hello World",The usual starting point for a C++ programmer is a "Hello, world!" выполняемое в командной строке.application that runs on the command line. Вот что вы создадите в Visual Studio в этой статье, и затем мы перейдем к более сложной задаче: приложению калькулятора.That's what you'll create in Visual Studio in this article, and then we'll move on to something more challenging: a calculator app.

Предварительные требованияPrerequisites

  • Установите и запустите на своем компьютере Visual Studio с рабочей нагрузкой Разработка классических приложений на C++ .Have Visual Studio with the Desktop development with C++ workload installed and running on your computer. Если установка еще не выполнена, см. статью Установка поддержки C++ в Visual Studio.If it's not installed yet, see Install C++ support in Visual Studio.

Создание проекта приложенияCreate your app project

Visual Studio использует проекты, чтобы упорядочить код для приложения, и решения, чтобы упорядочить проекты.Visual Studio uses projects to organize the code for an app, and solutions to organize your projects. Проект содержит все параметры, конфигурации и правила, используемые для сборки приложения.A project contains all the options, configurations, and rules used to build your apps. Кроме того, он управляет связью между всеми файлами проекта и любыми внешними файлами.It also manages the relationship between all the project's files and any external files. Чтобы создать приложение, сначала создайте проект и решение.To create your app, first, you'll create a new project and solution.

  1. Если вы только запустили Visual Studio, вы увидите диалоговое окно Visual Studio 2019.If you've just started Visual Studio, you'll see the Visual Studio 2019 dialog box. Выберите Создать проект, чтобы приступить к работе.Choose Create a new project to get started.

    Исходное диалоговое окно Visual Studio 2019The Visual Studio 2019 initial dialog

    Или в строке меню Visual Studio последовательно выберите Файл > Создать > Проект.Otherwise, on the menubar in Visual Studio, choose File > New > Project. Откроется окно Создание проекта.The Create a new project window opens.

  2. В списке шаблонов проектов выберите Консольное приложение и нажмите Далее.In the list of project templates, choose Console App, then choose Next.

    Выбор шаблона консольного приложенияChoose the Console App template

    Важно!

    Убедитесь, что вы выбрали версию C++ для шаблона Консольное приложение.Make sure you choose the C++ version of the Console App template. Этот шаблон содержит теги C++ , Windows и Консоль, а в углу значка есть "++".It has the C++, Windows, and Console tags, and the icon has "++" in the corner.

  3. В диалоговом окне Настроить новый проект выберите поле ввода Имя проекта, назовите новый проект CalculatorTutorial и нажмите Создать.In the Configure your new project dialog box, select the Project name edit box, name your new project CalculatorTutorial, then choose Create.

    ![Присвоение имени проекта в диалоговом окне "Настроить новый проект"](./media/calc-vs2019-name-your-project.png "Присвоение имени проекта в диалоговом окне "Настроить новый проект"")Name your project in the Configure your new project dialog

    Будет создано пустое консольное приложение Windows на C++.An empty C++ Windows console application gets created. Консольные приложения используют окно консоли Windows для отображения выходных данных и приема данных, вводимых пользователем.Console applications use a Windows console window to display output and accept user input. В Visual Studio откроется окно редактора с созданным кодом.In Visual Studio, an editor window opens and shows the generated code:

    // CalculatorTutorial.cpp : This file contains the 'main' function. Program execution begins and ends there.
    //
    
    #include <iostream>
    
    int main()
    {
        std::cout << "Hello World!\n";
    }
    
    // Run program: Ctrl + F5 or Debug > Start Without Debugging menu
    // Debug program: F5 or Debug > Start Debugging menu
    
    // Tips for Getting Started:
    //   1. Use the Solution Explorer window to add/manage files
    //   2. Use the Team Explorer window to connect to source control
    //   3. Use the Output window to see build output and other messages
    //   4. Use the Error List window to view errors
    //   5. Go to Project > Add New Item to create new code files, or Project > Add Existing Item to add existing code files to the project
    //   6. In the future, to open this project again, go to File > Open > Project and select the .sln file
    

Проверка сборки и выполнения нового приложенияVerify that your new app builds and runs

Шаблон для нового консольного приложения Windows создает простое приложение Hello World на C++.The template for a new Windows console application creates a simple C++ "Hello World" app. На этом этапе вы можете видеть, как Visual Studio создает и запускает созданные вами приложения прямо из интегрированной среды разработки.At this point, you can see how Visual Studio builds and runs the apps you create right from the IDE.

  1. Для сборки проекта выберите в меню Сборка пункт Собрать решение.To build your project, choose Build Solution from the Build menu. Окно Вывод отображает результаты процесса сборки.The Output window shows the results of the build process.

    Сборка проектаBuild the project

  2. Чтобы запустить этот код, в строке меню выберите Отладка и Запуск без отладки.To run the code, on the menu bar, choose Debug, Start without debugging.

    Запуск проектаStart the project

    Открывается окно консоли, и запускается ваше приложение.A console window opens and then runs your app. При запуске консольного приложения в Visual Studio система выполняет код, а затем выводит сообщение "Нажмите любую клавишу, чтобы закрыть это окно.When you start a console app in Visual Studio, it runs your code, then prints "Press any key to close this window . .. .",." чтобы вы могли просмотреть выходные данные.to give you a chance to see the output. Поздравляем!Congratulations! Вы создали свое первое консольное приложение "Hello World"You've created your first "Hello, world!" в Visual Studio!console app in Visual Studio!

  3. Нажмите любую клавишу, чтобы закрыть окно консоли и вернуться в редактор Visual Studio.Press a key to dismiss the console window and return to Visual Studio.

Теперь у вас есть средства для сборки и запуска приложения после каждого изменения, чтобы убедиться, что код по-прежнему работает должным образом.You now have the tools to build and run your app after every change, to verify that the code still works as you expect. Позже мы покажем, как выполнить его отладку при неправильной работе.Later, we'll show you how to debug it if it doesn't.

Изменение кодаEdit the code

Теперь давайте превратим код в этом шаблоне в приложение калькулятора.Now let's turn the code in this template into a calculator app.

  1. В файле CalculatorTutorial.cpp измените код таким образом, чтобы он соответствовал этому примеру:In the CalculatorTutorial.cpp file, edit the code to match this example:

    // CalculatorTutorial.cpp : This file contains the 'main' function. Program execution begins and ends there.
    //
    
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        cout << "Calculator Console Application" << endl << endl;
        cout << "Please enter the operation to perform. Format: a+b | a-b | a*b | a/b"
            << endl;
        return 0;
    }
    
    // Run program: Ctrl + F5 or Debug > Start Without Debugging menu
    // Debug program: F5 or Debug > Start Debugging menu
    // Tips for Getting Started:
    //   1. Use the Solution Explorer window to add/manage files
    //   2. Use the Team Explorer window to connect to source control
    //   3. Use the Output window to see build output and other messages
    //   4. Use the Error List window to view errors
    //   5. Go to Project > Add New Item to create new code files, or Project > Add Existing Item to add existing code files to the project
    //   6. In the future, to open this project again, go to File > Open > Project and select the .sln file
    

    Пояснения к коду:Understanding the code:

    • Операторы #include позволяют ссылаться на код, расположенный в других файлах.The #include statements allow you to reference code located in other files. Иногда вы можете увидеть имя файла, заключенное в угловые скобки ( <> ), а в других случаях — в кавычки ( " " ).Sometimes, you may see a filename surrounded by angle brackets (<>); other times, it's surrounded by quotes (" "). В общем случае угловые скобки используются при ссылке на стандартную библиотеку C++, а кавычки — для других файлов.In general, angle brackets are used when referencing the C++ Standard Library, while quotes are used for other files.
    • Строка using namespace std; сообщает компилятору ожидать данные от стандартной библиотеки C++ для использования в этом файле.The using namespace std; line tells the compiler to expect stuff from the C++ Standard Library to be used in this file. Без нее каждое ключевое слово из этой библиотеки пришлось бы предварять элементом std::, чтобы обозначить его область.Without this line, each keyword from the library would have to be preceded with a std::, to denote its scope. Например, без этой строки каждую ссылку на cout потребовалось бы записывать в виде std::cout.For instance, without that line, each reference to cout would have to be written as std::cout. Оператор using добавляется, чтобы сделать код более чистым и понятным.The using statement is added to make the code look more clean.
    • Ключевое слово cout используется для вывода сведений в стандартный поток вывода в C++.The cout keyword is used to print to standard output in C++. Оператор << указывает компилятору отправить все содержимое справа от него в стандартный поток вывода.The << operator tells the compiler to send whatever is to the right of it to the standard output.
    • Ключевое слово endl аналогично клавише ВВОД — оно завершает строку и переводит курсор на следующую строку.The endl keyword is like the Enter key; it ends the line and moves the cursor to the next line. Для выполнения той же задачи рекомендуется помещать \n внутрь строки (заключенной в ""), так как endl всегда освобождает буфер и может негативно повлиять на производительность программы, но из-за того, что это очень небольшое приложение, в нем используется endl для улучшения удобочитаемости.It is a better practice to put a \n inside the string (contained by "") to do the same thing, as endl always flushes the buffer and can hurt the performance of the program, but since this is a very small app, endl is used instead for better readability.
    • Все операторы C++ должны заканчиваться точкой с запятой, а все приложения C++ — содержать функцию main().All C++ statements must end with semicolons and all C++ applications must contain a main() function. Именно ее программа выполняет при запуске.This function is what the program runs at the start. Для использования весь код должен быть доступен из main().All code must be accessible from main() in order to be used.
  2. Чтобы сохранить файл, нажмите клавиши CTRL+S или выберите элемент Сохранить в верхней части интегрированной среды разработки, выглядящий как значок гибкого диска на панели инструментов в строке меню.To save the file, enter Ctrl+S, or choose the Save icon near the top of the IDE, the floppy disk icon in the toolbar under the menu bar.

  3. Чтобы запустить приложение, нажмите клавиши CTRL+F5 или перейдите в меню Отладка и выберите Запуск без отладки.To run the application, press Ctrl+F5 or go to the Debug menu and choose Start Without Debugging. Должно отобразится окно консоли с текстом, указанным в коде.You should see a console window appear that displays the text specified in the code.

  4. По завершении закройте окно консоли.Close the console window when you're done.

Добавление кода для выполнения математических операцийAdd code to do some math

Пора добавить математическую логику.It's time to add some math logic.

Добавление класса CalculatorTo add a Calculator class

  1. В меню Проект выберите команду Добавить класс.Go to the Project menu and choose Add Class. В поле ввода Имя класса введите Calculator.In the Class Name edit box, enter Calculator. Нажмите кнопку ОК.Choose OK. В проект будут добавлены два новых файла.Two new files get added to your project. Чтобы сохранить сразу все измененные файлы, нажмите клавиши CTRL+SHIFT+S.To save all your changed files at once, press Ctrl+Shift+S. Это сочетание клавиш для команды Файл > Сохранить все.It's a keyboard shortcut for File > Save All. Кроме того, есть кнопка Сохранить все на панели инструментов. Она имеет вид значка с двумя дискетами рядом с кнопкой Сохранить.There's also a toolbar button for Save All, an icon of two floppy disks, found beside the Save button. В общем случае рекомендуется регулярно нажимать кнопку Сохранить все, чтобы не пропустить никакие файлы при сохранении.In general, it's good practice to do Save All frequently, so you don't miss any files when you save.

    Создание класса CalculatorCreate the Calculator class

    Класс подобен схеме для объекта, который выполняет какие-либо действия.A class is like a blueprint for an object that does something. В этом случае мы определяем калькулятор и особенности его работы.In this case, we define a calculator and how it should work. Использованный ранее мастер Добавить класс создал файлы H и CPP, имя которых совпадает с именем класса.The Add Class wizard you used above created .h and .cpp files that have the same name as the class. Вы можете просмотреть полный список файлов проекта в окне обозревателя решений, отображаемом в боковой части окна IDE.You can see a full list of your project files in the Solution Explorer window, visible on the side of the IDE. Если окно не отображается, его можно открыть из строки меню, выбрав Вид > Обозреватель решений.If the window isn't visible, you can open it from the menu bar: choose View > Solution Explorer.

    Обозреватель решенийSolution Explorer

    Теперь у вас в редакторе должно быть открыто три вкладки: CalculatorTutorial.cpp, Calculator.h и Calculator.cpp.You should now have three tabs open in the editor: CalculatorTutorial.cpp, Calculator.h, and Calculator.cpp. Если вы случайно закроете одну из них, то можете повторно открыть эту вкладку, дважды щелкнув ее в окне обозревателя решений.If you accidentally close one of them, you can reopen it by double-clicking it in the Solution Explorer window.

  2. На вкладке Calculator.h удалите созданные строки Calculator(); и ~Calculator();, так как здесь они вам не понадобятся.In Calculator.h, remove the Calculator(); and ~Calculator(); lines that were generated, since you won't need them here. Затем добавьте следующую строку кода, чтобы файл выглядел следующим образом:Next, add the following line of code so the file now looks like this:

    #pragma once
    class Calculator
    {
    public:
        double Calculate(double x, char oper, double y);
    };
    

    Пояснения к кодуUnderstanding the code

    • Добавленная строка объявляет новую функцию Calculate, которую мы используем для выполнения математических операций, таких как сложение, вычитание, умножение и деление.The line you added declares a new function called Calculate, which we'll use to run math operations for addition, subtraction, multiplication, and division.
    • Код C++ упорядочен по файлам заголовка (H) и исходным файлам (CPP).C++ code is organized into header (.h) files and source (.cpp) files. Различные компиляторы поддерживают несколько других расширений имени файла, но это основные, о которых вам нужно знать.Several other file extensions are supported by various compilers, but these are the main ones to know about. Функции и переменные обычно объявляются, то есть получают имя и тип, в файлах заголовка, и реализуются, то есть получают определение, в исходных файлах.Functions and variables are normally declared, that is, given a name and a type, in header files, and implemented, or given a definition, in source files. Чтобы обратиться к коду, определенному в другом файле, вы можете использовать #include "filename.h", где "filename.h" — это имя файла, объявляющего переменные или функции, которые требуется использовать.To access code defined in another file, you can use #include "filename.h", where 'filename.h' is the name of the file that declares the variables or functions you want to use.
    • Две удаленные строки объявляли конструктор и деструктор для класса.The two lines you deleted declared a constructor and destructor for the class. Для такого простого класса компилятор создает их автоматически, а их использование выходит за рамки данного руководства.For a simple class like this one, the compiler creates them for you, and their uses are beyond the scope of this tutorial.
    • Рекомендуется упорядочивать код по различным файлам в зависимости от его назначения, чтобы позднее было проще найти нужный код.It's good practice to organize your code into different files based on what it does, so it's easy to find the code you need later. В данном случае мы определяем класс Calculator отдельно от файла, содержащего функцию main(), но планируем ссылаться на класс Calculator в main().In our case, we define the Calculator class separately from the file containing the main() function, but we plan to reference the Calculator class in main().
  3. Под Calculate появится зеленая волнистая линия.You'll see a green squiggle appear under Calculate. Это вызвано тем, что мы еще не определили функцию Calculate в CPP-файле.It's because we haven't defined the Calculate function in the .cpp file. Наведите указатель на это слово, щелкните по появившейся лампочке (в данном случае отвертке) и выберите Создать определение "Calculate" в Calculator.cpp.Hover over the word, click the lightbulb (in this case, a screwdriver) that pops up, and choose Create definition of 'Calculate' in Calculator.cpp.

    Создание определения для CalculateCreate definition of Calculate

    Отображается всплывающее окно, сообщающее об изменении кода, внесенном в другом файле.A pop-up appears that gives you a peek of the code change that was made in the other file. Код был добавлен в Calculator.cpp.The code was added to Calculator.cpp.

    Всплывающее окно с определением CalculatePop-up with definition of Calculate

    Сейчас он возвращает просто 0.0.Currently, it just returns 0.0. Давайте изменим это.Let's change that. Нажмите клавишу ESC, чтобы закрыть всплывающее окно.Press Esc to close the pop-up.

  4. Переключитесь на файл Calculator.cpp в окне редактора.Switch to the Calculator.cpp file in the editor window. Удалите разделы Calculator() и ~Calculator() (как сделали в H-файле) и добавьте в Calculate() следующий код:Remove the Calculator() and ~Calculator() sections (as you did in the .h file) and add the following code to Calculate():

    #include "Calculator.h"
    
    double Calculator::Calculate(double x, char oper, double y)
    {
        switch(oper)
        {
            case '+':
                return x + y;
            case '-':
                return x - y;
            case '*':
                return x * y;
            case '/':
                return x / y;
            default:
                return 0.0;
        }
    }
    

    Пояснения к кодуUnderstanding the code

    • Функция Calculate использует число, оператор и второе число, а затем выполняет запрошенную операцию над этими числами.The function Calculate consumes a number, an operator, and a second number, then performs the requested operation on the numbers.
    • Оператор switch проверяет, какой оператор был предоставлен, и выполняет только вариант (case), соответствующий этой операции.The switch statement checks which operator was provided, and only executes the case corresponding to that operation. Вариант default: является резервным на тот случай, если пользователь вводит неприемлемый оператор, чтобы программа не прервала работу.The default: case is a fallback in case the user types an operator that isn't accepted, so the program doesn't break. В общем случае лучше обрабатывать некорректный ввод данных пользователем более элегантным способом, но это выходит за рамки данного руководства.In general, it's best to handle invalid user input in a more elegant way, but this is beyond the scope of this tutorial.
    • Ключевое слово double обозначает тип числа, который поддерживает десятичные числа.The double keyword denotes a type of number that supports decimals. Таким образом, калькулятор может выполнять математические операции с десятичными и целыми числами.This way, the calculator can handle both decimal math and integer math. Функция Calculate должна всегда возвращать такое число из-за элемента double в самом начале кода (обозначает тип возвращаемого значения функции), поэтому возвращается 0.0 даже в случае default.The Calculate function is required to always return such a number due to the double at the very start of the code (this denotes the function's return type), which is why we return 0.0 even in the default case.
    • H-файл объявляет функцию prototype, которая заранее сообщает компилятору, какой параметр требуется и какой тип возвращаемого значения следует ожидать.The .h file declares the function prototype, which tells the compiler upfront what parameters it requires, and what return type to expect from it. CPP-файл содержит все сведения о реализации этой функции.The .cpp file has all the implementation details of the function.

Если построить и запустить код еще раз на этом этапе, он по-прежнему завершит работу после запроса операции для выполнения.If you build and run the code again at this point, it will still exit after asking which operation to perform. Далее вам нужно изменить функцию main для выполнения вычислений.Next, you'll modify the main function to do some calculations.

Вызов функций-членов класса CalculatorTo call the Calculator class member functions

  1. Теперь давайте изменим функцию main в CalculatorTutorial.cpp:Now let's update the main function in CalculatorTutorial.cpp:

    // CalculatorTutorial.cpp : This file contains the 'main' function. Program execution begins and ends there.
    //
    
    #include <iostream>
    #include "Calculator.h"
    
    using namespace std;
    
    int main()
    {
        double x = 0.0;
        double y = 0.0;
        double result = 0.0;
        char oper = '+';
    
        cout << "Calculator Console Application" << endl << endl;
        cout << "Please enter the operation to perform. Format: a+b | a-b | a*b | a/b"
             << endl;
    
        Calculator c;
        while (true)
        {
            cin >> x >> oper >> y;
            result = c.Calculate(x, oper, y);
            cout << "Result is: " << result << endl;
        }
    
        return 0;
    }
    

    Пояснения к кодуUnderstanding the code

    • Так как программы C++ всегда запускаются с функции main(), нам нужно вызвать из нее другой, для чего нужен оператор #include.Since C++ programs always start at the main() function, we need to call our other code from there, so a #include statement is needed.
    • Объявлены начальные переменные x, y, oper и result для хранения, соответственно, первого числа, второго числа, оператора и окончательного результата.Some initial variables x, y, oper, and result are declared to store the first number, second number, operator, and final result, respectively. Рекомендуется всегда присваивать им некоторые начальные значения, чтобы избежать неопределенного поведения. Это мы здесь и делаем.It is always good practice to give them some initial values to avoid undefined behavior, which is what is done here.
    • Строка Calculator c; объявляет объект "c" в качестве экземпляра класса Calculator.The Calculator c; line declares an object named 'c' as an instance of the Calculator class. Сам класс является лишь схемой для описания работы калькуляторов, а объект — это конкретный калькулятор, который выполняет вычисления.The class itself is just a blueprint for how calculators work; the object is the specific calculator that does the math.
    • Оператор while (true) является циклом.The while (true) statement is a loop. Код внутри этого цикла продолжает выполняться снова и снова, пока выполняется условие в ().The code inside the loop continues to execute over and over again as long as the condition inside the () holds true. Так как условие просто указано как true, оно всегда выполняется, поэтому цикл выполняется бесконечно.Since the condition is simply listed as true, it's always true, so the loop runs forever. Чтобы закрыть программу, пользователю нужно вручную закрыть окно консоли.To close the program, the user must manually close the console window. В противном случае программа будет постоянно ожидать новые входные данные.Otherwise, the program always waits for new input.
    • Ключевое слово cin используется для получения входных данных от пользователя.The cin keyword is used to accept input from the user. Этот входной поток способен обработать строку текста, введенного в окне консоли, и поместить ее внутрь каждой из перечисленных переменных в указанном порядке, при условии, что введенные пользователем данные соответствуют требуемой спецификации.This input stream is smart enough to process a line of text entered in the console window and place it inside each of the variables listed, in order, assuming the user input matches the required specification. Вы можете изменить эту строку, чтобы принять другие типы входных данных, например, больше двух чисел, однако для этого также потребуется изменить функцию Calculate().You can modify this line to accept different types of input, for instance, more than two numbers, though the Calculate() function would also need to be updated to handle this.
    • Выражение c.Calculate(x, oper, y); вызывает определенную ранее функцию Calculate и предоставляет введенные входные значения.The c.Calculate(x, oper, y); expression calls the Calculate function defined earlier, and supplies the entered input values. Затем она возвращает число, сохраняемое в result.The function then returns a number that gets stored in result.
    • Наконец, в консоль выводится result, благодаря чему пользователь видит результат вычисления.Finally, result is printed to the console, so the user sees the result of the calculation.

Повторная сборка и проверка кодаBuild and test the code again

Пришло время снова протестировать программу еще раз, чтобы убедиться в ее правильной работе.Now it's time to test the program again to make sure everything works properly.

  1. Нажмите клавиши CTRL+F5, чтобы перестроить и запустить приложение.Press Ctrl+F5 to rebuild and start the app.

  2. Введите 5 + 5 и нажмите клавишу ВВОД.Enter 5 + 5, and press Enter. Убедитесь, что выводится результат 10.Verify that the result is 10.

    Результат сложения 5 + 5The result of 5 + 5

Отладка приложенияDebug the app

Так как пользователь может ввести в окне консоли что угодно, нужно убедиться, что калькулятор обрабатывает некоторые входные данные правильно.Since the user is free to type anything into the console window, let's make sure the calculator handles some input as expected. Вместо запуска программы давайте выполним ее отладку, чтобы можно было проверить ее выполнение шаг за шагом.Instead of running the program, let's debug it instead, so we can inspect what it's doing in detail, step-by-step.

Запуск приложения в отладчикеTo run the app in the debugger

  1. Установите точку останова на строке result = c.Calculate(x, oper, y);, сразу после запроса входных данных у пользователя.Set a breakpoint on the result = c.Calculate(x, oper, y); line, just after the user was asked for input. Чтобы задать точку останова, щелкните рядом со строкой серую вертикальную панель, идущую вдоль левой части окна редактора.To set the breakpoint, click next to the line in the gray vertical bar along the left edge of the editor window. Появится красная точка.A red dot appears.

    Установка точки остановаSet a breakpoint

    Теперь при отладке программа всегда приостанавливает выполнение на этой строке.Now when we debug the program, it always pauses execution at that line. Мы уже имеем примерное представление о том, что в простых случаях программа работает.We already have a rough idea that the program works for simple cases. Так как нам не нужно приостанавливать выполнение при каждом запуске, создадим условную точку останова.Since we don't want to pause execution every time, let's make the breakpoint conditional.

  2. Щелкните правой кнопкой мыши красную точку, обозначающую точку останова, и выберите команду Условия.Right-click the red dot that represents the breakpoint, and choose Conditions. В поле ввода для условия введите (y == 0) && (oper == '/').In the edit box for the condition, enter (y == 0) && (oper == '/'). По завершении операции нажмите кнопку Закрыть.Choose the Close button when you're done. Условия сохранятся автоматически.The condition is saved automatically.

    Установка условной точки остановаSet a conditional breakpoint

    Теперь выполнение приостанавливается в точке останова, в частности при попытке деления на 0.Now we pause execution at the breakpoint specifically if a division by 0 is attempted.

  3. Чтобы отладить программу, нажмите клавишу F5 или выберите Локальный отладчик Windows — кнопку панели инструментов со значком зеленой стрелки.To debug the program, press F5, or choose the Local Windows Debugger toolbar button that has the green arrow icon. Если ввести в консольном приложении нечто вроде "5 - 0", программа работает как обычно и продолжает выполнение.In your console app, if you enter something like "5 - 0", the program behaves normally and keeps running. Но если ввести "10 / 0", она приостанавливает выполнение в точке останова.However, if you type "10 / 0", it pauses at the breakpoint. Вы можете ввести любое число пробелов между оператором и числами; функция cin достаточно интеллектуальна для того, чтобы правильно проанализировать входные данные.You can even put any number of spaces between the operator and numbers: cin is smart enough to parse the input appropriately.

    Приостановка на условной точке остановаPause at the conditional breakpoint

Полезные окна в отладчикеUseful windows in the debugger

Каждый раз при отладке кода вы можете заметить, что появляется несколько новых окон.Whenever you debug your code, you may notice that some new windows appear. Они могут оказаться полезными в процессе отладки.These windows can assist your debugging experience. Давайте рассмотрим окно Видимые.Take a look at the Autos window. Окно Видимые содержит текущие значения переменных, используемых по меньшей мере за три строки перед текущей строкой.The Autos window shows you the current values of variables used at least three lines before and up to the current line. Чтобы просмотреть все переменные из этой функции, переключитесь в окно Локальные.To see all of the variables from that function, switch to the Locals window. Вы можете изменять значения этих переменных во время отладки, чтобы оценить их влияние на программу.You can actually modify the values of these variables while debugging, to see what effect they would have on the program. В данном случае мы оставим их без изменений.In this case, we'll leave them alone.

Окно ЛокальныеThe Locals window

Кроме того, вы можете просто навести указатель на переменные в самом коде, чтобы просмотреть их текущие значения на участке, где приостановлено выполнение.You can also just hover over variables in the code itself to see their current values where the execution is currently paused. Сначала щелкните окно редактора, чтобы сделать его активным.Make sure the editor window is in focus by clicking on it first.

Наведите указатель мыши, чтобы просмотреть текущие значения переменныхHover to view current variable values

Продолжение отладкиTo continue debugging

  1. Желтая линия слева показывает текущую точку выполнения.The yellow line on the left shows the current point of execution. Текущая строка вызывает Calculate, поэтому нажмите клавишу F11, чтобы выполнить Шаг с заходом для этой функции.The current line calls Calculate, so press F11 to Step Into the function. Вы переходите в тело функции Calculate.You'll find yourself in the body of the Calculate function. Обдуманно применяйте функцию Шаг с заходом, чтобы не терять время из-за чрезмерного ее использования.Be careful with Step Into; if you do it too much, you may waste a lot of time. С помощью функции анализируется любой код, используемый в текущей строке, включая стандартные функции библиотеки.It goes into any code you use on the line you are on, including standard library functions.

  2. Теперь, когда точка выполнения находится в начале функции Calculate, нажмите клавишу F10 для перехода на следующую строку в рамках выполнения программы.Now that the point of execution is at the start of the Calculate function, press F10 to move to the next line in the program's execution. При нажатии клавиши F10 активируется функция Шаг с обходом.F10 is also known as Step Over. Шаг с обходом можно использовать для перемещения по строкам, не вдаваясь в подробности того, что происходит в каждой части строки.You can use Step Over to move from line to line, without delving into the details of what is occurring in each part of the line. В общем случае следует использовать Шаг с обходом, а не Шаг с заходом, если только вы не хотите подробно изучить код, вызываемый из другого расположения (как в случае с переходом к телу функции Calculate).In general you should use Step Over instead of Step Into, unless you want to dive more deeply into code that is being called from elsewhere (as you did to reach the body of Calculate).

  3. Продолжайте использовать клавишу F10, чтобы выполнять Шаг с обходом для каждой строки, пока не вернетесь к функции main() в другом файле, и остановитесь на строке cout.Continue using F10 to Step Over each line until you get back to the main() function in the other file, and stop on the cout line.

    Похоже, программа работает правильно — принимает первое число и делит его на второе.It looks like the program is doing what is expected: it takes the first number, and divides it by the second. В строке cout наведите указатель мыши на переменную result или взгляните на result в окне Видимые.On the cout line, hover over the result variable or take a look at result in the Autos window. Соответствующее значение отображается как inf. Это неправильное поведение, и нужно его скорректировать.You'll see its value is listed as "inf", which doesn't look right, so let's fix it. В строке cout просто выводится любое значение, хранящееся в result. Поэтому при продвижении еще на один шаг с помощью клавиши F10 в окне консоли отображается следующее:The cout line just outputs whatever value is stored in result, so when you step one more line forward using F10, the console window displays:

    Результат деления на нольThe result of divide by zero

    Причина такого результата в том, что деление на ноль является неопределенным, поэтому у программы нет числового ответа на запрошенную операцию.This result happens because division by zero is undefined, so the program doesn't have a numerical answer to the requested operation.

Исправление ошибки деления на нольTo fix the "divide by zero" error

Давайте обеспечим корректную обработку деления на ноль, чтобы пользователь мог осознать проблему.Let's handle division by zero more gracefully, so a user can understand the problem.

  1. Внесите следующие изменения в CalculatorTutorial.cpp.Make the following changes in CalculatorTutorial.cpp. (Прерывать выполнение программы при редактировании не требуется благодаря функции отладчика Изменить и продолжить):(You can leave the program running as you edit, thanks to a debugger feature called Edit and Continue):

    // CalculatorTutorial.cpp : This file contains the 'main' function. Program execution begins and ends there.
    //
    
    #include <iostream>
    #include "Calculator.h"
    
    using namespace std;
    
    int main()
    {
        double x = 0.0;
        double y = 0.0;
        double result = 0.0;
        char oper = '+';
    
        cout << "Calculator Console Application" << endl << endl;
        cout << "Please enter the operation to perform. Format: a+b | a-b | a*b | a/b" << endl;
    
        Calculator c;
        while (true)
        {
            cin  >> x  >> oper  >> y;
            if (oper == '/' && y == 0)
            {
                cout << "Division by 0 exception" << endl;
                continue;
            }
            else
            {
                result = c.Calculate(x, oper, y);
            }
            cout << "Result is: " << result << endl;
        }
    
        return 0;
    }
    
  2. Теперь нажмите клавишу F5 один раз.Now press F5 once. При этом выполнение программы продолжается вплоть до приостановки для запроса данных, вводимых пользователем.Program execution continues all the way until it has to pause to ask for user input. Снова введите 10 / 0.Enter 10 / 0 again. Теперь выводится более информативное сообщение.Now, a more helpful message is printed. У пользователя запрашиваются дополнительные входные данные, и программа продолжает выполнение в обычном режиме.The user is asked for more input, and the program continues executing normally.

    Окончательный результат после внесения измененийThe final result after changes

    Примечание

    При редактировании кода в режиме отладки существует риск того, что код устареет.When you edit code while in debugging mode, there is a risk of code becoming stale. Это происходит, когда отладчик продолжает выполнять старый код, не учитывающий внесенные вами изменения.This happens when the debugger is still running your old code, and has not yet updated it with your changes. В подобной ситуации отладчик выводит диалоговое окно с соответствующим сообщением.The debugger pops up a dialog to inform you when this happens. В некоторых случаях может потребоваться нажать клавишу F5, чтобы обновить выполняемый код.Sometimes, you may need to press F5 to refresh the code being executed. В частности, если вы вносите изменения внутри функции, когда точка выполнения находится внутри этой же функции, вам потребуется выполнить шаг с выходом из функции, а затем вернуться в нее, чтобы получить обновленный код.In particular, if you make a change inside a function while the point of execution is inside that function, you'll need to step out of the function, then back into it again to get the updated code. Если по какой-либо причине это не работает и вы видите сообщение об ошибке, можно остановить отладку, щелкнув красный квадрат на панели инструментов под меню в верхней части интегрированной среды разработки, а затем перезапустить отладку, нажав клавишу F5 или выбрав зеленую стрелку "воспроизведения" рядом с кнопкой остановки на панели инструментов.If that doesn't work for some reason and you see an error message, you can stop debugging by clicking on the red square in the toolbar under the menus at the top of the IDE, then start debugging again by entering F5 or by choosing the green "play" arrow beside the stop button on the toolbar.

    Пояснения по сочетаниям клавиш для выполнения и отладкиUnderstanding the Run and Debug shortcuts

    • Клавиша F5 (или команда Отладка > Запустить отладку) запускает сеанс отладки, если он еще не активен, и выполняет программу до тех пор, пока не будет встречена точка останова либо программе не потребуются вводимые пользователем данные.F5 (or Debug > Start Debugging) starts a debugging session if one isn't already active, and runs the program until a breakpoint is hit or the program needs user input. Если вводимые пользователем данные не требуются и точка останова отсутствует, программа завершает работу, а окно консоли автоматически закрывается после завершения выполнения программы.If no user input is needed and no breakpoint is available to hit, the program terminates and the console window closes itself when the program finishes running. Если вы выполняете программу уровня "Hello World", используйте сочетание клавиш CTRL+F5 или задайте точку останова перед нажатием клавиши F5, чтобы окно оставалось открытым.If you have something like a "Hello World" program to run, use Ctrl+F5 or set a breakpoint before you enter F5 to keep the window open.
    • Сочетание клавиш CTRL+F5 (или команда Отладка > Запуск без отладки) запускает приложение без перехода в режим отладки.Ctrl+F5 (or Debug > Start Without Debugging) runs the application without going into debug mode. Это немного быстрее отладки, а окно консоли остается открытым после завершения выполнения программы.This is slightly faster than debugging, and the console window stays open after the program finishes executing.
    • Клавиша F10 (соответствующая возможности Шаг с обходом) позволяет выполнять построчную итерацию по коду, а также визуализировать выполнение кода и значения переменных на каждом шаге выполнения.F10 (known as Step Over) lets you iterate through code, line-by-line, and visualize how the code is run and what variable values are at each step of execution.
    • Клавиша F11 (соответствующая возможности Шаг с заходом) работает аналогично возможности Шаг с обходом, за исключением того, что заходит в любые функции, вызываемые в строке выполнения.F11 (known as Step Into) works similarly to Step Over, except it steps into any functions called on the line of execution. Например, если в выполняемой строке вызывается функция, при нажатии клавиши F11 указатель перемещается в тело функции, чтобы вы могли проследить выполнение кода функции, прежде чем вернуться на исходную строку.For example, if the line being executed calls a function, pressing F11 moves the pointer into the body of the function, so you can follow the function's code being run before coming back to the line you started at. При нажатии клавиши F10 выполняется шаг с обходом по вызову функции и простой переход на следующую строку. Вызов функции все равно выполняется, но программа не приостанавливается, чтобы показать вам, что именно она делает.Pressing F10 steps over the function call and just moves to the next line; the function call still happens, but the program doesn't pause to show you what it's doing.

Закрытие приложенияClose the app

  • Если оно все еще выполняется, закройте окно консоли для приложения калькулятора.If it's still running, close the console window for the calculator app.

Готовое приложениеThe finished app

Поздравляем!Congratulations! Вы завершили написание кода для приложения калькулятора, а также выполнили его сборку и отладку в Visual Studio.You've completed the code for the calculator app, and built and debugged it in Visual Studio.

Следующие шагиNext steps

Дополнительные сведения о Visual Studio для C++Learn more about Visual Studio for C++

Обычной отправной точкой для программиста на C++ является приложение "Hello World",The usual starting point for a C++ programmer is a "Hello, world!" выполняемое в командной строке.application that runs on the command line. Вот что вы создадите в Visual Studio в этой статье, и затем мы перейдем к более сложной задаче: приложению калькулятора.That's what you'll create in Visual Studio in this article, and then we'll move on to something more challenging: a calculator app.

Предварительные требованияPrerequisites

  • Установите и запустите на своем компьютере Visual Studio с рабочей нагрузкой Разработка классических приложений на C++ .Have Visual Studio with the Desktop development with C++ workload installed and running on your computer. Если установка еще не выполнена, см. статью Установка поддержки C++ в Visual Studio.If it's not installed yet, see Install C++ support in Visual Studio.

Создание проекта приложенияCreate your app project

Visual Studio использует проекты, чтобы упорядочить код для приложения, и решения, чтобы упорядочить проекты.Visual Studio uses projects to organize the code for an app, and solutions to organize your projects. Проект содержит все параметры, конфигурации и правила, используемые для сборки приложения.A project contains all the options, configurations, and rules used to build your apps. Кроме того, он управляет связью между всеми файлами проекта и любыми внешними файлами.It also manages the relationship between all the project's files and any external files. Чтобы создать приложение, сначала создайте проект и решение.To create your app, first, you'll create a new project and solution.

  1. В строке меню Visual Studio последовательно выберите Файл > Создать > Проект.On the menubar in Visual Studio, choose File > New > Project. Открывается окно Новый проект.The New Project window opens.

  2. На боковой панели слева выберите Visual C++ .On the left sidebar, make sure Visual C++ is selected. В центральной области выберите Консольное приложение Windows.In the center, choose Windows Console Application.

  3. В поле ввода Имя внизу введите имя нового проекта CalculatorTutorial, а затем нажмите кнопку ОК.In the Name edit box at the bottom, name the new project CalculatorTutorial, then choose OK.

    Диалоговое окно Новый проектThe New Project dialog

    Будет создано пустое консольное приложение Windows на C++.An empty C++ Windows console application gets created. Консольные приложения используют окно консоли Windows для отображения выходных данных и приема данных, вводимых пользователем.Console applications use a Windows console window to display output and accept user input. В Visual Studio откроется окно редактора с созданным кодом.In Visual Studio, an editor window opens and shows the generated code:

    // CalculatorTutorial.cpp : This file contains the 'main' function. Program execution begins and ends there.
    //
    
    #include "pch.h"
    #include <iostream>
    
    int main()
    {
        std::cout << "Hello World!\n";
    }
    
    // Run program: Ctrl + F5 or Debug > Start Without Debugging menu
    // Debug program: F5 or Debug > Start Debugging menu
    
    // Tips for Getting Started:
    //   1. Use the Solution Explorer window to add/manage files
    //   2. Use the Team Explorer window to connect to source control
    //   3. Use the Output window to see build output and other messages
    //   4. Use the Error List window to view errors
    //   5. Go to Project > Add New Item to create new code files, or Project > Add Existing Item to add existing code files to the project
    //   6. In the future, to open this project again, go to File > Open > Project and select the .sln file
    

Проверка сборки и выполнения нового приложенияVerify that your new app builds and runs

Шаблон для нового консольного приложения Windows создает простое приложение "Hello World" на C++.The template for a new windows console application creates a simple C++ "Hello World" app. На этом этапе вы можете видеть, как Visual Studio создает и запускает созданные вами приложения прямо из интегрированной среды разработки.At this point, you can see how Visual Studio builds and runs the apps you create right from the IDE.

  1. Для сборки проекта выберите в меню Сборка пункт Собрать решение.To build your project, choose Build Solution from the Build menu. Окно Вывод отображает результаты процесса сборки.The Output window shows the results of the build process.

    Сборка проектаBuild the project

  2. Чтобы запустить этот код, в строке меню выберите Отладка и Запуск без отладки.To run the code, on the menu bar, choose Debug, Start without debugging.

    Запуск проектаStart the project

    Открывается окно консоли, и запускается ваше приложение.A console window opens and then runs your app. При запуске консольного приложения в Visual Studio система выполняет код, а затем выводит сообщение "Нажмите любую клавишу, чтобы продолжить.When you start a console app in Visual Studio, it runs your code, then prints "Press any key to continue . .. .",." чтобы вы могли просмотреть выходные данные.to give you a chance to see the output. Поздравляем!Congratulations! Вы создали свое первое консольное приложение "Hello World"You've created your first "Hello, world!" в Visual Studio!console app in Visual Studio!

  3. Нажмите любую клавишу, чтобы закрыть окно консоли и вернуться в редактор Visual Studio.Press a key to dismiss the console window and return to Visual Studio.

Теперь у вас есть средства для сборки и запуска приложения после каждого изменения, чтобы убедиться, что код по-прежнему работает должным образом.You now have the tools to build and run your app after every change, to verify that the code still works as you expect. Позже мы покажем, как выполнить его отладку при неправильной работе.Later, we'll show you how to debug it if it doesn't.

Изменение кодаEdit the code

Теперь давайте превратим код в этом шаблоне в приложение калькулятора.Now let's turn the code in this template into a calculator app.

  1. В файле CalculatorTutorial.cpp измените код таким образом, чтобы он соответствовал этому примеру:In the CalculatorTutorial.cpp file, edit the code to match this example:

    // CalculatorTutorial.cpp : This file contains the 'main' function. Program execution begins and ends there.
    //
    
    #include "pch.h"
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        cout << "Calculator Console Application" << endl << endl;
        cout << "Please enter the operation to perform. Format: a+b | a-b | a*b | a/b"
            << endl;
        return 0;
    }
    
    // Run program: Ctrl + F5 or Debug > Start Without Debugging menu
    // Debug program: F5 or Debug > Start Debugging menu
    // Tips for Getting Started:
    //   1. Use the Solution Explorer window to add/manage files
    //   2. Use the Team Explorer window to connect to source control
    //   3. Use the Output window to see build output and other messages
    //   4. Use the Error List window to view errors
    //   5. Go to Project > Add New Item to create new code files, or Project > Add Existing Item to add existing code files to the project
    //   6. In the future, to open this project again, go to File > Open > Project and select the .sln file
    

    Пояснения к коду:Understanding the code:

    • Операторы #include позволяют ссылаться на код, расположенный в других файлах.The #include statements allow you to reference code located in other files. Иногда вы можете увидеть имя файла, заключенное в угловые скобки ( <> ), а в других случаях — в кавычки ( " " ).Sometimes, you may see a filename surrounded by angle brackets (<>); other times, it's surrounded by quotes (" "). В общем случае угловые скобки используются при ссылке на стандартную библиотеку C++, а кавычки — для других файлов.In general, angle brackets are used when referencing the C++ Standard Library, while quotes are used for other files.
    • Строка #include "pch.h" (или файл #include "stdafx.h" в версиях, предшествующих Visual Studio 2017) ссылается на некий объект, известный как предкомпилированный заголовок.The #include "pch.h" (or in Visual Studio 2017 and earlier, #include "stdafx.h") line references something known as a precompiled header. Они части используются профессиональными программистами для улучшения времени компиляции, однако выходят за рамки материала, обсуждаемого в этом руководстве.These are often used by professional programmers to improve compilation times, but they are beyond the scope of this tutorial.
    • Строка using namespace std; сообщает компилятору ожидать данные от стандартной библиотеки C++ для использования в этом файле.The using namespace std; line tells the compiler to expect stuff from the C++ Standard Library to be used in this file. Без нее каждое ключевое слово из этой библиотеки пришлось бы предварять элементом std::, чтобы обозначить его область.Without this line, each keyword from the library would have to be preceded with a std::, to denote its scope. Например, без этой строки каждую ссылку на cout потребовалось бы записывать в виде std::cout.For instance, without that line, each reference to cout would have to be written as std::cout. Оператор using добавляется, чтобы сделать код более чистым и понятным.The using statement is added to make the code look more clean.
    • Ключевое слово cout используется для вывода сведений в стандартный поток вывода в C++.The cout keyword is used to print to standard output in C++. Оператор << указывает компилятору отправить все содержимое справа от него в стандартный поток вывода.The << operator tells the compiler to send whatever is to the right of it to the standard output.
    • Ключевое слово endl аналогично клавише ВВОД — оно завершает строку и переводит курсор на следующую строку.The endl keyword is like the Enter key; it ends the line and moves the cursor to the next line. Для выполнения той же задачи рекомендуется помещать \n внутрь строки (заключенной в ""), так как endl всегда освобождает буфер и может негативно повлиять на производительность программы, но из-за того, что это очень небольшое приложение, в нем используется endl для улучшения удобочитаемости.It is a better practice to put a \n inside the string (contained by "") to do the same thing, as endl always flushes the buffer and can hurt the performance of the program, but since this is a very small app, endl is used instead for better readability.
    • Все операторы C++ должны заканчиваться точкой с запятой, а все приложения C++ — содержать функцию main().All C++ statements must end with semicolons and all C++ applications must contain a main() function. Именно ее программа выполняет при запуске.This function is what the program runs at the start. Для использования весь код должен быть доступен из main().All code must be accessible from main() in order to be used.
  2. Чтобы сохранить файл, нажмите клавиши CTRL+S или выберите элемент Сохранить в верхней части интегрированной среды разработки, выглядящий как значок гибкого диска на панели инструментов в строке меню.To save the file, enter Ctrl+S, or choose the Save icon near the top of the IDE, the floppy disk icon in the toolbar under the menu bar.

  3. Чтобы запустить приложение, нажмите клавиши CTRL+F5 или перейдите в меню Отладка и выберите Запуск без отладки.To run the application, press Ctrl+F5 or go to the Debug menu and choose Start Without Debugging. Если отображается всплывающее окно This project is out of date (Этот проект устарел), можно выбрать Больше не показывать это диалоговое окно, а затем — Да, чтобы создать приложение.If you get a pop-up that says This project is out of date, you may select Do not show this dialog again, and then choose Yes to build your application. Должно отобразится окно консоли с текстом, указанным в коде.You should see a console window appear that displays the text specified in the code.

    Сборка и запуск приложенияBuild and start your application

  4. По завершении закройте окно консоли.Close the console window when you're done.

Добавление кода для выполнения математических операцийAdd code to do some math

Пора добавить математическую логику.It's time to add some math logic.

Добавление класса CalculatorTo add a Calculator class

  1. В меню Проект выберите команду Добавить класс.Go to the Project menu and choose Add Class. В поле ввода Имя класса введите Calculator.In the Class Name edit box, enter Calculator. Нажмите кнопку ОК.Choose OK. В проект будут добавлены два новых файла.Two new files get added to your project. Чтобы сохранить сразу все измененные файлы, нажмите клавиши CTRL+SHIFT+S.To save all your changed files at once, press Ctrl+Shift+S. Это сочетание клавиш для команды Файл > Сохранить все.It's a keyboard shortcut for File > Save All. Кроме того, есть кнопка Сохранить все на панели инструментов. Она имеет вид значка с двумя дискетами рядом с кнопкой Сохранить.There's also a toolbar button for Save All, an icon of two floppy disks, found beside the Save button. В общем случае рекомендуется регулярно нажимать кнопку Сохранить все, чтобы не пропустить никакие файлы при сохранении.In general, it's good practice to do Save All frequently, so you don't miss any files when you save.

    Создание класса CalculatorCreate the Calculator class

    Класс подобен схеме для объекта, который выполняет какие-либо действия.A class is like a blueprint for an object that does something. В этом случае мы определяем калькулятор и особенности его работы.In this case, we define a calculator and how it should work. Использованный ранее мастер Добавить класс создал файлы H и CPP, имя которых совпадает с именем класса.The Add Class wizard you used above created .h and .cpp files that have the same name as the class. Вы можете просмотреть полный список файлов проекта в окне обозревателя решений, отображаемом в боковой части окна IDE.You can see a full list of your project files in the Solution Explorer window, visible on the side of the IDE. Если окно не отображается, его можно открыть из строки меню, выбрав Вид > Обозреватель решений.If the window isn't visible, you can open it from the menu bar: choose View > Solution Explorer.

    Обозреватель решенийSolution Explorer

    Теперь у вас в редакторе должно быть открыто три вкладки: CalculatorTutorial.cpp, Calculator.h и Calculator.cpp.You should now have three tabs open in the editor: CalculatorTutorial.cpp, Calculator.h, and Calculator.cpp. Если вы случайно закроете одну из них, то можете повторно открыть эту вкладку, дважды щелкнув ее в окне обозревателя решений.If you accidentally close one of them, you can reopen it by double-clicking it in the Solution Explorer window.

  2. На вкладке Calculator.h удалите созданные строки Calculator(); и ~Calculator();, так как здесь они вам не понадобятся.In Calculator.h, remove the Calculator(); and ~Calculator(); lines that were generated, since you won't need them here. Затем добавьте следующую строку кода, чтобы файл выглядел следующим образом:Next, add the following line of code so the file now looks like this:

    #pragma once
    class Calculator
    {
    public:
        double Calculate(double x, char oper, double y);
    };
    

    Пояснения к кодуUnderstanding the code

    • Добавленная строка объявляет новую функцию Calculate, которую мы используем для выполнения математических операций, таких как сложение, вычитание, умножение и деление.The line you added declares a new function called Calculate, which we'll use to run math operations for addition, subtraction, multiplication, and division.
    • Код C++ упорядочен по файлам заголовка (H) и исходным файлам (CPP).C++ code is organized into header (.h) files and source (.cpp) files. Различные компиляторы поддерживают несколько других расширений имени файла, но это основные, о которых вам нужно знать.Several other file extensions are supported by various compilers, but these are the main ones to know about. Функции и переменные обычно объявляются, то есть получают имя и тип, в файлах заголовка, и реализуются, то есть получают определение, в исходных файлах.Functions and variables are normally declared, that is, given a name and a type, in header files, and implemented, or given a definition, in source files. Чтобы обратиться к коду, определенному в другом файле, вы можете использовать #include "filename.h", где "filename.h" — это имя файла, объявляющего переменные или функции, которые требуется использовать.To access code defined in another file, you can use #include "filename.h", where 'filename.h' is the name of the file that declares the variables or functions you want to use.
    • Две удаленные строки объявляли конструктор и деструктор для класса.The two lines you deleted declared a constructor and destructor for the class. Для такого простого класса компилятор создает их автоматически, а их использование выходит за рамки данного руководства.For a simple class like this one, the compiler creates them for you, and their uses are beyond the scope of this tutorial.
    • Рекомендуется упорядочивать код по различным файлам в зависимости от его назначения, чтобы позднее было проще найти нужный код.It's good practice to organize your code into different files based on what it does, so it's easy to find the code you need later. В данном случае мы определяем класс Calculator отдельно от файла, содержащего функцию main(), но планируем ссылаться на класс Calculator в main().In our case, we define the Calculator class separately from the file containing the main() function, but we plan to reference the Calculator class in main().
  3. Под Calculate появится зеленая волнистая линия.You'll see a green squiggle appear under Calculate. Это вызвано тем, что мы еще не определили функцию Calculate в CPP-файле.It's because we haven't defined the Calculate function in the .cpp file. Наведите указатель на это слово, щелкните появившуюся лампочку и выберите Создать определение "Calculate" в Calculator.cpp.Hover over the word, click the lightbulb that pops up, and choose Create definition of 'Calculate' in Calculator.cpp. Отображается всплывающее окно, сообщающее об изменении кода, внесенном в другом файле.A pop-up appears that gives you a peek of the code change that was made in the other file. Код был добавлен в Calculator.cpp.The code was added to Calculator.cpp.

    Создание определения для CalculateCreate definition of Calculate

    Сейчас он возвращает просто 0.0.Currently, it just returns 0.0. Давайте изменим это.Let's change that. Нажмите клавишу ESC, чтобы закрыть всплывающее окно.Press Esc to close the pop-up.

  4. Переключитесь на файл Calculator.cpp в окне редактора.Switch to the Calculator.cpp file in the editor window. Удалите разделы Calculator() и ~Calculator() (как сделали в H-файле) и добавьте в Calculate() следующий код:Remove the Calculator() and ~Calculator() sections (as you did in the .h file) and add the following code to Calculate():

    #include "pch.h"
    #include "Calculator.h"
    
    double Calculator::Calculate(double x, char oper, double y)
    {
        switch(oper)
        {
            case '+':
                return x + y;
            case '-':
                return x - y;
            case '*':
                return x * y;
            case '/':
                return x / y;
            default:
                return 0.0;
        }
    }
    

    Пояснения к кодуUnderstanding the code

    • Функция Calculate использует число, оператор и второе число, а затем выполняет запрошенную операцию над этими числами.The function Calculate consumes a number, an operator, and a second number, then performs the requested operation on the numbers.
    • Оператор switch проверяет, какой оператор был предоставлен, и выполняет только вариант (case), соответствующий этой операции.The switch statement checks which operator was provided, and only executes the case corresponding to that operation. Вариант default: является резервным на тот случай, если пользователь вводит неприемлемый оператор, чтобы программа не прервала работу.The default: case is a fallback in case the user types an operator that isn't accepted, so the program doesn't break. В общем случае лучше обрабатывать некорректный ввод данных пользователем более элегантным способом, но это выходит за рамки данного руководства.In general, it's best to handle invalid user input in a more elegant way, but this is beyond the scope of this tutorial.
    • Ключевое слово double обозначает тип числа, который поддерживает десятичные числа.The double keyword denotes a type of number that supports decimals. Таким образом, калькулятор может выполнять математические операции с десятичными и целыми числами.This way, the calculator can handle both decimal math and integer math. Функция Calculate должна всегда возвращать такое число из-за элемента double в самом начале кода (обозначает тип возвращаемого значения функции), поэтому возвращается 0.0 даже в случае default.The Calculate function is required to always return such a number due to the double at the very start of the code (this denotes the function's return type), which is why we return 0.0 even in the default case.
    • H-файл объявляет функцию prototype, которая заранее сообщает компилятору, какой параметр требуется и какой тип возвращаемого значения следует ожидать.The .h file declares the function prototype, which tells the compiler upfront what parameters it requires, and what return type to expect from it. CPP-файл содержит все сведения о реализации этой функции.The .cpp file has all the implementation details of the function.

Если построить и запустить код еще раз на этом этапе, он по-прежнему завершит работу после запроса операции для выполнения.If you build and run the code again at this point, it will still exit after asking which operation to perform. Далее вам нужно изменить функцию main для выполнения вычислений.Next, you'll modify the main function to do some calculations.

Вызов функций-членов класса CalculatorTo call the Calculator class member functions

  1. Теперь давайте изменим функцию main в CalculatorTutorial.cpp:Now let's update the main function in CalculatorTutorial.cpp:

    // CalculatorTutorial.cpp : This file contains the 'main' function. Program execution begins and ends there.
    //
    
    #include "pch.h"
    #include <iostream>
    #include "Calculator.h"
    
    using namespace std;
    
    int main()
    {
        double x = 0.0;
        double y = 0.0;
        double result = 0.0;
        char oper = '+';
    
        cout << "Calculator Console Application" << endl << endl;
        cout << "Please enter the operation to perform. Format: a+b | a-b | a*b | a/b"
             << endl;
    
        Calculator c;
        while (true)
        {
            cin >> x >> oper >> y;
            result = c.Calculate(x, oper, y);
            cout << "Result is: " << result << endl;
        }
    
        return 0;
    }
    

    Пояснения к кодуUnderstanding the code

    • Так как программы C++ всегда запускаются с функции main(), нам нужно вызвать из нее другой, для чего нужен оператор #include.Since C++ programs always start at the main() function, we need to call our other code from there, so a #include statement is needed.
    • Объявлены начальные переменные x, y, oper и result для хранения, соответственно, первого числа, второго числа, оператора и окончательного результата.Some initial variables x, y, oper, and result are declared to store the first number, second number, operator, and final result, respectively. Рекомендуется всегда присваивать им некоторые начальные значения, чтобы избежать неопределенного поведения. Это мы здесь и делаем.It is always good practice to give them some initial values to avoid undefined behavior, which is what is done here.
    • Строка Calculator c; объявляет объект "c" в качестве экземпляра класса Calculator.The Calculator c; line declares an object named 'c' as an instance of the Calculator class. Сам класс является лишь схемой для описания работы калькуляторов, а объект — это конкретный калькулятор, который выполняет вычисления.The class itself is just a blueprint for how calculators work; the object is the specific calculator that does the math.
    • Оператор while (true) является циклом.The while (true) statement is a loop. Код внутри этого цикла продолжает выполняться снова и снова, пока выполняется условие в ().The code inside the loop continues to execute over and over again as long as the condition inside the () holds true. Так как условие просто указано как true, оно всегда выполняется, поэтому цикл выполняется бесконечно.Since the condition is simply listed as true, it's always true, so the loop runs forever. Чтобы закрыть программу, пользователю нужно вручную закрыть окно консоли.To close the program, the user must manually close the console window. В противном случае программа будет постоянно ожидать новые входные данные.Otherwise, the program always waits for new input.
    • Ключевое слово cin используется для получения входных данных от пользователя.The cin keyword is used to accept input from the user. Этот входной поток способен обработать строку текста, введенного в окне консоли, и поместить ее внутрь каждой из перечисленных переменных в указанном порядке, при условии, что введенные пользователем данные соответствуют требуемой спецификации.This input stream is smart enough to process a line of text entered in the console window and place it inside each of the variables listed, in order, assuming the user input matches the required specification. Вы можете изменить эту строку, чтобы принять другие типы входных данных, например, больше двух чисел, однако для этого также потребуется изменить функцию Calculate().You can modify this line to accept different types of input, for instance, more than two numbers, though the Calculate() function would also need to be updated to handle this.
    • Выражение c.Calculate(x, oper, y); вызывает определенную ранее функцию Calculate и предоставляет введенные входные значения.The c.Calculate(x, oper, y); expression calls the Calculate function defined earlier, and supplies the entered input values. Затем она возвращает число, сохраняемое в result.The function then returns a number that gets stored in result.
    • Наконец, в консоль выводится result, благодаря чему пользователь видит результат вычисления.Finally, result is printed to the console, so the user sees the result of the calculation.

Повторная сборка и проверка кодаBuild and test the code again

Пришло время снова протестировать программу еще раз, чтобы убедиться в ее правильной работе.Now it's time to test the program again to make sure everything works properly.

  1. Нажмите клавиши CTRL+F5, чтобы перестроить и запустить приложение.Press Ctrl+F5 to rebuild and start the app.

  2. Введите 5 + 5 и нажмите клавишу ВВОД.Enter 5 + 5, and press Enter. Убедитесь, что выводится результат 10.Verify that the result is 10.

    Результат сложения 5 + 5The result of 5 + 5

Отладка приложенияDebug the app

Так как пользователь может ввести в окне консоли что угодно, нужно убедиться, что калькулятор обрабатывает некоторые входные данные правильно.Since the user is free to type anything into the console window, let's make sure the calculator handles some input as expected. Вместо запуска программы давайте выполним ее отладку, чтобы можно было проверить ее выполнение шаг за шагом.Instead of running the program, let's debug it instead, so we can inspect what it's doing in detail, step-by-step.

Запуск приложения в отладчикеTo run the app in the debugger

  1. Установите точку останова на строке result = c.Calculate(x, oper, y);, сразу после запроса входных данных у пользователя.Set a breakpoint on the result = c.Calculate(x, oper, y); line, just after the user was asked for input. Чтобы задать точку останова, щелкните рядом со строкой серую вертикальную панель, идущую вдоль левой части окна редактора.To set the breakpoint, click next to the line in the gray vertical bar along the left edge of the editor window. Появится красная точка.A red dot appears.

    Установка точки остановаSet a breakpoint

    Теперь при отладке программа всегда приостанавливает выполнение на этой строке.Now when we debug the program, it always pauses execution at that line. Мы уже имеем примерное представление о том, что в простых случаях программа работает.We already have a rough idea that the program works for simple cases. Так как нам не нужно приостанавливать выполнение при каждом запуске, создадим условную точку останова.Since we don't want to pause execution every time, let's make the breakpoint conditional.

  2. Щелкните правой кнопкой мыши красную точку, обозначающую точку останова, и выберите команду Условия.Right-click the red dot that represents the breakpoint, and choose Conditions. В поле ввода для условия введите (y == 0) && (oper == '/').In the edit box for the condition, enter (y == 0) && (oper == '/'). По завершении операции нажмите кнопку Закрыть.Choose the Close button when you're done. Условия сохранятся автоматически.The condition is saved automatically.

    Установка условной точки остановаSet a conditional breakpoint

    Теперь выполнение приостанавливается в точке останова, в частности при попытке деления на 0.Now we pause execution at the breakpoint specifically if a division by 0 is attempted.

  3. Чтобы отладить программу, нажмите клавишу F5 или выберите Локальный отладчик Windows — кнопку панели инструментов со значком зеленой стрелки.To debug the program, press F5, or choose the Local Windows Debugger toolbar button that has the green arrow icon. Если ввести в консольном приложении нечто вроде "5 - 0", программа работает как обычно и продолжает выполнение.In your console app, if you enter something like "5 - 0", the program behaves normally and keeps running. Но если ввести "10 / 0", она приостанавливает выполнение в точке останова.However, if you type "10 / 0", it pauses at the breakpoint. Вы можете ввести любое число пробелов между оператором и числами; функция cin достаточно интеллектуальна для того, чтобы правильно проанализировать входные данные.You can even put any number of spaces between the operator and numbers; cin is smart enough to parse the input appropriately.

    Приостановка на условной точке остановаPause at the conditional breakpoint

Полезные окна в отладчикеUseful windows in the debugger

Каждый раз при отладке кода вы можете заметить, что появляется несколько новых окон.Whenever you debug your code, you may notice that some new windows appear. Они могут оказаться полезными в процессе отладки.These windows can assist your debugging experience. Давайте рассмотрим окно Видимые.Take a look at the Autos window. Окно Видимые содержит текущие значения переменных, используемых по меньшей мере за три строки перед текущей строкой.The Autos window shows you the current values of variables used at least three lines before and up to the current line.

Окно ВидимыеThe Autos window

Чтобы просмотреть все переменные из этой функции, переключитесь в окно Локальные.To see all of the variables from that function, switch to the Locals window. Вы можете изменять значения этих переменных во время отладки, чтобы оценить их влияние на программу.You can actually modify the values of these variables while debugging, to see what effect they would have on the program. В данном случае мы оставим их без изменений.In this case, we'll leave them alone.

Окно ЛокальныеThe Locals window

Кроме того, вы можете просто навести указатель на переменные в самом коде, чтобы просмотреть их текущие значения на участке, где приостановлено выполнение.You can also just hover over variables in the code itself to see their current values where the execution is currently paused. Сначала щелкните окно редактора, чтобы сделать его активным.Make sure the editor window is in focus by clicking on it first.

Наведите указатель мыши, чтобы просмотреть текущие значения переменныхHover to view current variable values

Продолжение отладкиTo continue debugging

  1. Желтая линия слева показывает текущую точку выполнения.The yellow line on the left shows the current point of execution. Текущая строка вызывает Calculate, поэтому нажмите клавишу F11, чтобы выполнить Шаг с заходом для этой функции.The current line calls Calculate, so press F11 to Step Into the function. Вы переходите в тело функции Calculate.You'll find yourself in the body of the Calculate function. Обдуманно применяйте функцию Шаг с заходом, чтобы не терять время из-за чрезмерного ее использования.Be careful with Step Into; if you do it too much, you may waste a lot of time. С помощью функции анализируется любой код, используемый в текущей строке, включая стандартные функции библиотеки.It goes into any code you use on the line you are on, including standard library functions.

  2. Теперь, когда точка выполнения находится в начале функции Calculate, нажмите клавишу F10 для перехода на следующую строку в рамках выполнения программы.Now that the point of execution is at the start of the Calculate function, press F10 to move to the next line in the program's execution. При нажатии клавиши F10 активируется функция Шаг с обходом.F10 is also known as Step Over. Шаг с обходом можно использовать для перемещения по строкам, не вдаваясь в подробности того, что происходит в каждой части строки.You can use Step Over to move from line to line, without delving into the details of what is occurring in each part of the line. В общем случае следует использовать Шаг с обходом, а не Шаг с заходом, если только вы не хотите подробно изучить код, вызываемый из другого расположения (как в случае с переходом к телу функции Calculate).In general you should use Step Over instead of Step Into, unless you want to dive more deeply into code that is being called from elsewhere (as you did to reach the body of Calculate).

  3. Продолжайте использовать клавишу F10, чтобы выполнять Шаг с обходом для каждой строки, пока не вернетесь к функции main() в другом файле, и остановитесь на строке cout.Continue using F10 to Step Over each line until you get back to the main() function in the other file, and stop on the cout line.

    Шаг с выходом из Calculate и проверка результатаStep out of Calculate and check result

    Похоже, программа работает правильно — принимает первое число и делит его на второе.It looks like the program is doing what is expected: it takes the first number, and divides it by the second. В строке cout наведите указатель мыши на переменную result или взгляните на result в окне Видимые.On the cout line, hover over the result variable or take a look at result in the Autos window. Соответствующее значение отображается как inf. Это неправильное поведение, и нужно его скорректировать.You'll see its value is listed as "inf", which doesn't look right, so let's fix it. В строке cout просто выводится любое значение, хранящееся в result. Поэтому при продвижении еще на один шаг с помощью клавиши F10 в окне консоли отображается следующее:The cout line just outputs whatever value is stored in result, so when you step one more line forward using F10, the console window displays:

    Результат деления на нольThe result of divide by zero

    Причина такого результата в том, что деление на ноль является неопределенным, поэтому у программы нет числового ответа на запрошенную операцию.This result happens because division by zero is undefined, so the program doesn't have a numerical answer to the requested operation.

Исправление ошибки деления на нольTo fix the "divide by zero" error

Давайте обеспечим корректную обработку деления на ноль, чтобы пользователь мог осознать проблему.Let's handle division by zero more gracefully, so a user can understand the problem.

  1. Внесите следующие изменения в CalculatorTutorial.cpp.Make the following changes in CalculatorTutorial.cpp. (Прерывать выполнение программы при редактировании не требуется благодаря функции отладчика Изменить и продолжить):(You can leave the program running as you edit, thanks to a debugger feature called Edit and Continue):

    // CalculatorTutorial.cpp : This file contains the 'main' function. Program execution begins and ends there.
    //
    
    #include "pch.h"
    #include <iostream>
    #include "Calculator.h"
    
    using namespace std;
    
    int main()
    {
        double x = 0.0;
        double y = 0.0;
        double result = 0.0;
        char oper = '+';
    
        cout << "Calculator Console Application" << endl << endl;
        cout << "Please enter the operation to perform. Format: a+b | a-b | a*b | a/b" << endl;
    
        Calculator c;
        while (true)
        {
            cin  >> x  >> oper  >> y;
            if (oper == '/' && y == 0)
            {
                cout << "Division by 0 exception" << endl;
                continue;
            }
            else
            {
                result = c.Calculate(x, oper, y);
            }
            cout << "Result is: " << result << endl;
        }
    
        return 0;
    }
    
  2. Теперь нажмите клавишу F5 один раз.Now press F5 once. При этом выполнение программы продолжается вплоть до приостановки для запроса данных, вводимых пользователем.Program execution continues all the way until it has to pause to ask for user input. Снова введите 10 / 0.Enter 10 / 0 again. Теперь выводится более информативное сообщение.Now, a more helpful message is printed. У пользователя запрашиваются дополнительные входные данные, и программа продолжает выполнение в обычном режиме.The user is asked for more input, and the program continues executing normally.

    Окончательный результат после внесения измененийThe final result after changes

    Примечание

    При редактировании кода в режиме отладки существует риск того, что код устареет.When you edit code while in debugging mode, there is a risk of code becoming stale. Это происходит, когда отладчик продолжает выполнять старый код, не учитывающий внесенные вами изменения.This happens when the debugger is still running your old code, and has not yet updated it with your changes. В подобной ситуации отладчик выводит диалоговое окно с соответствующим сообщением.The debugger pops up a dialog to inform you when this happens. В некоторых случаях может потребоваться нажать клавишу F5, чтобы обновить выполняемый код.Sometimes, you may need to press F5 to refresh the code being executed. В частности, если вы вносите изменения внутри функции, когда точка выполнения находится внутри этой же функции, вам потребуется выполнить шаг с выходом из функции, а затем вернуться в нее, чтобы получить обновленный код.In particular, if you make a change inside a function while the point of execution is inside that function, you'll need to step out of the function, then back into it again to get the updated code. Если по какой-либо причине это не работает и вы видите сообщение об ошибке, можно остановить отладку, щелкнув красный квадрат на панели инструментов под меню в верхней части интегрированной среды разработки, а затем перезапустить отладку, нажав клавишу F5 или выбрав зеленую стрелку "воспроизведения" рядом с кнопкой остановки на панели инструментов.If that doesn't work for some reason and you see an error message, you can stop debugging by clicking on the red square in the toolbar under the menus at the top of the IDE, then start debugging again by entering F5 or by choosing the green "play" arrow beside the stop button on the toolbar.

    Пояснения по сочетаниям клавиш для выполнения и отладкиUnderstanding the Run and Debug shortcuts

    • Клавиша F5 (или команда Отладка > Запустить отладку) запускает сеанс отладки, если он еще не активен, и выполняет программу до тех пор, пока не будет встречена точка останова либо программе не потребуются вводимые пользователем данные.F5 (or Debug > Start Debugging) starts a debugging session if one isn't already active, and runs the program until a breakpoint is hit or the program needs user input. Если вводимые пользователем данные не требуются и точка останова отсутствует, программа завершает работу, а окно консоли автоматически закрывается после завершения выполнения программы.If no user input is needed and no breakpoint is available to hit, the program terminates and the console window closes itself when the program finishes running. Если вы выполняете программу уровня "Hello World", используйте сочетание клавиш CTRL+F5 или задайте точку останова перед нажатием клавиши F5, чтобы окно оставалось открытым.If you have something like a "Hello World" program to run, use Ctrl+F5 or set a breakpoint before you enter F5 to keep the window open.
    • Сочетание клавиш CTRL+F5 (или команда Отладка > Запуск без отладки) запускает приложение без перехода в режим отладки.Ctrl+F5 (or Debug > Start Without Debugging) runs the application without going into debug mode. Это немного быстрее отладки, а окно консоли остается открытым после завершения выполнения программы.This is slightly faster than debugging, and the console window stays open after the program finishes executing.
    • Клавиша F10 (соответствующая возможности Шаг с обходом) позволяет выполнять построчную итерацию по коду, а также визуализировать выполнение кода и значения переменных на каждом шаге выполнения.F10 (known as Step Over) lets you iterate through code, line-by-line, and visualize how the code is run and what variable values are at each step of execution.
    • Клавиша F11 (соответствующая возможности Шаг с заходом) работает аналогично возможности Шаг с обходом, за исключением того, что заходит в любые функции, вызываемые в строке выполнения.F11 (known as Step Into) works similarly to Step Over, except it steps into any functions called on the line of execution. Например, если в выполняемой строке вызывается функция, при нажатии клавиши F11 указатель перемещается в тело функции, чтобы вы могли проследить выполнение кода функции, прежде чем вернуться на исходную строку.For example, if the line being executed calls a function, pressing F11 moves the pointer into the body of the function, so you can follow the function's code being run before coming back to the line you started at. При нажатии клавиши F10 выполняется шаг с обходом по вызову функции и простой переход на следующую строку. Вызов функции все равно выполняется, но программа не приостанавливается, чтобы показать вам, что именно она делает.Pressing F10 steps over the function call and just moves to the next line; the function call still happens, but the program doesn't pause to show you what it's doing.

Закрытие приложенияClose the app

  • Если оно все еще выполняется, закройте окно консоли для приложения калькулятора.If it's still running, close the console window for the calculator app.

Готовое приложениеThe finished app

Поздравляем!Congratulations! Вы завершили написание кода для приложения калькулятора, а также выполнили его сборку и отладку в Visual Studio.You've completed the code for the calculator app, and built and debugged it in Visual Studio.

Следующие шагиNext steps

Дополнительные сведения о Visual Studio для C++Learn more about Visual Studio for C++