1.04M
Категория: ПрограммированиеПрограммирование

Условный Оператор и Оператор switch. Циклы

1.

В.В. Подбельский, О.В. Максименкова
Программирование на C#
Семинар 3
Условный Оператор и Оператор switch.
Циклы.
1

2.

Предупреждение по Стилю Кода
Обращаем внимание, что примеры в данной презентации могут не полностью
соответствовать стилю написания кода в связи с ограничениями пространства на слайдах.
В первую очередь это касается фигурных скобок, которые НЕ должны находиться на
одной строке с if/while согласно официальному стилю Microsoft.
Корректный стиль имеет вид:
if (<условие>)
{
// Ваш код...
}
Обратите внимание, что даже для одиночных операторов в блоке фигурные скобки
ОБЯЗАТЕЛЬНЫ.
2

3.

Полезные Материалы к Семинару
Метод TryParse (на примере int): https://docs.microsoft.com/en-us/dotnet/api/system.int32.tryparse
Модификатор out: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/out-parameter-modifier
Вещественные типы в C#:
• Основы: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/floating-point-numeric-types
• Спецификация decimal: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/languagespecification/types#838-the-decimal-type
Есть ли Epsilon у decimal: https://stackoverflow.com/questions/11781899/c-sharp-decimal-epsilon
Условия в C#:
• Операторы if и switch:
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/statements/selection-statements
Выражение switch: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/switch-expression
3

4.

if и Оператор switch
Конструкции if - else if - else могут оказаться излишне громоздкими в случаях, когда необходимо
перебрать 3+ различных веток.
Более удобной альтернативой является оператор switch, который позволяет выполнить проверку
значения на соответствие ожидаемому результату.
На заметку: в C# после каждой непустой метки case или default обязательно указать оператор
перехода (break, return, throw или goto).
Старайтесь избегать длинных и/или вложенных if/switch – такой код быстро становится плохо
читаемым, а его изменение и расширение затруднительно. Приходится либо добавлять всё
больше новых веток, либо выполнять полноценный рефакторинг.
Далее в рамках курса будут рассматриваться более гибкие средства для условной логики на
основе типов элементов.
Документация по if и switch:
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/statements/selection-statements
4

5.

Задача 1: Оценивание в НИУ ВШЭ
Без использования оператора if или тернарной условной операции:
Напишите метод для перевода целочисленной оценки по десятибалльной шкале в
соответствующую строку:
• 1-3 балла – unsatisfactory;
• 4-5 – satisfactory;
• 6-7 – good;
• 8-10 – excellent;
• Любое другое значение – error value: <переданное число>.
Для реализации метода используйте оператор switch.
В основной программе организуйте ввод пользователем оценки (целого числа типа int) и
выведите полученный результат на экран.
5

6.

Задача 1: Решение с Оператором switch
class Program {
public static string MapMarkToString(int mark) {
switch (mark) {
Несколько меток case подряд
case 1:
ведут в одну ветку с общим
case 2:
оператором перехода return.
case 3:
return "unsatisfactory";
case 4:
case 5:
return "satisfactory";
case 6:
case 7:
return "good";
case 8:
case 9:
case 10:
Метка default выполняет роль блока else.
return "excellent";
default:
return $"error value: {mark}";
}
}
// Main и остальная логика...
}
6

7.

Задача 1: Решение с Выражением switch (C# 8.0+)
Если Вы уже освоились с оператором switch, можете попробовать лаконичный синтаксис
выражений switch, позволяющий вернуть определённое значение при выполнении критерия:
class Program
Указывается, какое значение
проверяется. Обратите внимание,
{
что тип результата должен быть
public static string MapMarkToString(int mark)
везде одинаковым (в данном
{
случае, string).
return mark switch
{
=> отделяет условие от возвращаемого
>= 1 and <= 3 => "unsatisfactory",
результата. Не путайте его с операцией
>= 4 and <= 5 => "satisfactory",
больше и равно (пишется как >=).
>= 6 and <= 7 => "good",
>= 8 and <= 10 => "excellent",
_ => $"error value: {mark}"
};
Символ “_” является аналогом
}
блока else для выражений switch.
// Main и остальная логика...
}
Документация: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/switch-expression
7

8.

Задача 2: Логическое Условие
Напишите метод public static bool CalculateBinaryPredicate(bool left, bool right),
который вычисляет значение логического выражения:
!(p & q) & !(p | !q)
и возвращает результат.
В основной программе необходимо построить таблицу истинности для всех пар p и q
и вывести её в отформатированном виде на экран.
При выводе значения типа bool для p и q должны выводиться как 0 и 1, а не как false
и true.
8

9.

Задача 2: Основная Программа
class Program
{
static void Main()
{
Console.WriteLine("Таблица истинности для !(p & q) & !(p | !q):");
bool p = false;
bool q = false;
Обратите внимание, как (и почему) здесь
применяется именно цикл do-while.
do
{
do
{
// Todo: реализовать метод CalculateBinaryPredicate(…).
bool res = BoolPredicate(p, q);
Console.WriteLine($"{p}\t{q}\t{res}");
q = !q;
Инверсия значения.
} while (!q);
p = !p;
Обратите внимание: для значений типа bool не принято писать
} while (!p);
p == false, вместо этого используется отрицание значения p.
Console.WriteLine("Для выхода нажмите ENTER");
Console.ReadLine();
}
}
9

10.

Задача 3: Площадь под Графиком
Вычислите площадь под графиком функции X^2 на отрезке [0;A] при помощи метода
трапеций, вещественная точка A и шаг интегрирования delta задаются с клавиатуры.
• Чтобы организовать проверку корректности введённых данных, определите ограничения на
значения А и delta;
• Вычисляйте значение, добавляемое к интегральной сумме на каждом шаге;
• Определите условие выхода из цикла формирования интегральной суммы.
10

11.

Задача 4: Квадратный Корень
Напишите метод для вычисления по формуле Ньютона с точностью до «машинного нуля»
приближенного значения арифметического квадратного корня.
Параметры метода: подкоренное значение, полученное значение корня и значение точности,
достигнутой при его вычислении. Если подкоренное значение отрицательно - метод должен
возвращать в точку вызова значение false, иначе - true.
В основной программе вводить вещественные числа и выводить их корни. При отрицательных
числах выводить сообщения.
Алгоритм: https://ru.wikipedia.org/wiki/Алгоритм_нахождения_корня_n-ной_степени
11

12.

Задача 4: Заготовка Решения
class Program
{
static void Main()
{
Console.Title = "Формула Ньютона";
ConsoleKeyInfo keyInfo; // Нажатая пользователем клавиша.
do
{
double x;
do
{
Console.Clear();
Console.Write("x = ");
} while (!double.TryParse(Console.ReadLine(), out x));
// Todo: Реализация метода SquareRootNewton(...) для вычислений и
вывод результата.
Console.WriteLine("Для выхода нажмите клавишу Escape...");
keyInfo = Console.ReadKey(true);
} while (keyInfo.Key != ConsoleKey.Escape);
}
}
12

13.

Задача 4: Метод Вычисления Корня
static bool TryCalculateSquareRoot(double x, out double squareRoot, out double
epsilon)
{
double r1;
double r2 = x;
squareRoot = epsilon = 0.0;
if (x <= 0.0)
{
return false;
}
do
{
r1 = r2;
epsilon = x / r1 / 2 - r1 / 2;
r2 = r1 + epsilon;
}
while (r1 != r2);
squareRoot = r2;
return true;
// Пока приближения различимы для компьютера.
}
Подробнее о различимости вещественных чисел: https://ru.wikipedia.org/wiki/Машинный_ноль
13

14.

Задача 5: Бесконечная Сумма
Напишите метод для вычисления приближенного значения бесконечной суммы:
1
1
1
+
+
+ …
1∙ 2 ∙ 3
2∙3∙4
3∙4∙5
Изучите, как метод реализуется для типов float и double.
В чём состоит различие полученных результатов?
Подумайте, а в чём отличие для типа decimal?
Есть ли у decimal epsilon: https://stackoverflow.com/questions/11781899/c-sharp-decimal-epsilon
14

15.

Задача 6: Расчёт Сложных Процентов
Напишите метод для расчёта сложных процентов.
Параметры: начальный капитал, годовая процентная ставка, число лет (вклада).
Возвращаемое значение: итоговая сумма в конце срока вклада.
Примерная сигнатура: public static double CalculateDeposit(double k, double r, int n)
В основной программе вводится начальный капитал (> 0), процентная ставка и число
лет. В качестве результата выведите таблицу значений итоговых сумм в конце каждого
года вплоть до заданного.
15

16.

Задача 7: Корни Квадратного Уравнения
Напишите метод для решения квадратного уравнения, принимающий на вход коэффициенты
уравнения А, В, С и два out-параметра для получения значений вещественных корней.
При отсутствии вещественных корней (если А = В = С=0 или А = В = 0 и С != 0) метод должен
возвращать значение false, иначе – true.
В основной программе организуйте ввод коэффициентов квадратного уравнения, вызов
реализованного метода и вывод значений вещественных корней или сообщение об их
отсутствии.
16

17.

Дополнительные Задачи-1
1) Напишите метод, находящий трёхзначное десятичное число s, все цифры которого
одинаковы и которое представляет собой сумму первых членов натурального ряда, то есть:
s = 1+2+3+4+…
Выведите полученное число, количество членов ряда и текстовое представление суммы, в
котором указаны первые три и последние три члена, а средние члены обозначены
многоточием.
Пример:
Если последний член равен 25, то вывести:
1+2+3+…+23+24+25.
2) Напишите метод, преобразующий целое число, переданное в качестве аргумента, в число,
представляющее запись исходного с обратным порядком цифр. Ведущие нули при этом
должны отбрасываться.
Примеры:
1024 → 4201
120 → 21
17

18.

Дополнительные Задачи-2
3) Напишите метод, вычисляющий логическое значение функции G=F(X,Y):
результат должен быть равен true, если точка с координатами (X, Y) попадает внутрь или на
границы сектора круга G с радиусом R = 2 в диапазоне углов -90<= fi <=45, и false в
противном случае.
4) Напишите метод, вычисляющий значение функции G=F(X,Y):
English     Русский Правила