Урок 3.0. Условные операторы. Операторы сравнения

When $a \ne 0$, there are two solutions to \(ax^2 + bx + c = 0\) and they are $$x = {-b \pm \sqrt{b^2-4ac} \over 2a}.$$

Решение домашнего задания

Всем привет. Начнем с домашнего задания. Вам необходимо было создать программу, которая считывает с клавиатуры коэффициенты a,b,c, а после этого находит и выводит на экран решение квадратного уравнения. Вот как это решение может выглядеть:

#include 
#include 
main()
{
	double a, b, c;
	double x, D; 
	printf ("a=");
	scanf  ("%lf", &a);

	printf ("b=");
	scanf  ("%lf", &b);
	
	
	printf ("c=");
	scanf  ("%lf", &c);

	D=b*b-4*a*c;

	x=(-b+sqrt(D))/(2*a);
	printf("X1=%f \n", x);

	
	x=(-b-sqrt(D))/(2*a);
	printf("X2=%f \n", x);
	
	
	return 0;
}

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

Условия

Сейчас мы поговорим о еще одном немаловажном аспекте языка Си --- это условные конструкции. Что это такое? Очень часто программа должна выполнять те или иные действия только при наступлении условий. Например, в прошлом домашнем задании мы написали программу, которая вычисляет корни квадратного уравнения. Но один очень важный момент был упущен: действительные корни существуют только тогда, когда дискриминант неотрицателен. Т.е. грамотно написанная программа в случае, когда дискриминант меньше нуля должна была бы возмутиться и заявить, что решать это уравнение она не собирается, так как его не существует. Конечно, правильнее говорить, что решение существует в области комплексных чисел, но мы с этой областью не работаем, поэтому останемся при своем мнении и будем говорить, что решений просто нет.

Добавление данной логики в программу я оставлю вам на домашнее заданее, а в этом уроке мы просто разучим основные принципы работы с условными конструкциями. Итак давайте модифицируем нашу "Hello world" программу таким образом, чтобы данная фраза выводилась только в случае, если пользователь ввел с клавиатуры цифру 1.

На доске у нас пристутствует еще та, самая первая программа в качестве заготовки:

#include 
main()
{
    printf ("Hello world!\n");
    return 0;
}

Как мы уже знаем, программа должа считать введенную цифру с клавиатуры и поместить ее в переменную, затем проверить, совпадает ли значение переменной с единицей и если да - то распечатать фразу "Hello world" на экран.

#include 
main()
{
    int x;
    printf ("x=");
    scanf("%d", &x);
    if (x == 1)
    {
	printf ("Hello world!\n");
    }
    
    printf ("Exit!\n");
    return 0;
}

Вот такая программа получилась. Мы в самом начале объявили переменную, затем поместили в нее значение считанное с клавиатуры и ... тут начинается что-то новое. Вы видите слово if, которое в языке Си зарезервировано под проверку условия, помещенного в скобки сразу после этого самого слова if. С английского if переводится как "если". Т.е. если условие в скобках верно, то выполняются инструкции помещенные между фигурными скобками следующими сразу после данной конструкции. В данном случае это просто распечатка фразы на экран. Теперь ближе посмотрим на то, что находится в скобках: вы видите повторяющийся два раза знак '='. Это не ошибка! Два раза равно - это оператор сравнения, не путать с присваиванием, которое обозначается одним знаком равно. Получается, что в этом месте компьютер проверяет совпадает ли значение переменной 'x' с единицей. Существуют и другие операторы сравнения:

  • < меньше
  • > больше
  • <= меньше либо равно
  • >= больше либо равн
  • != не равно

Запомнить как писать меньше либо равно не составляет труда: просто пишите в том же порядке, что и говорите "меньше или равно" --- "<=". Стоит лишь отметить, что в конце программы я добавил строчку:

    printf ("Exit!\n");

Никакой смысловой нагрузки она, как вы, наверное, догадались, не несет. Просто этот текст будет печататься при завершении программы независимо от выполнения или невыполнения условия в скобках после "if". Таким образом мы будем убеждены, что программа сработала и корректно завершилась.

Сейчас мы запишем все это на компьютере, проверим, что код работает корректно. Затем мы заменим оператор сравнения (==) на остальные из списка и убедимся, что ничего сверхъестественного здесь не происходит, а напротив все работает как и предполагается.

Если условие не выполнено. Конструкция else.

Программа, которая написана на доске проверяет, совпадает ли значение икса с единицей. И если значение совпадает, то программа здоровается с миром. Однако программа ничего не делает, если значение отличается от единицы. Давайте сделаем следующее. Если значение равно 1 - то будет приветствие, а когда значение единице не равно --- программа прощается с нами. Для этого существует конструкция else, которая помещается сразу после инструкций оператора if. Вот как это выглядит:

#include 
main()
{
    int x;
    printf("x=");
    scanf("%d", &x);
    if (x == 1)
    {
	printf ("Hello world!\n");
    }
    else
    {
	printf ("Bye-bye!\n");

    }
    printf ("Exit!\n");
    return 0;
}

И снова все достаточного логично. Если условие помещенное в скобки после if не выполняется --- программа будет искать сопутствующую else. Что наиболее удачно можно перевести с английского как "иначе". Т.е если x не равен единице, то последующая конструкция в фигурных скобках не выполняется, а осуществляется переход с конструкции else или иначе.

Проверим это на компьютере.

Последовательная проверка нескольких условий

Важно уточнить, что под словом "несколько" имеется ввиду больше чем 1. Т.е. когда есть два условия, мы уже говорим несколько. Как же это работает? А очень просто. Давайте напишем программу, которая при вводе числа 1 здоровается, при вводе числа 2 - прощается, а при вводе любого другого числа говорит, что она ничего не поняла. Вот как такая программа должна выглядеть:

#include 
main()
{
    int x;
    printf("x=");
    scanf("%d", &x);
    if (x == 1)
    {
	printf ("Hello world!\n");
    }
    else if (x==2)
    {
	printf ("Bye-bye!\n");

    }
    else
    {
	printf ("I don't understand. Type 1 or 2\n");
    }
    printf ("Exit!\n");
    return 0;
}

Домашнее задание

Переходим к домашнему заданию.

В прошлом домашнем задании вы скорее всего справились с решением квадратного уравнения. В этом уроке мы изучили условия. Теперь попытаемся собрать полученные знания воедино и применить их к реальной задаче. Необходимо написать программу, которая решает квадратное уравнение только в случае, если дискриминант больше нуля. В случае если дискриминант равен 0, решение должно быть единственное. И если дискриминант меньше нуля --- программа должна выдать предупреждение и отказаться что-либо решать.

Решение я покажу в самом начале следующего урока. Обращаю Ваше внимание. Не в дополнениях к данному уроку, а именно в следующем уроке. Дополнения я создаю только с целью объяснить моменты, которые нечетко были оговорены в основном уроке.

Успехов!