ПРЕДУПРЕЖДЕНИЕ: Следната статия може да изглежда, че продължава и продължава (и продължава) и няма да понеса обида, ако не прочетете цялата. Пътуването обаче беше важно, тъй като (спойлер) съм изключително доволен от резултата.

Добре, нека да започнем това шоу. Както казах, мисля, че направих грешката първия път (или беше вторият път), като просто се съсредоточих върху обучението и не отделих известно време, веднага след като научих нещо, за да създам нещо просто с него, в самото Visual Studio. Така че, вместо просто да преминаваме през двата урока в последния, основен калкулатор раздел на Условни условия и цикли (в рамките на приложението SoloLearn), нека просто го направете във Visual Studio!

Повторно как ще работи този основен калкулатор, той многократно ще поиска от потребителя да въведе две стойности и след това ще покаже сумата им, докато потребителят въведе „изход“. Ето първите ми мисли:

  • Пише многократно, което предполага използването на някакъв вид цикъл.
  • Потребителят въвежда две стойности, което ще означава две променливи.
  • Проверката дали първата стойност е думата „изход“ ще бъде важна, за да се определи дали да излезете от програмата или не.
  • Ще ни трябва трета променлива, която да е равна на сумата от другите две.

Въпреки че първата ми мисъл щеше да бъде използването на израз if, когато стартирах страницата в SoloLearn, вече каза да използвам цикъл do-while (и сега ми хрумва че тези две неща всъщност не са едното или другото набор от неща). Предполагам, че можете да използвате израз if, но това може да не е най-ефективното решение. Докато пиша това, също така ми хрумва, че цикълът do-while наистина съчетава както цикъл, така и оператор if, така че това наистина епо-ефективно.

ОК…стартира се Visual Studio. Преди да можем да въведем някакъв код, трябва да започнем нов проект. Не съм експерт по Visual Studio по никакъв начин, форма или форма, така че съм сигурен, че в даден момент ще трябва да се насоча към Google. Това каза, нека просто да поговорим за няколко неща:

  • Първо, трябва да изтеглите и инсталирате Visual Studio тук: https://visualstudio.microsoft.com/downloads/ (уверете се, че сте избрали версията Community, която е безплатна!) Бъдете готови за тази инсталация да отнеме известно време. Нещото, което изтегляте, всъщност е само инсталационната програма. След като започне действителната инсталация, тя изтегля данни на стойност „гига“. Освен това, когато ви попита кои „работни натоварвания“ искате да инсталирате, току-що избрах двете работни натоварванияв горната част на диалоговия прозорец, които са Разработка на универсална Windows платформа и .NET Desktop Development.

  • Преди да стартирам, създадох папка, която исках да бъде моята папка „проекти“. Тъй като използвам Google Диск, настройвам своя там, така че всичко, което създавам, ще бъде синхронизирано в облака и ще се показва на множеството машини, на които имам инсталирано приложението Google Диск.
  • След като стартирах приложението, направих две неща: (1) Щракнах върху падащото меню Инструменти и щракнах върху Опции. В страницата, която се показва, в секцията СредаОбщи, щраквам върху падащото меню до Цветова темагрупа Визуално изживяване) и изберете тъмно. Това е просто нещо, което ми харесва, но със сигурност не е изискване.

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

  • За да започнете нов проект, щракнете върху падащото меню Файл, задръжте курсора на мишката върху Нов и изберете Проект.

УАУ! Това са много опции (шаблони всъщност)! Е, първо, нека се уверим, че Visual C# е избран отляво. Това малко ще стесни избора до, разбирате ли, 22!! Тъй катозапочваме, нека изберем Вземи Започнавляво. Добре, 2 избора. Много по-добре!

Можем да изберем Конзолно приложение или Настолно приложение. Когато изберете едно от двете, вдясно се появява описание. Изберете Приложение за конзола. „Конзола“ е точно като ключовата дума, която сме виждали преди, наречена Console.WriteLine, и е друг начин да кажем „Прозорец на конзолата“, което е онзи черен прозорец, който изскача на екрана, когато кажете вашия код за отпечатване на екрана. Освен това, когато изберете Настолно приложение, описанието вдясно се отнася до графичен потребителски интерфейс, нещо, което КАТЕГОРИЧНО все още не сме готови.

Както и да е, след като изберете Приложение за конзола, долу в долната част на диалоговия прозорец, до мястото, където пише Име, въведете basicCalculator (това е техника за именуване които програмистите използват). Забележете, че Името на решение също е актуализирано, за да казва basicCalculator. Ще оставим това, но само за да знаете, полето Име се отнася до цялостния проект, който съдържа различни програми(които могат да работят заедно), настройки, препратки, изображения и т.н. Засега обаче нека го оставим със същото име и щракнете върху OK.

След няколко секунди (и няколко полета за напредък) ще видите някакъв код на екрана. И дори още не сме направили нищо!! В горната част ще забележите, че има пет израза using, последвани от някои думи. Думите след ключовата дума using са имената на библиотекиот функционалности. Много неща, които могат да се правят в една програма, трябва да се търсят някъде другаде за инструкции как да се направи това нещо. Тъй като тези библиотеки са толкова големи, те се разбиват на подсекции, така че не е нужно да зареждате цялото нещо. Така че в този случай се зареждат следните библиотеки и подсекции:

  • using System; — това зарежда функциите на най-високото ниво на библиотеката, наречена System.
  • using System.Collections.Generic; — това зарежда функциите в раздела Generic, който е подраздел на раздела, наречен Колекции, което е подраздел на библиотеката, наречена Система.

С информацията по-горе можете да познаете какво се случва с останалите три реда код.

В миналото, гледайки кода по подразбиране и разбирайки какво означава той, започна да се появява чувството Забравил съм всичко, което съм научил. Така че, както преди, нека преминете през всеки един:

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

Има някакъв код, написан вътре във функцията Main и тъй като това е само placeholder код, ще го изтрием.

Добре, нека създадем няколко променливи:

  • x и задайте неговия тип данни на цяло число
  • y и задайте неговия тип данни на integer
  • сума и задайте типа данни на цяло число

Написах това във фигурните скоби на метода Main:

int x;
int y;
int sum;

След това нека кажем на потребителя (наистина попитайте) какво искаме да въведе:

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

Сега трябва да вземем числотои да го присвоимкато стойностна променливатанаречена x . Също така трябва да се уверим, че въведеното число е число:

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

Превеждам:

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

Чувствам, че в този момент искам да видя дали мога да въведа стойност и да проверя дали е присвоена на x. И така, ще въведа следния ред и след това ще щракнете върху бутона Старт със зеления триъгълник, за да го стартирате:

Console.WriteLine(x);

Е, прозорецът изскочи, попита ме за номер, аз го въведох, натиснах клавиша Enter и той изчезна. Ако си спомням правилно, ако добавите реда Console.Read, прозорецът на конзолата ще остане отворен.

Добавих го, стартирах програмата и...РАБОТИ!! Добре! Първата написана програма! Е, първата част от първата програма, но все пак се чувствам добре!

(Между другото, натиснете отново клавиша Enter, за да затворите прозореца на конзолата.)

Така че ще оставя тези два „тестващи“ реда код, защото вероятно ще искам да ги използвам отново. Сега ще добавя още два реда, за да поискам второто число, като го присвоя на променливата y и също го конвертирам в 32-битово число . Също така ще добавя третата част, като събера двете числа заедно и ще присвоя тази стойност на променливата, наречена sum, по следния начин:

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

За да продължа тестването, добавих Console.WriteLine(y) и Console.WriteLine(sum) и след това стартирах програмата.

Аааа и....ПАК РАБОТИ!!!

Следващата част е да поиска две числа, отново и отново, докато потребителят въведе думата „изход“. Така че трябва да добавя цикъл и условие, което да бъде оценено. Както споменах по-рано, вече бях видял кода в приложението SoloLearn и затова знам, че то иска да използваме цикъла do-while. Това е добре и ще го направя, но искам първо да премина през мисловния си процес:

  • Когато видя необходимостта да направя цикъл, мигновената ми мисъл е да имам брояч, за да мога да кажа, ако броячът е равен на такова и това число, излезте от този цикъл.
  • В този случай обаче (и като знам какво знам за това, което искат да използвате), изречението наистина трябва да бъде, докато стойността на x НЕ Е равна на „изход“, продължете с добавяне на числата, показване на резултата и след това искане за още две числа. Така че цикълът do-while има смисъл.

Поглеждайки назад към бележките си от Част 4c, трябва да обвия двете заявки за числа, както и добавянето им, в рамките на цикъла do-while , като този:

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

Да, това не проработи. Дава ми следната грешка:

Операторът ‘!=’ не може да се прилага към операнди от тип ‘in’ и ‘string’

Ако тълкувам това правилно, това означава, че се опитвам да сравня променлива, която има тип данни цяло число, с такава, която има тип данни низ, и не можете да направите това. Какво ще стане, ако проверя стойността преди да я конвертирам в цяло число?

Тъй като ще искам да позволя на потребителя да въведе думата „изход“, трябва да задам типа данни x да започва като низ, така че промених int x до string x. След това, след Console.WriteLine(“Въведете първата стойност: “); написах:

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

Проблемът на този етап обаче е, че дори въведената стойност за x да е цяло число, типът данни x е низ. Следователно, за да мога да го добавя към стойността на друга променлива (чийто тип данни е вече зададен на цяло число), ще трябва да го преобразувам в цяло число. Когато го конвертирам обаче, ще трябва да го задам като стойност на нова променлива, чийто тип данни е цяло число.

  • За последователност ще задам типа данни на x обратно на integer и ще инициализирам нова променлива, наречена str (за първоначалната стойност, взета от потребителя) и задайте типа му данни да бъде низ.
  • В резултат на това ще трябва да променя x = Console.ReadLine(); на str = Console.ReadLine();
  • Също така ще трябва да променя if (x == “exit”) на if (str == “exit”)
  • Ако стойността на strне е „изход“, трябва да я преобразувам в цяло число(за да може да се добави към второто стойност, която ще бъде цяло число), и я задайте като стойността на x. Така че ще трябва да променя това:
x = Convert.ToInt32(Console.ReadLine());

до това:

x = Convert.ToInt32(str);

Когато кодът стигне до края, искам той да се върне в горната част и отново да премине през цикъла, и да продължи да стига до върха и отново да премине през цикъла. В този случай изразът if с ключовата дума break е това, което ще ни извади от цикъла do-while, не условието, което обикновено се появява в скобите след ключовата дума while (като това, което имах първоначално, това: while (x != “exit” || y ! = „изход“);

Въпреки това, все още трябва да поставите нещо в скобите, за да го накарате да започне отново цикъла. Затова ще добавя следното в края на цикъла do-while:

} while (true);

Също така ще коментирам двата реда относно отпечатването на стойностите на x и y на екрана.

Сега, когато стартирам кода, той работи от първия път, но когато натисна клавиша Enter и очаквам да стартира отново от началото, ми дава грешка, която гласи „Въвеждане низът не беше в правилен формат." и се отнася до реда от код, който казва:

x = Convert.ToInt32(str);

Потърсих в Google грешката и един отговор на подобен въпрос се позова на:

... низът, от който се опитвах да анализирам цяло число, всъщност не съдържа валидно цяло число.

Първата ми мисъл беше, че това, което се опитвах да направя, всъщност беше обратното, но грешката все още е в сила, както следва:

цялото число, от което се опитвах да анализирам низ, всъщност не съдържа валиден низ.

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

Проблемът сега е, че трябва да преобразувам цялото число обратно в низ, за да мога да преценя дали първоначалният вход е или не думата „изход“. Цялото това конвертиране изглеждаше твърде сложно и след като вече видях кода в приложението SoloLearn, знаех, че правилното решение е да декларирам променливата и да задам нейния тип данни едновременно време, когато питах потребителя за стойност.

Първо, трябва да премахна четирите декларации на променливи в горната част. Следното показва всеки ред код преди (вляво) и след (вдясно) промяната му:

  • str = Console.ReadLine(); ›››› низ str = Console.ReadLine();
  • x = Convert.ToInt32(str); ›››› int x = Convert.ToInt32(str);
  • y = Convert.ToInt32(Console.ReadLine()); ›››› int y = Convert.ToInt32(Console.ReadLine());
  • сума = x + y; ›››› int сума = x + y;

Това трябва да се направи, защото всеки път, когато програмата пита потребителя за първата стойност, тя ще присвои тази стойност на променливата str, която след това може да бъде проверена дали е равна или не за „изход“.

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

Наистина исках да знам повече за Console.Read(); така чепотърсих го в Google. Това, което според мен е най-приложимата точка тук, е, че тъй като Console.Read(); приема единичен знак (за разлика от Console.ReadLine() ;, което отнема цял ред), когато се докосне един клавиш, обикновено прозорецът на конзолата ще се затвори. В този случай обаче цикълът do-while кара кода в този цикъл да се изпълнява отново. Виждам къде това би било конфликт, но все още не съм сигурен защо грешката, която се показва, гласи това, което гласи.

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

С Console.Write(); въведената стойност ще бъде на същия ред като въпроса.

Има смисъл и затова актуализирах кода си.

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

Console.WriteLine(sum);

…те имат:

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

Въпреки че разбирам, че {0} се заменя с първата стойност на променливата sum, не съм сигурен защо ви е необходима, след като променливата сумата така или иначе има само стойност 1. Може просто да е по-ефективен (и, както съм виждал други описания да описват какво имам предвид, по-елегантен) начин за писане на кода, в подготовка за бъдеща употреба. Все пак бих искал това да бъде потвърдено.

Както и да е, ето моя последен, напълно работещ код:

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

Трябва да кажа, колкото и мислите ми (както е написано по-горе) да изглежда, че има много спирки и стъпки по пътя, това наистина е първата работеща програма, която съм написал, откакто започнах това пътуване. И това е доста вълнуващо.

Ако има нещо в моя мисловен процес, което смятате, че не е съвсем правилно, или смятате, че може да се нуждае от допълнително обяснение, моля, не се колебайте да ме уведомите.

Също така, ето връзка към предишната статия. Да се ​​научим да кодираме — Част 4d: Условни оператори и цикли — Прекъсване и продължаване и логически и условни оператори.