Инструкции к выполнению

Пошаговое руководство по созданию программ с разветвляющимися структурами

📋 Подготовка к работе

  1. Откройте Visual Studio

    Запустите Visual Studio 2022

  2. Создайте новый проект

    File → New → Project → Console App (.NET)

  3. Назовите проект

    Используйте имя "Lab3_BranchingAlgorithms"

  4. Подготовьте среду

    Откройте Solution Explorer и настройте редактор кода

🎯 Этап 1: Изучение теории условных операторов

Основные понятия

Условный оператор — конструкция, которая позволяет программе выполнить определенный блок кода в зависимости от истинности или ложности условия.

Типы условных конструкций в C#:

  • if — выполнение кода при истинном условии
  • if-else — выбор между двумя альтернативами
  • if-else if-else — множественный выбор
  • switch-case — выбор на основе значения переменной
  • ?: — тернарный оператор для простых условий

📝 Этап 2: Задание 1 - Простое ветвление

Задача: Проверка возраста

Напишите программу, которая определяет категорию человека по возрасту

using System;

namespace Lab3_BranchingAlgorithms
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("=== Определение возрастной категории ===");
            
            Console.Write("Введите ваш возраст: ");
            int age = Convert.ToInt32(Console.ReadLine());
            
            // Простое ветвление
            if (age < 0)
            {
                Console.WriteLine("Ошибка: возраст не может быть отрицательным!");
            }
            else if (age <= 12)
            {
                Console.WriteLine("Вы - ребенок");
            }
            else if (age <= 17)
            {
                Console.WriteLine("Вы - подросток");
            }
            else if (age <= 64)
            {
                Console.WriteLine("Вы - взрослый");
            }
            else
            {
                Console.WriteLine("Вы - пожилой человек");
            }
            
            Console.ReadKey();
        }
    }
}

🔢 Этап 3: Задание 2 - Проверка числа

Задача: Анализ числа

Программа должна определить знак числа, четность и делимость на 3 и 5

Console.WriteLine("=== Анализ числа ===");

Console.Write("Введите целое число: ");
int number = Convert.ToInt32(Console.ReadLine());

// Проверка знака
if (number > 0)
{
    Console.WriteLine($"Число {number} - положительное");
}
else if (number < 0)
{
    Console.WriteLine($"Число {number} - отрицательное");
}
else
{
    Console.WriteLine("Число равно нулю");
}

// Проверка четности
if (number % 2 == 0)
{
    Console.WriteLine("Число четное");
}
else
{
    Console.WriteLine("Число нечетное");
}

// Проверка делимости с примерами результатов
// Пример: number = 7
if (number % 3 == 0 && number % 5 == 0)  // 7%3!=0 && 7%5!=0 = false && false = false ❌
{
    Console.WriteLine("Число делится на 3 и на 5");
}
else if (number % 3 == 0)  // 7%3!=0 = false ❌
{
    Console.WriteLine("Число делится на 3");
}
else if (number % 5 == 0)  // 7%5!=0 = false ❌
{
    Console.WriteLine("Число делится на 5");
}
else  // ✅ Выполнится эта ветка
{
    Console.WriteLine("Число не делится ни на 3, ни на 5");
}

// Дополнительные проверки
bool isPrime = true;
if (number <= 1)  // Для 7: false ❌
{
    isPrime = false;
}
else
{
    for (int i = 2; i < number / 2; i++)
    {
        if (number % i == 0)  // Проверка на простоту
        {
            isPrime = false;
            break;
        }
    }
}

if (isPrime && number > 1)  // true && true = true ✅
{
    Console.WriteLine($"{number} - простое число");
}
else  // false || false = false ❌
{
    Console.WriteLine($"{number} - составное число");
}

📊 Этап 4: Задание 3 - Калькулятор оценок

Задача: Перевод баллов в оценку

Создайте программу для перевода баллов (0-100) в традиционную оценку

Console.WriteLine("=== Калькулятор оценок ===");

Console.Write("Введите количество баллов (0-100): ");
int score = Convert.ToInt32(Console.ReadLine());

string grade;
string comment;

// Пример: score = 55
// Использование вложенных условий
if (score < 0 || score > 100)  // 55<0 || 55>100 = false || false = false ❌
{
    grade = "Ошибка";
    comment = "Неверное количество баллов!";
}
else if (score >= 90)  // 55>=90 = false ❌
{
    grade = "5 (отлично)";
    comment = "Превосходный результат!";
}
else if (score >= 75)  // 55>=75 = false ❌
{
    grade = "4 (хорошо)";
    comment = "Хороший результат!";
}
else if (score >= 60)  // 55>=60 = false ❌
{
    grade = "3 (удовлетворительно)";
    comment = "Удовлетворительный результат";
}
else  // ✅ Выполнится эта ветка
{
    grade = "2 (неудовлетворительно)";
    comment = "Требуется дополнительная подготовка";
}

Console.WriteLine($"\nВаши баллы: {score}");
Console.WriteLine($"Оценка: {grade}");
Console.WriteLine($"Комментарий: {comment}");

// Дополнительная информация
if (score >= 60 && score <= 100)  // 55>=60 && 55<=100 = false && true = false ❌
{
    Console.WriteLine("Поздравляем! Вы прошли тест.");
}
else if (score >= 0 && score < 60)  // 55>=0 && 55<60 = true && true = true ✅
{
    Console.WriteLine("К сожалению, тест не пройден. Попробуйте еще раз.");
}

// Проверка на отличника с бонусом
bool hasBonus = score >= 95;  // 55>=95 = false ❌
bool isExcellent = score >= 90;  // 55>=90 = false ❌

if (hasBonus && isExcellent)  // false && false = false ❌
{
    Console.WriteLine("Вы получаете дополнительный бонус!");
}
else if (isExcellent && !hasBonus)  // false && true = false ❌
{
    Console.WriteLine("Отличный результат!");
}
else if (!isExcellent && score >= 60)  // true && false = false ❌
{
    Console.WriteLine("Продолжайте стараться!");
}

🎮 Этап 5: Задание 4 - Меню с выбором действий

Задача: Интерактивное меню

Реализуйте меню с использованием оператора switch-case

Console.WriteLine("=== Математический калькулятор ===");
Console.WriteLine("1. Сложение");
Console.WriteLine("2. Вычитание");
Console.WriteLine("3. Умножение");
Console.WriteLine("4. Деление");
Console.WriteLine("5. Возведение в степень");
Console.WriteLine("6. Квадратный корень");
Console.WriteLine("0. Выход");

Console.Write("\nВыберите операцию: ");
int choice = Convert.ToInt32(Console.ReadLine());

double num1, num2, result;

switch (choice)
{
    case 1: // Сложение
        Console.Write("Введите первое число: ");
        num1 = Convert.ToDouble(Console.ReadLine());
        Console.Write("Введите второе число: ");
        num2 = Convert.ToDouble(Console.ReadLine());
        result = num1 + num2;
        Console.WriteLine($"{num1} + {num2} = {result}");
        break;
        
    case 2: // Вычитание
        Console.Write("Введите первое число: ");
        num1 = Convert.ToDouble(Console.ReadLine());
        Console.Write("Введите второе число: ");
        num2 = Convert.ToDouble(Console.ReadLine());
        result = num1 - num2;
        Console.WriteLine($"{num1} - {num2} = {result}");
        break;
        
    case 3: // Умножение
        Console.Write("Введите первое число: ");
        num1 = Convert.ToDouble(Console.ReadLine());
        Console.Write("Введите второе число: ");
        num2 = Convert.ToDouble(Console.ReadLine());
        result = num1 * num2;
        Console.WriteLine($"{num1} * {num2} = {result}");
        break;
        
    case 4: // Деление
        Console.Write("Введите делимое: ");
        num1 = Convert.ToDouble(Console.ReadLine());
        Console.Write("Введите делитель: ");
        num2 = Convert.ToDouble(Console.ReadLine());
        
        if (num2 != 0)
        {
            result = num1 / num2;
            Console.WriteLine($"{num1} / {num2} = {result}");
        }
        else
        {
            Console.WriteLine("Ошибка: деление на ноль!");
        }
        break;
        
    case 5: // Степень
        Console.Write("Введите основание: ");
        num1 = Convert.ToDouble(Console.ReadLine());
        Console.Write("Введите показатель степени: ");
        num2 = Convert.ToDouble(Console.ReadLine());
        result = Math.Pow(num1, num2);
        Console.WriteLine($"{num1}^{num2} = {result}");
        break;
        
    case 6: // Квадратный корень
        Console.Write("Введите число: ");
        num1 = Convert.ToDouble(Console.ReadLine());
        
        if (num1 >= 0)
        {
            result = Math.Sqrt(num1);
            Console.WriteLine($"√{num1} = {result}");
        }
        else
        {
            Console.WriteLine("Ошибка: корень из отрицательного числа!");
        }
        break;
        
    case 0:
        Console.WriteLine("Выход из программы...");
        break;
        
    default:
        Console.WriteLine("Неверный выбор! Выберите от 0 до 6.");
        break;
}

📐 Этап 6: Задание 5 - Проверка треугольника

Задача: Анализ треугольника

Определите, можно ли построить треугольник и его тип

Console.WriteLine("=== Анализ треугольника ===");

Console.Write("Введите сторону a: ");
double a = Convert.ToDouble(Console.ReadLine());
Console.Write("Введите сторону b: ");
double b = Convert.ToDouble(Console.ReadLine());
Console.Write("Введите сторону c: ");
double c = Convert.ToDouble(Console.ReadLine());

// Пример: a = 3, b = 4, c = 10
// Проверка существования треугольника
if (a <= 0 || b <= 0 || c <= 0)  // 3<=0 || 4<=0 || 10<=0 = false || false || false = false ❌
{
    Console.WriteLine("Стороны должны быть положительными!");
}
else if (a + b > c && a + c > b && b + c > a)  // (3+4>10) && (3+10>4) && (4+10>3) = false && true && true = false ❌
{
    Console.WriteLine("Треугольник существует!");
    
    // Определение типа треугольника по сторонам
    if (a == b && b == c)  // Не выполнится
    {
        Console.WriteLine("Тип: равносторонний треугольник");
    }
    else if (a == b || b == c || a == c)  // Не выполнится
    {
        Console.WriteLine("Тип: равнобедренный треугольник");
    }
    else  // Не выполнится
    {
        Console.WriteLine("Тип: разносторонний треугольник");
    }
    
    // Проверка на прямоугольный треугольник
    // Сортируем стороны
    double max = Math.Max(a, Math.Max(b, c));
    double sum = 0;
    
    if (max == a)
    {
        sum = b * b + c * c;
    }
    else if (max == b)
    {
        sum = a * a + c * c;
    }
    else
    {
        sum = a * a + b * b;
    }
    
    // Проверка теоремы Пифагора
    if (Math.Abs(max * max - sum) < 0.0001)
    {
        Console.WriteLine("Треугольник является прямоугольным!");
    }
    
    // Вычисление периметра и площади
    double perimeter = a + b + c;
    double p = perimeter / 2;
    double area = Math.Sqrt(p * (p - a) * (p - b) * (p - c));
    
    Console.WriteLine($"Периметр: {perimeter:F2}");
    Console.WriteLine($"Площадь: {area:F2}");
}
else  // ✅ Выполнится эта ветка
{
    Console.WriteLine("Треугольник не существует!");
    Console.WriteLine("Сумма двух сторон должна быть больше третьей.");
    Console.WriteLine($"a + b = {a + b} должно быть > {c}: {a + b > c}");  // 7 > 10: false ❌
    Console.WriteLine($"a + c = {a + c} должно быть > {b}: {a + c > b}");  // 13 > 4: true ✅
    Console.WriteLine($"b + c = {b + c} должно быть > {a}: {b + c > a}");  // 14 > 3: true ✅
}

🎯 Этап 7: Задание 6 - Логические выражения

Задача: Проверка доступа

Система проверки доступа с множественными условиями

Console.WriteLine("=== Система контроля доступа ===");

Console.Write("Введите возраст: ");
int age = Convert.ToInt32(Console.ReadLine());

Console.Write("Есть ли у вас билет? (да/нет): ");
bool hasTicket = Console.ReadLine().ToLower() == "да";

Console.Write("Вы студент? (да/нет): ");
bool isStudent = Console.ReadLine().ToLower() == "да";

Console.Write("Вы VIP? (да/нет): ");
bool isVIP = Console.ReadLine().ToLower() == "да";

Console.Write("Текущее время (0-23): ");
int currentHour = Convert.ToInt32(Console.ReadLine());

// Сложная логика доступа
bool accessGranted = false;
string reason = "";

if (isVIP)
{
    accessGranted = true;
    reason = "VIP доступ разрешен в любое время";
}
else if (age < 18 && !hasTicket)
{
    accessGranted = false;
    reason = "Несовершеннолетним требуется билет";
}
else if (age < 18 && hasTicket && currentHour >= 22)
{
    accessGranted = false;
    reason = "Несовершеннолетним запрещен доступ после 22:00";
}
else if (hasTicket || (isStudent && currentHour >= 18 && currentHour < 21))
{
    accessGranted = true;
    if (hasTicket)
    {
        reason = "Доступ по билету";
    }
    else
    {
        reason = "Студенческий доступ в вечернее время";
    }
}
else if (age >= 65 && currentHour >= 9 && currentHour < 17)
{
    accessGranted = true;
    reason = "Льготный доступ для пенсионеров";
}
else
{
    accessGranted = false;
    reason = "Не выполнены условия доступа";
}

// Вывод результата
Console.WriteLine("\n--- Результат проверки ---");
if (accessGranted)
{
    Console.ForegroundColor = ConsoleColor.Green;
    Console.WriteLine("✓ ДОСТУП РАЗРЕШЕН");
}
else
{
    Console.ForegroundColor = ConsoleColor.Red;
    Console.WriteLine("✗ ДОСТУП ЗАПРЕЩЕН");
}
Console.ResetColor();
Console.WriteLine($"Причина: {reason}");

💰 Этап 8: Задание 7 - Налоговый калькулятор

Задача: Прогрессивная шкала налогообложения

Рассчитайте налог по прогрессивной шкале

Console.WriteLine("=== Налоговый калькулятор ===");

Console.Write("Введите годовой доход: ");
double income = Convert.ToDouble(Console.ReadLine());

double tax = 0;
double taxRate = 0;
string bracket = "";

// Прогрессивная шкала налогообложения
if (income <= 0)
{
    Console.WriteLine("Доход должен быть положительным!");
}
else if (income <= 500000)
{
    taxRate = 0.13;
    tax = income * taxRate;
    bracket = "13% (базовая ставка)";
}
else if (income <= 1000000)
{
    tax = 500000 * 0.13;
    tax += (income - 500000) * 0.15;
    taxRate = tax / income;
    bracket = "13% до 500к + 15% свыше";
}
else if (income <= 5000000)
{
    tax = 500000 * 0.13;
    tax += 500000 * 0.15;
    tax += (income - 1000000) * 0.20;
    taxRate = tax / income;
    bracket = "Прогрессивная шкала до 20%";
}
else
{
    tax = 500000 * 0.13;
    tax += 500000 * 0.15;
    tax += 4000000 * 0.20;
    tax += (income - 5000000) * 0.25;
    taxRate = tax / income;
    bracket = "Максимальная ставка 25%";
}

// Вывод результатов
if (income > 0)
{
    Console.WriteLine($"\n--- Расчет налога ---");
    Console.WriteLine($"Доход: {income:C}");
    Console.WriteLine($"Налоговая категория: {bracket}");
    Console.WriteLine($"Сумма налога: {tax:C}");
    Console.WriteLine($"Эффективная ставка: {taxRate:P2}");
    Console.WriteLine($"Доход после налогов: {income - tax:C}");
    
    // Тернарный оператор для определения категории
    string category = income > 5000000 ? "Высокий доход" :
                      income > 1000000 ? "Средний доход" :
                      income > 500000 ? "Ниже среднего" :
                      "Низкий доход";
    Console.WriteLine($"Категория дохода: {category}");
}

✅ Этап 9: Комплексное задание

Задача: Игра "Камень-Ножницы-Бумага"

Создайте игру с компьютером используя все типы условных операторов

Console.WriteLine("=== Игра: Камень-Ножницы-Бумага ===");

Random random = new Random();
int computerChoice = random.Next(1, 4);

Console.WriteLine("Выберите:");
Console.WriteLine("1. Камень");
Console.WriteLine("2. Ножницы");
Console.WriteLine("3. Бумага");
Console.Write("Ваш выбор (1-3): ");
int playerChoice = Convert.ToInt32(Console.ReadLine());

// Проверка корректности ввода
if (playerChoice < 1 || playerChoice > 3)
{
    Console.WriteLine("Неверный выбор!");
}
else
{
    // Определение выбора
    string[] choices = { "", "Камень", "Ножницы", "Бумага" };
    Console.WriteLine($"\nВаш выбор: {choices[playerChoice]}");
    Console.WriteLine($"Выбор компьютера: {choices[computerChoice]}");
    
    // Определение победителя
    if (playerChoice == computerChoice)
    {
        Console.WriteLine("Результат: НИЧЬЯ!");
    }
    else if ((playerChoice == 1 && computerChoice == 2) ||  // Камень побеждает ножницы
             (playerChoice == 2 && computerChoice == 3) ||  // Ножницы побеждают бумагу
             (playerChoice == 3 && computerChoice == 1))    // Бумага побеждает камень
    {
        Console.WriteLine("Результат: ВЫ ПОБЕДИЛИ! 🎉");
    }
    else
    {
        Console.WriteLine("Результат: ВЫ ПРОИГРАЛИ! 😢");
    }
    
    // Объяснение результата
    switch (playerChoice)
    {
        case 1: // Камень
            if (computerChoice == 2)
                Console.WriteLine("Камень побеждает ножницы!");
            else if (computerChoice == 3)
                Console.WriteLine("Бумага накрывает камень!");
            break;
            
        case 2: // Ножницы
            if (computerChoice == 3)
                Console.WriteLine("Ножницы режут бумагу!");
            else if (computerChoice == 1)
                Console.WriteLine("Камень ломает ножницы!");
            break;
            
        case 3: // Бумага
            if (computerChoice == 1)
                Console.WriteLine("Бумага накрывает камень!");
            else if (computerChoice == 2)
                Console.WriteLine("Ножницы режут бумагу!");
            break;
    }
}

🐛 Отладка условных операторов

Основные приемы отладки:

  1. Проверка всех ветвей

    Убедитесь, что протестировали каждую ветку условий

  2. Граничные значения

    Проверяйте условия на границах (например, ==, <=, >=)

  3. Логические операторы

    Проверьте правильность использования && и ||

  4. Порядок условий

    Более специфичные условия должны идти первыми

Частые ошибки:

  • Использование = вместо == - присваивание вместо сравнения
  • Забытый break в switch - выполнение следующего case
  • Неправильный порядок условий - недостижимый код
  • Отсутствие else - непредусмотренные случаи
  • Сравнение вещественных чисел через == - проблемы точности

💡 Полезные советы

  • Всегда проверяйте входные данные на корректность
  • Используйте осмысленные имена переменных для условий
  • Группируйте связанные условия с помощью скобок
  • Избегайте слишком глубокой вложенности условий
  • Используйте switch-case для множественного выбора по значению
  • Применяйте тернарный оператор для простых условий
  • Документируйте сложные логические выражения
  • Всегда добавляйте default в switch-case
  • Тестируйте граничные и особые случаи
  • Используйте константы для магических чисел в условиях

📝 Требования к отчету

Отчет должен содержать:

  1. Титульный лист с названием работы
  2. Цель и задачи работы
  3. Теоретическую часть (типы ветвлений, операторы)
  4. Блок-схемы для каждого задания
  5. Листинги программ с комментариями
  6. Скриншоты выполнения с разными тестовыми данными
  7. Таблицы тестирования (входные данные → результат)
  8. Анализ результатов
  9. Выводы по работе