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

Программирование. Введение в разработку на C#. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
1 Мб
Скачать
☆
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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]