Введение в информатику и программирование. Первое знакомство с C#

Здравствуйте. Мы приступаем к изучению языка C# - одного из самых популярных и востребованных языков программирования в современной IT-индустрии. С его помощью можно решать широкий спектр задач - начиная с разработки "классических" оконных приложений и заканчивая программами для мобильных устройств, веб-сайтов и трёхмерной графики. Стоит отметить, что первое занятие по объёму и количеству текста будет больше, чем последующие, так как нам нужно ввести много базовых понятий и терминов, рассмотреть несколько важных фундаментальных вопросов и к концу занятия иметь возможность выполнять некоторые практические задачи на языке C#. Поэтому рассказать нужно много. Последующие занятия будут меньше по содержанию, но более сложные по материалу.

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

Любая программа на языке C# - это в первую очередь некоторый текст, написанный программистом. Далее, специальная программа выполняет некоторые манипуляции с этим текстом и в результате мы получаем готовое приложение, которое можно запустить на компьютере или другом устройстве. Это если простым языком, детальнее мы рассмотрим данный процесс чуть позже. Конечно, текст программ можно писать даже в обычном "блокноте" (Notepad), но гораздо удобнее воспользоваться специальной "Средой разработки". У каждого языка программирования есть своя среда разработки, а иногда даже несколько. Для C# основным инструментов для написания программ является специальное приложение Visual Studio компании Microsoft. Кстати говоря, сам язык C# также является разработкой Microsoft, что гарантирует его поддержку и дальнейшее развитие ещё на годы вперёд.

Скачать и установить Visual Studio можно по ссылке - https://www.visualstudio.com/. Актуальной на момент написания лекции - является версия 2017. Среда Visual Studio бесплатна для начинающих разработчиков, поэтому каждый может её скачать, установить и пользоваться её. Бесплатная версия называется Community и включает все основные инструменты необходимые нам в обозримом будущем. После загрузки установочного файла по приведённый ранее ссылки, необходимо его запустить и следовать дальнейшим инструкциям. Во время установки обратите внимание, на выбор компонентов, устанавливаемых вместе с Visual Studio. Необходимо выбрать пункты "Разработка классических приложений .NET". Если в будущем вы решите продолжить обучение в области разработки WEB-приложений (сайтов), то необходимо выбрать "ASP.net и разработка веб-приложений" как показано на рисунке ниже:

Image

После установки Visual Studio вы можете её запустить и создать свой первый проект. Как вы, наверное, поняли, язык C# позволяет разрабатывать абсолютно разные виду приложений. Мы же начнём изучение языка с создания так называемых "Консольных приложений". Вполне возможно, что ранее вы и не сталкивались с такими программами, но, когда-то давно, ещё до появления Windows и других операционных систем, которые поддерживают графические интерфейсы, существовали только такие, похожие на консольные программы. Выполнялись они в достаточно простой, без какого-либо интерфейса операционной системе Dos (или в одной из её разновидностей). Консольные приложения и сейчас существуют как в Windows, так и в других системах, например, в Unix или Linux. Вы всегда можете запустить консоль в Windows проделав два простых действия: нажать комбинацию клавиш на клавиатуре Windows+R (клавиша Windows обычно находится левее пробела, слева от клавиши Alt и позволяет открыть меню "Пуск" в Windows). В результате откроется окно "Выполнить", где можно вписать название программы, которую вы хотите запустить. Пропишите в этом окне слово "cmd" и нажмите кнопку "Ok", как показано на рисунке:

Image

В результате вы увидите приблизительно вот такое окно консоли Windows:

Image

В этом окне можно запускать различные консольные приложения, которые уже существуют в операционной системе или свои собственные. Например, напишите в консоли следующую команду: ping google.com. В результате вы увидите IP-адрес сервера сайта google.com и время отклика от него к вашему компьютеру (чем ниже время в миллисекундах, тем лучше). Выполнив эту команду вы запустили программу, которая называется ping. Есть и другие команды, например: tracert google.com. Эта команда позволяет узнать какой маршрут будет преодалён от вашего компьютера до сервера сайта Google.com. Как вы видите консольные программы практически не имеют никакого графического интерфейса. Кстати, слово "интерфейс" означает внешний вид и элементы управления, с помощью которых пользователь может взаимодействовать с программой или устройством. Весь интерфейс в консольных приложениях - это текст, который пользователь может вводить, а программа, в свою очередь, как-то на этот текст реагировать. Такая простота для нас сейчас необходима, чтобы начать учить язык программирования и не отвлекаться на пока что не нужные элементы графики. То есть принцип консольных приложениях заключается в том, что пользователь вводит какие-либо данные, а программа на них реагирует нужным образом.

Именно с таких приложений мы и начнём изучение языка C#

Создание проекта в Visual Studio

Каждое приложение, которое в будущем превратиться в программу, в Visual Studio называется проектом (project). Несколько проектов можно объединить в одно решение (Solution). Таким образом, если мы хотим начать писать новую программу сначала нужно создать решение (solution), которое будет содержать проект (project). Обычно одно решение содержит как минимум один проект, но как мы уже сказали, их может быть и несколько. Итак, чтобы создать новые проект-решение, нужно в главном меню Visual Studio выбрать пункт "Файл" (File), в открывшемся меню выбрать пункт "Новый" (New), а затем "Проект" (Project). Откроется окно, в котором мы должны выбрать тип проекта, дать ему имя (название) и место на жёстком диске (папку), где он будет сохранён.

В левой части этого окна вам нужно развернуть список Templates (Шаблоны), затем Visual C# и в центральной части окна выбрать Console Application (Консольное приложение). Внизу в поле Name укажите название проекта, например "Lesson1" и выберете папку, где он будет сохранён. В общем всё должно получиться как на изображении:

Image

В результате мы получим уже "практически готовую программу", даже с некоторым написанным кодом. Конечно, сейчас он для нас мало понятен, но кое-какие знакомые слова тут можно увидеть, например Program или Main. Скоро мы будем понимать всё, что здесь написано, но пока нужно знать следующее. Видите строчку, в которой есть слово Main?

static void Main(string[] args)

За ней есть открывающаяся фигурная кобка - символ {. Вот за этим символом мы будим писать наши первые программы. То есть после этой фигурной скобки начнётся выполнения написанных нами инструкций. Вообще, программирование, на первых порах можно представить как написание некоторых инструкций, которые компьютер будет "выполнять". Инструкции должны быть записаны правильно, иначе компьютер их не сможет понять, а в тем более выполнить. Каждая такая инструкция выполняется одна за одной. Компьютер будет "читать" их как книгу и пытаться выполнить. Но прежде чем мы выучим и напишем первую инструкцию, нужно в общих чертах понять - а что мы вообще собираемся писать, что можем делать, как это будет происходить с точки зрения компьютера и ответить на другие вопросы

Для начала, давайте ответим на вопрос - а какие задачи могут решать написанные нами программы? Конечно, ответ на этот вопрос может оказаться очень объёмным - нас окружает миллионы разных программ, решающих абсолютно разные проблемы и задачи. Но во всех этих программах есть что-то общее, а конкретно три вещи. Каждая программа так или иначе работает с информацией. Информация тоже может быть очень разной: текст, звук, числа, видео, изображения и т.д. Любая программа так или иначе должна хранить ту информацию, с которой ей предстоит работать. Таким образом первая задача, которую решает абсолютно каждая программа - это хранение информации. Но, что делать с этой сохранённой информацией? Вторая задача - это обработка хранимой в программе информации. И третье - информация как-то должна в программу попасть, а результаты обработки, которые также представляются в виде некоторой информации - отображены пользователю. Итак, если кратко, можно сказать, что любая программа работает с информацией и должна решать связанные с ней три задачи:

1. Хранение информации

2. Обработка информации

2. Ввод (в программу) и вывод (из программы) информации

Если подумать, то действительно любая программа решает эти задачи, и мы тоже, обязательно научимся их решать с помощью наших программ. Мы часто повторяли слово "информация" и не зря - ведь это основа программирования. От этого слова даже пошла наука "Информатика", которую изучают даже в школах. Для нас же важно понять, что такое информация для компьютера и как он с ней может работать.

Для человека - информация это набор слов, образов, знаний, изображений, звуков. Для компьютера же, информация это набор нулей и единиц. Действительно, компьютер устроен таким образом, чтобы работать исключительно с нулями и единицами. Всё что мы видим на экране монитора так или иначе тоже закодировано этими двумя цифрами. Число 0 или 1 - это минимально возможная единица информации, которая называется БИТ. То есть один бит - это некоторое значение, которое может быть равно либо 0, либо 1. Это очень мало, но образуя комбинации битов, то есть нулей и единиц, можно закодировать практически всё что угодно. Чем больше нулей и единиц, то есть битов необходимо для кодирования той или иной информации, тем больше её "размер". Получается, что информацию можно измерить, как например, длину или вес какого-нибудь предмета. И для удобства введены разные единицы измерения информации - ведь если измерять только в битах, то мы будим получать очень большие числа, с которыми не удобно работать. Следующая по величине за битом единица информации - это байт. В одном байте - 8 бит. Это означает что 1 байт может хранить комбинацию из восьми нулей и единиц, например 11010011 или 00110110. Но как же понять, что означают эти нули и единицы, и какую информацию вообще можно закодировать с помощью одного байта? Разная информация может кодироваться множеством разных способов. Но, для примера, представим, что кодировать необходимо обыкновенные целые числа, например 8, или 92, 148. Такие числа, которыми все мы привыкли пользоваться, называются десятичными числами или числами, записанными в десятичной системе исчесления. Почему десятичной? Потому что для их записи используется десять цифр - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. Все остальные числа образуются путём комбинаций этих десяти цифр. Но давайте представим себе, что цифр не 10, а допустим 8. Тогда, говорят, что используется восьмеричная система исчисления, и цифр 8 и 9 в ней нет и быть не может. Тогда счёт в ней будет вестись следующим образом: 0, 1, 2, 3, 4, 5, 6, 7, 10, 11, 12, 13, 14, 15, 16, 17, 20 и т.д. Как видно, после числа 7 идёт сразу 10, потому что в восьмеричной системе нет цифр 8 и 9. Но число 10 в восьмеричной системе исчесления будет соответствовать числу 8 в десятичной, которой мы привыкли пользоваться. Может быть и наоборот, что цифр больше 10, например, шестнадцатеричная система исчисления, в которой аж 16 цифр (часть которых записывают буквами): 0 1 2 3 4 5 6 7 8 9 A B C D E F. Числа в шестнадцатеричной системе исчисления могут выглядеть так: 7А или FF23A. Непривычно? Да, но многие такие нестандартные системы исчисления используются на практике, в том числе в программировании и в других науках. А вот компьютер работает в самой простой - двоичной системе исчисления, в которой всего две цифры - 0 и 1. Давайте представим, как будет выглядеть порядок чисел в таком случае: 0 (соответствует 0 в десятичной системе), 1 (соответствует 1 в десятичной системе). Что дальше? Цифры в двоичной системе уже кончились, поэтому далее идёт сразу 10 (соответствует 2 в десятичной системе), затем 11 (3), затем 100 (4), 101 (5), 110 (6), 111(7), 1000 (8), 1001 (9), 1010 (10) и т.д. Для людей это конечно же очень непривычно и не удобно, но для компьютера, который хранит информацию в битах - это лучший вариант. Если мы продолжим такой счёт далее, то в какой-то момент дойдём до числа 11111111, что соответствует максимально возможному числу, которое можно записать в 1 байт. Это число соответствует десятичному числу 255. Итак, получается, что максимально в 1 байт информации можно записать число 255, или, можно сказать, что в 1 байт можно записать любое целое десятичное число в пределах от 0 до 255. Так же верно следующее утверждение: с помощью 8 бит можно закодировать любое число от 0 до 255 (т.к 1 байт равен 8 битам). Байт, это конечно больше чем бит, но всё равно сравнительно мало. Существуют и гораздо большие единицы измерения информации:

1 килобайт = 1024 байта

1 мегабайт = 1024 килобайт

1 гигабайт = 1024 мегабайт

1 терабайт = 1024 мегабайт

1 петабайт = 1024 терабайт

Теоретически информации может быть бесконечно много (как и чисел), поэтому этот список можно было бы продолжать, далее идут: эксабайт, зеттабайт, йоттабайт и т.д., но запоминать эти названия уже необязательно, т.к. это слишком много и на практике не используется.

Теперь мы представляем себе с чем будут иметь дело наши программы - фактически с набором нулей и единиц, то есть с битами и их комбинациями - байтами. Но не стоит пугаться - программы действительно будут работать на таком "низком" уровне, но писать мы их будем используя привычные понятия, такие как десятичные числа, которые автоматически будут "кодироваться" байтами (которые состоят из 8 бит) и ничего для этого специально делать не нужно. Но понимание (и признание) этих фактов помогут помочь понять нам как именно решаются задачи хранения информации программами, которые мы будим писать. Если с термином "информация" с точки зрения компьютера всё более-менее понятно (ещё раз - это набор нулей и единиц, то есть бит, объединённых в байты), то остаётся ещё один вопрос - а где эта информация храниться непосредственно в компьютере? Таких устройств может быть несколько. Первое что приходит в голову - это жёсткий диск (hard drive), который позволяет хранить наши с вами файлы и папки, музыку и фильмы, документы и изображения. Вся эта информация тоже храниться в двоичном виде, то есть в виде нулей и единиц. Но, программы, как это не странно, не используют жёсткий диск для хранения информации с которой работают - для этого используют другое устройство, которое называется "Оперативная память". Зачем же нужна эта оперативная памяти, и почему бы программам не хранить обрабатываемую информацию на жёстком диске, как всё остальное? К тому же если посмотреть на размеры жёстких дисков и оперативной памяти, то видно, что жёсткие диски гораздо больше "по объёму" возможной хранимой информации. Например, современный компьютер может быть оснащён жёстким диском в несколько терабайт (тысячи гигабайт). Тогда как оперативная память имеет объём до 8-16 гигабайт, очень редко больше. То есть жёсткий диск способен хранить гораздо больше информации чем оперативная память. У оперативной памяти есть ещё один недостаток - это энергозависимая память, то есть, каждый раз, когда мы выключаем компьютер всё содержимое оперативной памяти, вся информация бесследно исчезает. Зачем же нужна такая "небольшая", "недолгая" и на первый взгляд "бесполезная" память. Смысл в том, что оперативная память ОЧЕНЬ быстрая, особенно в сравнении с обыкновенными жёсткими дисками. Это делает её необходимым устройством любого компьютера. Наши программы "сохраняют" информацию в оперативную память и "считывают" из неё с максимальным быстродействием. Кстати, стоит отметить, что и сами программы при запуске "копируются" в оперативную память, хотя сами хранятся на жёстком диске. То есть при запуске любой программы происходит её считывание с жёсткого диска и копирование в оперативную память - этот процесс часто называют "загрузкой" программы. В процессе работы, программа дополнительно может хранить информацию с которой работает тут же. Что же представляет из себя оперативная память? Технически, конечно, это сложное устройство принцип работы которого нам понимать не обязательно. Но, важно понимать - чем является оперативная память для программ, которые мы пишем. С точки зрения программы и языка программирования, оперативная память - это набор "ячеек" (как ящик в шкафу). Каждая такая ячейка может хранить некоторое количество информации (содержимое ящика в шкафу). При этом все ячейки пронумерованы (как ячейки в камере хранения в супермаркете). Номера ячеек называют их "адресами". То есть каждая ячейки имеет свой собственный адрес. Ячейки небольшого размера - всего 1 байт каждая. То есть в одну ячейку, имеющую свой адрес, можно поместить всего на всего 8 бит (8 нулей или единиц) или 1 байт. Понятно, что 1 байт это мало, и даже для хранения чисел больше 255 нужно больше байт. Поэтому программы могут использовать сразу несколько ячеек одновременно и хранить большее количество информации.

Каждый раз, когда программа должна сохранить какую-либо информацию в оперативной памяти, она должна знать - где (по какому адресу) это можно сделать и сколько ячеек (байт) потребуется. При чтении информации точно также нужно знать где она была сохранена (в какой ячейке, то есть по какому адресу) и сколько байт необходимо "считать". Так как таких ячеек очень много, программисту было бы очень неудобно и сложно помнить их адреса, которые выглядят как очень большие числа. Представьте себе гигантскую камеру хранения из миллиардов пронумерованных ячеек, в некоторые из которых вы положили свои вещи и, через несколько дней вам нужно вспомнить где что лежит. Справедливости ради стоит отметить, что раньше, когда объёмы оперативной памяти были куда меньше, а языков высокого уровня, как C# не существовало, процесс программирования так приблизительно и выглядел, то есть все действия с данными в ячейках оперативной памяти осуществлялись на уровне указания адресов. Но со временем развития компьютерных технологий и роста доступного объёма памяти подобные задачи стали слишком сложными и в языках появилось такое понятие как "переменная"

Итак, давайте дадим определение этому важнейшему в программировании термину, а затем поясним его простыми словами. Переменная - это именованная область оперативной памяти, имеющая имя (идентификатор), тип (информации), значение (сама информация или данные), размер (в байтах) и адрес. Теперь по порядку. Переменные нужно для более простого доступа к оперативной памяти при написании программ. Чтобы не запоминать огромные и неудобные числа-адреса, с помощью переменных им можно дать какое-то имя. Например, если в программе нужно сохранить зарплату сотрудника, то для этого можно ввести переменную с названием Salary, или для сохранения оценки ученика в школе переменную с именем Mark. Такие осознанные имена гораздо проще запомнить и пользоваться, чем непонятными числами. Поэтому переменные и называют "именованными ячейками памяти", так как некоторым ячейкам присваивается имя. Но не любое имя можно дать переменной. Существует несколько ограничений, которые нужно соблюдать:

1. Имя переменной не должно начинаться с цифры. Например, 4car, 9student - это неправильные имена. Но цифру можно использовать в любом другой месте. Например, car4 уже будет считаться верным.

2. В имени переменной нельзя использовать никакие знаки препинания, кроме нижнего подчёркивания. То есть нельзя использовать точки, запятые и другие знаки, в том числе и пробелы. Если имя должно состоять из нескольких слов, принято каждое новое слово в имени начинать с заглавной буквы. Причём первая буква в имени обычно прописная. Это не обязательное для языка требования, но существуют некоторые рекомендации, которые крайне желательно соблюдать и это одна из них. Ещё одно - чем длиннее имя переменной, чем точнее оно объясняет что именно будет храниться в памяти, доступ к которой мы получим с её помощью, тем лучше. Например, имена "a", "c2" и т.д. не очень хорошие, так как не понятно - что они обозначают. Тогда как "studentMark" или "carColor" гораздо лучше. Стоит отметить, что язык C# чувствителен к регистру. То есть заглавные и прописные символы считаются разными. И имя "CarColor" будет уже другим именем нежели "carColor" (второй вариант предпочтительнее). Итак, имя "car Color" - не верно, т.к. в нём используется пробел. Также не верно "Student-mark", здесь используется символ "-". Допустимо такое имя - "Student_mark", но в современном программировании символ нижнего подчёркивания не принято использовать при именовании.

Других ограничений по именам, которые можно давать переменным нет. Старайтесь давать понятные имена - чем длиннее, тем лучше. В английском языке переменные называют "variable", а их имена называют идентификаторами (Identifier).

Вторая важная составляющая каждой переменной - это тип (type), или просто - тип переменной. Каждая переменная должна иметь тип. Имеется ввиду тип той информации, которая будет с помощью переменной сохранена в оперативной памяти. Мы уже сказали, что информация бывает разная, то есть разных видов или типов, например, текст, числа, фотографии, звук и т.д. Мы должны "помочь" компьютеру и указать, какой тип информации должен быть сохранён. В зависимости от этого информация будет закодирована в битах соответствующим образом, а также будет использовано нужное количество ячеек (байт) оперативной памяти.

Типов в языке C# огромное множество. К тому же программисты имеют возможность создавать свои, новые типы. Поэтому все типы делятся на "фундаментальные" (которые существуют изначально в самом языке программирования) и "пользовательские" (которые создают программисты, то есть пользователи языка). Основных фундаментальных типов немного, а для начала мы познакомимся только с самыми важными. Перечислим их.

short - тип, позволяющий сохранить небольшое ЦЕЛОЕ число. Почему небольшое? Указывая, что нам нужна переменная этого типа, в оперативной памяти будет использовано всего 2 байта информации. Помните, что с помощью 1 байта можно закодировать максимум число 255? С помощью 2 байт можно закодировать максимально число ‭65 535‬. Кроме этого, у нас есть ещё и отрицательные числа (со знаком минус). Поэтому диапазон чисел, которые можно сохранять с помощью переменных типа short - от -32 768 до +32 767. Это немного, но для некоторых понятий, этого может быть достаточно, например, для возраста человека, или для месяца в году.

int - Этот тип тоже позволяет сохранить целые числа, как и short. Разница лишь в том, что размер такой переменной (то есть количество ячеек, занимаемых в оперативной памяти) в два раза больше - 4 байта. Это позволяет хранить числа уже гораздо большего диапазона: от -2 147 483 648 до +2 147 483 647. Стоит отметить, что этот тип самый распространённый при программировании. Его название int - это сокращение от английского слова integer (целое)

long - Также как short и int, этот тип тоже предназначен для хранения целых чисел, но ещё более больших за счёт использования уже 8 байт. Возможный диапазон от -9 223 372 036 854 775 808 до +9 223 372 036 854 775 807.

Конечно не нужно запоминать с абсолютной точностью диапазоны доступные для этих чисел, нужно хотя бы приблизительно представлять их пределы. Но их названия - short, int и long запомнить стоит обязательно. В зависимости от задачи и ситуации программист должен выбрать оптимально подходящий тип для переменной.

Мы рассмотрели типы данных, предназначенные для хранения информации в виде целых чисел. Но есть и дробные числа, которые можно хранить в виде десятичных дробей. Для них предназначены отдельные типы, которые отличаются точностью. Чем больше знаков после запятой можно сохранить в переменной - тем более точный тип и больше потребление памяти. Мы не будим приводить доступные диапазоны, а лучше скажем - когда стоит применять тот или иной тип:

float - используется для задания мер измеряемых величин (вес, расстояние, скорость и т.д.), а также для указания координат в пространстве (например, в 3d графике). Самый маленький по потреблению памяти тип.

double - используется при расчётах различных математических выражений и функций, таких как косинус, синус и других. Если речь идёт о математике, то помните, что использовать нужно тип double.

decimal - самой "точный" тип дробных чисел. Используется обычно при указании финансовых величин: курсов, стоимости, индексов акций и т.д.

Слово float - можно перевести как "плавающий". Переменные этого типа часто называют "числами с плавающей запятой". Такое название дано из-за особенностей кодирования таких чисел с помощью нулей и единиц, где информация о запятой "как бы плавает" по этим битам. Про тип double - часто говорят, что он позволяет хранить "числа с плавающей запятой с удвоенной точностью". Такие термины вы можете встретить в книгах или где-нибудь ещё.

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

Конечно, есть и другие типы, их мы будем рассматривать позже по мере необходимости. Вышеперечисленных пока нам будет вполне достаточно.

Ещё раз - каждая переменная должна иметь тип. Нужно обязательно запомнить названия этих типов (short, int, long, float, double, decimal, string) и для чего каждый из них используется.

Теперь мы понимаем, что переменные нужны для хранения информации в оперативной памяти и каждая переменная имеет тип и имя. Но что для этого нужно предпринять на практике. Как "запрограммировать" переменную? Оказывается очень просто. Для этого нужно в программе нужно написать тип переменной и придумать имя:

short studentMark;

Здесь short - эти тип переменной, то есть тип информации, которую мы хотим сохранить с её помощью, а studentMark - имя переменной. Ещё, как видно, после этого стоит символ точки с запятой ";". Его можно воспринимать как точку в конце предложений в естественных языках. Если быть точнее, то точка запятой обозначает "конец инструкции". Помните, мы говорили, что программирование для программиста - это написание инструкций, которые компьютер последовательно "считывает" и "выполняет"? (на самом деле, конечно это происходит намного сложнее, но для простоты можно воспринимать именно так). Так вот строчка "short studentMark;" и есть такая инструкция, написав которую компьютер в последствии выполнит. Приведём ещё пример:

int Salary;

Это инструкция "выделяет" в оперативной памяти компьютера 4 байта, доступ к которым будет осуществляться в программе по имени Salary. Для программиста, это означает что с помощью такой переменной планируется хранение информации о чьей-то зарплате и что её диапазон может быть в пределах двух миллиардов. Такие строчки называют "ОБЪЯВЛЕНИЕМ ПЕРЕМЕННЫХ". По-английски - declaration variable. То есть мы как бы "объявляем" (или "декларируем"), что хотим использовать оперативную память для хранения информации указанного типа и с указанным именем. Дальше мы не будем говорить так сложно (но должны об этом помнить). Вместо этого будем использовать более простое выражение - "объявление переменной". Например, если мы скажем "объявить переменную age типа int", это будет означать, что необходимо написать следующую инструкцию:

int age;

Не забываем про точку запятой в конце инструкции. Где же такие инструкции нужно писать? Помните - вы уже должны быть открыть Visual Studio и создать в нём новый проект? Давайте вернёмся к нему и найдём фигурную скобку "{" которая идёт за строчкой, содержащей слово main. Вот после фигурной скобки и можно писать наши первые инструкции:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Lesson1 { class Program { static void Main(string[] args) { int age; } } }

Видите, где в примере выше написано "int age"? Вы тоже можете это сделать. Если в процессе вы допустите какую-либо ошибку, например, вместо "int", напишите "it" или "INT" (большими буквами), то Visual Studio подчеркнёт эту строчку красным - как ошибки в программе Word. Только здесь подчёркиваются не верные инструкции для языка C#, а не орфографические ошибки. Итак, мы объявили нашу первую переменную. Но что теперь можно с ней делать дальше? Смысле переменных в том, что с их помощью мы можем сохранить в оперативной памяти какую-либо информацию (а позже и совершать с этой информацией некоторые действия, то есть обрабатывать её). Может показаться, что переменная, которую мы объявили вроде бы как не содержит никакой информации - ведь никаких действий больше не предпринимается. На самом деле, переменные некоторых типов изначально что-то хранят. Например, для целых типов - только что объявленные переменные уже хранят 0, а для строк - это будет пустая строка. Вы можете возразить - какая же это информация, 0 - это отсутствие чего-либо, а пустая строка вообще не несёт какой-либо информации. В какой-то степени вы правы, но всё-таки 0, или пустая строка для компьютера это тоже информация. Ведь всё кодируется битами - нулями и единицами. И бит, который равен 0 получается хранит информацию о том, что в нём сохранён 0. Звучит несколько необычно, но в программировании отсутствие информации - это тоже информация. Поэтому абсолютно допустимо сказать, что переменная age, которую мы объявили, сейчас хранит 0.

То, что хранит переменная (то есть информация в памяти, доступ к которой осуществляется с помощью переменной) - называется "ЗНАЧЕНИЕМ" (value). Значения должны быть в допустимых пределах для типов переменных и подходящих типов. Например, нельзя сохранить значение в виде строки в переменную, которая имеет тип int (целое число) или наоборот. Тип значения должен совпадать с типом переменной. Но как же сохранить в нашу переменную вместо нуля какую-нибудь другую информацию, то есть изменить значение переменной? Оказывается, тоже достаточно просто. Измените строку с объявлением переменной следующим образом:

int age = 25;

Теперь объявленная переменная age будет хранить значение 25. Значок "равно", хорошо знакомый нам с детства, в языке C# называется "ОПЕРАТОРОМ ПРИСВАИВАНИЯ". Что такое "оператор" мы обсудим чуть позже. Присваивание - это действие, означающее, что значение справа от него должны быть присвоено переменной слева от него. То есть число 25 "присваивается" (или записывается) в переменную age (если быть ещё точнее - в ячейки памяти, которым мы дали имя age). Оператор присвоение можно воспринимать как слова "сохранить", "записать". Но правильнее всего всё-таки говорить "присвоить". Итак, инструкцию написанную нами можно прочитать как "объявить переменную age типа int и присвоить ей значение 25." Именно так будет проговаривать про себя данную инструкцию программист. Как вы заметили, получается, что переменную можно объявить и не присваивать ей никакого значения (тогда оно будет 0) или объявить с присвоением. Про первый случай говорят, что объявляется переменная без инициализации. Про второй, что объявляется переменная с инициализацией. Слово "инициализация" означает задание переменной начального значения, то есть что она должна хранить заданную информацию с самого начала своего существования.

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

age = 26;

Эта инструкция означает, что нужно присвоить (записать) значение 26 в переменную age. Нужно понимать, что старое значение (25), которое раньше хранилось в этой переменной бесследно исчезнет и будет заменено на новое (26). Если бы мы написали вместо этой строки:

int age = 26;

то это было бы ошибкой, так как означало бы что мы хотим объявить ещё одну переменную age. Логично предположить, что двух переменных с одинаковым именем быть не может, ведь каждая переменная отвечает за свою область оперативной памяти, и если бы разные области имели одинаковые имена, то непонятно - к какой имени области нужно обращаться.

Также ошибкой было бы, если бы мы написали так:

age = 27; int age;

Ошибка заключается в том, что сначала происходит обращение к переменной, а только потом её объявление. Можно сделать вывод, что нельзя обращаться к переменной до её объявления. Сначала нужно объявить переменную и уже потом использовать.

Напишем ещё одну инструкцию:

string message = "Hello world";

Эта строчка выглядит более сложной, но по смыслу она похожа не предыдущие. Читать её нужно так: объявить переменную message типа string и присвоить ей значение "Hello world". Проще говоря, мы объявили переменную для хранения строки текста и присвоили ей фразу "Hello world". Обратите внимание, что строки в языке C# записываются в двойных кавычках. Без них тоже была бы ошибка в программе. Давайте объявим ещё одну целую переменную:

int yearOld;

Надеюсь, вы уже чётко понимаете что означает эта инструкция. Теперь изменим её так:

int yearOld = age;

Что же происходит здесь? Возможно вы уже догадываетесь, но всё-таки проговорим. Прочитать эту строчку нужно так: присвоить значение переменной age переменной yearOld. Вы же помните, что было в переменной age? Число 27. Данная инструкция считала из оперативной памяти переменной age имеющееся значение и присвоила его переменной yearOld. Теперь в обеих переменных храниться число 27. То есть мы скопировали значение из одной переменной в другую.

Итак, мы теперь знакомы с первым элементом, из которого состоит любая программа - возможность хранения информации. Мы можем объявлять (или, можно сказать, создавать) столько переменных сколько потребуется (на самом деле есть некоторый предел, но об этом в другой теме) и хранить в них информацию. Теперь поговорим про следующий элемент - ввод/вывод информации.

Как вы помните, проект, который мы создали относится к консольным проектам. Поэтому с точки зрения ввода/вывода информации нам доступен только текст, вводимый с клавиатуры пользователем (потенциальным человеком, который будет использовать наши программы) и выводимый на консоль. Для вывода информации на консоль чаще всего используется инструкция Console.WriteLine(...); где вместо многоточия мы должны указать значение или переменную, содержимое которой нужно вывести на консоль. Напишем следующую инструкцию:

Console.WriteLine("Hello world");

Данная инструкция означает, что программа должна будет вывести на консоль фразу "Hello world". Как же её увидеть? Чтобы выполнить написанную нами программу необходимо в окне Visual Studio нажать клавишу F5 на клавиатуре. Это приведёт к запуску некоторых процессов, подробнее о которых мы поговорим в следующем уроке, но, в результате, программа, которую мы написали должна будет выполниться. Если вы это сделаете прямо сейчас, то вполне вероятно, что ничего и не заметите. Возможно, на долю секунды вы увидите чёрное окно, которое тут же исчезает - вот это и есть наша программа, которая выполнилась. Почему же мы не увидели фразу "Hello world" и почему окно сразу закрылось? Дело в том, что наша программ выполняет последовательно все написанные нами инструкции, и после выполнения последней её работа заканчивается и окно закрывается. Чтобы этого избежать, нужно написать ещё одну инструкцию:

Console.ReadKey();

Если сейчас снова запустить (выполнить) программу с помощью клавиши F5, то мы увидим чёрное окно консоли, в котором будет написано Hello world.

Image

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

Image

Некоторые инструкции могут быть подчёркнуты зелёной линией - это не означает наличие ошибки, а лишь подозрительную (с точки зрения Visual Studio) инструкцию. В данном случае "зелёным" подчёркнуто объявление переменной message. Это произошло потому, что мы объявили переменную (то есть использовали память), но нигде её не использовали, что вызвало некоторые подозрения у Visual Studio. Пока не будем обращать на это внимания.

Итак, теперь у нас есть первая программа, которую мы смогли запустить и увидеть некоторый результат её работы. Давайте ещё поговорим про то, как можно осуществлять вывод информации на консоль. Напишем следующую инструкцию:

Console.WriteLine(message);

Здесь мы выводим на консоль информацию, которая содержится в переменной message. Помните, что храниться в этой переменной? Тоже фраза "Hello world". Если сейчас запустить программу, то в консоли мы уже увидим две одинаковые строки. Обратите внимание, что инструкция Console.ReadKey(); должна оставаться последней - именно она не даёт программе закрываться после завершения основной работы и ожидает нажатия пользователем любой клавиши. И только после этого закрывается. Похожим образом мы можем выводить на консоль содержимое других переменных, в том числе хранящих числа:

Console.WriteLine(yearOld);

Попытайтесь сами понять, что выведет на экран (консоль) эта инструкция? (ответ - Число 26).

Кроме Console.WriteLine(...); выводить информацию можно с помощью ещё одной записи - Console.Write(...);. Разница будет в том, что после выполнения не будет осуществлён переход на новую строку. Например:

Console.Write("Your age: ");
Console.Write(age);

выведет в консоль в одну строку "Your age: 26". Какой вариант выбрать - зависит от задачи. Иногда удобнее использовать WriteLine, иногда Write. Кроме этого можно написать просто:

Console.WriteLine();

Как видно в скобках ничего нет, но это означает, что мы сделали вывод пустой строки. С помощью такой записи можно пропустить одну строку в консоли и следующий вывод:

Console.Write("New Line");

будет уже через одну строку. Попробуйте сами - и всё станет сразу понятно.

Вообще говоря, при изучении программирования очень важно экспериментировать. Сейчас вы уже можете начать это делать - кое что вы уже умеете. Попробуйте объявить разные переменные, записывая в них разные значения. Попробуйте выводить их на консоль. Такие эксперименты очень важны чтобы избавиться от "страха" перед программированием, который очень у многих есть на первых парах, а также это даёт лучшее понимание рассмотренных понятий.

Надеюсь вы прислушались к этой рекомендации и после некоторых экспериментов продолжайте читать дальше.

Как вы поняли, чтобы задать какой-нибудь текст переменной или вывести его на экран, он должен быть записан в двойных кавычках. Но что, если нужно в самом тексте взять в кавычки какое-либо слово? Например, нам нужно слово world выводить на консоль в кавычках. Такая запись будет неверной: Console.WriteLine("Hello "world"");

Для решения подобной проблемы существуют специальные символы, которые называются escape-последовательности. Это специальные знаки, которые можно написать внутри строки, и они приведут к некоторым её изменениям. Все такие знаки начинаются с символа \. Например, если внутри строки необходимо вывести кавычку, то нужно написать \" . То есть:

Console.WriteLine("Hello \"world\"");

Существуют и другие такие знаки escape-последовательности. Перечислим самые важные из них:

\n - переход на новую строку. Например:

Console.WriteLine("Hello\n\"world\"");

Слово Hello будет на одной строке, тогда как "world" в кавычках уже с новой строки

\" - вывод двойной кавычки, о которой уже сказано выше

\' - вывод одинарной кавычки

\\ - вывод символа \. Так как с него начинаются все escape-последовательности, для его вывода в строке нужно использовать такую запись.

Теперь мы умеем выводить информацию на консоль - как произвольную, так и ту, что хранится в переменных. Теперь рассмотрим обратную ситуацию, когда пользователь ВВОДит некоторую информацию в программу. Для ввода информации в программу, принято сначала вывести на консоль некоторое сообщение, которое даёт пользователю понять, что он должен будет вводить. После этого информация должна быть считана с консоли и записана в какую-либо переменную. Сам процесс считывания выполняется с помощью операции Console.ReadLine(); Рассмотрим пример. Допустим, мы хотим спросить у пользователя - как его зовут, а затем программа должна будет поздороваться с пользователем по имени. Напишем следующие инструкции:

Console.WriteLine("Enter your name: ");

Здесь мы сначала даём понять, что пользователь должен будет ввести. Затем объявим переменную в которую в последствии сохраним имя пользователя:

string userName;

И теперь считаем введённое имя с консоли и присвоим его этой переменной:

userName = Console.ReadLine();

Остаётся поздороваться с пользователем:

Console.Write("Hello, ");
Console.Write(userName);

Этот пример может показаться чуть более сложным, но постарайтесь понять каждое действие, которое здесь происходит. Особенно сложной может показаться строка с Console.ReadLine(). Тут на самом деле выполняется несколько действий - считывание введённой пользователем строки из консоли и её запись (присвоение) в переменную userName.

Эту программу можно немного улучшить, объединив это действие ещё и с объявлением переменной:

string userName = Console.ReadLine();

То есть вместо двух инструкций написать одну - которая и считывает строку и присваивает её переменной, которая тут же и объявляется.

Попробуйте теперь сами написать подобный код, чтобы спросить у пользователя его фамилию и выполните программу. Для того чтобы в консоли ввести строку, наберите её с клавиатуры и нажмите клавишу Enter.

Если подобное повторить с возрастом, то тут нас ждёт неприятный сюрприз:

Console.WriteLine("Enter your age:" );
age = Console.ReadLine();

Напишите этих две инструкции в своей программе в Visual Studio и вы заметите, что в последней строчке возникает ошибка. Как же так, ведь только что точно такой код работал? Всё дело в том, что Console.ReadLine() считывает информацию в виде строки (то есть типа string), а переменная age имеет тип int, то есть целое число. Возникает проблема с несовместимостью присваиваемых значений по типу. Нельзя строку присвоить числу. Чтобы избавиться от этой проблемы, необходимо написать что-то ещё. Что-то для преобразования введённой строки в число (если это, конечно, возможно). Исправим последнюю инструкцию так:

age = int.Parse(Console.ReadLine());

Тут появилось новое действие int.Parse(...). Здесь int - тип данных, в который нужно преобразовать строку; Parse - указывает на действие, называемое в жаргоне "парсингом". Слово пасинг (parsing) означает преобразование текстовой информации в информацию другого типа. В нашем случае в число. В скобках же у Parse указана строка, которую необходимо преобразовать в число. Вы можете возразить, что в этих скобках не строка, а операция Console.ReadLine(). Но Console.ReadLine() как раз и делает что считывает из консоли строку, поэтому на месте этой операции можно представить, что и окажется введённая пользователем строка (значение типа string), которое и будет преобразовано в число с помощью Parse. Конечно, если пользователь введёт в консоль вместо числа строку, в которой будет содержаться какой-нибудь посторонний символ, преобразование не удастся, и программа просто-напросто закроется с ошибкой. В будущем мы научимся проверять - а возможно ли вообще такое преобразование, но, пока остановимся на таком варианте. Итак, чтобы считать с консоли число, нужно выполнить следующие действия: собственно, считать из консоли строку, преобразовать её в число, присвоить полученное число переменной целого типа. И всё это одной инструкцией. Давайте допишем ещё одну инструкцию, которая позволит вывести полученный от пользователя возраст и сверим весь код, который должен быть написан вами в нашей программе:

Image

Теперь мы умеем не только хранить информацию в программе с помощью переменных, но и выводить её на консоль, а также получать её от пользователя. Осталось последнее - научиться совершать с этой информацией какие-либо действия.

Конечно, вам знакомы ещё со школы такие математические действия как сложение (+), вычитание (-), произведение (*) и деление (/). Эти простейшие действия также лежат и в основе программирования. Значения, которые мы храним в переменных также можно складывать, перемножать, вычитать и делить. Рассмотрим некоторые примеры, которые, уверен, сразу будут вам понятны:

int summa = 5 + 90;

Здесь мы вычисляем сумму двух чисел 5 и 90 и результат присваиваем объявленной переменной summa.

age = summa / 5;

Здесь мы делим число, которое храниться в переменной summa на 5 и результат присваиваем переменной age.

age = age + 1;

Здесь мы к числу, которое находится в переменной age прибавляем 1 и результат присваиваем снова переменной age. Ответьте на вопрос, что будет в переменной age после выполнения всех этих инструкций? А затем убедитесь с помощью программы, что вы ответили правильно.

Выполнять эти арифметические действия можно и при выводе на консоль:

Console.WriteLine(age * 2);

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

При записи таких арифметических выражений, как и в математике в школе можно использовать круглые скобки:

Console.WriteLine((2+2)*2)

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

В этих примерах мы используем целые числа, поэтому нужно учитывать, что при делении мы тоже будем получать целое, даже если деление "нацело" не возможно:

Console.WriteLine(5 / 2);

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

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

Console.Write("Hello, ");
Console.Write(userName);

оказывается можно делать так:

Console.Write("Hello, " + userName);

Здесь к строке "Hello, " мы добавляем содержимое переменной userName и в результате получаем новую строку, которую и выводим на консоль.

Также можно выполнять сложение строки и числа:

Console.WriteLine("Your age: " + age);

В таких случаях число из переменной age автоматически будет преобразовано в строку и добавлено к "Your age: ". Но такие действия нужно совершать с осторожностью. Рассмотрим следующий код:

int x = 5; int y = 7; Console.WriteLine("x+y=" + x + y);

На первый взгляд может показаться, что на консоль будет выведено "x+y=12", но на самом деле мы увидим "x+y=57". Почему так произошло. Как и в математике, операции совершаются слева на право и уж никак не одновременно. сначала будет выполнено объединение строки "x+y=" с содержимым переменной x. Число 5, которое храниться в переменной x автоматически будет преобразовано в строку и в результате мы получаем новую строку "x+y=5", к которой снова добавляем преобразованное в строку число 7. Чтобы исправить ситуацию и получить ожидаемое, выражение x+y нужно взять в скобки:

Console.WriteLine("x+y=" + (x + y));

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

Теперь ещё немного теории и новых терминов, которые также нужно обязательно запомнить. Арифметические операции, такие как +, -, *, / в программировании называются "ОПЕРАТОРАМИ". К операторам также относятся круглые скобки и знак "=", который называется оператором присваивания. Оператор - это один или несколько символов, который запрограммированы на выполнение некоторых действий над "ОПЕРАНДАМИ". Операнды - это информация, над которой могут выполнять действия операторы. Например, в инструкции

sum = 5+10;

есть два оператора: + и = (присвоить). Для оператора + операндами будут значения 5 и 10. Для оператора присвоения (=) операндами будут результат выражение 5+10 (ведь это тоже информация) и переменная sum, в которую оператор присвоение запишет (присвоит) результат выражения.

В следующей лекции мы продолжим разговор об операторах и узнаем о некоторых новых. А сейчас мы остановимся и подведём итог.

Теперь мы умеем программировать все 3 основных задачи, которые решает любая программа. Пускай пока что и на каком-то элементарном уровне, но мы уже должны уметь:

Хранить информацию в программе с помощью переменных.

Выводить её на консоль и считывать из консоли с помощью Console.WriteLine() и Console.ReadLine().

Обрабатывать информацию с помощью арифметических операторов, преобразовывать строки в другие типы данных.

На самом деле это уже не мало и достаточно для решения множества простых задач. Которые вам обязательно нужно прорешать перед тем, как мы двинемся дальше.

Домашние задания

Задача 1

Какие из следующих инструкций записаны без ошибок и действительно ли они будут выводить то, что утверждается:

Console.WriteLine("a"); - вывод на консоль символа а Console.Writeline("a"); - вывод на консоль значения переменной а Console.WriteLine("A = 5;"); - присвоение переменной A числа 5 Console.WriteLine(a * 2); - вывод на экран произведения значения переменной а на 2

Задача 2

Что будет выведено на консоль в результате выполнения следующего кода программы (сначала ответьте на этот вопрос самостоятельно, а затем проверьте с помощью программы):

int x=2; int y=3; Console.Writeline(x); Console.Writeline(x+x); Console.Writeline("x="); Console.Writeline(x + "=" + x); Console.Writeline(x + y + "=" + y + x); Console.Writeline("x + y = " + x + y);

Задача 3

Написать инструкции, выполняющие следующее действия, в новом проекте:

1. Объявить переменные: с, thisisAVariable, q76354, number типа int

2. Предложить пользователю ввести целое число.

3. Объявить переменную Age (типа int)

4. Считать введённое пользователем значение в переменную Age

5. Присвоить переменной number значение Age

6. Вывести на экран значение переменной number

7. Вывести на экран сообщение «This is C# program» на одной строке одной инструкцией

8. Вывести на экран сообщение «This is C# program» на двух строках, где первая строка заканчивается на is одной инструкцией

9. Вывести на экран сообщение «This is C# program» так, чтобы на каждой строке было только одно слово одной инструкцией

10. Вывести на экран сообщение «This is C# program» так, чтобы каждое слово отделялось от следующего знаком табуляции одной инструкцией

Задача 4

Написать инструкции, выполняющие следующее действия, в новом проекте:

1. Объявить переменные x, y, z, result типа int

2. Предложить пользователю ввести три числа

3. Прочитать три числа и сохранить в переменные x,y,z

4. Вычислить произведение и сохранить результат в переменную result

5. Напечатать: «Result is: » и значение переменной result

Задача 5

Написать программу, которая выводит на экран следующие фигуры (друг под другом):

Image

Задача 6

Написать программу, вычисляющую среднее арифметическое трёх чисел. Числа вводит пользователь.

Задача 7

Написать программу, которая переводит гривны в доллары и евро. Пользователь вводит значение в гривне, программа выводит результат в соответствующей валюте по какому-либо указанному курсу.

Задача 8

Выведете следующий текст на консоль:

To "be" or not to "be"
\Shakespeare\

Задача 9

Напишите программу, которое возводит в квадрат введённое пользователем число

Задача 10

5. Напишите программу, в которой пользователь вводит пять чисел. В результате, программ должна вывести сумму и произведение этих чисел.