Урок 2.0. Математические операции. Переменные. Типы переменных. Решение простых уравнений

Основные математические операции

Всем привет! Как вы видите, сегодня я разделил доску на две части: слева для программирования, а справа для математики. Дело в том, что в этом уроке я постоянно буду приводить аналогии из царицы всех наук чтобы вам было проще понять некие концептуальные вещи из программмирования.

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

 
#include 
main()
{
	1+1;
	1-1;
	1/2;
	2*2;
	return 0;
}

Мы попробуем это сделать и будьте уверены, что все замечательно сработает. Однако проблема в том, что программа ничего не напечатает. Просто поместив сложение в текст исходного кода, мы добъемся только того, что где-то в памяти компьютера произойдет сложение двух единиц, а затем, после завершения программы, компьютер все забудет. Возникает вопрос, а как вывести данные на экран? Мы ведь хотим знать результат данного сложения?!! Для этого нужно создать хранилище результата. А это хранилище мы будем называть переменной. Т.е. в программировании, так же как и в математике, существуют переменные. Давайте попробуем их использовать:

 
#include 
main()
{
    float x;
    x=1+1;    
    printf("%f \n", x);
    x=1-1;    
    printf("%f \n", x);
    x=1/2;    
    printf("%f \n", x);
    x=2*2;    
    printf("%f \n", x);
    return 0;
}

Видите, программа уже становится более интересной и выглядит гораздо серьезнее. Теперь немного слов о том, что я здесь написал. В первой строке я определил переменную типа float, или по-русски плавающий. Программисты обычно называют их числа с плавающей точкой. Почему так --- это вы узнаете, когда мы рассмотрим способы хранения чисел на компьютере. Запомните только, что числа float --- это точный аналог рациональных чисел в математике.

Переходим к следующей операции. Здесь выполняется сложение двух единиц, а результат этого сложения помещается в переменную x. Обратите внимание на очень важный момент: знак равенства в данном случае имеет несколько другое значение, чем равенство в математике. В математике знак равенства используется для того, чтобы утверждать, что левая и правая часть уравнения равны друг другу. В языке Си знак '=' приказывает компьютеру поместить результат действий, находящихся справа в переменную, которая находится слева. Теперь, когда переменная x содержит двойку, нам ее нужно распечатать. А делается это уже с помощью знакомой вам функции printf. Но теперь, вместо фразы "Hello world" в кавычки помещены довольно странные буквы. Разберемся, что же они значат: % говорит о том, что здесь нужно вставить значение переменной. f указывает на тип переменной - float или рациональное число, как говорится в математике. Затем идет пробел - он остается пробелом. А после - уже известный нам переход на новую строку. После закрытия кавычек мы ставим запятую и указываем имя переменной, которую нужно распечатать.

Теперь снова перейдем на компьютер и убедимся, что все сказанное мной --- правда.

Решение линейного уравнения

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

$$ ax+b=0 $$

Решение, как вы знаете, выглядит просто: переносим b в правую часть и делим на a:

\begin{equation} x=-\frac{b}{a} \end{equation}

Исходя из этого, если мы хотим написать программу, которая будет решать данное уравнение, то первое, что должна она сделать --- спросить у пользователя значения 'a' и 'b'. Для задавания вопросов пользователю мы можем воспользоваться той же функцией printf. Но вот чтением введенных значений с клавиатуры занимается другая функция: scanf. Проиллюстрируем как она работает на примере.

#include 
main()
{
    float a, b, x; 
    
    printf("a=");
    scanf("%f", &a);

    printf("b=");
    scanf("%f", &b);
    
    x=-b/a; 

    printf("result=%f \n", x);
    return 0;
}

Как видно --- использование функции scanf аналогично использованию printf. В кавычках мы пишем %, f, а затем указывается имя переменной, в которую будет помещено прочтенное с клавиатуры значение. Единственная разница лишь в том, что перед переменной помещается амперсанд. Почему его нужно использовать мы узнаем, когда будем проходить указатели на переменные.

А теперь проверим работоспособность программы на компьютере.

Иные типы переменных и особенности их использования

Последнее, что мне хотелось бы обсудить - это наиболее часто используемые типы переменных. В этом уроке мы уже пользовались типом float. Этот тип, как я уже сказал, отвечает действительным числам в математике. Лично я на практике почти никогда им не пользуюсь просто потому, что существуюет еще и тип double, для которого компьютер выделяет вдвое больше памяти, что приводит к увеличению точности вычислений с данным типом. Более того, в дальнейших уроках я уже всегда буду пользоваться типом double, а float вы скорее всего больше не увидите. Особенности работы с double состоят в определении переменной, чтении в нее значения с клавиатуры и печати на экран:
#include 
main()
{
    double a, b, x; 
    
    printf("a=");
    scanf("%lf", &a);

    printf("b=");
    scanf("%lf", &b);
    
    x=-b/a; 

    printf("result=%lf \n", x);
    return 0;
}

Обратите внимание на опеределение чисел типа double, а так же их использование в функциях scanf и printf. lf здесь обозначает long float.

Помимо действительных чисел в математике еще существуют и целые. В языке Си они так же существуют и объявляются int. В программировании целые числа отличаются от чисел с плавающей точкой тем, что они не имеют дробной части. Из чего возникают особенности обращения с ними. Например, следующая программа:

		#include 
		main()
		{
		    int x;
		    x=7/4;    
		    printf("%d \n", x);
		    return 0;
		}

Выведет в качестве результата '1', но не '1.75'. О чем это говорит: во-первых, как я уже сказал, числа типа int не содержат дробной части. Во-вторых программа не умеет округлять числа. Ведь следуя математическим правилам, мы должны были бы значение 1.75 округлить до '2'. Однако этого не происходит и поэтому вам необходимо быть внимательными, программа всегда просто отрубает дробную часть и выдает то, что осталось. В этом случае --- '1'.

Для чисел типа int (или целых чисел) существует дополнительный математический оператор --- взятие остатка. Который обозначается знаком '%'. Не путать с процентом в функциях printf и scanf --- они выполняют совершенно разные функции. Т.е. если мы заменим в вышенаписанном коде деление на процент - то результат уже будет 3, а не 1.

#include 
main()
{
    int x;
    x=7%4;    
    printf("%d \n", x);
    return 0;
}

Проверим вышесказанное на компьютере.

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

В этом уроке мы справились с решением линейного уравнения. Теперь у меня предложение к Вам. Можете ли вы написать такую программу, которая будет решать квадратное уравнение. Напомню, что наиболее общий вид квадратного уравнения является следующим:

\begin{equation} ax^2+bx+c=0 \end{equation} А решение ищется следующим образом: \begin{equation} D=b^2-4ac \end{equation} \begin{equation} x_1 = \frac{-b+\sqrt{D}}{2a} \end{equation} \begin{equation} x_2 = \frac{-b-\sqrt{D}}{2a} \end{equation}

Т.е. попытайтесь данный алгоритм запрограммировать. Для взятия корня используйте функцию sqrt(), которая объявлена в файле 'math.h'

#include 
#include 
main()
{
    double a, b, c;
    double x, D; 
    




    printf("X1=%f \n", x1);
    printf("X2=%f \n", x2);
    return 0;
}

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

Успехов!