Tworzenie kalkulatora konsoli w C++
Zwykle punktem wyjścia dla programisty języka C++ jest aplikacja "Hello, world!", która działa w wierszu polecenia. Zaczniesz od tego w tym artykule, a następnie przejdziemy do czegoś trudniejszego: aplikacji kalkulatora.
Wymagania wstępne
- Program Visual Studio z programowaniem aplikacji klasycznych z zainstalowanym obciążeniem języka C++ i uruchomionym na komputerze. Aby go zainstalować, zobacz Instalowanie obsługi języka C++ w programie Visual Studio.
- W tym samouczku przedstawiono funkcję o nazwie edytuj i kontynuuj, która umożliwia wprowadzanie zmian w kodzie podczas działania aplikacji. Aby włączyć edycję i kontynuować, w menu głównym wybierz pozycję Narzędzia>Opcje>Debugowanie>ogólne i upewnij się, że opcja Wymagaj plików źródłowych do dokładnego dopasowania oryginalnej wersji jest zaznaczona.
Tworzenie projektu aplikacji
Program Visual Studio używa projektów do organizowania kodu dla aplikacji i rozwiązań w celu organizowania co najmniej jednego projektu. Projekt zawiera wszystkie opcje, konfiguracje i reguły używane do tworzenia aplikacji. Zarządza również relacją między wszystkimi plikami projektu i plikami zewnętrznymi. Aby utworzyć aplikację, najpierw utwórz nowy projekt i rozwiązanie.
Uruchom program Visual Studio — zostanie wyświetlone okno dialogowe Uruchamianie programu Visual Studio. Wybierz pozycję Utwórz nowy projekt , aby rozpocząć pracę.
Okno dialogowe zawiera opcje klonowania repozytorium, otwierania projektu lub rozwiązania, otwierania folderu lokalnego i tworzenia nowego projektu".
Na liście szablonów projektów wybierz pozycję Aplikacja konsolowa, a następnie wybierz pozycję Dalej.
Ważne
Upewnij się, że wybrano wersję języka C++ szablonu Aplikacja konsolowa. Ma tagi C++, Windows i Console, a ikona ma "++" w rogu.
W oknie dialogowym Konfigurowanie nowego projektu wybierz pole tekstowe Nazwa projektu, nadaj nowemu projektowi nazwę CalculatorTutorial, a następnie wybierz pozycję Utwórz.
Zostanie utworzona pusta aplikacja konsolowa systemu Windows w języku C++ "Hello World". Aplikacje konsolowe używają okna konsoli systemu Windows do wyświetlania danych wyjściowych i akceptowania danych wejściowych użytkownika. W programie Visual Studio zostanie otwarte okno edytora z wyświetlonym wygenerowanym kodem:
// 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
Sprawdź, czy nowa aplikacja kompiluje i uruchamia
Szablon nowej aplikacji konsolowej systemu Windows tworzy prostą aplikację "Hello World" w języku C++. W tym momencie możesz zobaczyć, jak program Visual Studio kompiluje i uruchamia aplikacje tworzone bezpośrednio ze środowiska IDE.
Aby skompilować projekt, wybierz pozycję Kompiluj rozwiązanie z menu Kompilacja . W oknie Dane wyjściowe są wyświetlane wyniki procesu kompilacji.
Aby uruchomić kod, na pasku menu wybierz pozycję Debuguj, Rozpocznij bez debugowania (Ctrl+F5).
Zostanie otwarte okno konsoli, a następnie uruchomi aplikację.
Po uruchomieniu aplikacji konsolowej w programie Visual Studio zostanie uruchomiony kod, a następnie wyświetli komunikat "Naciśnij dowolny klawisz, aby zamknąć to okno. . ." w celu wyświetlenia danych wyjściowych.
Gratulacje! Utworzono pierwszą aplikację konsolową "Hello, world!" w programie Visual Studio!
Naciśnij klawisz, aby zamknąć okno konsoli i wrócić do programu Visual Studio.
Teraz masz narzędzia do kompilowania i uruchamiania aplikacji po każdej zmianie, aby sprawdzić, czy kod nadal działa zgodnie z oczekiwaniami. Później pokażemy, jak go debugować, jeśli nie.
Edytowanie kodu
Teraz zmodyfikujmy kod w tym szablonie tak, aby był aplikacją kalkulatora.
Zastąp zawartość
CalculatorTutorial.cpp
pliku następującym kodem, tak aby był zgodny z tym przykładem:// 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
Opis kodu:
- Instrukcje
#include
umożliwiają odwołanie do kodu znajdującego się w innych plikach. Czasami może być widoczna nazwa pliku otoczona nawiasami kątowymi (<>); czasami jest otoczona cudzysłowami (" ). Ogólnie rzecz biorąc, nawiasy kątowe są używane podczas odwoływania się do standardowej biblioteki języka C++, podczas gdy cudzysłowy są używane dla innych plików. - Wiersz
using namespace std;
informuje kompilator o oczekiwaniu użycia elementów z standardowej biblioteki języka C++ w tym pliku. Bez tego wiersza każde słowo kluczowe z biblioteki musi być poprzedzonestd::
, aby oznaczyć jego zakres. Na przykład bez tego wiersza każde odwołaniecout
musi być napisane jakostd::cout
. Instrukcjausing
jest dodawana w celu zwiększenia czytelnego wyglądu kodu. - Słowo
cout
kluczowe służy do drukowania do standardowych danych wyjściowych w języku C++. Operator << nakazuje kompilatorowi wysłanie dowolnego elementu na prawo do standardowych danych wyjściowych. - Słowo kluczowe jest podobne do klawisza
endl
Enter; kończy wiersz i przenosi kursor do następnego wiersza. Lepszym rozwiązaniem jest umieszczenie\n
wewnątrz ciągu (zawartego przez""
) w celu wykonania tej samej czynności, ponieważendl
zawsze opróżnia bufor, który może zaszkodzić wydajności programu. Ale ponieważ jest to bardzo mała aplikacja,endl
jest używana zamiast tego w celu zapewnienia lepszej czytelności. - Wszystkie instrukcje języka C++ muszą kończyć się średnikami, a wszystkie aplikacje języka C++ muszą zawierać
main()
funkcję. Ta funkcja jest tym, co program jest uruchamiany na początku. Aby można było używać wszystkich kodów, musi być dostępny.main()
- Instrukcje
Aby zapisać plik, naciśnij klawisze Ctrl+S lub wybierz ikonę Zapisz w górnej części środowiska IDE, ikonę dyskietki na pasku narzędzi pod paskiem menu.
Aby uruchomić aplikację, naciśnij klawisze Ctrl+F5 lub przejdź do menu Debugowanie i wybierz pozycję Rozpocznij bez debugowania. Powinno zostać wyświetlone okno konsoli, w którym zostanie wyświetlony tekst określony w kodzie.
Po zakończeniu zamknij okno konsoli.
Dodawanie kodu w celu wykonania pewnych obliczeń matematycznych
Klasa jest jak strategia dla obiektu, który coś robi. W tym przypadku zdefiniujemy klasę kalkulatora zawierającą logikę matematyczną.
Dodawanie klasy Kalkulator
Przejdź do menu Project (Projekt) i wybierz pozycję Add Class (Dodaj klasę). W polu Edycja nazwy klasy wprowadź Kalkulator. Wybierz przycisk OK.
Pole nazwy klasy jest ustawione na kalkulator. Pole pliku .h zawiera plik Calculator.h. Pole pliku .cpp zawiera Calculator.cpp. Pole klasy bazowej jest puste. Inne opcje dla destruktora wirtualnego, wbudowanego i niezarządzanego są niezaznaczone.
Dwa nowe pliki są dodawane do projektu. Aby zapisać wszystkie zmienione pliki jednocześnie, naciśnij klawisze Ctrl+Shift+S. Jest to skrót klawiaturowy do zapisywania wszystkich plików>. Istnieje również przycisk paska narzędzi Dla opcji Zapisz wszystko, ikona dwóch dyskietek znajdujących się obok przycisku Zapisz . Ogólnie rzecz biorąc, dobrym rozwiązaniem jest częste zapisywanie wszystkich , więc nie pomijasz żadnych plików podczas zapisywania.
Kreator Dodawania klasy tworzy
.h
pliki i.cpp
pliki, które mają taką samą nazwę jak klasa. Pełną listę plików projektu można wyświetlić w oknie Eksplorator rozwiązań widocznym po stronie środowiska IDE. Jeśli okno nie jest widoczne, możesz go otworzyć na pasku menu: wybierz pozycję Widok> Eksplorator rozwiązań.Projekt samouczka kalkulatora zawiera węzeł plików nagłówkowych zawierający plik Calculator.h. Węzeł Pliki źródłowe zawiera Calculator.cpp i CalculatorTutorial.cpp. Węzły dla odwołań, zależności zewnętrznych i plików zasobów są widoczne, ale zamknięte.
Plik można otworzyć, klikając go dwukrotnie w oknie Eksplorator rozwiązań. Kliknij dwukrotnie,
Calculator.h
aby go otworzyć.Zastąp zawartość
Calculator.h
następującym kodem, tak aby plik wyglądał następująco:#pragma once class Calculator { public: double Calculate(double x, char oper, double y); };
Omówienie kodu
- Ten kod deklaruje nową funkcję o nazwie
Calculate
, która służy do uruchamiania operacji matematycznych na potrzeby dodawania, odejmowania, mnożenia i dzielenia. - Kod C++ jest zorganizowany w pliki nagłówkowe (
.h
) i pliki źródłowe (.cpp
). Kilka innych rozszerzeń plików jest obsługiwanych przez różne kompilatory, ale są to główne rozszerzenia, o których warto wiedzieć. Funkcje i zmienne są zwykle deklarowane, czyli nadane nazwę i typ, w plikach nagłówkowych i zaimplementowane, lub podane definicje, w plikach źródłowych. Aby uzyskać dostęp do kodu zdefiniowanego w innym pliku, możesz użyć polecenia#include "filename.h"
, gdziefilename.h
jest nazwą pliku, który deklaruje zmienne lub funkcje, których chcesz użyć. - Dobrym rozwiązaniem jest zorganizowanie kodu w różne pliki w oparciu o to, co robi, dzięki czemu można łatwo znaleźć potrzebny kod później. W naszym przypadku zdefiniujemy klasę
Calculator
oddzielnie od pliku zawierającegomain()
funkcję, ale planujemy odwołaćCalculator
się do klasy w pliku .main()
- Ten kod deklaruje nową funkcję o nazwie
W obszarze
Calculate
pojawia się zielony przełącznik, ponieważ chociażCalculate
funkcja jest zadeklarowana, nie jest zdefiniowana. Zatrzymaj wskaźnik myszy naCalculate
, kliknij strzałkę w dół na wyświetlonym śrubokręcie, a następnie wybierz pozycję Utwórz definicję polecenia "Oblicz" w plikuCalculator.cpp
.Ten kod jest dodawany do elementu
Calculator.cpp
:Definicja konstruktora to: double Calculator::Calculate( double x, char oper, double y) { return 0.0; }
Obecnie zwraca tylko wartość 0,0. Zmieńmy to.
Przejdź do
Calculator.cpp
pliku w oknie edytora. Zastąp zawartość elementuCalculator::Calculate(double x, char oper, double y)
następującym kodem: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; } }
Omówienie kodu
- Funkcja
Calculate
używa liczby, operatora i drugiej liczby, a następnie wykonuje żądaną operację na liczbach. - Instrukcja switch sprawdza, który operator został podany, i wykonuje tylko przypadek odpowiadający tej operacji. Wartość domyślna: przypadek jest rezerwowym w przypadku, gdy użytkownik wpisze operator, który nie jest akceptowany, więc program nie zostanie przerwany. Ogólnie rzecz biorąc, najlepiej jest obsługiwać nieprawidłowe dane wejściowe użytkownika w bardziej elegancki sposób, ale wykracza to poza zakres tego samouczka.
- Słowo
double
kluczowe określa typ liczby, która obsługuje liczby dziesiętne. Dzięki temu kalkulator może obsługiwać zarówno matematykę dziesiętną, jak i liczbę całkowitą. FunkcjaCalculate
jest wymagana, aby zawsze zwracać taką liczbę ze względu nadouble
wartość na samym początku kodu (oznacza to typ zwracany przez funkcję), dlatego zwracamy wartość 0,0 nawet w przypadku domyślnym. - Plik
.h
deklaruje prototyp funkcji, który informuje kompilator z góry, jakich parametrów wymaga, i jakiego typu zwrotu oczekiwać od niego. Plik.cpp
zawiera wszystkie szczegóły implementacji funkcji.
- Funkcja
Jeśli w tym momencie skompilujesz i uruchomisz kod ponownie, natychmiast zakończy się po wywołaniu operacji do wykonania. Zmodyfikuj funkcję main
, aby wykonywać wiele obliczeń.
Wywoływanie Calculator
funkcji składowych klasy
main
Zaktualizuj funkcję wCalculatorTutorial.cpp
następujący sposób:// 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 " << "of " << x << oper << y << " is: " << result << endl; } return 0; }
Omówienie kodu
- Ponieważ programy języka C++ zawsze zaczynają się od
main()
funkcji, musimy wywołać z tego miejsca nasz inny kod, więc#include
potrzebna jest instrukcja. - Niektóre zmienne
x
początkowe , ,oper
y
iresult
są zadeklarowane do przechowywania pierwszej liczby, drugiej liczby, operatora i wyniku końcowego odpowiednio. Zawsze dobrym rozwiązaniem jest nadanie im pewnych początkowych wartości, aby uniknąć niezdefiniowanego zachowania, co jest wykonywane tutaj. - Wiersz
Calculator c;
deklaruje obiekt o nazwie "c" jako wystąpienieCalculator
klasy. Sama klasa jest tylko strategią sposobu działania kalkulatorów; obiekt jest konkretnym kalkulatorem, który wykonuje obliczenia matematyczne. - Instrukcja
while (true)
jest pętlą. Kod wewnątrz pętli będzie nadal wykonywany ponownie, o ile warunek w obiekcie()
ma wartość true. Ponieważ warunek jest po prostu wymieniony jakotrue
, jest zawsze prawdziwy, więc pętla jest uruchamiana na zawsze. Aby zamknąć program, użytkownik musi ręcznie zamknąć okno konsoli. W przeciwnym razie program zawsze czeka na nowe dane wejściowe. - Słowo
cin
kluczowe jest używane do akceptowania danych wejściowych od użytkownika. Ten strumień wejściowy jest wystarczająco inteligentny, aby przetworzyć wiersz tekstu wprowadzony w oknie konsoli i umieścić go wewnątrz każdej z wymienionych zmiennych, przy założeniu, że dane wejściowe użytkownika są zgodne z wymaganą specyfikacją. Można zmodyfikować ten wiersz tak, aby akceptował różne typy danych wejściowych, takich jak więcej niż dwie liczby — chociażCalculate()
funkcja również musi zostać zaktualizowana w celu obsługi tej funkcji. - Wyrażenie
c.Calculate(x, oper, y);
wywołuje zdefiniowanąCalculate
wcześniej funkcję i dostarcza wprowadzone wartości wejściowe. Następnie funkcja zwraca liczbę, która jest przechowywana w plikuresult
. - Na koniec zostanie wydrukowany w konsoli,
result
więc użytkownik zobaczy wynik obliczenia.
- Ponieważ programy języka C++ zawsze zaczynają się od
Ponownie skompiluj i przetestuj kod
Teraz ponownie przetestuj program, aby upewnić się, że wszystko działa prawidłowo.
Naciśnij klawisze Ctrl+F5 , aby ponownie skompilować i uruchomić aplikację.
Wprowadź klawisz
5+5
, a następnie naciśnij klawisz Enter. Sprawdź, czy wynik to 10.Aplikacja wyświetli komunikat: Wprowadź operację do wykonania. Format: a+b | a-b | a*b | a/b. Użytkownik wprowadził wartość 5+5. Dane wyjściowe aplikacji: wynik 5+5 to: 10
Debugowanie aplikacji
Ponieważ użytkownik może wpisać dowolne dane w oknie konsoli, upewnij się, że kalkulator obsługuje nieoczekiwane dane wejściowe. Zamiast uruchamiać program, zdebubujmy go, abyśmy mogli sprawdzić, co robi krok po kroku.
Uruchamianie aplikacji w debugerze
W
CalcuatorTutorial.cpp
pliku ustaw punkt przerwania w wierszu:result = c.Calculate(x, oper, y);
. Aby ustawić punkt przerwania, kliknij obok wiersza na szarym pasku pionowym wzdłuż lewej krawędzi okna edytora. Zostanie wyświetlona czerwona kropka.Teraz, gdy debugujemy program, wykonywanie jest wstrzymywane w tym wierszu. Mamy już szorstki pomysł, że program działa w prostych przypadkach. Ponieważ nie chcemy wstrzymywać wykonywania za każdym razem, gdy wywołujemy
Calculate()
metodę , utwórzmy warunkowy punkt przerwania.Kliknij prawym przyciskiem myszy czerwoną kropkę reprezentującą punkt przerwania, a następnie wybierz pozycję Warunki. W polu edycji warunku wprowadź .
(y == 0) && (oper == '/')
Wybierz przycisk Zamknij, aby zapisać warunek punktu przerwania.Warunek punktu przerwania to: y==0 && oper == "/" Jest prawdziwe.
Teraz wykonanie zostanie wstrzymane w punkcie przerwania, gdy aplikacja próbuje podzielić przez 0.
Aby debugować program, naciśnij klawisz F5 lub wybierz przycisk paska narzędzi Lokalne debugera systemu Windows z zieloną strzałką. Jeśli w aplikacji konsolowej wprowadzisz wartość podobną do "5–0", program zachowuje się normalnie i działa. Jeśli jednak wpiszesz wartość "10/0", zostanie wstrzymana w punkcie przerwania. Można umieścić dowolną liczbę spacji między operatorem a liczbami:
cin
jest wystarczająco inteligentna, aby odpowiednio przeanalizować dane wejściowe.
Przydatne okna w debugerze
Podczas debugowania kodu można zauważyć, że pojawią się nowe okna. Te okna mogą pomóc w debugowaniu. Zapoznaj się z oknem Automatyczne . W oknie Autos (Autos ) są wyświetlane bieżące wartości zmiennych używanych co najmniej trzy wiersze przed i do bieżącego wiersza.
Wartość operacji wynosi 47 "/", wynik wynosi 5, x to 10, a y to 0.
Aby wyświetlić wszystkie zmienne z tej funkcji, przejdź do okna Ustawienia lokalne . Wartości tych zmiennych można modyfikować podczas debugowania, aby zobaczyć, jaki wpływ miałoby to na program. W tym przypadku pozostawiamy je w spokoju.
Wartość operacji wynosi 47 '/', wynik wynosi 0, x jest 10, a y to 0.
Możesz również umieścić wskaźnik myszy na zmiennych w kodzie, aby zobaczyć ich bieżące wartości w punkcie, w którym wykonywanie jest obecnie wstrzymane. Upewnij się, że okno edytora jest w centrum uwagi, klikając go najpierw.
Kontynuuj debugowanie
Żółta strzałka po lewej stronie pokazuje bieżący punkt wykonywania. Bieżący wiersz wywołuje metodę
Calculate
, więc naciśnij klawisz F11, aby przejść do funkcji . Teraz wykonujesz kod w treściCalculate
funkcji. Należy zachować ostrożność, ponieważ wykonuje kroki we wszystkich funkcjach w wierszu, w tym standardowych funkcji biblioteki. Warto przejść do standardowej biblioteki, ale być może bardziej interesuje Cię skupienie się na kodzie zamiast kodu biblioteki.Teraz, gdy punkt wykonywania znajduje się na początku
Calculate
funkcji, naciśnij klawisz F10 , aby przejść do następnego wiersza w wykonaniu programu. F10 jest również znany jako Step Over. Aby przejść od wiersza do wiersza, możesz użyć kroków do przejścia bez zagłębiania się w szczegóły tego, co dzieje się w każdej części wiersza. Ogólnie rzecz biorąc, należy użyć instrukcji Step Over zamiast Step Into, chyba że chcesz bardziej szczegółowo zapoznać się z kodem wywoływanym z innego miejsca (tak jak w przypadku dotarcia do treściCalculate
obiektu ).Kontynuuj korzystanie z klawisza F10 , aby przejść do każdego wiersza, dopóki nie wrócisz do
main()
funkcji w innym pliku i zatrzymaj się wcout
wierszu.Program robi to, czego oczekuje się: przyjmuje pierwszą liczbę i dzieli ją przez drugą.
cout
W wierszu umieść kursor nad zmiennąresult
lub przyjrzyj się wresult
oknie Autos. Jego wartośćinf
, która nie wygląda prawidłowo, więc poprawmy ją. Wierszcout
generuje tylko dowolną wartość przechowywaną wresult
pliku , więc po kroku jeszcze jeden wiersz do przodu przy użyciu klawisza F10 zostanie wyświetlone okno konsoli:Dane wyjściowe aplikacji: wprowadź operację do wykonania. Format: a+b | a-b | a*b | a/b. Użytkownik wprowadził wartość 5-0. Dane wyjściowe aplikacji: Wynik: 5. Użytkownik THe wprowadził 10/0. Dane wyjściowe aplikacji: Wynik: inf
Jest to spowodowane tym, że dzielenie według zera jest niezdefiniowane, więc program nie ma liczbowej odpowiedzi dla żądanej operacji.
Naprawiono błąd "podziel przez zero"
Obsłużmy dzielenie przez zero bardziej bezpiecznie, aby ułatwić użytkownikowi zrozumienie problemu.
Wprowadź następujące zmiany w pliku
CalculatorTutorial.cpp
. (Możesz pozostawić program uruchomiony podczas edycji, dzięki funkcji debugera o nazwie Edytuj i kontynuuj). Dodaj instrukcjęif
poniżejcin >> x >> oper >> y;
, aby sprawdzić podział według zera i wyświetlić komunikat do użytkownika, jeśli tak się stanie. W przeciwnym razie zostanie wydrukowany wynik.// 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 << "Attempted to divide by zero!" << endl; continue; } else { result = c.Calculate(x, oper, y); } cout << "Result " << "of " << x << oper << y << " is: " << result << endl; } return 0; }
Naciśnij klawisz F5 raz. Wykonywanie programu jest kontynuowane aż do momentu wstrzymania, aby poprosić o podanie danych wejściowych użytkownika. Wprowadź
10 / 0
ponownie. Teraz zostanie wydrukowany bardziej pomocny komunikat. Użytkownik jest proszony o więcej danych wejściowych, a program kontynuuje normalne wykonywanie.W oknie konsoli są wyświetlane dwa wiersze: 10/0 Wynik: inf, a następnie 10/0 Błąd matematyczny: Podjęto próbę podzielenia przez zero.
Uwaga
Podczas edytowania kodu w trybie debugowania istnieje ryzyko, że kod staje się nieaktualny. Dzieje się tak, gdy debuger nadal uruchamia stary kod i nie zaktualizował go wraz ze zmianami. Debuger wyświetla okno dialogowe informujące o tym, kiedy tak się stanie. Czasami może być konieczne naciśnięcie klawisza F5 , aby odświeżyć wykonywany kod. W szczególności, jeśli wprowadzisz zmianę wewnątrz funkcji, gdy punkt wykonywania znajduje się wewnątrz tej funkcji, musisz wyjść z funkcji, a następnie wrócić do niej ponownie, aby uzyskać zaktualizowany kod. Jeśli to nie zadziała i zostanie wyświetlony komunikat o błędzie, możesz zatrzymać debugowanie, klikając czerwony kwadrat na pasku narzędzi w menu w górnej części środowiska IDE, a następnie ponownie rozpocznij debugowanie, wprowadzając klawisz F5 lub wybierając zieloną strzałkę "odtwórz" obok przycisku zatrzymania na pasku narzędzi.
Kolejna przyczyna edytowania i kontynuowania może zakończyć się niepowodzeniem, jeśli zostanie wyświetlony komunikat "Wymagaj plików źródłowych, aby dokładnie dopasować ustawienie wersji oryginalnej w obszarze Debug-Options-General>> musi być włączone..." Aby rozwiązać ten problem, w menu głównym wybierz pozycję Narzędzia>Opcje>Debugowanie>ogólne i upewnij się, że opcja Wymagaj plików źródłowych do dokładnego dopasowania do oryginalnej wersji jest zaznaczona.
Opis skrótów Uruchamiania i debugowania
- F5 (lub Debuguj>rozpocznij debugowanie debugowania) uruchamia sesję debugowania, jeśli nie jest jeszcze aktywna, i uruchamia program do momentu trafienia punktu przerwania lub program potrzebuje danych wejściowych użytkownika. Jeśli żadne dane wejściowe użytkownika nie są potrzebne i żaden punkt przerwania nie jest dostępny, program zakończy działanie, a okno konsoli zostanie zamknięte po zakończeniu działania programu. Jeśli masz do uruchomienia program "Hello World", użyj klawiszy Ctrl+F5 lub ustaw punkt przerwania przed naciśnięciem klawisza F5 , aby zachować otwarte okno.
- Ctrl+F5 (lub Debuguj>uruchamianie bez debugowania) uruchamia aplikację bez przechodzenia do trybu debugowania. Jest to nieco szybsze niż debugowanie, a okno konsoli pozostaje otwarte po zakończeniu wykonywania programu.
- Klawisz F10 (znany jako krok po kroku) umożliwia iterowanie kodu, wiersz po wierszu i wizualizowanie sposobu uruchamiania kodu oraz wartości zmiennych w każdym kroku wykonywania.
- Klawisz F11 (znany jako Krok do) działa podobnie do krok po kroku, z wyjątkiem kroków w dowolnych funkcjach wywoływanych w wierszu wykonywania. Jeśli na przykład wykonywany wiersz wywołuje funkcję, naciśnięcie klawisza F11 przenosi wskaźnik do treści funkcji, aby można było postępować zgodnie z kodem funkcji uruchamianym przed powrotem do wiersza uruchomionego pod adresem . Naciśnięcie klawisza F10 przez wywołanie funkcji i przejście do następnego wiersza; nadal odbywa się wywołanie funkcji, ale program nie wstrzymuje się, aby pokazać, co robi.
Zamknięcie aplikacji
- Jeśli nadal działa, zamknij okno konsoli aplikacji kalkulatora.
Dodawanie kontroli źródła usługi Git
Po utworzeniu aplikacji możesz dodać ją do repozytorium Git. Pomożemy Ci. Program Visual Studio ułatwia ten proces za pomocą narzędzi Git, których można używać bezpośrednio ze środowiska IDE.
Napiwek
Git to najczęściej używany nowoczesny system kontroli wersji, więc niezależnie od tego, czy jesteś profesjonalnym deweloperem, czy uczysz się kodować, usługa Git może być bardzo przydatna. Jeśli dopiero zaczynasz pracę z usługą Git, https://git-scm.com/ witryna internetowa jest dobrym miejscem do rozpoczęcia. Tam można znaleźć ściągawki, popularną książkę online i filmy git Basics.
Aby skojarzyć kod z usługą Git, zacznij od utworzenia nowego repozytorium Git, w którym znajduje się kod. Oto, jak to zrobić:
Na pasku stanu w prawym dolnym rogu programu Visual Studio wybierz pozycję Dodaj do kontroli źródła, a następnie wybierz pozycję Git.
W oknie dialogowym Tworzenie repozytorium Git zaloguj się do usługi GitHub.
Nazwa repozytorium jest wypełniana automatycznie na podstawie lokalizacji folderu. Domyślnie nowe repozytorium jest prywatne, co oznacza, że jesteś jedynym, który może uzyskać do niego dostęp.
Napiwek
Niezależnie od tego, czy repozytorium jest publiczne, czy prywatne, najlepiej mieć zdalną kopię zapasową kodu przechowywanego bezpiecznie w usłudze GitHub. Nawet jeśli nie pracujesz z zespołem, repozytorium zdalne udostępnia ci kod z dowolnego komputera.
Wybierz pozycję Utwórz i wypchnij.
Po utworzeniu repozytorium na pasku stanu zostaną wyświetlone szczegóły stanu.
Pierwsza ikona ze strzałkami pokazuje liczbę zatwierdzeń wychodzących/przychodzących w bieżącej gałęzi. Możesz użyć tej ikony, aby ściągnąć wszystkie zatwierdzenia przychodzące lub wypchnąć dowolne zatwierdzenia wychodzące. Możesz również najpierw wyświetlić te zatwierdzenia. W tym celu wybierz ikonę, a następnie wybierz pozycję Wyświetl wychodzące/przychodzące.
Druga ikona z ołówkiem pokazuje liczbę niezatwierdzonych zmian w kodzie. Możesz wybrać tę ikonę, aby wyświetlić te zmiany w oknie Zmiany usługi Git.
Aby dowiedzieć się więcej na temat korzystania z usługi Git z aplikacją, zobacz dokumentację kontroli wersji programu Visual Studio.
Zakończona aplikacja
Gratulacje! Ukończono kod aplikacji kalkulatora, skompilowany i debugowany oraz dodano go do repozytorium — wszystko w programie Visual Studio.
Następne kroki
Zwykle punktem wyjścia dla programisty języka C++ jest aplikacja "Hello, world!", która działa w wierszu polecenia. Zaczynasz od tego w tym artykule, a następnie przechodzimy do czegoś trudniejszego: aplikacji kalkulatora.
Wymagania wstępne
- Program Visual Studio z programowaniem aplikacji klasycznych z zainstalowanym obciążeniem języka C++ i uruchomionym na komputerze. Aby go zainstalować, zobacz Instalowanie obsługi języka C++ w programie Visual Studio.
Tworzenie projektu aplikacji
Program Visual Studio używa projektów do organizowania kodu dla aplikacji i rozwiązań w celu organizowania co najmniej jednego projektu. Projekt zawiera wszystkie opcje, konfiguracje i reguły używane do tworzenia aplikacji. Zarządza również relacją między wszystkimi plikami projektu i plikami zewnętrznymi. Aby utworzyć aplikację, najpierw utwórz nowy projekt i rozwiązanie.
Na pasku menu w programie Visual Studio wybierz pozycję Plik>nowy>projekt. Zostanie otwarte okno Nowy projekt .
Na lewym pasku bocznym upewnij się, że wybrano pozycję Visual C++ . W środku wybierz pozycję Aplikacja konsolowa systemu Windows.
W polu tekstowym Name (Nazwa) w dolnej części nadaj nowej nazwie nazwę CalculatorTutorial projektu, a następnie wybierz przycisk OK.
Zostanie utworzona pusta aplikacja konsolowa systemu Windows w języku C++ "Hello World". Aplikacje konsolowe używają okna konsoli systemu Windows do wyświetlania danych wyjściowych i akceptowania danych wejściowych użytkownika. W programie Visual Studio zostanie otwarte okno edytora z wyświetlonym wygenerowanym kodem:
// 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
Sprawdź, czy nowa aplikacja kompiluje i uruchamia
Szablon nowej aplikacji konsolowej systemu Windows tworzy prostą aplikację "Hello World" w języku C++. W tym momencie możesz zobaczyć, jak program Visual Studio kompiluje i uruchamia aplikacje tworzone bezpośrednio ze środowiska IDE.
Aby skompilować projekt, wybierz pozycję Kompiluj rozwiązanie z menu Kompilacja . W oknie Dane wyjściowe są wyświetlane wyniki procesu kompilacji.
Aby uruchomić kod, na pasku menu wybierz pozycję Debuguj, Rozpocznij bez debugowania (Ctrl+F5).
Zostanie otwarte okno konsoli, a następnie uruchomi aplikację.
Po uruchomieniu aplikacji konsolowej w programie Visual Studio zostanie uruchomiony kod, a następnie wyświetli komunikat "Naciśnij dowolny klawisz, aby zamknąć to okno. . ." w celu wyświetlenia danych wyjściowych.
Gratulacje! Utworzono pierwszą aplikację konsolową "Hello, world!" w programie Visual Studio!
Naciśnij klawisz, aby zamknąć okno konsoli i wrócić do programu Visual Studio.
Teraz masz narzędzia do kompilowania i uruchamiania aplikacji po każdej zmianie, aby sprawdzić, czy kod nadal działa zgodnie z oczekiwaniami. Później pokażemy, jak go debugować, jeśli nie.
Edytowanie kodu
Teraz zmieńmy kod w tym szablonie, aby był aplikacją kalkulatora.
Zastąp zawartość
CalculatorTutorial.cpp
pliku następującym kodem, tak aby był zgodny z tym przykładem:// 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
Opis kodu:
- Instrukcje
#include
umożliwiają odwołanie do kodu znajdującego się w innych plikach. Czasami może być widoczna nazwa pliku otoczona nawiasami kątowymi (<>); czasami jest otoczona cudzysłowami (" ). Ogólnie rzecz biorąc, nawiasy kątowe są używane podczas odwoływania się do standardowej biblioteki języka C++, podczas gdy cudzysłowy są używane dla innych plików. - Wiersz
using namespace std;
informuje kompilator o oczekiwaniu użycia elementów z standardowej biblioteki języka C++ w tym pliku. Bez tego wiersza każde słowo kluczowe z biblioteki musi być poprzedzonestd::
, aby oznaczyć jego zakres. Na przykład bez tego wiersza każde odwołaniecout
musi być napisane jakostd::cout
. Instrukcjausing
jest dodawana w celu zwiększenia czytelnego wyglądu kodu. - Słowo
cout
kluczowe służy do drukowania do standardowych danych wyjściowych w języku C++. Operator *<<
nakazuje kompilatorowi wysłanie dowolnego elementu z prawej strony do standardowych danych wyjściowych. - Słowo kluczowe jest podobne do klawisza
endl
Enter; kończy wiersz i przenosi kursor do następnego wiersza. Lepszym rozwiązaniem jest umieszczenie\n
wewnątrz ciągu (zawartego przez""
), aby zrobić to samo, ponieważendl
zawsze opróżnia bufor i może zaszkodzić wydajności programu. Ale ponieważ jest to bardzo mała aplikacja,endl
jest używana zamiast tego w celu zapewnienia lepszej czytelności. - Wszystkie instrukcje języka C++ muszą kończyć się średnikami, a wszystkie aplikacje języka C++ muszą zawierać
main()
funkcję. Ta funkcja jest tym, co program jest uruchamiany na początku. Aby można było używać wszystkich kodów, musi być dostępny.main()
- Instrukcje
Aby zapisać plik, naciśnij klawisze Ctrl+S lub wybierz ikonę Zapisz w górnej części środowiska IDE, ikonę dyskietki na pasku narzędzi pod paskiem menu.
Aby uruchomić aplikację, naciśnij klawisze Ctrl+F5 lub przejdź do menu Debugowanie i wybierz pozycję Rozpocznij bez debugowania. Jeśli pojawi się wyskakujące okienko z informacją Ten projekt jest nieaktualny, możesz wybrać pozycję Nie pokazuj tego okna dialogowego ponownie, a następnie wybrać pozycję Tak , aby skompilować aplikację. Powinno zostać wyświetlone okno konsoli, w którym zostanie wyświetlony tekst określony w kodzie.
Najpierw zostanie wyświetlone okno dialogowe z pytaniem, czy utworzyć projekt, ponieważ projekt jest nieaktualny. Pole wyboru "Nie pokazuj ponownie tego okna dialogowego" jest zaznaczone. Opcja "Tak" jest wybierana do skompilowania projektu, kompilacji projektu kalkulatora, a następnie zostanie uruchomiona w oknie konsoli systemu Windows.
Po zakończeniu zamknij okno konsoli.
Dodawanie kodu w celu wykonania pewnych obliczeń matematycznych
Klasa jest jak strategia dla obiektu, który coś robi. W tym przypadku zdefiniujemy klasę kalkulatora zawierającą logikę matematyczną.
Dodawanie klasy Kalkulator
Przejdź do menu Project (Projekt) i wybierz pozycję Add Class (Dodaj klasę). W polu Edycja nazwy klasy wprowadź Kalkulator. Wybierz przycisk OK.
Klasa jest jak strategia dla obiektu, który coś robi. W tym przypadku zdefiniujemy kalkulator i sposób jego działania.
Dwa nowe pliki są dodawane do projektu. Aby zapisać wszystkie zmienione pliki jednocześnie, naciśnij klawisze Ctrl+Shift+S. Jest to skrót klawiaturowy do zapisywania wszystkich plików>. Istnieje również przycisk paska narzędzi Dla opcji Zapisz wszystko, ikona dwóch dyskietek znajdujących się obok przycisku Zapisz . Ogólnie rzecz biorąc, dobrym rozwiązaniem jest częste zapisywanie wszystkich , więc nie pomijasz żadnych plików podczas zapisywania.
Kreator Dodawania klasy tworzy
.h
pliki i.cpp
pliki, które mają taką samą nazwę jak klasa. Pełną listę plików projektu można wyświetlić w oknie Eksplorator rozwiązań widocznym po stronie środowiska IDE. Jeśli okno nie jest widoczne, możesz go otworzyć na pasku menu: wybierz pozycję Widok> Eksplorator rozwiązań.Projekt samouczka kalkulatora zawiera węzeł plików nagłówków zawierający calculator.h, stdafx.h i targetver.h. Węzeł Pliki źródłowe zawiera Calculator.cpp, CalculatorTutorial.cpp i stdafx.cpp. Węzły dla odwołań, zależności zewnętrznych i plików zasobów są widoczne, ale zamknięte.
Plik można otworzyć, klikając go dwukrotnie w oknie Eksplorator rozwiązań. Kliknij dwukrotnie,
Calculator.h
aby go otworzyć.Zastąp zawartość
Calculator.h
następującym kodem, tak aby plik wyglądał następująco:#pragma once class Calculator { public: double Calculate(double x, char oper, double y); };
Omówienie kodu
- Ten kod deklaruje nową funkcję o nazwie
Calculate
, która służy do uruchamiania operacji matematycznych na potrzeby dodawania, odejmowania, mnożenia i dzielenia. - Kod C++ jest zorganizowany w pliki nagłówkowe (
.h
) i pliki źródłowe (.cpp
). Kilka innych rozszerzeń plików jest obsługiwanych przez różne kompilatory, ale są to główne rozszerzenia, o których warto wiedzieć. Funkcje i zmienne są zwykle deklarowane, czyli nadane nazwę i typ, w plikach nagłówkowych i zaimplementowane, lub podane definicje, w plikach źródłowych. Aby uzyskać dostęp do kodu zdefiniowanego w innym pliku, możesz użyć polecenia#include "filename.h"
, gdziefilename.h
jest nazwą pliku, który deklaruje zmienne lub funkcje, których chcesz użyć. - Dobrym rozwiązaniem jest zorganizowanie kodu w różne pliki w oparciu o to, co robi, dzięki czemu można łatwo znaleźć potrzebny kod później. W naszym przypadku zdefiniujemy klasę
Calculator
oddzielnie od pliku zawierającegomain()
funkcję, ale planujemy odwołaćCalculator
się do klasy w pliku .main()
- Ten kod deklaruje nową funkcję o nazwie
W obszarze
Calculate
pojawia się zielony przełącznik, ponieważ chociażCalculate
funkcja jest zadeklarowana, nie jest zdefiniowana. Zatrzymaj wskaźnik myszy naCalculate
, kliknij strzałkę w dół na wyświetlonym śrubokręcie, a następnie wybierz pozycję Utwórz definicję polecenia "Oblicz" w plikuCalculator.cpp
. Zostanie wyświetlone wyskakujące okienko, które daje wgląd w zmianę kodu, która została wprowadzona w innym pliku. Kod został dodany do elementuCalculator.cpp
.Obecnie zwraca tylko wartość 0,0. Zmieńmy to. Naciśnij klawisz Esc , aby zamknąć wyskakujące okienko.
Przejdź do
Calculator.cpp
pliku w oknie edytora. Zastąp zawartość pliku następującym kodem:#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; } }
Omówienie kodu
- Funkcja
Calculate
używa liczby, operatora i drugiej liczby, a następnie wykonuje żądaną operację na liczbach. - Instrukcja switch sprawdza, który operator został podany, i wykonuje tylko przypadek odpowiadający tej operacji. Wartość domyślna: przypadek jest rezerwowym w przypadku, gdy użytkownik wpisze operator, który nie jest akceptowany, więc program nie zostanie przerwany. Ogólnie rzecz biorąc, najlepiej jest obsługiwać nieprawidłowe dane wejściowe użytkownika w bardziej elegancki sposób, ale wykracza to poza zakres tego samouczka.
- Słowo
double
kluczowe określa typ liczby, która obsługuje liczby dziesiętne. Dzięki temu kalkulator może obsługiwać zarówno matematykę dziesiętną, jak i liczbę całkowitą. FunkcjaCalculate
jest wymagana, aby zawsze zwracać taką liczbę ze względu nadouble
wartość na samym początku kodu (oznacza to typ zwracany przez funkcję), dlatego zwracamy wartość 0,0 nawet w przypadku domyślnym. - Plik
.h
deklaruje prototyp funkcji, który informuje kompilator z góry, jakich parametrów wymaga, i jakiego typu zwrotu oczekiwać od niego. Plik.cpp
zawiera wszystkie szczegóły implementacji funkcji.
- Funkcja
Jeśli utworzysz i uruchomisz kod ponownie w tym momencie, nadal zakończy się po zapytaniu, która operacja ma zostać wykonana. Następnie zmodyfikuj main
funkcję, aby wykonać pewne obliczenia.
Wywoływanie funkcji składowych klasy Calculator
Teraz zaktualizujmy
main
funkcję w plikuCalculatorTutorial.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; }
Omówienie kodu
- Ponieważ programy języka C++ zawsze zaczynają się od
main()
funkcji, musimy wywołać z tego miejsca nasz inny kod, więc#include
potrzebna jest instrukcja. - Niektóre zmienne
x
początkowe , ,oper
y
iresult
są zadeklarowane do przechowywania pierwszej liczby, drugiej liczby, operatora i wyniku końcowego odpowiednio. Zawsze dobrym rozwiązaniem jest nadanie im pewnych początkowych wartości, aby uniknąć niezdefiniowanego zachowania, co jest wykonywane tutaj. - Wiersz
Calculator c;
deklaruje obiekt o nazwie "c" jako wystąpienieCalculator
klasy. Sama klasa jest tylko strategią sposobu działania kalkulatorów; obiekt jest konkretnym kalkulatorem, który wykonuje obliczenia matematyczne. - Instrukcja
while (true)
jest pętlą. Kod wewnątrz pętli będzie nadal wykonywany ponownie, o ile warunek w obiekcie()
ma wartość true. Ponieważ warunek jest po prostu wymieniony jakotrue
, jest zawsze prawdziwy, więc pętla jest uruchamiana na zawsze. Aby zamknąć program, użytkownik musi ręcznie zamknąć okno konsoli. W przeciwnym razie program zawsze czeka na nowe dane wejściowe. - Słowo
cin
kluczowe jest używane do akceptowania danych wejściowych od użytkownika. Ten strumień wejściowy jest wystarczająco inteligentny, aby przetworzyć wiersz tekstu wprowadzony w oknie konsoli i umieścić go wewnątrz każdej z wymienionych zmiennych, przy założeniu, że dane wejściowe użytkownika są zgodne z wymaganą specyfikacją. Można zmodyfikować ten wiersz tak, aby akceptował różne typy danych wejściowych, takich jak więcej niż dwie liczby — chociażCalculate()
funkcja również musi zostać zaktualizowana w celu obsługi tej funkcji. - Wyrażenie
c.Calculate(x, oper, y);
wywołuje zdefiniowanąCalculate
wcześniej funkcję i dostarcza wprowadzone wartości wejściowe. Następnie funkcja zwraca liczbę, która jest przechowywana w plikuresult
. - Na koniec zostanie wydrukowany w konsoli,
result
więc użytkownik zobaczy wynik obliczenia.
- Ponieważ programy języka C++ zawsze zaczynają się od
Ponownie skompiluj i przetestuj kod
Ponownie przetestuj program, aby upewnić się, że wszystko działa prawidłowo.
Naciśnij klawisze Ctrl+F5 , aby ponownie skompilować i uruchomić aplikację.
Wprowadź klawisz
5+5
, a następnie naciśnij klawisz Enter. Sprawdź, czy wynik to 10.
Debugowanie aplikacji
Ponieważ użytkownik może wpisać dowolne dane w oknie konsoli, upewnij się, że kalkulator obsługuje nieoczekiwane dane wejściowe. Zamiast uruchamiać program, zdebubujmy go zamiast tego, abyśmy mogli sprawdzić, co robi krok po kroku.
Uruchamianie aplikacji w debugerze
W
CalcuatorTutorial.cpp
pliku ustaw punkt przerwania wresult = c.Calculate(x, oper, y);
wierszu. Aby ustawić punkt przerwania, kliknij obok wiersza na szarym pasku pionowym wzdłuż lewej krawędzi okna edytora. Zostanie wyświetlona czerwona kropka.Teraz, gdy debugujemy program, zawsze wstrzymuje wykonywanie w tym wierszu. Mamy już szorstki pomysł, że program działa w prostych przypadkach. Ponieważ nie chcemy za każdym razem wstrzymywać wykonywania, utwórzmy warunkowy punkt przerwania.
Kliknij prawym przyciskiem myszy czerwoną kropkę reprezentującą punkt przerwania, a następnie wybierz pozycję Warunki. W polu edycji warunku wprowadź .
(y == 0) && (oper == '/')
Po zakończeniu wybierz przycisk Zamknij , aby zapisać warunek punktu przerwania.Punkt przerwania znajduje się w wierszu: result = c dot Calculate ( x, oper, y). "Warunki..." jest zaznaczona na liście rozwijanej punkt przerwania, co spowoduje otwarcie okna ustawień punktu przerwania. Opcja Warunek jest zaznaczona, poniżej której listy rozwijane są ustawione jako: "Wyrażenie warunkowe" i "Jest prawdziwe". Użytkownik wprowadza y == 0 && oper == '/' w polu tekstowym warunek, a następnie wybiera blisko, aby ustawić warunkowy punkt przerwania.
Teraz wstrzymujemy wykonywanie w punkcie przerwania, jeśli zostanie podjęta próba dzielenia o 0.
Aby debugować program, naciśnij klawisz F5 lub wybierz przycisk paska narzędzi Lokalne debugera systemu Windows z zieloną strzałką. Jeśli w aplikacji konsolowej wprowadzisz wartość podobną do "5–0", program zachowuje się normalnie i działa. Jeśli jednak wpiszesz wartość "10/0", zostanie wstrzymana w punkcie przerwania. Można nawet umieścić dowolną liczbę spacji między operatorem a liczbami;
cin
jest wystarczająco inteligentny, aby odpowiednio przeanalizować dane wejściowe.Użytkownik wprowadza wartość 5–0. Dane wyjściowe aplikacji: wynik to 5. Następnie użytkownik wprowadza wartość 10/0 i ponieważ warunek warunkowego punktu przerwania jest spełniony, wykonanie zatrzymuje się w wierszu: result = c.Calculate(x, oper, y);
Przydatne okna w debugerze
Podczas debugowania kodu można zauważyć, że pojawią się nowe okna. Te okna mogą pomóc w debugowaniu. Zapoznaj się z oknem Automatyczne . W oknie Autos (Autos ) są wyświetlane bieżące wartości zmiennych używanych co najmniej trzy wiersze przed i do bieżącego wiersza.
Wartość operacji wynosi 47 "/", wynik wynosi 5, x to 10, a y to 0.
Aby wyświetlić wszystkie zmienne z tej funkcji, przejdź do okna Ustawienia lokalne . Możesz zmodyfikować wartości tych zmiennych podczas debugowania, aby zobaczyć, jaki wpływ miałoby to na program. W tym przypadku pozostawiamy je w spokoju.
Wartość operacji wynosi 47 '/', wynik wynosi 0, x jest 10, a y to 0.
Możesz również umieścić kursor nad zmiennymi w samym kodzie, aby zobaczyć ich bieżące wartości, w których wykonywanie jest obecnie wstrzymane. Upewnij się, że okno edytora jest w centrum uwagi, klikając go najpierw.
Kontynuuj debugowanie
Żółta strzałka po lewej stronie pokazuje bieżący punkt wykonywania. Bieżący wiersz wywołuje
Calculate
metodę , dlatego naciśnij klawisz F11, aby przejść do funkcji , co spowoduje przejście do treściCalculate
funkcji. Należy zachować ostrożność, ponieważ wykonuje kroki we wszystkich funkcjach w wierszu, w tym standardowych funkcji biblioteki. Warto przejść do standardowej biblioteki, ale być może bardziej interesuje Cię skupienie się na kodzie zamiast kodu biblioteki.Teraz, gdy punkt wykonywania znajduje się na początku
Calculate
funkcji, naciśnij klawisz F10 , aby przejść do następnego wiersza w wykonaniu programu. F10 jest również znany jako Step Over. Aby przejść od wiersza do wiersza, możesz użyć kroków do przejścia bez zagłębiania się w szczegóły tego, co dzieje się w każdej części wiersza. Ogólnie rzecz biorąc, należy użyć instrukcji Step Over zamiast Step Into, chyba że chcesz bardziej szczegółowo zapoznać się z kodem wywoływanym z innego miejsca (tak jak w przypadku dotarcia do treściCalculate
obiektu ).Kontynuuj korzystanie z klawisza F10 , aby przejść do każdego wiersza, dopóki nie wrócisz do
main()
funkcji w innym pliku i zatrzymaj się wcout
wierszu.Każdy wiersz kodu w funkcji Calculate jest przesunął się, aż kontrolka powróci do funkcji main. Następnie użytkownik umieści wskaźnik myszy na zmiennej o nazwie result, aby zobaczyć jej wartość, czyli: inf".
Program robi to, czego oczekuje się: przyjmuje pierwszą liczbę i dzieli ją przez drugą.
cout
W wierszu umieść kursor nad zmiennąresult
lub przyjrzyj się wresult
oknie Autos. Jego wartość toinf
, która nie wygląda prawidłowo, więc poprawmy ją. Wierszcout
generuje tylko dowolną wartość przechowywaną wresult
pliku , więc po kroku jeszcze jeden wiersz do przodu przy użyciu klawisza F10 zostanie wyświetlone okno konsoli:Dane wyjściowe aplikacji: wprowadź operację do wykonania. Format: a+b | a-b | a*b | a/b. Użytkownik wprowadził wartość 5-0. Dane wyjściowe aplikacji: Wynik: 5. Użytkownik THe wprowadził 10/0. Dane wyjściowe aplikacji: Wynik: inf
Jest to spowodowane tym, że dzielenie według zera jest niezdefiniowane, więc program nie ma liczbowej odpowiedzi dla żądanej operacji.
Naprawiono błąd "podziel przez zero"
Obsłużmy dzielenie przez zero bardziej bezpiecznie, aby ułatwić użytkownikowi zrozumienie problemu.
Wprowadź następujące zmiany w pliku
CalculatorTutorial.cpp
. (Możesz pozostawić program uruchomiony podczas edycji, dzięki funkcji debugera o nazwie Edytuj i kontynuuj). Zmiana polega na dodaniu instrukcji następującejif
wcin >> x >> oper >> y;
celu sprawdzenia dzielenia według zera i wyprowadzenia komunikatu do użytkownika, jeśli tak się stanie. W przeciwnym razie wynik zostanie wydrukowany:// 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; }
Naciśnij klawisz F5 raz. Wykonywanie programu jest kontynuowane aż do momentu wstrzymania, aby poprosić o podanie danych wejściowych użytkownika. Wprowadź
10 / 0
ponownie. Teraz zostanie wydrukowany bardziej pomocny komunikat. Użytkownik jest proszony o więcej danych wejściowych, a program kontynuuje normalne wykonywanie.Uwaga
Podczas edytowania kodu w trybie debugowania istnieje ryzyko, że kod staje się nieaktualny. Dzieje się tak, gdy debuger nadal uruchamia stary kod i nie zaktualizował go wraz ze zmianami. Debuger pojawia się okno dialogowe informujące o tym, kiedy tak się stanie. Czasami może być konieczne naciśnięcie klawisza F5 , aby odświeżyć wykonywany kod. W szczególności, jeśli wprowadzisz zmianę wewnątrz funkcji, gdy punkt wykonywania znajduje się wewnątrz tej funkcji, wyjdź z funkcji, a następnie wróć do niej ponownie, aby pobrać zaktualizowany kod. Jeśli to nie zadziała z jakiegoś powodu i zostanie wyświetlony komunikat o błędzie, możesz zatrzymać debugowanie, klikając czerwony kwadrat na pasku narzędzi w menu w górnej części środowiska IDE, a następnie ponownie rozpocznij debugowanie, wprowadzając klawisz F5 lub wybierając zieloną strzałkę "odtwórz" obok przycisku Zatrzymaj na pasku narzędzi.
Innym powodem, dla którego edytowanie i kontynuowanie może zakończyć się niepowodzeniem, jest to, że należy przejść do menu głównego i wybrać pozycję Narzędzia>Opcje>Debugowanie>ogólne i upewnić się, że zaznaczono opcję Wymagaj plików źródłowych, aby dokładnie dopasować oryginalną wersję.
Opis skrótów Uruchamiania i debugowania
- F5 (lub Debuguj>rozpocznij debugowanie debugowania) uruchamia sesję debugowania, jeśli nie jest jeszcze aktywna, i uruchamia program do momentu trafienia punktu przerwania lub program potrzebuje danych wejściowych użytkownika. Jeśli żadne dane wejściowe użytkownika nie są potrzebne i żaden punkt przerwania nie jest dostępny, program zakończy działanie, a okno konsoli zostanie zamknięte po zakończeniu działania programu. Jeśli masz do uruchomienia program "Hello World", użyj klawiszy Ctrl+F5 lub ustaw punkt przerwania przed naciśnięciem klawisza F5 , aby zachować otwarte okno.
- Ctrl+F5 (lub Debuguj>uruchamianie bez debugowania) uruchamia aplikację bez przechodzenia do trybu debugowania. Jest to nieco szybsze niż debugowanie, a okno konsoli pozostaje otwarte po zakończeniu wykonywania programu.
- Klawisz F10 (znany jako krok po kroku) umożliwia iterowanie kodu, wiersz po wierszu i wizualizowanie sposobu uruchamiania kodu oraz wartości zmiennych w każdym kroku wykonywania.
- Klawisz F11 (znany jako Krok do) działa podobnie do krok po kroku, z wyjątkiem kroków w dowolnych funkcjach wywoływanych w wierszu wykonywania. Jeśli na przykład wykonywany wiersz wywołuje funkcję, naciśnięcie klawisza F11 przenosi wskaźnik do treści funkcji, aby można było postępować zgodnie z kodem funkcji uruchamianym przed powrotem do wiersza uruchomionego pod adresem . Naciśnięcie klawisza F10 przez wywołanie funkcji i przejście do następnego wiersza; nadal odbywa się wywołanie funkcji, ale program nie wstrzymuje się, aby pokazać, co robi.
Zamknięcie aplikacji
- Jeśli nadal działa, zamknij okno konsoli aplikacji kalkulatora.
Gratulacje! Kod aplikacji kalkulatora został ukończony i skompilowany i debugowany w programie Visual Studio.