16 статей
Сообщающимися называются сосуды, которые имеют связывающие их каналы, заполненные жидкостью (см. рис.).
Можно показать, что справедлив закон сообщающихся сосудов.
в сообщающихся сосудах, заполненных однородной жидкостью, давление во всех точках жидкости, расположенных в одной горизонтальной плоскости, одинаково, независимо от формы сосудов, а поверхности жидкости в сообщающихся сосудах (открытых вверху) устанавливаются на одном уровне (см. рис.).
Земля окружена воздушной оболочкой, состоящей из смеси газов. Эта оболочка называется атмосферой. Каждый горизонтальный слой атмосферы сжат весом более верхних слоёв. Поэтому давление в нижних слоях атмосферы больше, чем в верхних. При этом и плотность воздуха в нижних слоях значительно больше, чем в верхних. Это связано с тем, что газы под воздействием давления могут сильно уменьшить свой объём. Жидкости же обладают очень малой сжимаемостью и практически не изменяют своей плотности даже при больших давлениях. Атмосферное давление на уровне моря равно примерно , т. е. . Это желательно помнить. С увеличением высоты над уровнем моря атмосферное давление уменьшается. На высоте примерно в оно уменьшается вдвое.
Значение атмосферного давления впервые определил экспериментально в 1634 г. итальянский учёный Торричелли, создав простейший ртутный барометр. Опыт Торричелли состоит в следующем. Стеклянная трубка длиной около метра, запаянная с одного конца, заполняется полностью ртутью. Затем, закрыв отверстие трубки, её переворачивают и погружают открытым концом в чашу со ртутью (см. рис.).
Часть ртути из трубки выливается, и в ней остаётся столб ртути высотой `H`. Давление в трубке над ртутью равно нулю (если пренебречь ничтожным давлением паров ртути), так как там - пустота (вакуум): `P_C = 0`. Давление `P_B` в точке `B` равно давлению `P_A` в точке `A`, поскольку в сообщающихся сосудах - чаше и трубке - точки `A` и `B` находятся на одном уровне. Давление `P_A` равно атмосферному давлению $$ {P}_{\mathrm{атм}}$$. Поэтому $$ {P}_{B}={P}_{\mathrm{атм}}$$. Разность давлений `P_B - P_C = rho gH`, где `rho` - плотность ртути. Так как $$ {P}_{B}={P}_{\mathrm{атм}}$$ и `P_C = 0`, то $$ {P}_{\mathrm{атм}} =\rho gH$$. Измерив `H` и зная `rho`, можно определить атмосферное давление в условиях опыта. Торричелли нашёл, что для уровня моря .
В опыте Торричелли каждому значению `H` соответствует определённое значение $$ {P}_{\mathrm{атм}}$$. Следовательно, атмосферное давление можно измерять в миллиметрах ртутного столба. Эта единица давления получила специальное название «Торр»: `1`Торр `= 1` мм. рт.ст. При этом высота столба ртути берётся той, которую он имел бы при `0^@"C"`. Атмосферное давление в `760` Торр называется нормальным атмосферным давлением. Значение этого давления называется нормальной (физической) атмосферой и обозначается . Зная плотность ртути , находим по формуле $$ {P}_{\mathrm{атм}}=\rho gH$$:
.
Умножим равенство $$ {P}_{\mathrm{атм}}=\rho gH$$ на площадь `S` внутреннего сечения трубки: $$ {P}_{\mathrm{атм}}S=\rho gHS$$. Заметим, что последнее равенство можно получить и непосредственно, записав условие равновесия столба `BC` ртути (рис. 6). Произведение $$ {P}_{\mathrm{атм}}S$$ равно силе давления `F` на столб ртути `BC` снизу, вызванное наличием атмосферного давления, а `rho gHS` есть вес столба `BC` ртути в трубке. Поэтому говорят, что в опыте Торричелли давление, создаваемое весом столба ртути, уравновешивается атмосферным давлением.
Замена ртути водой в опыте Торричелли требует высоты трубки более `10` м. Действительно, при нормальном атмосферном давлении для значения плотности воды из формулы $$ {P}_{\mathrm{атм}}=\rho gH$$ следует, что . Это означает, что нормальное атмосферное давление уравновешивается столбом воды высотой `10,3` м.
Несколько замечаний для решения задач. Полезно помнить, что плотность воды равна и гидростатическое давление в создаётся в воде на глубине приблизительно . Проверьте это, используя формулу для гидростатического давления.
Поскольку плотность воздуха намного меньше плотности воды, изменением атмосферного давления, связанным с перепадом высоты в несколько метров, можно в ряде случаев пренебречь по сравнению с гидростатическим давлением воды, вызванным таким же перепадом высоты.
В сосуд налита вода (см. рис.).
Расстояние от поверхности воды до дна . Площадь дна . Найти гидростатическое давление `P_1` и полное давление `P_2` вблизи дна. Найти силу давления воды на дно.
Плотность воды . Гидростатическое давление
$$ {P}_{1}=\rho gH={10}^{3} \mathrm{кг}/{\mathrm{м}}^{3}·\mathrm{9,8} \mathrm{м}/{\mathrm{с}}^{2}·\mathrm{0,5} \mathrm{м}\approx 5·{10}^{3} \mathrm{Па}=5000 \mathrm{Па}$$.
Полное давление складывается из атмосферного $$ {P}_{\mathrm{атм}}={10}^{5}\mathrm{Па}$$ и гидростатического:
$$ {P}_{2}={P}_{\mathrm{атм}}+{P}_{1}=100000 \mathrm{Па}+5000 \mathrm{Па}=105000 \mathrm{Па}$$.
Интересно, что полное давление мало отличается от атмосферного, так как толщина слоя воды достаточно мала. Сила давления воды на дно $$ F={P}_{2}·S=105000 \mathrm{Па}·\mathrm{0,1} {\mathrm{м}}^{2}=10500 H$$.
На лёгкий поршень площадью `S`, касающийся поверхности воды, поставили гирю массой `m` (см. рис.).
Высота слоя воды в сосуде с вертикальными стенками `H`. Определить давление в жидкости вблизи дна. Плотность воды `rho`.
На поршень снизу со стороны воды действует направленная вверх сила `F_1 = P_1 S`, где `P_1` давление вблизи поршня. Сверху на поршень действует гиря и атмосферный воздух с силой `F_2 = mg + P_"атм" S`, где , $$ {P}_{\mathrm{атм}}={10}^{5} \mathrm{Па}$$ - атмосферное давление. Поршень находится в равновесии. Поэтому `F_1 = F_2`. Итак, `P_1 S = mg + P_"атм" S`. Отсюда `P_1 = P_"атм" + (mg)/S`.
Этот результат можно писать и сразу, говоря, что давление под поршнем равно атмосферному `P_"атм"` и добавочному давлению `mg//S`, создаваемому гирей.
Разность давлений в воде у дна и вблизи поршня: `P_2 - P_1 = rho gH`.
Отсюда `P_2 = P_1 + rho gH`.
Окончательно, давление у дна `P_2 = P_"атм" + (mg)/S + rho gH`.
На поверхности твёрдого тела, погружённого в жидкость (газ), действуют силы давления. Эти силы увеличиваются с глубиной погружения (см. рис.), и на нижнюю часть тела будет действовать со стороны жидкости большая сила, чем на верхнюю.
Равнодействующая всех сил давления, действующих на поверхность тела со стороны жидкости, называется выталкивающей силой. Другое название этой силы - сила Архимеда. Истинная причина появления выталкивающей силы - это наличие различного гидростатического давления в разных точках жидкости.
выталкивающая сила, действующая на тело, погружённое в жидкость, равна по модулю весу вытесненной жидкости и противоположно ему направлена.
Закон открыт величайшим механиком и математиком Древней Греции Архимедом (287 - 212 г.г. до н. э.).
Приведённая формулировка закона Архимеда справедлива, если вся поверхность тела соприкасается с жидкостью или если тело плавает в жидкости, или если тело частично погружено в жидкость через свободную (не соприкасающуюся со стенками) поверхность жидкости.
Если же часть поверхности тела плотно прилегает к стенке или дну сосуда так, что между ними нет прослойки жидкости, то закон Архимеда неприменим!
Иллюстрацией к сказанному служит опыт, когда ровную нижнюю поверхность деревянного кубика натирают парафином и плотно приставляют ко дну сосуда (см. рис.).
Затем осторожно наливают воду. Кубик не всплывает, т. к. со стороны воды на него действует сила, прижимающая его ко дну, а не выталкивающая вверх. Известно, что это представляет опасность для подводной лодки, лёгшей на грунт.
Закон Архимеда применим и в случае погружения тела в газ.
Строго говоря, в законе Архимеда вес вытесненной жидкости надо брать в вакууме, а не в воздухе, так как вес жидкости в воздухе меньше веса этой жидкости в вакууме на величину веса воздуха, вытесненного этой жидкостью. Но это различие обычно мало, и им пренебрегают.
Если тело погружено в жидкость частично, то результирующая выталкивающая сила со стороны жидкости и воздуха равна сумме веса вытесненной жидкости и вытесненного этим телом воздуха. Здесь оба веса берутся в вакууме.
Железный предмет, полностью погружённый в воду, весит меньше, чем в воздухе на . Определить вес предмета в воздухе. Плотность железа .
Выталкивающей силой в воздухе можно пренебречь. Пусть вес тела в воздухе `Q`. Тогда его вес в воде `Q - rho_в Vg`. Здесь `V` - объём тела, - плотность воды, . Разность этих весов равна `F`. Поэтому `Q - (Q - rho_в Vg) = F`.
Отсюда `V = F/(rho_в g)`. Вес тела в воздухе
.
Лодка из железа, спущенная на воду, плывёт, а эта же лодка, полностью погружённая в воду (затопленная), тонет. Из этого примера видно, что одно и тоже тело может плавать, а может и тонуть. Всё зависит от того, как тело приведено в контакт с жидкостью. Поэтому имеет смысл рассмотреть два случая взаимодействия тела с жидкостью.
Тело плавает в жидкости, т. е. находится в покое, частично погрузившись в жидкость. Это может быть любое тело, например, кусок дерева или катер. Важен сам факт плавания. При этом тело соприкасается только с жидкостью и воздухом, плавая предоставленным самому себе, свободно. На начальном этапе рассмотрения вопроса о плавании не будем учитывать вес вытесненного воздуха. На тело действует направленная вниз сила тяжести `F_sf"Т"` и направленная вверх сила Архимеда `F_sf"А"`. Поскольку сила тяжести `F_sf"Т"` равна весу тела (в вакууме), а сила Архимеда `F_sf"А"` – весу (в вакууме) вытесненной жидкости, то можно сказать, что вес тела равен весу вытесненной жидкости. При более строгом рассмотрении вопроса с учётом веса вытесненного воздуха можно показать, что вес тела в воздухе равен весу (тоже в воздухе) вытесненной жидкости.
Итак, если тело плавает в жидкости, то вес тела в воздухе равен весу в воздухе вытесненной им жидкости.
При решении задач, когда ситуация реальна, различием в весе в воздухе и вакууме обычно пренебрегают, приравнивая вес любого тела силе тяжести, действующей на тело.
Кусок льда объёмом плавает в воде. Найти объём `V_1` надводной части льда. Плотность воды , плотность льда .
Вес льдины `rho_2 Vg`, вес вытесненной воды `rho_1 (V - V_1)g`. По закону Архимеда `rho_2 Vg = rho_1 (V - V_1)g`. Отсюда
.
Тело полностью погружено в жидкость и отпущено. Возьмём в руки какое-нибудь тело (кусочек дерева, стальной болт), погрузим его полностью в жидкость (например, воду) и будем удерживать неподвижно. На тело со стороны Земли действует вниз сила тяжести , а со стороны жидкости - вверх выталкивающая сила по закону Архимеда . Здесь `V` - объём тела, и - плотность тела и жидкости. Отпустим тело. Если окажется, что $$F_\mathrm Т\;>\;F_\mathrm А$$, то тело начнёт двигаться вниз, т. е. тонуть. Если будет $$F_\mathrm Т\ <\ F_\mathrm А$$, то тело станет двигаться вверх, т. е. всплывать. После всплытия, когда тело будет плавать, объём погружённой в жидкость части тела окажется таким, что будет обеспечено равенство силы Архимеда (уже меньшей, чем величина $$ {F}_{\mathrm{А}}$$) и силы тяжести $$ {F}_{\mathrm{Т}}$$. Итак, тело будет плавать, если $$\rho_\mathrm ТVg\;<\;\rho_\mathrm ЖVg$$, т. е. $$\rho_\mathrm Т\;<\;\rho_\mathrm Ж$$.
Мы получили условие плавания тела: тело, предварительно полностью погружённое в жидкость, плавает в жидкости, если плотность тела меньше плотности жидкости.
Если плотности тела и жидкости равны, то полностью погружённое в жидкость тело может находиться в равновесии (покое) в любом месте жидкости, т. е. тело плавает внутри жидкости. Реально такая ситуация трудно осуществима, так как добиться строгого равенства плотностей нелегко.
Условие плавания сформулировано для тела, предварительно полностью погружённого в жидкость. Предварительное полное погружение важно, так как, например, металлическая миска, не полностью погружённая в воду, может плавать, а полностью погружённая утонет.
Условие плавания сформулировано для однородного тела, т. е. тела, плотность которого одинакова во всех точках тела. Это условие плавания справедливо и для неоднородного тела, например, куска льда с полостью внутри или стеклянной бутылки, заполненной частично водой и закрытой пробкой. В таком случае под плотностью тела надо понимать его среднюю плотность, т. е. отношение массы тела к его объёму.
На тело, удерживаемое неподвижно в воздухе, действует выталкивающая сила, равная по закону Архимеда весу вытесненного этим телом воздуха. Если вес тела (в вакууме) больше веса вытесненного телом воздуха, то отпущенное тело падает вниз. Если вес тела меньше веса вытесненного воздуха, то отпущенное тело поднимается вверх. Это и есть условие воздухоплавания.
Для осуществления воздухоплавания надо использовать газ, который легче воздуха. Это может быть нагретый воздух. Если суммарный вес оболочки воздушного шара, наполняющего его газа и полезного груза меньше веса вытесненного шаром воздуха, то шар будет подниматься.
Какой груз может поднять воздушный шар объёмом , наполненный гелием? Плотность гелия , плотность воздуха . Масса оболочки шара .
Объёмом груза по сравнению с объёмом шара пренебрегаем. Вес вытесненного воздуха , вес гелия . Максимальная масса груза найдётся из условия: . Отсюда
.
Часть механики, изучающая условия, при которых тело находится в покое под действием нескольких сил, называется статикой.
В гидростатике рассматриваются силы, возникающие в системе, состоящей из покоящейся жидкости и помещённых в эту жидкость неподвижных тел.
Силы, появляющиеся в системе из неподвижного газа и помещённых в него покоящихся тел, изучает наука аэростатика.
В гидростатике и аэростатике используются многие понятия и законы механики и её составной части – статики. Поэтому перед чтением этого задания полезно повторить материал, касающийся понятий массы, плотности, силы, силы тяжести, веса тела, равнодействующей нескольких сил. Напомним кое-что из этого.
Масса тела `m`, его объём `V` и плотность `rho` тела связаны формулой `m=Vrho`. Сила тяжести, действующая на тело массой `m`, приложена к телу и находится по формуле `F=mg`, где `g~~9,8 "Н"//"кг"=9,8 "м"//"с"^2` – ускорение свободного падения. Вес тела массой `m` во многих случаях выражается тоже аналогичной формулой `Q=mg`, но вес `Q` приложен к подставке, на которой находится тело.
Сила, которая оказывает на тело такое же действие, как и несколько одновременно действующих сил, называется равнодействующей этих сил. Если тело находится в покое, то равнодействующая сила равна нулю. В частности, если на тело действуют две силы и тело находится при этом в покое, то эти силы равны по модулю и противоположны по направлению.
Несколько слов о контрольных вопросах и задачах, предлагаемых в конце задания. Часть вопросов и задач простые, часть сложные. Не смущайтесь, если некоторые из них Вам не удастся решить. У Вас будет возможность вернуться к этому заданию, когда Вы получите назад свою проверенную работу и официальное решение этого задания.
Желаем удачи!
Внутренняя энергия тела зависит от его температуры и внешних условий - объёма и т. д. Если внешние условия остаются неизменными, т. е. объём и другие параметры постоянны, то внутренняя энергия тела зависит только от его температуры.
Изменить внутреннюю энергию тела можно, не только нагревая его в пламени или совершая над ним механическую работу (без изменения положения тела, например, работа силы трения), но и приводя его в контакт с другим телом, имеющим температуру, отличную от температуры данного тела, т. е. посредством теплопередачи.
Количество внутренней энергии, которое тело приобретает или теряет в процессе теплопередачи, и называется «количеством теплоты». Количество теплоты принято обозначать буквой `Q`. Если внутренняя энергия тела в процессе теплопередачи увеличивается, то теплоте приписывают знак плюс, и говорят, что телу сообщили теплоту `Q`. При уменьшении внутренней энергии в процессе теплопередачи теплота считается отрицательной, и говорят, что от тела отняли (или отвели) количество теплоты `Q`.
Количество теплоты можно измерять в тех же единицах, в которых измеряется и механическая энергия. В системе СИ - это `1` джоуль. Существует и другая единица измерения теплоты - калория. Калория - это количество теплоты, необходимое для нагревания `1` г воды на `1^@ "C"`.
Соотношение между этими единицами было установлено Джоулем: `1` кал `= 4,18` Дж. Это означает, что за счёт работы в `4,18` кДж температура `1` килограмма воды повысится на `1` градус.
Количество теплоты, необходимое для нагревания тела на `1^@ "C"`, называется теплоёмкостью тела. Теплоёмкость тела обозначается буквой `C`. Если телу сообщили небольшое количество теплоты `Delta Q`, а температура тела изменилась на `Delta t` градусов, то
`C = (DeltaQ)/(Deltat)`. | (1.1) |
Опыт показывает, что при обычных температурах `(200-500 sf"К")` теплоёмкость большинства твёрдых и жидких тел почти не зависит от температуры. Для большинства расчётов будем принимать, что теплоёмкость какого-нибудь вещества есть величина постоянная.
Кроме теплоёмкости тела `C` вводят ещё удельную теплоёмкость `c` - теплоёмкость единицы массы вещества. Именно эта величина обычно приводится в справочниках физических величин. Удельная теплоёмкость `c` связана с теплоёмкостью тела `C` и массой `m` тела соотношением:
`C = c*m`. | (1.2) |
Приведённые формулы позволяют рассчитать, какое количество теплоты `Q` надо передать телу массы `m`, чтобы повысить его температуру от значения `t_1` до значения `t_2`:
`Q=C*Deltat=C*(t_2 - t_1)=c*m*(t_2 - t_1 )`. | (1.3) |
Если тело окружить оболочкой, плохо проводящей тепло, то температура тела, если оно предоставлено самому себе, будет оставаться в течение длительного времени практически постоянной. Таких идеальных оболочек в природе, конечно, не существует, но можно создать оболочки, которые по своим свойствам приближаются к таковым.
Примерами могут служить обшивка космических кораблей, сосуды Дьюара, применяемые в физике и технике. Сосуд Дьюара представляет собой стеклянный или металлический баллон с двойными зеркальными стенками, между которыми создан высокий вакуум. Стеклянная колба домашнего термоса тоже является сосудом Дьюара.
Теплоизолирующей является оболочка калориметра – прибора, позволяющего измерять количество теплоты. Калориметр представляет собой большой тонкостенный стакан, поставленный на кусочки пробки внутрь другого большого стакана так, чтобы между стенками оставался слой воздуха, и закрытый сверху теплонепроводящей крышкой.
Если в калориметре привести в тепловой контакт два или несколько тел, имеющих различные температуры, и подождать, то через некоторое время внутри калориметра установится тепловое равновесие. В процессе перехода в тепловое равновесие одни тела будут отдавать тепло (суммарное количество теплоты `Q_(sf"отд")`), другие будут получать тепло (суммарное количество теплоты `Q_(sf"пол")`). А так как калориметр и содержащиеся в нём тела не обмениваются теплом с окружающим пространством, а только между собой, то можно записать соотношение, называемое также уравнением теплового баланса:
`Q_(sf"пол") = Q_(sf"отд")` | (1.4) |
В ряде тепловых процессов тепло может поглощаться или выделяться телом без изменения его температуры. Такие тепловые процессы имеют место при изменении агрегатного состояния вещества - плавлении, кристаллизации, испарении, конденсации и кипении. Коротко остановимся на основных характеристиках этих процессов.
Плавление – процесс превращения кристаллического твёрдого тела в жидкость. Процесс плавления происходит при постоянной температуре, тепло при этом поглощается.
Удельная теплота плавления `lambda` равна количеству теплоты, необходимому для того, чтобы расплавить `1` кг кристаллического вещества, взятого при температуре плавления. Количество теплоты `Q_(sf"пл")`, которое потребуется для перевода твёрдого тела массы `m` при температуре плавления в жидкое состояние, равно
`Q_(sf"пл") = lambda * m`. | (1.5) |
Поскольку температура плавления остаётся постоянной, то количество теплоты, сообщаемое телу, идёт на увеличение потенциальной энергии взаимодействия молекул, при этом происходит разрушение кристаллической решётки.
Процесс кристаллизации – это процесс, обратный процессу плавления. При кристаллизации жидкость превращается в твёрдое тело и выделяется количество теплоты, также определяемое формулой (1.5).
Испарение – это процесс превращения жидкости в пар. Испарение происходит с открытой поверхности жидкости. В процессе испарения жидкость покидают самые быстрые молекулы, т. е. молекулы, способные преодолеть силы притяжения со стороны молекул жидкости. Вследствие этого, если жидкость теплоизолирована, то в процессе испарения она охлаждается.
Удельная теплота парообразования `L` равна количеству теплоты, необходимому для того, чтобы превратить в пар `1` кг жидкости. Количество теплоты `Q_(sf"исп")`, которое потребуется для перевода в парообразное состояние жидкость массой `m` равно
`Q_(sf"исп") =L*m`. | (1.6) |
Конденсация – процесс, обратный процессу испарения. При конденсации пар переходит в жидкость. При этом выделяется тепло. Количество теплоты, выделяющейся при конденсации пара, определяется по формуле (1.6).
Кипение – процесс, при котором давление насыщенных паров жидкости равно атмосферному давлению, поэтому испарение происходит не только с поверхности, но и по всему объёму (в жидкости всегда имеются пузырьки воздуха, при кипении давление паров в них достигает атмосферного, и пузырьки поднимаются вверх).
Возгонка (сублимация) – процесс перехода вещества из твёрдого состояния непосредственно в газообразное. Именно благодаря сублимации мы чувствуем запахи некоторых твердых веществ, например, нафталина и камфары. По этой же причине мокрое белье, вывешенное на мороз, высыхает. Обратный процесс называется десублимацией. Примером десублимации служат «узоры» на окнах, образующиеся из водяного пара, находящегося в воздухе и кристаллизующегося на поверхности стекла.
В электрический чайник налили холодную воду при температуре `t_1 = 10^@ "C"`. Через время `tau =10` мин после включения чайника вода закипела. Через какое время она полностью испарится? Потерями теплоты пренебречь. Удельная теплоёмкость воды `c_(sf"в") = 4200 sf"Дж"//(sf"кг" * sf"К")`, удельная теплота парообразования воды `L_(sf"в") =2,26 *10^6 sf"Дж"//sf"кг"`.
Для испарения воды массой `m` при температуре кипения необходимо количество теплоты `Q_1 =mL_(sf"в")`, где `L_(sf"в")` - удельная теплота парообразования воды.
Пусть воде от нагревателя чайника в единицу времени поступает количество теплоты `q`, а `tau_1` - время, необходимое для испарения всей воды, нагретой до температуры кипения. Тогда справедливо соотношение
`Q_1 = mL_(sf"в") =q tau_1`.
Количество теплоты `Q_2`, поступившее от нагревателя за время `tau` и нагревшее воду от начальной температуры `t_1 = 10^@ "C"` до температуры кипения `t_2 =100^@ "C"`, равно
`Q_2 = q tau = c_(sf"в")m (t_2 - t_1)`,
где `c_(sf"в")` - удельная теплоёмкость воды. Отсюда для массы воды получаем
`m= (q tau)/(c_(sf"в") (t_2 - t_1))`.
Подставляя это выражение в соотношение для `Q_1`, имеем
`q*tau_1 = (L_(sf"в")q tau)/(c_(sf"в") (t_2 - t_1))`.
Отсюда для времени испарения воды получаем
$$ {\tau }_{1}={\displaystyle \frac{{L}_{\mathrm{в}}·\tau }{{c}_{\mathrm{в}}·\left({t}_{2}-{t}_{1}\right)}}={\displaystyle \frac{\mathrm{2,26}·{10}^{6} \mathrm{Дж}/\mathrm{кг}·600 \mathrm{с} }{\mathrm{4,2}·{10}^{3} \mathrm{Дж}/(\mathrm{кг}·\mathrm{К})·90 \mathrm{К}}}\approx 1 \mathrm{час}.$$
Найдите расход бензина автомобиля (в литрах) на `L = 100` км пути при скорости `v=90` км/ч. Мощность двигателя автомобиля `P=30` кВт, коэффициент полезного действия `eta =25%`.
Количество теплоты `Q`, которое выделяется при сгорании бензина объёмом `V`, зависит от удельной теплоты сгорания `q` данного вида топлива (для бензина `q=46 sf"МДж"//sf"кг"`) и массы `m` сгоревшего топлива. С учётом того, что `m=rho V` (для бензина `rho = 700 sf"кг"//sf"м"^3`), получаем
`Q=qm=q rho V`.
Часть энергии, выделяемой при сгорании бензина, используется для создания полезной мощности `P`. Если двигатель, развивая постоянную мощность `P`, проработал в течение времени `tau`, то совершённая им работа `A` равна `P tau`. Эффективность преобразования теплоты `Q` сгорания топлива в механическую работу `A` двигателя характеризуется коэффициентом полезного действия (КПД) двигателя `eta`
`eta=A/Q * 100% = (P tau)/Q *100% = (P tau)/(q rho V) * 100%`.
Время работы двигателя `tau = L//v`. Из полученных соотношений для величины расхода бензина находим
`V = (100%)/(eta) * (P*L)/(q*rho *v) ~~(100%)/(25%) * (30*10^3 sf"Дж"//sf"c" * 10^5 sf"м")/(46 * 10^6 sf"Дж"//sf"кг" * 700 sf"кг"//sf"м"^3 * 25 sf"м"//sf"с") ~~14,9 sf"л"`.
Следовательно, расход бензина для автомобиля с указанными характеристиками составляет примерно `15` литров на `100` км пути.
При выстреле из ружья стальная дробь массой `m=45` г вылетает со скоростью `v=600` м/с. Считая, что `80%` энергии, высвободившейся при сгорании порохового заряда массой `M=9` г, переходит в кинетическую энергию пули и её внутреннюю энергию, определите, на сколько градусов повысилась температура пули. Удельная теплота сгорания пороха `q=3 sf"МДж"//sf"кг"`, удельная теплоёмкость стали `c_(sf"ст") = 500 sf"Дж" //(sf"кг" * sf"К")`.
При сгорании пороха массой `M` выделяется энергия (теплота) `Q=qM`, где `q` -удельная теплота сгорания пороха. По условию задачи `80%` этой энергии переходит в кинетическую энергию `K` дроби и её внутреннюю энергию. Следовательно, внутренняя энергия дроби изменяется, и пусть `Delta U` - величина этого изменения. Тогда справедливо следующее соотношение
`0,8 Q=K+Delta U`.
Перепишем его, учитывая выражения для кинетической энергии дроби `K=mv^2 //2` и изменения внутренней энергии `Delta U = c_(sf"ст") mDelta t`, где `Delta t` - изменение температуры дроби (искомая величина). Получаем
`0,8 qM=(mv^2)/(2) +c_sf"ст" mDelta t`.
Отсюда для изменения температуры находим
`Delta t= (1,6 qM - mv^2)/(2 c_(sf"ст") m) = 600 sf"К"`.
Как велика масса стальной детали, нагретой предварительно до `500^@ "C"`, если при опускании её в калориметр, содержащий `18,6` л воды при температуре `13^@ "C"`, последняя нагрелась до `35^@ "C"`. Теплоёмкостью калориметра и потерями теплоты на испарение воды пренебречь. Удельная теплоёмкость стали `c_(sf"ст") = 500 sf"Дж"//(sf"кг" * sf"К")`.
Во время рассматриваемого теплового процесса стальная деталь массой `M_(sf"ст")` охлаждается от температуры `t_1 =500^@ "C"` до температуры `t=35^@ "C"`, отдавая при этом количество теплоты `Q_(sf"ст")`:
`Q_(sf"ст") = c_(sf"ст") M_(sf"ст") (t_1 -t)`.
За это же время вода массой `M_sf"в" =18,6` кг нагревается от температуры `t_2 =13^@ "C"` до температуры `t=35^@ "C"`, получив при этом количество теплоты `Q_(sf"в")`:
`Q_sf"в" = c_sf"в" M_sf"в" (t-t_2)`.
Уравнение теплового баланса для данного теплового процесса можно записать следующим образом:
$$ {Q}_{\mathrm{отд}}={Q}_{\mathrm{ст}}={c}_{\mathrm{ст}}{M}_{\mathrm{ст}}\left({t}_{1}-t\right)={Q}_{\mathrm{пол}}={Q}_{\mathrm{в}}={c}_{\mathrm{в}}{M}_{\mathrm{в}}\left(t-{t}_{2}\right)$$.
Здесь учтено, что по условию задачи испарением воды можно пренебречь, т. е. теплота, выделяемая при охлаждении стальной детали, идёт только на нагревание воды.
Из последнего соотношения для массы стальной детали получаем
$$ {M}_{\mathrm{ст}}={\displaystyle \frac{{с}_{\mathrm{в}}{M}_{\mathrm{в}}\left(t-{t}_{2}\right)}{{c}_{\mathrm{ст}}\left({t}_{1}-t\right)}}={\displaystyle \frac{4200 \mathrm{Дж}/(\mathrm{кг}·\mathrm{К})·\mathrm{18,6} \mathrm{кг}·\left(35°\mathrm{C}-13°\mathrm{C}\right)}{500 \mathrm{Дж}/(\mathrm{кг}·\mathrm{К})·\left(500°\mathrm{C}-35°\mathrm{C}\right)}}\approx \mathrm{7,4} \mathrm{кг}$$.
В калориметр, где в состоянии теплового равновесия находился мокрый снег (смесь льда и воды) массой `m=250` г, долили `M=1` кг воды при температуре `t_1 =20^@ "C"`. После того, как снег растаял, и установилось тепловое равновесие, в калориметре оказалась вода при температуре `t_2 =5^@ "C"`. Сколько воды содержалось в снегу? Потерями теплоты и теплоёмкостью калориметра пренебречь.
Конечное агрегатное состояние системы по условию задачи - вода. Мокрый снег (смесь льда и воды при температуре `t_0 =0^@ "C"`) получает теплоту от находящейся в калориметре воды.
Часть теплоты, подведённой мокрому снегу, идёт на плавление находящегося в снегу льда (пусть масса льда `m_(sf"л")`). Для плавления льда при температуре плавления необходимо количество теплоты `Q_sf"пол,1"`:
`Q_(sf"пол,1") = m_sf"л" lambda_sf"л"`.
На нагревание получившейся из мокрого снега воды массой `m=250` г от температуры `t_0 = 0^@ "C"` до температуры `t_2 = 5^@ "C"` требуется количество теплоты `Q_sf"пол,2"`
`Q_sf"пол,2" = c_sf"в" m (t_2 - t_0)`.
Таким образом, суммарное количество теплоты `Q_sf"пол"`, получаемое мокрым снегом, а затем водой, равно
`Q_sf"пол"=Q_sf"пол,1" + Q_sf"пол,2"=m_(sf"л") lambda_(sf"л") + c_(sf"в") m (t_2 - t_0)`.
Вода, первоначально находившаяся в калориметре, охлаждается от температуры `t_1 = 20^@ "C"` до температуры `t_2 =5^@ "C"`, отдавая при этом количество теплоты `Q_sf"отд"`
`Q_sf"отд" = с_sf"в" M (t_1 - t_2)`.
Уравнение теплового баланса для данного теплового процесса можно записать следующим образом:
`Q_sf"отд" = с_sf"в" M (t_1 - t_2)=Q_sf"пол" = m_sf"л" lambda_sf"л" + c_sf"в" m (t_2 - t_0)`.
Отсюда для массы льда, находившегося в мокром снегу, получаем
`m_sf"л" = (Mc_sf"в" (t_1 - t_2) - mc_sf"в" (t_2 - t_0))/(lambda_sf"л") ~~170 sf"г"`.
Масса же воды, содержавшейся в мокром снегу, равна `78` г.
В холодную воду, взятую в количестве `12` кг, впускают `1` кг водяного пара при температуре `t_sf"п" = 100^@ "C"`. Температура воды после конденсации в ней пара поднялась до `t=70^@ "C"`. Какова была первоначальная температура воды? Потерями теплоты пренебречь.
Попав в холодную воду, пар массой `m_sf"п" = 1` кг конденсируется, выделяя количество теплоты `Q_1 = m_sf"п"L_sf"в"`. Здесь `L_sf"в"` - удельная теплота конденсации водяного пара. Получившаяся при конденсации пара вода охлаждается от температуры `t_sf"п" =100^@ "C"` до `t=70^@ "C"`, отдавая холодной воде количество теплоты `Q_2 = c_sf"в" * m_sf"п" * (t_sf"п" - t)`.
Для нагревания холодной воды массы `m_sf"в" =12` кг от начальной температуры `t_sf"в"` до температуры `t=70^@ "C"` требуется количество теплоты `Q_3 = c_sf"в" * m_sf"в" * (t-t_sf"в")`.
Составим уравнение теплового баланса для рассматриваемого теплового процесса:
`Q_sf"отд" = Q_1 + Q_2 = L_sf"в" m_sf"п" + c_sf"в" m_sf"п" (t_sf"п" - t) = Q_sf"пол" = Q_3 = c_sf"в" m_sf"в" (t-t_sf"в")`.
Решая полученное уравнение, для начальной температуры воды находим:
`t_sf"в" = t- (L_sf"в" m_sf"п") / (c_sf"в" m_sf"в") - (m_sf"п")/(m_sf"в") * (t_sf"п" - t) = 23^@ "C"`.
В калориметр, содержащий `200` г воды при температуре `8^@"C"`, опускают `100` г льда, температура которого равна `-20^@"C"`. Какая температура установится в калориметре? Каково будет содержимое калориметра после установления теплового равновесия? Теплоёмкостью калориметра пренебречь.
Конечное состояние не очевидно. Требуется анализ.
Чтобы нагреть массу `m_"л"=0,1` кг льда от `t_"л"=-20^@"C"` до `t_0=0^@"C"`, надо было бы затратить количество теплоты
`Q_1=c_"л"m_"л"(t_0-t_"л")=4200` Дж.
Чтобы расплавить весь лёд при `0^@"C"` потребовалось бы количество теплоты
`Q_2=lambda_"л"m_"л"=33600` Дж.
Если вся вода охладится от `t_"в"=8^@"C"` до `t_0=0^@"C"`, то выделится количество теплоты
`Q_3=c_"в"m_"в"(t_"в"-t_0)=6720` Дж.
Сравнивая полученные значения для `Q_1`, `Q_2`, `Q_3`, приходим к выводу, что `Q_3` хватит на нагрев всего льда от `t_"л"` до `t_0` и плавления только части льда массой `m_1`. Уравнение теплового баланса
`Q_3=Q_1+m_1lambda_"л"`.
Отсюда
`m_1=(Q_3-Q_1)/(lambda_"л")=7,5` г.
Итак, в калориметре будет смесь из `207,5` г воды и `92,5` г льда при `0^@"C"`.
Увеличить внутреннюю энергию тела можно двумя способами: 1) за счёт совершения над ним работы внешними силами, 2) за счёт теплообмена с телом, имеющим более высокую температуру, чем само тело. В некоторых случаях, например, для плавления металлов, необходимо очень большое количество теплоты и высокая температура. Таких условий можно достичь, используя какое-либо топливо (уголь, нефть, природный газ, дерево и т. д.). При его сгорании, т. е. при химической реакции соединения с кислородом, будет выделяться теплота. Это связано с тем, что в процессе химической реакции горения кинетическая энергия получаемых частиц вещества (продуктов сгорания) становится больше, чем кинетическая энергия исходных частиц вещества.
Энергия, выделяющаяся при сгорании топлива, называется теплотой сгорания. Удельная теплота сгорания топлива – это количество теплоты, которое выделяется при полном сгорании `1` кг топлива. Она обозначается буквой `q`. Количество теплоты, выделившееся при сгорании массы m топлива, равно
`Q=q*m`. (7)
Математика имеет дело с абстрактными (идеализированными) объектами. Например, идеально ровные прямые, не имеющие размеров точки, и числа, которые абсолютно точны. В отличие от математики, физика имеет дело с реальными природными объектами, которые измеряются реальными приборами. Все приборы измеряют физические величины с некоторой точностью, которая определяется классом точности прибора или ценой деления его шкалы. Например, у линейки цена деления `1` мм и, соответственно, погрешность, равная половине цены деления прибора, составляет `0,5` мм. Более того, точность измерений зависит от способа измерения, от выбора методики и условий проведения эксперимента, и многих других причин, которые определяют объективную погрешность эксперимента.
Поэтому, если Вы, измеряя с помощью обычной линейки (цена деления `1` мм), вдруг получили ответ с точностью до тысячных (или даже точнее) долей миллиметра, то Вы наврали. Так как, сами понимаете, что таким прибором заведомо нельзя так точно измерить. Или другой пример. Если Вы пишите ответ `«sqrt2»`, то Вы, как минимум, претендуете на Нобелевскую премию. Потому что, так Вы делаете заявку на измерение с бесконечной точностью, что в принципе невозможно. (Противоречит соотношению неопределённостей Гейзенберга.) Таким образом, при написании ответа или результата эксперимента Вы отвечаете за каждую свою цифру.
Возникает вопрос, так всё же с какой точностью нужно писать ответ к задаче? В эксперименте, по умолчанию (если не оговаривается особо), обычно подразумевают точность `10%`. Так называемая «золотая десятина». При решении задач, основным соображением является то, что количество значащих цифр в ответе не должно превышать количество значащих цифр в условии.
Здесь изложены лишь некоторые соображения, которые определяют точность решения. В целом же, точность эксперимента или расчёта экспериментатор (автор идеи) определяет сам, исходя из здравого смысла и своего опыта. Со временем, Уважаемые Читатели, этот опыт придёт и к Вам.
В эксперименте измерение трёх рёбер прямоугольного параллелепипеда дало значения `a=0,12` м, `b=1,2*10^(-2)` м, `c=121` мм. Требуется вычислить его объём, ответ дать в кубических миллиметрах.
Поскольку нам необходимо вычислить объём в миллиметрах, приведём все результаты измерений в миллиметрах:
`a=0,12 "м"=0,12*10^3 "мм"=12*10 "мм"`
`b=1,2*10^(-2) "м"=1,2*10^(-2)*10^3 "мм"=12 "мм"`
`c=121 "мм"`.
Объём равен произведению сторон
`V=a*b*c=12*10 "мм"*12 "мм"*121 "мм"=174240 "мм"^3~~1,7*10^5 "мм"^3`.
Исходные данные содержали минимум `2` значащие цифры, поэтому необходимо и ответ округлить до двух значащих цифр.
Объём параллелепипеда `V=1,7*10^5 "мм"^3`.
Алгебра логики является частью активно развивающейся сегодня науки – дискретной математики. Дискретная математика – это тот раз-дел математики, где не используется понятие непрерывности.
1) Состоящий из отдельных частей.
2) Изменяющийся между несколькими стабильными состояниями.
3) Существующий лишь в отдельных точках.
Для того, чтобы лучше понять этот термин, рассмотрим следующий пример. Мы знаем, что график некоторой функции (например, `y=x^2`) является непрерывной линией (параболой), если аргумент функции принимает все значения из множества действительных чисел. А теперь представим, что `x` может принимать только значения из множества целых чисел. В этом случае график будет представлять собой бесконечное количество отдельных точек, располагающихся на координатной плоскости в определённом порядке. В расположении точек будет угадываться парабола, но непрерывной линии мы не увидим. Вместо неё мы увидим дискретную структуру.
В прошлом задании мы говорили о представлении чисел в компьютере, и знаем, что каждое число представляется в виде определённой последовательности значений битов. В каждом бите может храниться ноль или единица. То есть, по сути, представление чисел (в будущем мы увидим, что не только чисел, а вообще любых данных) в компьютере является дискретной структурой. Поэтому, изучение дискретных структур – важная часть информатики. В этом задании мы будем изучать наиболее простую дискретную структуру, которая называется высказыванием.
Высказывание – это повествовательное предложение, в отношении которого можно судить о его истинности либо ложности.
Например, предложение: «Я – твой друг» является высказыванием, а предложение: «Положи это сюда!» высказыванием не является, поскольку не является повествовательным предложением.
Истинность или ложность каждого высказывания зависит от трактовки его содержания. Например, высказывание: «Город Москва – столица России» является истинным, а высказывание: «Город Санкт-Петербург стоит на реке Лене» является ложным.
Высказывание называется простым, если никакая его часть сама по себе не является высказыванием.
Высказывание: «Эта шляпа – красная» является простым, в то время как высказывание: «Если прямая пересекает одну из двух параллельных прямых, то она пересекает и вторую» является примером сложного высказывания, которое, по сути, состоит из трёх простых: «две прямые параллельны», «прямая пересекает одну из двух прямых», «прямая пересекает другую прямую». В сложном высказывании простые высказывания соединяются при помощи логических связок. В рассмотренном выше примере логической связкой является союз «если то».
Алгебра логики изучает структуру сложных логических высказываний и способы установления их истинности при помощи алгебраических методов. Причём, конкретное содержание высказываний предметом изучения алгебры логики не является, и, соответственно, интересовать нас в дальнейшем не будет.
В прошлом задании при изучении основ программирования мы столкнулись с понятиями констант и переменных. Константа – это некоторое конкретное значение, а переменная – это объект, который может менять свои значения и которому можно присваивать различные значения. Этими же понятиями пользуется и алгебра логики, чтобы абстрагироваться от конкретных содержаний высказываний. Будем считать, что любое простое высказывание – это есть константа. И введём понятие переменной в алгебре логики.
Переменной в алгебре логики называется объект, имеющий уникальное имя, и значением которого может являться любое простое высказывание.
В отличие от языков программирования в алгебре логики нет ограничений при именовании переменных. Переменные могут иметь абсолютно любые имена, но чаще всего их обозначают заглавными или строчными латинскими буквами (`A, B, C, x, y, z, s`), либо последовательностью, состоящей из заглавной или строчной латинской буквы и целого числа (`A1, A2, A4, A10000000`). Ещё одно отличие от языков программирования заключается в том, что после присвоения переменной высказывания можно говорить об её истинности либо ложности. То есть существует два понятия «значение логической переменной». С одной стороны – это конкретное высказывание, а с другой стороны – это истина, либо ложь.
Логическим выражением называется объект, состоящий из логических переменных и логических операций и имеющий значение истина, либо ложь. Процесс построения логического выражения по сложному высказыванию называется формализацией высказывания.
В процессе формализации нужно сделать следующие действия: выделить из сложного высказывания простые и превратить их в логические переменные. Затем каждая логическая связка превращается в логическую операцию. В описанных действиях остаётся два непонятных момента. Первый – что такое логическая операция, и второй – каким образом логические связки превращаются в логические операции. Будем последовательно отвечать на эти вопросы.
Для того чтобы определить операцию, необходимо указать количество операндов (объектов, над которыми выполняется операция) их тип и результат выполнения операции. Логические операции чаще всего имеют два операнда, как и математические. Однако мы также будем изучать операции, которые имеют всего один операнд. Независимо от количества операнды должны быть логического типа, то есть иметь значение истина, либо ложь. Результатом логической операции также является логическое значение – истина или ложь. Для того чтобы немного сократить запись, условимся в дальнейшем логическое значение «истина» обозначать единичкой `(1)`, а логическое значение – «ложь» – нулём `(0)`.
Очевидно, что если у операции два операнда, и значением каждого является `0` или `1`, то существует всего четыре набора значений операндов `(00, 01, 10, 11)`. Для каждого из наборов необходимо определить значение логической операции. Удобно это представлять в виде таблицы. Таблицы соответствия значений логических операций набору значений операндов называются таблицами истинности.
Сейчас мы познакомимся с шестью основными логическими операциями. Каждая из них имеет несколько названий и обозначений.
Названия операции |
Возможные обозначения |
Отрицание, инверсия. |
`-, ~|, not` |
Конъюнкция, логическое умножение, операция И, операция AND. |
`&, ^^, *,` по аналогии с алгебраическим умножением может никак не обозначаться
|
Дизъюнкция, нестрогая дизъюнкция, логическое сложение, операция ИЛИ, операция OR. |
`|``, vv, +` |
Строгая дизъюнкция, разделительная дизъюнкция, исключающее ИЛИ, сложение по модулю `2`. |
`o+, Delta` |
Эквивалентность, эквиваленция, равенство, равнозначность. |
`iff, -=` |
Импликация, следование, следствие |
`=>, ->` |
Теперь для того чтобы строго определить эти логические операции, нам нужно для каждой из них выписать таблицу истинности. Все перечисленные операции кроме отрицания имеют два операнда. Знак операции в выражениях пишется между операндами (как в алгебре чисел). Операция отрицания имеет один операнд и в выражениях записывается либо в виде черты над операндом, либо в виде символа «приставка» слева от операнда.
Для того, чтобы не путаться и гарантированно перебрать все возможные комбинации значений операндов, принято записывать их в лексикографическом порядке (условно считается, что «ложь» `<` «истина»).
Таблица истинности для конъюнкции
Первый операнд |
Второй операнд |
Значение операции |
`0` |
`0` |
`bb0` |
`0` |
`1` |
`bb0` |
`1` |
`0` |
`bb0` |
`1` |
`1` |
`bb1` |
Таблица истинности для дизъюнкции
Первый операнд |
Второй операнд |
Значение операции |
`0` |
`0` |
`bb0` |
`0` |
`1` |
`bb1` |
`1` |
`0` |
`bb1` |
`1` |
`1` |
`bb1` |
Таблица истинности для строгой дизъюнкции
Первый операнд |
Второй операнд |
Значение операции |
`0` |
`0` |
`bb0` |
`0` |
`1` |
`bb1` |
`1` |
`0` |
`bb1` |
`1` |
`1` |
`bb0` |
Таблица истинности для эквивалентности
Первый операнд |
Второй операнд |
Значение операции |
`0` |
`0` |
`bb1` |
`0` |
`1` |
`bb0` |
`1` |
`0` |
`bb0` |
`1` |
`1` |
`bb1` |
Таблица истинности для импликации
Первый операнд |
Второй операнд |
Значение операции |
`0` |
`0` |
`bb1` |
`0` |
`1` |
`bb1` |
`1` |
`0` |
`bb0` |
`1` |
`1` |
`bb1` |
Таблица истинности для отрицания
Значение операнда |
Значение операции |
`0` |
`bb1` |
`1` |
`bb0` |
Теперь осталось лишь установить соответствие между логическими операциями и логическими связками в русском языке.
Логическая операция |
Логические связки в русском языке |
Отрицание |
Неверно что… |
Конъюнкция |
и, а, но, а также, при этом, одновременно с этим, хотя |
Дизъюнкция |
Или |
Строгая дизъюнкция |
или, либо |
Эквивалентность |
Тогда и только тогда когда, необходимо и достаточно чтобы |
Импликация |
если то, необходимо чтобы, достаточно чтобы |
Обратите внимание, что союз ИЛИ может означать, как строгую, так и нестрогую дизъюнкцию. Его интерпретация зависит от содержания (!!!) высказывания.
Рассмотрим высказывание: «Мы идём в кино в субботу или в воскресение». Здесь два простых высказывания: «Мы идём в кино в субботу» и «Мы идём в кино в воскресение». Между ними стоит союз ИЛИ, который можно интерпретировать двояко. В данном случае очевидно, что мы можем пойти в кино и в субботу, и в воскресение, поэтому дизъюнкция будет нестрогая. Возьмём две логические переменные – `p` и `q` и присвоим им простые высказывания. Тогда исходное высказывание в формализованном виде будет выглядеть, как `bb(pvvq)`.
Рассмотрим высказывание: «Я сейчас на севере Москвы или на юго-западе Москвы». Здесь тоже два простых высказывания, которые связаны союзом ИЛИ. Но в этом случае союз ИЛИ интерпретируется, как строгая дизъюнкция, поскольку нельзя одновременно находиться в двух местах. Таким образом, если снова взять логические переменные `p` и `q`, то получится следующая логическая формула: `bb(p"o+q)`.
Рассмотрим высказывание: «Для того чтобы четырёхугольник был квадратом, необходимо, чтобы все его стороны были равны». Здесь два простых высказывания: «Четырёхугольник является квадратом» и «Все стороны четырёхугольника равны». Присвоим их соответственно логическим переменным `p` и `q`. Логическая связка «необходимо, чтобы» - это импликация. Весь вопрос в том, что из чего следует. (Какая запись правильная: `bbp -> bbq` или `bbq ->bbp`?) Импликация ложна только в единственном случае: когда левый операнд имеет значение «истина», а правый – «ложь». Рассмотрим все возможные значения операндов и проанализируем, какая из ситуаций невозможна.
1) `p` и `q` ложны. Это значит, что четырёхугольник не является квадратом и его стороны не равны. Это возможная ситуация.
2) `p` – ложно, `q` – истинно. Это значит, что четырёхугольник не является квадратом, но стороны у него равны. Это возможно (ромб).
3) `p` – истинно, `q` – истинно. Это значит, что четырёхугольник является квадратом и стороны у него равны. Это возможная ситуация.
4) `p` – истинно, `q` – ложно. Это значит, что четырёхугольник является квадратом, но стороны у него не равны. Это невозможная ситуация.
Анализ ситуаций показывает, что левым операндом импликации должна быть переменная `p`. Таким образом, в формализованном виде исходное высказывание выглядит как `bb(p -> q)`.
Очень часто вместо «присвоим логическим переменным эти высказывания» говорят «обозначим высказывания следующим образом». В дальнейшем мы тоже будем использовать этот речевой оборот.
1.1 Алгоритмическая конструкция «Цикл»
Зачастую в задаче нужно повторять одни и те же действия много раз. Рассмотрим следующий пример: вывести на экран квадраты чисел от `1` до `100`.
Очевидно, что для решения этой задачи нам придётся `100` раз выполнять команду вывода соответствующего числа на экран. Писать `100` операторов вывода как-то не хочется (слишком трудоёмко), поэтому будем знакомиться с алгоритмической конструкцией, которая называется «цикл».
называется повторение фрагмента алгоритма несколько раз с возвратом в более раннюю точку исполнения алгоритма. Повторяемый при этом фрагмент алгоритма называется телом цикла.
Очевидно, что если возврат в более раннюю точку алгоритма происходит абсолютно всегда, то алгоритм никогда не доходит до своего завершения (выполняется бесконечно долго). Для предотвращения бесконечного повторения нужно поставить точку ветвления: в одной из веток будет возврат, а в другой - выход из цикла и дальнейшее продвижение по алгоритму.
В зависимости от положения точки ветвления выделяются циклы с предусловием (точка ветвления располагается перед телом цикла) и с постусловием (точка ветвления располагается после тела цикла).
1.2. Оператор while
В языке программирования есть несколько операторов цикла, реализующих как конструкцию с предусловием, так и конструкцию с постусловием. Познакомимся с ними.
Первый оператор цикла называется While и реализует алгоритмическую конструкцию с предусловием. В общем виде он записывается следующим образом:
while условие do оператор
Слова while и do являются служебными зарезервированными словами языка. Под условием (аналогично оператору if) понимается выражение, результат вычисления которого имеет тип boolean. Работает этот оператор следующим образом. Сначала вычисляется условие. Если в результате получилось true, то мы заходим в цикл, то есть выполняем тело цикла и возвращаемся вновь к вычислению условия. Если же получилось false, то происходит переход к следующему оператору в программы, и входа в цикл не будет. Фактически оператор while является многократным применением оператора if с пустой веткой else. Аналогично оператору if, тело цикла должно состоять из `1` оператора. Если нужно исполнить несколько, то следует использовать операторные скобки (begin end).
Возможна ситуация, когда цикл будет выполняться бесконечное количество раз (зациклится). Например, while 2*2=4 do… Что написать после do, совершенно не важно, важно, что оно будет выполняться, пока 2*2=4, а это всегда так, и никогда не изменится. Значит, чтобы избегать зацикливания, параметры условия должны быть переменными, например while x*x=4 do … Хотя это тоже не гарантирует отсутствие зацикливания. Поэтому при написании программ нужно всегда внимательно следить за тем, какие условия мы пишем в операторе цикла, чтобы не случилось ситуации зацикливания.
Также обратите внимание, что поскольку условие проверяется до входа в цикл, возможна ситуация, что при первой же проверке получится значение false и, соответственно, в цикл мы вообще не зайдём.
1.3. Примеры задач
Рассмотрим несколько примеров задач на оператор цикла.
Дано целое число, не меньшее `2`. Выведите его наименьший натуральный делитель, отличный от `1`.
Для решения этой задачи нам необходимо перебирать натуральные числа, начиная с двух и проверять каждое из них, не является ли оно делителем исходного числа. Процесс завершается, когда делитель найден. Очевидно, что процесс завершится всегда, поскольку в худшем случае число разделится само на себя. Приведём код программы.
var i,n:integer;
begin
readln(n);
i:=2;
while n mod i <> 0 do
i:=i+1;
end;
writeln (i);
end.
В первый день спортсмен пробежал `x` километров, а затем он каждый день увеличивал пробег на `10%` от предыдущего значения. По данному числу `y` определите номер дня, на который пробег спортсмена составит не менее `y` километров. Программа получает на вход действительные числа `x` и `y`. Программа должна вывести одно натуральное число.
В этой задаче нам нужно реализовать постепенное увеличение пробега. То есть, на каждом шаге цикла мы будем сохранять значение пробега в соответствующий день в одной переменной, а номер этого дня – в другой. Завершение, когда значение первой переменной станет не меньшим чем `y`. Приведём код программы. Все переменные, отвечающие за километры, имеют тип real (из условия).
var x,y:real; i:integer;
begin
readln(x,y);
i:=1;
while x<y do begin
x:=x/100*10+x;
i:=i+1;
end;
writeln(i);
end.
Дано натуральное число `N`. Вычислите его сумму цифр.
Для решения этой задачи на каждом шаге цикла нужно изменять наше число: при помощи операции mod можно выделить последнюю цифру из числа и прибавить её к сумме, а затем её надо выбросить из числа при помощи операции div. Делить нужно, естественно, на `10`. Критерий завершения – когда число станет равным нулю, ибо это будет означать, что мы уже рассмотрели все цифры и поделили на `10` однозначное число (по свойствам операции целочисленного деления известно, что при делении меньшего числа на большее получается ноль). Приведём код программы.
var a,n,s:integer;
begin
readln(n);
s:=0;
while n>0 do begin
a:=n mod 10;
s:=s+a;
n:=n div 10;
end;
writeln(s);
end.
Ввести целое число `n`. Вывести `"YES"`, если оно простое, и `"NO"`, если оно составное.
Эта задача демонстрирует сразу две важные вещи. Во-первых, как проверять делимость целых чисел, а во-вторых, технику флажков. Флажком называется переменная, которая имеет некоторое начальное значение и меняет его, если происходит определённое событие. Как правило, флажок имеет тип boolean.
В нашей задаче мы будем перебирать числа от `2` до квадратного корня из `n` и проверять, делится ли `n` на каждое из них. Изначально предположим, что `n` - простое, и присвоим флажку значение true, но если `n` поделится на какое-нибудь число, это будет значить, что оно составное, и, соответственно, флажок «упадёт» на значение false. Проверять на делимость нужно, сравнивая остаток от деления с нулём.
var n,i:integer;
f:boolean;
begin
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');
end.
1.4 Оператор repeat
Теперь познакомимся с другим оператором цикла, который реализует алгоритмическую конструкцию цикла с постусловием. Рассмотрим его синтаксис.
repeat
Оператор 1;
Оператор 2;
….
Оператор N
until условие
Все операторы, написанные между repeat и until, являются телом цикла. Это выгодно отличает оператор repeat от других циклов - составной оператор здесь не требуется, а операторными скобками можно считать слова repeat и until. Работает этот оператор по следующему алгоритму:
1) выполняется тело цикла;
2) вычисляется значение условия. Если получилось true, то выход из цикла и переход к следующему оператору программы, в противном случае переход к пункту 1.
Отличительная особенность оператора цикла repeat заключается в том, что тело всегда выполняется, по крайней мере, один раз. Это нужно учитывать в задачах при выборе оператора цикла. Аналогично оператору while, цикл repeat может зациклиться, правда в случае, когда условие никогда не принимает значение true, например, repeat…until 2*2=5.
Этот оператор цикла реализует следующую идею: «Повторять некоторую последовательность команд `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,' ');
end.
Согласитесь, что решение фактически в одну строчку выглядит гораздо приятнее, чем в `100` строк (если не пользоваться оператором цикла).
Необходимо сделать несколько замечаний по поводу цикла for.
1) Типы счётчика начального и конечного значений должны совпадать, при этом в настоящий момент из известных нам типов можно использовать только integer и boolean. Вещественный тип использовать нельзя.
2) Начальное и конечное значения вычисляются один раз до начала цикла (и после не перевычисляются). Рассмотрим пример.
i:=1; for i:=i to i do writeln('HI');
Этот оператор цикла выполнится всего один раз, а не бесконечно много.
3) В теле цикла значение счётчика изменять нельзя. Так прописано в стандарте языка Pascal, и это требование поддерживается в системах семейства Delphi и PascalABC. Однако в системах семейства Borland Pascal значение счётчика изменять можно, что может приводить к непредсказуемым последствиям (поэтому будем считать, что независимо от системы значение счётчика изменять нельзя).
4) После завершения цикла значение счётчика не определено, то есть нельзя считать, что оно равно конечному значению или больше на единицу и пользоваться этим в дальнейшем алгоритме.
5) Тело цикла по грамматике должно состоять только из `1` оператора. Если же там по алгоритму должно быть несколько, нужно использовать составной оператор. В этом смысле оператор for солидарен с операторами if и while.
6) Можно слово to заменить на слово downto. В этом случае значение счётчика после каждого выполнения тела цикла будет уменьшаться на `1`, а выход из цикла произойдёт, когда значение счётчика окажется меньше, чем конечное.
Выполнение любого оператора цикла можно завершить досрочно, если использовать процедуру break. На данном этапе она особенно актуальна, если надо досрочно прервать цикл for. Выполнение этой процедуры передаст управление на оператор, который следует за прерываемым оператором цикла.
Проиллюстрируем её работу следующим примером:
вводится натуральное число `x` `(2 <= x <= 30000)`. Выведите наименьший делитель числа `x`, отличный от `1`.
Мы уже разбирали алгоритм решения этой задачи выше. Продемонстрируем его с использованием цикла for.
var a,i: integer;
begin
readln(a);
for i := 2 to a do
if a mod i = 0 then
begin
writeln(i);
break;
end;
end.
В данном классе формулировка всех задач начинается со слов: «Вводится последовательность чего-нибудь…». Для простоты будем считать, что чисел - с ними мы умеем работать, но в общем случае это необязательно так. Далее нам нужно оценить какое-то свойство данной последовательности. Например, сколько в ней нулей, является ли она возрастающей (каждое следующее число больше предыдущего) и т. д. Причём, для оценки данного свойства, сохранение всей последовательности в памяти не требуется.
Общий алгоритм решения задач этого класса таков: мы считываем очередной элемент последовательности, обрабатываем его так, как поставлено в задаче, и после про него забываем. Для реализации данного алгоритма нам придётся поместить оператор ввода внутрь цикла.
Рассмотрим стандартные шаблоны решения задач данного класса:
Количество элементов в последовательности известно заранее (`N`).
readln(N);
for j:=1 to N do begin
read(a);
{Содержательна обработка}
end;
Обращаем внимание, что внутрь оператора цикла обязательно помещается оператор read, а не readln. Дело в том, что, как правило, числа будут вводиться в строчку и оператор ввода будет на каждом шаге забирать из буфера по `1` числу. Оператор readln при этом ещё удаляет из буфера всё лишнее до конца строки, поэтому числа прочитаны не будут. Количество элементов последовательности, как правило, задаётся отдельным числом в первой строке, поэтому его логичнее читать оператором readln.
Рассмотрим примеры задач данного класса.
Вводится натуральное число `N`, а затем `N` натуральных чисел, сумму которых необходимо вычислить.
var i,N,a,s:integer;
begin
readln(N);
s:=0;
for i:=1 to N do begin
read(a);
s:=s+a;
end;
writeln(s)
end.
Вводится натуральное число `N`, а затем `N` целых чисел. Выведите `"YES"`, если среди введенных чисел есть хотя бы один ноль, или `"NO"` в противном случае.
var n,i,k,a,s:integer;
begin
s:=0;
readln(n);
for i:=1 to n do begin
read(a);
if a=0 then k:=k+1;
end;
if k<>0
then writeln('YES')
else writeln('NO')
end.
Теперь рассмотрим второй тип задач из класса «Обработка последовательностей», когда количество элементов неизвестно заранее, но известен признак конца.
Признак конца - это служебный элемент, который в саму последовательность не входит. При обработке числовых последовательностей чаще всего признаком конца является ноль (но может быть и любое другое число). Наиболее распространённая ошибка - обработать признак конца как содержательный элемент (например, при расчёте среднего арифметического элементов последовательности). Поэтому порядок действий должен быть таким:
1) Считывание
2) Проверка на признак конца
3) Содержательная обработка
За 3 пунктом алгоритм замыкается в цикл. Выход из цикла - на втором пункте, в случае положительного ответа. Соответственно, шаблон алгоритма должен отражать данную логику действий.
read(a);
while a<>0 do begin
{содержательная обработка};
read(a)
end;
В теле цикла оператор ввода ставится последним, чтобы следующим действием за вводом было вычисление условия цикла (то есть, проверка на признак конца).
Программа получает на вход последовательность целых неотрицательных чисел. Ноль - признак конца. Вывести количество членов последовательности (не считая завершающего числа `0`).
var a,k:integer;
begin
read(a);
k:=0;
while a<>0 do begin
k:=k+1;
read(a);
end;
writeln(k);
end.
Вводится последовательность целых чисел. Ноль - признак конца. Вывести, сколько элементов данной последовательности больше (строго) предыдущего элемента.
При решении этой задачи нам нужно будет сохранять в отдельную переменную значение предыдущего числа перед вводом нового. Приведём код программы.
var a,pr,k:integer;
begin
read(a);
pr:=a;
k:=0;
while a<>0 do begin
if (a > pr) then k:=k+1;
pr:=a;
read(a);
end;
writeln(k);
end.
Вводится последовательность натуральных чисел. Ноль - признак конца. Вывести значение максимального элемента.
Это очень важная эталонная задача, которую обязательно надо уметь решать. Для поиска максимума применяется следующая стратегия. Нужно каждый элемент сравнить с текущим значением максимума и, если элемент оказался больше, то обновить текущее значение максимума. Рассмотрим код программы.
var a,m:integer;
begin
read(a);
m:=a;
while a<>0 do begin
if (a > m) then m:=a;
read(a);
end;
writeln(m);
end.
При решении этой задачи ещё остался вопрос корректной инициализации. В общем случае есть два способа.
Первый вариант - в качестве начального значения максимума брать «минус бесконечность» (для минимума - плюс бесконечность). Под «минус бесконечностью» в данном случае понимается некое число, которое гарантированно меньше чем любой элемент, который может нам встретиться. Инициализация бесконечностью допустима, если мы заранее знаем диапазон элементов последовательности. Это её недостаток, зато она пишется в один оператор присваивания.
Второй вариант - в качестве начального значения брать первый подходящий элемент последовательности. В случае глобального максимума берётся просто первый элемент последовательности. Сложнее в ситуации, когда первый элемент может оказаться неподходящим.
Найти максимальный чётный элемент последовательности в предположении, что он существует.
var a,m:integer;
begin
read(a);
while (a<>0)and(a mod 2 <> 0) do read(a);
m:=a;
while a<>0 do begin
if (a mod 2 = 0)and(a>m) then m:=a;
read(a);
end;
writeln(m);
end.
В прошлом задании мы работали с числовыми типами переменных и учили арифметику, теперь познакомимся с логическим типом переменных, который называется Boolean. Переменные этого типа имеют всего два значения - true и false (соответственно, «истина» и «ложь»). Подобно числовым переменным им можно присваивать значения при помощи оператора присваивания. При этом необходимо строго соблюдать правило совместимости типов. То есть, логическим переменным нельзя присваивать числовые значения, а числовым - логические. Так же можно выводить значения логических переменных на экран, а вот вводить их с клавиатуры нельзя!
В языке Pascal определены `6` операций сравнения, результатом которых является логическое значение:
1) «больше» (>)
2) «больше или равно» (>=)
3) «меньше» (<)
4) «меньше или равно» (<=)
5) «равно» (=)
6) «не равно» (<>).
Например, операция `5>2` всегда выдаст значение true, а операция `x<>3` выдаст значение true, если переменная `x` имеет любое значение, кроме `3`.
Сравнивать можно не только числа (причём как целые, так и вещественные), но и логические значения. При этом считается, что значение true больше, чем значение false.
При выполнении сравнений также необходимо соблюдать совместимость типов. То есть, можно сравнивать число с числом или логическое значение с логическим значением, но нельзя сравнивать число с логическим значением. Такое сравнение выдаст ошибку.
Помимо операций сравнения ещё существуют и логические операции:
1) and (конъюнкция, логическое умножение, операция «И»)
2) or (дизъюнкция, логическое сложение, операция «ИЛИ»)
3) not (отрицание, инверсия)
4) 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), которая применяется к целочисленному аргументу х:
odd(x) = true, если `x` нечётно;
odd(x) = false, если `x` чётно.
Приоритет операций в сложном выражении (содержащем в себе все виды операций, изученных нами) следующий:
1) Операция not.
2) Операции группы умножения and, *, /, div, mod
3) Операции группы сложения or, xor, +, -
4) Операции сравнения >, <, >=, <=, =, <>
Операции одного приоритета выполняются слева направо. Операции в круглых скобках имеют более высокий приоритет, чем операции вне скобок.
Рассмотрим несколько примеров на построение логических выражений. Пусть нам требуется записать логическое выражение по синтаксису языка программирования, имеющее значение true, в случае выполнения указанного условия.
Целое число `n` делится на `13`.
n mod 13 = 0
Надо проверять, что остаток от деления на `13` является нулём.
Целое число `n` делится на `13` и `7`.
(n mod 13 = 0) and (n mod 7 = 0)
Здесь надо проверить одновременное выполнение двух условий.
Переменная `x` имеет значение из отрезков `[2,5]` или `[-1,1]`.
(x>=2) and (x<=5) or (abs(x)<=1)
Из чисел `x`, `y`, `z` хотя бы два равны между собой.
(x = y) or (x = z) or (y = z)
Числа `x`, `y`, `z` равны между собой.
(x = y) and (x = z)
Обратите внимание, что согласно таблице приоритетов, операции сравнения имеют самый низкий приоритет. Однако, как правило, в сложных выражениях нужно сначала выполнить сравнения, а потом группировать их результаты при помощи логических операций. Поэтому не нужно забывать брать операции сравнения в скобки, чтобы не получить неправильный порядок действий.
В рассматриваемых ранее задачах на программирование процесс вычисления был линейным, то есть программа не должна была выполнять разные действия в зависимости от того, какие данные ей ввели. Теперь рассмотрим задачи с ветвящимся алгоритмом.
Ввести номер года. Вывести слово 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` и `с`, и если значение `a` - больше, поменяем их местами. После этих двух сравнений в переменной `a` гарантированно окажется наименьшее из трёх чисел. Осталось сравнить переменные `b` и `c`, и в случае, когда в переменной `b` находится большее значение, поменять их местами.
Очевидно, что в этом алгоритме у нас три сравнения, следовательно, три последовательных условных оператора. При этом в каждом из них какие-то действия (поменять местами значения двух переменных) нужно выполнять только в ветке then, в ветке else (например, если в первом сравнении в переменной a находится уже более маленькое число, чем в переменной `b`) никаких действий выполнять не нужно. Рассмортим код программы: В этом случае, грамматика языка программирования позволяет вообще не записывать даже слово else. Такая конструкция называется сокращённой формой условного оператора.
var a,b,c,x:integer;
begin
writeln('введите три целых числа ');
readln(a,b,c);
if a>b then begin x:=a; a:=b; b:=x end;
if a>c then begin x:=a; a:=c; c:=x end;
if b>c then begin x:=b; b:=c; c:=x end;
writeln(a,b,c);
readln
end.
Как видно из примера, грамматика языка программирования позволяет вообще не записывать даже слово else, в случае, когда там не надо выполнять никаких действий. Такая конструкция называется сокращённой формой условного оператора. При использовании сокращённой формы условного оператора, если при вычислении логического выражения получилось значение false, то управление передаётся на следующий оператор программы.
Использование сокращённой формы условного оператора порождает проблему неоднозначности интерпретации логики действий программы в случае вложенных условных операторов. Рассмотрим следующий пример:
if x>0
then if y>0
then z:=0
else c:=7;
Вопрос состоит в том, какой из двух условных операторов является полным, а какой - сокращённым. К сожалению, ответ на этот вопрос существует только в виде дополнительного семантического правила языка программирования. Принято, что ветка else всегда относится к ближайшему if без else (по принципу правильной скобочной системы). То есть, в нашем случае внутренний условный оператор является полным, а внешний - сокращённым. Если же мы хотим добиться обратной логики действий (чтобы внешний условный оператор был полным), нам необходимо заключить внутренний условный оператор в операторные скобки. Выглядеть это будет следующим образом:
if x>0
then begin
if y>0
then z:=0
end
else c:=7;
При написании программ с ветвлениями очень часто возникает ситуация, когда ветвей становится слишком много. Поэтому приходится задумываться о том, как ничего не упустить из рассмотрения, как не рассматривать несущественные случаи и как обеспечить выполнение ровно одной ветви при разборе случаев.
Начнём с ответа на последний вопрос. Для того, чтобы обеспечить выполнение ровно одной ветви алгоритма, необходимо записывать весь разбор случаев в виде одного условного оператора. Конечно же, он будет сложный, с вложенными многоуровневыми проверками. Однако, если в итоге условный оператор, реализующий разбор случаев, один (а не несколько, записанных через точку с запятой), то это гарантирует нам, что в итоге выполнится ровно одна ветвь алгоритма.
Для того, чтобы не упустить из рассмотрения никаких случаев и не рассматривать несущественные случаи, нужно перебирать их не в случайном порядке, а по какой-либо стратегии. Сейчас мы рассмотрим одну из стратегий разбора случаев, которую условно можно назвать «Естественное возникновение». Её суть заключается в следующем: Изначально, мы решаем задачу так, будто бы никакого деления на случаи нет, а появляется оно лишь тогда, когда выполнить основной сценарий невозможно.
Рассмотрим следующий пример задачи:
Решить в целых числах линейное уравнение `ax=b`.
На вход программе здесь будут подаваться коэффициенты уравнения, а программа должна будет либо вычислить корень, либо вывести сообщение об особой ситуации (нет корней, бесконечно много корней и т. д.). Будем разбирать случаи согласно нашей стратегии. Сначала посмотрим, как мы в принципе решаем подобное уравнение. Для нахождения значения `x` нужно коэффициент `b` разделить на коэффициент `a`. Очевидно, что это невозможно сделать, если `a=0`. Поэтому первая проверка, которая делит всё множество случаев на две принципиально разные ветки: верно ли, что `a=0`? Если это так, то у нас получается уравнение `0x=b`, существование решений которого зависит от значения `b`. Если `b=0`, то решений бесконечно много, если же это не так, то решений нет вообще. Вернёмся к проверке коэффициента `a`. Если он не равен нулю, то это означает, что уравнение имеет единственное решение. Вопрос теперь в том, целое оно или нет. Поэтому здесь нужно будет проверить, что `b` нацело делится на `a` (остаток от деления должен быть равен нулю). Если это так, то находится единственное решение, если же нет, то целых решений у уравнения нет. Запишем теперь все наши рассуждения в виде программы:
var a,b:integer;
begin
readln(a,b);
if a=0
then if b=0
then writeln('many solutions')
else writeln('no solution')
else if b mod a = 0
then writeln( b div a)
else writeln('no solution')
end.
Мы видим, что программа получилось достаточно удобно читаемой и содержит только очень простые проверки (без логических связок). Простота проверок является одним из существенных достоинств используемой стратегии разбора случаев. К сожалению, это именно стратегия, а не алгоритм. Поэтому существует много задач, где такое рассуждение не сработает, однако рекомендуется взять данный метод на вооружение.
Теперь вам будут предложены контрольные вопросы и задачи. За каждый правильный ответ будут ставиться баллы. Максимальное количество баллов за задание указано в скобках после его номера. Если задание стоит более одного балла, то возможно получить частичный балл за частично верное решение. Имейте в виду, что более объёмные и сложные задания стоят дороже. Итоговая оценка будет определяться по сумме набранных баллов. Желаем успеха!
Основой изучения курса химии является атомно-молекулярная теория. Вещества состоят из молекул, а молекулы - из атомов. Атомы чрезвычайно малы и на кончике иглы помещаются миллиарды атомов. Тем не менее, наука достигла такого уровня, что различает атомы по размерам, массе и свойствам. В настоящее время различают 109 видов атомов, из которых состоят все вещества.
Химический элемент - это определенный вид атомов.
Каждый химический элемент имеет три формы существования - свободные атомы, простые вещества и сложные вещества. Атомы могут существовать изолированно друг от друга в виде свободных атомов, а могут объединяться друг с другом в молекулы. Если соединяются одинаковые атомы, то образуются простые вещества, если же разные - то сложные вещества.
Например, водород, на Солнце существует поодиночке, т. е. в виде изолированных атомов из-за высокой температуры. А на Земле - в молекулярном виде, два атома водорода соединяются друг с другом, и образуется простое вещество - водород, который является самым легким газом. Но элемент водород способен соединяться не только друг с другом, но и с другими атомами. Если два атома водорода соединяются с одним атомом кислорода, то получается молекула воды. Например, кварц состоит из атомов кислорода и кремния, негашеная известь - из атомов кальция и кислорода.
Свободные (изолированные атомы) - водород (на Солнце), инертные газы (на Земле), при очень высоких температурах - атомы всех химических элементов.
Простые вещества - водород, кислород, медь, железо, сера, золото, серебро.
Сложные вещества - вода, сахар, углекислый газ, соль.
Атомы имеют ничтожно малые размеры, следовательно, возникает необходимость выбора эталона атомной массы. Как известно, исторический путь выбора установления атомных масс был непростым и непрямым. Ученые на протяжении многих веков занимались этим вопросом. Массы атомов так малы, что даже на самых точных аналитических весах такую массу взвесить было невозможно. Можно было только установить относительные массы. В связи с этим возникла необходимость выбрать особую единицу измерения массы, особый эталон. В качестве первого эталона была выбрана масса атома водорода.
С помощью химического анализа Ж. Гей-Люссак установил, что в воде на `12,06` г водорода приходится `87,4` г кислорода. Какой вывод об относительной массе атомов кислорода вы сделали бы из полученных данных?
Из данных задачи можно рассчитать, во сколько раз масса атома кислорода больше массы атомов водорода:
`(m("O"))/(m("H"))=(8,74)/(12,06)=7,25`.
В современной науке (с 1961 года) за единицу атомной массы принята а. е .м., составляющая `1//12` часть массы атома изотопа углерода $$ {}^{12}\mathrm{C}$$.
Относительной атомной массой элемента называется отношение его массы к атомной единице массы и обозначается `A_r`.
Отсюда можно рассчитать относительную атомную массу, например, водорода:
`(A_r("H")=1,674*10^(-27) "кг")/(1//12*1,993*10^(-26) "кг")=1,0079`.
Атомную массу чрезвычайно редко измеряют в граммах, поэтому часто слово «относительная» опускают.