Типы-значения и ссылочные типы — КиберПедия 

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

Особенности сооружения опор в сложных условиях: Сооружение ВЛ в районах с суровыми климатическими и тяжелыми геологическими условиями...

Типы-значения и ссылочные типы

2019-09-26 409
Типы-значения и ссылочные типы 0.00 из 5.00 0 оценок
Заказать работу

Чаще всего типы C# разделяют по способу хранения элементов на типы-значения и ссылочные типы (рис. 1). Элементы типов-значений, или значимых типов (value types), представляют собой просто последовательность битов в памяти, необходимый объем которой выделяет компилятор. Иными словами, величины значимых типов хранят свои значения непосредственно. Величина ссылочного типа хранит не сами данные, а ссылку на них (адрес, по которому расположены данные). Сами данные хранятся в хипе.

Несмотря на различия в способе хранения, и типы-значения, и ссылочные типы являются потомками общего базового класса object.


Рис. 1. Классификация типов данных C# по способу хранения

Рис. 2 иллюстрирует разницу между величинами значимого и ссылочного типов. Одни и те же действия над ними выполняются по-разному. Рассмотрим в качестве примера проверку на равенство. Величины значимого типа равны, если равны их значения. Величины ссылочного типа равны, если они ссылаются на одни и те же данные (на рисунке b и c равны, но a не равно b даже при одинаковых значениях). Из этого следует, что если изменить значение одной величины ссылочного типа, это может отразиться на другой.


Рис. 2. Хранение в памяти величин значимого и ссылочного типов

Упаковка и распаковка

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

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

Организация ввода-вывода данных. Форматирование

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

Вывод данных

В приведенных выше примерах рассматрен метод WriteLine, реализованный в классе Console, который позволяет организовывать вывод данных на экранСуществует несколько способов применения данного метода:

1. Console.WriteLine(x); //на экран выводится значение идентификатора х

2. Console.WriteLine("x=" + x +"y=" + y); /* на экран выводится строка, образованная последовательным слиянием строки "x=", значения x, строки "у=" и значения у */

3. Console.WriteLine("x={0} y={1}", x, y); /* на экран выводится строка, формат которой задан первым аргументом метода, при этом вместо параметра {0} выводится значение x, а вместо {1} – значение y*/

Замечание.

Рассмотрим следующий фрагмент программы:

int i=3, j=4; Console.WriteLine("{0} {1}", i, j);

При обращении к методу WriteLine через запятую перечисляются три аргумента: "{0} {1}", i, j. Первый аргумент определяет формат выходной строки. Следующие аргументы нумеруются с нуля, так переменная i имеет номер 0, j – номер 1. Значение переменной i будет помещено в выходную строку на место {0}, а значение переменной j – на место {1}. В результате на экран будет выведена строка: 3 4. Если обратимся к методу WriteLine следующим образом Console.WriteLine("{0} {1} {2)", j, i, j), то на экран будет выведена строка: 4 3 4.

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

1. Использование управляющих последовательностей:

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

Управляющие символы:

Вид Наименование
\a Звуковой сигнал
\b Возврат на шаг назад
\f Перевод страницы
\n Перевод строки
\r Возврат каретки
\t Горизонтальная табуляция
\v Вертикальная табуляция
\\ Обратная косая черта
\' Апостроф
\" Кавычки

Пример:

static void Main()

{

Console.WriteLine("Пример 1.\r\ Управляющие символы ");   

}

2. Управление размером поля вывода:

Первым аргументом WriteLine указывается строка вида {n, m} – где n определяет номер идентификатора из списка аргументов метода WriteLine, а m – количество позиций (размер поля вывода), отводимых под значение данного идентификатора. При этом значение идентификатора выравнивается по правому краю. Если выделенных позиций для размещения значения идентификатора окажется недостаточно, то автоматически добавится необходимое количество позиций. Пример:

static void Main() { double x= Math.E; Console.WriteLine("E={0,20}", x); Console.WriteLine("E={0,10}", x); }

3. Управление размещением вещественных данных:

Первым аргументом WriteLine указывается строка вида {n: ##.###} – где n определяет номер идентификатора из списка аргументов метода WriteLine, а ##.### определяет формат вывода вещественного числа. В данном случае под целую часть числа отводится две позиции, под дробную – три. Если выделенных позиций для размещения целой части значения идентификатора окажется недостаточно, то автоматически добавиться необходимое количество позиций. Пример:

static void Main() { double x= Math.E; Console.WriteLine("E={0:##.###}", x); Console.WriteLine("E={0:.####}", x); }

4. Управление форматом числовых данных:

Первым аргументом WriteLine указывается строка вида

{n: <спецификатор>m} – где n определяет номер идентификатора из списка аргументов метода WriteLine, <спецификатор> - определяет формат данных, а m – количество позиций для дробной части значения идентификатора. В качестве спецификаторов могут использоваться следующие значения:

Параметр Формат Значение
C или c Денежный. По умолчанию ставит знак р. Изменить его можно с помощь объекта NumberFormatInfo Задается количество десятичных разрядов.
D или d Целочисленный (используется только с целыми числами) Задается минимальное количество цифр. При необходимости результат дополняется начальными нулями
E или e Экспоненциальное представление чисел Задается количество символов после запятой. По умолчанию используется 6
F или f Представление чисел с фиксированной точкой Задается количество символов после запятой
G или g Общий формат (или экспоненциальный, или с фиксированной точкой) Задается количество символов после запятой. По умолчанию выводится целая часть
N или n Стандартное форматирование с использованием запятых и пробелов в качестве разделителей между разрядами Задается количество символов после запятой. По умолчанию – 2, если число целое, то ставятся нули
X или x Шестнадцатеричный формат  
P или p Процентный  

Пример:

static void Main()

 {

Console.WriteLine("C Format:{0,14:C} \t{0:C2}", 12345.678);

Console.WriteLine("D Format:{0,14:D} \t{0:D6}", 123);

Console.WriteLine("E Format:{0,14:E} \t{0:E8}", 12345.6789);

Console.WriteLine("G Format:{0,14:G} \t{0:G10}", 12345.6789);

Console.WriteLine("N Format:{0,14:N} \t{0:N4}", 12345.6789);

Console.WriteLine("X Format:{0,14:X} ", 1234);

Console.WriteLine("P Format:{0,14:P} ", 0.9);   

 }

Ввод данных

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

static void Main()

 {

string s = Console.ReadLine();

Console.WriteLine(s);

 }

Для того чтобы получить числовое значение необходимо воспользоваться преобразованием данных. Пример:

static void Main()

 {

string s = Console.ReadLine();

int x = int.Parse(s); //преобразование строки в число

Console.WriteLine(x);

 }

Или сокращенный вариант:

static void Main()

 {

//преобразование введенной строки в число

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

Console.WriteLine(x);

 }

Для преобразования строкового представления целого числа в тип int мы используем метод int.Parse(), который реализован для всех числовых типов данных. Таким образом, если нам потребуется преобразовать строковое представление в вещественное, мы можем воспользоваться методом float.Parse() или double.Parse(). В случае, если соответствующее преобразование выполнить невозможно, то выполнение программы прерывается и генерируется исключение System.FormatExeption (входная строка имела неверный формат).

Задания на лабораторную работу.

Написать программу, которая, реализует диалог с пользователем:

1. запрашивает с клавиатуры два целых числа, и выводит на экран сумму данных чисел:

Пример:

using System;

namespace Hello

{

class Program

{

static void Main()

{

Console.Write("a= ");

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

Console.Write("b= ");

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

Console.WriteLine("{0}+{1}={2}", a, b, a + b);

}

}

}

2. запрашивает с клавиатуры два целых числа, и выводит на экран сумму данных чисел в прямом и обратном порядке:

3. запрашивает с клавиатуры три целых числа, и выводит на экран сумму данных чисел:

4. запрашивает с клавиатуры два вещественных числа, и выводит на экран произведение данных чисел (вещественные числа выводятся с точностью до 1 знака после запятой):

5. запрашивает с клавиатуры два вещественных числа, и выводит на экран результат деления первого числа на второе (вещественные числа выводятся с точностью до 3 знаков после запятой):

6. запрашивает с клавиатуры три вещественных числа, и выводит на экран следующее сообщение (вещественные числа выводятся с точностью до 2 знаков после запятой):

Контрольные вопросы.

1. Перечислите и опишите лексемы языка C#.

2. Перечислите и опишите литералы языка C#.

3. Перечислите встроенные типы данных и опишите их.

4. Приведите классификацию типов данных C#.

5. Какие элементы стандартных классов.NET, соответствующих встроенным типам языка, вы знаете?

6. Опишите отличия значимых и ссылочных типов. В чем состоят процессы упаковки и распаковки?

 


 


Лабораторная работа 3.  
Операции в программах на языке C#

Теоретические сведения.

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

Инкремент (++) и декремент(--).

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

Рассмотрим эти операции на примере.

static void Main() {  int i = 3, j = 4;  Console.WriteLine("{0} {1}", i, j);  Console.WriteLine("{0} {1}", ++i, --j);  Console.WriteLine("{0} {1}", i++, j--);  Console.WriteLine("{0} {1}", i, j); } Результат работы программы: 3 4 4 3 4 3 5 2

Допустимы ли следующие способы записи ++(++i), (i--)--, ++(i--) и т.д. И почему.

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

Операция new

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

· object z=new object();

· int i=new int(); // то же самое, что и int i =0;

Отрицание:

o Арифметическое отрицание (-) - меняет знак операнда на противоположный.

o Логическое отрицание (!) - определяет операцию инверсия для логического типа.

Рассмотрим эти операции на примере.

static void Main() {  int i = 3, j=-4;  bool a = true, b=false;  Console.WriteLine("{0} {1}", -i, -j);  Console.WriteLine("{0} {1}",!a,!b); } Результат работы программы: -3 4 False True

 

Явное преобразование типа.

Используется для явного преобразования из одного типа в другой. Формат операции:

(тип) выражение;

Рассмотрим эту операцию на примере.

static void Main() {  int i = -4;  byte j = 4;  int a = (int)j; //преобразование без потери точности  byte b = (byte)i; //преобразование с потерей точности  Console.WriteLine("{0} {1}", a, b); } Результат работы программы: 4 252

 

Умножение (*), деление (/) и деление с остатком (%).

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

Рассмотрим эти операции на примере.

static void Main()

{

int i = 100, j = 15;

double a = 14.2, b = 3.5;

Console.WriteLine("{0} {1} {2}", i*j, i/j, i%j);

Console.WriteLine("{0} {1} {2}", a * b, a / b, a % b);

}

Результат работы программы:

1500 6 10

49.7 4.05714285714286 0.1999999999999999

Вопрос. Чему будет равен результат выполнения программы:

double hmm = 1.0 / 0.0;

double hmm2 = -1.0 / 0.0;

double hmm3 = 0.0 / 0.0;

Console.WriteLine("1/0 == {0}", hmm);

Console.WriteLine("-1/0 == {0}", hmm2);

Console.WriteLine("0/0 == {0}", hmm3);

double dd = 1.0 / 0;

dd = 1.0 / 0.0;

if (double.IsNaN(dd)) dd = 9;

if (double.IsInfinity(dd)) dd = 8;

Console.WriteLine("dd == {0}", dd);

Объясните, как получился данный результат.

Сложение (+) и вычитание (-).

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

Операции отношения (<, <=, >, >=, ==,!=).

 Операции отношения сравнивают значения левого и правого операндов. Результат операции логического типа: true - если значения совпадают, false - в противном случае. Рассмотрим операции на примере:

static void Main()  { int i = 15, j = 15; Console.WriteLine(i<j); //меньше Console.WriteLine(i<=j); //меньше или равно Console.WriteLine(i>j); //больше Console.WriteLine(i>=j); //больше или равно Console.WriteLine(i==j); //равно Console.WriteLine(i!=j); //не равно  } Результат работы программы: False True False True True False

Логические операции: И (&&), ИЛИ (||).

Логические операции применяются к операндам логического типа.

Результат логической операции И имеет значение истина тогда и только тогда, когда оба операнда принимают значение истина.

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

Рассмотрим операции на примере:

static void Main()

{

Console.WriteLine("x y x и y x или y");

Console.WriteLine("{0} {1} {2} {3}", false, false, false&&false, false||false);

Console.WriteLine("{0} {1} {2} {3}", false, true, false&&true, false||true);

Console.WriteLine("{0} {1} {2} {3}", true, false, true&&false, true||false);

Console.WriteLine("{0} {1} {2} {3}", true, true, true&&true, true||true);

}

Результат работы программы:

x y     x и y x или y

False  False False False

False  True False True

True   False False True

True   True True True

Фактически была построена таблица истинности для логических операций И и ИЛИ.

Условная операция.

Формат: (<операнд1>)? <операнд2>: <операнд3>;

Операнд1 - это логическое выражение, которое оценивается с точки зрения его эквивалентности константам true и false. Если результат вычисления операнда1 равен true, то результатом условной операции будет значение операнда2, иначе - операнда3. Фактически условная операция является сокращенной формой условного оператора if, который будет рассмотрен позже.

Пример использования условной операции:

static void Main()

{

int x=5; int y=10;

int max = (x > y)? x: y;

Console.WriteLine(max);

}

Операции присваивания: =, +=, -= и т.д.

Формат операции простого присваивания (=):

операнд_2 = операнд_1;

В результате выполнения этой операции вычисляется значение операнда_1, и результат записывается в операнд_2. Возможно связать воедино сразу несколько операторов присваивания, записывая такие цепочки: a=b=c=100. Выражение такого вида выполняется справа налево: результатом выполнения c=100 является число 100, которое затем присваивается переменной b, результатом чего опять является 100, которое присваивается переменной a.

Кроме простой операции присваивания существуют сложные операции присваивания, например, умножение с присваиванием (*=), деление с присваиванием (/=), остаток от деления с присваиванием (% =), сложение с присваиванием (+=), вычитание с присваиванием (-=) и т.д.

В сложных операциях присваивания, например, при сложении с присваиванием, к операнду_2 прибавляется операнд_1, и результат записывается в операнд_2. То есть, выражение с += а является более компактной записью выражения с = с + а. Кроме того, сложные операции присваивания позволяют сгенерировать более эффективный код, за счет того, что в простой операции присваивания для хранения значения правого операнда создается временная переменная, а в сложных операциях присваивания значение правого операнда сразу записывается в левый операнд.

Объясните, какие значения примут переменные t и b после выполнения данного фрагмента программы: int a=10, b=3; int t=(a++)-b; b+=t*a;

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

Выражения и преобразование типов

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

Примеры выражений:

(а + 0.12)/6                    

х && у ||!z                     

(t * Math.Sin(x)-l.05e4)/((2 * k + 2) * (2 * k + 3))

Операции выполняются в соответствии с приоритетами. Для изменения порядка выполнения операций используются круглые скобки. Если в одном выражении записано несколько операций одинакового приоритета, то унарные операции, условная операция и операции присваивания выполняются справа налево, остальные - слева направо. Например,

а = b = с означает a=(b=c),

a+b+c означает (а + b) + с.

Результат вычисления выражения характеризуется значением и типом. Например, если а и b - переменные целого типа и описаны так:

int а = 2, b = 5;

то выражение а + b имеет значение 7 и тип int.

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

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

Задания на лабораторную работу.

1. Написать программу, которая подсчитывает:

0. периметр квадрата, площадь которого равна а;

Пример:

using System;

namespace Example

{

 class Program

 {

static void Main()

{

Console.Write("s= ");          

float s = float.Parse(Console.ReadLine());

double p = 4 * Math.Sqrt(s);

Console.WriteLine("p=" + p);

}

 }

}

1. площадь равностороннего треугольника, периметр которого равен p;

2. расстояние между точками с координатами a, b и с, d;

3. среднее арифметическое кубов двух данных чисел;

4. среднее геометрическое модулей двух данных чисел;

5. гипотенузу прямоугольного треугольника по двум данным катетам a, b.

6. площадь прямоугольного треугольника по двум катетам a, b.

7. периметр прямоугольного треугольника по двум катетам a, b.

8. ребро куба, площадь полной поверхности которого равна s;

9. ребро куба, объем которого равен v;

10. периметр треугольника, заданного координатами вершин x1, y1, x2, y2, x3, y3;

11. площадь треугольника, заданного координатами вершин x1, y1, x2, y2, x3, y3;

12. радиус окружности, длина которой равна l;

13. радиус окружности, площадь круга которой равна s;

14. площадь равнобедренной трапеции с основаниями a и b и углом при большем основании;

15. площадь кольца с внутренним радиусом r1 и внешним r2;

16. радиус окружности, вписанной в равносторонний треугольник со стороной а;

17. радиус окружности, описанной около равностороннего треугольника со стороной а;

18. сумму членов арифметической прогрессии, если известен ее первый член, разность и число членов прогрессии;

19. сумму членов геометрической прогрессии, если известен ее первый член, знаменатель и число членов прогрессии.

2. Написать программу, которая определяет:

0. максимальное значение для двух различных вещественных чисел;

Пример:

using System;

namespace Hello

{

 class Program

 {

static void Main()

{

Console.Write("a= "); float a = float.Parse(Console.ReadLine());

Console.Write("b= "); float b = float.Parse(Console.ReadLine());

float max=(a>b)?a:b;

Console.WriteLine("max=" + max);

}

 }

}

1. является ли заданное целое число четным;

2. является ли заданное целое число нечетным;

3. если целое число М делится на целое число N, то на экран выводится частное от деления, в противном случае выводится сообщение " M на N нацело не делится";

4. оканчивается ли данное целое число цифрой 7;

5. имеет ли уравнение ax2+bx+c=0 решение, где a, b, c – данные вещественные числа;

6. какая из цифр двухзначного числа больше: первая или вторая;

7. одинаковы ли цифры данного двухзначного числа;

8. является ли сумма цифр двухзначного числа четной;

9. является ли сумма цифр двухзначного числа нечетной;

10. кратна ли трем сумма цифр двухзначного числа;

11. кратна ли числу А сумма цифр двухзначного числа;

12. какая из цифр трехзначного числа больше: первая или последняя;

13. какая из цифр трехзначного числа больше: первая или вторая;

14. какая из цифр трехзначного числа больше: вторая или последняя;

15. все ли цифры трехзначного числа одинаковые;

16. существует ли треугольник с длинами сторон a, b, c;

17. является ли треугольник с длинами сторон a, b, c прямоугольным;

18. является ли треугольник с длинами сторон a, b, c равнобедренным;

19. является ли треугольник с длинами сторон a, b, c равносторонним.

Контрольные вопросы.

1. Допустимы ли следующие способы записи ++(++i), (i--)--, ++(i--).

2. Приведите примеры операций: сдвиг влево (<<), сдвиг вправо (>>);

3. Приведите примеры операций: поразрядные операции И (&), исключающее ИЛИ (^) и ИЛИ (|);

4. Приведите примеры операций: сложные операции присваивания: <<=, >>=, &=, ^=, |=.

5. Укажите последовательность выполнения операций в данном выражении:

(x*x+Math.Sin(x+1))/x-2.

6. Запишите заданное математическое выражение по правилам языка С#:

a.

b.

7. Допустимы ли следующие способы записи!(-i), -(!a). И почему.

8. Объясните, какие значения примут переменные t и b после выполнения данного фрагмента программы: int a=10, b=3; int t=(a++)-b; b+=t*a;

9. Измените программу так, чтобы:

a. вычислялось наименьшее значение из двух вещественных чисел x и y;

b. если число двузначное, то на экран выводилось "Да", и "Нет" в противном случае.

10. Объясните, какое значение примет переменная t в данном фрагменте программы: int a=10, b=3; bool t=(a>=b && a!=2*b || a<0);

11. Объясните, почему операция (byte)i вместо ожидаемого значения -4 дала нам в качестве результата значение 252.

12.  Выясните, чему равен результат данного выражения:

a. i<j<k

b. true<false

Объясните, как получился данный результат.


 


Лабораторная работа 4.  
Операторы языка C#

Теоретические сведения.

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

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

Операторы следования выполняются компилятором в естественном порядке: начиная с первого до последнего. К операторам следования относятся: выражение и составной оператор.

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

++i;                //оператор инкрементаx+=y;               //оператор сложение с присваиваниемConsole.WriteLine(x); //вызов методаx=Math.Pow(a,b)+a*b; //вычисление сложного выражения

Частным случаем оператора выражения является пустой оператор -;. Он используется тогда, когда по синтаксису оператор требуется, а по смыслу - нет. В этом случае лишний символ; является пустым оператором и вполне допустим, хотя и не всегда безопасен. Например, случайный символ; после условия оператора while или if может совершенно поменять работу этого оператора.

Составной оператор или блок представляет собой последовательность операторов, заключенных в фигурные скобки {}. Блок обладает собственной областью видимости: объявленные внутри блока имена доступны только внутри данного блока или блоков, вложенных в него. Составные операторы применяются в случае, когда правила языка предусматривают наличие только одного оператора, а логика программы требует нескольких операторов. Например, тело цикла while должно состоять только из одного оператора. Если заключить несколько операторов в фигурные скобки, то получится блок, который будет рассматриваться компилятором как единый оператор.

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

Операторы ветвления позволяют изменить порядок выполнения операторов в программе. К операторам ветвления относятся условный оператор if и оператор выбора switch.

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

Условный оператор if используется для разветвления процесса обработки данных на два направления. Он может иметь одну из форм: сокращенную или полную.

Форма сокращенного оператора if:

if (B) S;

где В - логическое или арифметическое выражение, истинность которого проверяется; S - оператор: простой или составной.

При выполнении сокращенной формы оператора if сначала вычисляется выражение B, затем проводится анализ его результата: если B истинно, то выполняется оператор S; если B ложно, то оператор S пропускается. Таким образом, с помощью сокращенной формы оператора if можно либо выполнить оператор S, либо пропустить его.

Форма полного оператора if:

if (B) S1; else S2;

где B - логическое или арифметическое выражение, истинность которого проверяется; S1, S2 - оператор: простой или составной.

При выполнении полной формы оператора if сначала вычисляется выражение B, затем анализируется его результат: если Bистинно, то выполняется оператор S1, а оператор S2 пропускается; если B ложно, то выполняется оператор S2, а S1 - пропускается. Таким образом, с помощью полной формы оператора if можно выбрать одно из двух альтернативных действий процесса обработки данных.

Примеры записи условного оператора if:

if (a > 0) x=y;            // Сокращенная форма c простым оператором

if (++i) {x=y; y=2*z;} // Сокращенная форма c составным оператором

if (a > 0 || b<0) x=y; else x=z; // Полная форма с простым оператором

if (i+j-1) { x= 0; y= 1;}

else {x=1; y:=0;} // Полная форма с составными операторами

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

static void Main()

{

Console.Write("x= ");

float x = float.Parse(Console.ReadLine());

Console.Write("y=");

float y = float.Parse(Console.ReadLine());

if (x < y) Console.WriteLine("min= "+x);

else Console.WriteLine("min= "+y);

}

Результат работы программы:

x y  min0 0  01 -1 -1-2  2  -2

Операторы S1 и S2 могут также являться операторами if. Такие операторы называют вложенными. При этом ключевое слово else связывается с ближайшим предыдущим словом if, которое еще не связано ни с одним else.

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

Оператор выбора switch предназначен для разветвления процесса вычислений по нескольким направлениям. Формат оператора:

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

{

case <константное_выражение_1>:

[<оператор 1>]; <оператор перехода>;

case <константное_выражение_2>:

[<оператор 2>]; <оператор перехода>;

...

case <константное_выражение_n>:

[<оператор n>]; <оператор перехода>;

[default: <оператор>; ]

}

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

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

Выполнение оператора начинается с вычисления выражения, расположенного за ключевым словом switch. Полученный результат сравнивается с меткой case. Если результат выражения соответствует метке case, то выполняется оператор, стоящий после этой метки, за которым обязательно должен следовать оператор перехода: break, goto и т.д. При использовании оператора break происходит выход из switch и управление передается оператору, следующему за switch. Если же используется оператор goto, то управление передается оператору, помеченному меткой, стоящей после goto.

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

static void Main()

{

Console.Write("OPER= ");

char oper=char.Parse(Console.ReadLine());

bool ok=true;

Console.Write("A= ");

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

Console.Write("B= ");           

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

float res=0;

switch (oper)

{

case '+': res = a + b; break; //1

case '-': res = a - b; break;

case '*': res = a * b; break;

case ':': if (b!= 0)

{

res = (float)a / b; break;

}

else goto default;

default: ok = false; break;       

}

if (ok) Console.WriteLine("{0} {1} {2} = {3}", a, oper, b, res);

else Console.WriteLine("error");

}

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

oper x  y  rez+ 4  5  9: 4  0  error% 4  3  error

Если необходимо, чтобы для разных меток выполнялось одно и тоже действие, то метки перечисляются через двоеточие. Например:

switch (oper)

{

case '+': res = a + b; break;      

case '-': res = a - b; break;

case '*': res = a * b; break;

case '/': case ':': if (b!= 0) // перечисление меток

{

res = (float)a / b; break;

}

else goto default;

default: ok = false; break;

}

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

Операторы цикла используются для организации многократно повторяющихся вычислений. К операторам цикла относятся: цикл с предусловием while, цикл с постусловием do while, цикл с параметром for и цикл перебора foreach..

Цикл с предусловием while

Оператор цикла while организует выполнение одного оператора (простого или составного) неизвестное заранее число раз. Формат цикла while:

while (B) S;

где B - выражение, истинность которого проверяется (условие завершения цикла); S - тело цикла - оператор (простой или составной).

Перед каждым выполнением тела цикла анализируется значение выражения В: если оно истинно, то выполняется тело цикла, и управление передается на повторную проверку условия В; если значение В ложно - цикл завершается и управление передается на оператор, следующий за оператором S.

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

В качестве иллюстрации выполнения цикла while рассмотрим программу вывода на экран целых чисел из интервала от 1 до n.

static void Main()

{

Console.Write("N= ");

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

int i = 1;

while (i <= n)      //пока i меньше или равно n

Console.Write(" "+ i++); //выводим i на экран, затем увеличиваем его на 1            

}

Результаты работы программы:

n          ответ

10          1 2 3 4 5 6 7 8 9 10


Поделиться с друзьями:

Типы сооружений для обработки осадков: Септиками называются сооружения, в которых одновременно происходят осветление сточной жидкости...

Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...

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

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



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.012 с.