Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Программирование на C#. Часть 1. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
☆
1.5. ОБЪЯВЛЕНИЕ И ИНИЦИАЛИЗАЦИЯ ПЕРЕМЕННЫХ
Объявление переменной типа-значения в методе класса приводит к созданию в памяти объекта соответствующего типа, возможно, проинициа­лизированного определённым значением. Это значение может быть задано в виде литерала соответствующего типа, либо в виде выражения.
Например, объявление переменной с и к имеет вид:
int с; // Объявление с.
int к; // Объявление к.
Предложение объявления мо
жет содержать р
азличные спецификаторы, указание имени типа, имени объекта и выражения инициализации. Выраже­ние инициализации может быть представлено литералом, либо выражением.
Ниже приведённые объявления равноценны:
int с;
System.Int32 с;
Формы записи операторов определения и инициализации переменных
типа значения имеют вид:
int с = 0;
int с = new int();
System.Int32 с = 0;
System.Int32 с = new System.Int32();
Не допускается испол
ьзования в выражениях неинициализированных
локальных переменных
.
Объявления констант сопровождаются дополнительным спецификато­ром const и требуют непосредственной инициализации. В примере константа инициализируется литералом 9.8.
const floatg = 9.8;
Любой используемый в блоке программы объект вводится объявлени­ем. Под блоком понимается множество предложений, заключённое в фигур­ные скобки. Объекты можно объявлять в любом месте блока. Точка объявле­ния объекта соответствует месту её со
здания. Обращение к объекту
«выше»
11
точки её объявления лишено смысла. Новый блок представляет новую об­ласть видимости. Объекты, объявляемые во внутренних блоках, не видны во внешних блоках. Объекты, объявленные в методе и во внешних блоках, вид­ны и во внутренних блоках. Одноимённые объекты во вложенных областях конфликтуют. Не допускается объявления одноимённых данных-членов в те­ле класса. В теле класса не допускает пустыми списками параметров. Так же не допускают
ся объявления одноимённых методов с
ся объявления одно­имённых методов со списками параметров, у которых совпадают типы пара­метров.
В программировании часто вместо понятия объект используется поня­тие переменная. Под переменной понимается расположение в памяти объекта определённого типа. Для создания переменной необходи
мо
задать тип пере­менной и дать этому типу имя. Переменные могут принимать значения, ко­торыми они проинициализированы, или эти значения могут быть получены программно. Ниже приведён пример программы, в которой в первом случае используется инициализация для присвоения значения переменной, во вто­ром случае используется присвоение значения переменной с помощью опе­ратора присвоения«=»:
Class Var
{
static void Main()
{
System
int my = 1
.Console.WriteLine ("Инициализированная переменная my:{0}",my);
0;
my=5; System.Console.WriteLine ("Переменная my после присвоения значения: {0}",
my);
Console.ReadLine();
}
} Результат работы этой программы будет следующий:
12
Инициализированная переменная my: 10 Переменная my после присвоения значения: 5 Здесь строка:
int my = 10;
означает объявление и инициализацию переменной my. Строка:
my = 5 ;
означает присвоение переменной my значения 5.
Переменная, значение которой не может быть изменено, называется константой. Константа гарантирует сохранение значения определённой пе­ременной. Например, число pi приблизительно равно
3.1415926535897932384626433832795.
Если в программе имеется оператор
у = х*3.1415926535897932384626433832795;,
то для лучшей читаемости используется переменная, которая хранит значе­ние pi.
В этом случае используем константу
constdoublepi = 3.1415926535897932384626433832795;
у = х * pi;
Различают три разновидности констант: литералы, символические кон­станты и перечисления. Рассмотрим пример:
х = 100;
Значение 100 является литеральной константой. Символические кон­станты устанавливают имя для постоянного значения. Ниже приведён син­таксис для создани
const тип
я константы:
идентификатор = значение;
Константа должна быть обязательно проинициализирована. Её значе­ние не может быть изменено в программе.
const double pi = 3.1415926535897932384626433832795;
pi = 3.0; //недопустимая операция
Число 3.14... является литеральной константой, a pi – символической константой типа double.
13
Перечисления – это особый тип значений, который состоит из набора именованных констант. Предположим, что имеется список констант, содер­жащих цвета радуги. Если использовать константы, то объявление примет вид: Красный, оранжевый, жёлтый, зелёный, голубой, синий, фиолетовый
const string rnRed=”Красный”;
const string rnOrange=”Оранжевый”;
const string rnYellow l=”Желтый”;
const string rnGreen=”Зеленый”;
const string rnBlue=”Голубой”;
const string rnIndigo=”Синий”;
const stringrnViolet=”Фиолетовый”;
Получились семь совершенно не связанных констант. Для установле­ния логической связи в С# предусмотрен механизм перечислений:
enumRainbow
{ Красный, Оранжевый, Желтый, Зеленый, Голубой, Синий, Фиолето­вый }
Теперь семь символических констант являются элементами одного пе­речисления типа Rainbow.
Перечисление задаётся следующим образом:
[атрибуты] [модификаторы] enum идентификатор[: базовый тип] {спи­сок перечислений}; Перечисление объявляется с помощью ключевого слова enum, идентифици­руется по имени и представляет собой непустой список неизменяемых име­нованных значений интегрального типа. Первое знач
ение в перечислении по умолчанию инициализируется нулём. Каждое последующее значение отли­чается от предыдущего, по крайней мере, на единицу, если объявление зна­чения не содержит явного дополнительного присвоения нового значения. Пример объявления перечисления c явным указанием значения
приводится
ниже.
enum Colors { Red = 5, Green = 2, Blue = 4, Yellow = 8 };
14
Обращение к элементу перечисления осуществляется посредством сложного выражения, состоящего из имени класса перечисления, операции доступа к элементу перечисления '.', имени элемента перечисления:
intxVal = Colors.Red; //Переменная xVal инициализируется значением перечисления.
enum Rainbow
{ Красный, Оранжевый, Желтый, Зеленый, Голубой, Синий, Фиолетовый }
inti;
Rainbow Rn = Rainbow.Красный;
label1.Text = Rn.ToString();
i = (int)Rn;
label2.Text = i.ToString();
Теперь семь символических констант являются элемент речислен
ия типа Rainbow. В этом примере Rn имеет значение Красный и это
ами одного пе-
слово появится на форме, а (int)Rn примет значение 0 и это число тоже поя- вится на форме.
Перечисление является классом, поэтому в распоряжении программи­ста оказываются методы сравнения значений перечисления, методы преобра­зования з
начений п
еречисления в строковое представление, методы перевода
строкового представления значения в перечисление.
Если содержимое строки заключить в двойные кавычки, то получим строковую константу. Например, константная строка «Привет». Инициализа­ция строковой переменной str строковой константой запишется в следующем виде:
str=“Привет”;
Объявление массивов вС# поясним на примерах.
Пример 1:
int [] к; //к-массив
k = new int [5
];//Опр
еделяем массив из 5 целых // Задаем элементы массива к[0] = –5; к[1] = –4; к[2] = 55;к[3] = 10; к[4] = 155;
15
//Выводим пятый элемент массива
Console.WriteLine(к[4].ToString()); Нумерация индексов в массиве начинается с 0. Ниже приведены варианты неправильного объявления массивов:
int k[];
int k[4]; int [2]к;
Так как массив представляет собой ссылочный объект, то для создания
массива необходима строка
k = new int [5];,
которая определяет размер массива. Возможны конструкции вида
int [] k = new int [5];
или
int []
к = {–5, 4, 55, 10, 155};
Рассмотренные вы
ше конструкции применимы также и к другим ти-
пам. Двумерный массив объявляется следующим образом:
int [,] k = new int[4,5];.
Размерность массива определяется количеством запятых плюс один.
В приведённом примере массив k двухмерный, состоящий из 20 (=4*5) эле­ментов (к[0,0] – первый, к[3,4] – последний).
По аналогии задаются и многомерные массивы: int[,,] к = new int[6,6,6];. Массивы можно ср
азу инициализировать:
int[,] r = {{1, –1},{4, –2},{3,5}};.
Рассмотренные вы
ше массивы называются прямоугольными.
1.6. ОПЕРАЦИИ И ВЫРАЖЕНИЯ
Выражения определяют действия и последовательность вычисления
значения. Они могут состоять из констант, переменных, стандартных мето­дов, разделённых скобками и знаками операций (см. табл. 1.3).
16
Порядок выполнения операций определяется скобками, а при их отсут-
ствии – согласно приоритету операций (см. табл. 1.4).
Одним из аспектов безопасности языка является приведение типов.
В программе типы характеризуются собственными диапазонами значений, которые определяются свойствами типов. Области значений некоторых ти­пов пересекаются, а некоторые значения можно выразить более чем одним типом. Например, значение 12 можно представ
ить, как
значение типа sbyte,
byte, short, int, uint, ulong. В программе результаты этих преобразований
должны быть предсказуемы.
1.3. Категории операций
Категории операций Операции
Арифметические + – * / % Логические (boolean и побитовые) & | ^ ! ~ && || Строковые (конкатенаторы) +
Increment, decrement ++ --
Сдвига >><< Сравнения == != <><= >=
Присвоения
= += –= *= /= %= &= |= ^=
<<= >>=
Memberaccess
.
Индексации []
Cast (приведение типа) () Conditional (трёхоперандная) ?:
Delegate concatenation and removal
+ –
Создания объекта new()
Type information is sizeof typeof Overflow exception control (управление исклю-
чениями)
checked unchecked
Indirection and Address (неуправляемый код) * –> [] &
17
1.4. Приоритет операций
Приоритет Операции
1 () [] . (постфикс)++ (постфикс)–– newsizeoftypeofunchecked 2 ! ~ (имя типа) +(унарный) –(унарный) ++(префикс) ––
(префикс)
3 * / %
4 + –
5 <<>>
6 <><= =>is
7 == !=
8 &
9 ^
10 |
11 &&
12 ||
13 ?:
14 = += –= *= /= %= &= |= ^= <<= >>=
В одном выражении обычно присутствуют операнды различных типов.
Поэтому при определении значения выражения есть необходимость приведе­ния значений операндов к некоторому «общему типу».
Если приведение значения к другому типу происходит автоматически,
то такие преобразования называются неявными.
В остальных случаях программист должен явным образом указывать
необходимость преобразования, используя выражения приведения типа или обращая
сь к специальным методам преобразования, определённым в классе
System.Co
nvert, которые обеспечивают преобразование значения одного типа
к значению другого (в том числе, значения строкового типа к значениям ба­зовых типов).
Различают расширяющее и сужающее преобразования типов. Расши-
ряющее преобразование типов считается безопасным, так как информация в
18
этом случае не искажается. Например, число, представленное в виде 32-разрядного целого числа со знаком, преобразуется в 64-разрядное целое
число со знаком.
Сужающее преобразование потенциально опасно потерей значения.
В этом случае значение одного типа преобразуется к значению другого типа, которое имеет меньший размер. Например, преобразование 64-разрядного целого числа со знаком в 32-разрядное целое чис
ло
со знаком. При сужаю­щем преобразовании методами класса System.Convert потеря информации со­провождается генерацией исключения.
Ниже приведён пример неявного преобразования.
short z = 1; int у = z; //неявное преобразование
При обратном преобразовании можно потерять информацию. Если зна-
чение в int больше, чем 32 767, то оно будет усечено при преобразовании.
Например, компилятор не станет выполнять неявное преобразование от
short z;
int у - 5; z = у; //не скомпилируете
Для этого необходимо выполнить явное преобразование, используя
оператор приведения:
short z; int у - 5;
z = (short) у;//OK
1.7. ИНСТРУКЦИИ И РАЗДЕЛИТЕЛИ
Законченное выражение в коде программы называется инструкцией. Последовательность инструкций есть программа. Инструкция заканчивается точкой с запятой (;).
Ниже приведены инструкции объявления, присваивания и инициализа­ции переменных:
intx; //инструкция объявления
х=100; //инструкция присваивания
19
int у=х; // инструкция объявления и инициализации
−
Составные инструкции состоят из набора простых инструкций, поме­щённых в фигурные скобки { }.
{ int x; //инструкция объявления
х=100; // инструкция присваивания
int у= х; // инструкция объявления и инициализации
}
В приведённом примере все три инструкции являются элементами од­ной инструкции, которые рассматриваются в программе в соответствии с по­рядком их записи.
Пробелы, знаки табуляции и переход на новую строку в языке рассмат­риваются как разделители. Лишние разделители игнорируются.
Пример:
myValue=100; или myValue = 100;
Эти инструкции компилятор обработает как абсолютн В пределах строки пробелы не игнорируются.
Пример:
Console.WriteLine ("Я изучаю язык программирования");
Пробел между будет обрабатываться как отдельный си
Пробелы применяют для лу
словами «Я», «изучаю», «язык», «программирования»
мвол строки.
чшей наглядности программы. Компилято-
ра разделители игнорируют.
1.8. ПРИМЕР РЕШЕНИЯ ЗАДАЧ
о идентичные.
Вычислить скорость летательного аппарата по формуле
abc
2000
HH
⎞
ц
,
⎟ ⎠
где V = 300; H
1
= 2290; Нц = 1567.
абс
⎛
VV
−=
1
⎜ ⎝
Вывести на печать исходные данные и результат решения.
20
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]