16 статей
Напомним определение модуля числа:
\[ |a| = \left\{ \begin{aligned} a \text{, если } & a \ge 0, \\ -a \text{, если } & a < 0 \end{aligned} \right. \]
Отметим следующие свойства модуля, вытекающие непосредственно из определения.
.
.
.
.
.
.
. (здесь равенство достигается, когда числа `a` и `b` одного знака или одно из них равно нулю; если же числа `a` и `b` разных знаков, то выполняется строгое неравенство).
.
. - это расстояние от точки `a` на числовой оси до точки `0`.
. - это расстояние между точками `a` и `b` на числовой оси.
.
Докажем свойство . Остальные свойства проверьте самостоятельно. Поскольку обе части неравенства неотрицательны, возведение их в квадрат является равносильным преобразованием. Получаем
\[|a+b|^2 \le (|a| + |b|)^2 \Leftrightarrow a^2 + 2ab + b^2 \le |a|^2 + 2|a| \cdot |b| + |b|^2 \Leftrightarrow ab \le |ab|.\]
Последнее неравенство верно (свойство ). Заметим, что оно обращается в равенство, когда числа и одного знака (или одно из них равно нулю).
Перейдём к уравнениям с модулем. В простейших случаях можно воспользоваться свойством модуля .
Решите уравнение:
a) б) в)
a) - это расстояние между точками `x` и `2` на число вой прямой (свойство ). Поэтому уравнение можно прочитать так: точка `x` удалена от точки `2` на расстояние `5`. Иначе говоря, мы ищем точки, удалённые от точки `2` на расстояние `5`. Ясно, что это точки `-3` и `7`. Записать решение короче всего так:
\[|x-2| = 5\Leftrightarrow \left[ \begin{aligned} x-2 &= 5, \\ x-2 &= -5 \end{aligned} \right. \Leftrightarrow \left[ \begin{aligned} x &= 7, \\ x &= -3 \end{aligned} \right. .\]
`x=-3`; `x=7`.
б) Левая часть уравнения неотрицательна (свойство ). Поэтому уравнение не имеет решений.
нет решений.
в) Задачу можно сформулировать так: расстояние от точки `x` до точки `2` равно расстоянию от точки `x` до точки `(– 6)`, то есть мы ищем точку на прямой, равноудалённую от точек `2` и `(– 6)`. Ясно, что это середина отрезка, соединяющего эти точки, т. е. `x = -2`.
Покажем ещё один способ решения:
\[|x-2| = |x+6|\Leftrightarrow (x-2)^2 = (x+6)^2\Leftrightarrow x = -2 \]
`x=-2`.
Если уравнение имеет более сложный вид, то, как правило, приходится раскрывать модуль по определению. Для этого отмечаем на числовой прямой точку (точки), в которых выражения, находящиеся под модулем, обращаются в ноль. Эти точки делят прямую на несколько промежутков, на каждом из которых знаки подмодульных выражений фиксированы, поэтому можно раскрыть модули. Рассмотрим пример.
Решите уравнение: .
Отметим на числовой прямой точки . Получаем `3` точки, которые разбивают числовую прямую на `4` интервала. Раскрываем модули на каждом из этих интервалов (см. рис. 1).
Рассмотрим 4 случая:
а) Тогда:
\[-(x+1) + 11 = -(2x+11) + (1-x) \Leftrightarrow x = -10.\]
Убеждаемся, что удовлетворяет условию , поэтому является решением данного уравнения.
б) . Тогда:
\[-(x+1) + 11 = (2x+11) + (1-x) \Leftrightarrow x = -1.\]
Однако не удовлетворяет условию , поэтому не подходит.
в) . Тогда:
\[(x+1) + 11 = (2x+11) + (1-x) \Leftrightarrow 12 = 12.\]
Получилось верное равенство, поэтому все `x`, удовлетворяющие условию являются решениями.
г) . Тогда:
\[(x+1) + 11 = (2x+11) - (1-x) \Leftrightarrow x = 1.\]
Условие не выполнено, поэтому данный корень не подходит.
Объединяем полученные решения и получаем .
.
1) При таком методе решения необходимо проверять принадлежат ли найденные корни рассматриваемому в данный момент промежутку – иначе можно получить неверный ответ.
2) Точки, в которых выражения под модулями обращаются в ноль, можно включать в любой из двух промежутков, для которых они являются границами. Например, если бы в случае б) мы взяли то число попало бы в промежуток. В случае в) мы бы рассматривали и здесь корня мы бы не получили. При этом объединение всех решений было бы тем же самым.
Напомним, что дробь называют рациональной, если она представляет собой отношение многочленов (например, `(2x-1)/(x^2+3)`, `(5x^3)/(1-x)` и т. д.). Если обе части неравенства являются суммами рациональных дробей и многочленов, то такие неравенства называют рациональными. Для их решения применяют следующий алгоритм: все члены переносят в одну сторону, приводят их к общему знаменателю, а далее у полученной дроби числитель и знаменатель раскладывают на множители. После этого на числовой прямой отмечают точки, в которых числитель и знаменатель обращаются в ноль, а затем на полученных промежутках расставляют знаки, которые принимает дробь - далее остаётся записать ответ.
Покажем, как работает метод интервалов на нескольких примерах.
Решите неравенства:
а) `((x^2+5x+6)(x-4))/(x^2-x)>=0`;
б) `(x-3)^2(x-4)^3(x-5)(x-6)^4<=0`;
в) `1/x<1/3`;
г) `((x^2-x-2)(2x-3-x^2))/((x^2+4x+5)(2x^2-x-6))<=0`;
д) `3/(x^3-3x^2+4)-10/(x^3-7x^2+4x+12)>1/(x^2-5x-6)`.
а) Раскладывая числитель и знаменатель дроби на множители, получаем
`((x+2)(x+3)(x+4))/(x(x-1))>=0`. (1)
Точки, в которых числитель обращается в ноль (нули числителя), обозначаем на числовой прямой маленькими закрашенными кружочками – они будут включены в ответ, так как в них неравенство выполняется. Точки, в которых знаменатель обращается в ноль (нули знаменателя), обозначаем на числовой прямой маленькими пустыми кружочками (такие точки называются выколотыми) – они не будут включены в ответ, так как в них левая часть не определена (рис. 2).
Отмеченные точки делят числовую прямую на шесть промежутков, на каждом из которых знак левой части неравенства (1) постоянен. Чтобы определить знаки, сначала определим знак левой части (1) на крайнем правом промежутке `(4; +oo)`. Для этого можно подставить какое-либо значение переменной `x` из этого промежутка в (1), например, `x=1000`. Несложно видеть, что при этом каждый из множителей в числителе и знаменателе положителен, поэтому дробь больше нуля, и на промежутке `(4; +oo)` можем поставить знак `«+»`.
Теперь переместимся в соседний промежуток `(1; 4)`. Заметим, что при переходе через точку `x=4` только один из множителей в (1) меняет знак (это `(x-4)`), а все остальные знаки остаются неизменными, поэтому дробь меняет знак, и на промежутке `(1; 4)` ставим знак `«-»`. При переходе к каждому следующему промежутку ровно один множитель в числителе или знаменателе (1) меняет знак, поэтому меняет знак и вся дробь, то есть знаки чередуются. Получаем такую расстановку знаков:
`x in [-3; -2]uu(0; 1)uu[4; +oo)`.
б) Здесь левая часть уже разложена на множители, и нам остаётся лишь расставить знаки. Для этого отмечаем на числовой прямой точки `x=3`, `x=4`, `x=5`, `x=6` (все они невыколотые и являются решениями неравенства) и приступаем к расстановке знаков. Принципиальное отличие этого примера от предыдущего в том, что некоторые из множителей возводятся в степень. На что это влияет? Если показатель степени чётный, то соответствующий множитель не меняет знак при переходе через ту точку, в которой он обращается в ноль (например, `(x-3)^2>=0` при любых `x`, поэтому с обеих сторон от точки `x=3` выражение `(x-3)^2` положительно). Если показатель степени нечётный, то множитель меняет знак при переходе через ту точку, в которой он равен нулю. В итоге получаем следующую расстановку знаков:
Не забываем также включить в ответ все точки, отмеченные на прямой жирными кружочками.
`x in {3}uu[4;5]uu{6}`.
в) Переносим `1/3` влево и приводим дроби к общему знаменателю: `(3-x)/(3x)<0`. Расставляем знаки левой части на числовой прямой (для строгого неравенства все точки на прямой выколотые, так как нули числителя решениями неравенства не являются (рис. 5)).
`x in (-oo; 0)uu(3;+oo)`.
При решении этой задачи часто допускают следующие ошибки.
1) Умножают обе части неравенства на `x`. Этого делать нельзя, так как если мы умножаем обе части неравенства на отрицательное число, то знак неравенства надо поменять, если на положительное, то знак надо оставить таким, какой он и был. Поскольку знак `x` нам неизвестен, то мы не можем корректно выбрать знак нового неравенства.
2) В исходном неравенстве требуется сравнить две дроби с одинаковыми числителями. Значит больше та дробь, у которой знаменатель меньше. Так рассуждать нельзя, поскольку это свойство справедливо лишь для тех дробей, у которых числитель и знаменатель положительны. Если числитель или знаменатель отрицательны, то это свойство неверно (например, `-3<3` и `1/(-3)<1/3`).
г) Находим нули числителя и знаменателя. Получаем:
1. `x^2-x-2=0 iff x=2` или `x=-1` (поэтому `x^2-x-2=(x-2)(x+1)`);
2. `2x-3-x^2-x^2=0 iff O/` (т. к. дискриминант отрицателен). Следовательно, выражение `-x^2+2x-3` отрицательно при всех `x` (графиком функции `f(x)=-x^2+2x-3` является парабола с ветвями вниз, при этом она не пересекает ось абсцисс, так как у уравнения `f(x)=0` нет корней; значит, эта парабола целиком расположена ниже оси абсцисс, то есть `f(x)<0` при всех `x`).
3. `x^2+4x+5=0 iff O/`, поэтому `x^2+4x+5>0` при всех `x`.
4. `2x^2-x-6=0 iff x=2` или `x=-3/2`. Значит,
`2x^2-x-6=2(x-2)(x+3/2)=(x-2)(2x+3)`.
Исходное неравенство равносильно следующему
`((x-2)(x+1)(2x-3-x^2))/((x^2+4x+5)(x-2)(2x+3))<=0`.
Отбросив множители `(2x-3-x^2)` и `(x^2+4x+5)`, знаки которых не зависят от `x` получаем
$$ {\displaystyle \frac{\left(x-2\right)\left(x+1\right)}{\left(x-2\right)\left(2x+3\right)}}\ge 0\iff \left\{\begin{array}{l}{\displaystyle \frac{x+1}{2x+3}}\ge 0,\\ x\ne 2.\end{array}\right.$$
Решая первое неравенство системы методом интервалов, получаем
С учётом второго неравенства `x in (-oo; -3/2)uu[-1; 2)uu(2; +oo)`.
`x in (-oo; -3/2)uu[-1; 2)uu(2; +oo)`.
д) Прежде всего, необходимо привести дроби к общему знаменателю. Чтобы сделать это, раскладываем знаменатели дробей на множители.
Заметим, что `x=-1` является корнем каждого из знаменателей в левой части неравенства. Выполняя деление на `(x+1)`, получаем следующие разложения на множители:
`x^3-3x^2+4=(x+1)(x^2-4x+4)=(x+1)(x-2)^2`;
`x^3-7x^2+4x+12=(x+1)(x^2-8x+12)=(x+1)(x-2)(x-6)`;
`x^2-5x-6=(x+1)(x-6)`.
Преобразуем исходное неравенство:
`3/((x+1)(x-2)^2)-10/((x+1)(x-2)(x-6))>1/((x+1)(x-6)) iff`
`iff (3(x-6)-10(x-2)-(x-2)^2)/((x+1)(x-2)^2(x-6))>0 iff`
`iff (-x^2-3x-2)/((x+1)(x-2)^2(x-6))>0 iff`
`iff (-(x+1)(x+2))/((x+1)(x-2)^2(x-6))>0 iff`
$$\left\{\begin{array}{l}\dfrac{x+2}{\left(x-2\right)^2\left(x-6\right)}<0,\\x\neq-1\end{array}\right.\Leftrightarrow\left\{\begin{array}{l}\dfrac{x+2}{x-6}<0,\\x\neq-1,\;x\neq2.\end{array}\right.$$
Решая первое неравенство системы методом интервалов, находим, что `x in (-2; 6)`. Исключая точки `x=-1` и `x=2`, получаем `x in (-2;-1)uu(-1;2)uu(2;6)`.
`x in (-2;-1)uu(-1;2)uu(2;6)`.
Заметим, что знаки следующих выражений совпадают:
`|a|-|b|` и `a^2-b^2`,
`a^(2n)-b^(2n)(n in NN)` и `a^2-b^2`, (2)
`a^(2n+1)-b^(2n+1)(n in NN)` и `a-b`.
Это свойство иногда оказывается полезным при решении неравенств. Когда мы решаем дробно-рациональное неравенство (возможно, содержащее знак модуля), мы приводим его к виду «дробь `>0`» (или «дробь `>=0`»), после чего числитель и знаменатель дроби раскладываем на множители. Так как мы сравниваем дробь с нулём, то нас интересуют только знаки каждого из множителей в числителе и знаменателе. Следовательно, если мы некоторые из них заменим на выражения тех же самых знаков по формулам (2), то получим равносильное неравенство.
Решите неравенство
`((x^8-256)(|3x+4|-|2x-7|))/(243-x^5)>=0`.
Заменим множитель `x^8-256=x^8-2^8` на `x^2-x^2`;
множитель `|3x+4|-|2x-7|` на `(3x+4)^2-(2x-7)^2`;
множитель `243-x^5=3^5-x^5` на `3-x`. Получаем
`((x^2-2^2)((3x+4)^2-(2x-7)^2))/(3-x)>=0`.
Каждую из скобок в числителе раскладываем на множители по формуле разности квадратов.
`((x-2)(x+2)(3x+4+2x-7)(3x+4-2x+7))/(3-x)>=0 iff`
`iff ((x-2)(x+2)(5x-3)(x+11))/(x-3)<=0 iff x in (-oo;-11]uu[-2;3/5]uu[2;3)`.
`x in (-oo;-11]uu[-2;3/5]uu[2;3)`.
Простейшие неравенства решаются с помощью свойств модуля.
Решите неравенство:
а) `|x-2|>=-1`;
б) `|x-4|<-2`;
в) `|1-x|<=4`;
г) `|3+x|>5`.
а) `|x-2|>=0>-1` - верно для всех `x`.
б) Решений нет, т. к. `|x-4|>=0` для всех `x`.
в) Воспользуемся снова свойством $$ {10}^{○}$$ (см. § 1). Тогда условие звучит так: расстояние от точки `x` до точки `1` не превосходит `4`. То есть, мы ищем все точки прямой, удалённые от точки `1` на расстояние, не большее `4` (см. рис. 7).
Запишем решение так:
`|1-x|<=4 iff -4<=1-x<=4 iff -3<=x<=5`.
г) `|x+3|=|x-(-3)|`. Поэтому `|x+3|` - это расстояние между точками и (`–3`). Ищем все точки на прямой, удалённые от точки (`–3`) на расстояние, большее `5` (см. рис. 8).
Запишем решение:
$$\left|3+x\right|>5\Leftrightarrow\left[\begin{array}{l}3+x>5,\\3+x<-5\end{array}\right.\Leftrightarrow\left[\begin{array}{l}x>2,\\x<-8.\end{array}\right.$$
`x in (-oo;-8)uu(2;oo)`.
При решении неравенств, содержащих знак модуля, часто бывают полезны следующие равносильные переходы.
$$ {12}^{○}$$. `|f(x)|>|g(x)| iff f^2(x)>g^2(x)`.
$$ {13}^{○}$$. $$\left|f\left(x\right)\right|>g\left(x\right)\Leftrightarrow\left[\begin{array}{l}f\left(x\right)>g\left(x\right),\\f\left(x\right)<-g\left(x\right).\end{array}\right.$$
$$ {14}^{○}$$. $$\left|f\left(x\right)\right|< g\left(x\right)\Leftrightarrow\left\{\begin{array}{l}f\left(x\right)< g\left(x\right),\\f\left(x\right)>-g\left(x\right).\end{array}\right.$$
Докажем некоторые из них.
$$ {12}^{○}$$. Если обе части неравенства неотрицательны, то его можно возвести в квадрат. Таким образом, `|f(x)|>|g(x)| iff f^2(x)>g^2(x)`. Докажем в обратную сторону:
`f^2(x)>g^2(x) iff |f(x)|^2-|g(x)|^2>0 iff`
`iff (|f(x)|-|g(x)|)*(|f(x)|+(g(x)|)>0`.
Последнее условие означает, что числа `|f(x)|+|g(x)|` и `|f(x)|-|g(x)|` имеют один знак; `|f(x)|+|g(x)|` не может быть отрицательным, поэтому оба числа должны быть положительны `=> |f(x)|-|g(x)|>0=> |f(x)|>|g(x)|`. Утверждение доказано.
$$ {14}^{○}$$. Рассмотрим 2 случая.
(1) `g(x)<=0`. Тогда неравенство `|f(x)|<g(x)` не имеет решений;
не имеет решений и система, так как $$\left\{\begin{array}{l}f\left(x\right)< g\left(x\right)\leq0,\\f\left(x\right)>-g\left(x\right)\geq0,\end{array}\right.$$ откуда следует, что `f(x)>0` и `f(x)<0`, что невозможно. Значит, если `g(x)<=0`, система и неравенство равносильны.
(2) `g(x)>0`. Тогда наше утверждение сводится к простейшему неравенству с модулем:
`|t|<a iff -a<t<a`.
Аналогично, `|f(x)|<g(x) iff -g(x)<f(x)<g(x)`.
Решите неравенство:
а) `|2x^2-3x+1|<=3x-2x^2-1`;
б) `|3x-7|>=|1-4x|`;
в) `||x^2-8x+2|-x^2|>=2x+2`.
а) `|2x^2-3x-1|<=3x-2x^2-1 iff`
`iff |2x^2-3x+1|<=-(2x^2-3x+1) iff^**`
`iff 2x^2-3x+1<=0 iff (2x-1)(x-1)<=0 iff`
`iff 1/2 <=x<=1`.
`[1/2;1]`.
б) $$ \left|3x-7\right|\ge \left|1-4x\right|\stackrel{{12}^{○}}{\iff }{\left(3x-7\right)}^{2}\ge {\left(1-4x\right)}^{2}\iff $$
`iff (3-7)^2-(1-4x)^2>=0 iff`
`iff (3x-7-1+4x)(3x-7+1-4x)>=0 iff`
`iff (7x-8)(-6-x)>=0 iff -6<=x<=8/7`.
`[-6;8/7]`.
в) $$ \left|\left|{x}^{2}-8x+2\right|-{x}^{2}\right|\ge 2x+2\stackrel{{13}^{○}}{\iff }\left[\begin{array}{l}\left|{x}^{2}-8x+2\right|-{x}^{2}\ge 2x+2\\ \left|{x}^{2}-8x+2\right|-{x}^{2}\le -2x-2\end{array}\right.\iff $$
$$ \left[\begin{array}{l}\left|{x}^{2}-8x+2\right|\ge {x}^{2}+2x+2,\\ \left|{x}^{2}-8x+2\right|\le {x}^{2}-2x-2\end{array}\right.\stackrel{{13}^{○},{14}^{○}}{\iff }$$
$$ \stackrel{{13}^{○},{14}^{○}}{\iff }\left[\begin{array}{l}\left[\begin{array}{l}{x}^{2}-8x+2\ge {x}^{2}+2x+2,\\ {x}^{2}-8x+2\le -{x}^{2}-2x-2,\end{array}\right.\\ \left\{\begin{array}{l}{x}^{2}-8x+2\le {x}^{2}-2x-2,\\ {x}^{2}-8x+2\ge -{x}^{2}+2x+2\end{array}\right.\end{array}\right.\iff $$
$$\iff \left[\begin{array}{l}x\le 0,\\ {x}^{2}-3x+2\le 0,\\ \left\{\begin{array}{l}6x\ge 4,\\ {x}^{2}-5x\ge 0\end{array}\right.\end{array}\right.\iff \left[\begin{array}{l}x\le 0,\\ 1\le x\le 2\\ \left\{\begin{array}{l}x\ge 2/3,\\ \left[\begin{array}{l}x\ge 5,\\ x\le 0.\end{array}\right.\end{array}\right.\end{array}\right.\iff$$
$$ \iff\left[\begin{array}{l}x\le 0,\\ 1\le x\le 2,\\ x\ge 5.\end{array}\right.$$
`x in (-oo;0]uu[1;2]uu[5;+oo)`.
В некоторых случаях применение выше рассмотренных свойств нецелесообразно, и проще раскрыть модули по определению (рассмотрев знаки выражений под модулями).
Решите неравенство `6|x^2-3x-4|+1>5|x+5|`.
Решение проводится по той же схеме, что и в примере 2. Отмечаем на числовой прямой точки `x=4`, `x=-1` и `x=-5`, в которых подмодульные выражения равны нулю (рис. 9).
а) `x<=-5`. Здесь `x^2-3x-4>0`, `x+5<=0`, поэтому получаем
`6x^2-18x-24+1> -5x-25 iff 6x^2-13x+2>0 iff`
`iff (x-2)(6x-1)>0 iff x in (-oo;1/6)uu(2;+oo)`.
С учётом ограничения `x<= -5 : x in (-oo;-5]`.
б) `x in (-5;-1]uu(4;+oo)`. На этих двух промежутках `x^2-3x-4>=0`, `x+5>0`, поэтому получаем `6(x^2-3x-4)+1>5(x+5) iff 6x^2-23x-48>0 iff`
`iff (3x-16)(2x+3)>0 iff x in (-oo;-3/2)uu(16/3;+oo)`.
Учитывая рассматриваемые значения переменной, получаем
`x in (-5;-3/2)uu(16/3;+oo)`.
в) `x in (-1;4]`. Тогда `x^2-3x-4<=0`, `x+5>0` и неравенство принимает вид
`-6(x^2-3x-4)+1>5(x+5) iff 6x^2-13x<0 iff`
`iff 6x(x-13/6)<0 iff 0<x<13/6`.
Объединяя результаты, получаем
`x in (-oo;-3/2)uu(0;13/6)uu(16/3;+oo)`.
`x in (-oo;-3/2)uu(0;13/6)uu(16/3;+oo)`.
График квадратичной функции `y=ax^2+bx+c` (где `a!=0`) - парабола. Абсцисса вершины этой параболы задаётся формулой `x_B=-b/(2a)`. Если `a>0`, то ветви параболы направлены вверх, если `a<0` - вниз.
Если дискриминант квадратного трёхчлена положителен, то парабола пересекает ось абсцисс в двух точках (абсциссы этих точек - корни квадратного уравнения `ax^2+bx+c=0`); если дискриминант меньше нуля - то не имеет с осью абсцисс ни одной общей точки; если равен нулю - парабола имеет с осью абсцисс ровно одну общую точку (в этом случае говорят, что парабола касается оси абсцисс). В последнем случае квадратный трёхчлен имеет вид `a(x-x_0)^2`.
Постройте график функции `y=-2x^2+8x-5`.
Выделим полный квадрат:
`y=-2x^2+8x-5=-2(x^2-4x)-5=`
`=-2(x^2-4x+4-4)-5=-2(x-2)^2+8-5=`
`=-2(x-2)^2+3`.
График функции `y=-2(x-2)^2+3` - парабола, полученная из параболы `y=2x^2` с помощью симметрии относительно оси абсцисс, затем параллельного переноса на `2` единицы вправо вдоль оси абсцисс и, наконец, параллельного переноса на `3` единицы вверх вдоль оси ординат (см. рис. 10).
При помощи построения графика квадратичной функции можно решать квадратные неравенства.
Решите неравенство:
а) `x^2-x-2>0`;
б) `4x^2+4x+1<=0`;
в) `3x^2-2x+1>0`.
а) График квадратного трёхчлена `y=x^2-x-2` - парабола, её ветви направлены вверх (коэффициент при `x^2` положителен), абсциссы точек пересечения с осью `Ox:` `x_1=-1`, `x_2=2` (корни квадратного уравнения `x^2-x-2=0`). Все точки оси абсцисс, для которых парабола находится выше этой оси (т. е. решения данного неравенства), расположены вне промежутка между корнями `x_1` и `x_2`. Значит, множество решений данного неравенства - объединение открытых лучей:
`(-oo;-1)uu(2;+oo)`.
`x in (-oo;-1)uu(2;+oo)`.
б) `4x^2+4x+1<=0 iff (2x+1)^2<=0 iff 2x+1=0 iff x=-0,5`.
`x=-0,5`.
в) График квадратного трёхчлена `y=3x^2-2x+1` - парабола, её ветви направлены вверх (коэффициент при `x^2` положителен), она не пересекает ось абсцисс, т. к. уравнение `3x^2-2x+1=0` не имеет решений (его дискриминант отрицателен). Поэтому все точки параболы расположены выше оси `Ox`. Следовательно, данное неравенство истинно для всех `x`.
`x in RR`.
Заметим, что эти неравенства могли быть решены также с помощью метода интервалов, изложенного выше (см. §2).
Парабола `y=2016x^2-1941x-76` - пересекает ось абсцисс в точках `x_1` и `x_2`. Определите, где на этой прямой расположены точки `1`; `–1`; `–5` (т. е. вне промежутка между `x_1` и `x_2` или внутри него?).
Так как `a>0` и `c<0`, то `D>0` и данное уравнение имеет корни.
График функции `f(x)=2016x^2-1941x-76` - это парабола, ветви которой направлены вверх. Видно, что точка лежит в промежутке между корнями тогда и только тогда, когда `f(x)<0` и вне этого промежутка, если `f(x)>0` (см. рис. 11).
`f(1)=-1<0=>1 in (x_1;x_2)`;
`f(-1)=2016+1941-76>0=>1!in (x_1;x_2)`;
`f(-5)=2016*25+1941*5-76>0=>5!in (x_1;x_2)`.
Определите знаки коэффициентов квадратного трёхчлена `y=ax^2+bx+c`, график которого изображён на рис. 12.
1) Заметим, что `y(0)=c`, откуда `c>0`.
2) Ветви параболы направлены вниз `=>a<0`.
3) Ось симметрии параболы - это прямая `x_B=-b/(2a)`, по рисунку видно, что `-b/(2a)>0`, откуда `b>0`.
`a<0`, `b>0`, `c>0`.
Найти все значения `l`, при которых неравенство
`lx^2-2(l-6)x+3(l-2)<0`
верно для всех значений `x`.
Коэффициент при `x^2` зависит от `l` и равен `0` при `l= 0`. В этом случае данное неравенство не квадратное, а линейное: `12x-6<0`. Это неравенство неверно, например, при `x=1`, значит, при `l=0` данное неравенство не является верным для всех значений `x`.
Рассмотрим значения `l!=0`. Для них данное неравенство квадратное. Видно, что все числа являются его решениями только в одном случае: во-первых, если старший коэффициент отрицателен, (т. е. ветви параболы направлены вниз), и во-вторых, если дискриминант отрицателен, (т. е. парабола не пересекает ось абсцисс).
Получаем систему неравенств
$$\left\{\begin{array}{l}l<0,\\\frac D4=\left(l-6\right)^2-3l\left(l-2\right)<0\end{array}\right.\Leftrightarrow\left\{\begin{array}{l}l<0,\\-2l^2-6l+36<0\end{array}\right.\Leftrightarrow$$
$$\Leftrightarrow\left\{\begin{array}{l}l<0,\\\left(-2l+6\right)\left(l+6\right)<0\end{array}\right.\Leftrightarrow\left\{\begin{array}{l}l<0,\\l\in\left(-\infty;-6\right)\cup\left(3;+\infty\right)\end{array}\right.\Leftrightarrow l<-6.$$
Перейдём к графикам, содержащим знак модуля.
Постройте график функции:
а) `y=|x+3|`;
б) `y=4-|x|`;
в) `y=|4-2x|-1`;
г) `y=2|x+4|+|x-3|+2x-3|x+1|`;
д) `y=|||x|-3|-1|`.
а) Рассмотрим графики функций `f(x)=|x|` и `g(x)=|x+3|`. Заметим, что при подстановке значения `x_0` в функцию `f(x)` и значения `(x_0-3)` в функцию `g(x)` получается одно и то же число. Это означает, что если графику функции `y=f(x)` принадлежит точка с координатами `A(x_0;|x_0|)`, то графику функции `y=g(x)` принадлежит точка `B(x_0-3;|x_0|)`, расположенная на `3` единицы слева от точки `A`.
Таким образом, график функции `g(x)` получается из графика функции `f(x)` сдвигом на `3` единицы влево (рис. 13).
б) Рассмотрим функции `f(x)=-|x|` и `g(x)=4-|x|`. При любом `x` значение функции `g(x)` на `4` больше, чем значение функции `f(x)`, а это означает, что график функции `g(x)` получается из графика функции `f(x)` сдвигом на `4` единицы вверх (рис. 14).
в) `y=|4-2x|-1=|2x-4|-1=2|x-2|-1`.
Построим сначала график функции `y=|x|` (рис. 15а).
График функции `y=2|x|` получается из него «растяжением» в два раза (рис. 15б); график `y=2|x-2|` получается из предыдущего сдвигом на `2` единицы вправо (рис. 15в);
график `y=2|x-2|-1` получается из последнего сдвигом на единицу вниз (рис. 15г).
График функции `y=af(x-b)+c` получается из графика функции `y=f(x)` следующим образом.
1) Проводится «растяжение» в `|a|` раз; при этом если `a<0`, то график функции отражается относительно оси абсцисс.
2) График сдвигается на `|b|` влево (если `b<0`) или на `|b|` вправо (`b>0`).
3) График сдвигается на `|c|` вверх при `c>0` и на `|c|` вниз при `c<0`.
г) Отметим на числовой прямой точки, в которых выражения, стоящие под знаком модуля, обращаются в ноль (рис. 16а). Эти три точки делят числовую прямую на четыре части, причём на каждой из частей знаки выражений, стоящих под модулями, не меняются.
Возможны 4 случая.
1) `ul(x<=-4)`. Тогда `x+4<=0`, `x-3<0`, `x+1<0`, поэтому
`y=2*(-x-4)-(x-3)+2x+3(x+1)=2x-2`.
Получаем луч (часть прямой `y=2x-2`, лежащую слева от прямой `x=-4`).
2) `ul(-4<x<=-1)`. Тогда `x+4>0`, `x-3<0`, `x+1<=0`, поэтому
`y=2(x+4)-(x-3)+2x+3(x+1)=6x+14`.
Получаем отрезок (часть прямой `y=6x+14`, лежащая между прямыми `x=-4` и `x=-1`).
3) `ul(-1<x<=3)`. Тогда `x+4>0`, `x-3<=0`, `x+1>0`, поэтому
`y=2(x+4)-(x-3)+2x-3(x+1)=8`.
Получаем отрезок (часть прямой `y=8`, заключённая между прямыми `x=-1` и `x=3`).
4) `ul(x>3)`. Тогда `x+4>0`, `x-3>0`, `x+1>0`, поэтому
`y=2(x+4)+(x-3)+2x-3(x+1)=2x+2`.
Получаем луч (часть прямой `y=2x+2`, находящуюся справа от прямой `x=3`). График см. на рис. 16б.
Укажем второй способ построения. На каждом из четырёх участков `(-oo;-4]`, `[-4;-1]`, `[-1;3]`, `[3;+oo)` после раскрытия модулей получим линейную функцию, графиком которой является прямая. Чтобы построить прямую, достаточно знать две её точки. Отсюда вытекает следующий способ построения. Вычислим значения функции в точках `x=-4`, `x=-1` и `x=3`, а также в каких-либо точках, лежащих на промежутках `(-oo;-4)` и `(3;+oo)`, например, `x=-5` и `x=4`. Получаем пять точек, принадлежащих графику:
`A(-4;-10)`, `B(-1;8)`, `C(3;8)`, `D(-5;-12)`, `E(4;10)`.
Проводим отрезки `AB` и `BC`, лучи `AD` и `CE` и получаем график.
д) Построим сначала график функции `f_1(x)=|x|-3` (рис. 17а).
График `f_2(x)=||x|-3|` получается из графика функции `f_1(x)` так: точки, лежащие выше оси `Ox` и на оси `Ox` сохраняются, а все точки, лежащие ниже оси `Ox`, отражаются относительно оси `Ox` в верхнюю полуплоскость (рис. 17б). Действительно, если `f_1(x)>=0`, то `f_2(x)=|f_1(x)|=f_1(x)`, а если `f_1(x)<0`, то `f_2(x)=|f_1(x)|=-f_1(x)`. Таким образом, если при некотором `x` оказалось, что `f_1(x)>=0`, то точки на графике для `f_1(x)` и `f_2(x)` совпадают. Если же `f_1(x)<0`, то для `y=f_2(x)` абсцисса точки не поменяется, а ордината сменит знак. График функции `f_3(x)=||x|-3|-1` получается из графика функции `f_2(x)` сдвигом на единицу вниз (рис. 17в).
График функции `f_4(x)=|||x|-3|-1|` получается из `f_3(x)` отражением всех точек, лежащих ниже оси `Ox`, относительно оси `Ox` наверх (рис. 17 г).
График функции `y=|f(x)|` получается из графика функции `y=f(x)` следующим образом. Все точки, лежащие выше оси `Ox` и на оси `Ox`, сохраняются, а все точки, лежащие ниже оси `Ox`, отражаются относительно оси `Ox` и попадают в верхнюю полуплоскость.
Постройте график функции:
а) `y=x^2-4x+3`,
б) `y=|x^2-4x+3|`,
в) `y=x^2-4|x|+3`,
г) `y=|x^2-4|x|+3|`.
а) `x^2-4x+3=x^2-4x+4-1=(x-2)^2-1`.
График функции `y=x^2-4x+3` получается из графика функции `y=x^2` сдвигом на `2` вправо и на `1` вниз (рис. 18а).
б) Отразим все точки графика пункта а), лежащие ниже оси абсцисс, относительно этой оси (рис. 18б).
в) Заметим, что функция `f(x)=x^2-4|x|+3` чётная (т. е. удовлетворяет условию `f(-x)=f(x)`), поэтому её график симметричен относительно оси ординат. Кроме того, при `x>=0` этот график совпадает с графиком функции `f(x)=x^2-4x+3`.
Отсюда вытекает следующий способ построения. От графика функции `y=x^2-4x+3` оставим точки, лежащие справа от оси `Oy`, отразим их симметрично относительно этой оси, а точки, лежащие слева от оси `Oy`, отбросим (рис. 18в).
График функции `y=f(|x|)` получается из графика функции `y=f(x)` следующим образом. Отбрасываем все точки, лежащие слева от оси `Oy`, а оставшиеся точки отражаем относительно оси `Oy`.
г) Есть 2 способа построения.
(1) Все точки графика из пункта (в), лежащие ниже оси абсцисс, отражаем относительно этой оси.
(2) От графика пункта (б) отбрасываем точки, лежащие слева от оси ординат; все точки, находящиеся справа от оси ординат, отражаем относительно неё. Разумеется, в обоих случаях получается одинаковый результат (рис. 18г).
Теперь рассмотрим график функции `y=(ax+b)/(cx+d)`; при этом считаем, что
1) `c!=0` - т. к. иначе получится линейная функция – и
2) коэффициенты в числителе и в знаменателе не пропорциональны друг другу, т. е. `ad!=bc`. (Если `ad=bc`, то `b=(ad)/c` и получаем
`(ax+b)/(cx+d)=(ax+(ad)/c)/(cx+d)=(a/c(cx+d))/(cx+d)=a/c` при `cx+d!=0`).
Покажем на примере, как этот график может быть построен.
Постройте график функции:
а) `y=6/(2x+3)`;
б) `y=(6-3x)/(2x+1)`.
а) `y=3/(x+3//2)`. Это график получается из гиперболы `y=3/x` параллельным переносом на `3/2` влево (см. рис. 19). Асимптотами этой гиперболы являются прямые `x=-3/2` и `y=0`. (У каждой гиперболы есть две асимптоты. Горизонтальная асимптота `y=bbb"const"` - это та прямая, к которой график приближается при `x`, стремящемся к бесконечности. Вертикальная асимптота `x=bbb"const"` возникает при том значении `x`, где знаменатель дроби обращается в ноль. При `x`, приближающемся к данной точке, функция стремится к бесконечности).
б) Отношение коэффициентов при `x` в числителе и знаменателе дроби равно `(-3/2)`.
Преобразуем данную дробь, добавляя и вычитая `(-3/2)`:
`y=-3/2+((6-3x)/(2x+1)+3/2)`.
Дроби в скобках приводим к общему знаменателю:
`y=-3/2+(12-6x+6x+3)/(2(2x+1)) iff y=-3/2+15/(4x+2) iff`
`iff y=-3/2+(15//4)/(x+1//2)`.
Этот график получается из графика `y=(15//4)/x` параллельным переносом на `3/2` вниз и на `1/2` влево (рис. 20).
Ввести значения $$ x$$ и $$ n$$. Вычислить сумму ряда $$ 1+x+{x}^{2}+{x}^{3}+\dots +{x}^{n}$$.
Сумма вычисляется накопительным путём: сначала вычисляется каждое слагаемое, а потом оно добавляется в сумму. Каждое слагаемое также вычисляется накопительным путём.
var x,n,i,s,a:integer;
begin
write('введите значения x и n');
readln(x,n);
S:=1; a:=1
for i:=1 to n do
begin
a:=a*x; s:=s+a
end;
writeln(s);
readln
end.
Заметим, что эту задачу можно решить, воспользовавшись формулой суммы первых `n` членов геометрической прогрессии, но наша цель не решить конкретную задачу, а понять принцип накапливания (суммы). Ибо далеко не любая последовательность чисел является геометрической или арифметической прогрессией.
Вводится последовательность натуральных чисел. Признак конца ввода – число `0`. Вывести среднее арифметическое чисел из последовательности (`0` не учитывается).
Эта задача относится к очень важному классу задач – обработка последовательностей с признаком конца и заранее неизвестным количеством элементов. В таких задачах нужно пользоваться операторами while и repeat. Причём, если оговаривается, что последовательность непустая, можно использовать repeat, а если этого не оговаривается, как в данной задаче, то нужно обязательно пользоваться циклом while, так как цикл repeat всегда выполняется, по крайней мере, один раз. Приведём полный текст решения. Переменная `s` подсчитывает сумму элементов последовательности, а переменная `k` – их количество.
var a,s,k:integer;
begin
s:=0; k:=0;
writeln('Введите последовательность натуральных чисел. Ноль – признак конца');
read(a);
while a<>0 do
begin s:=s+a; k:=k+1; read(a) end;
Writeln('среднее арифметическое=',s/k:0:4)
end.
Обратите внимание, что для ввода данных используется оператор read. Это позволяет набивать элементы в строчку через пробел. Если же использовать readln, то набивать значения придётся в столбик, что неудобно. Ещё одно важное замечание в этой задаче – оператор ввода внутри цикла должен быть последним, чтобы сразу попадать на проверку признака конца. Эти замечания относятся ко ВСЕМ задачам на обработку последовательностей с признаком конца.
Ввести целое число `n`. Вывести YES, если оно простое, и NO, если оно составное.
Эта задача демонстрирует сразу две важные вещи. Во-первых, как проверять делимость целых чисел, а во-вторых, технику флажков. Флажком называется переменная, которая имеет некоторое начальное значение и меняет его, если происходит определённое событие. Как правило, флажок имеет тип boolean.
В нашей задаче мы будем перебирать числа от `2` до квадратного корня из `n` и проверять, делится ли `n` на каждое из них. Изначально предположим, что `n` – простое, и присвоим флажку значение true, но если `n` поделится на какое-нибудь число, это будет значить, что оно составное, и, соответственно, флажок «упадёт» на значение false. Проверять на делимость нужно, сравнивая остаток от деления с нулём.
var n,i:integer;
f:boolean;
begin
Write('Введите значение n ');
Readln(n);
f:=true;
for i:=2 to round(sqrt(n)) do
if n mod i = 0 then f:=false else;
if f=true
then writeln('YES')
else writeln('NO');
Readln
end.
Зачастую в задаче нужно повторять одни и те же действия много раз. Повтор некоторого фрагмента программы несколько раз называется циклом. Рассмотрим следующий пример.
Вывести на экран квадраты чисел от `1` до `100`.
Очевидно, что для решения этой задачи нам придётся `100` раз выполнять команду вывода соответствующего числа на экран. Писать `100` операторов вывода как-то не хочется (слишком трудоёмко), поэтому будем знакомиться с операторами цикла. В языке Pascal существует три оператора цикла: for, while, repeat. Начнём с цикла for. Этот оператор цикла реализует следующую идею: «Повторять некоторую последовательность команд `N` раз, где `N` известно до начала повторения». Познакомимся с синтаксисом этого оператора.
for имя переменной := начальное значение to конечное значение do оператор
В этой конструкции переменная, стоящая после слова for, называется параметром или счётчиком цикла, а оператор, стоящий после слова do, называется телом цикла. Начальное и конечное значения, по сути, являются константами или выражениями одного типа со счётчиком.
Алгоритм выполнения цикла for следующий:
1) вычисляются начальное и конечное значения;
2) счётчику цикла присваивается начальное значение;
3) значение счётчика сравнивается с конечным. Если оно больше конечного, то выполнение цикла завершается и начинает выполняться следующий оператор программы, в противном случае переход к пункту 4;
4) выполняется тело цикла;
5) значение счётчика увеличивается на `1`;
6) переход к пункту 3.
В качестве примера рассмотрим решение задачи, поставленной выше. В качестве счётчика будем использовать переменную `i`.
var i:integer;
begin
for i:=1 to 100 do write(i*i,' ');
Readln
end.
Согласитесь, что решение фактически в одну строчку выглядит гораздо приятнее, чем в `100` строк (если не пользоваться оператором цикла).
Необходимо сделать несколько замечаний по поводу цикла for.
1) Типы счётчика начального и конечного значений должны совпадать, при этом в настоящий момент из известных нам типов можно использовать только integer и boolean. Вещественный тип использовать нельзя.
2) Начальное и конечное значения вычисляются один раз до начала цикла (и после не перевычисляются). Рассмотрим пример.
i:=1; for i:=i to i do writeln('HI');
Этот оператор цикла выполнится всего один раз, а не бесконечно много.
3) В теле цикла значение счётчика изменять нельзя. Так прописано в стандарте языка Pascal, и это требование поддерживается в системах семейства Delphi. Однако в системах семейства Borland Pascal значение счётчика изменять можно, что может приводить к непредсказуемым последствиям (поэтому будем считать, что независимо от системы значение счётчика изменять нельзя).
4) После завершения цикла значение счётчика не определено, то есть нельзя считать, что оно равно конечному значению или больше на единицу и пользоваться этим в дальнейшем алгоритме.
5) Тело цикла по грамматике должно состоять только из `1` оператора. Если же там по алгоритму должно быть несколько, нужно использовать составной оператор.
6) Можно слово to заменить на слово downto. В этом случае значение счётчика после каждого выполнения тела цикла будет уменьшаться на `1`, а выход из цикла произойдёт, когда значение счётчика окажется меньше, чем конечное.
Перейдём к знакомству с другими операторами цикла: while и repeat. Эти операторы реализуют следующие идеи: «Повторять некоторую последовательность команд пока выполняется некоторое условие» (цикл while) и «Повторять некоторую последовательность команд до тех пор, пока не выполнится некоторое условие» (цикл repeat). Познакомимся с синтаксисом оператора цикла while.
while условие do оператор.
После слова while должно быть логическое выражение (называемое условием), которое может принимать значение true или false. Оператор, стоящий после do, аналогично оператору for является телом цикла. Выполняется цикл while так:
1) вычисляется значение условия, если получилось true, то переход к пункту 2, иначе выход из цикла и переход на следующий оператор программы;
2) выполняется тело цикла;
3) переход к пункту 1.
Фактически оператор while является многократным применением оператора if с пустой веткой else. Аналогично оператору for, тело цикла должно состоять из `1` оператора. Однако в отличие от цикла for возможна ситуация, когда цикл будет выполняться бесконечное количество раз (зациклится). Например, while 2*2=4 do...
Что написать после do, совершенно не важно, важно, что оно будет выполняться, пока 2*2=4, а это всегда так и никогда не изменится.
Значит, чтобы избегать зацикливания, параметры условия должны быть переменными, например while x*x=4 do ... Хотя это тоже не гарантирует отсутствие зацикливания.
Осталось познакомиться с последним оператором цикла. Рассмотрим его синтаксис.
repeat
Оператор 1;
Оператор 2;
....
Оператор N
until условие
Все операторы, написанные между repeat и until, являются телом цикла. Это выгодно отличает оператор repeat от других циклов – составной оператор здесь не требуется, а операторными скобками можно считать слова repeat и until. Работает этот оператор по следующему алгоритму:
1) выполняется тело цикла;
2) вычисляется значение условия. Если получилось true, то выход из цикла и переход к следующему оператору программы, в противном случае переход к пункту 1.
Отличительная особенность оператора цикла repeat заключается в том, что тело всегда выполняется, по крайней мере, один раз. Это нужно учитывать в задачах при выборе оператора цикла. Аналогично оператору while, цикл repeat может зациклиться, правда в случае, когда условие никогда не принимает значение true, например,
repeat...until 2*2=5.
В рассматриваемых ранее задачах процесс вычисления был линейным, то есть программа не должна была выполнять разные действия в зависимости от того, какие данные ей ввели. Теперь вспомним задачи с ветвящимся алгоритмом.
Ввести номер года. Вывести слово YES, если год високосный, и NO, если он – не високосный.
По условию очевидно, что в зависимости от входных данных программа должна будет выполнить один из двух операторов вывода: Writeln('YES') или Writeln('NO'). При этом написать в программе нам придётся оба, а вот выполняться должен будет только один из них. Для того чтобы реализовывать подобные ветвления алгоритма, в языке Pascal существует условный оператор. В общем виде он выглядит следующим образом:
if логическое выражение
then оператор
else оператор
В этой конструкции слова if, then и else являются служебными зарезервированными словами языка. Работает эта конструкция так: сначала вычисляется логическое выражение, стоящее после if. Если получилось значение true, то выполняется оператор, стоящий после слова then, а если получилось значение false, то выполняется оператор, стоящий после слова else.
Обратите внимание, что внутри условного оператора нет никаких точек с запятой, поскольку он является единой конструкцией, а точка с запятой – это разделитель между операторами. Для удобства чтения программ принято условие записывать на одной строке, а ветви then и else начинать с новой строки, однако это не является синтаксическим правилом языка.
В качестве примера условного оператора рассмотрим решение задачи, поставленной выше. Год считается високосным, если он делится нацело на `400`, или если он делится нацело на `4`, но не делится нацело на `100`. Приведём полный текст решения:
var y:integer;
begin
write('Введите номер года ');
readln(y);
if (y mod 400 = 0)or(y mod 4 = 0)and(y mod 100 <> 0)
then writeln('YES')
else writeln('NO');
end.
По грамматике языка после слов then и else должен стоять только один оператор языка. То есть запись if x>0 then x:=4; y:=0 else z:=9; является синтаксически неверной. А как быть, если всё-таки нужно выполнить более одного оператора? Для таких случаев в языке Pascal предусмотрен составной оператор, который позволяет превратить группу операторов в один. Выглядит он следующим образом: сначала записывается ключевое слово begin, далее – интересующая нас последовательность операторов через точку с запятой, а в конце пишется ключевое слово end. В отличие от конца программы, точка после этого слова не ставится. Слова begin и end называются операторными скобками. Запишем правильную версию условного оператора, приведённого выше: if x>0 then begin x:=4; y:=0 end else z:=9;
Обратите внимание на следующий тонкий момент: если требуется выполнить более одного оператора в ветке then, и при этом мы забудем написать операторные скобки, то это является синтаксической ошибкой, и программа просто не будет работать. Если же забыть написать операторные скобки в ветке else, то программа работать будет, но не так, как предполагалось. Рассмотрим пример: if x>0 then y:=9 else z:=8; c:=5;
В этом примере условный оператор заканчивается после z:=8; в то время как оператор c:=5; является следующим оператором программы и выполняется независимо от результата сравнения `x` с нулём. Если же написать операторные скобки, то присваивание в `c` числа `5` произойдёт только в случае x<=0.
Последнее замечание заключается в том, что в ветке else в качестве оператора может стоять и пустой оператор.
Рассмотрим следующий пример.
Вводятся `3` целых числа – `a`,`b`,`c`. Требуется в переменную `a` записать минимальное из этих чисел, в `b` – среднее и в `c` – максимальное.
Алгоритм решения этой задачи такой: сначала сравним значения переменных `a` и `b`, если значение `a` – больше, поменяем их местами. После этого сравним значения переменных `a` и `c`, и если значение `a` – больше, поменяем их местами. После этих двух сравнений в переменной `a` гарантированно окажется наименьшее из трёх чисел. Осталось сравнить переменные `b` и `c`, и в случае, когда в переменной `b` находится большее значение, поменять их местами.
Очевидно, что в этом алгоритме у нас три сравнения, следовательно, три последовательных условных оператора. При этом в каждом из них какие-то действия (поменять местами значения двух переменных) нужно выполнять только в ветке then, в ветке else (например, если в первом сравнении в переменной a находится уже более маленькое число, чем в переменной `b`) никаких действий выполнять не нужно. Но мы всё равно будем её записывать, чтобы избегать путаницы. Приведём полный текст решения, используя для обмена значений двух переменных дополнительную переменную `x`.
var a,b,c,x:integer;
begin
writeln('введите три целых числа ');
readln(a,b,c);
if a>b then begin x:=a; a:=b; b:=x end
else;
if a>c then begin x:=a; a:=c; c:=x end
else;
if b>c then begin x:=b; b:=c; c:=x end
else;
writeln(a,b,c);
end.
В языке Pascal кроме уже изученных нами числовых типов ещё есть логический, который называется Boolean. Переменные этого типа занимают `1` байт оперативной памяти и могут принимать всего два значения – true и false (истина и ложь). Логическим переменным можно присваивать значения точно так же, как и числовым. Так же можно выводить их значения на экран, а вот вводить их с клавиатуры нельзя!
В языке Pascal определены `6` операций сравнения, результатом которых является логическое значение. Это операции: «больше» (>), «больше или равно» (>=), «меньше» (<), «меньше или равно» (<=), «равно» (=), и «не равно» (<>). Например, операция 5 > 2 выдаст значение true, а операция x<>3 выдаст значение true, если переменная `X` имеет любое значение, кроме `3`. Сравнивать можно не только числа (причём как целые, так и вещественные), но и логические значения. При этом считается, что значение true больше, чем значение false.
Помимо операций сравнения ещё существуют и логические операции: AND (конъюнкция, логическое умножение, операция «И»), OR (дизъюнкция, логическое сложение, операция «ИЛИ»), NOT (отрицание, инверсия), XOR (строгая дизъюнкция, исключающее «ИЛИ», сложение по модулю `2`). В скобках указаны возможные названия данных операций в алгебре логики. Операнды этих операций должны быть логического типа. Результат вычислений также будет логический. При этом операции AND, OR, XOR имеют по два операнда, а операция NOT – всего один, который записывается справа от названия операции. Названия логических операций являются ключевыми словами языка. Приведём таблицы результатов логических операций для всех возможных значений операндов (в алгебре логики такие таблицы называются таблицами истинности):
x | not x |
false |
true |
true |
false |
x |
y | x and y |
x or y |
x xor y |
false | false | false | false | false |
false | true | false | true | true |
true | false | false | true | true |
true | true | true | true | false |
Логический результат даёт также стандартная функция odd(x), которая применяется к целочисленному аргументу `x`:
odd(x) = true, если `x` нечётно;
odd(x) = false, если `x` чётно.
Приоритет операций в логическом выражении следующий:
1) Операция NOT.
2) Операции группы умножения AND, *, / ,div, mod
3) Операции группы сложения OR, XOR, +, -
4) Операции сравнения >, <, >=, <=, =, <>
Операции одного приоритета выполняются слева направо. Операции в круглых скобках имеют более высокий приоритет, чем операции вне скобок.
Записать логическое выражение, истинное в случае, когда переменная `X` имеет значение из отрезков `[2,5]` или `[-1,1]`.
(X>=2) AND (X<=5) OR (abs(X)<=1).
Теперь воспользуемся всеми полученными знаниями и рассмотрим примеры простейших программ. Условимся в примерах не различать заглавные и строчные буквы, а ключевые слова выделять жирным шрифтом.
Ввести координаты трёх вершин треугольника. Вывести его площадь. Гарантируется, что треугольник существует (ввод корректный).
Для решения этой задачи нам потребуется `6` переменных, в которые будут введены значения координат `(x1, y1, x2, y2, x3, y3)`. Можно сделать их целыми для простоты, а можно вещественными, чтобы решать задачу в более общем случае. Так же потребуются переменные, в которые мы запишем длины сторон треугольника `(a, b, c)` и площадь `(S)`. Эти переменные однозначно должны быть вещественными, так как при вычислении расстояния между точками нам придётся извлекать квадратный корень, и, соответственно, результат получится вещественным. И ещё предлагается ввести вещественную переменную `p`, в которой будет храниться полупериметр треугольника, так как площадь будет вычисляться по формуле Герона. Приведём полный текст программы:
Var x1,y1,x2,y2,x3,y3:integer; a,b,c,p,S:real;
Begin
Write('Введите координаты вершин треугольника ');
Readln(x1,y1,x2,y2,x3,y3);
a:=sqrt(sqr(x1-x2)+sqr(y1-y2));
b:=sqrt(sqr(x1-x3)+sqr(y1-y3));
c:=sqrt(sqr(x2-x3)+sqr(y2-y3));
p:=(a+b+c)/2;
S:=sqrt(p*(p-a)*(p-b)*(p-c));
Writeln('Площадь треугольника равна ',S:5:2);
Readln;
End.
Идёт `k`-ая секунда суток (`k` вводится). Вывести, сколько полных часов `h` и полных минут `m` прошло с начала суток.
В этой задаче все параметры целые. Решается она с помощью операций div и mod. Эти операции можно использовать для «срезания периодов» при переводе мелких единиц измерения в более крупные (например, секунд в минуты). Операция div нам выдаст количество полных периодов (сколько полных минут содержится в большом количестве секунд), а операция mod – количество единиц в последнем неполном периоде (сколько секунд не укладывается в полное количество минут). Приведём полный текст решения.
Var k,h,m:integer;
Begin
Write('Введите номер секунды в сутках');
Readln(k);
h:=k div 3600;
m:=k mod 3600 div 60;
writeln('С начала суток прошло ',h,' часов и ',m,' минут');
readln;
end.
Вводится четырёхзначное число. Вывести произведение его цифр.
Эта задача показывает ещё одно применение операций div и mod – выделение цифр из целого числа. Описанное ниже решение работает только для случая, когда количество цифр в числе заранее известно. В противном случае придётся использовать циклический алгоритм. Приведём текст решения.
Var N,c1,c2,c3,c4:integer;
Begin
Write('Введите целое четырёхзначное число');
Readln(N);
c1:=N div 1000;
c2:=N div 100 mod 10;
c3:=N div 10 mod 10;
c4:=N mod 10;
Writeln('Произведение цифр вашего числа равно',c1*c2*c3*c4);
Readln;
End.
Операторы read и readln предназначены для задания значений переменным путём ввода их с клавиатуры. Правило их применения одно и то же: после слова read или readln в скобках через запятую перечисляются имена переменных, значения которых мы хотим ввести (список ввода). Число этих имён не ограничено. Запятая служит разделителем между именами переменных:
readln(имя, имя, ..., имя)
При срабатывании оператора read или readln выполнение программы будет приостановлено до тех пор, пока пользователь не введёт соответствующее количество значений. Вводимые значения должны быть того же типа, что и переменные. Если в read или readln переменных несколько, то они могут быть набиты в одной строке, но одно число от другого должно отделяться пробелом или переводом строки.
Чтобы выполнить оператор read или readln после набивания значений с клавиатуры, нужно нажать клавишу «Enter». В результате переменные приобретут заданные вами значения. Между read и readln существует единственное различие: после выполнения readln курсор переходит на новую строку, игнорируя всю оставшуюся информацию в прежней строке, а после выполнения read курсор остаётся в той же строке, и новая набивка данных для read или readln будет проходить в той же строке. Но, так как после нажатия клавиши «Enter» курсор в любом случае переходит на новую строчку, для однократного ввода значений переменных разницу между операторами read и readln заметить невозможно. Тем не менее, в данном случае лучше использовать readln. Оператор readln можно использовать и без параметров вообще. Тогда программа просто будет находиться в режиме ожидания, пока пользователь не нажмёт клавишу «Enter». Такой оператор, например, удобно ставить самым последним оператором в программе. Тогда можно сразу посмотреть результат работы программы, а потом нажать «Enter», и только тогда работа программы завершится.
Перед вводом данных с клавиатуры рекомендуется выдавать на экран приглашение, например:
write('Введите число a => ');
readln(a);
Операторы вывода являются важнейшей частью языка программмирования, ведь только благодаря им, мы можем увидеть на экране компьютера результат работы нашей программы. В языке Pascal существует два оператора вывода: write и writeln. Правило их использования одно и то же: после слова write или writeln в скобках через запятую перечисляются параметры, которые мы хотим вывести (называемые списком вывода). Число этих параметров не ограничено. Разделителем между параметрами служит запятая:
writeln(параметр, параметр,...,параметр)
Существует три вида параметров: константы, переменные и выражения (например, арифметические выражения). Константы бывают числовые (это просто различные числа — целые и вещественные), логические и строковые. Любой текст, набранный с клавиатуры и заключённый в апострофы (одиночные кавычки), называется строковой константой. Если в текст нам нужно поместить апостроф, например, в слове O'key, на этом месте нужно набить два апострофа подряд вместо одного: write('O''key'). Все параметры в write или writeln независимы друг от друга, поэтому в одном и том же операторе могут встречаться параметры разных типов, в произвольном порядке.
При выполнении оператора вывода все параметры будут выведены в одной строке в том же порядке, в каком они перечислены в списке параметров. Любая константа, числовая или строковая, будет выведена так, как вы её написали в вызове write или writeln (в строковой константе начальный и конечный апострофы отображаться на экране не будут, а вместо двух апострофов, расположенных в строковой константе подряд, на экране появится в этом месте один); вместо переменной на экране появится её значение, а вместо арифметического выражения — результат его вычисления.
Между write и writeln существует единственное различие: после выполнения writeln курсор переходит на новую строку, а после выполнения write курсор остаётся в той же строке, и новый вывод данных с помощью write или writeln или ввод данных при помощи операторов ввода данных будут проходить в той же строке.
При выводе параметров пробелы между ними автоматически не вставляются, например, при печати чисел 1, 2, 3 с помощью writeln(1,2,3) все они сольются в одно число — 123. Чтобы разделить выводимые элементы, можно поместить между ними символ пробела, например, writeln(1,' ',2,' ',3) или отформатировать вывод, поставив после каждого элемента списка вывода двоеточие и целое число (называемое модификатором ширины поля), которое указывает, сколько позиций на экране должна занимать выводимая величина, например, writeln(1:3,2:3,3:3). Отметим, что элемент дополняется начальными пробелами слева с тем, чтобы соответствовать указанной после двоеточия величине. Результаты выполнения двух последних операторов будут выглядеть так:
1_2_3 __1__2__3 |
Если указанное в модификаторе ширины поля число меньше, чем необходимо, то модификатор ширины поля игнорируется.
При выдаче на экран значений вещественных выражений в формате вывода полезно использовать ещё один модификатор, который записывается через двоеточие после модификатора ширины поля и называется модификатором точности. Он будет обозначать количество символов после десятичной точки, которые мы хотим вывести. Например, при выводе результата стандартной функции pi, которая с машинной точностью выдаёт значение числа $$ \pi $$, оператор write(pi:0:0,pi:6:2, pi/2:2:0) выдаст на экран:
3 3.14 2
Заметим, что при печати фиксированного количества цифр вещественного числа оно предварительно округляется по правилам математики. Если вещественное число содержит после десятичной точки меньше цифр, чем количество символов для печати, указанное в модификаторе точности, то число выводится с незначащими нулями, например, оператор write(3.14:3:4) выдаст на экран:
3.1400
Модификатор точности можно применять только к параметрам вещественного типа. Использование модификатора точности с параметрами других типов является критической ошибкой (программа не будет работать). Модификатор ширины поля можно использовать с любым типом параметра вывода.
Арифметические выражения состоят из операций и операндов. В языке программирования Pascal существует шесть операций: сложение (обозначается знаком «+»), вычитание (обозначается знаком «-»), умножение (обозначается знаком «*»), деление (обозначается знаком «/»), деление нацело (обозначается словом «div») и взятие остатка от деления нацело (обозначается словом «mod»). Слова div и mod являются служебными зарезервированными.
Важным понятием в арифметике является понятие операнда. Операндами называются те объекты, над которыми выполняется арифметическая операция. В математике различные операции могут иметь разное количество операндов, но все арифметические имеют два операнда. Операндом для операции может являться как одиночное число или имя переменной, так и целое арифметическое выражение. Рассмотрим выражение (2+2)*2. У операции сложения операндами являются два числа `2`, а у операции умножения правый операнд – это число `2`, а левый – это выражение в скобках `(2+2)`. Прежде чем выполнять операцию, необходимо вычислить оба её операнда.
Приоритет операций в Паскале точно такой же, как и в математике. Сначала выполняются операции умножения, деления, div и mod (это тоже операции деления), а потом операции сложения и вычитания. Операции одного приоритета выполняются слева направо. Для изменения порядка действий можно использовать круглые скобки. Операции в скобках имеют более высокий приоритет, чем операции вне скобок. Так при вычислении выражения 2+2*2 получается число `6`, потому что операция умножения имеет более высокий приоритет, чем сложение, и, следовательно, выполняется первой. Если же записать выражение (2+2)*2, то при вычислении получается число `8`, потому что сложение в скобках выполняется раньше умножения.
Рассмотрим, как определить тип результата при вычислении арифметического выражения. Операции сложения, вычитания и умножения выдают целый результат, если оба их операнда целые, и вещественный, если хотя бы один из операндов – вещественный. Операция деления «/» всегда выдаёт вещественный результат. Даже если мы `4` делили на `2`, всё равно в итоге получается нецелое число. На первый взгляд это кажется странным, но в отличие от математики в программировании каждое число кроме значения ещё имеет тип, и если типы у чисел не совпадают, то они НЕ считаются равными. Нужно уяснить, что `bb(1!=1.0)`. Это несложно понять, если помнить, что раз числа `1` и `1.0` имеют различные типы, то будут представлены совершенно разными последовательностями битов. Операции div и mod всегда выдают целый результат и, в отличие от всех остальных арифметических операций, могут иметь только целые операнды. Попытка применить данные операции к вещественным числам приведёт к тому, что программа просто не будет работать.
Давайте подробнее познакомимся с двумя последними операциями. Операция a div b выдаёт целую часть от деления числа a на число b. То есть 5 div 2 = 2, а 3 div 7 = 0. Операция a mod b выдаёт остаток от деления a на b по следующему закону:
a mod b = a – ((a div b) * b)
Приведём примеры выполнения этих их операций для всех возможных знаков операндов:
5 div 3 = 1; 5 mod 3 = 2;
-5 div 3 = -1; -5 mod 3 = -2;
5 div -3 = -1; 5 mod -3 = 2;
-5 div -3 = 1; -5 mod -3 = -2;
Операндами в арифметическом выражении также могут быть стандартные математические функции, которые приведены в таблице ниже.
Функция | Комментарий | Тип аргумента | Тип результата |
abs(x) | $$ │x│$$ — модуль $$ x$$ | integer, real | совпадает с типом аргумента |
sqr(x) | $$ {x}^{2}$$ | integer, real | совпадает с типом aргумента |
sqrt(x) | `sqrt x` |
integer, real | real |
Pi | `3.1415926535897932385` | нет | real |
sin(x) | $$ \mathrm{sin}x$$ | integer, real | real |
cos(x) | $$ \mathrm{cos}x$$ | integer, real | real |
arctan(x) | `"arctg"x` | integer, real | real |
trunc(x) | отсекание дробной части $$ x$$ | real | integer |
round(x) | округление $$ x$$ до ближайшего целого. Половины округляются в сторону увеличения модуля. | real | integer |
Необходимо отметить, что функциям sin и cos угол следует подавать в радианах, а не в градусах! Также функция arctan возвращает результат в радианах.
Рассмотрим два основных числовых типа переменных.
Этот тип характеризует целые числа. Переменные этого типа занимают в оперативной памяти `4` байта и могут принимать значения из диапазона
`[ –2147483648, 2147483647]`.
Точное значение запоминать необязательно, главное помнить, что переменная этого типа может вмещать целые числа примерно до `2` миллиардов по модулю.
Этот тип предназначен для работы с вещественными (действительными) числами. Переменные этого типа занимают в оперативной памяти `8` байт. При записи констант этого типа целая часть числа отделяется от дробной точкой, а не запятой, как в математике, например: `3.14`.
Оператор присваивания позволяет изменить значение любой переменной программы (присвоить ей новое значение). Этот оператор выглядит следующим образом: записывается имя переменной, затем знак присваивания (:=), а потом значение, которое мы хотим присвоить переменной. Присвоить можно константу или выражение соответствующего типа.
X:=5; {в переменную `X` присвоили число `5`}
Y:=X; {в переменную `Y` присвоили текущее значение переменной `X`}
Z:=X+Y; {в переменную `Z` присвоили сумму текущих значений переменных `X` и `Y`}
Если переменной присвоено некоторое значение, то в дальнейшем в программе при вычислениях вместо её имени будет подставляться это значение, пока мы не присвоим ей новое.
X:=5;
Y:=X+4; {в переменную `Y` запишется число `9`, так как текущее значение переменной `X` равно `5`}
При использовании операторов присваивания необходимо соблюдать правило совместимости типов.
Это правило заключается в том, что тип присваемого значения должен соответствовать типу переменной, которой мы хотим это значение присвоить.
Есть исключение из этого правила:
переменной типа real можно присвоить целое значение.
Познакомимся с двумя важнейшими в программировании понятиями.
Константой назывется объект, который получает значение до начала выполнения программы и не может менять его в ходе выполнения.
Переменной назывется объект, который может менять своё значение в ходе выполнения программы.
С каждой переменной, используемой в программе, связывается область в оперативной памяти компьютера, размер которой зависит от типа объекта. Каждая константа и каждая переменная имеет своё имя (идентификатор), по которому мы и обращаемся к этим объектам, чтобы с ними работать. Каждое имя должно быть уникальным, чтобы не возникала ситуация неопределённости – какой объект выбирать. Если в программе две переменные имеют одно и то же имя, компьютер откажется выполнять данную программу.
Правила именования в языке Pascal следующие: именем может являться любая последовательность латинских букв и цифр, начинающаяся с буквы. При этом заглавные и строчные латинские буквы не различаются, то есть имена aBBA и AbBa на самом деле обозначают один и тот же объект. Ещё одна интересная особенность построения имён заключается в том, что символ подчёркивания ( _ ) считается латинской буквой, поэтому он также может входить в состав имени и, более того, имя с него может начинаться. Последнее правило именования заключается в том, что имена переменных или констант не должны совпадать со служебными зарезервированными словами языка.
Каждая переменная и каждая константа помимо имени ещё имеет свой тип. Тип определяет три вещи:
1) размер области оперативной памяти, отводимой под соответствующую переменную;
2) множество значений, которые может принимать соответствующая константа или переменная;
3) набор операций, которые можно выполнять с соответствующей константой или переменной.
Для того чтобы определить в программе константу или переменную, её нужно сначала описать до раздела действий.
Переменные описываются следующим образом: сначала записывается ключевое слово var, затем ставится пробел, указывается имя, которое мы хотим дать нашей переменной, ставится двоеточие и записывается тип переменной. После этого ставится точка с запятой.
var x:integer;
означает, что в нашей программе будет использоваться переменная с именем `x`, имеющая тип integer (целое число). Если в программе будет несколько переменных одного типа, то можно до двоеточия перечислить их имена через запятую, а не выписывать отдельную строчку для каждой переменной.
var x,y:integer;
Для описания константы необходимо записать ключевое слово const, затем указать имя константы (отделив его как минимум одним пробелом от ключевого слова), поставить знак равенства и тут же задать её значение, например:
const N=1000;
После окончания описания константы также ставится точка с запятой.
В программе принято сначала описывать константы (если они есть), а уже затем переменные (а они есть практически в любой программе).
Термином «константа» в программировании принято обозначать ещё одно понятие – если в программе встречается некоторое конкретное значение (например, число `1000`), то оно также называется константой соответствующего типа.
Рассмотрим общую структуру программы на языке Pascal. Программа состоит из двух частей: разделов описаний и раздела действий (команд, операторов). Раздел операторов представляет собой некую последовательность команд (операторов), которые должен выполнить компьютер. Другими словами, раздел действий – это собственно программа. В разделах описаний программист сообщает компьютеру, какие объекты он будет использовать в своей программе, сколько памяти под них нужно выделить и т. д.
Из всего перечисленного выше обязательным для каждой программы является лишь раздел действий. Разделов описания в программе может и не быть (хотя в содержательных задачах они будут). Раздел действий начинается с ключевого слова begin, далее записывается список операторов (собственно программа) и в конце пишется ключевое слово end и ставится точка. Внутри списка все операторы отделяются друг от друга специальным символом – точкой с запятой. В этом задании мы познакомимся со следующими операторами:
1) пустой оператор;
2) составной оператор;
3) оператор присваивания;
4) условный оператор;
5) операторы цикла;
6) операторы вывода;
7) операторы ввода.
Начнём с пустого оператора. В языке Pascal пустой оператор – это просто ничего. Он не содержит никаких символов и не выполняет никакого действия. Рассмотрим пример программы состоящей из одного пустого оператора:
Begin
End
Эта программа начинается и сразу же заканчивается, не выполняя никаких содержательных действий. Рассмотрим другой пример:
Begin
; ; ;
End
Эта программа состоит уже из четырёх пустых операторов, отделённых друг от друга точками с запятой.
Для того чтобы познакомиться с разделами описаний, сначала нужно изучить объекты, которые мы можем использовать в программе.
Изучение любого нового языка всегда начинается с алфавита. В алфавит языка Pascal входят следующие элементы:
1) Заглавные и строчные латинские буквы, символ подчёркивания (по грамматике языка символ подчёркивания считается буквой): _, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z.
2) Цифры: `1, 2, 3, 4, 5, 6, 7, 8, 9, 0`.
3) Знаки операций: + (плюс), – (минус), * (умножить), / (разделить), < (меньше), > (больше), <= (меньше или равно), > = (больше или равно), = (равно), <> (не равно). Последний знак состоит из знаков «меньше» и «больше», записанных без пробелов.
4) Знаки пунктуации, специальные символы:
{ } или (* *) | Скобки комментариев |
[] | Выделение индексов массивов, элементов множеств |
' ' | Выделение символа или строковой константы |
( ) | Выделение выражений, списков параметров |
:= |
Знак оператора присваивания |
; | Разделение операторов и объявлений |
: | Отделение переменной или константы от типа. Отделение метки от оператора |
= |
Отделение имени типа от описания типа. Отделение константы от её значения |
, | Запятая для разделения элементов в списке |
.. | Разделение границ диапазона |
. | Конец программы, отделение целой части от дробной |
# | Обозначение символа по его коду |
В таблице приведены не все знаки пунктуации, а лишь те, которые будут использоваться при дальнейшем изложении.
5) Служебные зарезервированные слова.
Некоторые слова имеют предопределённое значение и используются в качестве элементов при построении сложных конструкций языка. Приведём список зарезервированных служебных слов, которые нам понадобятся в дальнейшем:
and, array, begin, case, const, div, do, downto, end, for, if, mod, not, of, or, program, repeat, string, then, to, type, until, var, while, xor.
Требуется составить программу определения наибольшего общего делителя (НОД) двух натуральных чисел.
Одним из простейших алгоритмов нахождения наибольшего общего делителя является Алгоритм Евклида. Идея этого алгоритма основана на том свойстве, что если `M>N`, то `"НОД"(M, N)="НОД"(M-N, N)`.
Иначе говоря, НОД двух натуральных чисел равен НОД их положительной разности (модуля их разности) и меньшего числа.
var M, N: integer;
begin
writeln('Введите М и N');
readln(M, N);
while M<>N do
begin
if M>N
then M:=M-N
else N:=N-M
end;
write('Н0Д=',М)
end.
Данный курс призван помочь вам систематизировать уже имеющиеся знания по химии и подготовиться к достойной сдаче единого государственного экзамена, а быть может, и к участию в олимпиадах.
К сожалению, в рамках настоящих методических указаний невозможно будет дать весь тот теоретический материал, который требуется для подготовки к поступлению в вуз. Поэтому для теоретической подготовки я советую использовать любое пособие с грифом «Рекомендовано Министерством образования и науки Российской Федерации в качестве учебного пособия для поступающих в вузы». Одним из лучших таких пособий традиционно являются «Начала химии» авторов Н.Е. Кузьменко, В.В Еремина, В.А. Попкова.
Я, в свою очередь, в теоретической части методических указаний постараюсь акцентировать ваше внимание в местах, вызывающих наибольшие затруднения у абитуриентов. Мы рассмотрим много коли-чественных и качественных задач, цепочек превращений. В первых двух контрольных работах будет большое количество теоретических вопросов, так как темы «Строение атома» и «Химическая связь» не предполагают решения расчетных задач. Однако для практического противовеса теории я дополнила эти темы расчетными задачами с использованием основных понятий и законов химии. Следующие две работы будут также включать в себя задания из двух разных тем каждая. Сделано это по причине того, что количество высылаемых методических указаний ограничено, поэтому приходится каждое издание наполнять максимально.
Подготовка к поступлению в вуз по химии, как и по любому другому предмету, должна иметь систематический характер. Необходимо как можно больше читать химической литературы и решать задачи и цепочки не только для того, чтобы сдать контрольную работу в ЗФТШ МФТИ, но и для совершенствования навыков решения, и для запоминания свойств веществ. В конце каждой контрольной работы я буду давать одну-две задачи повышенной сложности.
Я желаю вам удачи и в качестве напутствия хочу сказать, что удача всегда улыбается трудолюбивым!
В 1860 году на Международном съезде естествоиспытателей в немецком городе Карлсруэ были приняты определения атома и молекулы. Учения о строении веществ тогда ещё не было, поэтому было принято положение о том, что все вещества состоят из молекул. Впоследствии такое сплошное распространение принципа молекулярного строения на все вещества оказалось ошибочным.
Итак, согласно атомно-молекулярному учению, все вещества состоят из молекул, а молекулы - из атомов. Таким образом, мельчайшей частицей всех реально существующих веществ, является атом.
Наименьшей же частицей вещества, сохраняющей его химических свойства, является молекула. В физических процессах молекулы сохраняются, в химических - разрушаются. Атомы же остаются неизменными и в физических, и в химических процессах, и могут быть разрушены только в ядерных реакциях.
Массы атомов чрезвычайно малы. Например, масса атома водорода составляет примерно $$ \mathrm{1,67}·{10}^{-27}$$ кг, углерода - $$ \mathrm{1,99}·{10}^{-26}$$ кг, кислорода - $$ \mathrm{2,66}·{10}^{-26}$$ кг. Оперировать такими числами неудобно. Поэтому в химии пользуются не абсолютными значениями массы, а относительными, а в качестве эталона используют `1//12` часть массы атома изотопа углерода $$ {}^{12}\mathrm{C}$$.
У студентов и учащихся часто возникает вопрос, почему именно это значение было выбрано в качестве эталона. Понятие атомной массы ввёл Дж. Дальтон в 1803 году, единицей измерения атомной массы (атомной единицей массы - а .е. м.) сначала служила масса атома водорода, как самого легкого элемента (так называемая «водороднаяединица»). Однако при использовании такой шкалы возникали расчётные трудности. В результате в нaчaлe `"XX"` века за а. е. м. былa принята `1//16` часть массы атома изотопа кислорода $$ {}^{16}\mathrm{O}$$ (так называемая«кислородная единица»). Но в состав кислорода входят изотопы $$ {}^{17}\mathrm{O}$$ и $$ {}^{18}\mathrm{O}$$, что не позволяет выделить чистый образец изотопа $$ {}^{16}\mathrm{O}$$. В связи с этим кислород не может являться эталоном для определения а. е. м.. По международному соглашению с 1961 г. в качестве атомной единицы массы ($$ 1$$ а. е. м.) принятa `1//12` чaсть массы изoтoпа углeрoдa $$ {}^{12}\mathrm{C}$$ (этот изотоп в природной смеси преобладает - его $$ \mathrm{98,9}\%$$; остальные $$ \mathrm{1,1}\%$$приходятся на изотоп $$ {}^{13}\mathrm{C}$$).
Итак, атомная единица массы ($$ 1$$ а .е. м) - `1//12` часть массы атома изотопа углерода $$ {}^{12}\mathrm{C}$$ - равна:
$$ {m}_{a}\left(\mathrm{C}\right):12=\mathrm{1,99}·{10}^{-26}\mathrm{кг}:12=\mathrm{1,67}·{10}^{-27}\mathrm{кг}$$.
Относительная атомная масса показывает, во сколько раз масса атома какого-либо химического элемента больше а.е.м., поэтому данная величина не имеет размерности.
Относительная атомная масса элемента ($$ {A}_{r}$$) - это отношение абсолютной массы атома химического элемента к а. е м.
Значения относительных масс элементов приведены в периодической таблице Д.И. Менделеева.
Относительная молекулярная масса ($$ {M}_{r}$$) – это сумма относительных атомных масс всех атомов, входящих в её состав.
Например, $$ {M}_{r}\left({\mathrm{H}}_{2}{\mathrm{SO}}_{4}\right)=2{A}_{r}\left(\mathrm{H}\right)+{A}_{r}\left(\mathrm{S}\right)+4{A}_{r}\left(\mathrm{O}\right)=98$$.