Программирование на языке C#. 

Часть 1. Основы языка

МИНистерство ОБРАЗОВАНИЯ И НАУКИ РФ

ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ

ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ

«ВОЛГОГРАДСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»

КАМЫШИНСКИЙ ТЕХНОЛОГИЧЕСКИЙ ИНСТИТУТ (ФИЛИАЛ)

ГОУ ВПО «ВОЛГОГРАДСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»

Учебное пособие

Волгоград

2011

УДК 004.42(075.8)

К 84

Рецензенты: доцент кафедры Прикладной теории вероятностей Нижегородского государственного университета им. , к. т. н. ; коллектив кафедры «Прикладная математическая статистика» Нижегородского государственного архитектурно-строительного университета (зав. кафедрой – д. ф.-м. н. ).

Кручинин, на языке C#: учеб. пособие. В 2 ч. / ; ВолгГТУ, Волгоград, 2011.

ISBN 0654-8

Ч. 1: Основы языка / . – 92 с.

ISBN 0655-5

Рассматриваются основы языка программирования C#. В пособии изложены сведения об основных типах данных, операции, структура и синтаксис основных конструкций языка, а также принципы построения консольных приложений. Даются начальные сведения об объектно-ориентированном программировании.

Предназначено для студентов, обучающихся по направлениям 230100 «Информатика и вычислительная техника» и 231000 «Программная инженерия»

Ил. 5. Табл. 4. Библиогр.: 4 назв.

Печатается по решению редакционно-издательского совета

Волгоградского государственного технического университета

ISBN 0655-5 (ч. 1) Ó Волгоградский

ISBN 0654-8 государственный

технический

университет, 2011

ВВЕДЕНИЕ

Требования к уровню подготовки выпускников по направлениям 230100 «Информатика и вычислительная техника» и 231000 «Программная инженерия» определены Государственными образовательными стандартами высшего профессионального образования. Стандартами предусмотрено изучение ряда дисциплин, призванных дать студенту необходимый минимум знаний в области программирования. Начальные дисциплины этого ряда – «Информатика и программирование» (231000) и «Программирование» (230100). В данном пособии предлагается изучение универсального языка программирования высокого уровня C#, который на сегодняшний день является наиболее удобным для изучения основ программирования в среде Windows.

НЕ нашли? Не то? Что вы ищете?

В пособии не ставится цель рассмотреть все особенности языка программирования – для этого есть соответствующие учебники. Целью пособия является предоставить студенту основы языка и ввести его в процесс использования конструкций языка для решения простых задач в среде Visual Studio.

1. ЧТО ЕСТЬ ПРОГРАММИРОВАНИЕ

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

·  что дано или известно – это исходные данные;

·  что именно предстоит получить или подсчитать – это результат;

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

·  можем ли мы получить результат самостоятельно или нам потребуется чья-то помощь – это вопрос о средствах достижения результата.

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

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

Если же мы захотим решать задачу с помощью вычислительного устройства (компьютера), то уже это устройство станет исполнителем. Когда мы решали задачу на бумаге, то выполняли тот порядок действий, который нам был изначально известен. При использовании устройства нам придется сначала «объяснить» этому устройству, что оно должно делать и в каком порядке, чтобы решать задачу. Другими словами, мы должны описать ему алгоритм, причем описать так, чтобы это описание было ему понятно. Описание алгоритма решения задачи на языке исполнителя – это и есть программирование.

Применение персонального компьютера (ПК) для решения задач основано на его способности выполнять составленные для него программы. Эта способность является следствием его структуры. Любой компьютер имеет в своем составе:

·  процессор, включающий собственную систему команд и предназначенный для выполнения элементарных операций по обработке данных;

·  память для хранения как самих данных, так и программы, по которой работает процессор;

·  устройство ввода данных для перемещения данных извне в память вычислительного устройства;

·  устройство вывода данных для вывода результатов решения на устройство отображения или на устройство хранения.

Одним из основных элементов компьютера, позволяющих ему нормально функционировать, является внутренняя память. Это временное рабочее пространство, т. е. место хранения информации, с которой ПК работает в данный момент. Внутренняя память делится, в свою очередь, на оперативную память и постоянную. Оперативная память (ОП) позволяет хранить данные только во время работы компьютера и очищается при его выключении. Как правило, оперативная память является памятью типа RAM (Random Access Memory – память произвольного доступа), т. е. позволяет считывать размещенные в ней данные и изменять их. Постоянная память используется для хранения какой-либо важной информации, используемой только для считывания и не подлежащей изменению в процессе работы. Обычно это память типа ROM (Read Only Memory – память только для чтения). Оба типа памяти физически выполняются в виде специализированных микросхем.

Структурно ОП состоит из отдельных ячеек, каждая из которых способна хранить один байт информации. Именно поэтому ячейки памяти кратко именуют байтами памяти. Любой байт памяти доступен для использования, потому что имеет адрес. Максимальный адрес байта зависит от емкости ОП компьютера, а емкость ОП определяется количеством соответствующих микросхем. В памяти хранятся данные в двоичной системе счисления, которые по своей сути могут быть и собственно данными для вычислений (числами, символьными текстами, произвольными кодами), и программами. Это значит, что в памяти одновременно располагается и последовательность команд, решающих задачу (программа), и данные для ее решения. С точки зрения кодирования нет никакой разницы между командой и, например, числом – и то, и другое представлено в двоичном коде. Все зависит от того, как именно используется информация в данной ячейке. Использование содержимого ячейки обусловлено процессором.

В основе разработки программ для ПК лежит использование возможностей процессора. Процессор представляет собой главный функциональный блок компьютера. Функциональная мощность процессора во многом определяет и мощность ПК. Каждый процессор обеспечивает выполнение определенного набора команд (инструкций), который принято называть системой команд процессора (СКП).

В СКП имеется несколько групп команд. Каждая группа обеспечивает обработку данных определенного типа. Есть, например, группы команд целочисленной арифметики, арифметики с плавающей точкой и т. п. Есть группа команд управления, позволяющая изменять порядок выполнения программы в зависимости от получаемых результатов, организовывать циклическую обработку. Есть команды, позволяющие перемещать данные из одного места памяти компьютера в другое (из одной ячейки в другую). Имеется, наконец, группа команд, обеспечивающая обмен данными с внешними устройствами (ввод и вывод данных).

Работа процессора всегда выполняется по программе, которая составлена по некоторому алгоритму и размещена в памяти компьютера. Программа – это последовательность отдельных команд, обеспечивающая решение некоторой задачи. Адресом начала программы является адрес ее первой команды. Это не значит, что первая команда находится в начале программы – она может быть и в середине. Главное, что процессору сообщается этот адрес (адрес начала) вместе с указанием «выполни».

Получив адрес первой исполняемой команды, следующую команду процессор найдет уже сам. Дело в том, что каждая команда занимает в памяти ПК определенное количество байтов. После исполнения очередной команды процессор просто увеличивает текущий адрес команды на величину, равную длине команды, и выбирает следующую команду. Выбрав команду для исполнения, процессор разбирает ее по составу. В команде всегда присутствует код операции, соответствующий коду какой-то инструкции из СКП. Тем самым определяется, что надо сделать. В команде могут присутствовать данные или адреса данных для операции (например, адреса складываемых чисел). Тем самым определяется, что следует использовать для операции и куда возможно поместить результат.

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

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

Сейчас программы пишутся на языках программирования. Различают языки низкого и высокого уровня. Язык низкого уровня (например, Ассемблер) позволяет создать программу, максимально учитывающую особенности конкретной модели компьютера. Такая программа может быть выполнена только на компьютерах именно этой модели (или совместимых с ней). Работая на таком языке, программист должен хорошо знать особенности модели ПК и знать СКП. А вот язык высокого уровня позволяет создавать универсальные программы, которые не привязаны к особенностям конкретного компьютера (и процессора) и, следовательно, пригодны для любых моделей ПК. При одном, правда, условии: программа должна быть предварительно переведена на язык процессора конкретной модели. Такой перевод обеспечивают специальные программы-трансляторы.

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

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

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

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

Таким образом, языки высокого уровня избавили программиста не только от необходимости помнить коды команд (инструкций) процессора – от этого избавляет и язык низкого уровня. Гораздо важнее, что программист вообще не думает о том, как будет размещена его программа в памяти и как там будут размещаться и перемещаться данные. Задача программиста – правильное описание порядка действий, т. е. алгоритм. А все остальное (настройка на аппаратуру, размещение в памяти, адресация) будет автоматически сделано при трансляции и в процессе загрузки программы в память.

2. СТРУКТУРА ПРОГРАММЫ НА ЯЗЫКЕ C#

Разработка программы в современных системах программирования имеет свою специфику и опирается на своеобразную терминологию. Язык C# в это смысле не является исключением. Не принято говорить «программа». Используется другой термин – приложение. Это не писк моды, а точное отражение сущности разработки. Раньше (например, в среде DOS) исполнение программы проходило как бы «втемную» с выдачей результатов решения на экран компьютера – на консоль. Современные программы выполняются иначе. Могут использоваться несколько окон с различными полями для ввода данных и выдачи результатов. Результаты исполнения могут быть не только численными или текстовыми – допускаются картинки, музыка, видео. В окнах могут быть различные элементы управления процессом исполнения программы – кнопки, флажки, переключатели и прочее. Пользователь работает и с клавиатурой, и с манипулятором типа «мышь». Для того чтобы работа пользователя стала именно такой, программист должен обеспечить эти возможности специфическими средствами языка программирования.

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

В языке C# такое разбиение на отдельные задачи закреплено в специальной терминологии. В целом разрабатываемое приложение – это решение, а каждая входящая в решение задача – это проект. В решение может входить любое число проектов. На начальном этапе работы программист создает проект, а среда программирования автоматически создает решение. Если потребуется, в решении можно создать новые проекты. В процессе работы можно отлаживать все проекты сразу – компилироваться при этом будет все решение. Можно отлаживать каждый проект отдельно – допускается компиляция одного проекта.

Для языка C# среда предлагает много различных видов проектов. Среди них есть пустой проект, в котором изначально не содержится никакой функциональности. Есть проект, ориентированный на создание Web-служб. Можно создавать проект Windows-приложения. А вот для изучения основных возможностей языка обычно используют консольные приложения. Все изложенное в данном пособии ориентировано на последний вид проектов.

Общий вид структуры приложения представлен на рис. 1. Если в решении имеется несколько проектов, то один из них должен быть выделен и назначен стартовым проектом. Выполнение решения (работа приложения) начинается со стартового проекта. Проекты одного решения могут быть зависимыми или независимыми. Стартовый проект должен иметь точку входа – это то место, с которого начинается работа программы. В состав стартового проекта может входить несколько классов, но один из классов обязательно должен содержать процедуру (метод) с именем Main, в которой автоматически передается управление в момент запуска решения на выполнение.

Необходимо уточнить ряд используемых терминов. Любой программный алгоритм предназначен для обработки каких-то данных. Данные в программе обычно присутствуют в виде переменных, которым в процессе исполнения программы присваиваются разные значения. Язык C# относится к объектно-ориентированным языкам, а в объектно-ориентированном программировании вместо термина «переменная» используется объект. В сущности, эти слова являются синонимами, но «объект» более точно отражает суть данных. Объектом может быть и число (простая переменная), и какая-либо структура (объединение различных значений в единое целое). Поэтому процесс выполнения программы – это фактически процесс выполнения каких-либо операций над объектами. Группа операций, реализующая какой-либо законченный алгоритм, обычно оформляется особым образом по правилам языка в виде самостоятельного блока и называется методом (в разделах 13 и 14 мы более точно определим это понятие). Как видно из рис. 1, проект может содержать один или несколько методов. Раньше такие программные блоки называли процедурами или функциями. Собственно, термины «функция», «процедура» и «метод» можно считать синонимами.

Проект состоит из классов, собранных в одном или нескольких пространствах имен (на схеме пространства имен не показаны). Пространства имен позволяют структурировать проекты, содержащие большое число классов (в разделе 14 будет уточнение понятия «класс»), объединяя в одну группу близкие классы. Пространства имен могут быть системными, но в процессе работы программист может создавать свои собственные пространства, не прикладывая к этому никаких усилий и не задумываясь над их именами. Пространства имен программиста создаются автоматически с каждым новым классом. Если над проектом работает несколько исполнителей, то, как правило, каждый из них создает свое пространство имен. Помимо структуризации, это дает возможность присваивать классам имена, не задумываясь об их уникальности. В разных пространствах имен могут существовать одноименные классы. Среда программирования «подхватывает» их и включает в общий список пространств. Программист в процессе работы над программой видит эти имена в различных подсказках точно так же, как он видит имена системные.

3. ОРГАНИЗАЦИЯ ДАННЫХ В ЯЗЫКЕ C#

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

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

В современных языках программирования (C# не исключение) используется более общее понятие – класс. Мы уже ознакомились с этим понятием как элементом структуры программы в предыдущем разделе. Здесь же мы уточним его. Класс определяет данные, а его имя является типом данных. Данные, относящиеся к некоторому классу, называют объектом этого класса. При объявлении в программе некоторого объекта обязательно указывается тип (класс) объекта. Понятия «тип» и «класс» являются синонимами. Следовательно, синонимами можно считать понятия «объект» и «переменная». Вместе с тем в описании класса могут явно присутствовать определения операций над объектами и описания методов работы с ними. В этом сущностное отличие типа и класса, и мы примем это пока как факт. Более подробно об организации классов будет рассказано в разделе 14, а также во второй части данного пособия.

Типы данных в C# принято разделять на простые и сложные в зависимости от того, как устроены их данные. У простых типов переменная в каждый момент исполнения программы содержит только одно значение – значение данного типа. Сложные типы характеризуются способом структуризации данных – одно значение сложного типа состоит из множества значений, возможно, даже различных типов, организующих сложный тип.

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

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

Еще одна важная классификация типов – это их деление на значимые и ссылочные. Для значимых типов значение переменной (объекта) – это собственность переменной. Точнее, собственностью является память, отводимая значению, а само значение может изменяться. Для ссылочных типов значением служит ссылка на некоторый объект в памяти. Фактически ссылка – это адрес другого участка памяти, где и находятся сами данные. Таким образом, будем говорить, что переменная значимого типа содержит данные, а переменная ссылочного типа – адрес данных.

Данные значимой переменной (объект) хранятся в стеке данных. Стек данных – это особое место в ОП, которое специально создается при загрузке программы для исполнения. Можно считать, что при исполнении программы стек размещен в теле программы. А вот у ссылочной переменной в теле программы (в стеке) хранится только адрес данных. Сами данные (объект) размещаются вне тела программы в свободной области памяти, которая не занята другими программами или их данными. Свободную память принято называть динамически выделяемой памятью, или просто динамической памятью. Иногда динамическую память называют короче – куча.

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

В целом в системе типов языка C# все типы делятся на четыре категории:

    типы-значения (value), или значимые типы; ссылочные (reference); тип void; указатели (pointer).

Первые две категории мы уже обсудили – это значимый и ссылочный типы. Особый статус имеет тип void (пустой), указывающий на отсутствие какого-либо значения. Где и для чего применяется этот тип, мы рассмотрим в разделе 13 при изучении правил описания функций. В отдельную категорию выделены указатели, которые достались языку C# в наследство от языка C++. Использование указателей в C# допустимо, но не рекомендуется, потому что блок программы, где используются указатели, становится неподконтрольным для среды исполнения программы, т. е. небезопасным. По этой причине указатели мы рассматривать не будем.

В языке C# жестко определено, какие типы относятся к ссылочным, а какие – к значимым. К значимым типам относятся: логический тип, арифметические типы, структуры, перечисления. Массивы, строки и классы относятся к ссылочным типам. Часто используемыми встроенными типам являются следующие:

    int (Int32) – знаковое целое, 4 байта long (Int64) – знаковое длинное целое, 8 байтов double (Double) – вещественное, 8 байтов char (Char) – символьный тип, 2 байта, Unicode

·  string (String) – строковый тип, строка символов Unicode

·  bool (Boolean) – булевский (логический) тип, значения true и false

·  Object (Object) – тип «объект», предок всех типов

Полный список встроенных типов можно увидеть в [1]. Обратите внимание на приведенные названия. Каждый тип имеет как бы два имени. Первое – это собственно имя типа в том виде, как оно пришло из языка-родителя C++. Второе имя, начинающееся с заглавной буквы, это имя класса уже в языке C#. Будем помнить, что все типы в этом языке описаны как классы. Общим предком всех типов (классов) является встроенный тип (класс) Object. Используя встроенные типы (классы), программист может создавать собственные типы (классы), как это определено в разделе 12.

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

using System;

Наличие этой директивы разрешает объявление переменных ранее названных типов (и не только их, но об этом – потом). Например:

int i, j, k; // объявлены три переменных целого типа

string slovo; // объявлена переменная строкового типа

Обратите внимание: в двух предыдущих строках программного кода использован комментарий – поясняющий текст, записанный сразу после двух знаков «слэш» (//).

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

using System. Collections. Generic;

using System. Text;

Эти директивы разрешают использование возможностей, вложенных в пространства имен System.Collections.Generic и System.Text. В этих пространствах имен размещены различные встроенные классы (то есть типы), назначение которых будет понятно по мере изучения языка. Более подробно ознакомиться с порядком создания проекта консольного приложения можно в [3].

4. ПРОСТЕЙШИЕ ДЕЙСТВИЯ С ДАННЫМИ

Для начала определимся с двумя важными понятиями, которые используются в языках высокого уровня. В некоторых учебниках (например, в [2]) дается не совсем корректное определение понятий «операция» и «оператор». Будем считать, что операция – это указание совершить действие. Например, знак + является указанием выполнить сложение. Будем также считать, что оператор – это выражение, описывающее законченное действие. Например, про выражение «a = b + c;» можно сказать, что это «оператор присваивания результата операции сложения двух чисел». Исходя из данных определений, мы и будем в дальнейшем различать операции и операторы.

4.1. ВЫВОД ДАННЫХ НА ЭКРАН

В пространстве имен System, кроме встроенных типов данных, имеется описание класса Console, в котором определены типовые процедуры работы с клавиатурой и экраном. Эти процедуры оформлены как функции языка (подробнее о функциях – в разделе 13). Так как в начале консольной программы всегда имеется директива using System, то в тексте программы можно использовать функции класса Console. В частности, для выдачи данных на экран можно использовать оператор, включающий в себя либо функцию Wtite, либо функцию WriteLine.

Оператор содержит имя класса и через точку – имя функции. Например:

Console.WriteLine(”Привет ”); // вывод с переводом курсора

Console.Write(”имя студента : ”); // вывод без перевода курсора

Для того чтобы вывести на экран значение какой-либо переменной, можно использовать форматный вывод:

Console.WriteLine(”результат вычислений = {0}”,summa);

Здесь выражение в двойных кавычках – это форматная строка. Она содержит и текст, и поле для вывода данных. Это поле описывается в виде числа в фигурных скобках. При выводе на экран форматная строка выводится как есть с заменой поля вывода значением переменной summa. Если, например, в переменной суммой будет число 128, то на экране появится текст:

результат вычислений = 128

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

Console. WriteLine(”{0} + {1} = {2}”, a1, a2, summa);

Если значение переменной a = 48, a2 = 52 и summa = 100, то на экране появится текст:

48 + 52 = 100

С другими возможности форматирования вывода можно ознакомиться, выполнив лабораторную работу № 6, приведенную в [4].

4.2. ПРИСВАИВАНИЕ ЗНАЧЕНИЙ ПЕРЕМЕННЫМ

Операция, обозначаемая знаком =, называется операцией присваивания. Операция бинарная, т. е. имеет два операнда. Например, x = y. Операнд слева от знака может быть только переменной, объектом. Операнд справа может быть выражением, т. е. записью, в которой используются знаки других операций. Как правило, операция = является главной операцией, образующей оператор присваивания (об этом в разделе 5.1). Например, выражение x = y + Маth.Sin(t); является оператором присваивания, в котором переменная x получает значение суммы значения переменной y и значения синуса t.

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

А вот при присваивании ссылочных и значимых типов возможно 4 случая, смысл которых надо четко понимать. Если слева и справа от знака = значимые типы, то проблем не возникает. Значение из одной переменной копируется в другую (см. рис. 2).

Если слева и справа ссылочные типы, то здесь имеет место ссылочное присваивание (см. рис. 3). В этом случае значениями слева и справа являются ссылки на объекты, хранящиеся в динамической памяти (в куче). При таком присваивании значение слева теряется. Переменная получает новое значение – ссылку на значение справа. Результат ссылочного присваивания двоякий. Объект, на который ранее ссылалась переменная слева, теряет одну из своих ссылок. Если он не будет иметь ни одной ссылки, то в последующем будет удален системой из памяти (для этого система имеет встроенный модуль, называемый сборщиком мусора).

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

Если слева ссылочный тип, а справа значимый, то в этом случае значимый тип преобразуется в ссылочный (см. рис. 4). А дальше – все как в предыдущем случае.

Если слева значимый тип, а справа ссылочный (см. рис. 5), то в этом случае извлекается значение из ссылочного типа и присваивается переменной слева. При этом значение справа по-прежнему «живет» самостоятельной жизнью.

4.3. ВВОД ДАННЫХ С КЛАВИАТУРЫ

Переменная может получить значение не только путем присваивания. Значения можно ввести и с клавиатуры. Для этого имеются соответствующие функции класса Console. Чаще всего используют функцию ReadLine. Например:

string s;

s = Console.ReadLine();

Следует помнить, что функция ReadLine вводит стоковое значение вне зависимости от того, какие именно данные набраны пользователем. Численное значение также вводится как строка. Если необходимо введенное значение хранить как число или как символ, то после ввода надо сделать преобразование данных из строки в число или в символ. Преобразование можно выполнить с помощью соответствующих функций класса Convert. Например:

int a;

double d;

char c;

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

d = Convert. ToDouble(Console. ReadLine());

a = Convert. ToChar(Console. ReadLine());

4.4. АРИФМЕТИЧЕСКИЕ ОПЕРАЦИИ

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

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6