Основы алгоритмизации и объектно-ориентированного программирования

№ 2056
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ
ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
«НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ ТЕХНОЛОГИЧЕСКИЙ УНИВЕРСИТЕТ «МИСиС»

   
 
Кафедра инженерной кибернетики Т.В. Куренкова Г.И. Светозарова  
 
 
Основы алгоритмизации и объектно-ориентированного программирования   Учебное пособие Допущено учебно-методическим объединением по образованию в области прикладной математики и управления качеством в качестве учебного пособия для студентов высших учебных заведений, обучающихся по направлению подготовки 230400 – «Прикладная математика»
 
 
Москва 2011

 

 


УДК 004.45
К93

Рецензент
д-р техн. наук, проф. В.А. Поляков (РГУ нефти и газа им. И.М. Губкина)
канд. техн. наук, проф. В.Б. Глаголев (МЭИ)

Куренкова, Т.В.

Основы алгоритмизации и объектно-ориентированного
К93 программирования : учеб. пособие / Т.В. Куренкова, Г.И. Све-
тозарова. – М. : Изд. Дом МИСиС, 2011. – 197 с.

ISBN 978-5-87623-466-7

Рассматриваются вопросы программирования на базе платформы Microsoft .NET Framework. Дается описание современного языка объектно-ориентированного программирования C# в объеме, необходимом для иллюстрации основных понятий объектно-ориентированного программирования. Рассматриваются базовые структуры алгоритмов, типовые алгоритмы работы с массивами, основные приемы программирования, базирующиеся на объектном подходе.

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

 

УДК 004.45

ISBN 978-5-87623-466-7 Ó Куренкова Т.В., Светозарова Г.И., 2011

Оглавление

Предисловие. 4

Введение. 5

1. Основы языка C#. 10

1.1. Переменные. Типы данных. 10

1.2. Литералы. 12

1.3. Операторы объявления. Инициализация переменных. 12

1.4. Математические операторы. Выражения. 13

1.5. Логические операторы. Выражения. 17

1.6. Перечисление. 18

1.7. Основные операторы. 19

1.8. Ввод-вывод. 28

2. Реализация простейших алгоритмов на языке C#. 33

2.1. Организация циклов. 33

2.2. Организация разветвлений. Разветвления в цикле. 48

2.3. Составление программ для обработки потока данных. 56

3. Массивы. Типовые алгоритмы обработки массивов. 60

3.1. Одномерные массивы и алгоритмы их обработки. 60

3.2. Работа с массивами как с объектами. 77

3.3. Работа с матрицами. 86

4. Структуры и классы. 107

4.1. Использование структур. 107

4.2. Использование конструктора экземпляра и других методов при работе со структурами 114

4.3. Использование классов. 122

5. Методы. 127

5.1. Общие положения. Способы передачи параметров. 127

5.2. Использование массивов в качестве параметров. 137

5.3. Использование делегата для передачи метода в качестве параметра в другой метод 141

6. Работа с текстовыми строками. 149

7. Файлы данных (Пространство имен System.IO). Файлы и потоки. 157

8. Разработка приложений с графическим интерфейсом пользователя Windows. Экранные формы 164

9. Среда разработки. 181

9.1. Создание нового проекта. 181

9.2. Сохранение проекта. 182

9.3. Открытие существующего проекта. 182

9.4. Использование интегрированной среды разработки Visual C#. 183

Библиографический список. 189

Приложения. 190

 

 

Предисловие

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

Настоящее пособие предназначено для приобретения компетенций в области алгоритмизации задач и разработки приложений на базе объектно-ориентированного подхода с использованием современного языка C#.

C# – объектно-ориентированный язык, предназначенный для разработки приложений, выполняемых в среде .NET Framework. Приобретаемые при изучении данного пособия навыки являются необходимым этапом для дальнейшего овладения возможностями, предоставляемыми платформой Microsoft .NET Framework.

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

Введение

Язык C# (произносится Си шарп) – современный язык объектно-ориентированного программирования, предназначенный для разработки программ и систем программ на базе платформы Microsoft .NET Framework. Этот язык ориентирован как на создание обычных автономных приложений Microsoft Windows, допускающих в том числе взаимодействие со стандартными приложениями Windows, так и на разработку Web-приложений. Важнейшим компонентом платформы .NET Framework является обширная библиотека классов, существенно облегчающая разработку программ. В Приложении 1 приводятся подробные сведения о составе платформы .NET Framework и предоставляемых ею возможностях.

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

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

При решении научно-технических задач алгоритмическая составляющая является весьма существенной. В настоящем пособии вопросам алгоритмизации и изучению базовых приемов программирования уделяется значительное внимание. Начальные сведения по алгоритмизации (понятие алгоритма, свойства алгоритма, типовые структуры алгоритма) см., например, в учебном пособии «Информатика. Информационные технологии». Авторы: Светозарова Г.И., Андреева О.В., Крынецкая Г.С. и др. Изд. Дом МИСиС, 2009. Параллельно рассматриваются и используются и объектные свойства языка и на наглядных примерах демонстрируются предоставляемые ими новые возможности.

Для разработки программ на языке C# на компьютере должно быть установлено средство разработки, в котором содержатся необходимые инструменты разработки, такие как, редактор кода, компиляторы и др. (прил. 1). В данном пособии для выполнения примеров используется средство разработки Microsoft Visual C# 2008 Express Edition (Microsoft Visual C# 2008, экспресс-выпуск).

Для выполнения программ, написанных на языке C#, на компьютере должен быть установлен пакет .NET Framework (см. прил. 1).

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

Пример. Переменной r присвоить значение 3 и вывести значение r на экран (консоль, Console).

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace ConsoleApplication1

{

class Program

{

static void Main(string[] args)

{

int r = 3;

Console.WriteLine(r);

Console.ReadKey();

}

}

}

Создание и реализация даже самой простой программы (кода) осуществляется в рамках проекта (Project). Поэтому вначале необходимо создать проект. Для создания нового проекта необходимо войти в Visual C#, экспресс-выпуск и в меню «Файл» выбрать «Создать проект». Появится диалоговое окно «Создать проект».

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

Приложению автоматически присваивается имя ConsoleApplication1 (при желании это имя можно заменить на любое другое). Появляется окно «Редактор кода», в котором отобразится вкладка Program.cs с панелью кода – областью для ввода или редактирования кода. В этой области автоматически создается шаблон программы – код класса Program.

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

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

int r = 3;

Console.WriteLine(r);

Console.ReadKey();

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

Первый оператор (присваивания) задает тип (в данном примере int – целый) и значение переменной r. Второй – выводит на экран (консоль) значение r. В соответствии с этим опеатором на экране появляется окно и в него выводится значение (в данном примере 3). Третий оператор помещен здесь, чтобы задержать результат на экране, пока не будет нажата какая-либо клавиша. В противном случае результат очень быстро исчезнет с экрана. Убедитесь в этом сами. Выполнить программу можно, нажав клавишу F5 (или Ctrl/F5, см. гл. 9).

В написанном консольном приложении из предлагаемого шаблона кода необходимыми являются только следующие строки:

using System;

class Program

static void Main(string[] args)

Первая строка – директива using - разрешает использование типов, которые содержатся в пространстве имен System библиотеки классов .NET Framework. Пространство имен System содержит фундаментальные и базовые классы. В данном примере директива using обеспечивает доступ к структуре int и классу Console.

Вторая строка объявляет класс с именем Program с помощью ключевого слова class (классу может быть задано любое имя). Содержимое класса – метод (методы) класса – задается в фигурных скобках.

В последней строке объявляется метод Main. Стандартное содержимое скобок может быть опущено, т.е. эта строка может иметь вид

static void Main()

Таким образом, программа для нашего примера может выглядеть так:

 

using System;

class Program

{

static void Main()

{

int r = 3;//инициализация переменной

Console.WriteLine(r);

Console.ReadKey();

}

}

Замечание. Текст, расположенный в строке после //, является комментарием и при выполнении программы игнорируется.

Здесь в классе Program определен один метод static void Main (смысл терминов static и void, см. гл. 5). Метод Main должен быть обязательно в любой программе. Именно методу Main передается управление при запуске приложения.

Метод – это оформленная специальным образом последовательность инструкций (операторов) для выполнения каких-либо действий над объектами (переменными). (Более строгое и развернутое определение дается см. гл. 5.) Выполнение этих инструкций начинается после вызова метода из другого метода указанием его имени и необходимых аргументов (последнее не относится к методу Main). Метод является некоторым аналогом процедур (функций) в алгоритмических языках.

Метод Main имеет особый статус. Он является точкой входа каждого приложения C# и вызывается при запуске программы. Остальные методы вызываются из метода Main или других методов.

Если метод описан в классе, к которому принадлежит и Main, то для его вызова можно указать только имя и аргументы в круглых скобках или пустые круглые скобки, если аргументов нет. Если метод принадлежит другому классу, то для его вызова нужно указать имя класса (или имя экземпляра класса) и после точки имя метода, далее круглые скобки. В скобках указать аргументы метода, если они есть, или пустые скобки, если аргументов у метода нет. Например, вызов методов Console.WriteLine(r) и Console.ReadKey() класса Console в предыдущем примере.

В библиотеке имеется большое число готовых методов, сгруппированных в классы по своему назначению. Например, класс Math предоставляет константы и статические методы (термин статические поясним позже) для вычисления тригонометрических, логарифмических и других общих математических функций. Так, для вычисления cos(x) необходимо указать класс и после точки метод: Math.сos(x), см. примеры программ в гл. 1.

1. Основы языка C#

Переменные. Типы данных

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

Значения и объектные ссылки

Значение – это двоичное представление данных. Тип данных предоставляет способ представления значения переменной в памяти.

Значения переменных целых типов представляются в памяти как двоичные числа, полученные непосредственно переводом из десятичной системы счисления в двоичную систему счисления (это представление полностью справедливо лишь для положительных чисел). Целые числа в памяти представляются точно, и при выполнении операций с целыми числами никаких ошибок не возникает.

Идея представления в памяти вещественных чисел (конкретные способы могут варьироваться) заключается в следующем. Сначала число приводится к нормализованному виду, когда целая часть числа равна 0, первая цифра после запятой является значащей, а положение запятой в числе определяется значением показателя степени 10. Например, число 0,086 в нормализованной форме имеет вид 0,86×10–1, число 123,45 – 0.12345×10–3. При этом цифры, расположенные в нормализованной записи после точки, называются мантиссой, а показатель степени 10 - это порядок. В памяти отдельно представляется мантисса и отдельно – порядком. При этом количество бит, предназначенных для мантиссы, определяет точность представления, а количество бит, предназначенных для порядка, определяет диапазон представляемых чисел. Если количество цифр в двоичном представлении мантиссы превышает количество отведенных под нее разрядов, то последние двоичные цифры теряются, и число оказывается представленным в памяти приближенно. Кроме того, при выполнении арифметических операций ошибки могут накапливаться. Таким образом, в общем случае вещественные числа в памяти представляются приближенно и их сравнение на точное равенство невозможно. Например, равенство 0,2 + 0,2 + 0,2 + 0,2 + 0,2 = 1 может не выполняться, если левая часть его вычисляется на компьютере (гл. пример 2.6). Обычно вещественные переменные используются для обозначения величин, полученных в результате измерений, которые всегда имеют некоторую погрешность, либо в результате вычислений.

Символы всегда представлены 16-разрядными кодами Unicode (Юникод). Подробнее о символьных данных и операциях с ними см. гл. 6.

Логические переменные могут иметь значение true либо false.

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

Литералы

Целочисленные литералы состоят из цифр от 0 до 9 со знаком «+», «–» или без знака. Например, 25 – 7 553. Литералы с плавающей точкой могут быть записаны в виде целой и дробной частей,… Строковые литералы используются для представления текстовых строк. Это строка символов, заключенная в кавычки.…

Операторы объявления. Инициализация переменных

Оператор объявления представляет новую переменную или константу. При объявлении указывается тип и при необходимости переменной может быть присвоено значение. Для константы указание значения обязательно. В языке C# инициализация переменной (т.е. присвоение ей начального значения) является обязательным условием. Начальное значение может быть задано с помощью оператора присваивания при объявлении переменной (см. Пример во Введении), а также в процессе выполнения программы. Если инициализация переменной осуществляется при ее объявлении, то вначале указывается тип данных, затем имя переменной, далее оператор присваивания в виде знака равенства и, наконец, литерал соответствующего типа. Для инициализации одной переменной может быть также использована другая, инициализированная ранее переменная:

int x = 0;

int y = x;

int z;

z = y;

Допустима также запись

int x, y, z;

x = y = z = 1;

Здесь нескольким переменным присваивается одно и то же значение. Присваивание происходит справа налево: сначала z присваивается значение 1, затем y присваивается значение z и далее в x пересылается значение y.

Можно также вначале объявить тип переменной, а затем инициализировать ее отдельным оператором. Например,

int x;

x = 0;

Объявление типа и инициализацию переменной можно выполнить непосредственно при первом использовании переменной в программе, (см. гл. 3, пример 3.4).

В виде констант задаются неизменяемые в программе величины. Например, если объявлена константа g

Const double g = 15.5;

то значение g не может быть изменено в программе.

Математические операторы. Выражения

В общем случае слева от оператора присваивания (знака «=») располагается переменная, справа – выражение, значение которого будет присвоено переменной левой части. (Пока речь будет идти только о числовых переменных и выражениях, значениями которых является числовое значение.) Простейшим выражением является простая переменная или литерал.

Выражение может содержать математические операторы сложения +, вычитания –, умножения *, деления / и вычисления остатка при целочисленном делении % (операция возведения в степень в языке C# отсутствует) и операнды, над которыми эти операции выполняются. Операндами могут быть литералы, переменные и обращения к методам, результатом которых является одно значение. Если в выражении несколько операторов, то они выполняют действия в соответствии со следующими приоритетами: операторы умножения и деления *, /, % (выполняются по порядку слева направо), операторы сложения и вычитания +, –. Если операндом какой-либо операции является обращение к функции (методу), то сначала выполняется это обращение, чтобы получить в качестве операнда числовое значение. В качестве примера вычислим

y = 6 + сos(x) + x ´ x

и выведем результат на экран:

 

using System;

namespace ConsoleApplication1

{

class Program

{

static void Main()

{

double x = 2.3;

double y;

y = 6 + Math.Cos(x) + x * x;

Console.WriteLine(y);

Console.ReadKey();

}

}

}

Порядок вычисления выражения в программе

2. Вычисляется 6 + p1 (обозначим результат этой операции через p2). 3. Вычисляется x ´ x (обозначим результат этой операции через p3). 4. Вычисляется p2 + p3. Результат этой операции помещается в y.

Пример

int i = 9;

double t = 1.1;

i = (int)t;

При выполнении явного преобразования нужно быть внимательным, так как возможна потеря данных и переполнение.

Преобразования с помощью вспомогательных классов.

Использование статических методов класса Convert пространства имен System. Пример

int xInt = 2;

double xDouble = 5.0;

xInt = Convert.ToInt32(xDouble);

Console.WriteLine("Double: {0}", xInt);

Логические операторы. Выражения

Логические данные имеют тип bool. Например,

bool L1, L2;

К логическим данным могут применяться логические операторы (табл. 1.1). Результатом выполнения логического оператора всегда является логическое значение true или false. Константы и переменные логического типа могут входить в состав логического выражения. Кроме этого, в логическом выражении могут использоваться в качестве операндов отношения (например, x>0 имеет значение true при x положительном и значение false при x отрицательном или равном 0; sqr(a)+sqr(b) <= sqr (c) имеет значение true,если условие удовлетворяется для конкретных значений a, b, c, и false в противоположном случае). Отношение – это два арифметических выражения, соединенных знаком операции отношения <, <=, >, >=, = = (равно), != (не равно).

Таблица 1.1

Логические операторы

Название Обозначение A
T T F F
B
T F T F
Отрицание !A F F T T
Логическое «и» A && B T F F F
Логическое «или» A ׀׀ B T T T F

Примечание: T – true, F – false.

Например, после выполнении оператора присваивания

L3=(x<=5.5) && (x>=–3.5);

L3 будет иметь значение true, если выполняются оба условия, т.е. x принадлежит отрезку [–3.5, 5.5].

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

После выполнения оператора

L2=(i>10) ׀׀ (a<0.0001);

L2 получит значение true, если выполняется хотя бы одно из условий, т.е. либо i>10, либо a<0.0001.

В логическом выражении могут присутствовать, как мы видим, операции трех типов: 1) арифметические (в левой или правой частях отношения, выполняются в первую очередь); 2) операции отношения; 3) логические. Логические операции имеют самый низкий приоритет. Из них в первую очередь выполняется операция отрицания (!), далее операция «Логическое «и» (&&) и в последнюю очередь – «Логическое «или» ( ׀׀). Например,

bool a = true;

bool b = 1 < 0 && a;

Console.WriteLine(b);

Console.ReadLine();

В результате программа распечатает на экране

false

Логические выражения обычно используются в условном операторе if (п. 1.7.1).

Перечисление

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

Пример

using System;

class Program

{

enum Days { Sat, Sun, Mon, Tue, Wed, Thu, Fri };

static void Main()

{

Console.WriteLine(Days.Tue);

Console.WriteLine((int)Days.Tue);

}

}

В результате программа распечатает на экране

Tue

Пример использования перечисления см. гл. 5, пример 5.5.

Основные операторы

К основным операторам отнесем операторы, которые позволяют описать типовые структуры алгоритмов:

· условный оператор if реализует разветвление, т.е. переход на тот или другой блок (последовательность операторов) кода;

· оператор цикла for реализует циклы с известным количеством повторений;

· операторы цикла while и do-while реализуют циклы по условию (while – с предусловием, do – с постусловием);

· оператор цикла foreach используется для организации последовательной обработки элементов массива (см. гл. 3);

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

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

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

К группе основных операторов отнесем также оператор присваивания, при помощи которого происходят изменения значений переменных программы (этот оператор рассмотрен выше).

Рассмотрим более подробно каждый из перечисленных операторов.

Условный оператор if

Условный оператор if позволяет выбрать одну из двух ветвей вычислительного процесса.

Общий вид оператора:

if (выражение)

{

Операторы1;

}

[Else

{

Операторы2;

}]

Выражение в скобках после if является логическим выражением, значением которого является одно из двух логических значений true (истина) или false (ложь). В первом случае выполняются Операторы1, во втором – Операторы2. Вторая ветвь (Операторы2) может отсутствовать. Об этом говорит наличие квадратных скобок в определении оператора. (То, что заключено в квадратные скобки, не является обязательным.) После выполнения какой-либо одной из ветвей условный оператор считается выполненным. Наличие фигурных скобок не является обязательным, если какая-либо ветвь содержит один оператор, в котором нет объявления переменных. Однако рекомендуется фигурные скобки использовать всегда, что делает структуру программы более наглядной. Например,

int i = 1, x;

if (i <= 10)

{

x = 5;

}

else

x = 0;

Console.WriteLine(x);

Если требуется выполнить более одного оператора после if или после else, то их все обязательно помещают внутри скобок {}. Эти операторы образуют блок. Например,

int i = 15, x;

if (i <= 10)

{

x = 5;

Console.WriteLine(x);

}

else

{

x = 2;

Console.WriteLine(x);

}

Каждый из двух блоков условного оператора (наличие обоих блоков необязательно) может содержать любые операторы, в том числе условные операторы. Если условный оператор входит в состав блока Операторы1, выполняемого после if, то он записывается и выполняется по общим правилам. Если проверка условия осуществляется после else, то используется оператор else if (условие), использование которого демонстрирует следующая схема:

if (условие1)

{

Операторы1;

}

else if (условие2)

{

Операторы2;

}

[else

{

Операторы3;

}]

Если истинно условие1, то выполняются Операторы1 и условный оператор заканчивает работу. Если условие1 ложно, то проверяется условие2, и, если оно истинно, то выполняются Операторы2, в противном случае выполняются Операторы3, если присутствует последний else,или конструкция не выполняет никаких действий. Последний else всегда относится к последнему if, для которого еще не было соответствующего else. Например,

int a = -4, x = 0;

if (a > 5)

x = 1;

else if (a > 0 )

x = 2;

else

x = 3;

Console.WriteLine(x);

В результате при a = 3 будет x = 2; при a = - 4 будет x = 3.

Замечания:

1. В рассмотренном примере после каждого условия следует один оператор и фигурные скобки необязательны.

2. В языке C# существует упрощенный вариант записи условного оператора, называемый оператором проверки, который можно использовать в выражении. Общий вид оператора проверки:

(условие) ? значение1: значение2;

Например,

int i = 4>m? 6 : 8;

Если, например, m = 9, то условие не выполняется (имеет значение false) и переменной i будет присвоено значение 8. При использовании оператора проверки следует помнить о правилах приоритета, так как в этом операторе могут использоваться арифметические, логические операторы и операторы отношений.

Оператор цикла for

Оператор цикла for предназначен для выполнения одного оператора или группы (блока) операторов заданное количество раз.

Общий вид оператора for:

for ([ инициализация]; [условие];[приращение])

{

Операторы;

}

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

using System;

class Program

{

static void Main()

{

for (int i = 1; i<=5; i++)

{

Console.WriteLine(i);

}

Console.ReadKey();

}

}

В последовательные строки будут выведены натуральные числа от 1 до 5.

Оператор for выполняется следующим образом: переменной цикла i присваивается начальное значение 1. Проверяется условие. Здесь при i = 1 оно выполняется (имеет значение true). Далее выполняется оператор в цикле, и на консоль выводится значение 1. Затем i увеличивается на 1 и снова проверяется условие. И так до тех пор, пока не станет i > 5 (условие получает значение false) и не произойдет выход из цикла. Заметим, что первая проверка условия производится перед первым выполнением оператора (операторов), расположенных после for, и таким образом возможна ситуация, когда этот оператор (операторы) не будет выполнен ни разу. Цикл for относится к циклам с предусловием.

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

for (int i = 1; ; i++)

{

if (i <= 5)

break;

Console.WriteLine(i);

}

Console.ReadKey();

Здесь проверка условия происходит внутри цикла и прерывание выполнения цикла происходит при помощи оператора прерывания break. Оператор continue возобновляет выполнение цикла с первого оператора, игнорируя следующие за ним операторы. Например,

for (int i = 1; ; i++)

{

Console.WriteLine(i);

if (i <= 5)

continue;

else

break;

}

Console.ReadKey();

Здесь пока i не достигло 5, цикл возобновляет свою работу с самого начала. При i>5 выполнение цикла прервется оператором break.

Примеры использования цикла for в программах см. гл. 2.

Оператор while

Оператор while реализует цикл по условию с проверкой условия до первого прохождения цикла (цикл с предусловием). В отличии от цикла for количество проходов цикла while неизвестно до начала выполнения цикла. Общий вид цикла:

While (условие)

{

Операторы

}

Операторы выполняются пока условие имеет значение true. Например:

using System;

class Program

{

static void Main()

{

int i = 1;

while (i < 6)

{

Console.WriteLine(i);

i++;

}

Console.ReadKey();

}

}

В последовательные строки выводятся числа от 1 до 5.

Внутри цикла, как и для цикла for, могут быть операторы break, прерывающий цикл, и continue, передающий управление на следующую итерацию. Их использование аналогично.

Операторы цикла do-while

Операторы цикла do-while реализуют цикл по условию с проверкой условия после первого прохождения цикла (цикл с постусловием). Общий вид цикла:

do

{

Операторы

}

While (условие);

Операторы выполняются до тех пор пока условие имеет значение true. Например,

using System;

class Program

{

static void Main()

{

int i = 1;

do

{

Console.WriteLine(i);

i++;

}

while (i < 6);

Console.ReadKey();

}

}

Результат выполнения программы будет тот же, что и в предыдущем примере.

Цикл можно прервать оператором break. Для перехода непосредственно к оператору вычисления выражения While (проверке условия) используется оператор continue.

Примеры программ с использованием циклов по условию см. гл. 2.

Оператор выбора switch

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

switch (выражение)

{

case n1:

Операторы1

break;

case n2:

Операторы2

break;

. . .

case nn:

ОператорыN

break;

[default:

Операторы

break;]

}

Управление передается оператору case, номер которого совпадает со значением оператора switch. После выполнения операторов соответствующего case, выполняется оператор break, и управление передается за пределы оператора switch. Если ни одно значение из n1, n2,..., nn не совпадает со значением выражения switch, то управление передается на операторы, следующие за default. Если default отсутствует, управление передается за пределы оператора switch (см. гл. 2, пример 2.22).

Оператор безусловного перехода goto

Оператор безусловного перехода goto передает управление помеченному оператору. Общий вид оператора:

goto метка;

Метка – идентификатор, после которого располагается двоеточие. Размещается в отдельной строке перед оператором, которому будет передано управление при выполнении оператора goto. Например,

goto label1;

. . .

label1:

Console.WriteLine(“конец”)

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

Может использоваться также для явного перехода к какой-либо строке case в операторе switch вместо break:

switch (выражение)

{

case n1:

Операторы1

break;

case n2:

Операторы2

goto case n1;

. . .

case nn:

ОператорыN

break;

[default:

Операторы

break;]

}

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

Составной оператор (блок)

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

Ввод-вывод

Ввод данных

int a; string s = Console.ReadLine(); a = int.Parse(s);

Вывод данных

Простейшие варианты использования указанных средств для вывода значений отдельных переменных использованы в приведенных выше программах. Вывод может быть организован с использованием формата. В этом случае оператор… WriteLine (["строка формата",] список вывода);

Организация циклов

Циклом называется многократно повторяющаяся последовательность действий (операторов). Цикл – типичная структура, характерная для программ, реализуемых на компьютере. Средства языка C# для организации циклов приводятся в п. 1.7.2, 1.7.3, 1.7.4.

Циклы по счетчику

При организации цикла по счетчику необходимо: 1) выделить повторяющиеся действия и записать их в общем виде; 2) выбрать управляющую переменную цикла. Это может быть какая-либо величина, имеющаяся в постановке задачи, либо…

Циклы по условию

Пример 2.8. Определить количество (n) членов арифметической прогрессии , сумма которых впервые превысит заданное число р.

Вложенные циклы

Вначале ограничимся вычислением суммы при заданном значении х. Здесь член суммы необходимо вычислять рекуррентно. Для вывода рекуррентной формулы… Таким образом, чтобы получить i-й член из предыдущего (i-1)-го члена, его нужно домножить на 2х/i.

Массивы. Типовые алгоритмы обработки массивов

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

Одномерные массивы и алгоритмы их обработки

int[] array; (Пустые квадратные скобки указывают на то, что переменная array является… В соответствии с этим объявлением под переменную массива array выделяется ячейка памяти для хранения ссылки на…

Схема алгоритма

· x сравнивается со средним элементом массива.

· Индекс среднего элемента i = (i1+i2)/2, где i1 = 0, i2 = n – 1.

· Если x = a(i), задача решена.

· Если x<a(i), то поиск продолжается в левой половине:
i2 = i – 1, i1 не изменяется.

· Если x>a(i), то поиск продолжается в правой половине:
i1 = i + 1, i2 не изменяется.

· Искомый элемент отсутствует в массиве, если выполнится условие i2<i1.

Реализовать алгоритм самостоятельно.

12. Объединение двух массивов с чередованием элементов.

Требуется объединить два массива одинакового размера A = (a0, a1, …, an–1 ) и B = (b0, b1, …, bn–1) в один массив C = (a0, b0, a1, b1,…, an–1, bn–1).

Элементами массива С с четными индексами являются элементы массива A:

c0 = a0; с2 = a1; …; с2i = ai, …,

элементами с нечетными индексами – элементы массива B:

c1 = b0, c3 = b1…, … , с2i–1 = bi,…

Таким образом, требуется организовать цикл и выполнить операции

с2i= ai, с2i1 = bi 1, для i = 0, 1, 2, , n – 1.

Если массивы имеют разные размеры, то больший массив обрезается по размеру меньшего и меньший массив и урезанный большой объединяются в соответствии с предложенным алгоритмом. Далее оставшиеся элементы большего массива пересылаются подряд.

13. Объединение двух упорядоченных массивов в один с сохранением упорядоченности.

Требуется объединить два упорядоченных по убыванию массива A размером n и B размера m в один массив C размером n + m, также упорядоченный.

Схема алгоритма

Начиная с первых элементов массивов A и B, сравниваем элементы A[i] и B[j]. В массив C пересылаем больший из них, например, A[i] (если выполняется условие A[i]>=B[j]).

· Далее продолжаем пересылать в массив C элементы массива A (индекс j при этом не меняется), пока очередной элемент массива A не будет меньше B[j] (условие A[i] >=B[j] не выполняется).

· Тогда начинаем пересылать в массив C элементы массива B (индекс i при этом не меняется), пока для какого-либо элемента массива B не будет снова выполнено условие (A[i] >=B[j]).

· Если один из массивов исчерпан (выполнено условие i > n или j > m), то оставшиеся элементы другого массива пересылаются друг за другом без всяких проверок.

Реализовать алгоритм самостоятельно.

14. Инвертирование массива

· Требуется изменить порядок следования элементов массива размером n на обратный, т.е. поменять местами нулевой элемент массива с (n – 1)-м, первый с (n – 2)-м, i-й с (n – (i+1))-м. Последними нужно поменять местами средние элементы, т.е. (n/2)-й и (n/2 + 1)-й.

15. Циклический сдвиг

· Требуется переместить элементы массива А размера n на m позиций вправо. При этом m элементов из конца массива перемещаются в начало:

А = (a1, a2, a3, a4, a5) – исходный массив;

A = (a4, a5, a1, a2, a3) – после циклической перестановки на 2 позиции вправо.

Вариант 1. Используется вспомогательный массив для временного хранения m последних элементов массива А. Далее оставшиеся элементы с нулевого по (n m – 1)-й смещаются вправо на m позиций. (Заметим, что перемещение нужно начинать с последнего из перемещаемых элементов, чтобы не испортить элементы массива А.) После этого в первые m элементов пересылаются элементы вспомогательного массива.

Вариант 2. Циклический сдвиг осуществляется с использованием одной вспомогательной переменной, в которую каждый раз пересылается последний элемент массива А, после чего все элементы сдвигаются вправо на 1 позицию (начиная с конца), и на место первого элемента помещается значение вспомогательной переменной. Эта процедура повторяется m раз.

Работа с массивами как с объектами

Если мы поставим точку после имени массива, например, a, то мы получим доступ к методам экземпляра и свойствам экземпляра типа Array.  

Работа с матрицами

int[,] array = new int[4, 2]; Отображение значений и типа элементов массива в окне «Локальные» после…

Структуры и классы

Классы и структуры являются двумя основными типами в C#. Классы и структуры представляют собой типы, создаваемые пользователем. Структура является типом значения. Класс является ссылочным типом (см. п. 1.1). Далее рассматривается работа со структурами и с классами (определение, создание объектов соответствующего типа, различные способы инициализации полей и т. п.). Для решения многих задач можно использовать как классы, так и структуры. Однако классы имеют более широкое применение. В частности, классы допускают наследование, что позволяет на базе одного (базового) класса без особых затрат создавать различные производные классы (см. п. 4.3).

Использование структур

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

Пример.

using System;

struct Sportsmen

{

public string famile;

public int rez;

}

class Program

{

static void Main()

{

Sportsmen temp;

temp.famile = "Иванов";

temp.rez = 17;

Sportsmen[] sp = new Sportsmen[5];

sp[0] = temp;

Console.WriteLine("Фам {0}\t Результат {1:f2}",

sp[0].famile, sp[0].rez);

Console.ReadKey();

}

}

Пример 4.1. Протокол соревнований по прыжкам в высоту содержит список фамилий и результатов (одна попытка) в порядке стартовых номеров. Получить итоговую таблицу, содержащую фамилии и результаты в порядке занятых мест. Количество спортсменов не более 30. Для размещения исходных данных используется массив структур. Структура содержит информацию – фамилия и результат спортсмена. Массив структур является в данном случае одномерным массивом и для его обработки можно использовать типовые алгоритмы, рассмотренные в гл. 3:

using System;

struct Sportsmen

{

public string famile;

public double rez;

}

class Program

{

static void Main()

{

Sportsmen[] sp = new Sportsmen[5];

string[] s = new string[] {

"Иванов", "Петров", "Сидоров",

"Кузнецов", "Макаров" };

double[] r = new double[] { 1.50,

1.55, 1.47, 1.46, 1.54 };

for (int i = 0; i < sp.Length; i++)

{

sp[i].famile = s[i];

sp[i].rez = r[i];

Console.WriteLine(

"Фамилия {0} \t Результат {1:f2}",

sp[i].famile, sp[i].rez);

}

//Упорядочение по результатам

for (int i = 0; i < sp.Length - 1; i++)

{

double amax = sp[i].rez;

int imax = i;

for (int j = i + 1; j < sp.Length; j++)

{

if (sp[j].rez > amax)

{

amax = sp[j].rez;

imax = j;

}

}

Sportsmen temp;

temp = sp[imax];

sp[imax] = sp[i];

sp[i] = temp;

}

Console.WriteLine();

for (int i = 0; i < sp.Length; i++)

{

Console.WriteLine(

"Фамилия {0} \t Результат {1:f2}",

sp[i].famile, sp[i].rez);

}

Console.ReadKey();

}

}

Здесь исходные данные первоначально заданы в двух массивах: фамилии в массиве s, результаты – в массиве r. Далее этими данными заполняются поля структуры.

В результат будет выведено:

Вопросы для самопроверки

1. Структура. Поля структуры. Члены структуры. Объявление структуры. Доступ к отдельным полям структуры.

2. Создание экземпляра структуры. Инициализация полей структуры.

3. Операции со структурами.

4. Преимущества использования структур.

5. Массивы структур и их обработка.

Задание для самостоятельного выполнения

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

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

3. Составить программу для обработки результатов кросса на 500 м для женщин. В кроссе участвуют не более 100 студенток. Для каждой участницы ввести фамилию, группу, фамилию преподавателя, результат. Получить результирующую таблицу, упорядоченную по результатам, в которой содержится также информация о выполнении норматива. Определить суммарное количество участниц, выполнивших норматив.

4. Радиокомпания провела опрос слушателей (не более 500) по вопросу: «Кого вы считаете человеком года?». Определить пять наиболее часто встречающихся ответов и их долей (в процентах от общего количества ответов).

5. Лыжные гонки проводятся отдельно для двух групп участников (в каждой группе не более 50 человек). Результаты соревнований заданы в виде фамилий участников и их результатов в каждой группе. Расположить результаты соревнований в каждой группе в порядке занятых мест. Объединить результаты обеих групп с сохранением упорядоченности и вывести в виде таблицы с заголовком.

6. Обработать результаты первенства по футболу (участвуют не более 15 команд). Результаты каждой игры заданы в виде названий команд и счета (количество забитых и пропущенных мячей). Сформировать таблицу очков (выигрыш – 3, ничья – 1, проигрыш – 0) и упорядочить результаты в соответствии с занятым местом. Если сумма очков у двух команд одинакова, то сравниваются разности забитых и пропущенных мячей. Вывести результирующую таблицу, содержащую место, название команды, количество очков.

7. Для формирования сборной по хоккею предварительно отобрано 30 игроков. На основании протоколов игр (не более 15) составлена таблица, в которой содержится штрафное время каждого игрока по каждой игре (2, 5 или 10 мин). Написать программу, которая составляет список кандидатов в сборную в порядке возрастания суммарного штрафного времени. Игрок, оштрафованный на 10 мин, из списка кандидатов исключается.

8. Результаты сессии содержат оценки 5 экзаменов по каждой группе. Определить средний балл для пяти групп одного потока студентов и выдать список групп в порядке убывания среднего бала. Результаты вывести в виде таблицы с заголовком.

9. Студенты одной группы (не более 25 человек) в сессию сдают четыре экзамена. Составить список студентов, средний балл которых по всем экзаменам не менее «4». Результаты вывести в виде таблицы с заголовком в порядке убывания среднего балла.

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

11. В соревнованиях по прыжкам в воду принимают участие не более 20 спортсменов. Судят соревнования 7 судей. Каждый спортсмен выполняет 4 прыжка. Каждый прыжок имеет одну из шести категорий сложности, оцениваемую коэффициентом (от 2,5 до 3,5). Качество прыжка оценивается судьями по 6-балльной шкале. Далее лучшая и худшая оценки отбрасываются, остальные складываются, и сумма умножается на коэффициент сложности. Получить итоговую таблицу, содержащую фамилии спортсменов и итоговую оценку (сумму оценок по 4 прыжкам) в порядке занятых мест.

12. В соревнованиях по прыжкам со 120-метрового трамплина принимает участие не более 30 спортсменов. Судят соревнования 5 судей. Каждый судья выставляет оценку за стиль прыжка по 20-балльной шкале. Меньшая и большая оценки отбрасываются, остальные суммируются. К этой сумме прибавляются очки за дальность прыжка: 120 метров – 60 очков, за каждый метр превышения добавляются по 2 очка, при меньшей дальности отнимаются 2 очка за каждый метр. Получить итоговую таблицу соревнований, содержащую фамилию и итоговый результат для каждого участника в порядке занятых мест.

13. Группе студентов (не более 25) в результате полусеместровой аттестации были выставлены оценки по информатике, а также определено количество пропущенных занятий. Успеваемость каждого студента оценивается следующими баллами: «0» (неаттестован), «2», «3», «4» или «5». Вывести список неуспевающих (оценка «2») студентов в порядке убывания количества пропущенных ими занятий. Данные задать самостоятельно.

14. Протокол соревнований по прыжкам в воду содержит список фамилий спортсменов (не более 15) и баллы, выставленные 5 судьями по результатам 2 прыжков. Получить итоговый протокол, содержащий фамилии и результаты, в порядке занятых спортсменами мест по результатам 2 прыжков. Данные задать самостоятельно.

15. После окончания шахматного соpевнования турнирная таблица содержит фамилии участников (не более 10) и результаты сыгранных партий (выигрыш – 1 очко, ничья – 1/2 очка, проигрыш – 0 очков). Составить итоговую таблицу в порядке убывания полученных участниками очков. Данные задать самостоятельно.

4.2. Использование конструктора экземпляра
и других методов при работе со структурами

Рассмотрим более подробно различные способы инициализации полей структуры, работы с отдельными экземплярами структуры, в частности, включение методов в описание структуры на примере структуры Sportsmen (см. пример 4.1).

В примере 4.1 экземпляр (объект) структуры объявляется как обычная переменная указанием типа перед именем. В этом случае поля структуры остаются без значений, и их нельзя использовать до инициализации всех полей. Например,

using System;

namespace ConsoleApplication1

{

struct Sportsmen

{

public string famile;

public int rez;

}

class Program

{

static void Main(string[] args)

{

Sportsmen sp;

sp.famile = "Иванов";

sp.rez = 5;

Console.WriteLine(

"Фамилия {0} Результат {1:d}",

sp.famile, sp.rez);

}

}

}

Попытка вывести значения полей сразу после объявления переменной (до задания значений полям) приведет к сообщению об ошибке.

Объект структуры может быть создан и другим способом: с использованием оператора new:

Sportsmen sp = new Sportsmen();

В этом случае при создания объекта вызывается соответствующий конструктор экземпляра, который выполняет инициализацию полей нулями. Значения полей будут следующими:

Вывод значений полей в этом случае не приведет к ошибке.

Конструктор экземпляра – это метод с тем же именем, что и структура, вызываемый оператором new. Конструктор может иметь параметры, его можно описать при определении структуры и использовать для инициализации полей отдельных объектов структуры в более компактной и наглядной форме.

Рассмотрим пример 4.1 и в описание структуры включим еще один член: конструктор с параметрами.

{

public string famile;

public double rez;

public Sportsmen(string famile1, double rez1)

{

famile = famile1;

rez = rez1;

}

}

Теперь, если объявлен массив структур

Sportsmen[] sp = new Sportsmen[5];

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

sp[0] = new Sportsmen("Иванов", 1.50);

sp[1] = new Sportsmen("Петров", 1.55);

sp[2] = new Sportsmen("Сидоров", 1.47);

sp[3] = new Sportsmen("Кузнецов", 1.46);

sp[4] = new Sportsmen("Макаров", 1.54);

При вызове конструктора оператором new на место его первого параметра передается соответствующая фамилия, которая присваивается полю famile, а на место второго параметра – результат, который присваивается полю rez соответствующего экземпляра структуры (элементу массива структур).

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

Пусть, например, каждый спортсмен выполняет две попытки (rez1, rez2) и окончательный результат определяется суммой двух попыток (rez = rez1 + rez2). Описание структуры в этом случае может быть следующим:

struct Sportsmen

{

public string famile;

public double rez1, rez2, rez;

public Sportsmen(string famile1,

double rezz1, double rezz2)

{

famile = famile1;

rez1 = rezz1;

rez2 = rezz2;

rez = rez1 + rez2;

}

}

Замечания.

1. Имена параметров конструктора не должны совпадать с именами полей структуры. Если они совпападают, то нужно использовать ключевое слово this. Например:

struct Sportsmen

{

public string famile;

public double rez1, rez2, rez;

public Sportsmen(string famile,

double rez1, double rez2)

{

this.famile = famile;

this.rez1 = rez1;

this.rez2 = rez2;

rez = rez1 + rez2;

}

}

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

Следующая программа реализует решение задачи примера 4.1 для случая двух попыток с использованием конструктора:

using System;

struct Sportsmen

{

public string famile;

public double rez1, rez2, rez;

public Sportsmen(string famile1,

double rezz1, double rezz2)

{

famile = famile1;

rez1 = rezz1;

rez2 = rezz2;

rez = rez1 + rez2;

}

}

class Program

{

static void Main(string[] args)

{

Sportsmen[] sp = new Sportsmen[5];

sp[0] = new Sportsmen("Иванов", 1.50, 1.52);

sp[1] = new Sportsmen("Петров", 1.55, 1.8);

sp[2] = new Sportsmen("Сидоров", 1.47, 1.5);

sp[3] = new Sportsmen("Кузнецов", 1.46, 1.43);

sp[4] = new Sportsmen("Макаров", 1.54, 1.44);

for (int i = 0; i < sp.Length; i++)

{

Console.WriteLine(

"Фамилия {0}\t Результат {1:f2}",

sp[i].famile, sp[i].rez);

}

Console.ReadKey();

}

}

Теперь при выполнении, например, оператора

sp[0] = new Sportsmen("Иванов", 1.50, 1.52);

в поле rez будет помещаться сумма 3,02.

Результат выполнения программы:

Помимо конструктора описание структуры может содержать и другие методы (см. гл. 5). Например, в описании структуры

struct Sportsmen

{

public string famile;

public double rez;

public double factor(int i)

{

return i * rez;

}

}

описан метод factor для умножнния результата rez на коэффициент i.

После объявления в методе Main объекта структуры этот метод может быть вызван указанием имени объекта структуры и после точки имени метода и его аргумента в круглых скобках:

Sportsmen sp;

sp.famile = "Иванов";

sp.rez = 5.2;

double rez1 = sp.factor(3);

Console.WriteLine(rez1);

Console.ReadKey();

В результате переменная rez1 получит значение 15,6.

В описании структуры может быть описан также статический метод. Статический метод не применяется к конкретному объекту структуры, а относится ко всей структуре, и доступ к нему осуществляется по имени структуры, а не экземпляра (объекта) структуры (см. гл. 5).

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

struct Sportsmen

{

public string famile;

public double rez;

public static int sportsmenCounter = 0;

public static int AddSportsmen()

{

return sportsmenCounter = sportsmenCounter + 1;

}

}

Если в методе Main имеются операторы

Sportsmen sp;

sp.famile = "Иванов";

sp.rez = 5.2;

Sportsmen.AddSportsmen();//Вызов статического метода

Console.WriteLine (Sportsmen.sportsmenCounter);

sp.famile = "Петров";

sp.rez = 7.4;

Sportsmen.AddSportsmen();

Console.WriteLine(Sportsmen.sportsmenCounter);

то в результате их выполнения первым оператором WriteLine будет выведено 1, а вторым – 2.

Пример 4.2. Студенты одной группы (не более 25 человек) в сессию сдают четыре экзамена. Составить список студентов, средний балл которых по всем экзаменам не менее «4». Результаты вывести в виде таблицы с заголовком в порядке убывания среднего балла:

using System;

struct Struct1

{

public string famile;

public double[] x;

public double sred;

public Struct1(string famile1, double[] x1)

{

sred = 0;

famile = famile1;

x = x1;

for (int i = 0; i < 4; i++)

{

sred += x[i];

}

sred /= 4;// sred = sred/4

}

}

class Program

{

static void Main(string[] args)

{

Struct1[] cl = new Struct1[3];

cl[0] = new Struct1("Иванов",

new double[] { 3.0, 5.0, 2.0, 3.0 });

cl[1] = new Struct1("Петров",

new double[] { 5.0, 4.0, 5.0, 3.0 });

cl[2] = new Struct1("Сидоров",

new double[] { 5.0, 4.0, 5.0, 5.0 });

for (int i = 0; i < cl.Length; i++)

Console.WriteLine(

"Фамилия {0}\t Средний балл {1,4:f2}",

cl[i].famile, cl[i].sred);

for (int i = 0; i < cl.Length - 1; i++)

{

double amax = cl[i].sred;

int imax = i;

for (int j = i + 1; j < cl.Length; j++)

{

if (cl[j].sred > amax)

{

amax = cl[j].sred;

imax = j;

}

}

Struct1 temp;

temp = cl[imax];

cl[imax] = cl[i];

cl[i] = temp;

}

Console.WriteLine();

for (int i = 0; i < cl.Length; i++)

{

if (cl[i].sred >= 4)

Console.WriteLine(

"Фамилия {0}\t "

+ "Средний балл {1,4:f2}",

cl[i].famile, cl[i].sred);

}

}

}

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

Вопросы для самопроверки

1. Создание объекта структуры при помощи конструктора. Что такое конструктор экземпляра.

2. Особенности инициализации полей структуры при использовании конструктора экземпляра.

3. Различные способы задания значений полей структуры при использовании конструктора.

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

Задания для самостоятельного выполнения

Выполнить задания п. 4.1 с использованием конструктора и различных вариантов объявления структуры (внутри класса, вне класса).

Использование классов

Класс представляет собой создаваемый пользователем тип. Класс является ссылочным типом.

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

Поле – это переменная, объявленная в классе. У поля есть имя и тип. Метод – это функция, определенная в классе.

Рассмотрим определение класса, в котором содержатся два поля разных типов:

class Sportsmen

{

public string famile;

public int rez;

}

Здесь описан класс с именем Sportsmen с двумя полями: famile типа string и rez типа int. Описание класса располагается вне метода Main. В связи с этим уровень доступа к полям установлен максимальный (public – открытый доступ), что дает возможность доступа к полям из метода Main.

При создании экземпляра класса переменная, к которой назначается экземпляр, сохраняет только ссылку на память. Экземпляр класса создается в методе Main как обычно указанием типа перед именем переменной и обязательным использованием ключевого слова new:

Sportsmen temp = new Sportsmen();

Далее в поля этой переменной можно поместить значения (инициализировать поля класса). Для доступа к полю экземпляра класса нужно указать имя переменной и после точки имя поля. Например,

using System;

class Sportsmen

{

public string famile;

public int rez;

}

class Program

{

static void Main(string[] args)

{

Sportsmen temp = new Sportsmen();

temp.famile = "Иванов";

temp.rez = 75;

Console.WriteLine(

"{0}\t{1:f2}", temp.famile, temp.rez);

Console.ReadKey();

}

}

или

Объявление массива классов. Например,

Sportsmen[] sp = new Sportsmen[5];

Здесь объявлен массив sp из 5 элементов, каждый из которых содержит 2 поля.

Далее для каждого элемента массива необходимо выделить память:

for (int i = 0; i < 5; i++) sp[i] = new Sportsmen();

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

Можно создать конструктор с параметрами для инициализации полей экземпляра класса:

using System;

class Sportsmen

{

public string famile;

public double rez;

public Sportsmen(string famile1, double rez1)

{

famile = famile1;

rez = rez1;

}

}

class Program

{

static void Main(string[] args)

{

Sportsmen[] sp = new Sportsmen[3] {

new Sportsmen("Иванов", 1.50),

new Sportsmen("Петров", 1.55),

new Sportsmen("Сидоров", 1.47)};

for (int i = 0; i < sp.Length; i++)

Console.WriteLine(

"Фам {0}\t Результат {1:f2}",

sp[i].famile, sp[i].rez);

}

}

В отличие от структур, классы поддерживают наследование, фундаментальную характеристику объектно-ориентированного программирования.

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

using System;

class Sportsmen

{

public string famile;

public double rez;

}

class Sportsmen1 : Sportsmen

{

public string team;

}

class Program

{

static void Main(string[] args)

{

Sportsmen1 sp = new Sportsmen1();

sp.famile = "Иванов";

sp.rez = 77;

sp.team = "Спартак";

Console.WriteLine(

"Фам {0}\tКоманда {1}\tРезультат {2:f2}",

sp.famile, sp.team, sp.rez);

Console.ReadKey();

}

}

Здесь класс – Sportsmen базовый, класс Sportsmen1 наследует ему (является производным). В производном классе могут быть добавлены члены (поля, методы).

В данном примере в классе Sportsmen1 определено еще одно поле team.

В результате будет выведено:

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

Вопросы для самопроверки

1. Что такое класс? К какому типу относится класс? Как определить класс?

2. Каковы основные члены класса?

3. Как создать экземпляр класса?

4. Инициализация полей класса.

5. Объявление массива классов. Особенности выделения памяти под массив классов.

6. Использование конструктора экземпляра при работе с классами.

7. Что такое наследование классов и как оно реализуется?

8. Укажите основные различия между классами и структурами.

Задания для самостоятельного выполнения

Выполнить задания п. 4.1 с использованием классов, используя наследование по указанию преподавателя.

 

Методы

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

5.1. Общие положения.
Способы передачи параметров

Рассмотрим простейший пример.

using System;

namespace ConsoleApplication1

{

class Program

{

static void Main(string[] args)

{

int a = 2, c = 3;

Console.WriteLine(p(a, c));

Console.ReadKey();

}

 

static int p(int a1, int c1)

{

int s = a1 + c1;

return s;

}

 

}

}

В приведенной программе в классе Program определены методы Main и p. В методе p вычисляется сумма двух переменных целого типа. Метод возвращает одно значение s, которое вычисляется в этом методе. Если метод возвращает значение, то имя переменной, в которую помещается возвращаемое значение, указывается после ключевого слова return, присутствие которого в данном случае обязательно. Если метод возвращает значение, то необходимо указать тип возвращаемого значения, в данном примере int. Таким образом, заголовок метода p включает: ключевое слово static (значение которого обсудим позже), тип возвращаемого значения int, имя метода и в скобках параметры метода с указанием их типов. Все вместе эти элементы образуют подпись метода.

Вызов метода, возвращающего значение, осуществляется указанием имени метода и в скобках аргументов метода, которые заменяют параметры метода перед его выполнением. Обращение к методу записывается в том месте кода, где требуется получить значение, возвращаемое методом. В нашем примере обращение к методу p: p(a, c) записано в операторе вывода. Аргументы, указываемые при вызове метода, должны иметь тот же тип, что и параметры метода в описании метода, и должны получить значения к моменту обращения к методу.

C# имеет две разновидности типов: типы значений и ссылочные типы (см. п. 1.1). В приведенном примере переменные a и c являются экземплярами структуры int и относятся к типу значения.

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

Так, в данном примере при обращении к методу p в ячейку для параметра a1 пересылается значение a, т.е. 2, в ячейку для параметра c1 – значение c, т.е. 3, и переменная s получает значение 5, которое и выводится в окно экрана.

Рассмотрим второй вариант решения той же задачи:

using System;

namespace ConsoleApplication1

{

class Program

{

static void Main()

{

int a = 2, c = 3, x;

ps(a, c, out x);

Console.WriteLine(x);

Console.ReadKey();

}

 

static void ps(int a1, int c1, out int s)

{

s = a1 + c1;

 

}

}

}

Те же вычисления выполняются в методе, не возвращающем значения. Если метод не возвращает значения, он имеет тип void. В списке параметров метода перечислены входные (a1, c1) и выходной (s) параметры. Ключевое слово out перед выходным параметром, имеющим тип значения, означает передачу параметра по ссылке, т.е. при обращении к методу на место выходного параметра передается адрес аргумента, фигурирующего в обращении к методу. В примере передается не значение переменной x, а адрес переменной x. Параметр s не является типом int; он является ссылкой на тип int, в данном случае ссылкой на переменную x. Поэтому после вызова метода значение переменной x изменяется.

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

Для передачи по ссылке можно использовать также ключевое слово ref, но в этом случае аргумент, передаваемый по ссылке, должен быть инициирован до обращения к методу (при использовании ключевого слова out это необязательно). Ниже приводится вариант программы с использованием ref:

using System;

class Program

{

static void Main()

{

int a = 2, c = 3, x = 0;

//x присвоено фиктивное значение 0

p(a, c, ref x);

Console.WriteLine(x);

Console.ReadKey();

}

static void p(int a1, int c1, ref int s)

{

s = a1 + c1;

}

}

Замечание. Взаимное расположение методов в пределах одного класса не имеет значения. Управление всегда вначале передается методу Main.

Пример 5.1. Разработать (определить) метод для решения квадратного уравнения Вызвать метод для решения уравнения 3,2 + 4,6t – 5 = 0 и, если уравнение имеет решение, вывести на печать больший из корней. Если решения нет, вывести соответствующее сообщение.

Вариант 1. Метод root статический, методы root и Main в одном классе. Передача параметров с помощью ref:

using System;

class Program

{

static void root(double a, double b, double c,

ref double x1, ref double x2, ref bool l)

{

double d;

d = b * b - 4 * a * c;

if (d >= 0)

{

x1 = (-b + Math.Sqrt(d)) / (2 * a);

x2 = (-b - Math.Sqrt(d)) / (2 * a);

l = !l;

}

}

static void Main()

{

bool q = false;

double t1 = 0, t2 = 0, u = 0;

root(3.2, 4.6, -5.0, ref t1, ref t2, ref q);

if (q)

{

u = t1;

if (t2 > u) u = t2;

Console.WriteLine("{0} {1:f3}", q, u);

}

else

Console.WriteLine("решения нет");

Console.ReadKey();

}

}

Замечания.

1. Если два метода находятся в одном и том же классе, и один из них статический (метод Main статический по определению) и из него вызывается другой метод, то вызываемый метод должен быть статическим. Существует только одна копия статического метода. Ниже приводятся варианты (вариант 3 и вариант 4) решения этой же задачи, где использован нестатический метод (instance – экземплярный). Нестатический метод связан с экземпляром типа. Из нестатического метода можно обращаться к экземплярным полям и методам, а также к статическим полям и методам.

2. В случае использования ref переменные должны быть инициализированы до вызова. Ниже приводится листинг кода (начальные и конечные строки обрезаны) с выведенными сообщениями об ошибках, вызванных отсутствием инициализации аргументов метода, передаваемых по ссылке.

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

Вариант 2. Метод root статический, методы root и Main в одном классе. Передача параметров с помощью out. В вариантах 2, 3 и 4 возможность отсутствия решения уравнения не учитывается.



using System;

class Program

{

static void root(double a, double b, double c,

out double x1, out double x2, out bool l)

{

double d;

l = false;

d = b * b - 4 * a * c;

x1 = 0;

x2 = 0;

if (d >= 0)

{

x1 = (-b + Math.Sqrt(d)) / (2 * a);

x2 = (-b - Math.Sqrt(d)) / (2 * a);

l = !l;

}

}

static void Main()

{

bool q;

double t1, t2, u = 0;

root(3.2, 4.6, -5.0, out t1, out t2, out q);

if (q)

{

u = t1;

if (t2 > u) u = t2;

Console.WriteLine("{0} {1:f3}", q, u);

}

else

Console.WriteLine("решения нет");

Console.ReadKey();

}

}

Вариант 3. Метод root не статический и метод Main (статический) в одном классе Program:

using System;

class Program

{

void root(double a, double b, double c,

ref double x1, ref double x2, ref bool l)

{

double d;

d = b * b - 4 * a * c;

if (d >= 0)

{

x1 = (-b + Math.Sqrt(d)) / (2 * a);

x2 = (-b - Math.Sqrt(d)) / (2 * a);

l = !l;

}

}

static void Main()

{

bool q = false;

double t1 = 0, t2 = 0, u = 0;

//создается экземпляр класса

Program pr = new Program();

// pr – переменная типа Program

//метод root экземпляра pr класса Program

pr.root(3.2,4.6, -5.0, ref t1, ref t2, ref q);

if (q)

{

u = t1;

if (t2 > u) u = t2;

Console.WriteLine("{0} {1:f3}", q, u);

}

else

Console.WriteLine("решения нет");

Console.ReadKey();

}

}

Вариант 4. Методы root и Main в разных классах:

using System;

class test

{

public void root(double a, double b, double c,

ref double x1, ref double x2, ref bool l)

{

double d;

d = b * b - 4 * a * c;

if (d >= 0)

{

x1 = (-b + Math.Sqrt(d)) / (2 * a);

x2 = (-b - Math.Sqrt(d)) / (2 * a);

l = !l;

}

}

}

class Program

{

static void Main()

{

bool q = false;

double t1 = 0, t2 = 0, u = 0;

test pr = new test();

//pr – экземпляр класса test

//вызывается метод root

//экземпляра pr класса test

pr.root(3.2, 4.6,-5.0, ref t1, ref t2, ref q);

if (q)

{

u = t1;

if (t2 > u) u = t2;

Console.WriteLine("{0} {1:f3}", q, u);

}

else

Console.WriteLine("решения нет");

Console.ReadKey();

}

}

В последнем варианте метод root имеет модификатор доступа public (открытый), обеспечивающий доступ к этому методу из другого класса.

Пример 5.2. Вычислить число сочетаний из n по m: C = n!/(m!(n m)!), (в программе cnm). Вычисление факториала оформить в виде метода, возвращающего значение.

Вариант 1. Методы Main и fact для вычисления факториала в разных классах.

using System;

class test

{

public int fact (int n)

{

int f = 1;

for (int i = 2; i <= n; i++)

{

f = f * i;

}

return f;

}

}

class Program

{

static void Main()

{

int n = 4, m = 3 ;

int cnm;

test pr = new test();

cnm = pr.fact(n)/(pr.fact(m)*pr.fact(n - m));

Console.WriteLine("{0}",cnm);

}

}

Вариант 2. Методы Main и fact для вычисления факториала в одном классе:

using System;

class Program

{

static int fact(int n)

{

int f = 1;

for (int i = 2; i <= n; i++)

{

f = f * i;

}

return f;

}

static void Main()

{

int n = 5, m = 3 ;

int cnm;

cnm = fact(n)/ (fact(m) * fact(n - m));

Console.WriteLine("{0}",cnm)

Console.ReadKey();

}

}

Использование массивов в качестве параметров

Пример 5.3. Максимальный элемент массива а размера 6 поменять местами с максимальным элементом массива b размера 8. Оформить метод для поиска… using System; class Program

Работа с текстовыми строками

Для текстовых строк определены операции конкатенации (объединение) строк. Эта операция может быть выполнена с помощью оператора «+» или метода… string str1="Катя"; string str2="Иванова";

Файлы данных (Пространство имен System.IO). Файлы и потоки

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

Работа с элементом управления TextBox

Текстовые поля форм Windows Forms используются для приема данных, вводимых пользователем, или для отображения текста. В текстовых полях можно выводить несколько строк текста, размещать текст в соответствии с размером элемента управления и применять основные элементы форматирования. Для вывода числовых данных в текстовое окно необходимо получить их строковое представление. После ввода числовых данных в текстовое окно необходимо использовать метод Parse для получения числового значения из строкового представления.

Пример 8.1

using System;

using System.Windows.Forms;

namespace WindowsFormsApplication1

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

private void Form1_Load(object sender, EventArgs e)

{

int b = 2;

textBox1.Text = b.ToString();

int a = int.Parse(textBox1.Text);

a += 2;

textBox2.Text = a.ToString();

}

}

}

TextBox – это класс пространства имен: System.Windows.Forms. Экземпляр класса textBox1 создается при добавлении элемента управления на форму. Здесь Text – это свойство, которое имеет тип string и возвращает или задает текст.

В первое текстовое поле выведено значение переменной b. Обратите внимание на то, что перед выводом числа в окно оно должно быть преобразовано в строковую форму. Далее числовое значение, представленное в этом текстовом поле в строковой форме, преобразуется в числовую форму (при помощи метода Parse) и присваивается переменной a. Далее значение a изменяется (увеличивается на 2) и выводится во второе текстовое поле, будучи перед этим преобразовано в строковую форму при помощи метода ToString().

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

textBox1.Text = «2»;

(число 2 представлено как строковая константа).

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

Если пользователю необходимо вводить исходные данные в элемент управления формы «Текстовое поле», то необходимо изменить пример и перенести код из обработчика события формы Load в обработчик события Click кнопки (см. пример 8.3).

Работа с элементом управления Button

1. В меню «Вид» выберите команду «Панель элементов», чтобы открыть список элементов управления. 2. Разверните список «Стандартные элементы управления» и перетащите элемент…

Пример 8.3

using System;

using System.Drawing;

using System.Windows.Forms;

namespace WindowsFormsApplication1

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

private void Form1_Load(object sender, EventArgs e)

{

}

private void button1_Click(object sender, EventArgs e)

{

int a = int.Parse(textBox1.Text);

a += 2;

textBox2.Text = a.ToString();

}

}

}

Щелчок мышью по кнопке button1 является событием, которое вызывает выполнение метода button1_Click, соответствующего этому событию. При этом текст, введенный в текстовое поле textBox1, преобразуется в целое число и присваивается переменной a, значение которой далее увеличивается на 2 и выводится в текстовое поле textBox2.

Работа с элементом управления RichTextBox

Откройте окно конструктора Windows Forms с формой Windows. 1. В меню «Вид» выберите команду «Панель элементов», чтобы открыть список… 2. Разверните список «Стандартные элементы управления» и перетащите два элемента управления RichTextBox и кнопку на…

Создание объекта Graphics пространства имен System.Drawing для рисования

Перед тем как рисовать линии и фигуры, отображать текст, выводить изображения и управлять ими, необходимо создать объект класса Graphics. Объект… Откройте окно конструктора Windows Forms с формой Windows. Выделите форму. В…

Среда разработки

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

Во введении на простом примере была представлена последовательность действий для создания консольного приложения. Повторим коротко эти шаги.

1. Создать новый проект Visual Studio C#. В меню «Файл» выбрать команду Создать проект:

2. Создать в рамках этого проекта «Консольное приложение» (выбрать в открывшемся окне, шаблон «Консольное приложение» и нажать OK). Откроется основное окно Visual C# и окно «Редактор кода» с областью для ввода и редактирования кода:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace ConsoleApplication1

{

class Program

{

static void Main(string[] args)

{

}

}

}

3. Набрать код, расположив его между двумя внутренними фигурными скобками.

Сохранение проекта

Для сохранения проекта в меню «Файл» выберите команду «Сохранить». Откроется окно «Сохранить проект»:

Нажатием на кнопку «Обзор» выберите каталог для сохранения решения. Проект входит в «Решение». «Решение» может содержать несколько проектов. Введите имя папки, в которой хотите сохранить проект. Нажмите кнопку «Сохранить».

Открытие существующего проекта

9.4. Использование интегрированной среды разработки Visual C# Интегрированная среда разработки Visual C# представляет собой набор средств разработки, предоставляемых через единый…

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

Компилятор C# для преобразования исходного кода C# в исполняемую программу … Построить и запустить приложение можно в рамках одной операции, для этого необходимо нажать клавишу F5 или в меню…

Ошибки построения

При наличии ошибок приложение не будет построено, и в окне «Список ошибок» откроется список ошибок. Для того чтобы открыть окно «Список ошибок» необходимо в меню «Вид» выбрать команду «Список ошибок». Ниже приводятся примеры ошибок и их описаний, выдаваемых на этапе отладки:

Если приложение не построилось из-за наличия ошибки, то необходимо в меню «Отладка» выбрать команду «Остановить отладку».

Отладчик Visual Studio для тестирования программы

На любом этапе работы в редакторе кода можно задать точку останова на строке кода и далее выбрать в меню «Отладка» команду «Начать отладку». Приложение остановится на этой строке, и можно будет увидеть значение заданной переменной в окне «Локальные». Для того чтобы остановить отладку необходимо выбрать в меню «Отладка» команду «Остановить отладку». Для того чтобы продолжить выполнение программы по строкам кода, можно воспользоваться клавишей F10.

Обозреватель объектов для просмотра методов и классов, доступных в библиотеках

В меню «Вид» выберите команду «Другие окна» и команду «Обозреватель объектов».

На рисунке отображены названия типов. Класс Console – статический класс пространства имен System в окне обозревателя объектов. В верхней правой части окна обозревателя отображены имена членов типа Console – названия методов и свойств.

Обозреватель объектов состоит из трех областей: области объектов слева, области членов в верхней правой части и области описаний в нижней правой части.

Значки обозревателя объектов

Обозреватель объектов позволяет выбирать и анализировать символы, доступные к использованию в рамках проектов. В следующей таблице приведены значки…

Библиографический список

Рихтер. Дж. Программирование на платформе Microsoft .NET Framework. – М.: Издательско-торговый дом «Русская редакция»; СПб.: Питер, 2005. – 512 стр.

Фролов А.В., Фролов Г.В. Язык С#. Самоучитель. – М.: ДИАЛОГ-МИФИ, 2003. – 560 с.

Библиотека MSDN (по-русски) http://msdn.microsoft.com/ru-ru/library/ default.aspx

Спецификация языка C# http://msdn.microsoft.com/ru-ru/vcsharp/ aa336809.aspx

ПРИЛОЖЕНИЯ

Приложение 1

Платформа Microsoft .NET Framework

1) современный набор инструментальных средств для разработки программного обеспечения; 2) общеязыковую исполняющую среду, которая предоставляет… 3) библиотеку классов, которая предоставляет объектно-ориентированный интерфейс, используемый всеми моделями…

Приложение 2

Таблицы встроенных типов

Таблица типов с плавающей запятой Тип Приблизительный диапазон Точность float От ±1,5e−45 до … Ключевое слово decimal обозначает 128-разрядный тип данных. По сравнению с… Ключевое слово bool используется для объявления переменных для хранения логических значений true и false.

Приложение 3

Региональные стандарты

Платформа .NET Framework предоставляет широкие возможности для разработки международных приложений. При разработке международных приложений… Глобализация является первым этапом разработки международных приложений. На… Перед переходом к локализации необходимо выполнить промежуточную проверку, позволяющую определить Локализуемость…

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

Редактор М.Б. Линчевская

Компьютерная верстка А.В. Калинкиной, И.Г. Иваньшиной

Подписано в печать 00.04.11 Бумага офсетная  
Формат 60 ´ 90 1/16 Печать офсетная Уч.-изд. л. 12,3
Рег. № 209 Тираж 1350 экз. Заказ

Национальный исследовательский
технологический университет «МИСиС»,

119049, Москва, Ленинский пр-т, 4

издательский Дом МИСиС,

119049, Москва, Ленинский пр-т, 4

тел. (495) 638-45-22

Отпечатано в типографии издательского Дома МИСиС

119049, Москва, Ленинский пр-т, 4

тел. (499) 236-76-17, тел./факс (499) 236-76-35