ДЗ 1 — Ввод, арифметика и уравнения

Пять стартовых задач по консольному вводу, базовой арифметике и простым уравнениям.

Редактировать источник

Что внутри

В первом домашнем задании собраны самые базовые упражнения: ввод строки, арифметические действия, решение линейного и квадратного уравнений, а также логическая задача про освещённость комнаты.

1.1 «Имя»

Условие. Нужно запросить имя пользователя, считать одно слово и вывести приветствие.

Как устроено решение. Исходник читает строку в переменную Name, а затем выводит её обратно в консоль. Это минимальный пример на работу с cin и cout.

Что учесть. В сохранённой версии строка приветствия записана в кодировке старого исходника, но сама логика решения остаётся простой и корректной.

resources/procedural-programming/home-work-1/name.cpp
#include <iostream>
using namespace std;
string Name;
int main(){
    cout << "what is your name:";
    if (cin >> Name)
    {
        cout << "Привет, " << Name;
    }
    else
    {
        cout << "Eror";
    }
    return 0;
}

1.2 «Арифметика»

Условие. По двум введённым числам требуется получить сумму, разность, произведение и, если возможно, частное.

Как устроено решение. Сохранённый файл реализует калькулятор на одну выбранную операцию: пользователь вводит два числа и знак +, -, * или /, после чего программа считает результат.

Что учесть. Это решение не печатает все четыре операции подряд, как просит формулировка из PDF, зато хорошо показывает проверку ввода и отдельную обработку деления на ноль.

resources/procedural-programming/home-work-1/Arifmetica.cpp
#include <iostream>
using namespace std;
string Name;
int a, b, d;
int main() {
    cout << "Enter first number: " << "\n";
    if (cin >> a)
    {
        cout << "Enter second number: " << "\n";
        if (cin >> b)
        {
            cout << "What to do: +, -, *, /: " << "\n";
            if (cin >> Name)
            {
                if (Name == "+")
                {
                    d = a + b;
                    cout << "Answer: " << d;
                }
                else if (Name == "-")
                {
                    d = a - b;
                    cout << "Answer: " << d;
                }
                else if (Name == "*")
                {
                    d = a * b;
                    cout << "Answer: " << d;
                }
                else if (Name == "/")
                {
                    if (b == 0)
                    {
                        cout << "Error";
                    }
                    else
                    {
                        d = a / b;
                        cout << "Answer: " << d;
                    }
                }
                else
                {
                    cout << "Only: +, -, *, /";
                }
            }
            else
            {
                cout << "Error";
            }
        }
        else
        {
            cout << "Error";
        }
    }
    else
    {
        cout << "Error";
    }
}

1.3 «Уравнение»

Условие. Для любых b и c нужно решить линейное уравнение bx + c = 0.

Как устроено решение. Программа читает коэффициенты, проверяет случай b != 0, вычисляет корень x = -c / b, а затем отдельно рассматривает вырожденные случаи b = 0.

Что учесть. В текущем коде ответ сохраняется в int, поэтому дробная часть может потеряться. Для защиты полезно проговорить, что математически здесь лучше использовать double.

resources/procedural-programming/home-work-1/maindesc.cpp
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
    setlocale(0, "");
    double b, c;
    cout << "Введите первое число:";
    if (cin >> b)
    {
        cout << "Введите второе число:";
        if (cin >> c)
        {
            if (b != 0)
            {
                int m = (-c) / b;
                int r;
                if (m == -0)
                {
                    r = 0;
                }
                else r = m;
                cout << "Решение уравнения вида bx + c = 0 равно: " << r << endl;
            }
            else if (b == 0)
            {
                if (c == 0)
                {
                    cout << "x любое число";
                }
                else cout << "нет решений";
            }
        }
        else {
            cout << "Ошибка! Вы ввели не число. Пожалуйста, перезапустите приложение и введите тип данных для вычисления!" << endl;
        }
    }
    else {
        cout << "Ошибка! Вы ввели не число. Пожалуйста, перезапустите приложение и введите тип данных для вычисления!" << endl;
    }
    return 0;
}

1.4 «Ещё уравнение»

Условие. Нужно решить квадратное уравнение ax^2 + bx + c = 0.

Как устроено решение. Код проверяет несколько веток: полное квадратное уравнение, частные случаи b = 0 или c = 0, а также вырожденный вариант, когда уравнение превращается в линейное или вообще теряет неизвестную.

Что учесть. Это самая объёмная задача в первом ДЗ. Хорошо видно, как через if и else if раскладывается задача на отдельные случаи, а корни находятся через дискриминант.

resources/procedural-programming/home-work-1/onemoresolution.cpp
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
    setlocale(0, "");
    double a, b, c;
    cout << "Введите первое число:";
    if (cin >> a) {
        cout << "Введите второе число:";
        if (cin >> b) {
            cout << "Введите третье число:";
            if (cin >> c) {
                if (b == 0 && a != 0 && c <= 0) {
                    double x1 = -1 * (sqrt(-c)) / (sqrt(a));
                    double x2 = (sqrt(-c)) / (sqrt(a));
                    cout << "Первый корень уравнения равен:" << x1 << endl;
                    cout << "Второй корень уравнения равен:" << x2 << endl;
                    return 0;
                }
                else if (a != 0 && c != 0) {
                    double d = ((b * b) - 4 * a * c);
                    cout << "Значение дискриминанта равно:" << d << endl;
                    if (d < 0) {
                        cout << "Корней нет";
                    }
                    else if (d == 0) {
                        if ((2 * a) == 0) {
                            cout << "Ошибка, деление на ноль! Перезапустите приложение!" << endl;
                            return 0;
                        }
                        double x = -b / (2 * a);
                        cout << "Корень уравнения равен:" << x << endl;
                    }
                    else if (d > 0) {
                        if ((2 * a) == 0) {
                            cout << "Ошибка, деление на ноль! Перезапустите приложение!" << endl;
                            return 0;
                        }
                        double x1 = (((-b) + (sqrt(d))) / (2 * a));
                        double x2 = (((-b) - (sqrt(d))) / (2 * a));
                        cout << "Первый корень уравнения равен:" << x1 << endl;
                        cout << "Второй корень уравнения равен:" << x2 << endl;
                        return 0;
                    }
                }
                else if (a == 0 && b == 0)
                {
                    if (c == 0)
                    {
                        cout << "x любое число" << endl;
                    }
                    else if (c != 0) {
                        cout << "нет решений" << endl;
                    }
                    return 0;
                }
                else if (c == 0) {
                    if (a == 0) {
                        cout << "Ошибка, деление на ноль! Перезапустите приложение!" << endl;
                        return 0;
                    }
                    double x = -1 * (b / a);
                    cout << "Корень уравнения равен:" << x << endl;
                    return 0;
                }
                else {
                    if (b == 0) {
                        cout << "Ошибка, деление на ноль! Перезапустите приложение!" << endl;
                        return 0;
                    }
                    double x = ((-c) / b);
                    cout << "Корень уравнения равен:" << x << endl;
                    return 0;
                }
            }
            else {
                cout << "Ошибка! Вы ввели не число. Пожалуйста, перезапустите приложение и введите тип данных для вычисления!" << endl;
            }
        }
        else {
            cout << "Ошибка! Вы ввели не число. Пожалуйста, перезапустите приложение и введите тип данных для вычисления!" << endl;
        }
    }
    else {
        cout << "Ошибка! Вы ввели не число. Пожалуйста, перезапустите приложение и введите тип данных для вычисления!" << endl;
    }
    return 0;
}

1.5 «Лампа со шторой»

Условие. В комнате светло, если включена лампа или если на улице день и открыты шторы.

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

Что учесть. В сохранённой версии при открытых шторах выводится Light и днём, и ночью. Для защиты лучше отдельно проговорить, что по условию стоило бы дополнительно учитывать именно время суток.

resources/procedural-programming/home-work-1/lamp.cpp
#include <iostream>
using namespace std;
int Num, a, b, c;

int main()
{
    cout << "1 - Yes, 2 - no" << "\n";
    cout << "Is it day? (1 or 2): ";
    cin >> a;
    if ((a == 1) || (a == 2))
    {
    }
    else
    {
        cout << "Error";
        return 0;
    }
    cout << "Window opened? (1 or 2): ";
    cin >> b;
    if (b == 1 || b == 2)
    {
    }
    else
    {
        cout << "Error";
        return 0;
    }
    cout << "Lamp working? (1 or 2): ";
    cin >> c;
    if (c == 1 || c == 2)
    {
    }
    else
    {
        cout << "Error";
        return 0;
    }
    if (c == 1)
    {
        cout << "Light";
    }
    else
    {
        if (b == 1)
        {
            if (a == 1)
            {
                cout << "Light";
            }
            else
            {
                cout << "Light";
            }
        }
        else
        {
            cout << "Dark";
        }
    }
}