Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Программирование. Введение в разработку на C#. Учебное пособие
.pdf
2.4. Вопросы для самопроверки
1. В чем различие размерных и ссылочных типов данных?
2. Какой числовой диапазон входит в тип byte? В sbyte?
3. Что такое пространство имен? Для какой цели служит директива
using?
2.5. Задания для самопроверки
1. Пользователь вводит A, затем B, а затем C. Программа должна
вывести cos((A^B)/C)
2. Рассчитать (exp^A)/B
3. Пользователь вводит число А. Программа должна определить,
четное оно или нет.
31

3. ПРОВЕРКА ЛОГИЧЕСКИХ УСЛОВИЙ
3.1. Логический тип данных
Логический, булевский (англ. Boolean или logical data type) тип
данных – примитивный тип данных в информатике, которые могут
принимать два возможных значения, иногда называемых «истиной»
(true) и «ложью» (false). Присутствует в подавляющем большинстве
языков программирования как самостоятельная сущность или реализуется через численный тип. В подавляющем большинстве языков за истину полагается единица, за ложь – ноль.
Тип данных Boolean получил своё название в честь английского
математика и логика Джорджа Буля, среди прочего, занимавшегося вопросами математической логики в середине 19 века [5].
Традиционным применением булева типа данных являются значения «да»/«нет» в отношении результата более сложных операций.
Все операции сравнения двух величин (равно, больше, меньше),
операции вхождения элемента в множество и проверка на пересечение
множеств возвращают в качестве результата булев тип.
В C# логический тип данных объявляется с помощью ключевого
слова bool. Логические значения «истина» и «ложь» обозначаются в С#
зарезервированными словами true и false соответственно.
Следовательно, переменная или выражение типа bool будет принимать
одно из этих логических значений. Кроме того, в С# не определено
взаимное преобразование логических и целых значений. Например, 1 не
преобразуется в значение true, а 0 – в значение false. Большое число
ошибок в таких языках как C++ связано с автоматическими
преобразованиями булевых типов, потому создатели C# отказались от
такой возможности:
bool isTrue = true;
32

Для получения значения булевых переменных используют, кроме
непосредственного присваивания, результаты функций (о чем будет
рассказано позже) и операторов сравнения. В языке C# применяются
следующие операторы сравнения: < («меньше»), > («больше»),
<= («меньше или равно»), >= («больше или равно»), == («равно»),
is («относится ли объект к некоторому типу») и другие .
Все описанные выше операторы, кроме оператора is, действуют над
типами, выражающими числовые значения, однако позже будет рассказано, как переопределить их поведение и наделить способностью сравнивать пользовательские типы данных.
Следующий пример кода показывает результат работы оператора
«больше»:
bool isTrue = 4 > 5;
Console.WriteLine(isTrue);
На консоль выведется результат "False". Что будет совершенно верно.
3.2. Условный оператор if-else
Для организации ветвления кода используют языковую
конструкцию if – else if – else. Важно, чтобы выражение, стоящее после
if, возвращало булев тип:
bool isTrue = 4 > 5;
if (isTrue)
{
Console.WriteLine("Что-то новенькое в математике!");
}
else if (4 > 6)
{
Console.WriteLine("Это что-то из Лобачевского?");
}
else
{
33

Console.WriteLine("Математика в порядке.");
}
На консоль выведется результат «Математика в порядке». Что будет
совершенно верно. Как видно в примере выше, вы можете передавать
внутрь скобок выражения if как переменные булева типа, так и
результаты функций (операторы являются их частным случаем). Ветка
кода else if не является обязательной, так же как ветка кода else. Более
того, если решение ветки состоит из одной строки кода, то достаточно
написать так:
bool isTrue = 4 > 5;
if (!isTrue)
Console.WriteLine("Математика в порядке.");
Как видно в примере выше, применен унарный оператор «!»,
который не был ранее представлен. Результат его действия точь-в-точь
такой же, как логическое «НЕ», уже, возможно, известное вам из курса
дискретной математики: он получает значение из булевой переменной
(или функции) и в качестве результата выдает противоположное, при
этом настоящее значение переменной не изменяется.
3.3. Условный оператор switch
Иногда алгоритм содержит серию решений, тестирующую переменную или выражение отдельно для каждого постоянного целочисленного представления или постоянного последовательного представления, которое может принять переменная или выражение. Постоянное
целочисленное представление – это любое выражение, включающее в
себя символ и целочисленные константы, оценивающие до целочисленного значения (например, значения типа int или char). Постоянное последовательное представление – любое выражение, состоящее из строковых литералов, результатом которых всегда является та же последовательность (string). Затем алгоритм выполняет разные операции, исходя
34

из своих значений. Для управления таким принятием решений С# имеет
оператор выбора switch.
В следующем фрагменте примера предположим, что группа из студентов сдавала тест, и каждый студент получил некую оценку A или B.
Программа вводит буквенные оценки и резюмирует результаты с помощью оператора switch для расчета количества появления каждой из них:
...
int aCount = 0, bCount = 0;
string grade = Console.ReadLine();
switch (grade)
{
case "A":
case "a":
aCount++;
break;
case "B":
case "b":
bCount++;
break;
default:
Console.WriteLine("Некоректный символ");
break;
}
...
// Передача управления за оператор switch
Когда поток управления достигает оператора switch программа оце-
нивает управляющее выражение (в данном примере grade) в скобках,
следующих за ключевым словом switch. Значение этого выражения срав-
нивается с каждой меткой case, до тех пор, пока не будет найдено соот-
ветствие. Например, предположим, что пользователь ввел букву B в качестве оценки студента. После этого B сравнивается с каждым вариантом
case оператора switch до тех пор, пока в строке не будет иметь место со-
ответствие (case "B":). На данном этапе выполняются операторы для это-
го case. Для буквы B увеличивается количество оценок в переменной
35

bCount, и оператор switch сразу завершается оператором break. Оператор
break обеспечивает передачу управления программы на первый оператор,
следующий за оператором switch.
Если между значением управляющего выражения и любой меткой
case не возникает соответствия, тогда выполняется случай default. В
данном примере отображается сообщение об ошибке. Обратите внимание, что случай default в операторе switch – не обязательный. Если
управляющее выражение не совпадает с case, и нет случая default, тогда
управление программы переходит к следующему оператору после оператора switch. Еще стоит обратить внимание, что в операторе switch могут выполняться операторы только для одного варианта case, после которого будет выполнен оператор break для текущего case, что обусловит
немедленный выход из switch.
Каждый случай case может содержать одну операцию, несколько
операций или вообще не иметь операций. Случай case без оператора
называется пустым и может не содержать оператор break. Оператор
break необходим для каждого случая case (включая default), только если
в нем имеются операторы.
Последний вариант case в операторе switch не может быть пустым.
Если управляющее выражение совпадает с пустым вариантом case, тогда будут выполняться операторы в следующем не пустом случае case.
Такое поведение называется сквозным. Оно обеспечивает программиста способом указания выполнения определенных операторов для нескольких case. В коде продемонстрировано сквозное поведение. Например, выполнится одинаковый код при введении оценок А или а (B
или b).
При создании case рекомендуется проверять все возможные значения
для подтверждения того, что в операторе switch не присутствуют два ва-
рианта case для одного проверяемого значения. Если какие-то значения
одинаковы, то будет иметь место ошибка компиляции. Наконец, важно
отметить, что оператор switch отличается от других управляющих струк-
тур тем, что в case множественные операции не обязательно заключаются
в фигурные скобки.
36

Несмотря на то, что варианты case в операторе switch могут встречаться в любом порядке, хорошим тоном программирования считается
размещение случая default в последнюю очередь. При использовании
оператора switch помните, что выражение после каждого case в конкретном операторе switch должно быть либо вычисляемым значением,
либо строкой. Символьная константа представлена как специальный
символ в одинарных кавычках (например, 'А'). Целочисленная константа – это просто целочисленное значение. Выражение после каждого
случая case также может быть константой – переменной, содержащей
значение, которое не меняется на протяжении выполнения всей программы.
3.4. Вопросы для самопроверки
1. Как определяется булевский тип в информатике?
2. Приведите примеры наиболее частого использования булевского
типа.
3. Является ли выражение «0» с точки зрения компилятора C# оди-
наковым с «True»?
4. Для чего используют языковую конструкцию if – else if – else?
5. Можно ли внутрь скобок выражения if передавать операции с ти-
пом результата отличного от bool?
6. Какие элементы выражения if – else if – else являются обязатель-
ными? Когда фигурные скобки можно опустить?
7. В чем отличие оператора switch от конструкции if – else?
8. Когда оператор break в конструкции switch обязателен?
3.5. Задания для самопроверки
1. Составьте таблицу истинности для формулы (X & Y & Z)
2. Составьте программу, вычисляющую операцию логического сле-
дования для двух операндов X и Y.
3. Напишите программу для ввода 2 чисел и определения наиболь-
шего из них.
37

4. Напишите программу для ввода 3 чисел и вывода их в порядке
возрастания и убывания.
5. Модифицируйте пример из раздела 3.2 для работы с целочислен-
ными оценками от 1 до 5.
38

4. ЦИКЛИЧЕСКИЕ КОНСТРУКЦИИ
4.1. Алгоритмы
Алгоритм – это точный набор инструкций, описывающих порядок
действий исполнителя для получения результата решения задачи за конечное время. Само понятие алгоритма относится к первоначальным, основным, базисным понятиям математики. Вычислительные процессы алгоритмического характера (арифметические действия над целыми числами, нахождение наибольшего общего делителя двух чисел и т. д.) известны человечеству с глубокой древности. Однако в явном виде понятие алгоритма сформировалось лишь в начале XX века [5].
Различные определения алгоритма в явной или неявной форме
содержат следующий ряд общих требований.
• Дискретность – алгоритм должен представлять процесс решения
задачи как последовательное выполнение некоторых простых шагов.
При этом для выполнения каждого шага алгоритма требуется конечный
отрезок времени, то есть преобразование исходных данных в результат
осуществляется во времени дискретно.
• Детерминированность (определённость). В каждый момент
времени следующий шаг работы однозначно определяется состоянием
системы. Таким образом, алгоритм выдаёт постоянный результат
(ответ) для одних и тех же исходных данных.
• Понятность – алгоритм для исполнителя должен включать только
команды, которые ему (исполнителю) доступны, которые входят в его
систему команд.
• Завершаемость (конечность) – при корректно заданных исходных
данных алгоритм должен закончить работу и выдать результат за
конечное число шагов.
• Массовость (универсальность). Алгоритм может быть
использован с разными наборами исходных данных.
39

• Результативность – алгоритм должен завершаться определёнными
результатами.
• Алгоритм содержит ошибки, если приводит к получению
ошибочных результатов либо не даёт их вовсе.
• Алгоритм не содержит ошибок, если он даёт правильные
результаты для любых корректных исходных данных.
Цикл – это разновидность управляющей конструкции в высокоуровневых языках, который предназначен для организации повторного исполнения набора инструкций. Также циклом может называться любая многократно исполняемая последовательность инструкций, организованная
любым способом (например, с помощью условного перехода).
Последовательность инструкций, которая предназначена для многократного исполнения, называется телом цикла. Единичное последовательное выполнение тела цикла называется итерацией. Выражение определяющее, будет ли в очередной раз выполняться итерация, или цикл
закончит свою работу, называется условием выхода или условием завершения цикла (либо условием продолжения в зависимости от того,
как интерпретировать его истинность – как признак необходимости завершения или продолжения цикла). Переменная, хранящая текущий
индекс итерации, называется счётчиком итераций цикла или просто
счётчиком цикла. Цикл не обязательно должен содержать счётчик,
счётчик не обязан быть один – условие выхода из цикла может зависеть
от многих изменяемых в цикле переменных, а может определяться
внешними факторами (например, наступлением определённого времени
по таймеру), в последнем случае счётчик может вообще не пригодиться.
Выполнение любого цикла включает начальную инициализацию
переменных цикла, проверку условия выхода, исполнение тела цикла и
обновление переменной цикла на каждом шаге итерации. Кроме того,
большинство языков программирования предоставляют средства для
досрочного управления циклом, например, операторы досрочного завершения цикла, то есть выхода из цикла независимо от истинности условия выхода, и операторы пропуска итерации.
40
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
