Объединяйте проверки с помощью &&, || и !, выделяйте цифры числа и выбирайте одну из нескольких ветвей. В решениях обращайте внимание на порядок проверок и проверяйте граничные случаи.
3.2.1. Високосный год
Получите положительный номер года year по григорианскому календарю. Выведите «Високосный» или «Обычный».
Год високосный, если выполняется хотя бы одно из условий:
- год делится на 4, но не делится на 100;
- год делится на 400.
Например, 2004 — високосный год. 1900 не високосный: он делится на 100, но не на 400. 2000 — високосный, потому что делится на 400.
Решение и более короткая запись
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
static void Main(string[] args)
{
Console.Write("Введите год: ");
int year = int.Parse(Console.ReadLine());
bool isLeap = false;
if (year % 4 == 0)
{
if (year % 100 != 0 || year % 400 == 0)
{
isLeap = true;
}
}
if (isLeap)
Console.WriteLine("Високосный");
else
Console.WriteLine("Обычный");
}
После чтения year ту же проверку можно записать короче:
1
2
bool isLeap = (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
Console.WriteLine(isLeap ? "Високосный" : "Обычный");
Запись условие ? значение_при_true : значение_при_false — тернарный условный оператор. Здесь он выбирает строку для вывода. Обычный if/else решает ту же задачу и полностью подходит для этой практики.
3.2.2. Точка внутри прямоугольника
Получите вещественные координаты x и y. Выведите «Внутри», если одновременно выполняются \(0 < x < 10\) и \(0 < y < 5\). Иначе выведите «Снаружи».
Граница прямоугольника не входит во внутреннюю область. Например, точка (0, 2) должна дать «Снаружи». В C# запишите каждое сравнение отдельно и соедините их через &&.
3.2.3. Гласная или согласная латинская буква
Получите символ ch. Считайте, что введена одна латинская буква. Выведите:
- «Гласная», если это
a,e,i,o,uили одна из соответствующих заглавных букв; - «Согласная» в остальных случаях.
Решение
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static void Main()
{
Console.Write("Введите латинскую букву: ");
char ch = char.Parse(Console.ReadLine());
if (ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u' ||
ch == 'A' || ch == 'E' || ch == 'I' || ch == 'O' || ch == 'U')
{
Console.WriteLine("Гласная");
}
else
{
Console.WriteLine("Согласная");
}
}
Программа опирается на условие о корректном вводе. Без него, например при вводе цифры, последняя ветвь не означала бы, что символ действительно согласный.
3.2.4. Хотя бы два из трёх
- Даны три значения типа
bool:p,q,r. Выведите «Хотя бы два истинны», если хотя бы два значения равныtrue, иначе — «Истинных меньше двух». - Получите эти значения случайно. Например, инструкция
bool p = rnd.Next(0, 2) == 1;превращает случайный выбор 0 или 1 в логическое значение. Аналогично получитеqиr, выведите все три значения и результат проверки.
Используйте одно поле static Random rnd = new Random(); в классе. Для проверки рассмотрите все восемь комбинаций значений p, q, r: случайные запуски могут не показать их все.
3.2.5. Палиндром и делимость на 11
Получите положительное трёхзначное число n и выведите ровно одно сообщение:
- «Палиндром и делится на 11», если выполнены обе проверки;
- «Палиндром», если выполнена только первая;
- «Делится на 11», если выполнена только вторая;
- «Ни одно условие не выполнено» в оставшемся случае.
Решение
1
2
3
4
5
6
7
8
9
10
11
12
Console.Write("Введите положительное трёхзначное число: ");
int n = int.Parse(Console.ReadLine());
bool isPalindrome = (n / 100 == n % 10);
bool isDiv11 = (n % 11 == 0);
if (isPalindrome && isDiv11)
Console.WriteLine("Палиндром и делится на 11");
else if (isPalindrome)
Console.WriteLine("Палиндром");
else if (isDiv11)
Console.WriteLine("Делится на 11");
else
Console.WriteLine("Ни одно условие не выполнено");
Общая проверка стоит первой: иначе число, подходящее сразу под оба условия, попало бы в ветвь только для палиндрома или только для делимости.
3.2.6. Четверть координатной плоскости
Получите вещественные координаты \(x, y\). Выведите номер четверти, в которой находится точка: I, II, III или IV.
Если точка находится на оси, выведите «На оси X» или «На оси Y». Для (0, 0) выведите «Начало координат». Используйте вложенные условия, если они помогают разделить случаи.
3.2.7. Знак и чётность числа
Получите целое число \(n\) и выведите две характеристики:
- положительное, отрицательное или ноль;
- чётное или нечётное.
Например, для n = -3 вывод должен быть «Отрицательное нечётное».
3.2.8. Сортировка трёх чисел
Получите от пользователя или случайным образом три целых числа \(a, b, c\). Выведите их в порядке возрастания. Проверьте разные исходные порядки, отрицательные числа и совпадающие значения.
3.2.9. Классификация треугольников
Получите три положительных вещественных числа — предполагаемые длины сторон. Определите, можно ли построить треугольник, и выведите его вид ровно один раз:
- равносторонний;
- равнобедренный прямоугольный;
- равнобедренный;
- прямоугольный;
- разносторонний непрямоугольный.
Если треугольник построить нельзя, сообщите об этом. Напоминание: сумма любых двух сторон треугольника должна быть больше третьей стороны.
Не выводите для равностороннего треугольника ещё и отдельное сообщение «Равнобедренный». При совпадении двух признаков, например равнобедренности и прямого угла, выведите их вместе. Равносторонний треугольник не бывает прямоугольным.
Решение, ошибочные варианты и проверочные примеры
Сначала подберите проверочные данные
| Стороны | Ожидаемый результат | Что проверяет пример |
|---|---|---|
1, 2, 3 |
Не треугольник | Равенства в неравенстве треугольника недостаточно |
3, 3, 3 |
Равносторонний | Самый частный случай должен проверяться первым |
4, 4, 3 |
Равнобедренный | Две равные стороны без прямого угла |
3, 4, 5 |
Прямоугольный | Теорема Пифагора |
5, 3, 4 |
Прямоугольный | Наибольшая сторона не обязательно введена последней |
1, 1, Math.Sqrt(2) |
Равнобедренный прямоугольный | Совмещение признаков и округление double |
4, 5, 6 |
Разносторонний непрямоугольный | Оставшийся допустимый случай |
Вариант 1: сравнение квадратов без учёта округления
Следующий метод верно разделяет случаи для многих примеров, но точное сравнение результатов вычислений с double может дать неверную классификацию, например для сторон 1, 1, Math.Sqrt(2):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
static void Student1Solution(double a, double b, double c)
{
Console.WriteLine($"Стороны: {a}, {b}, {c}");
bool isTriangle = a + b > c && a + c > b && b + c > a;
bool equilateralTri = a == b && a == c;
bool isoscelesTri = isTriangle && !equilateralTri &&
(a == b || a == c || b == c);
bool rightTri = Math.Pow(a, 2) == Math.Pow(b, 2) + Math.Pow(c, 2) ||
Math.Pow(b, 2) == Math.Pow(a, 2) + Math.Pow(c, 2) ||
Math.Pow(c, 2) == Math.Pow(a, 2) + Math.Pow(b, 2);
if (!isTriangle)
Console.WriteLine("Не треугольник");
else if (equilateralTri)
Console.WriteLine("Равносторонний");
else if (isoscelesTri)
{
if (rightTri)
Console.WriteLine("Равнобедренный прямоугольный");
else
Console.WriteLine("Равнобедренный");
}
else if (rightTri)
Console.WriteLine("Прямоугольный");
else
Console.WriteLine("Разносторонний непрямоугольный");
}
Вариант 2: несколько ошибок в разбиении на случаи
Это ошибочное решение. Сравните его с таблицей проверочных данных:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
static void Student2Solution(double side1, double side2, double side3)
{
if (side1 == side2 && side2 == side3)
{
Console.WriteLine("Равносторонний");
}
else if (side1 == side2 || side2 == side3)
{
Console.WriteLine("Равнобедренный");
}
else if (Math.Abs(side3 * side3 - (side1 * side1 + side2 * side2)) < 0.0001)
{
Console.WriteLine("Прямоугольный");
}
else
{
Console.WriteLine("Разносторонний непрямоугольный");
}
}
Здесь не проверяется существование треугольника, пропущено равенство side1 == side3, прямой угол проверяется только для последней стороны как гипотенузы, а равнобедренный прямоугольный треугольник попадает в слишком общую ветвь.
Вариант 3: проверка существования и точности вычислений
Следующее решение рассчитано на учебные примеры с положительными сторонами обычного масштаба, как в таблице. Для проверки прямого угла оно сравнивает результаты, округлённые до пяти знаков после запятой. Такой выбор точности — практическое допущение для этих примеров; для очень маленьких или очень больших величин точность сравнения нужно выбирать отдельно.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public static void ClassifyTriangle(double a, double b, double c)
{
// Треугольник невозможен, если нарушено хотя бы одно неравенство
if (a + b <= c || a + c <= b || b + c <= a)
Console.WriteLine("Не треугольник");
else
{
// Учитываем погрешность double, в том числе для сторон 1, 1, sqrt(2)
bool isRight =
Math.Round(Math.Pow(a, 2) + Math.Pow(b, 2), 5) == Math.Round(Math.Pow(c, 2), 5) ||
Math.Round(Math.Pow(a, 2) + Math.Pow(c, 2), 5) == Math.Round(Math.Pow(b, 2), 5) ||
Math.Round(Math.Pow(b, 2) + Math.Pow(c, 2), 5) == Math.Round(Math.Pow(a, 2), 5);
if (a == b || a == c || b == c)
{
// Начинаем с более частного случая
if (a == b && b == c)
Console.WriteLine("Равносторонний");
else if (isRight)
Console.WriteLine("Равнобедренный прямоугольный");
else
Console.WriteLine("Равнобедренный");
}
else
{
if (isRight)
Console.WriteLine("Прямоугольный");
else
Console.WriteLine("Разносторонний непрямоугольный");
}
}
}
Отрицание условия a + b > c && a + c > b && b + c > a можно записать как a + b <= c || a + c <= b || b + c <= a. При переносе отрицания внутрь выражения И меняется на ИЛИ, а каждое сравнение заменяется противоположным.
Дополнительно: сравнительный запуск после изучения циклов и методов
Перенесите три метода выше и следующий код в один класс Program. Для ручной проверки достаточно вызвать методы с конкретными значениями. Цикл позволяет дополнительно сравнить их на случайных примерах.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
static Random rnd = new Random();
public static void Main()
{
for (int i = 0; i < 10; i++)
{
double a = rnd.Next(3, 6);
double b = rnd.Next(3, 6);
double c = rnd.Next(3, 6);
Student1Solution(a, b, c);
Student2Solution(a, b, c);
ClassifyTriangle(a, b, c);
Console.WriteLine("====================\n");
}
Student1Solution(1, 1, Math.Sqrt(2));
Student2Solution(1, 1, Math.Sqrt(2));
ClassifyTriangle(1, 1, Math.Sqrt(2));
}
Диапазон от 3 до 5 повышает шанс получить стороны 3, 4, 5 в некотором порядке. Для более разнообразных примеров попробуйте rnd.Next(1, 14). Случайный выбор дополняет проверку заранее подобранных случаев, но не гарантирует, что все ошибки будут обнаружены.