<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Образовательные материалы &#187; Информатика</title>
	<atom:link href="http://kshu.su/?cat=4&#038;feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://kshu.su</link>
	<description>Ещё один сайт на WordPress</description>
	<lastBuildDate>Thu, 06 Feb 2025 15:28:59 +0000</lastBuildDate>
	<language>ru-RU</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.0.38</generator>
	<item>
		<title>ЕГЭ 27 Демо</title>
		<link>http://kshu.su/?p=248</link>
		<comments>http://kshu.su/?p=248#comments</comments>
		<pubDate>Wed, 01 Jun 2022 02:35:30 +0000</pubDate>
		<dc:creator><![CDATA[Kirill Schurakhtenkov]]></dc:creator>
				<category><![CDATA[Информатика]]></category>

		<guid isPermaLink="false">http://kshu.su/?p=248</guid>
		<description><![CDATA[Подробные решения 27-х заданий из демонстрационных вариантов ЕГЭ по информатике за 2016, 2018-2023 г. Пример. ЕГЭ 2023 №27 Демо У медицинской компании есть N пунктов приёма биоматериалов на анализ. Все пункты расположены вдоль автомагистрали и имеют номера, соответствующие расстоянию от нулевой отметки до конкретного пункта. Известно количество пробирок, которое ежедневно принимают в каждом из пунктов. [&#8230;]]]></description>
				<content:encoded><![CDATA[<p class="Content2">Подробные решения 27-х заданий из демонстрационных вариантов ЕГЭ по информатике за 2016, 2018-2023 г.</p>
<p><span id="more-248"></span></p>
<div class="Header2"><strong>Пример. ЕГЭ 2023 №27 Демо</strong></div>
<p class="Content2">У медицинской компании есть N пунктов приёма биоматериалов на анализ.  Все  пункты  расположены  вдоль  автомагистрали  и  имеют  номера,  соответствующие расстоянию от нулевой отметки до конкретного пункта.  Известно количество пробирок, которое ежедневно принимают в каждом из  пунктов.  Пробирки  перевозят  в  специальных  транспортировочных  контейнерах вместимостью не более 36 штук. Каждый транспортировочный  контейнер  упаковывается  в  пункте  приёма  и  вскрывается  только   в лаборатории.</p>
<p class="Content2">Стоимость  перевозки  биоматериалов  равна  произведению  расстояния  от  пункта  до  лаборатории  на  количество  контейнеров  с пробирками.  Общая  стоимость перевозки за день равна сумме стоимостей перевозок из каждого  пункта  в  лабораторию.  Лабораторию  расположили  в  одном  из  пунктов  приёма  биоматериалов  таким  образом,  что  общая  стоимость  доставки  биоматериалов из всех пунктов минимальна.</p>
<p class="Content2">Определите  минимальную  общую  стоимость  доставки  биоматериалов  из  всех пунктов приёма в лабораторию.</p>
<p class="Content2"><i>Входные данные</i></p>
<p class="Content2">Дано  два  входных  файла ( файл  A  и  файл  B),  каждый  из  которых   в первой строке содержит число N (1 &#8804; N &#8804; 10 000 000) – количество пунктов  приёма  биоматериалов.  В  каждой  из  следующих  N  строк  находится  два  числа:  номер  пункта  и  количество  пробирок  в  этом  пункте ( все  числа  натуральные, количество пробирок  в каждом пункте не  превышает 1000).  Пункты перечислены в порядке их расположения вдоль дороги, начиная от  нулевой отметки.</p>
<p class="Content2">В ответе укажите два числа: сначала значение искомой  величины для файла А, затем – для файла B.</p>
<p class="Content2"><i>Типовой пример организации данных во входном файле</i></p>
<p class="Content2">6</br>1 100</br>2 200</br>5 4</br>7 3</br>8 2</br>10 190</p>
<p class="Content2"><i>При  таких  исходных  данных  и  вместимости  транспортировочного  контейнера,  составляющей 96 пробирок,  компании  выгодно  открыть  лабораторию  в  пункте 2. В  этом  случае  сумма  транспортных  затрат  составит: 1&#183;2 + 3&#183;1 + 5&#183;1 + 6&#183;1 + 8&#183;2.</i></p>
<p class="Header2">Решение:</p>
<p class="Header3">Что просят?</p>
<p class="Content2">Найти такой пункт куда дешевле доставлять контейнеры с пробирками из других пунктов. Для этого нужно посчитать стоимость доставки для каждого пункта.</p>
<p class="Header3">Как считать стоимость?</p>
<p class="Content2">Пусть у нас только 4 пункта:</p>
<div id="block10x10center"><img src="wp-content/uploads/informatics/ege-c4_27_00.png" /></div>
<p class="Content2">Посчитаем стоимость доставки по формуле |расстояние| * боксы (для каждого пункта считаем расстояние к нему, умноженное на кол-во боксов каждого пункта):</p>
<table class=table_11Tahoma_noBorder>
<tr align="center">
<td width="100">|1-1|&#215;3+</td>
<td width="100">|3-1|&#215;3+</td>
<td width="100">|6-1|&#215;3+</td>
<td width="100">|9-1|&#215;3+</td>
</tr>
<tr align="center">
<td>|1-3|&#215;2+</td>
<td>|3-3|&#215;2+</td>
<td>|6-3|&#215;2+</td>
<td>|9-3|&#215;2+</td>
</tr>
<tr align="center">
<td>|1-6|&#215;4+</td>
<td>|3-6|&#215;4+</td>
<td>|6-6|&#215;4+</td>
<td>|9-6|&#215;4+</td>
</tr>
<tr align="center">
<td>|1-9|&#215;1=</td>
<td>|3-9|&#215;1=</td>
<td>|6-9|&#215;1=</td>
<td>|9-9|&#215;1=</td>
</tr>
<tr align="center">
<td>32</td>
<td>24</td>
<td>24</td>
<td>48</td>
</tr>
</table>
<p class="Content2">Последние числа – это стоимость доставки боксов в текущий пункт. Например, стоимость доставки в первый пункт равна 32, во второй 24 и т.д. Результаты получены квадратичным(неэффективным) алгоритмом:</p>
<pre><ps>
   cst[] = [0 0 0 0 0 0] <cm>; массив стоимостей</cm>
   dst[] = [1 2 5 7 8 10] <cm>; расположения пунктов</cm>
   box[] = [2 3 1 1 1 2] <cm>; боксы (контейнеры)</cm>
   Для i от 1 до N <cm>; dst[i] - предполагаемый пункт</cm>
   <cm>; dst[j] – отсюда повезём боксы(box[j]) в i-й пункт</cm>
      Для j от 1 до N 
         cst[i] = cst[i] + |dst[i]-dst[j]| &#215; box[j]
</ps></pre>
<p class="Header3">Эффективный алгоритм</p>
<p class="Content2">Получим числа 32, 24, 24, 48 эффективным(не квадратичным) способом. Для начала вычислим первое число (32):</p>
<pre><ps>
   cst[] = [0 0 0 0] <cm>; массив стоимостей</cm>
   Для i от 1 до N ;
      cst[1] = |dst[i]-dst[1]| &#215; box[i]

   <cm>; cst[] = [38 0 0 0] получили первое число</cm>
</ps></pre>
<p class="Content2">32 – это стоимость доставки в 1-й пункт из всех остальных пунктов. Сюда входят стоимости всех боксов справа от первого пункта и не входят боксы собственно 1-го пункта(1-й пункт не доставляет боксы сам себе – |1-1|&#215;3=0).</p>
<p class="Content2">Чтобы вычислить стоимости доставок в следующие пункты, воспользуемся данными о доставках, хранящихся в предыдущих пунктах. Когда мы будем получать стоимости доставок в следующие пункты, вычислять заново все боксы не нужно. Нужно лишь на каждом шаге подкорректировать данные предыдущих пунктов. Например, рассмотрим вычисление стоимости для 2-го пункта:</p>
<p class="Content2">У 2-го пункта, предыдущий пункт – 1, его стоимость 32. Это число, для 2-го пункта, содержит недостающие и лишние данные. Недостающие данные – это та стоимость, которую мы не учли для 1-го пункта: для 1-го пункта не учтены 3 бокса (свои боксы себе возить ненужно), поэтому их нужно добавить для 2-го пункта. Лишние данные – это та стоимость, которая вошла при перевозки боксов всех пунктов, но на расстояние между 2-м и 1-м пунктом. Значит нужно вычесть длину смещения между нынешним пунктом(2) и предыдущим(1) умноженное на все боксы (другими словами, после смещения вправо предыдущая стоимость содержит лишнее значение равное длине смещения умноженное на все боксы).</p>
<p class="Header3">Вычитание лишних и добавление недостающих данных</p>
<p class="Content2">Вычитание лишних данных для 2-го пункта:</p>
<pre><ps>
32 – (3-1)*2 + (3-1)*4 + (3-1)*1
</ps></pre>
<p class="Content2">но лучше так:</p>
<pre><ps>
32 – (3-1)*(2 + 4 + 1)
</ps></pre>
<p class="Content2">Такое упрощение позволит получить оптимальный способ решения задачи – вторая скобка содержит сумму всех боксов(без 1-го пункта), и поскольку кол-во боксов известно заранее, их сумму можно вычислить один раз, для одного пункта, чтобы затем использовать для остальных пунктов. Например, для 3-го пункта вычитание будет таким:</p>
<pre><ps>
…– (6-3)*(4 + 1)
</ps></pre>
<p class="Content2">т.е. для 3-го пункта двойку убрали.</p>
<p class="Content2">Теперь рассмотрим добавление недостающих данных для 2-го пункта:</p>
<pre><ps>
…+ (3-1)*3
</ps></pre>
<p class="Content2">для 3-го:</p>
<pre><ps>
…+ (6-3)*(3+2)
</ps></pre>
<p class="Content2">Общая картина вычислений начиная со 2-го пункта (1-й пункт вычислен заранее неэффективным способом):</p>
<pre><ps>
32 – (3-1)*(2 + 4 + 1) + (3-1)*3 = 24
24 – (6-3)*(4 + 1) + (6-3)*(3 + 2) = 24
24 – (9-6)*(1) + (9-6)*(3 + 2 + 4) = 48
</ps></pre>
<pre><ps>
boxes = 10 <cm>; все боксы – посчитанные на 1-м проходе</cm>
left = box[1] <cm>;left=3 боксы слева</cm>
right = boxes - left <cm>; right=7 боксы справа</cm>
Для i от 2 до N <cm>; начинаем со второго пункта</cm>
   cst[i] = cst[i-1] - (dst[i] - dst[i-1]) * right
                     + (dst[i] - dst[i-1]) * left

<cm>; dst[i]-dst[i-1] – расстояние на которое мы переместились слева направо</cm>
<cm>; cst[i] – стоимость доставки в текущий пункт</cm>
<cm>; cst[i-1] – ранее вычисленная стоимость доставки, которую нужно подкорректировать</cm>

<cm>; настроим боксы от которых ушли и к которым пришли</cm>
   right = right - box[i]   
   left = left + box[i]

<cm>; получение числа 24 из 32 для 2-го пункта:</cm>
<cm>; 24 = 32 – (3 - 1) * 7 + (3 - 1) * 3</cm>
<cm>Настраиваем указатели для 3-го пункта</cm>
<cm>; right = 7-2  к этим пришли, зн. их вычтем</cm>
<cm>; left = 3+2  от этих ушли, зн. их добавим</cm>

<cm>; получение числа 24 из 24 для 3-го пункта:</cm>
<cm>; 24 = 24 – (6 - 3) * 5 + (6 - 3) * 5</cm>
<cm>Настраиваем указатели для 4-го пункта</cm>
<cm>; right = 5-4  к этим пришли, зн. их вычтем</cm>
<cm>; left = 5+4  от этих ушли, зн. их добавим</cm>

<cm>; получение числа 48 из 24 для 4-го пункта:</cm>
<cm>; 48 = 24 – (9 - 6) * 1 + (9 - 6) * 9</cm>
</ps></pre>
<p class="Header3">Полный код на Python</p>
<pre>
f=<b>open</b>('27_B.txt')
n=<b>int</b>(f.readline())

dst=[0]*n <cm>#расположения пунктов</cm>
box=[0]*n <cm>#контейнеры(боксы)</cm>
cst=[0]*n <cm>#стоимости</cm>
boxes=0 <cm>#все контейнеры(боксы)</cm>

k=36

<b>for</b> i <b>in</b> <gr>range</gr>(n):
    x,y=<b>map</b>(<b>int</b>,f.readline().split())

    dst[i]=x
    box[i]=y//k + 1*(y%k!=0)

    cst[0] += (dst[i]-dst[0])*box[i]
    boxes += box[i]<cm>#суммируем все боксы</cm>

left = box[0]
right = boxes - left
<b>for</b> i <b>in</b> <gr>range</gr>(1,n):
    cst[i] = cst[i - 1] - (dst[i] - dst[i - 1]) * right \
                        + (dst[i] - dst[i - 1]) * left

    right -= box[i]
    left += box[i]

<b>print</b>(<b>min</b>(cst))
</pre>
<div class="Header2"><strong>Пример. ЕГЭ 2022 №27 Демо</strong></div>
<p class="Content2">Дана последовательность из <i>N</i> натуральных чисел. Рассматриваются все её непрерывные подпоследовательности, такие что сумма элементов каждой из них кратна <i>k</i> = 43. Найдите среди них подпоследовательность с максимальной суммой, определите её длину. Если таких подпоследовательностей найдено несколько, в ответе укажите количество элементов самой короткой из них.</p>
<p class="Content2"><i>Входные данные</i></p>
<p class="Content2">Даны два входных файла (файл <i>A</i> и файл <i>B</i>), каждый из которых содержит в первой строке количество чисел <i>N</i> (1 &#8804; <i>N</i> &#8804; 10 000 000). Каждая из следующих <i>N</i> строк содержит одно натуральное число, не превышающее 10 000.</p>
<p class="Content2">Пример организации исходных данных во входном файле:</p>
<p class="Content2">7</br>1</br>3</br>4</br>93</br>8</br>5</br>95</p>
<p class="Content2">В ответе укажите два числа: сначала значение искомой длины для файла <i>А</i>, затем – для файла <i>B</i>.</p>
<p class="Content2"><b>Предупреждение:</b> для обработки файла <i>B</i> <b>не следует</b> использовать переборный алгоритм, вычисляющий сумму для всех возможных вариантов, поскольку написанная по такому алгоритму программа будет выполняться слишком долго</p>
<p class="Header3">Эффективный поиск подпоследовательности</p>
<p class="Content2">Рассмотрим суть эффективного поиска числовой подпоследовательности, сумма которой делится на нужное число без остатка. Для простоты возьмём такую последовательность, у которой две подпоследовательности делятся, например, на 10: [2 1 <markGray>5 7 8</markGray> 4 <markGray>12 8</markGray>]</p>
<p class="Content2">Просуммируем каждое число последовательности и разместим полученные суммы под числами последовательности:</p>
<table class=table_10CorierNew>
<tr align="center">
<td width="30">2</td>
<td width="30">1</td>
<td width="30">5</td>
<td width="30">7</td>
<td width="30">8</td>
<td width="30">4</td>
<td width="30">12</td>
<td width="30">8</td>
<td width="30">Последовательность</td>
</tr>
<tr align="center">
<td width="30">2</td>
<td width="30" bgcolor="#b6dde8">3</td>
<td width="30">8</td>
<td width="30">15</td>
<td width="30" bgcolor="#b6dde8">23</td>
<td width="30">27</td>
<td width="30">39</td>
<td width="30">47</td>
<td width="30">Суммы</td>
</tr>
</table>
<p class="Content2">Чтобы найти первую подпоследовательность (5 7 8), посмотрим на сумму, которая стоит под числом 8. Это число 23. Его можно превратить в 20, если вычесть 3, а число 3 стоит как вторая сумма. Значит, для поиска подпоследовательности, сумма которой делится на 10 без остатка, нужно из одной суммы вычесть другую: 2+1+5+7+8 – 2+1 = 5+7+8.</p>
<p class="Content2">Подпоследовательность 2 1 называют «хвостом» подпоследовательности  2 1 5 7 8, который нужно вычесть, чтобы получить нужный результат:</p>
<table class=table_10CorierNew>
<tr align="center">
<td width="30" bgcolor="#b8cce4">2</td>
<td width="30" bgcolor="#b8cce4">1</td>
<td width="30" bgcolor="#b8cce4">5</td>
<td width="30" bgcolor="#b8cce4">7</td>
<td width="30" bgcolor="#b8cce4">8</td>
<td width="160"></td>
</tr>
<tr align="center">
<td width="30" bgcolor="#e5b8b7">2</td>
<td width="30" bgcolor="#e5b8b7">1</td>
<td width="30"></td>
<td width="30"></td>
<td width="30"></td>
<td width="130">Хвост</td>
</tr>
<tr align="center">
<td width="30"></td>
<td width="30"></td>
<td width="30" bgcolor="#d9e3bc">5</td>
<td width="30" bgcolor="#d9e3bc">7</td>
<td width="30" bgcolor="#d9e3bc">8</td>
<td width="130">Нужный результат</td>
</tr>
</table>
<p class="Content2">Как теперь найти, что из общей суммы: 2+1+5+7+8 нужно вычесть именно 2+1, чтобы гарантированно получить результат, который делится на 10 без остатка?</p>
<p class="Content2">Есть такое правило:</p>
<div id="block10x10center"><img src="wp-content/uploads/informatics/ege-c4_27_01.png" /></div>
<p class="Content2">…которое говорит, что если два числа при делении на <i>k</i> дают один и тот же остаток, то их разность делится на <i>k</i> без остатка. У нас <i>a</i> – это сумма 2+1+5+7+8, <i>b</i> – это сумма 2+1, а <i>k</i> это 10</p>
<p class="Content2">Теперь исследуем остатки, которые получатся при делении каждой суммы на 10:</p>
<table class=table_10CorierNew>
<tr align="center">
<td width="30">2</td>
<td width="30">1</td>
<td width="30">5</td>
<td width="30">7</td>
<td width="30">8</td>
<td width="30">4</td>
<td width="30">12</td>
<td width="30">8</td>
<td width="30">Последовательность</td>
</tr>
<tr align="center">
<td width="30">2</td>
<td width="30">3</td>
<td width="30">8</td>
<td width="30">15</td>
<td width="30">23</td>
<td width="30">27</td>
<td width="30">39</td>
<td width="30">47</td>
<td width="30">Суммы</td>
</tr>
<tr align="center">
<td width="30">2</td>
<td width="30" bgcolor="#e5b8b7">3</td>
<td width="30">8</td>
<td width="30">5</td>
<td width="30" bgcolor="#e5b8b7">3</td>
<td width="30" bgcolor="#d9e3bc">7</td>
<td width="30">9</td>
<td width="30" bgcolor="#d9e3bc">7</td>
<td width="30">Остатки</td>
</tr>
</table>
<p class="Content2">Есть одинаковые остатки! Это поможет найти и вычесть хвост у последовательности, и задача решена. Рассмотрим как следить за остатками.</p>
<p class="Header3">Массив остатков</p>
<p class="Content2">Наша задача сохранить все суммы, и пометить какой у них остаток при делении на <i>k</i>. Для этого создадим массив <i>tailSum</i> размером <i>k</i>. Индекс элемента этого массива – это остаток при делении очередной суммы на <i>k</i>. Эту сумму нам нужно занести в массив по её остатку. Тем самым мы пометим под каким остатком хранится та или иная сумма.</p>
<p class="Content2">Так вот, один и тот же остаток должен встретится ещё раз в процессе суммирования. А это значит, что в массиве <i>tailSum</i> – по индексу остатка – уже сохранена ранее сумма, и если её вычесть из общей суммы(<i>totalSum</i>), – получится нужная сумма(<i>curSum</i>).</p>
<p class="Content2">Рассмотрим всё это по шагам:</p>
<pre>
 m = [2 1 5 7 8 4 12 8]
 k = 10
 totalSum = 0
 tailSum - [0 0 0 0 0 0 0 0 0 0]

  1 шаг
 totalSum = 2
 <cm>;если tailSum[2 % k] = 0</cm>
 <cm>;то в tailSum[2 % k] = 2</cm>
 tailSum - [0 0 2 0 0 0 0 0 0 0]
  
  2 шаг
 totalSum = 3
 <cm>;если tailSum[3 % k] = 0</cm>
 <cm>;то в tailSum[3 % k] = 3</cm>
 tailSum - [0 0 2 3 0 0 0 0 0 0]
  
  3 шаг
 totalSum = 8
 <cm>;если tailSum[8 % k] = 0</cm>
 <cm>;то в tailSum[8 % k] = 8</cm>
 tailSum - [0 0 2 3 0 0 0 0 8 0]
  
  4 шаг
 totalSum = 15
 <cm>;если tailSum[15 % k] = 0</cm>
 <cm>;то в tailSum[15 % k] = 15</cm>
 tailSum - [0 0 2 3 0 15 0 0 8 0]
  
  5 шаг
 totalSum = 23
 <cm>;если tailSum[23 % k] != 0</cm>
 <cm>;то curSum = totalSum - tailSum[23 % k] 23 – 3</cm>
 curSum = 20 <cm>;нужная сумма</cm>
</pre>
<p class="Header3">Программа на Python</p>
<pre>
   m = [2,1,5,7,8,4,12,8] <cm>#данная последовательность</cm>
   n = <b>len</b>(m)
   k = 10
   totalSum = 0
   tailSum = [0]*k  <cm>#[0 0 0 0 0 0 0 0 0 0]</cm>
   <b>for</b> i <b>in</b> <gr>range</gr>(n):
      totalSum += m[i]
      r = totalSum % k
      <b>if</b> tailSum[r] == 0: <cm>#был ли такой остаток или нет?</cm>
      <cm># такого остатка ещё не было =>
      сохраняем сумму(потенциальный хвост)
      и помечаем под каким она остатком</cm>
         tailSum[r] = totalSum
      <b>else</b>: <cm>#такой остаток уже есть => 
      вычитаем предыдущую сумму(хвост) из текущей</cm>
         curSum = totalSum - tailSum[r]
</pre>
<p class="Header3">Длина подпоследовательности</p>
<p class="Content2">Длина подпоследовательности – это разность между двумя значениями циклической переменной <i>i</i>. Первое значение (начало подпоследовательности) сохраним в массив <i>tailLen</i>. Второе значение (конец подпоследовательности). Первое значение соответствует моменту, когда мы сохраняли первую сумму для отсечения хвоста, второе – когда нашли в <i>tailSum</i> не нулевое значение. Следовательно, <i>tailLen</i> аналогичен <i>tailSum</i>:</p>
<pre>
   …
   tailLen = [0]*k
   <b>for</b> i <b>in</b> <gr>range</gr>(n):
      …
      <b>if</b> tailSum[r] == <b>None</b>:
         …
         <cm>#i – первое значение длины - сохраним в tailLen</cm>
		 tailLen[r] = i
      <b>else</b>:
          …
		 <cm>#i – второе значение длины - из него вычтем первое</cm>
         curLen = i - tailLen[r]

</pre>
<p class="Header3">
<p class="Header3">Максимальная и самая короткая сумма</p>
<p class="Content2">Максимальная сумма находится обычным делом. Кроме этого, текущая сумма может быть равной максимальной(встретились две одинаковые нужные суммы), тогда нужно убедиться, что кол-во элементов текущей суммы(<i>currLen</i>) меньше кол-ва элементов максимальной суммы(<i>maxSum</i>). Раз так –  модифицируем переменные <i>maxSum</i> и <i>minLen</i> текущими значениями суммы и длины:</p>
<pre>
   …
   maxSum = minLen = 0
   <b>for</b> i <b>in</b> <gr>range</gr>(n):
   …
   <b>else:</b>
      …
      <b>if</b> curSum > maxSum <b>or</b> \
         (curSum == maxSum <b>and</b> curLen < minLen):
            maxSum = curSum
            minLen = curLen


</pre>
<p class="Header3">Полный код на Python (подпоследовательность не сначала)</p>
<pre>
   m = [2,1,5,7,8,4,12,8]
   n = <b>len</b>(m)
   tailSum=[0]*k
   tailLen=[0]*k
   minLen=<b>float</b>(<gr>'inf'</gr>)
   totalSum=curSum=maxSum=curLen=0
   <b>for</b> i <b>in</b> <gr>range</gr>(n):
      totalSum += m[i]
      r = totalSum % k
       <b>if</b> tailSum[r] == 0:
          tailSum[r] = totalSum 
          tailLen[r] = i
       <b>else</b>: 
          curSum = totalSum - tailSum[r]
          curLen = i - tailLen[r]
          <b>if</b> curSum > maxSum <b>or</b> \
            curSum == maxSum <b>and</b> curLen < minLen:
             maxSum = curSum
             minLen = curLen
   <b>print</b>(minLen,)
</pre>
<p class="Content2">Если нужная подпоследовательность вначале массива, то остаток <i>r</i> равен нулю, а <i>totalSum</i> – есть найденная сумма. При увеличении <i>totalSum</i> – сумма будет увеличиваться, значит проверять на максимум не нужно. Остаётся проверить длину на минимум:</p>
<p class="Header3">Полный код на Python (подпоследовательность сначала)</p>
<pre>
   m=[5,7,8,8,4,12]
   n = <b>len</b>(m)
   tailSum=[0]*k
   tailLen=[0]*k
   minLen=<b>float</b>(<gr>'inf'</gr>)
   totalSum=curSum=maxSum=curLen=0
   <b>for</b> i <b>in</b> <gr>range</gr>(n):
      totalSum += m[i]
      r = totalSum % k
       <b>if</b> r == 0 <b>and</b> i < minLen:
          maxSum = totalSum 
          minLen = i+1
   <b>print</b>(minLen,)
</pre>
<p class="Header3">Полный код на Python</p>
<pre>
   f=<b>open</b>('27_B.txt')
   n=<b>int</b>(f.readline())
   k=43
   totalSum=curSum=maxSum=curLen=0
   tailSum=[0]*k
   tailLen=[0]*k
   minLen=<b>float</b>(<gr>'inf'</gr>)
   <b>for</b> i <b>in</b> <gr>range</gr>(n):
      totalSum+=<b>int</b>(f.readline())
      r=totalSum%k
      <b>if</b> r!=0:
         <b>if</b> tailSum[r] == 0:
            tailSum[r] = totalSum
            tailLen[r] = i
         <b>else</b>:
            curSum = totalSum - tailSum[r]
            curLen = i - tailLen[r]
            <b>if</b> curSum > maxSum <b>or</b> \
              curSum == maxSum <b>and</b> curLen < minLen:
               maxSum = curSum
               minLen = curLen
      <b>elif</b> i < minLen:
         maxSum = totalSum
         minLen = i+1
<b>print</b>(minLen)
</pre>
<div class="Header2"><strong>Пример. ЕГЭ 2021 №27 Демо</strong></div>
<p class="Content2">Имеется набор данных, состоящий из пар положительных целых чисел. Необходимо выбрать из каждой пары ровно одно число так, чтобы сумма всех выбранных чисел не делилась на 3 и при этом была максимально возможной. Гарантируется, что искомую сумму получить можно.</p>
<p class="Content2">Программа должна напечатать одно число – максимально возможную сумму, соответствующую условиям задачи.</p>
<p class="Content2">Входные данные</p>
<p class="Content2">Даны два входных файла (файл <i>A</i> и файл <i>B</i>), каждый из которых содержит в первой строке количество пар <i>N</i> (1 &#8804; <i>N</i> &#8804; 10 000 000). Каждая из следующих <i>N</i> строк содержит два натуральных числа, не превышающих 10 000.</p>
<p class="Content2">Пример организации исходных данных во входном файле:</p>
<p class="Content2">6</br>1 3</br>5 12</br>6 9</br>5 4</br>3 3</br>1 1</p>
<p class="Content2">Для указанных входных данных значением искомой суммы должно быть число 32. </p>
<p class="Content2">В ответе укажите два числа: сначала значение искомой длины для файла <i>А</i>, затем – для файла <i>B</i>.</p>
<p class="Content2"><b>Предупреждение:</b> для обработки файла <i>B</i> <b>не следует</b> использовать переборный алгоритм, вычисляющий сумму для всех возможных вариантов, поскольку написанная по такому алгоритму программа будет выполняться слишком долго</p>
<p class="Header3">Сумма максимумов</p>
<p class="Content2">Выберем данную последовательность из шести пар и просуммируем максимальное число каждой пары:</p>
<table class=table_10CorierNew>
<tr align="center">
<td width="30">1</td>
<td width="30" bgcolor="#b6dde8">3</td>
</tr>
<tr align="center">
<td width="30">5</td>
<td width="30" bgcolor="#b6dde8">12</td>
</tr>
<tr align="center">
<td width="30">6</td>
<td width="30" bgcolor="#b6dde8">9</td>
</tr>
<tr align="center">
<td width="30" bgcolor="#b6dde8">5</td>
<td width="30">4</td>
</tr>
<tr align="center">
<td width="30" bgcolor="#b6dde8">3</td>
<td width="30">3</td>
</tr>
<tr align="center">
<td width="30" bgcolor="#b6dde8">1</td>
<td width="30">1</td>
</tr>
</table>
<pre>
   l = [1,5,6,5,3,1] <cm># первое число пары</cm>
   r = [3,12,9,4,3,1] <cm># второе число пары</cm>
   n = len(l) <cm># а можно и len(r)</cm>
   s = 0
   <b>for</b> i <b>in</b> <gr>range</gr>(n):
      a=l[i]; b=r[i]
      s += <b>max</b>(a, b)
</pre>
<p class="Content2">Сумма будет 33(переменная <i>s</i>). Если бы сумма не делилась на 3, то она бы являлась ответом. Но она делится, значит, одно максимальное число(неважно какое), которое попало в сумму, нужно поменять на минимальное из той же пары – да так поменять, что это минимальное в паре число, должно быть самым минимальным среди всех минимальных(это условие максимально возможной суммы).</p>
<p class="Content2">
<p class="Content2">
<p class="Header3">Поиск нужного минимума</p>
<p class="Content2">В нашем примере, вместо максимального числа 5, нужно использовать 4. Как его найти эффективно?</p>
<p class="Content2">В процессе суммирования находим минимальную разницу между парами, которая не делится на 3:</p>
<pre>
   ...
   min = 10001
   <b>for</b> i <b>in</b> <gr>range</gr>(n):
      ...
      d = <b>abs</b>(a-b)
      <b>if</b>(d%3 != 0) <b>and</b> (d < min):
         min = d
</pre>
<p class="Content2">Единица в последней паре не подойдёт в качестве минимума, потому что оба числа пары равны и от того первое выражение условия даст отрицание.</p>
<p class="Header3">Вывод на экран</p>
<p class="Content2">Переменную <i>min</i> применим, если сумма делится на 3, иначе выведем сумму:</p>
<pre>
   ...
   <b>for</b> i <b>in</b> <gr>range</gr>(n):
      ...
   <b>if</b> s%3==0:
      <b>print</b>(s-min)
   <b>else</b>:
      <b>print</b>(s)
</pre>
<p class="Header3">Полный код на Python</p>
<pre>
   f = <b>open</b>('27.txt')
   n = <b>int</b>(f.readline())
   s = 0
   min = 10001
   <b>for</b> i <b>in</b> <gr>range</gr>(n):
      a,b = <b>map</b>(<b>int</b>,f.readline().split())
      s += <b>max</b>(a,b)
      d = <b>abs</b>(a-b)
      <b>if</b>(d%3 != 0) <b>and</b> (d < min):
         min = d
<cm># вывод на экран</cm>
   <b>if</b> s%3==0:
      <b>print</b>(s-min)
   <b>else</b>:
      <b>print</b>(s)
</pre>
<div class="Header2"><strong>Пример. ЕГЭ 2020 №27 Демо</strong></div>
<p class="Content2">На вход программы поступает последовательность из <i>n</i> целых положительных чисел. Рассматриваются все пары элементов последовательности <i>a<sub>i</sub></i> и <i>a<sub>j</sub></i>, такие что <i>i</i> < <i>j</i> и <i>a<sub>i</sub></i> > <i>a<sub>j</sub></i> (первый элемент пары больше второго; <i>i</i> и <i>j</i>  – порядковые номера чисел в последовательности входных данных). Среди пар, удовлетворяющих этому условию, необходимо найти и напечатать пару с максимальной суммой элементов, которая делится на <i>m</i> = 120. Если среди найденных пар максимальную сумму имеют несколько, то можно напечатать любую из них.</p>
<p class="Content2"><b>Описание входных и выходных данных</b></p>
<p class="Content2">В первой строке входных данных задаётся количество чисел <i>n</i> (2 &#8804; <i>n</i> &#8804; 12 000). В каждой из последующих <i>n</i> строк записано одно целое положительное число, не превышающее 10 000.</p>
<p class="Content2">В качестве результата программа должна напечатать элементы искомой пары. Если таких пар несколько, можно вывести любую из них. Гарантируется, что хотя бы одна такая пара в последовательности есть.</p>
<p class="Content2"><i>Пример входных данных:</i></p>
<p class="Content2">6</br>60</br>140</br>61</br>100</br>300</br>59</p>
<p class="Content2"><i>Пример выходных данных для приведённого выше примера входных данных:</i></p>
<p class="Content2">140 100</p>
<p class="Content2"><i>Пояснение.</i>Из шести заданных чисел можно составить три пары, сумма элементов которых делится на m=120: 60+300, 140+100 и 61+59. Во второй и третьей из этих пар первый элемент больше второго, но во второй паре сумма больше.</p>
<p class="Content2">Требуется написать эффективную по времени и памяти программу для решения описанной задачи.</p>
<p class="Header3">Поиск пары</p>
<p class="Content2">Пары будут двух типов: каждый элемент пары не кратный <i>m</i>, а сумма элементов кратна, и каждый элемент пары кратный <i>m</i> – сумма также кратна.</p>
<p class="Content2">Рассмотрим, как искать пару, сумма которой кратна <i>m</i>, но каждый элемент не кратный. Есть правило:</p>
<div id="block10x10center"><img src="wp-content/uploads/informatics/ege-c4_27_02.png" /></div>
<p class="Content2">которое говорит, что если два числа при делении на <i>m</i> дают остатки, сумма которых делится на <i>m</i>, то и сумма чисел делится на <i>m</i>. Например: пусть <i>m</i>=5, <i>a</i>=8 и <i>b</i>=12, тогда:</p>
<div id="block10x10center"><img src="wp-content/uploads/informatics/ege-c4_27_03.png" /></div>
<p class="Content2">Теперь как найти, среди последовательности чисел, пару 8 и 12, сумма которой делится на 5.</p>
<p class="Content2">Удобнее всего через так называемый массив остатков <i>r</i> размером <i>m</i>. На самом деле элементы этого массива – это числа последовательности, а индексы этих элементов – остатки от деления элементов на <i>m</i>. Пусть наши 8 и 12 расположены в такой последовательности: [ 8 14 12 ], тогда массив остатков <i>r</i>[<i>m</i>] будет таким:</p>
<table class=table_10CorierNew>
<tr align="center">
<td width="30">0</td>
<td width="30">0</td>
<td width="30">0</td>
<td width="30">0</td>
<td width="30">0</td>
<td>массив <i>r</i></td>
</tr>
<tr align="center">
<td width="30">0</td>
<td width="30">0</td>
<td width="30">0</td>
<td width="30">0</td>
<td width="30" bgcolor="#b6dde8">14</td>
<td>r[14 % 5]=14</td>
</tr>
<tr align="center">
<td width="30">0</td>
<td width="30">0</td>
<td width="30">0</td>
<td width="30" bgcolor="#b6dde8">8</td>
<td width="30">14</td>
<td>r[8 % 5]=8</td>
</tr>
<tr align="center">
<td width="30">0</td>
<td width="30">0</td>
<td width="30" bgcolor="#b6dde8">12</td>
<td width="30">8</td>
<td width="30">14</td>
<td>r[12 % 5]=12</td>
</tr>
<tr align="center">
<td width="30">[0]</td>
<td width="30">[1]</td>
<td width="30">[2]</td>
<td width="30">[3]</td>
<td width="30">[4]</td>
<td>индексы-остатки </td>
</tr>
</table>
<p class="Content2">Мы ищем пару по индексам: пусть под одним индексом есть ненулевой элемент массива, тогда если мы обнаруживаем, что есть ещё ненулевой элемент, индекс которого даёт сумму с первым индексом кратную 5, то сумма элементов также кратна 5.</p>
<p class="Content2">Как найти 2-й индекс? По <i>m</i> и по 1-му индексу: 2-й индекс = <i>m</i> – 1-й индекс. В нашем случае 2-й индекс это 3, а 1-й – это 2. Всё потому что, когда мы проверяем число 8(индекс 3) - его пара под индексом 2 хранит нулевое значение и поэтому по 3-му индексу пару найти невозможно:</p>
<table class=table_10CorierNew>
<tr align="center">
<td width="30">0</td>
<td width="30">0</td>
<td width="30" bgcolor="#e5b8b7">0</td>
<td width="30" bgcolor="#b6dde8">8</td>
<td width="30">14</td>
<td><i>r</i>[5 - 3] это 0</td>
</tr>
<tr align="center">
<td width="30">[0]</td>
<td width="30">[1]</td>
<td width="30">[2]</td>
<td width="30">[3]</td>
<td width="30">[4]</td>
<td>индексы-остатки </td>
</tr>
</table>
<p class="Content2">Но когда проверяем число 12 (индекс 2) - его пара под индексом 3 хранит не нулевое значение:</p>
<table class=table_10CorierNew>
<tr align="center">
<td width="30">0</td>
<td width="30">0</td>
<td width="30">0</td>
<td width="30">8</td>
<td width="30">14</td>
<td></td>
</tr>
<tr align="center">
<td width="30">0</td>
<td width="30">0</td>
<td width="30" bgcolor="#b6dde8">12</td>
<td width="30" bgcolor="#d9e3bc">8</td>
<td width="30">14</td>
<td><i>r</i>[5 - 2] это 12</td>
</tr>
<tr align="center">
<td width="30">[0]</td>
<td width="30">[1]</td>
<td width="30">[2]</td>
<td width="30">[3]</td>
<td width="30">[4]</td>
<td>индексы-остатки </td>
</tr>
</table>
<p class="Content2">Вот тогда то, мы и находим нужную пару:</p>
<pre> 
   m = 5
   d = [8,14,12] <cm># последовательность</cm>
   r = [0,0,0,0,0] <cm># массив «остатков»</cm>
   <b>for</b> i <b>in</b> <gr>range</gr>(<gr>len</gr>(d)):
      a = d[i] <cm># a удобнее чем d[i]</cm>
      p = a % m
      <b>if</b> r[m-p]>0: <cm># false при a=8, true при a=12</cm> 
         <b>print</b> (r[m-p], " ", a) <cm># 8 12</cm>
      r[p] = a <cm># заполняем массив остатков (пока они различны)</cm>
</pre>
<p class="Header3">Первый больше второго</p>
<p class="Content2">По условию, первый элемент пары должен быть больше, значит наша последовательность - [ 8 14 12 ] - не содержит нужной пары. Поменяем местами 8 и 12 и в условии учтём, что предыдущий сохранённый элемент массива остатков больше чем текущий:</p>
<pre> 
   m = 5
   d = [12,14,8] <cm># последовательность</cm>
   r = [0,0,0,0,0] <cm># массив «остатков»</cm>
   <b>for</b> i <b>in</b> <gr>range</gr>(<gr>len</gr>(d)):
      a = d[i] <cm># a удобнее чем d[i]</cm>
      p = a % m
      <b>if</b> r[m-p]>a: <cm># предыдущий r[m-p] больше текущего a</cm> 
         <b>print</b> (r[m-p], " ", a) <cm># 8 12</cm>
      r[p] = a <cm># заполняем массив остатков (пока они различны)</cm>
</pre>
<p class="Content2">Теперь предыдущая последовательность - в связи с тем, что она неправильная - не будет найдена.</p>
<p class="Header3">Пара с максимальной суммой</p>
<p class="Content2">По условию, нужная пара должна давать максимальную сумму среди всех нужных пар, т.е. пар может быть несколько, а выбрать нужно ту, которая даёт максимальную сумму. Добавим в условие выражение, которое сравнивает сумму текущей пары с парой сохранённой ранее</p>
<p class="Content2">Кроме этого, нужно учесть, что в последовательности может быть не одно число с одним и те же остатком, тогда если оно больше предыдущего, то в массиве остатков меняем предыдущее на текущее. Если остатки разные, то массив остатков будет заполняться, так же как и раньше:</p>
<pre> 
   m = 5
   d = [22,38,8,14,2] <cm># Нужная 38 и 2 среди ещё одной 22 и 8</cm>
   r = [0,0,0,0,0] <cm># массив «остатков»</cm>
   left = 0; right = 0 <cm># элементы нужной пары</cm>
   <b>for</b> i <b>in</b> <gr>range</gr>(<gr>len</gr>(d)):
      a = d[i] <cm># a удобнее чем d[i]</cm>
      p = a % m
      <b>if</b> r[m-p]>a <b>and</b> r[m-p]+a > left+right:
         left = r[m-p]
         right = a
      <b>if</b> a>r[p]: <cm># a > предыдущего с таким же остатком</cm>
         r[p] = a <cm># значит заменим его на a</cm>
   <b>print</b> (l, " ", r) <cm># 38 2</cm>
</pre>
<p class="Content2">Один тип пары мы выбрали, переходим к другому типу – каждый элемент которого кратный <i>m</i>.</p>
<p class="Header3">Пара элементов кратные <i>m</i></p>
<p class="Content2">Случай с одной парой, причём пусть, первый элемент меньше второго(далее исправим): [10, 14, 15]</p>
<pre> 
   m = 5
   d = [5,14,10] <cm># последовательность</cm>
   r = [0,0,0,0,0] <cm># массив «остатков»</cm>
   <b>for</b> i <b>in</b> <gr>range</gr>(<gr>len</gr>(d)):
      a = d[i] <cm># a удобнее чем d[i]</cm>
      p = a % m
      <b>if</b> r[m-p]>0: <cm># false при a=8, true при a=12</cm> 
         <b>print</b> (r[m-p], " ", a) <cm># 8 12</cm>
      r[p] = a <cm># заполняем массив остатков (пока они различны)</cm>
</pre>
<p class="Header3">Первый больше второго(среди кратных <i>m</i>)</p>
<p class="Content2">Поменяем местами 5 и 10, затем изменим условие:</p>
<pre> 
   m = 5
   d = [10,14,5] <cm># последовательность</cm>
   r = [0,0,0,0,0] <cm># массив «остатков»</cm>
   <b>for</b> i <b>in</b> <gr>range</gr>(<gr>len</gr>(d)):
      a = d[i] <cm># a удобнее чем d[i]</cm>
      p = a % m
      <b>if</b> r[0]>a: <cm># предыдущий r[0] больше текущего a</cm> 
         <b>print</b> (r[0], " ", a) <cm># 10 5</cm>
      r[p] = a <cm># заполняем массив остатков (пока они различны)</cm>
</pre>
<p class="Content2">Теперь предыдущая последовательность, в связи с тем, что она неправильная, не будет найдена.</p>
<p class="Header3">Пара с максимальной суммой(среди кратных <i>m</i>)</p>
<p class="Content2">Аналогично соответствующему пункту данной задачи добавим переменные для максимальных элементов пар и изменим условие:</p>
<pre> 
   m = 5
   d = [10,35,5,14,15] <cm># Нужная 35 и 15, ненужная 22 и 8</cm>
   r = [0,0,0,0,0] <cm># массив «остатков»</cm>
   left = 0; right = 0 <cm># элементы нужной пары</cm>
   <b>for</b> i <b>in</b> <gr>range</gr>(<gr>len</gr>(d)):
      a = d[i] <cm># a удобнее чем d[i]</cm>
      p = a % m
      <b>if</b> r[0]>a <b>and</b> r[0]+a > left + right:
         left = r[0]
         right = a
      <b>if</b> a>r[p]: <cm># a > предыдущего с таким же остатком</cm>
         r[p] = a <cm># значит заменим его на a</cm>
   <b>print</b> (l, " ", r) <cm># 35 15</cm>
</pre>
<p class="Content2">Теперь учтём, что может быть два типа пар.</p>
<p class="Header3">Полный код на Python</p>
<pre> 
   d = [10,35,5,14,15,22,38,8,14,2]
   m = 120
   r = [0] * m <cm># числа, которых ищут по остатку</cm>
   left=0; right=0
   n = <gr>len</gr>(d)
   <b>for</b> i <b>in</b> <gr>range</gr>(n):
      a = d[i]
      p = a % m
      <b>if</b> p == 0: <cm># кратные m</cm>
         <b>if</b> r[0] > a <b>and</b> r[0] + a > left+right:
            left = r[0]
            right = a
      <b>else</b>:<cm># не кратные m</cm>
         <b>if</b> r[m-p]>a <b>and</b> r[m-p]+a > left+right:
            left = r[m-p]
            right = a
      <b>if</b> a>r[p]: <cm># a > предыдущего с таким же остатком</cm>
         r[p] = a
   <b>print</b>(l," ",r)
</pre>
<div class="Header2"><strong>Пример. ЕГЭ 2019 №27 Демо</strong></div>
<p class="Content2">На вход программы поступает последовательность из <i>N</i> целых положительных чисел, все числа в последовательности различны. Рассматриваются все пары различных элементов последовательности, находящихся на расстоянии не меньше чем 4 (разница в индексах элементов пары должна быть 4 или более, порядок элементов в паре неважен). Необходимо определить количество таких пар, для которых произведение элементов делится на 29.</p>
<p class="Content2"><b>Описание входных и выходных данных</b></p>
<p class="Content2">В первой строке входных данных задаётся количество чисел <i>N</i> (4 &#8804; <i>N</i> &#8804; 1000). В каждой из последующих <i>N</i> строк записано одно целое положительное число, не превышающее 10 000.</p>
<p class="Content2">В качестве результата программа должна вывести одно число: количество пар элементов, находящихся в последовательности на расстоянии не меньше чем 4, в которых произведение элементов кратно 29.</p>
<p class="Content2"><i>Пример входных данных:</i></p>
<p class="Content2">7</br>58</br>2</br>3</br>5</br>4</br>1</br>29</p>
<p class="Content2"><i>Пример выходных данных для приведённого выше примера входных данных:</i></p>
<p class="Content2">5</p>
<p class="Content2"><i>Пояснение.</i>Из 7 заданных элементов с учётом допустимых расстояний между ними можно составить 6 произведений: 58&#183;4, 58&#183;1, 58&#183;29, 2&#183;1, 2&#183;29, 3&#183;29. Из них на 29 делятся 5 произведений.</p>
<p class="Content2">Требуется написать эффективную по времени и памяти программу для решения описанной задачи.</p>
<p class="Content2">Программа считается эффективной по времени, если при увеличении количества исходных чисел <i>N</i> в <i>k</i> раз время работы программы увеличивается не более чем в <i>k</i> раз.</p>
<p class="Content2">Внимание! Для простоты, вместо деления на 29 будем проверять на чётность.</p>
<p class="Header3">Эффективный алгоритм по времени, но не по памяти</p>
<p class="Content2">Будем умножать конкретное число <b><i>x</i></b> с остальными числами последовательности, которые стоят на расстоянии &#8805; 4 от <b><i>x</i></b>. Следовательно, ближайшие к <b><i>x</i></b> три числа пропускаем мимо. <b><i>x</i></b>.</p>
<p class="Content2">Закрасим ненужные 3 числа красным, <b><i>x</i></b> – зелёным, а умножаемые с <b><i>x</i></b>–ом числа – синим цветом.</p>
<p class="Content2">Может быть два случая:</p>
<ol class="align_justify">
<li><b><i>x</i></b> – чётный</li>
<li><b><i>x</i></b> – нечётный</li>
</ol>
<p class="Content2"><b>Тогда суммируем либо все синие числа(случай 1), либо только те синие, которые делятся на 2 (случай 2).</b></p>
<p class="Content2">В 1-м случае кол-во чётных результатов будет равно кол-ву произведений <b><i>x</i></b>–а с числами синего цвета:</p>
<p class="Content2">шаг 1</p>
<table class=table_10CorierNew>
<tr align="center">
<td width="30" bgcolor="#b8cce4">8</td>
<td width="30" bgcolor="#e5b8b7">3</td>
<td width="30" bgcolor="#e5b8b7">4</td>
<td width="30" bgcolor="#e5b8b7">7</td>
<td width="30" bgcolor="#c2d69b">6</td>
<td width="30">2</td>
<td width="30">1</td>
<td width="30">4</td>
</tr>
</table>
<p class="Content2">одно произведение: 6 * 8, здесь <b><i>x</i></b> = 6, он на 5-ом месте последовательности (нумерация с 1)</p>
<p class="Content2">шаг 2</p>
<table class=table_10CorierNew>
<tr align="center">
<td width="30" bgcolor="#b8cce4">8</td>
<td width="30" bgcolor="#b8cce4">3</td>
<td width="30" bgcolor="#e5b8b7">4</td>
<td width="30" bgcolor="#e5b8b7">7</td>
<td width="30" bgcolor="#e5b8b7">6</td>
<td width="30" bgcolor="#c2d69b">2</td>
<td width="30">1</td>
<td width="30">4</td>
</tr>
</table>
<p class="Content2">два произведения: 2 * 8 и 2 * 3, здесь <b><i>x</i></b> = 2, он на 2-ом месте последовательности</p>
<p class="Content2">шаг 4</p>
<table class=table_10CorierNew>
<tr align="center">
<td width="30" bgcolor="#b8cce4">8</td>
<td width="30" bgcolor="#b8cce4">3</td>
<td width="30" bgcolor="#b8cce4">4</td>
<td width="30" bgcolor="#b8cce4">7</td>
<td width="30" bgcolor="#e5b8b7">6</td>
<td width="30" bgcolor="#e5b8b7">2</td>
<td width="30" bgcolor="#e5b8b7">1</td>
<td width="30" bgcolor="#c2d69b">4</td>
</tr>
</table>
<p class="Content2">четыре произведения: 4 * 8, 4 * 3, 4 * 4, 4 * 7, здесь <b><i>x</i></b> = 4, он на 8-ом месте последовательности</p>
<p class="Content2">В 2-м случае кол-во чётных результатов будет равно только кол-ву чётных синих чисел:</p>
<p class="Content2">шаг 3</p>
<table class=table_10CorierNew>
<tr align="center">
<td width="30" bgcolor="#b8cce4">8</td>
<td width="30" bgcolor="#b8cce4">3</td>
<td width="30" bgcolor="#b8cce4">4</td>
<td width="30" bgcolor="#e5b8b7">7</td>
<td width="30" bgcolor="#e5b8b7">6</td>
<td width="30" bgcolor="#e5b8b7">2</td>
<td width="30" bgcolor="#c2d69b">1</td>
<td width="30">4</td>
</tr>
</table>
<p class="Content2">два произведения: 1*8 и 1*4, здесь <b><i>x</i></b> = 1, он на 7-ом месте последовательности</p>
<p class="Content2">Для 1-го случая считать чётные произведения будет разница положения <b><i>x</i></b>–а и кол-во розовых чисел:</p>
<pre>
   count = count + x – 3
</pre>
<p class="Content2">Для 2-го случая понадобится переменная, которая считает чётные синие числа</p>
<pre>
   count = count + b <cm>;где b уже знает сколько чётных синих</cm>
</pre>
<p class="Content2">Остаётся считать кол-во чётных синих чисел:</p>
<pre>
   b = b + 1
</pre>
<p class="Content2">Полный код на Python</p>
<pre>
   d = 4 <cm>#расстояние до ближайшего нужного числа</cm>
   a = [8,3,4,7,6,2,1,4]
   n = len(a)
   count = 0 <cm>#кол-во чётных пар всего</cm>
   b = 0 <cm>#кол-во чётных синих чисел</cm>
   for i in range(d,n): <cm>#прицеливаемся на x=6</cm>
      if a[i-d]%2 == 0:
         b += 1
      if a[i]%2 == 0: <cm>#x делится на то что нужно?</cm>
         count += i-d+1 <cm>#count=count+x-3</cm>
      else:
         count += b
   print(count)
</pre>
<div class="Header2"><strong>Пример. ЕГЭ 2018 №27 Демо</strong></div>
<p class="Content2">На  вход  программы  поступает  последовательность  из  <i>N</i>  целых  положительных  чисел,  все  числа  в  последовательности  различны.  Рассматриваются  все  пары  различных  элементов  последовательности  (элементы  пары  не  обязаны  стоять  в  последовательности  рядом, порядок  элементов в  паре не важен). Необходимо определить количество пар, для  которых произведение элементов делится на 26.</p>
<p class="Content2"><b>Описание входных и выходных данных</b></p>
<p class="Content2">В первой строке входных данных задаётся количество чисел <i>N</i> (4 &#8804; <i>N</i> &#8804; 1000). В каждой из последующих <i>N</i> строк записано одно целое положительное число, не превышающее 10 000. В качестве результата программа должна напечатать одно число: количество  пар, в которых произведение элементов кратно 26.</p>
<p class="Content2"><i>Пример входных данных:</i></p>
<p class="Content2">4</br>2</br>6</br>13</br>39</p>
<p class="Content2"><i>Пример выходных данных для приведённого выше примера входных данных:</i></p>
<p class="Content2">4</p>
<p class="Content2"><i>Пояснение.</i>Из  четырёх  заданных  чисел  можно  составить 6 попарных  произведений: 2&#183;6, 2&#183;13, 2&#183;39, 6&#183;13, 6&#183;39, 13&#183;39 (результаты: 12, 26, 78, 78, 234,  507).  Из  них  на 26 делятся 4 произведения (2&#183;13=26; 2&#183;39=78; 6&#183;13=78;  6&#183;39=234).</p>
<p class="Content2">Требуется написать эффективную по времени и по памяти программу для решения описанной задачи.</p>
<p class="Content2">Программа считается эффективной по времени, если при увеличении количества исходных чисел <i>N</i> в <i>k</i> раз время работы программы увеличивается не более чем в <i>k</i> раз.</p>
<p class="Header2">Решение</p>
<p class="Content2">Пример входных данных неудачный: он не содержит чисел 26, поэтому мы не можем учесть такие пары, в которых либо ОБА элемента делятся на 26, либо ТОЛЬКО ОДИН. Пусть будет такая последовательность: 26 3 8 52 78. Из неё получаем неповторяющиеся пары: 26-3, 26-8, 26-52, 26-78, 3-8, 3-52, 3-78, 8-52, 8-78, 52-78. Теперь посчитаем, сколько будет произведений пар, которые делятся на 26.</p>
<p class="Header3">ОБА элемента делятся на 26</p>
<p class="Content2">Если оба элемента делятся на 26, то и их произведения тоже делятся. Из неповторяющихся пар, есть три пары, у которых оба элемента делятся на 26: 26-52, 26-78, 52-78. Формула, которая вычисляет кол-ва таких пар: (n26&#183;(n26-1))/2, где n26 – это количество чисел в последовательности, которые делятся на 26. У нас n26=3(26,52 и 78), значит (3&#183;(3-1))/2=3</p>
<p class="Header3">ТОЛЬКО ОДИН элемент делится на 26</p>
<p class="Content2">Шесть пар, у которых только один элемент делится на 26: 26-3, 26-8, 3-52, 3-78, 8-52, 8-78. Формула, которая вычисляет кол-ва таких пар: n26&#183;(n-n26), где n – это количество чисел в последовательности. У нас n=5, значит 3&#183;(5-3)=6</p>
<p class="Header3">26=2&#183;13</p>
<p class="Content2">Теперь, случай, где элементы не кратны 26, но их произведение дадут число 26. Это число можно получить по двум множителям: 2 и 13. Значит нужно посчитать кол-во пар, у которых один элемент 2, другой 13. Для этого есть формула: n2&#183;n13, где n2 – это кол-во чисел, которые делятся на 2 и n13 – кол-во чисел, которые делятся на 13.</p>
<p class="Header3">Полный код на Python</p>
<pre>
   f = <b>open</b>('2018_27.txt') <cm>#4 2 6 13 39</cm>
   n = <b>int</b>(f.readline())<cm>#n=4</cm>
   n26 = n2 = n13 = 0
   <b>for</b> i <b>in</b> <gr>range</gr>(n):
      x = <b>int</b>(f.readline())
      <b>if</b> x%26 == 0:
         n26 += 1
      <b>elif</b> x%13 == 0:
         n13 += 1
      <b>elif</b> x%2 == 0:
         n2 += 1      
   <b>print</b>((n26*(n26-1))//2+n26*(n-n26)+n2*n13)
</pre>
<div class="Header2"><strong>Пример. ЕГЭ 2016 №27 Демо</strong></div>
<p class="Content2">В  физической  лаборатории  проводится  долговременный  эксперимент   по изучению гравитационного поля Земли. По каналу связи каждую минуту   в лабораторию передаётся положительное целое число – текущее показание  прибора «Сигма 2015». Количество  передаваемых  чисел  в  серии известно   и не превышает 10 000. Все числа не превышают 1000. Временем, в течение  которого происходит передача, можно пренебречь.  Необходимо  вычислить « бета-значение»  серии  показаний  прибора –  минимальное  чётное  произведение  двух  показаний,  между  моментами  передачи  которых  прошло  не  менее 6 минут.  Если  получить  такое  произведение не удаётся, ответ считается равным –1.</p>
<p class="Content2">Напишите программу  для решения  поставленной  задачи,  которая будет  эффективна как по времени, так и по памяти (или хотя бы по одной из этих  характеристик).   Программа  считается  эффективной  по  времени,  если  время  работы  программы пропорционально количеству полученных показаний прибора <i>N</i>,  т.е.  при  увеличении  <i>N</i>  в  <i>k</i>  раз  время  работы  программы  должно  увеличиваться не более чем в <i>k</i> раз.  Программа  считается  эффективной  по  памяти,  если  размер  памяти,  использованной  в программе для хранения  данных, не  зависит от  числа <i>N</i>  и не превышает 1 килобайта.</p>
<p class="Content2">Входные  данные  представлены  следующим  образом.  В  первой  строке  задаётся число <i>N</i> – общее количество показаний прибора. Гарантируется, что  <i>N</i> > 6. В каждой из следующих <i>N</i> строк задаётся одно положительное целое  число – очередное показание прибора.</p>
<p class="Content2"><i>Пример входных данных:</i></p>
<p class="Content2">11</br>12</br>45</br>5</br>3</br>17</br>23</br>21</br>20</br>19</br>18</br>17</p>
<p class="Content2">Программа должна вывести одно число – описанное в условии произведение  либо –1, если получить такое произведение не удаётся.</p>
<p class="Content2"><i>Пример выходных данных для приведённого выше примера входных данных: 54</i></p>
<p class="Header2">Решение</p>
<p class="Content2">Пусть для простоты расстояние будет не 6, а 3, и возьмём небольшие числа: 6 1 3 5 7 9 2 4 8. После того как составим алгоритм заменим 3 на 6.</p>
<p class="Header3">Множители на расстоянии</p>
<p class="Content2">Сохраним 1-ые 3 элемента входных данных в массив. Затем настроимся к оставшимся числам последовательности:</p>
<pre>
   a = [6 1 3 5 7 9 2 4 8]
   m = [6 1 3] <cm># сохраняем первые 3</cm> 
   <b>for</b> i <b>in</b> <gr>range</gr>(3,n):<cm># i = [3..n)</cm>
</pre>
<p class="Content2">Получилась заготовка для обращений чисел, расположенных на расстоянии трёх элементов. Элементы массива <i>m</i> выделены синим цветом, а нужные элементы массива <i>a</i> – зелёным.</p>
<table class=table_10CorierNew>
<tr align="center">
<td width="30" bgcolor="#b8cce4">6</td>
<td width="30" bgcolor="#b8cce4">1</td>
<td width="30" bgcolor="#b8cce4">3</td>
<td width="30" bgcolor="#c2d69b">5</td>
<td width="30" bgcolor="#c2d69b">7</td>
<td width="30" bgcolor="#c2d69b">9</td>
<td width="30" bgcolor="#c2d69b">2</td>
<td width="30" bgcolor="#c2d69b">4</td>
<td width="30" bgcolor="#c2d69b">8</td>
</tr>
</table>
<p class="Header3">Умножение</p>
<p class="Content2">Схема умножения для первых трёх шагов:</p>
<table class=table_10CorierNew>
<tr align="center">
<td width="30" bgcolor="#b8cce4">6</td>
<td width="30">1</td>
<td width="30">3</td>
<td width="30" bgcolor="#c2d69b">5</td>
<td width="30">7</td>
<td width="30">9</td>
<td width="30">2</td>
<td width="30">4</td>
<td width="30">8</td>
</tr>
</table>
<table class=table_10CorierNew>
<tr align="center">
<td width="30">6</td>
<td width="30" bgcolor="#b8cce4">1</td>
<td width="30">3</td>
<td width="30">5</td>
<td width="30" bgcolor="#c2d69b">7</td>
<td width="30">9</td>
<td width="30">2</td>
<td width="30">4</td>
<td width="30">8</td>
</tr>
</table>
<table class=table_10CorierNew>
<tr align="center">
<td width="30">6</td>
<td width="30">1</td>
<td width="30" bgcolor="#b8cce4">3</td>
<td width="30">5</td>
<td width="30">7</td>
<td width="30" bgcolor="#c2d69b">9</td>
<td width="30">2</td>
<td width="30">4</td>
<td width="30">8</td>
</tr>
</table>
<p class="Content2">Перед умножением элемента массива <i>m</i>, проверим его на минимум и сохраним его в <i>minx</i>:</p>
<pre>   …
   minx = 1001   
   <b>for</b> i <b>in</b> <gr>range</gr>(3,n):<cm># a[3] = 5</cm>
      <b>if</b> m[i%3] < minx: <cm>#[3%3]=0, [4%3]=1, [5%3]=2</cm>
         minx = m[i%3]
</pre>
<p class="Content2">На третьем шаге в <i>minx</i> будет 1 – это значит, что не нужно беспокоиться о «пропущенном» произведении: 6*7, 6*9… – раз нужно минимальное произведение, то проверять произведения 6-ки со всеми кроме ближайших по условию не нужно.</p>
<p class="Content2">Теперь умножаем числа расположенные на расстоянии 3-х элементов:</p>
<pre>   …
   x = a[i] # a[i] = 5
   p = minx * x	 
</pre>
<p class="Content2">Проверим произведение на минимум и чётность:</p>
<pre>   …
      <b>if</b> (p%2==0 <b>and</b> p < minp):
         minp = p
</pre>
<p class="Content2"><i>minp</i> – хранит минимальное чётное произведение, которое будет результатом</p>
<p class="Header3">Следующее умножение</p>
<p class="Content2">Теперь самое интересное.  В конце цикла заменяем текущий элемент массива <i>m</i>, на <i>x</i>, т.о., за три шага  создаём следующую тройку для произведения:</p>
<pre>   …
      m[i%3] = x <cm># при i=3, m[0] = 5</cm>	 
</pre>
<table class=table_10CorierNew>
<tr align="center">
<td width="30" bgcolor="#e5b8b7">5</td>
<td width="30" bgcolor="#b8cce4">1</td>
<td width="30">3</td>
<td width="30">5</td>
<td width="30" bgcolor="#c2d69b">7</td>
<td width="30">9</td>
<td width="30">2</td>
<td width="30">4</td>
<td width="30">8</td>
</tr>
</table>
<p class="Content2">Т.е. когда, на втором шаге, будут умножаться 1 на 7 –  в первом элементе массива <i>m</i> вместо 6 будет значение 5, которое через два шага будет умножаться на 2, и т.д. Так, выделены красным элементы массива <i>m</i> после трёх шагов цикла:</p>
<table class=table_10CorierNew>
<tr align="center">
<td width="30" bgcolor="#e5b8b7">5</td>
<td width="30" bgcolor="#e5b8b7">7</td>
<td width="30" bgcolor="#e5b8b7">9</td>
<td width="30">5</td>
<td width="30">7</td>
<td width="30">9</td>
<td width="30" bgcolor="#c2d69b">2</td>
<td width="30" bgcolor="#c2d69b">4</td>
<td width="30" bgcolor="#c2d69b">8</td>
</tr>
</table>
<p class="Content2">Теперь полный код, в котором заменено значение 3 на 6</p>
<p class="Header3">Полный код на Python</p>
<pre> 
  a=[12,45,5,3,17,23,21,20,19,18,17]
  n=len(a) <cm># n=11</cm>
  m=[0]*6
  minp=1000001;minx=1001
  <b>for</b> i <b>in</b> <gr>range</gr>(6):
     m[i]=a[i]

  <b>for</b> i <b>in</b> <gr>range</gr>(6,n):
     <b>if</b> m[i%6] < minx:
        minx=m[i%6]
     x=a[i]
     p=minx*x
     <b>if</b>(p%2==0 <b>and</b> p < minp):
        minp=p
     m[i%6]=x
<cm># если ни одного произведения не нашлось, то выведем -1</cm>
  <b>if</b> minp == 1000001:
     <b>print</b> (-1)
  <b>else</b>:
     <b>print</b>(minp) 
</pre>
]]></content:encoded>
			<wfw:commentRss>http://kshu.su/?feed=rss2&#038;p=248</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ЕГЭ 2011 С4</title>
		<link>http://kshu.su/?p=214</link>
		<comments>http://kshu.su/?p=214#comments</comments>
		<pubDate>Wed, 25 May 2022 15:35:05 +0000</pubDate>
		<dc:creator><![CDATA[Kirill Schurakhtenkov]]></dc:creator>
				<category><![CDATA[Информатика]]></category>

		<guid isPermaLink="false">http://kshu.su/?p=214</guid>
		<description><![CDATA[Программы, которые эффективно используют память: выбор лучших учеников по набранным баллам, кодирование файловых строк. 10 вариантов задач за 2011 год. Они обозначались как С4 Пример. ЕГЭ 2011 С4 Вариант 1 После единых выпускных экзаменов по информатике в район пришла информация о том, какой ученик, какой школы сколько набрал баллов. Эта информация в том же виде [&#8230;]]]></description>
				<content:encoded><![CDATA[<p class="Content2">Программы, которые эффективно используют память: выбор лучших учеников по набранным баллам, кодирование файловых строк. 10 вариантов задач за 2011 год. Они обозначались как С4</p>
<p><span id="more-214"></span>	</p>
<div class="Header2"><strong>Пример. ЕГЭ 2011 С4 Вариант 1</strong></div>
<p class="Content2">После единых выпускных экзаменов по информатике в район пришла информация о том, какой ученик, какой школы сколько набрал баллов. Эта информация в том же виде была разослана в школы.</p>
<p class="Content2">Завуч школы № 50 решила наградить двух учащихся, которые лучше всех в школе сдали информатику.</p>
<p class="Content2">Программа должна вывести на экран фамилии и имена этих учеников.</p>
<p class="Content2">Если наибольший балл набрало больше двух человек – вывести количество таких учеников.</p>
<p class="Content2">Если наибольший балл набрал один человек, а следующий балл набрало несколько человек &#8212; нужно вывести только фамилию и имя лучшего.</p>
<p class="Content2">Напишите эффективную, в том числе и по используемой памяти, программу (укажите используемую версию языка   программирования, например Borland Pascal 7.0), которая должна вывести на экран требуемую информацию. Известно, что информатику сдавало больше 5-ти учеников школы № 50.</p>
<p class="Content2">На вход программе сначала  подаётся число учеников, сдававших экзамен. В каждой из следующих N строк находится информация об учениках в формате:</p>
<p class="Content2Center"><Фамилия> <Имя> <Номер школы> <Количество баллов></p>
<p class="Content2">где <Фамилия> &#8212; строка, состоящая не  более чем из 30 символов без пробелов, <Имя> &#8212; строка, состоящая не более, чем из 20 символов без пробелов, <Номер школы> &#8212; целое число в диапазоне от 1 до 99, <Количество баллов> &#8212; целое число в диапазоне от 1 до 100. Эти данные записаны через пробел, причём ровно один между каждой парой (то есть, всего по три пробела в каждой  строке).</p>
<p class="Content2">Пример входной строки:<br/>Иванов Иван 50 87<br/>Пример выходных данных:<br/>Круглов Василий Тарасова Дарья<br/>Другой вариант выходных данных:<br/>7<br/>Третий вариант выходных данных:<br/>Гусарский Илья</p>
<p class="Content2">
<p class="Header2">Решение:</p>
<p class="Content2">Нужно, из множества всех учеников получить подмножество учеников конкретной школы(№50). Далее в этом подмножестве выбрать лучших учеников. Эффективная программа должна реализовать этот сложный отбор одним циклом:</p>
<pre>	
	<ps>Цикл по всем ученикам
		Если ученик из 50-й школы то	
			Выбор лучших</ps>
	</pre>
<p class="Header3">Выбор лучших</p>
<p class="Content2">Введём переменные:</p>
<p class="Content2">max1 – максимальный бал или максимум,</p>
<p class="Content2">max2 – второй максимум,</p>
<p class="Content2">ball – текущий бал ученика 50-й школы.</p>
<p class="Content2">Выбор лучших – это алгоритм с вложенным ветвлением. Для простоты рассмотрим его по частям. Их четыре:</p>
<ol class="align_justify">
<li>Пусть есть возрастающая последовательность чисел, например, такая [1 2 3 4 5]: один максимум(5) и один второй максимум(4). Тогда алгоритм можно написать так:</li>
</ol>
<pre><ps>
	max1 = max2 =-1
	цикл для всех из 50-й школы
		если ball > max1 то
			max2 = max1
			max1 = ball</ps>
	</pre>
<ol class="align_justify" start="2">
<li>Теперь случай, где два одинаковых максимума(5): [1 5 3 4 5]. Добавим новую ветку условия:</li>
</ol>
<pre><ps>
	max1 = max2 =-1
	цикл для всех из 50-й школы
		если ball > max1 то
			max2 = max1
			max1 = ball</ps>
		иначе если ball = max1 то
			max2 = ball			
	</pre>
<p class="Content2">т.е. max1 и max2 содержат одинаковые значения.</p>
<ol class="align_justify" start="3">
<li>Второй максимум(4) правее максимума(5): [1 5 3 4 2]. Добавим третью ветку условия:</li>
</ol>
<pre><ps>
	max1 = max2 =-1
	цикл для всех из 50-й школы
		если ball > max1 то
			max2 = max1
			max1 = ball
		иначе если ball = max1 то
			max2 = ball</ps>
		иначе если ball = max2 то
			max2 = ball
	</pre>
<p class="Content2">(во 2-м и 3-м условиях стоят одинаковые операторы – можно было бы написать одно сложное условие, однако далее операторы будут меняться).</p>
<ol class="align_justify" start="4">
<li>Последний случай. Количество вторых максимумов(4) может быть более одного: [1 5 4 2 4]; здесь также добавляем условие, в котором подсчитывается их количество.</li>
</ol>
<p class="Content2">Наконец, количество максимумов(5) может быть  более двух [1 5 2 5 5] – их также нужно подсчитывать. Добавим для них переменные и дополним алгоритм:</p>
<p class="Content2">n1 – количество максимумов,</p>
<p class="Content2">n2 – количество вторых максимумов.</p>
<pre><ps>
	max1 = max2 =-1</ps>
	n1 = n2 = 0<ps>
	цикл для всех из 50-й школы
		если ball > max1 то
			max2 = max1
			max1 = ball</ps>
			n2 = n1
			n1 = 1<ps>
		иначе если ball = max1 то
			max2 = ball
			</ps>n1 = n1 + 1<ps>
		иначе если ball = max2 то
			max2 = ball
			</ps>n2 = 1
		иначе если ball = max2 то
			n2 = n2 + 1
	</pre>
<p class="Content2">Обратим внимание на строку <i>n2=n1</i>. Здесь в <i>n1</i> сохранено количество «бывших» максимумов: оно может быть либо 1, либо больше 1. И ещё, оператор последнего условия не содержит присваивания переменной <i>max2</i>, дело в том, что в <i>max2</i> уже было присвоено значение.</p>
<p class="Header3">Имена</p>
<p class="Content2">Осталось добавить имена учеников:</p>
<p class="Content2">s – фамилия и имя ученика из 50-й школы,</p>
<p class="Content2">s1 – фамилия и имя ученика с максимальным баллом,</p>
<p class="Content2">s2 – фамилия и имя ученика с вторым максимальным баллом.</p>
<pre><ps>
	max1 = max2 =-1
	n1 = n2 = 0</ps>
	s1 = s2 = ""<ps>
	цикл для всех из 50-й школы
		</ps>s = Ф. И. ученика из 50-й школы<ps>
		если ball > max1 то
			max2 = max1
			max1 = ball
			n2 = n1
			n1 = 1</ps>
			s2 = s1
			s1 = s<ps>
		иначе если ball = max1 то
			max2 = ball
			n1 = n1 + 1
			</ps>s2 = s<ps>
		иначе если ball = max2 то
			max2 = ball
			n2 = 1
			</ps>s2 = s<ps>
		иначе если ball = max2 то
			n2 = n2 + 1</ps>
	</pre>
<p class="Content2">Аналогично, оператор последнего условия не содержит присваивания имени потому, что ранее оно уже было присвоено корректным значением.</p>
<p class="Content2">
<p class="Header3">Вывод результатов</p>
<p class="Content2">Двое лучших – это либо два одинаковых максимальных балла, либо один максимум и один второй максимум. Один лучший – это когда один победитель, а количество вторых максимумов более одного. В остальных случаях получим вывод, в котором количество максимумов – больше двух:</p>
<pre><ps>
	если n1==1 и n2==1 или n1==2 то
		печать s1, s2
	иначе если n1==1 и n2>1 то
		печать s1
	иначе
		печать n1</ps>
</pre>
<p class="Header3">Цикл по всем ученикам</p>
<p class="Content2">Переходим на Python. Найдём количество учеников из всех школ. Если данные нашей задачи хранятся в файле, то первая строка файла содержит это значение. Вот как можно подключиться к файлу, а затем извлечь всех учеников в переменную <i>N</i>:</p>
<pre>
	f = <gr>open</gr>("имяфайла.txt", encoding='utf-8', mode="r")
	N = f.readline()
	</pre>
<p class="Content2"><i>N</i>, нам понадобится для организации цикла по всем ученикам:</p>
<pre>
	<b>for</b> i <b>in</b> <gr>range</gr>(<gr>int</gr>(N))
</pre>
<p class="Header3">Ученик из 50-й школы</p>
<p class="Content2">После N идут строки со значениями, значения разделены пробелом. Функция split разбивает каждую прочитанную строку в массив подстрок:</p>
<pre>
	array = f.readline().split()
</pre>
<p class="Content2">Откуда: <i>array[0]</i> – первая подстрока с фамилией, <i>array[1]</i> – вторая подстрока с именем, <i>array[2]</i> – номер школы и наконец, <i>array[3]</i> – набранный балл. Теперь проверить 50-ую школу можно так:</p>
<pre>
	school = <gr>int</gr>(array[2])
	<b>if</b> school == 50:
</pre>
<p class="Content2">Фамилия и имя получается сложением:</p>
<pre>
	s = array[0] + " " + array[1]
</pre>
<p class="Content2">Полный код на Python</p>
<pre>
  f = <gr>open</gr>("11C4v01.txt", encoding='utf-8', mode="r")
  n = <gr>int</gr>(f.readline())
  max1 = max2 = -1
  n1 = n2 = 0
  s1 = s2 = ""
  <b>for</b> i <b>in</b> <gr>range</gr>(n):
      a = f.readline().split()
      <cm>#a[0] - Фамилия</cm>
      <cm>#a[1] - Имя</cm>
      <cm>#a[2] - номер школы [1..99]</cm>
      <cm>#a[3] - балл ученика(цы)</cm>
      s = a[0] + " " + a[1]
      school = <gr>int</gr>(a[2])
      ball = <gr>int</gr>(a[3])
      <b>if</b> school == 50:
          <b>if</b> ball > max1:
              max2 = max1
              max1 = ball
              n2 = n1
              n1 = 1
              s2 = s1
              s1 = s
          <b>elif</b> ball == max1:
              max2 = ball
              n1 += 1 
              s2 = s
          <b>elif</b> ball > max2:
              max2 = ball
              n2 = 1
              s2 = s
          <b>elif</b> ball == max2:
              n2 += 1
  <cm># Вывод результатов</cm>
  <b>if</b> n1==1 <b>and</b> n2==1 <b>or</b> n1==2:
      <gr>print</gr> (s1, " ",s2)
  <b>elif</b> n1==1 <b>and</b> n2>1:
      <gr>print</gr>(s1)
  <b>else</b>:
      <gr>print</gr>(n1)
  f.close()
</pre>
<div class="Header2"><strong>Пример. ЕГЭ 2011 С4 Вариант 2</strong></div>
<p class="Content2">После единых выпускных экзаменов по информатике в район пришла информация о том, какой ученик, какой школы сколько набрал баллов.</p>
<p class="Content2">Районный методист решила выяснить номер школы, ученики которой набрали наибольший средний балл, с точностью до целых.</p>
<p class="Content2">Программа должна вывести на экран номер такой школы и её средний балл.</p>
<p class="Content2">Если наибольший средний балл набрало больше одной школы — вывести количество таких школ.</p>
<p class="Content2">Напишите эффективную, в том числе и по используемой памяти, программу (укажите используемую версию языка программирования, например, Borland Pascal 7.0), которая должна вывести на экран требуемую информацию. Известно, что информатику сдавало больше 5-ти учеников района. Также известно, что в районе школы с некоторыми номерами не существуют.</p>
<p class="Content2">На вход программе сначала подаётся число учеников, сдававших экзамен. В каждой из следующих N строк находится информация об учениках в формате:</p>
<p class="Content2Center"><Фамилия> <Имя> <Номер школы> <Количество баллов></p>
<p class="Content2">где <Фамилия> — строка, состоящая не более, чем из 30 символов без пробелов, <Имя> — строка, состоящая не более, чем из 20 символов без пробелов, <Номер школы> — целое число в диапазоне от 1 до 99, <Количество баллов> — целое число диапазоне от 1 до 100. Эти данные записаны через пробел, причём ровно один между каждой парой (то есть, всего по три пробела в каждой строке).</p>
<p class="Content2">Пример входной строки:</br>Иванов Иван 50 87</br>Пример выходных данных:</br>50 74</br>Другой вариант выходных данных:</br>7</p>
<p class="Header2">Решение:</p>
<p class="Header3">Сумма баллов</p>
<p class="Content2">Пусть количество школ 3, а количество учеников 6 (N=6). И пусть будут такими номера школ и баллы учеников:</p>
<p class="Content3">2 6</p>
<p class="Content3">3 15</p>
<p class="Content3">1 8</p>
<p class="Content3">2 10</p>
<p class="Content3">3 9</p>
<p class="Content3">2 7</p>
<p class="Content2">Просуммировать баллы по каждой школе удобно с помощью массива, размер которого равен количеству школ:</p>
<table class=table_11Tahoma_noBorder>
<tr align="center">
<td width="120">школа №1</td>
<td width="120">школа №2</td>
<td width="120">школа №3</td>
</tr>
</table>
<table class=table_11Tahoma>
<tr align="center">
<th width="120">0</td>
<th width="120">0</td>
<th width="120">0</td>
</tr>
</table>
<table class=table_11Tahoma_noBorder>
<tr align="center">
<td width="120">+</td>
<td width="120">+</td>
<td width="120">+</td>
</tr>
<tr align="center">
<td>8</td>
<td>6</td>
<td>15</td>
</tr>
<tr align="center">
<td></td>
<td>+</td>
<td>+</td>
</tr>
<tr align="center">
<td></td>
<td>10</td>
<td>9</td>
</tr>
<tr align="center">
<td></td>
<td>+</td>
<td></td>
</tr>
<tr align="center">
<td></td>
<td>7</td>
<td></td>
</tr>
</table>
<p class="Content2">Получаем такой массив после суммирования:</p>
<table class=table_11Tahoma>
<tr align="center">
<th width="120">8</td>
<th width="120">23</td>
<th width="120">24</td>
</tr>
</table>
<p class="Content2">Алгоритм суммирования массива баллов:</p>
<pre><ps>
	Цикл для i от 0 до 5 учеников
		m = № школы из i-й строки данных
		ball = балл ученика m-й школы
		sum[m] = sum[m] + ball</ps>
	</pre>
<p class="Content2">Данные массива <i>sum</i> после выполнения алгоритма:</p>
<p class="Content3">sum[0]=8</p>
<p class="Content3">sum[1]=23</p>
<p class="Content3">sum[2]=24</p>
<p class="Header3">Средний бал</p>
<p class="Content2">Средний балл = сумма баллов школы/количество учеников школы.</p>
<p class="Content2">где числитель – это массив из пункта <i>Сумма баллов</i>, а знаменатель – это ещё один массив такого же размера, только каждый элемент этого массива – это количество учеников в конкретной школе. Другими словами, знаменатель – это количество плюсов на схеме из пункта <i>Сумма баллов</i>. Значит, во время суммирования баллов каждой школы, увеличиваем на 1 <i>i</i>-й элемент второго массива:</p>
<pre><ps>
	Цикл для i от 0 до 5 учеников
		m = № школы из i-й строки данных
		ball = балл ученика m-й школы
		sum[m] = sum[m] + ball
		cnt[m] = cnt[m] + 1</ps>
	</pre>
<p class="Content2">Данные массива <i>sum</i> и <i>cnt</i> после выполнения алгоритма:</p>
<p class="Content3">sum[0]=8</p>
<p class="Content3">sum[1]=23</p>
<p class="Content3">sum[2]=24</p>
<p class="Content3">cnt[0]=1</p>
<p class="Content3">cnt[1]=3</p>
<p class="Content3">cnt[2]=2</p>
<p class="Content2">Ну, а теперь вычисление среднего балла. Для этого понадобится ещё один цикл, но уже по школам:</p>
<pre><ps>
	Цикл для i от 0 до 2 школ
		sum[i] = sum[i] / cnt[i]</ps>
	</pre>
<p class="Content2">Данные массива <i>sum</i> после выполнения алгоритма:</p>
<p class="Content3">sum[0]=8</p>
<p class="Content3">sum[1]=7,66</p>
<p class="Content3">sum[2]=12</p>
<p class="Content2">Однако мы не учли отсутствие номеров некоторых школ. Это значит, что массивы <i>sum</i> и <i>cnt</i> где-то содержат нули – будет деление на ноль. Полный код на Python учтёт это.</p>
<p class="Header3">Поиск лучших школ</p>
<p class="Content2">По условию лучших школ может быть либо одна, либо две и более. В первом случае нужно сохранить номер школы и средний балл – это обычный поиск максимума:</p>
<pre><ps>
	max = sum[0] <cm>;сохраняем в max ср.балл школы №1</cm>
	n = 0 <cm>;номер школы, пока 0</cm>
	Цикл для i от 1 до 2 школ <cm>;начинаем со школы №2</cm>
		если sum[i] > max то
			max = sum[i]
			n = i<cm>;сохраняем в n № школы</cm></ps>
	</pre>
<p class="Content2">Во втором случае нужно сохранить количество школ. Это сравнение на равенство среднего балла текущей школы с сохранённым ранее максимальным средним баллом – <i>max</i> :</p>
<pre><ps>
	max = sum[0] <cm>;сохраняем в max ср.балл школы №1</cm>
	n = </ps>кол-во<ps> = 0 <cm>;номер школы и кол-во учеников, пока 0</cm>
	Цикл для i от 1 до 2 школ <cm>;начинаем со школы №2</cm>
		если sum[i] > max то
			max = sum[i]
			</ps>кол-во = 1<ps>
			n = i   <cm>;сохраняем в n № школы</cm>
		</ps>иначе если sum[i] = max то
			кол-во = кол-во + 1
	</pre>
<p class="Content2">Нужно написать эффективную по памяти программу, для этого можно исключить переменную <i>n</i>. Тогда в <i>max</i> сохранять не значение среднего балла первой школы(<i>sum[0]</i>), а индекс самой школы, затем произвести изменения в условном операторе. Это будет сделано в полном коде на Python.</p>
<p class="Header3">Вывод результатов</p>
<p class="Content2">Проверяем количество лучших школ, если лучшая школа одна, то выводим номер школы и её средний балл. В остальных случаях выводим количество:</p>
<pre><ps>
	если кол-во = 1 то
		печать n max
	иначе
		печать кол-во</ps>
	</pre>
<p class="Header3">Полный код на Python</p>
<pre>
  f = <gr>open</gr>("11C4v01.txt", encoding='utf-8', mode="r")
  n = <gr>int</gr>(f.readline())
  nsch = 99 <cm>#кол-во школ [1..99]</cm>
  sum = [0] * nsch <cm># массив суммарных баллов по каждой школе</cm>
  cnt = [0] * nsch <cm># массив количеств учеников в каждой школе</cm>

  <cm>#суммируем баллы и считаем кол-во учеников по каждой школе</cm>
  <b>for</b> i <b>in</b> <gr>range</gr>(n):
    <cm>#a[0] - Фамилия (она не нужна)</cm>
    <cm>#a[1] - Имя (оно не нужно)</cm>
    <cm>#a[2] - номер школы [1..99]</cm>
    <cm>#a[3] - балл ученика(цы)</cm>
      a = f.readline().split()
      isch = <gr>int</gr>(a[2])-1 <cm># isch - [0..98]</cm>
      sum[isch] += <gr>int</gr>(a[3])
      cnt[isch] += 1

  <cm>#средний балл</cm>
  <b>for</b> i <b>in</b> <gr>range</gr>(nsch):
<cm>#из-за отсутствия номеров некоторых школ, избегаем деления на 0</cm>
      <b>if</b> cnt[i]>0:
          sum[i] = sum[i] / cnt[i]

  <cm>#Поиск лучших школ</cm>
  max = 0
  n = 0
  <b>for</b> i <b>in</b> <gr>range</gr>(1,nsch):
      <b>if</b> sum[i] > sum[max]:
          max=i
          n=1
      <b>elif</b> sum[i] == sum[max]:
          n += 1
  
  <cm>#Вывод результатов</cm>
  <b>if</b> n == 1:
      print(max+1," ",sum[max])
  <b>else</b>:
      print(n)
</pre>
<div class="Header2"><strong>Пример. ЕГЭ 2011 С4 Вариант 3</strong></div>
<p class="Content2">После единых выпускных экзаменов по информатике в район пришла информация о том, какой ученик какой школы сколько баллов набрал.</p>
<p class="Content2">Районный методист решила выяснить номера школ, ученики которых набрали средний балл по школе, больший, чем районный средний балл (все средние баллы вычисляются с точностью до целых).</p>
<p class="Content2">Программа должна вывести на экран номера таких школ, в любом порядке.</p>
<p class="Content2">Если такая школа окажется только одна — вывести также средний балл по этой школе, с указанием, что это средний балл.</p>
<p class="Content2">Напишите эффективную, в том числе и по используемой памяти, программу (укажите используемую версию языка программирования, например Borland Pascal 7.0), которая должна вывести на экран требуемую информацию. Известно, что информатику сдавало больше 5-ти учеников района. Также известно, что в районе школы с некоторыми номерами не существуют.</p>
<p class="Content2">На вход программе сначала подаётся число учеников, сдававших экзамен. В каждой из следующих N строк находится информация об учениках в формате:</p>
<p class="Content2Center"><Фамилия><Имя><Номер школы><Количество баллов></p>
<p class="Content2">где <Фамилия> — строка, состоящая не более чем из 30 символов без пробелов, <Имя> — строка, состоящая не более чем из 20 символов без пробелов, <Номер школы> — целое число в диапазоне от 1 до 99, <Количество баллов> — целое число в диапазоне от 1 до 100. Эти данные записаны через пробел, причём ровно один между каждой парой (то есть, всего по три пробела в каждой строке).</p>
<p class="Content2">Пример входной строки:</br>Иванов Иван 50 87</br>Пример выходных данных:</br>5 50 74 87</br>Другой вариант выходных данных:</br>7</br>Средний балл = 74</p>
<p class="Header2">Решение:</p>
<p class="Header3">Средние баллы по району и школе</p>
<p class="Content2">Cр.балл по району = Все баллы / N</p>
<p class="Content2">Средний балл по школе = Сумма баллов по школе / кол-во учеников школы</p>
<p class="Content2">Сумму баллов по школе получаем как в примере 2011 С4 №2: создаём массив <i>sum</i> из 99 элементов(кол-во школ), заносим сумму баллов школы в каждый элемент. Добавим подсчёт кол-ва учеников в массив <i>cnt</i>:</p>
<pre><ps>
	Цикл для i от 0 до N-1
		m = № школы из i-й строки данных
		ball = балл ученика m-й школы
		sum[m] = sum[m] + ball <cm>;суммы баллов по m-ой школе</cm>
		cnt[m] = cnt[m] + 1 <cm>;кол-во учеников m-ой школы</cm>
</ps></pre>
<p class="Content2">Заметим, что вместо вычисления всех баллов, можно просуммировать суммы баллов по школе в отдельную переменную. Тем самым избавиться от лишнего суммирования N раз!</p>
<p class="Content2">Т.к. некоторых номеров школ нет, то соответствующие элементы массивов sum и <i>cnt</i> содержат нули. Для этого нужно следить, чтобы, при вычислении среднего, не было деления на ноль:</p>
<pre><ps>
	avg = 0 <cm>;переменная для всех баллов</cm>
	Цикл для i от 0 до 98 школ
		если sum[i] > 0 то
		avg = avg + sum[i] <cm>;суммируем все баллы</cm>
		sum[i] = sum[i] / cnt[i]  <cm>;средний балл по школе</cm>
</ps></pre>
<p class="Content2">Обратим внимание на две строки условия. Сначала суммируем баллы всех школ. Затем на место суммы баллов по школе, помещаем средний балл по этой же школе – тем самым не создаём лишнюю переменную для среднего значения.</p>
<p class="Content2">Средний балл по району:</p>
<pre><ps>	avg = avg / N</ps></pre>
<p class="Header3">Вывод результатов</p>
<p class="Content2">Вывод номера или номеров школ проведём с помощью сравнения среднего балла по школе со средним баллом по району. Если балл по школе больше балла по району, то выведем её номер:</p>
<pre><ps>
	Цикл для i от 0 до 98 школ
		если sum[i] > avg то
			печать i
</ps></pre>
<p class="Content2">Ну, а если школа единственная, то нужна переменная <i>n</i>, которая посчитает кол-во сравнений и переменная <i>ball</i>, которая сохранит балл этой единственной школы:</p>
<pre>
	m=0<ps>
	Цикл для i от 0 до 98 школ
		если sum[i] > avg то</ps>
			m = m + 1
			ball = sum[i]<ps>	
			печать i</ps>
	если m = 1 то
		печать "Средний балл:" ball			
</pre>
<p class="Header3">Полный код на Python</p>
<pre>
  f = <gr>open</gr>("11C4v01.txt", encoding='utf-8', mode="r")
  n = <gr>int</gr>(f.readline())
  nsch=99 <cm># кол-во школ [1..99]</cm>
  sum = [0] * nsch <cm># массив суммарных баллов по каждой школе</cm>
  cnt = [0] * nsch <cm># массив количеств учеников в каждой школе</cm>

  <cm>#суммируем баллы и считаем кол-во учеников по каждой школе</cm>
  <b>for</b> i <b>in</b> <gr>range</gr>(n):
      <cm>#a[0] - Фамилия (она не нужна)</cm>
      <cm>#a[1] - Имя (оно не нужно)</cm>
      <cm>#a[2] - номер школы [1..99]</cm>
      <cm>#a[3] - балл ученика(цы)</cm>
      a = f.readline().split()
      isch = <gr>int</gr>(a[2])-1 <cm># isch - [0..98]</cm>
      sum[isch] += <gr>int</gr>(a[3])
      cnt[isch] += 1

  <cm>#средний балл по школе</cm>
  avg = 0
  <b>for</b> i <b>in</b> <gr>range</gr>(nsch):
    <b>if</b> cnt[i] > 0:
        avg = avg + sum[i]  <cm># суммируем все баллы</cm>
        sum[i] = sum[i] / cnt[i] <cm># средний балл по школе</cm>

  <cm>#средний балл по району</cm>
  avg /= n

  <cm>#Вывод результатов</cm>
  m = 0
  <b>for</b> i <b>in</b> <gr>range</gr>(nsch):
      <b>if</b> sum[i] > avg:
          m += 1
          ball = sum[i]
          print(i+1, end=' ')
  <b>if</b> m == 1:
      print("Средний балл:",ball)
	
</pre>
<div class="Header2"><strong>Пример. ЕГЭ 2011 С4 Вариант 4</strong></div>
<p class="Content2">После единых выпускных экзаменов по информатике в район пришла информация о том, какой ученик какой школы сколько набрал баллов.</p>
<p class="Content2">Районный методист решила выяснить фамилии учеников, которые набрали наибольший балл, по каждой школе в отдельности, но только если из школы информатику сдавало не меньше трёх человек. Если в школе информатику сдавало меньше трёх человек, информацию по этой школе выводить не нужно. Если наибольший балл в какой-то школе набрали несколько человек, нужно вывести на экран их количество.</p>
<p class="Content2">Программа должна вывести на экран информацию в виде:</p>
<p class="Content2Center"><Номер школы> <Фамилия ученика></p>
<p class="Content2">где <Фамилия> — строка, состоящая не более чем из 30 символов без пробелов, <Имя> — строка, состоящая не более чем из 20 символов без пробелов, <Номер школы> — целое число в диапазоне от 1 до 99, <Количество баллов> — целое число в диапазоне от 1 до 100. Эти данные записаны через пробел, причём ровно один между каждой парой (то есть, всего по три пробела в каждой строке).</p>
<p class="Content2">в отдельной строке для каждой школы.</p>
<p class="Content2">Напишите эффективную, в том числе и по используемой памяти, программу (укажите используемую версию языка программирования, например Borland Pascal 7.0), которая должна вывести на экран требуемую информацию. Известно, что информатику сдавало больше 5-ти учеников района. Также известно, что в районе школы с некоторыми номерами не существуют.</p>
<p class="Content2">На вход программе сначала подаётся число учеников, сдававших экзамен. В каждой из следующих N строк находится информация об учениках в формате:</p>
<p class="Content2Center"><Фамилия> <Имя> <Номер школы> <Количество баллов></p>
<p class="Content2">где <Фамилия> — строка, состоящая не более чем из 30 символов без пробелов, <Имя> — строка, состоящая не более чем из 20 символов без пробелов, <Номер школы> — целое число в диапазоне от 1 до 99, <Количество баллов> — целое число в диапазоне от 0 до 100. Эти данные записаны через пробел, причём ровно один между каждой парой (то есть всего по три пробела в каждой строке).</p>
<p class="Content2">Пример входной строки:</br> Иванов Иван 50 87</br> Пример выходных данных:</br>5 Иванов </br>50 10</br>74 Сидоров</p>
<p class="Header2">Решение:</p>
<p class="Header3">Количество учеников сдававших экзамен в школе</p>
<p class="Content2">Каждая строка данных содержит номер школы, который мы присвоим в переменную <i>m</i>. Эта <i>m</i> будет индексом массива <i>cnt</i>, который будем использовать для хранения кол-ва учеников в школе номером <i>m</i>:</p>
<pre><ps>
    cnt [99] <cm>;кол-во учеников в школе</cm>
    Цикл для i от 0 до N-1 <cm>;цикл по строкам данных</cm>
        m = № школы из i-й строки данных
        <cm>;считаем кол-во учеников в m-й школе</cm>
        cnt[m] = cnt[m] + 1
</ps></pre>
<p class="Content2">Т.о., каждый элемент массива <i>cnt</i> –  это кол-во учеников в школе, номер которой есть индекс элемента</p>
<p class="Header3">Наибольший балл</p>
<p class="Content2">Вспомним пример ЕГЭ 2011 С4 №1, первая часть пункта <i>Выбор лучших</i>. Только здесь понадобится сохранять не одно лучшее значение, а лучшие значения для каждой школы: в массиве <i>bal</i>:</p>
<pre><ps>
    bal [99] <cm>;кол-во учеников в школе</cm>
    Цикл для i от 0 до N-1 <cm>;цикл по строкам данных</cm>
        m = № школы из i-й строки данных
        ball = балл ученика m-й школы
        если ball > bal[m] то
            bal[m] = ball
</ps></pre>
<p class="Header3">Количество лучших учеников</p>
<p class="Content2">Продолжаем воспоминания примера ЕГЭ 2011 С4 №1 второй части пункта <i>Выбор лучших</i>, и добавим вторую ветку нашему алгоритму. В ней, в массиве <i>amt</i>, будем считать количество одинаковых максимальных баллов школы номером <i>m</i>.</p>
<pre><ps>
    bal [99] <cm>;кол-во учеников в школе</cm>
    </ps>amt [99] <cm>;кол-во лучших в школе</cm><ps>
    Цикл для i от 0 до N-1 <cm>;цикл по строкам данных</cm>
        m = № школы из i-й строки данных
        ball = балл ученика m-й школы
        если ball > bal[m] то
            bal[m] = ball
            </ps>amt[m] = 1 <cm>;кол-во лучших в школе m пока 1</cm>
        иначе если ball = bal[m] то
            amt[m] = amt[m] + 1 <cm>;считаем кол-во лучших в школе m</cm>
</pre>
<p class="Header3">Имена</p>
<p class="Content2">Такой же пункт Имена как в примере ЕГЭ 2011 С4 №1, а в нашей задаче нужно учесть только фамилию, если лучший в школе единственный:</p>
<pre><ps>
    bal [99] <cm>;наибольший балл в школе</cm>
    amt [99] <cm>;кол-во лучших в школе</cm>
    </ps>nam [99] <cm>;фамилия одного лучшего в школе</cm>
    <ps>Цикл для i от 0 до N-1
        m = № школы из i-й строки данных
        ball = балл ученика m-й школы
        </ps>s = фамилия ученика m-й школы<ps>
        если ball > bal[m] то
            bal[m] = ball
            amt[m] = 1
            </ps>nam[m] = s<ps>
        иначе если ball = bal[m] то
            amt[m] = amt[m] + 1
</ps></pre>
<p class="Content2">Алгоритмы, которые мы рассмотрели, выполняются в одном цикле. В полном коде мы их объединим в один.</p>
<p class="Header3">Вывод результатов</p>
<p class="Content2">Нужно вывести  два значения: номер школы и либо фамилию, в случае одного лучшего в школе, либо количество лучших, если таковых несколько:</p>
<pre><ps>
	Цикл для i от 0 до 98 школ
        если сnt[i] > 2 то
            если amt[i] = 1 то
                печать i nam[i] <cm>;номер школы и имя лучшего</cm>
            иначе
                печать i amt[i] <cm>;номер школы и кол-во лучших</cm>
</ps></pre>
<p class="Header3">Полный код на Python</p>
<pre><ps>
  f = open("11C4v01.txt", encoding='utf-8', mode="r")
  n = <gr>int</gr>(f.readline())
  nsch = 99 <cm>#кол-во школ [1..99]</cm>
  cnt = [0] * nsch <cm>#кол-во учеников в школе</cm>
  bal = [0] * nsch <cm>#наибольший балл в школе</cm>
  amt = [0] * nsch <cm>#кол-во лучших учеников в школе</cm>
  nam = [''] * nsch <cm>#фамилия одного лучшего в школе</cm>

<cm>#суммируем баллы и считаем кол-во учеников по каждой школе</cm>
  <b>for</b> i <b>in</b> <gr>range</gr>(n):
      <cm>#a[0] - Фамилия</cm>
      <cm>#a[1] - Имя, оно не нужно</cm>
      <cm>#a[2] - номер школы [1..99]</cm>
      <cm>#a[3] - балл ученика(цы)</cm>
     a = f.readline().split()
     m = <gr>int</gr>(a[2])-1 <cm>#isch - [0..98]</cm>
     ball = <gr>int</gr>(a[3])
     <b>if</b>  ball > bal[m]:
        bal[m] = ball
        amt[m] = 1
        nam[m] = a[0]
    <b>else</b>:
        amt[m] += 1
    <cm>#считаем кол-во учеников в m-й школе</cm>
    cnt[m] += 1

<cm>#Вывод результатов</cm>
  m = 0
  <b>for</b> i <b>in</b> <gr>range</gr>(nsch):
     <b>if</b> cnt[i] >= 3:
        <b>if</b> amt[i] == 1:
           print(i+1," ", nam[i])
        <b>else</b>:
           print(i+1, " ", amt[i])
</ps></pre>
<div class="Header2"><strong>Пример. ЕГЭ 2011 С4 Вариант 5</strong></div>
<p class="Content2">После единых выпускных экзаменов по информатике в район пришла информация о том, какой ученик, какой школы сколько баллов набрал.</p>
<p class="Content2">В районе считается подозрительной ситуация, когда в школе более двух учащихся набирают одинаковый наибольший балл по школе.</p>
<p class="Content2">Районный методист решила выяснить номера таких школ.</p>
<p class="Content2">Программа должна вывести номера этих школ, в любом порядке.</p>
<p class="Content2">Если такая школа окажется одна, нужно вывести наибольший балл в этой школе, с указанием того, что это наибольший балл.</p>
<p class="Content2">Если таких школ не окажется, нужно вывести об этом сообщение.</p>
<p class="Content2">Напишите эффективную, в том числе и по используемой памяти, программу, которая должна вывести на экран требуемую информацию. Известно, что информатику сдавало больше 5-ти учеников района. Также известно, что в районе школы с некоторыми номерами не существуют.</p>
<p class="Content2">На вход программе сначала подаётся число учеников, сдававших экзамен. В каждой из следующих N строк находится информация об учениках в формате:</p>
<p class="Content2Center"><Фамилия> <Имя> <Номер школы> <Количество баллов></p>
<p class="Content2">где <Фамилия> — строка, состоящая не более чем из 30 символов без пробелов, <Имя> — строка, состоящая не более, чем из 20 символов без пробелов, <Номер школы> — целое число в диапазоне от 1 до 99, <Количество баллов> — целое число в диапазоне от 0 до 100. Эти данные записаны через пробел, причём ровно один между каждой парой (то есть, всего по три пробела в каждой строке).</p>
<p class="Content2">Пример входной строки:</br>Иванов Иван 50 87</br>Пример выходных данных:</br>5 50 74 87</br>Другой вариант выходных данных:</br>7</br>Наибольший балл = 74</br>Третий вариант выходных данных:</br>Нет таких школ</p>
<p class="Header2">Решение:</p>
<p class="Header3">Поиск максимума в каждой школе и подсчёт их совпадений</p>
<p class="Content2">Подобное было в С4 2011  №1 и №4. Каждая строка данных содержит номер школы, который мы присвоим переменной <i>m</i>. Её значение будет индексом массивов <i>bal</i> и <i>amt</i>. Массив <i>bal</i> хранит наибольший балл школы номером <i>m</i>, а массив <i>amt</i> – кол-во учеников школы номером <i>m</i> с наибольшим баллом:</p>
<pre><ps>
    bal [99] <cm>;наибольший балл в школе</cm>
    amt [99] <cm>;кол-во одинаковых лучших учеников в школе</cm>
    Цикл для i от 0 до N-1 <cm>;по строкам данных</cm>
        m = № школы из i-й строки данных
        ball = балл ученика m-й школы
        если ball > bal[m] то
            bal[m] = ball
            amt[m] = 1
        иначе если ball = bal[m] то
            amt[m] = amt[m] + 1
</ps></pre>
<p class="Header3">Вывод результатов</p>
<p class="Content2">Массивы <i>bal</i> и <i>amt</i> заполнили, теперь посчитаем кол-во «подозрительных» школ: если их несколько, то выведем их номера; если их нет, то выведем сообщение; если она одна, то выведем номер школы и наибольший балл. Подсчёт «подозрительных» школ будем вести в переменную <i>k</i>:</p>
<pre><ps>
    k = 0 <cm>;кол-во подозрительных школ</cm>
    Цикл для i от 0 до 99 ; по всем школам
        если amt[i] > 2 то
            ball = bal[i] <cm>;для случая когда k=1</cm>
            печать i " " <cm>;номер подозрительной школы и пробел</cm>
            k = k + 1
    <cm>;после того как прошлись по школам, рассмотрим два случая</cm>
    если k = 0 то <cm>;когда подозрительных школ нет</cm>
        печать "таких школ нет"
    иначе если k = 1 то <cm>;и когда подозрительная школа одна</cm>
        печать  <cm>;перешли на следующую строку</cm>
        печать "Наибольший балл:" ball
</ps></pre>
<p class="Header3">Полный код на Python</p>
<pre><ps>
  f = open("11C4v01.txt", encoding='utf-8', mode="r")
  n = f.readline()
   nsch = 99 <cm>#кол-во школ [1..99]</cm>
   bal = [0] * nsch <cm>#массив наибольших баллов по каждой школе</cm>
   #массив количеств одинаковых лучших учеников в школе</cm>
   amt = [0] * nsch <cm>

   <cm>#суммируем баллы и считаем кол-во учеников по каждой школе</cm>
   <b>for</b> i <b>in</b> <gr>range</gr>(<gr>int</gr>(n)):  
      <cm>#a[0] - Фамилия (она не нужна)</cm>
      <cm>#a[1] - Имя (оно не нужно)</cm>
      <cm>#a[2] - номер школы [1..99]</cm>
      <cm>#a[3] - балл ученика(цы)</cm>
  
  
  a = f.readline().split()
  m = <gr>int</gr>(a[2])-1 <cm>#m - [0..98]</cm>
  ball = <gr>int</gr>(a[3])

  <b>if</b> ball > bal[m]:
     bal[m] = ball
     amt[m] = 1
  <b>elif</b> ball == bal[m]:
     amt[m] += 1
   <cm>#Вывод результатов</cm>
   k = 0
   <b>for</b> i <b>in</b> <gr>range</gr>(nsch):
   <b>if</b> amt[i] > 2:
       ball = bal[i]
  print(i + 1, end=' ') <cm>#номер подозрительной школы</cm>
  k += 1
   <b>if</b> k == 0:
       print(" Таких школ нет")
   <b>elif</b> k == 1:
       print() <cm>#перешли на следующую строку</cm>
       print("Наибольший балл:", ball)
</ps></pre>
<div class="Header2"><strong>Пример. ЕГЭ 2011 С4 Вариант 6</strong></div>
<p class="Content2">При программировании школьной тестирующей системы по английскому языку выяснилось, что файлы с вопросами к тестам легко доступны и каждый может перед тестом открыть их и заранее узнать вопросы. Было решено закодировать файлы. Для этого придумали следующий алгоритм.</p>
<p class="Content2">Каждая строка файла кодируется отдельно.</p>
<p class="Content2">В каждой строке ищутся отдельные слова, и все символы слова сдвигаются по алфавиту циклически вправо на длину слова.</p>
<p class="Content2">Словом считается любая последовательность подряд идущих символов латинского алфавита, строчных и прописных.</p>
<p class="Content2">Циклический сдвиг символа по алфавиту вправо на X — замена символа на символ, стоящий в алфавите на X позиций дальше. Если при этом происходит выход за пределы алфавита, счёт начинается с начала алфавита.</p>
<p class="Content2">Пример циклического сдвига символов на 3 позиции: буква «Е» превращается в букву «Н», буква «t» — в букву «w» буква «Y» — в букву «В».</p>
<p class="Content2">Напишите эффективную, в том числе и по используемой памяти, программу (укажите используемую версию языка программирования, например Borland Pascal 7.0), которая должна закодировать строку по указанному алгоритму.</p>
<p class="Content2">На вход программе подается строка, состоящая из не более чем 250 символов латинского алфавита, пробелов, знаков препинания, разного рода скобок, кавычек и других символов. Строка заканчивается символом    &#171;#&#187;. Других символов &#171;#&#187; в строке нет.</p>
<p class="Content2">Программа должна вывести закодированную по указанному алгоритму строку.</p>
<p class="Content2">Пример входных данных:</br>Day, mice. &#171;Year&#187; &#8212; a mistake#</br>Пример выходных данных:</br>Gdb, qmgi. &#171;Ciev&#187; &#8212; b tpzahrl#</p>
<p class="Header2">Решение:</p>
<p class="Header3">Длина слова</p>
<p class="Content2">Чтобы сдвинуть символы на длину слова, нужно знать её величину. Посчитаем длину каждого слова строки <i>s</i>:</p>
<pre><ps>
    s = "…" <cm>;строка со словами и другими символами</cm>
    n = длина строки s
    flag = ЛОЖЬ
    Для i от 1 до n <cm>;по каждому символу строки s</cm>
        если s[i] буква то<cm>;буква-не буква</cm>
            если flag то
                len = len + 1
            иначе
                len = 1
                flag = ИСТИНА
</ps></pre>
<p class="Content2">После этого алгоритма значение <i>len</i> будет иметь длину слова, а значение <i>i</i> – позицию последнего символа слова. Так что, в стиле Python –  [(i-len):i] будет слово из массива.</p>
<p class="Header3">Двигаем символы</p>
<p class="Content2">Когда мы достигли последнего символа в слове, самое время сдвинуть каждый его символ:</p>
<pre><ps>
    …
        если s[i] буква то<cm>;буква-не буква</cm>
            …
        иначе
            если flag то
                flag = ЛОЖЬ
                Для k от 1 до len <cm>;по каждому символу слова</cm>
                    если s[i-k] + len  выходит за алфавит то 
                        s[i-k] = s[i-k] + len – 26 
                    иначе 
                        s[i-k] = s[i-k] + len
    печать s 

</ps></pre>
<p class="Content2">Переменная <i>flag</i> отвечает за начало подсчёта символов слова в первой ветке условия –  «буква-не буква», а во второй ветке – за то, чтобы сдвиг символов в слове был только один раз.</p>
<p class="Header3">Полный код на Python</p>
<pre>
   s = "Bike, Zip, Roller, 1345asdfads#"
   total = len(s)
   n = 0
   flag = False

   <b>for</b> i <b>in</b> <gr>range</gr>(total):
      c = s[i]
      <b>if</b> c.isalpha():
         <b>if</b> flag == False:
            len = 1
            flag = True
          <b>else</b>:
             len += 1
      <b>elif</b> flag == True:
         flag = False
         stmp = ""
         <b>for</b> k <b>in</b> <gr>range</gr>(len):
            <cm>#i-len - возврат к первому симолу слова</cm>
            <b>if</b> ord(s[i-len + k].upper()) - ord("A") + len > 25:
               stmp += chr(ord(s[i - len + k]) + len - 26 )
            <b>else</b>:
               stmp += chr(ord(s[i - len + k]) + len )
      <cm>#замена одной подстроки на другую</cm>
      s = s.replace(s[i - len:i], stmp) 

   print (s)
 </pre>
<div class="Header2"><strong>Пример. ЕГЭ 2011 С4 Вариант 7</strong></div>
<p class="Content2">После единых выпускных экзаменов по информатике в район пришла информация о том, какой ученик какой школы сколько баллов набрал. По положению об экзамене каждый район сам определяет, за какой балл нужно поставить какую оценку.</p>
<p class="Content2">Районный методист решила, что оценку «отлично» должны получить 20% участников (целое число, с отбрасыванием дробной части).</p>
<p class="Content2">Для этого она должна определить, какой балл должен был набрать ученик, чтобы получить «отлично».</p>
<p class="Content2">Если невозможно определить такой балл, чтобы «отлично» получили ровно 20% участников, «отлично» должно получить меньше участников, чем 20%.</p>
<p class="Content2">Если таких участников не окажется (наибольший балл набрали больше 20% участников) — эти и только эти ученики должны получить «отлично».</p>
<p class="Content2">Напишите эффективную, в том числе и по используемой памяти, программу (укажите используемую версию языка программирования, например Borland Pascal 7.0), которая должна вывести на экран наименьший балл, который набрали участники, получившие «отлично». Известно, что информатику сдавало больше 5-ти учеников. Также известно, что есть такое количество баллов, которое не получил ни один участник.</p>
<p class="Content2">На вход программе сначала подаётся число учеников, сдававших экзамен. В каждой из следующих N строк находится информация об учениках в формате:</p>
<p class="Content2Center"><Фамилия> <Имя> <Номер школы> <Количество баллов></p>
<p class="Content2">где <Фамилия> — строка, состоящая не более чем из 30 символов без пробелов, <Имя> — строка, состоящая не более чем из 20 символов без пробелов, <Номер школы> — целое число в диапазоне от 1 до 99, <Количество баллов> — целое число в диапазоне от 1до 100. Эти данные записаны через пробел, причём ровно один между каждой парой (то есть всего по три пробела в каждой строке).</p>
<p class="Content2">Пример входных данных:</br>Иванов Иван 50 87</br>Пример выходных данных:</br>78</p>
<p class="Header2">Решение:</p>
<p class="Header3">Количество оценок</p>
<p class="Content2">Посчитаем кол-во каждых оценок:</p>
<pre><ps>
	k[100] <cm>;кол-во оценок</cm>
	Для i от 0 до N-1 <cm>;цикл по строкам данных</cm>
		ball = оценка из i-й строки данных 
		k[ball] = k[ball] + 1 <cm>;считаем кол-во оценок</cm>
</ps></pre>
<p class="Content2">Индекс массива <i>k</i> – это конкретная оценка, а его элемент будет хранить кол-во этих оценок.</p>
<p class="Header3">Количество лучших из 20% участников</p>
<p class="Content2">Критерий – это 20% от N. Если суммировать оценки, например, в переменную <i>s</i>, то можно получить кол-во лучших оценок равное 20% или более</p>
<pre><ps>
	s = 0 <cm>;кол-во оценок</cm>
	i = 99 <cm>;начинаем с самой высокой оценки, её индекс = 99</cm>
	p = N DIV 5 <cm>;p – 20% от N</cm>
	Пока s < p  <cm>;цикл по</cm>
		s = s + k[i]
		i = i – 1 <cm>;спускаемся к следующей оценке</cm>
</ps></pre>
<p class="Content2">После этого цикла <i>i</i> будет содержать значение оценки</p>
<p class="Header3">Возможные варианты</p>
<p class="Content2">Рассмотрим некоторые варианты разного количества лучших оценок. Для простоты, диапазон оценок [1;5].</p>
<ol class="align_justify" start="1">
<li>N=10 (p=2) из них две пятёрки: <i>k</i> = [? ? ? ? 2] или одна пятёрка, и одна четвёрка: <i>k</i> = [? ? ? 1 1]. В 1-м случае нужно вывести оценку 5, а во 2-м – 4. После алгоритма выше, <i>s</i> = 2. Тогда, для нужного вывода, достаточно условия на равенства <i>p</i> с <i>s</i> :</li>
</ol>
<pre><ps>
	s = 0 <cm>;кол-во оценок</cm>
	i = 99 <cm>;начинаем с самой высокой оценки, её индекс = 99</cm>
	p = N DIV 5 <cm>;p – 20% от N</cm>
	Пока s < p  <cm>;цикл по</cm>
		s = s + k[i]
		i = i – 1 <cm>;спускаемся к следующей оценке</cm></ps>
	если s = p то
		печать i<ps>
</ps></pre>
<p class="Content2">аналогично, для N=20 (p=4) получим такие выводы для соответствующих последовательностей:</p>
<p class="Content3"><i>k</i> = [? ? ? ? 4] печать 5</p>
<p class="Content3"><i>k</i> = [? ? ? 3 1] = [? ? ? 2 2] = [? ? ? 1 3] печать 4</p>
<p class="Content3"><i>k</i> = [? ? 2 1 1] = [? ? 2 2 0] = [? ? 2 0 2] печать 3</p>
<p class="Content2">и т. д.</p>
<ol class="align_justify" start="2">
<li>N=20 (p=4) из них три пятёрки и две четвёрки: <i>k</i> = [? ? ? 2 3] или наоборот [? ? ? 3 2]. <i>s</i> = 5, т.е. больше <i>p</i>. По условию нужно выводить либо ровно 20%, либо меньше чем 20%. Тогда для этих двух последовательностей, выводим не четвёрку, а пятёрку. Значит, увеличим <i>i</i> на 1:</li>
</ol>
<pre><ps>
	s = 0 <cm>;кол-во оценок</cm>
	i = 99 <cm>;начинаем с самой высокой оценки, её индекс = 99</cm>
	p = N DIV 5 <cm>;p – 20% от N</cm>
	Пока s < p  <cm>;цикл по</cm>
		s = s + k[i]
		i = i – 1 <cm>;спускаемся к следующей оценке</cm>
	если s = p то
		печать i</ps>
	иначе
		i = i + 1 <cm>;возвращаемся к пятёркам</cm>
		печать i<ps>
</ps></pre>
<p class="Content2">По условию некоторых баллов не набрал никто, например, четвёрок: <i>k</i> = [? ? 2 0 3]. Новый алгоритм выше на выводе даст значение 0. Исключим нулевое/вые вхождения:</p>
<pre><ps>
	иначе
		i = i + 1 <cm>;возвращаемся к пятёркам</cm></ps>
		Пока k[i]=0 <cm>;встретили нулевую оценку</cm>
			i = i + 1 <cm>;уходим от нулевой оценки</cm><ps>
		печать i
</ps></pre>
<ol class="align_justify" start="3">
<li>Последнее, когда одно значение баллов, и оно больше 20%: N=10 (p=2) <i>k</i> = [? ? ? ? 3] печать 5. Здесь значение <i>s</i> должно быть равно <i>k[i]</i>:
		</li>
</ol>
<pre><ps>
	иначе</ps>
		если s=k[i] то
			печать i<ps>
		иначе
			i = i + 1
			Пока k[i]=0
				i = i + 1
			печать i
</ps></pre>
<p class="Header3">Полный код на Python</p>
<pre>
   f = open("11C4v01.txt", encoding='utf-8', mode="r")
   n = <gr>int</gr>(f.readline())
   k = [0] * 100 <cm>#кол-во оценок</cm>
   <b>for</b> i <b>in</b> <gr>range</gr>(n):
      <cm>#a[0] - Фамилия (она не нужна)</cm>
      <cm>#a[1] - Имя (оно не нужно)</cm>
      <cm>#a[2] - номер школы [1..99] (он не нужен)</cm>
      <cm>#a[3] - балл ученика(цы)</cm>	  
      a = f.readline().split()
      iball = <gr>int</gr>(a[3]) - 1 <cm>#iball - [0..99]</cm>
      k[iball] += 1

   p = n // 5
   s = 0
   i = 100
   <b>while</b> s &#038;lt p:
      i = i - 1
      s = s + k[i]
   <b>if</b> s == p:
      print(i+1)
   <b>else</b>:
      <b>if</b> k[i] == s:
         print(i+1)
      <b>else</b>:
         i = i + 1
         <b>while</b> k[i] == 0:
            i = i + 1
         print(i+1)

</pre>
<div class="Header2"><strong>Пример. ЕГЭ 2011 С4 Вариант 8</strong></div>
<p class="Content2">После единых выпускных экзаменов по информатике в район пришла информация о том, какой ученик какой школы сколько баллов набрал. По положению об экзамене оценку “2” (неудовлетворительно) получают ученики, набравшие меньше 40 баллов. Оценку “3” (удовлетворительно) получают 30% учеников среди оставшихся, за исключением тех из них, кто набрал больше 60 баллов.</p>
<p class="Content2">Если количество “троечников” оказывается больше 30%, то следует выбрать меньшую границу для оценки “4” (но только если при этом “3” получит хоть кто-нибудь).</p>
<p class="Content2">Напишите эффективную, в том числе и по используемой памяти, программу (укажите используемую версию языка программирования, например, Borland Pascal 7.0), которая должна вывести на экран наибольший балл, который набрали участники, получившие “удовлетворительно” и количество таких учеников. Известно, что информатику сдавало больше 50-ти учеников. Также известно, что есть такое количество баллов, которое не получил ни один участник.</p>
<p class="Content2">На вход программе сначала подаётся число учеников, сдававших экзамен. В каждой из следующих N строк находится информация об учениках в формате:</p>
<p class="Content2Center"><Фамилия> <Имя> <Номер школы> <Количество баллов></p>
<p class="Content2">где <Фамилия> — строка, состоящая не более, чем из 30 символов без пробелов, <Имя> — строка, состоящая не более, чем из 20 символов без пробелов, <Номер школы> — целое число в диапазоне от 1 до 99, <Количество баллов> — целое число диапазоне от 1 до 100. Эти данные записаны через пробел, причем ровно один между каждой парой (то есть, всего по три пробела в каждой строке).</p>
<p class="Content2">Пример входных данных:</br>Иванов Иван 50 87</br>Пример выходных данных:</br>78</p>
<p class="Header2">Решение:</p>
<p class="Header3">Количество оценок</p>
<p class="Content2">Аналогично 2011 С4 № 7 – посчитаем кол-во каждых оценок:</p>
<pre><ps>
	k[100] <cm>;[1..100] кол-во оценок</cm>
	Для i от 0 до N-1 <cm>;цикл по строкам данных</cm>
		ball = оценка из i-й строки данных 
		k[ball] = k[ball] + 1 <cm>;считаем кол-во оценок</cm>
</ps></pre>
<p class="Content2">Индекс массива <i>k</i> – это конкретная оценка, а элемент этого индекса будет хранить кол-во этих оценок.</p>
<p class="Header3">Количество двоечников и 30% от не двоечников</p>
<p class="Content2">Посчитаем кол-во двоечников, затем мы их исключим из общего кол-ва учеников:</p>
<pre><ps>
	s = 0 <cm>;кол-во двоечников</cm>
	Для i от 1 до 39 <cm>;первые 39 строк массива с оценками</cm>
		s = s + k[i] <cm>;суммируем всех двоечников</cm>
	p = (N - s) * 30 DIV 100 <cm>;30% от не двоечников</cm>
</ps></pre>
<p class="Header3">Кол-во троечников</p>
<p class="Content2">В 2011 С4 №7 мы искали только 20% лучших, значит критерий поиска был простым: <i>s &#038;lt p</i>. Теперь нужно искать не более 30% троечников и у них максимальный балл 60, значит критерий будет составным:</p>
<pre><ps>
	s = 0 i = 40 <cm>;сбрасываем сумму и начинаем с троечников</cm>
	Пока s < p И i < 61  <cm>;составной критерий для троечников</cm>
		i = i + 1 <cm>;переходим к следующей оценке</cm>
		s = s + k[i]<cm>;суммируем всех троечников</cm>
</ps></pre>
<p class="Header3">Возможные варианты</p>
<p class="Content2">Рассмотрим некоторые варианты разного количества троечников.</p>
<ol class="align_justify" start="1">
<li>Кол-во троечников составляет ровно 30%, и их максимальный балл меньше 60:</li>
</ol>
<pre><ps>
	Пока s < p И i < 61  <cm>;составной критерий для троечников</cm>
		i = i + 1 <cm>;переходим к следующей оценке</cm>
		s = s + k[i]<cm>;суммируем всех троечников</cm></ps>
	если s = p то <cm>;кол-во 3-ков 30% и их макс балл < 60</cm>
		<cm>;максимальная оценка и кол-во таких оценок</cm>
		печать i s
</pre>
<ol class="align_justify" start="2">
<li>Кол-во троечников меньше 30%, и их максимальный балл равен 60:</li>
</ol>
<pre>
	иначе если i = 60 И s < p то
		<cm>;максимальная оценка и кол-во таких оценок</cm>
		печать 60 s
   </pre>
<p class="Content2">Но! Если максимальный балл будет меньше чем 60, программа всё равно выведет 60… (в этом место нужно доработать).</p>
<ol class="align_justify" start="3">
<li>Троечники набравшие более 30% и какой-то один одинаковый:</li>
</ol>
<pre>
	иначе если  s = k[i] то
		<cm>;максимальная оценка и кол-во таких оценок</cm>
		печать i s
</pre>
<ol class="align_justify" start="4">
<li>Остальные троечники набравшие более 30% неодинаковые баллы:</li>
</ol>
<pre><ps>
	<cm>;убираем троечников, которые вышли за допустимую границу</cm>
	s = s - k[i]
	i = i – 1
	Пока k[i]=0
		i = i - 1
	печать i s <cm>;максимальная оценка и кол-во таких оценок</cm>
</ps></pre>
<p class="Content2">Подобный алгоритм описан в В 2011 С4 v07, только там, для избавления от отсутствующих оценок, нужно перемещаться в другую сторону массива оценок.</p>
<p class="Header3">Полный код на Python</p>
<pre>
  f = open("11C4v01.txt", encoding='utf-8', mode="r")
  n = <gr>int</gr>(f.readline())
  k = [0] * 100 <cm>#кол-во оценок</cm>
  <b>for</b> i <b>in</b> <gr>range</gr>(n):
	<cm>#a[0] - Фамилия (она не нужна)</cm>
	<cm>#a[1] - Имя (оно не нужно)</cm>
	<cm>#a[2] - номер школы [1..99] (он не нужен)</cm>
	<cm>#a[3] - балл ученика(цы)</cm>
	a = f.readline().split()
	iball = <gr>int</gr>(a[3]) - 1 <cm>#iball - [0..99]</cm>
	k[iball] += 1
  s = 0
  i = 0
  <b>for</b> i <b>in</b> <gr>range</gr>(39): <cm>#[0..38] т.е. первые 39 баллов</cm>
	s = s + k[i]
  print("i:",i," s:",s)
  p = (n-s)*30 // 100
  s = 0
  
  <cm>#старое значение i=38, а троечники начинаются с 39,</cm>
  <cm>зн. увеличим i на 1 до обращения к массиву k:</cm>
  <b>while</b> s < p and i < 59: <cm>#здесь 60 это индекс 61-го балла!</cm>
	i = i + 1
	s = s + k[i]

  <b>if</b> s == p:
	print(i+1," ",s)

  <b>elif</b> i == 59 and s < p:
	<cm>#выведет 60 даже если максимальный балл троечников < 60</cm>
	print("60", s)

  <b>elif</b> s == k[i]:
	print(i + 1, " ", s)
  <b>else</b>:
	s -= k[i]
	i -= 1
  <b>while</b> k[i] == 0:
	i -= 1
  print(i + 1, " ", s)

</pre>
<div class="Header2"><strong>Пример. ЕГЭ 2011 С4 Вариант 9</strong></div>
<p class="Content2">На вход программе подается последовательность символов, заканчивающаяся символом #. Другие символы # во входной последовательности отсутствуют.</p>
<p class="Content2">Программа должна вывести на экран латинскую букву встречающуюся во входной последовательности наибольшее количество раз (во второй строке).</p>
<p class="Content2">Если таких букв во входной последовательности окажется несколько, программа должна вывести на экран всех, через пробел, в алфавитном порядке.</p>
<p class="Content2">Строчные и прописные буквы не различаются.</p>
<p class="Content2">Напишите эффективную, в том числе и по используемой памяти, программу (укажите используемую версию языка программирования, например Borland Pascal 7.0), которая должна решать поставленную задачу.</p>
<p class="Content2">Пример входных данных:</br>Day, mice. &#171;Year&#187; &#8212; a mistake#</br>Пример выходных данных:</br>A</br>4</p>
<p class="Header2">Решение:</p>
<p class="Header3">Количество каждой буквы в строке</p>
<pre><ps>
    s = "…" <cm>;строка со словами и другими символами</cm>
    n = длина строки s
    num[26] <cm>;массив количества латинских букв алфавита</cm>
    Для i от 1 до n <cm>;по каждому символу строки s</cm>
        если s[i] буква то <cm>;буква-не буква</cm>
            k = номер буквы
            <cm>;увеличиваем счётчик количества таких букв</cm>
            num[k] = num[k] + 1

</ps></pre>
<p class="Header3">Найдём максимум и их количество</p>
<p class="Content2">Найдём буквы, встречающиеся наибольшее количество раз, и число этих раз в массиве <i>s</i>:</p>
<pre><ps>
    ic = 0 <cm>;индекс первой буквы ('A') в массиве num</cm>
    k = 1 <cm>;счётчик количества максимумов в массиве num</cm>
    Для i от 1 до 26 <cm>;от 'B' до 'Z'</cm>
        если num[i] > num[ic] то ; находим максимум
            ic = i <cm>;индекс первой буквы меняем на индекс второй</cm>
            k = 1
        иначе если num[i] = num[ic] то </cm>;такой же максимум</cm>
            k = k + 1 <cm>;увеличиваем счётчик кол-ва максимумов</cm>

</ps></pre>
<p class="Header3">Вывод результатов</p>
<pre><ps>
    если k = 1 то <cm>;если максимум один</cm>
        печать ic <cm>;символ ic</cm>
    иначе
    Для i от 0 до 26 <cm>;от 'A' до 'Z'</cm>
        если num[i] = num[ic] то
            печать i ' ' <cm>;символ i</cm>
    печать num[ic] <cm>;кол-во максимумов</cm>
			
</ps></pre>
<p class="Header3">Полный код на Python</p>
<pre>
   <cm>#s = "Day, mice. 'Year' - a mistake#"</cm>
   s = "ABCD ABCE ABCF#"
   num = [0] * 26 <cm>#массив кол-ва букв алфавита</cm>

   <b>for</b> c <b>in</b> s:
      <b>if</b> c.isalpha():
         k = ord(c.upper()) - ord('A')
         num[k] += 1
   k = 1
   ic = 0
   <b>for</b> i <b>in</b> <gr>range</gr>(1,len(num)):
      <b>if</b> num[i] > num[ic]:
         ic = i
         k = 1
      <b>elif</b> num[i] == num[ic]:
         k += 1

   <b>if</b> k == 1:
      print (chr(ic + ord('A')))
   <b>else</b>:
      <b>for</b> i <b>in</b> <gr>range</gr>(0, len(num)):
         <b>if</b> num[i] == num[ic]:
            print(chr(i + ord('A')),end=" ")
         print()
   print(num[ic])

</pre>
<div class="Header2"><strong>Пример. ЕГЭ 2011 С4 Вариант 10</strong></div>
<p class="Content2">На вход программе подается последовательность символов, заканчивающаяся символом #. Другие символы # во входной последовательности отсутствуют.</p>
<p class="Content2">Программа должна вывести на экран символы латинского алфавита, в порядке увеличения частоты встречаемости во входной последовательности.</p>
<p class="Content2">Если буква во входной последовательности не встречается, её выводить не нужно.</p>
<p class="Content2">Если несколько букв встречаются одинаковое количество раз, программа должна вывести их в алфавитном порядке.</p>
<p class="Content2">Строчные и прописные буквы не различаются.</p>
<p class="Content2">Напишите эффективную, в том числе и по используемой памяти, программу (укажите используемую версию языка программирования, например Borland Pascal 7.0), которая должна решать поставленную задачу.</p>
<p class="Content2">Пример входных данных:</br>Aced, ccedaa f#</br>Пример выходных данных:</br>FDEAC</p>
<p class="Header2">Решение:</p>
<p class="Header3">Количество каждой буквы в строке</p>
<p class="Content2">Для вывода букв, в порядке увеличения частоты встречаемости, нужен массив количества букв алфавита:</p>
<pre><ps>
    s = "…" <cm>;строка со словами и другими символами</cm>
    n = длина строки s
    num[26] <cm>;массив количества латинских букв алфавита</cm>
    Для i от 1 до n <cm>;по каждому символу строки s</cm>
        если s[i] буква то <cm>;буква-не буква</cm>
            k = номер буквы
          <cm>;увеличиваем счётчик количества таких букв</cm>
            num[k] = num[k] + 1
			
</ps></pre>
<p class="Header3">Сортировка </p>
<p class="Content2">Отсортируем массив <i>num</i> по возрастанию:</p>
<pre><ps>
    Для i от 1 до 25 <cm>;от 'A' до 'Y'</cm>
        Для j от 25-i
            если num[j] > num[j+1] то
                t = num[j]
                num[j] = num[j+1]
                num[j+1] = t ;

</ps></pre>
<p class="Content2">Получили отсортированную по возрастанию, частоту встречаемости символов, но неизвестно какие это будут символы – индексы будут утеряны.</p>
<p class="Content2">Выход такой: завести массив символов по алфавиту <i>sym</i>. Далее, одновременно с сортировкой массива <i>num</i>, будут перестановки элементов массива <i>sym</i> с теми же индексами, что и индексы массива <i>num</i>:</p>
<pre><ps>
    …
    sym = [a,b,c,…,z]
    Для i от 1 до 25 <cm>;от 'A' до 'Y'</cm>
        Для j от 25-i ;
            если num[j] > num[j+1] то
                t = num[j]              c = sym[y]
                num[j] = num[j+1]       sym[j] = sym[j+1]
                num[j+1] = t            sym[j+1] = c

</ps></pre>
<p class="Header3">Вывод результатов</p>
<p class="Content2">Если дана строка <i>Aced, ccedaa f</i> , то после сортировки массивы <i>num</i> и <i>sym</i> будут такими:</p>
<p class="Content3">num &#8212; [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 2 3 3]</p>
<p class="Content3">sym &#8212; [b g h I j k l  m n o p q r s t u v w x y z f d e a c]</p>
<p class="Content3">Выводим символы массива <i>sym</i>, начиная с символа <i>f</i>:</p>
<pre><ps>
    j = 22 <cm>;индекс символа 'f'</cm>
    Для i от j до 26 <cm>;от 22 до 26</cm>
        печать sym[i]

</ps></pre>
<p class="Content2">Найти значение первого символа легко: если посмотреть на массив <i>num</i>, то в нём 21 нуль:</p>
<pre><ps>
    j = 0 <cm>;индекс символа 'f'</cm>
    Пока num[j] = 0 ; после цикла j будет равно 22
        j = j + 1
    Для i от j до 26 <cm>;от 22 до 26</cm>
        печать sym[i]

</ps></pre>
<p class="Header3">Полный код на Python</p>
<pre>
   s = "Aced, ccedaa f#" <cm>#символ '#' в этом коде не нужен</cm>
   num = [0] * 26 <cm>#массив кол-ва латинских букв алфавита</cm>
   sym = [0] * 26 <cm>#массив латинских букв алфавита ('a'.. 'z')</cm>

   <b>for</b> i <b>in</b> <gr>range</gr>(26):
      sym[i] = chr(i+65)

   <b>for</b> c <b>in</b> s:
      <b>if</b> c.isalpha():
         k = ord(c.upper()) - ord('A')
         num[k] += 1

   <b>for</b> i <b>in</b> <gr>range</gr>(26 - 1):
      <b>for</b> j <b>in</b> <gr>range</gr>(26 - i - 1):
         <b>if</b> num[j] > num[j + 1]:
            num[j], num[j + 1] = num[j + 1], num[j]
            sym[j], sym[j + 1] = sym[j + 1], sym[j]

   j=0
   <b>while</b> num[j] == 0:
      j += 1
   <b>for</b> i <b>in</b> <gr>range</gr>(j, 26):
      print(sym[i],end=" ")
</pre>
]]></content:encoded>
			<wfw:commentRss>http://kshu.su/?feed=rss2&#038;p=214</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Алгоритмизация</title>
		<link>http://kshu.su/?p=29</link>
		<comments>http://kshu.su/?p=29#comments</comments>
		<pubDate>Mon, 29 Sep 2014 13:28:42 +0000</pubDate>
		<dc:creator><![CDATA[Kirill Schurakhtenkov]]></dc:creator>
				<category><![CDATA[Информатика]]></category>

		<guid isPermaLink="false">http://kshu/?p=29</guid>
		<description><![CDATA[Понятие алгоритма, описаны основные алгоритмические конструкции: следование, ветвление цикл и подпрограмма. Изображены их блок схемы в виде интерактивных моделей. Алгоритм это упорядоченная последовательность действий Алгоритм линейный – последовательное выполнение команд, его блок схема состоит из: Блок Ввод: операторы определения имён переменных, установления их типа и присваивания переменным неким значениям. Блок Вычисления: операторы сравнения арифметические, логические, [&#8230;]]]></description>
				<content:encoded><![CDATA[<p class="Content2">Понятие алгоритма, описаны основные алгоритмические конструкции: следование, ветвление цикл и подпрограмма. Изображены их блок схемы в виде интерактивных моделей.</p>
<p>	<span id="more-29"></span></p>
<div class="Header2"><strong>Алгоритм</strong></div>
<p class="Content2">это упорядоченная последовательность действий</p>
<div class="Header2"><strong>Алгоритм линейный</strong></div>
<p class="Content2"> – последовательное выполнение команд, его блок схема состоит из:</p>
<ol class="align_justify">
<li>Блок Ввод: операторы определения имён переменных, установления их типа и присваивания переменным неким значениям.</li>
<li>Блок Вычисления: операторы сравнения арифметические, логические, тригонометрические операции, операции извлечения квадратного корня и т.д. Присваивание результату значения полученного в вычислениях.</li>
<li>Блок Вывод: вывод полученных результатов на экран.</li>
</ol>
<p class="Content2Top">Нарисуем блок схему следующей записи:</p>
<pre>
1	Ввод значения для переменной <b>x</b>
2	y = x + 20
3	y = 2y
4	Вывод результата значения переменой <b>y</b>
</pre>
<p class="Content2Top">Блок схема вышеприведённого алгоритма, есть интерактивная модель,  которая в режиме реального времени описывает: поведение алгоритма, вычисление уравнений и вывода значений переменных в соответствующие элементы модели.</p>
<p>	<!-- FLASH OBJECT BEGIN --></p>
<div id="block30x30center">
<object id="Algo" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="768" height="576" align="middle"><param name="movie" value="wp-content/uploads/AlgoLINE.swf" /><param name="bgcolor" value="#ccccff" /><param name="scale" value="showall" /><param name="allowFullScreen" value="true" /><param name="AllowScriptAccess" value="sameDomain" /><!--[if !IE]>--><br />
    <object width="768" height="576" type="application/x-shockwave-flash" data="wp-content/uploads/AlgoLINE.swf"><param name="bgcolor" value="#ccccff" /><param name="allowFullScreen" value="true" /><param name="AllowScriptAccess" value="sameDomain" /><!--<![endif]--></p>
<p>    <!-- 
<div style="width:800px; height:600px;">--><br />
      <a href="http://www.adobe.com/go/getflash" target="_blank"> <img src="wp-content/uploads/get_flash_player.gif" border="0" alt="Установить Adobe Flash player" /> </a><br />
     <!--</div>

     --></p>
<p>      <!--[if !IE]>--></object><br />
    <!--<![endif]--></object>
</div>
<p><!-- FLASH OBJECT END --></p>
<div class="Header2"><strong>Алгоритм ветвления</strong></div>
<p class="Content2">Алгоритм ветвление это выполнение команд, с проверкой истинности некоего условия и в зависимости от результата этой проверки происходит разветвление одной последовательности на несколько. Блок схема алгоритма ветвления состоит из тех же блоков что и линейный, плюс блок Условие:</p>
<p class="Content2">Блок Условие, здесь проверяется истинность условия,  если оно истинно то, происходит переход в одну часть программы иначе в другую. Условие представлено в виде логического выражения, где сравниваются между собой числа, переменные.</p>
<p class="Content2Top">Различают три структуры ветвления: Неполное, полное и вложенное.</p>
<div class="Header2">Неполное ветвление</div>
<p class="Content2">Алгоритм неполного ветвления способен решить одно условие. <br />
Нарисуем блок схему следующего условия:</p>
<div class="Header3"><b>y = x + 20;  при x < 2</b></div>
<p class="Content2">Для наглядности представим условие на оси Х</p>
<div id="block30x30center"><img src="wp-content/uploads/in-03-01.png" border="0" alt="" /></div>
<p class="Content2">Теперь изобразим блок схему. Блок схема вышеприведённого условия, есть интерактивная модель, которая в режиме реального времени описывает: поведение алгоритма, вычисление уравнений и вывода значений переменных в соответствующие элементы модели. Перед запуском алгоритма, можно выбрать начальное значение переменной <b>x</b>:</p>
<p>	<!-- FLASH OBJECT BEGIN --></p>
<div id="block30x30center">
<object id="Algo" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="768" height="576" align="middle"><param name="movie" value="wp-content/uploads/AlgoIF1.swf" /><param name="bgcolor" value="#ccccff" /><param name="scale" value="showall" /><param name="allowFullScreen" value="true" /><param name="AllowScriptAccess" value="sameDomain" /><!--[if !IE]>--><br />
    <object width="768" height="576" type="application/x-shockwave-flash" data="wp-content/uploads/AlgoIF1.swf"><param name="bgcolor" value="#ccccff" /><param name="allowFullScreen" value="true" /><param name="AllowScriptAccess" value="sameDomain" /><!--<![endif]--></p>
<p>    <!-- 
<div style="width:800px; height:600px;">--><br />
      <a href="http://www.adobe.com/go/getflash" target="_blank"> <img src="images/get_flash_player.gif" border="0" alt="Установить Adobe Flash player" /> </a><br />
     <!--</div>

     --></p>
<p>      <!--[if !IE]>--></object><br />
    <!--<![endif]--></object>
</div>
<p><!-- FLASH OBJECT END --></p>
<div class="Header2">Полное ветвление</div>
<p class="Content2">Алгоритм полного ветвления способен найти одно решение из двух возможных.</p>
<p class="Content2">Пример. Дана система из двух условий:</p>
<div id="block30x30center"><img src="wp-content/uploads/in-03-02.png" border="0" alt="" /> </div>
<p class="Content2">Для наглядности, эту систему можно представить графически</p>
<div id="block30x30center"> <img src="wp-content/uploads/in-03-03.png" border="0" alt="" /> </div>
<p class="Content2">Блок схема вышеприведённого условия, есть интерактивная модель, которая в режиме реального времени описывает: поведение алгоритма, вычисление уравнений и вывода значений переменных в соответствующие элементы модели. Перед запуском алгоритма, можно выбрать начальное значение переменной <b>x</b>:</p>
<p><!-- FLASH OBJECT BEGIN --></p>
<div id="block30x30center">
<object id="Algo" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="768" height="576" align="middle"><param name="movie" value="wp-content/uploads/AlgoIF2.swf" /><param name="bgcolor" value="#ccccff" /><param name="scale" value="showall" /><param name="allowFullScreen" value="true" /><param name="AllowScriptAccess" value="sameDomain" /><!--[if !IE]>--><br />
    <object width="768" height="576" type="application/x-shockwave-flash" data="wp-content/uploads/AlgoIF2.swf"><param name="bgcolor" value="#ccccff" /><param name="allowFullScreen" value="true" /><param name="AllowScriptAccess" value="sameDomain" /><!--<![endif]--></p>
<p>    <!-- 
<div style="width:800px; height:600px;">--><br />
      <a href="http://www.adobe.com/go/getflash" target="_blank"> <img src="images/get_flash_player.gif" border="0" alt="Установить Adobe Flash player" /> </a><br />
     <!--</div>

     --></p>
<p>      <!--[if !IE]>--></object><br />
    <!--<![endif]--></object>
</div>
<p><!-- FLASH OBJECT END --></p>
<div class="Header2">Вложенное ветвление</div>
<p class="Content2">Когда выбора из двух вычислений недостаточно применяют условия, содержащие в себе вложенные условия. Так в следующей записи</p>
<div id="block30x30center"> <img src="wp-content/uploads/in-03-04.png" border="0" alt="" /> </div>
<p class="Content2">переменная <strong>y</strong> может принять три результата, значит полного ветвления не достаточно, здесь нужна дополнительная команда или команды условия.</p>
<p class="Content2">Для  наглядности представим систему условий графически:</p>
<div id="block30x30center"> <img src="wp-content/uploads/in-03-05.png" border="0" alt="" /> </div>
<p class="Content2">Блок схема вышеприведённого условия, есть интерактивная модель, которая в режиме реального времени описывает: поведение алгоритма, вычисление уравнений и вывода значений переменных в соответствующие элементы модели. Перед запуском алгоритма, можно выбрать начальное значение переменной <b>x</b>:</p>
<p><!-- FLASH OBJECT BEGIN --></p>
<div id="block30x30center">
<object id="Algo" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="768" height="576" align="middle"><param name="movie" value="wp-content/uploads/AlgoIF3.swf" /><param name="bgcolor" value="#ccccff" /><param name="scale" value="showall" /><param name="allowFullScreen" value="true" /><param name="AllowScriptAccess" value="sameDomain" /><!--[if !IE]>--><br />
    <object width="768" height="576" type="application/x-shockwave-flash" data="wp-content/uploads/AlgoIF3.swf"><param name="bgcolor" value="#ccccff" /><param name="allowFullScreen" value="true" /><param name="AllowScriptAccess" value="sameDomain" /><!--<![endif]--></p>
<p>    <!-- 
<div style="width:800px; height:600px;">--><br />
      <a href="http://www.adobe.com/go/getflash" target="_blank"> <img src="images/get_flash_player.gif" border="0" alt="Установить Adobe Flash player" /> </a><br />
     <!--</div>

     --></p>
<p>      <!--[if !IE]>--></object><br />
    <!--<![endif]--></object>
</div>
<p><!-- FLASH OBJECT END --></p>
<div class="Header2"></div>
<div class="Header2"></div>
<div class="Header2"></div>
<div class="Header2"></div>
<div class="Header2"></div>
<div class="Header2"></div>
<div class="Header2"></div>
<div class="Header2"></div>
<div class="Header2"></div>
<div class="Header2"><strong>Цикл</strong></div>
<p class="Content2">Большинство вычислений требует многократного повторения одних и тех же действий или повторного выполнения определённых операторов. Для этих вычислений применяют циклические алгоритмы, т.е. многократно повторяющиеся части программы. Есть два типа циклов: с известным числом повторений(счётчик) и неизвестным(условие).</p>
<p class="Content2">
<p class="Content2">
<p class="Content2">
<div class="Header2">Цикл со счётчиком (FOR, Для)</div>
<p class="Content2">Изучим блок схему и алгоритм цикла со счётчиком для следующего примера: Вывести значения функции y = 2x+4 в интервале от 2 до 5, с шагом 1, или сокращённо:</p>
<div class="Header3"><b>y = 2x+4; x	&isin;   [2..5]; h = 1</b></div>
<p class="Content2">Блок схема вышеприведённого примера,есть интерактивная модель,  которая в режиме реального времени описывает: поведение циклического алгоритма, вычисление уравнений и вывода значений переменных в соответствующие элементы модели. Перед запуском алгоритма, можно выбрать начальные и конечные границы цикла и шаг цикла, и при необходимости принудительно завершить работу цикла.</p>
<p><!-- FLASH OBJECT BEGIN --></p>
<div id="block30x30center">
<object id="Algo" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="768" height="576" align="middle"><param name="movie" value="wp-content/uploads/AlgoFOR.swf" /><param name="bgcolor" value="#ccccff" /><param name="scale" value="showall" /><param name="allowFullScreen" value="true" /><param name="AllowScriptAccess" value="sameDomain" /><!--[if !IE]>--><br />
    <object width="768" height="576" type="application/x-shockwave-flash" data="wp-content/uploads/AlgoFOR.swf"><param name="bgcolor" value="#ccccff" /><param name="allowFullScreen" value="true" /><param name="AllowScriptAccess" value="sameDomain" /><!--<![endif]--></p>
<p>    <!-- 
<div style="width:800px; height:600px;">--><br />
      <a href="http://www.adobe.com/go/getflash" target="_blank"> <img src="images/get_flash_player.gif" border="0" alt="Установить Adobe Flash player" /> </a><br />
     <!--</div>

     --></p>
<p>      <!--[if !IE]>--></object><br />
    <!--<![endif]--></object>
</div>
<p><!-- FLASH OBJECT END --></p>
<p class="Content2">В блок схеме, счётчик цикла это переменная <b>x</b>, после выполнения очередного тела цикла, значение счётчика будет суммировано на величину <b>шаг</b>. Затем следует возвращение для проверки истинности условия цикла: если текущее значение <b>x</b> меньше  <b>5</b>,  то цикл повторяется, иначе программа выходит за пределы цикла.</p>
<table  class=table_11Tahoma border="1" cellspacing="2" cellpadding="2">
<tr>
<th scope="col">Трассировка алгоритма</th>
</tr>
<tr>
<td>x = 2<br />
y = 2 * 2 + 4<br />
x = x + 1
</td>
</tr>
<tr>
<td>x = 3<br />
y = 2 * 3 + 4<br />
x = x + 1
</td>
</tr>
<tr>
<td>x = 4<br />
y = 2 * 4 + 4<br />
x = x + 1
</td>
</tr>
<tr>
<td>x = 5<br />
y = 2 * 5 + 4<br />
x = x + 1
</td>
</tr>
</table>
<p class="Content2">Цикл со счётчиком выполняет известное число повторений тела цикла, а есть ещё циклы с условием, которые выполняют тело цикла вечное количество повторений при истинности условия. Они бывают двух видов: с предусловием, и с постусловием.</p>
<div class="Header2">Цикл с предусловием (While, Пока)</div>
<p class="Content2">Составим блок-схему предыдущей задачи, используя цикл с предусловием</p>
<p class="Content2">Блок схема вышеприведённого примера, есть интерактивная модель, которая в режиме реального времени описывает: поведение циклического алгоритма, вычисление уравнений и вывода значений переменных в соответствующие элементы модели. Перед запуском алгоритма, можно выбрать начальные и конечные границы цикла и шаг цикла, и при необходимости принудительно завершить работу цикла.</p>
<p><!-- FLASH OBJECT BEGIN --></p>
<div id="block30x30center">
<object id="Algo" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="768" height="576" align="middle"><param name="movie" value="wp-content/uploads/AlgoWHILE.swf" /><param name="bgcolor" value="#ccccff" /><param name="scale" value="showall" /><param name="allowFullScreen" value="true" /><param name="AllowScriptAccess" value="sameDomain" /><!--[if !IE]>--><br />
    <object width="768" height="576" type="application/x-shockwave-flash" data="wp-content/uploads/AlgoWHILE.swf"><param name="bgcolor" value="#ccccff" /><param name="allowFullScreen" value="true" /><param name="AllowScriptAccess" value="sameDomain" /><!--<![endif]--></p>
<p>    <!-- 
<div style="width:800px; height:600px;">--><br />
      <a href="http://www.adobe.com/go/getflash" target="_blank"> <img src="images/get_flash_player.gif" border="0" alt="Установить Adobe Flash player" /> </a><br />
     <!--</div>

     --></p>
<p>      <!--[if !IE]>--></object><br />
    <!--<![endif]--></object>
</div>
<p><!-- FLASH OBJECT END --></p>
<p class="Content2">После присваивания, проверяется истинность условия и если оно истинно, выполняется тело цикла, затем снова проверяется условие и так до бесконечности, пока условие будет истинным. Как только условие станет ложным, программа выйдет за пределы цикла. Если же при первой проверке условия, результат окажется ложным, то тело цикла не выполнится ни разу и программа выйдет за пределы цикла.</p>
<div class="Header2">Цикл с постусловием (Do, Делать)</div>
<p class="Content2">Составим блок-схему предыдущей задачи, используя цикл с постусловием</p>
<p class="Content2">Блок схема вышеприведённого примера, есть интерактивная модель, которая в режиме реального времени описывает: поведение циклического алгоритма, вычисление уравнений и вывода значений переменных в соответствующие элементы модели. Перед запуском алгоритма, можно выбрать начальные и конечные границы цикла и шаг цикла, и при необходимости принудительно завершить работу цикла.</p>
<p><!-- FLASH OBJECT BEGIN --></p>
<div id="block30x30center">
<object id="Algo" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="768" height="576" align="middle"><param name="movie" value="wp-content/uploads/AlgoDO.swf" /><param name="bgcolor" value="#ccccff" /><param name="scale" value="showall" /><param name="allowFullScreen" value="true" /><param name="AllowScriptAccess" value="sameDomain" /><!--[if !IE]>--><br />
    <object width="768" height="576" type="application/x-shockwave-flash" data="wp-content/uploads/AlgoDO.swf"><param name="bgcolor" value="#ccccff" /><param name="allowFullScreen" value="true" /><param name="AllowScriptAccess" value="sameDomain" /><!--<![endif]--></p>
<p>    <!-- 
<div style="width:800px; height:600px;">--><br />
      <a href="http://www.adobe.com/go/getflash" target="_blank"> <img src="images/get_flash_player.gif" border="0" alt="Установить Adobe Flash player" /> </a><br />
     <!--</div>

     --></p>
<p>      <!--[if !IE]>--></object><br />
    <!--<![endif]--></object>
</div>
<p><!-- FLASH OBJECT END --></p>
<p class="Content2">После присваивания, выполняется тело цикла, затем проверяется истинность условия, а в остальном работа аналогична циклу с предусловием. Главное его отличие от цикла с предусловием, это выполнение тела цикла хотя бы один раз вне зависимости от истинности условия.</p>
]]></content:encoded>
			<wfw:commentRss>http://kshu.su/?feed=rss2&#038;p=29</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Логические законы и задачи</title>
		<link>http://kshu.su/?p=81</link>
		<comments>http://kshu.su/?p=81#comments</comments>
		<pubDate>Mon, 29 Sep 2014 13:09:29 +0000</pubDate>
		<dc:creator><![CDATA[Kirill Schurakhtenkov]]></dc:creator>
				<category><![CDATA[Информатика]]></category>

		<guid isPermaLink="false">http://kshu/?p=24</guid>
		<description><![CDATA[Закон не противоречия. Законы: исключённого третьего, двойного отрицания, де Моргана, переместительный, сочетательный, распределительный. Решение примеров. Закон не противоречия А &#038; &#172;А = 0 Закон исключённого третьего А &#124; &#172;А = 1 Закон двойного отрицания &#172;&#172;А = А Законы де Моргана (А V B) = A &#923; B (А &#923; B) = A V A Переместительный [&#8230;]]]></description>
				<content:encoded><![CDATA[<p class="Content2">Закон не противоречия. Законы: исключённого третьего, двойного отрицания, де Моргана, переместительный, сочетательный, распределительный. Решение примеров.</p>
<p>	<span id="more-81"></span></p>
<div class="Header2">Закон не противоречия</div>
<p class="Content2"> А &#038; &#172;А = 0</p>
<div class="Header2">Закон исключённого третьего</div>
<p class="Content2"> А | &#172;А = 1</p>
<div class="Header2">Закон двойного отрицания</div>
<p class="Content2">&#172;&#172;А = А</p>
<div class="Header2">Законы де Моргана</div>
<p class="Content2"><font style="text-decoration:overline;">(А V B)</font> = <font style="text-decoration:overline;">A</font> &#923; <font style="text-decoration:overline;">B</font></p>
<p class="Content2"><font style="text-decoration:overline;">(А &#923; B)</font> = <font style="text-decoration:overline;">A</font> V <font style="text-decoration:overline;">A</font></p>
<div class="Header2">Переместительный закон (коммутативность)</div>
<p class="Content2">Логическое умножение: А &#038; В = В &#038; А </p>
<p class="Content2">Логическое сложение: А | В = В | А</p>
<div class="Header2">Сочетательный закон (ассоциативность)</div>
<p class="Content2">Логическое умножение: (А &#038; В) &#038; C = A &#038; (В &#038; C)</p>
<p class="Content2">Логическое сложение:   (А | В) | C = A | (В | C)</p>
<div class="Header2">Распределительный закон (дистрибутивность)</div>
<p class="Content2">A &#038; (В | C) = (А &#038; В) | (A &#038; C) &#8212; дистрибутивность умножения относительно сложения</p>
<p class="Content2">A | (В &#038; C) = (А | В) &#038; (A | C) &#8212; дистрибутивность сложения относительно умножения</p>
<p class="Content2Top">(А | В) &#038; (C | D) =<br />
(А &#038; C) | (A &#038; D) |<br />
(B &#038; C) | (B &#038; D)
</p>
<div class="Header2">Закон переменной с самой собой</div>
<p class="Content2">(А V A) = A</p>
<p class="Content2">(А &#923; A) = A</p>
<div class="Header2">Закон поглощения</div>
<p class="Content2">А V (А &#923; В) = A</p>
<p class="Content2">А &#923; (А V В) = A</p>
<p class="Content2">А V (<font style="text-decoration:overline;">A</font> &#923; В) = A &#923; B</p>
<div class="Header2">Примеры</div>
<p class="Content2Top"><strong>Пример 1</strong>. Упростить логическое выражение: (А &#038; В) | (A &#038; &#172;B)</p>
<p class="Content2"><strong>Решение</strong>:</p>
<p class="Content2">По закону дистрибутивности: (А &#038; В) | (A &#038; &#172;B) = А &#038; (В | &#172;B)</p>
<p class="Content2">По закону исключённого третьего: А &#038; (В | &#172;B) = А &#038; 1 = А</p>
<p class="Content2Top"><strong>Пример 2</strong>. Даны четыре логических выражения:</p>
<ol class="align_justify">
<li><font style="text-decoration:overline;">A</font> V <font style="text-decoration:overline;">B</font> V <font style="text-decoration:overline;">C</font></li>
<li>(<font style="text-decoration:overline;">A</font> &#923; <font style="text-decoration:overline;">B</font>) V <font style="text-decoration:overline;">C</font></li>
<li>(<font style="text-decoration:overline;">A</font> V <font style="text-decoration:overline;">B</font>) &#923; C</li>
<li>А V B V <font style="text-decoration:overline;">C</font></li>
</ol>
<p class="Content2">Какое из них равносильно выражению <font style="text-decoration:overline;">(А V B)</font> V <font style="text-decoration:overline;">C</font> ?</p>
<p class="Content2"><strong>Решение</strong>:</p>
<p class="Content2">По закону де Моргана: <font style="text-decoration:overline;">(А V B)</font> = <font style="text-decoration:overline;">A</font> &#923; <font style="text-decoration:overline;">B</font></p>
<p class="Content2">Получаем (<font style="text-decoration:overline;">A</font> &#923; <font style="text-decoration:overline;">B</font>) V <font style="text-decoration:overline;">C</font> </p>
<p class="Content2">Полученное выражение соответствует примеру под номером 2</p>
<p class="Content2Top"><strong>Пример 3</strong>. Даны четыре логических выражения:</p>
<ol class="align_justify">
<li>А &#038; &#172;C</li>
<li>А | &#172;C &#038; B | &#172;C</li>
<li>&#172;C &#038; ( A | B)</li>
<li>(А &#038; B) | &#172;C</li>
</ol>
<p class="Content2">Какое из них равносильно выражению (А | &#172;C) &#038; &#172;(&#172;B &#038; C) ?</p>
<p class="Content2"><strong>Решение</strong>:</p>
<p class="Content2">По закону де Моргана &#172;(&#172;B &#038; C) = (&#172;&#172;B | &#172;C)</p>
<p class="Content2">По закону двойного отрицания: (&#172;&#172;B | &#172;C) = (B | &#172;C)</p>
<p class="Content2">Получаем (А | &#172;C) &#038; (B | &#172;C)</p>
<p class="Content2">В скобках сложение и одинаковая переменная &#172;C, вынесем её за скобки по распределительному закону:</p>
<p class="Content2">(А | &#172;C) &#038; (B | &#172;C) = (А &#038; B) | &#172;C </p>
<p class="Content2">Полученное выражение соответствует примеру под номером 4</p>
<div class="Header1"><strong>Логические задачи</strong></div>
<p class="Content2">Логические задачи решаются различными методами, мы рассмотрим метод рассуждений как один из самых простых.</p>
<div class="Header2"><strong>Метод рассуждений</strong></div>
<p class="Content2">Для задач, в условии которых сказано, что часть утверждении персонажей ложна, а часть истинна, удобно использовать метод рассуждений. Идея этого метода заключается в том, что делается предположение об истинности одного из утверждений, и далее, на основе этого предположения анализируются остальные утверждения. Анализ остальных утверждений «может привести к двум случаям — либо задача оказалась решена, либо встретилось противоречие. Если встретилось противоречие, это означает, что первоначальная гипотеза об истинности одного из утверждений была неверна, и это утверждение на самом деле ложно. Далее, с учетом этой информации продолжаем анализ утверждений пока не решим задачу.</p>
<p class="Content2">Условия логических задач бывают нескольких типов, рассмотрим три из них.</p>
<div class="Header2"><strong>1-й тип. Два высказывания одно истинно, другое ложно</strong></div>
<p class="Content2">Задачи такого типа, содержат условия из нескольких двойных высказываний, в которых одно высказывание истинно другое ложно. В результате нужно найти истинные высказывания.</p>
<p class="Content2Top"><strong>Задача</strong>: Перед гран-при гонок класса Формула 1, болельщики высказали следующие предположения: один болельщик &#8212; Хэмильтон – победит, а Масса доберётся вторым, другой болельщик – нет, Масса приедет третьим, а победит Райкконен, и наконец, третий болельщик скажет, а я уверен что одержит победу Алонсо, а Хамильтон будет последним.</p>
<p class="Content2">После соревнований выяснилось, что каждый болельщик был прав только в одном предположении. Какое место занял спортсмен?</p>
<p class="Content2Top"><strong>Решение</strong>:</p>
<p class="Content2">Обозначим высказывания буквами:</p>
<p class="Content1"><strong>А</strong> &#8212; Хэмильтон – победит, а Масса второй</p>
<p class="Content1"><strong>В</strong> &#8212; Масса третий, а Райкконен первый</p>
<p class="Content1"><strong>С</strong> &#8212; Хэмильтон последний, а Алонсо первый</p>
<ol class="align_justify">
<li>Предполагаем что 1-й параметр высказывания А, истина, тогда 1-й параметр высказывания С – ложь, а второй истина. Получилось, что победили одновременно два пилота, значит наше первое предположение неверно и получаем что 2-й параметр высказывания А есть истина.</li>
<li>Т.к. 2-й параметр высказывания А, истина, то 1-й параметр высказывания B ложь, а второй истина.</li>
<li>Т.к. второй параметр высказывания В истина, тогда 2-й параметр высказывания С ложно, а первый истина. Итого:</li>
</ol>
<ol class="align_justify">
<li>Райкконен</li>
<li>Масса</li>
<li>Алонсо</li>
<li>Хэмильтон</li>
</ol>
<div class="Header2"><strong>2-й тип. Четыре объекта и персонажа</strong></div>
<p class="Content2">В этом типе имеется четыре объекта и на основании условий нужно расставить персонажи или предметы по этим четырём предметам.</p>
<p class="Content2Top"><strong>Задача</strong>: Ольга, Светлана, Татьяна и Алёна сидят на первых четырёх партах, но неизвестно кто на какой. Определите, кто из них носит косички, хвостик, распущенные волосы и короткую стрижку, если известно что:</p>
<ol class="align_justify">
<li>Ольга не на первой парте</li>
<li>Алёна сидит дальше от доски чем, чем Светлана.</li>
<li>Светлана сидит перед Ольгой</li>
<li>Татьяна не сидит на соседней с Еленой парте</li>
<li>У девочки с короткой стрижкой номер парты чётный</li>
<li>Девочка с хвостом не Татьяна и не Светлана</li>
<li>Девочка с косичками сидит на второй парте</li>
</ol>
<p class="Content2Top"><strong>Решение</strong>:</p>
<p class="Content2">Обозначим высказывания буквами:</p>
<p class="Content2">Из 1-го, 2-го, 3-го и 4-го известия, рассадим девочек по партам:</p>
<p class="Content2Top">Первое условие</p>
<table class=table_11Tahoma>
	<valign="top" /></p>
<tr>
<th>Стол</td>
<th></td>
</tr>
<tr>
<th>1</td>
<td>Не Ольга</td>
</tr>
<tr>
<th>2</td>
<td>Ольга</td>
</tr>
<tr>
<th>3</td>
<td>Ольга</td>
</tr>
<tr>
<th>4</td>
<td>Ольга</td>
</tr>
</table>
<p class="Content2Top">Второе условие</p>
<table class=table_11Tahoma>
	<valign="top" /></p>
<tr>
<th>Стол</td>
<th></td>
<th>Или</td>
<th>Или</td>
<th>Или</td>
<th>Или</td>
<th>Или</td>
</tr>
<tr>
<th>1</td>
<td>Светлана</td>
<td>Светлана</td>
<td>Светлана</td>
<td>Не Ольга</td>
<td>Не Ольга</td>
<td>Не Ольга</td>
</tr>
<tr>
<th>2</td>
<td>Алёна</td>
<td>Ольга</td>
<td>Ольга</td>
<td>Светлана</td>
<td>Светлана</td>
<td>Ольга</td>
</tr>
<tr>
<th>3</td>
<td>Ольга</td>
<td>Алёна</td>
<td>Ольга</td>
<td>Алёна</td>
<td>Ольга</td>
<td>Светлана</td>
</tr>
<tr>
<th>4</td>
<td>Ольга</td>
<td>Ольга</td>
<td>Алёна</td>
<td>Ольга</td>
<td>Алёна</td>
<td>Алёна</td>
</tr>
</table>
<p class="Content2Top">Третье условие</p>
<table class=table_11Tahoma>
	<valign="top" /></p>
<tr>
<th>Стол</td>
<th></td>
<th>Или</td>
<th>Или</td>
</tr>
<tr>
<th>1</td>
<td>Светлана</td>
<td>Светлана</td>
<td></td>
</tr>
<tr>
<th>2</td>
<td>Ольга</td>
<td>Ольга</td>
<td>Светлана</td>
</tr>
<tr>
<th>3</td>
<td>Алёна</td>
<td></td>
<td>Ольга</td>
</tr>
<tr>
<th>4</td>
<td></td>
<td>Алёна</td>
<td>Алёна</td>
</tr>
</table>
<p class="Content2Top">Четвёртое условие</p>
<table class=table_11Tahoma>
	<valign="top" /></p>
<tr>
<th>Стол</td>
<th></td>
</tr>
<tr>
<th>1</td>
<td>Татьяна</td>
</tr>
<tr>
<th>2</td>
<td>Светлана</td>
</tr>
<tr>
<th>3</td>
<td>Ольга</td>
</tr>
<tr>
<th>4</td>
<td>Алёна</td>
</tr>
</table>
<p class="Content2Top">Из 5-го, 6-го и 7-го известия,  выберем девочкам причёски:</p>
<p class="Content2Top">Пятое условие</p>
<table class=table_11Tahoma>
	<valign="top" /></p>
<tr>
<th>Стол</td>
<th></td>
</tr>
<tr>
<th>1</td>
<td>Татьяна</td>
</tr>
<tr>
<th>2</td>
<td>Светлана КОР</td>
</tr>
<tr>
<th>3</td>
<td>Ольга</td>
</tr>
<tr>
<th>4</td>
<td>Алёна КОР</td>
</tr>
</table>
<p class="Content2Top">Шестое условие</p>
<table class=table_11Tahoma>
	<valign="top" /></p>
<tr>
<th>Стол</td>
<th></td>
</tr>
<tr>
<th>1</td>
<td>Татьяна</td>
</tr>
<tr>
<th>2</td>
<td>Светлана КОР</td>
</tr>
<tr>
<th>3</td>
<td>Ольга ХВ</td>
</tr>
<tr>
<th>4</td>
<td>Алёна КОР или ХВ</td>
</tr>
</table>
<p class="Content2Top">Седьмое условие</p>
<table class=table_11Tahoma>
	<valign="top" /></p>
<tr>
<th>Стол</td>
<th></td>
</tr>
<tr>
<th>1</td>
<td>Татьяна РАСП</td>
</tr>
<tr>
<th>2</td>
<td>Светлана КОС</td>
</tr>
<tr>
<th>3</td>
<td>Ольга ХВ</td>
</tr>
<tr>
<th>4</td>
<td>Алёна КОР</td>
</tr>
</table>
<div class="Header2"><strong>3-й тип. Правдивый, полуправдивый и лжец</strong></div>
<p class="Content2">В этом типе есть три персонажа, один из которых, может говорить правду,  другой лгать, а третий говорить правду через раз. И на основании этих данных сделать вывод по сказанному этими персонажами.</p>
<p class="Content2Top"><strong>Задача</strong>: Три друга Коля, Саша и Миша. Один из них всегда говорит правду, другой всегда лжёт, а третий говорит через раз то ложь, то правду. Кто из них правдив, а кто нет неизвестно, Миша и Коля сказали следующее:</p>
<p class="Content1"><strong>Миша</strong>: Саша никогда не врёт, а от Коли никогда не услышишь правды</p>
<p class="Content1"><strong>Саша</strong>: Миша сказал правду про меня</p>
<p class="Content2Top">Определите, кто из друзей говорит правду, правду через раз и лжёт.</p>
<p class="Content2Top"><strong>Решение</strong>:</p>
<ol class="align_justify">
<li>Пусть Миша говорит правду, но он утверждает, что и Саша всегда прав, что противоречит условию задачи о правдивости только одного персонажа. Значит, Миша либо говорит правду через раз, либо всегда лжёт.</li>
<li>Пусть теперь Саша всегда говорит правду. Тогда 1-е утверждение Миши верно, а второе ложно, раз оно ложно, значит Коля всегда говорит правду. Снова неверно, т.к. получили двух правдивых персонажей. Получаем вывод &#8212; Саша также как и Миша либо говорит правду через раз, либо всегда лжёт. Значит 100% Коля всегда прав.</li>
<li>Предположим что Миша прав наполовину, значит его 2-е утверждение ложно, а второе истинно, т.е. правдивость Саши – не подходит. Значит, Миша всегда лжёт, а Саша прав наполовину.</li>
</ol>
<p>	<!-- FLASH OBJECT BEGIN --></p>
<div id="block30x30center">
<object id="Algo" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="768" height="576" align="middle"><param name="movie" value="wp-content/uploads/inf-Logic2.swf" /><param name="bgcolor" value="#ffffff" /><param name="scale" value="showall" /><param name="allowFullScreen" value="true" /><param name="AllowScriptAccess" value="sameDomain" /><!--[if !IE]>--><br />
    <object width="768" height="576" type="application/x-shockwave-flash" data="wp-content/uploads/inf-Logic2.swf"><param name="bgcolor" value="#ffffff" /><param name="allowFullScreen" value="true" /><param name="AllowScriptAccess" value="sameDomain" /><!--<![endif]--></p>
<p>    <!-- 
<div style="width:800px; height:600px;">--><br />
      <a href="http://www.adobe.com/go/getflash" target="_blank"> <img src="wp-content/uploads/get_flash_player.gif" border="0" alt="Установить Adobe Flash player" /> </a><br />
     <!--</div>

     --></p>
<p>      <!--[if !IE]>--></object><br />
    <!--<![endif]--></object>
</div>
<p><!-- FLASH OBJECT END --></p>
]]></content:encoded>
			<wfw:commentRss>http://kshu.su/?feed=rss2&#038;p=81</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Основы логики</title>
		<link>http://kshu.su/?p=22</link>
		<comments>http://kshu.su/?p=22#comments</comments>
		<pubDate>Mon, 29 Sep 2014 13:07:56 +0000</pubDate>
		<dc:creator><![CDATA[Kirill Schurakhtenkov]]></dc:creator>
				<category><![CDATA[Информатика]]></category>

		<guid isPermaLink="false">http://kshu/?p=22</guid>
		<description><![CDATA[Основные понятия логики: высказывание, умозаключение, индукция, дедукция, связь в условии умозаключения. Логические операции: инверсия, конъюнкция, дизъюнкция, импликация и эквивалентность. Таблицы истинности. Основные определения Логика это наука о формах и способах мышления. К формам мышления можно отнести понятие, высказывание и умозаключение. Понятие это выделение одного объекта от других по определённым признакам, параметрам свойствам. Высказывание &#8212; суждение [&#8230;]]]></description>
				<content:encoded><![CDATA[<p class="Content2">Основные понятия логики: высказывание, умозаключение, индукция, дедукция, связь в условии умозаключения. Логические операции: инверсия, конъюнкция, дизъюнкция, импликация и эквивалентность. Таблицы истинности.</p>
<p>	<span id="more-22"></span></p>
<div class="Header2">Основные определения</div>
<p class="Content2"><strong>Логика</strong> это наука о формах и способах мышления. К формам мышления можно отнести понятие, высказывание и умозаключение.</p>
<p class="Content2"><strong>Понятие</strong> это выделение одного объекта от других по определённым признакам, параметрам свойствам.</p>
<p class="Content2"><strong>Высказывание</strong> &#8212; суждение или повествовательное предложение, в котором что-то утверждается или отрицается.</p>
<p class="Content2"><strong>Умозаключение</strong> это форма мышления, благодаря которой из двух или более суждений получается ещё одно суждение, которое является выводом. Оба первоначальных суждений, должны быть истинными и их называют условием к получению вывода. Между этими суждениями должна быть связь. Третье суждение это вывод он же является следствием и в зависимости от вида умозаключения может быть истинным или ложным.</p>
<p class="Content2">Виды умозаключений: индукция, дедукция.</p>
<p class="Content2"><strong>Дедукция:</strong> рассуждение или переход от общего правила к частному. Вывод всегда истинный.</p>
<p class="Content2"><strong>Индукция:</strong> рассуждение от частного к общему правилу. Вывод может быть как истинным, так и ложным.</p>
<p class="Content2">Рассмотрим примеры дедукции и индукции:</p>
<table class=table_11Tahoma>
<tr>
<th scope="col">Дедукция</th>
<th scope="col">Индукция</th>
</tr>
<tr>
<td>Все металлы электропроводны.<br />
Алюминий проводит ток.<br />
Алюминий металл.
</td>
<td>Алюминий проводит ток.<br />
Железо, Медь, Цинк, Свинец тоже проводят ток.<br />
Все металлы электропроводны.(Истина).
</td>
</tr>
<tr>
<td>
Все птицы-млекопитающие(ложь).<br />
Голубь птица.<br />
Все голуби млекопитающие(ложь).
</td>
<td>
Алюминий твёрдое тело.<br />
Железо, Медь, Цинк, Свинец тоже твёрдые тела.<br />
Все металлы твёрдые.(Ложь. Ртуть метал, но жидкий).
</td>
</tr>
<tr>
<td>
Все латиноамериканские страны – республики.<br />
Бразилия, Аргентина – латиноамериканские страны.<br />
Бразилия, Аргентина – республики.
</td>
<td>
Бразилия, Аргентина – республики.<br />
Бразилия, Аргентина – латиноамериканские страны.<br />
Все латиноамериканские страны – республики (Истина).
</td>
</tr>
<tr>
<td>
Все птицы кладут яйца.<br />
Все птицы позвоночные.<br />
Некоторые позвоночные кладут яйца.
</td>
<td>
Италия, Франция являются республиками.<br />
Италия, Франция европейские страны.<br />
Все европейские страны республики (Ложь.)
</td>
</tr>
<tr>
<td>
</td>
<td>
Змеи не имеют ног.<br />
Змеи животные.<br />
Некоторые животные не имеют ног.
</td>
</tr>
</table>
<div class="Header3">Связи между суждениями</div>
<p class="Content2">Как уже было сказано для получения истинного умозаключения (не обязательно чтобы его вывод был всегда истинным), между условиями должна присутствовать связь, одно должно исходить из другого. Рассмотрим такой пример дедуктивного умозаключения:</p>
<ul class="align_justify">
<li>Все студенты – учащиеся</li>
<li>Этот человек – студент</li>
<li>Этот человек – учащийся</li>
</ul>
<p class="Content2">Сначала мы говорим о всех студентах, затем связываем некоего человека со студентом всё хорошо. НО, если связи нет, получится неправильное строение умозаключения, из которого может получится(хотя и не всегда) неправильный вывод. Поменяем местами второе и третье высказывание:</p>
<ul class="align_justify">
<li>Все студенты – учащиеся</li>
<li>Этот человек – учащийся</li>
<li>Этот человек – студент</li>
</ul>
<p class="Content2">Здесь нет связи между условиями: так же как и в предыдущем примере, сначала мы говорим о всех студентах, затем связываем некоего человека с учащимся, затем того же человека приравниваем к студенту, но не всегда человек даже если он и учащийся может быть студентом.</p>
<div class="Header3">Правильный вывод при неправильном условии</div>
<p class="Content2">Бывают случаи, когда при неправильном строении условия, чисто случайно может получиться правильный вывод:</p>
<ul class="align_justify">
<li>Резина не проводит электричество</li>
<li>Вода не резина</li>
<li>Вода проводит электричество</li>
</ul>
<p class="Content2">Подставим вместо воды пластик, и мы поймём, что пример с водой сделал правильный вывод случайно. Значит, для истинного дедуктивного вывода, нужно чтобы одно следовало из другого однозначно, а не случайно. Пример с постройкой дома: нельзя построить хороший дом, если стройматериалы плохие, или опять же построить дом хорошими стройматериалами, но не грамотно составленными чертежами.</p>
<div class="Header3">Примеры</div>
<p class="Content2">Даны высказывания, по ним сделать вывод:</p>
<ul class="align_justify">
<li>Все певцы знают ноты</li>
<li>Фёдор Шаляпин певец</li>
<li>Значит …</li>
</ul>
<p class="Content2">
<ul class="align_justify">
<li>Настоящие водители, знают ПДД</li>
<li>Иванов настоящий водитель</li>
<li>Значит …</li>
</ul>
<div class="Header2">Логические операции</div>
<p class="Content2">Логическое выражение – это простое или сложное высказывание. Сложное высказывание строится из простых с помощью логических операций: инверсия, конъюнкция, дизъюнкция, импликация и эквивалентность. Первые три операции – это главные логические операции они просты в своей работе и представляют основу работы процессора компьютера. </p>
<p class="Header2">Инверсия</p>
<p class="Content2">это логическое отрицание соответствует русской частице НЕ, обозначается ещё &#172;, <font style="text-decoration:overline;">A</font>, Not. Она заменяет истинное высказывание на ложное и наоборот. Унарная(одноместная) т.е. отрицает какое то одно высказывание.</p>
<ol class="align_justify">
<li>(2 &#215; 2 = 4) &#8212; ИСТИНА или TRUE или 1</li>
<li>&#172;(2 &#215; 2 = 4) &#8212; ЛОЖЬ или FALSE или 0</li>
<li>(2 &#215; 2 = 5) &#8212; ЛОЖЬ или FALSE или 0</li>
<li><font style="text-decoration:overline;">(2 &#215; 2 = 5)</font> &#8212; ИСТИНА или TRUE или 1</li>
</ol>
<p class="Content2">Таблица истинности логического отрицания:</p>
<table class=table_11Tahoma>
<tr>
<th width="100px" align="center"> A </th>
<th width="100px" align="center">F = <font style="text-decoration:overline;">A</font></th>
</tr>
<tr>
<td align="center"> 0 </td>
<td align="center"> 1 </td>
</tr>
<tr>
<td align="center"> 1 </td>
<td align="center"> 0 </td>
</tr>
</table>
<p class="Header2">Конъюнкция</p>
<p class="Content2">это логическое умножение соответствует русскому союзу И, обозначается &#038;, &#923;, And. Истинное значение будет только при истинности обоих операндов, все остальные ложь. Бинарная(двуместная).</p>
<ul class="align_justify">
<li>(2 &#215; 2 = 5) &#038; (3 &#215; 3 = 8) = ЛОЖЬ</li>
<li>(2 &#215; 2 = 5) &#038; (3 &#215; 3 = 9) = ЛОЖЬ</li>
<li>(2 &#215; 3 = 6) &#923; (2 &#215; 4 = 8) = ИСТИНА</li>
<li>(2 &#215; 2 = 4) &#923; (3 &#215; 3 = 9) = ИСТИНА</li>
</ul>
<p class="Content2">Таблица истинности логического умножения</p>
<table class=table_11Tahoma>
<tr>
<th width="100px" align="center"> A </th>
<th width="100px" align="center"> B </th>
<th width="100px" align="center">F = A &#923; B</th>
</tr>
<tr>
<td align="center"> 0 </td>
<td align="center"> 0 </td>
<td align="center"> 0 </td>
</tr>
<tr>
<td align="center"> 0 </td>
<td align="center"> 1 </td>
<td align="center"> 0 </td>
</tr>
<tr>
<td align="center"> 1 </td>
<td align="center"> 0 </td>
<td align="center"> 0 </td>
</tr>
<tr>
<td align="center"> 1 </td>
<td align="center"> 1 </td>
<td align="center"> 1 </td>
</tr>
</table>
<div class="Header2">Дизъюнкция</div>
<p class="Content2">это логическое сложение соответствует русскому союзу ИЛИ, обозначается |, V, Or. Ложное значение будет только при ложности обоих операндов, все остальные истина. Бинарная(двуместная).</p>
<ul class="align_justify">
<li>(2 &#215; 2 = 5) | (2 &#215; 4 = 8) = ИСТИНА</li>
<li>(2 &#215; 2 = 5) | (2 &#215; 3 = 9) = ЛОЖЬ</li>
<li>(2 &#215; 2 = 4) V (2 &#215; 3 = 6) = ИСТИНА</li>
<li>(2 &#215; 2 = 4) V (3 &#215; 3 = 1) = ИСТИНА</li>
</ul>
<p class="Content2">Таблица истинности логического умножения:</p>
<table class=table_11Tahoma>
<tr>
<th width="100px" align="center"> A </th>
<th width="100px" align="center"> B </th>
<th width="100px" align="center">F = A V B</th>
</tr>
<tr>
<td align="center"> 0 </td>
<td align="center"> 0 </td>
<td align="center"> 0 </td>
</tr>
<tr>
<td align="center"> 0 </td>
<td align="center"> 1 </td>
<td align="center"> 1 </td>
</tr>
<tr>
<td align="center"> 1 </td>
<td align="center"> 0 </td>
<td align="center"> 1 </td>
</tr>
<tr>
<td align="center"> 1 </td>
<td align="center"> 1 </td>
<td align="center"> 1 </td>
</tr>
</table>
<p class="Content2Top">Из этих трёх простых логических операций, строят множество других сложных логических операции, мы рассмотрим две из них: импликация и эквивалентность</p>
<div class="Header2">Импликация</div>
<p class="Content2">это логическое следование образуется соединением двух высказываний в одно с помощью оборота речи ЕСЛИ .. ТО, обозначается &#8594;, ложно тогда, когда из истиной предпосылки 1-го высказывания следует ложный вывод. Бинарная(двуместная).</p>
<div class="Header3">Импликация через отрицание и сложение</div>
<p class="Content2"><font style="text-decoration:overline;">A</font> V B = А &#8594; B</p>
<p class="Content2">Таблица истинности логического следования:</p>
<table class=table_11Tahoma>
<tr>
<th width="100px" align="center"> A </th>
<th width="100px" align="center"> B </th>
<th width="100px" align="center">F = A &#8594; B</th>
</tr>
<tr>
<td align="center"> 0 </td>
<td align="center"> 0 </td>
<td align="center"> 1 </td>
</tr>
<tr>
<td align="center"> 0 </td>
<td align="center"> 1 </td>
<td align="center"> 1 </td>
</tr>
<tr>
<td align="center"> 1 </td>
<td align="center"> 0 </td>
<td align="center"> 0 </td>
</tr>
<tr>
<td align="center"> 1 </td>
<td align="center"> 1 </td>
<td align="center"> 1 </td>
</tr>
</table>
<p class="Content2">Для понимания смысла  импликации может пригодиться житейская модель: А — начальник. Он может приказать &#171;работай&#187; (1) или сказать &#171;делай что хочешь&#187; (0). В — подчиненный. Он может работать (1) или бездельничать (0). В таком случае импликация — не что иное, как послушание подчиненного начальнику. По таблице истинности легко проверить, что послушания нет только тогда, когда начальник приказывает работать, а подчиненный бездельничает. </p>
<p class="Content2">Ещё житейский пример импликации: A(Идёт дождь), B(раскрыть зонтик), результат ложь если человек намокнет. Человек будет мокрым в одном случае, если будет идти дождь, и он не раскроет зонтик.</p>
<p class="Content2">
<p class="Content2">
<p class="Content2">
<div class="Header2">Эквивалентность</div>
<p class="Content2">это логическое равенство образуется соединением двух высказываний в одно с помощью оборота речи ТОГДА И ТОЛЬКО ТОГДА, обозначается &#8596;, ~, истинно когда оба высказывания одновременно либо истинны, либо ложны. Бинарная(двуместная).</p>
<div class="Header3">Эквивалентность через отрицание, умножение и сложение</div>
<p class="Content2"> (A &#923; B) V (<font style="text-decoration:overline;">A</font> &#923; <font style="text-decoration:overline;">B</font>) = A &#8596; B</p>
<p class="Content2">Таблица истинности логического равенства:</p>
<table class=table_11Tahoma>
<tr>
<th width="100px" align="center"> A </th>
<th width="100px" align="center"> B </th>
<th width="100px" align="center">F = A &#8596; B</th>
</tr>
<tr>
<td align="center"> 0 </td>
<td align="center"> 0 </td>
<td align="center"> 1 </td>
</tr>
<tr>
<td align="center"> 0 </td>
<td align="center"> 1 </td>
<td align="center"> 0 </td>
</tr>
<tr>
<td align="center"> 1 </td>
<td align="center"> 0 </td>
<td align="center"> 0 </td>
</tr>
<tr>
<td align="center"> 1 </td>
<td align="center"> 1 </td>
<td align="center"> 1 </td>
</tr>
</table>
<p class="Content2">Для понимания эквивалентности удобны два высказывания: А = «Компьютер вычисляет» и В = «Компьютер включён».</p>
<p class="Content2Top">При составлении логических условий поиска в базах данных, легко ошибиться. Например, в базе данных БИБЛИОТЕКА есть сведения о книгах разных авторов, то при выборе всех книг Лермонтова и Есенина хочется в условии выбора поставить (Лермонтов И Есенин), но мы получим результат книг автором которых будет и тот, и другой автор, чего не может быть. Нужно заменить логическую операцию (И) на (ИЛИ) &#8212; (Лермонтов ИЛИ Есенин).</p>
<p class="Content2Top">Выполним задание на обработку сложных условий.</p>
<p class="Content2"><strong>Задача</strong>. В поле <i>Условие</i>, записано логическое выражение, выписать в поле <i>Ответ</i>, записи соответствующие условию:</p>
<table class=table_11Tahoma>
<tr>
<th width="50px" align="center"> № </th>
<th width="50px" align="center"> A </th>
<th width="50px" align="center"> B </th>
<th width="50px" align="center"> C </th>
<th width="180px" align="center"> Условие </th>
<th width="160px" align="center"> Ответ </th>
</tr>
<tr>
<td align="center"> R<sub>1</sub> </td>
<td align="center"> 1 </td>
<td align="center"> 2 </td>
<td align="center"> 3 </td>
<td align="center"> A=1 &#038; B=2 </td>
<td> R<sub>1</sub> </td>
</tr>
<tr>
<td align="center"> R<sub>2</sub> </td>
<td align="center"> 1 </td>
<td align="center"> 3 </td>
<td align="center"> 1 </td>
<td align="center"> A=1 | A=3 </td>
<td> R<sub>1</sub> R<sub>2</sub> R<sub>4</sub> R<sub>5</sub> </td>
</tr>
<tr>
<td align="center"> R<sub>3</sub> </td>
<td align="center"> 2 </td>
<td align="center"> 2 </td>
<td align="center"> 2 </td>
<td align="center"> A=1 | B=2 </td>
<td> R<sub>1</sub> R<sub>2</sub> R<sub>3</sub> R<sub>5</sub> </td>
</tr>
<tr>
<td align="center"> R<sub>4</sub> </td>
<td align="center"> 3 </td>
<td align="center"> 3 </td>
<td align="center"> 3 </td>
<td align="center"> A=1 | B=2 | C=3 </td>
<td> R<sub>1</sub> R<sub>2</sub> R<sub>3</sub> R<sub>4</sub> R<sub>5</sub> </td>
</tr>
<tr>
<td align="center"> R<sub>5</sub> </td>
<td align="center"> 3 </td>
<td align="center"> 2 </td>
<td align="center"> 3 </td>
<td align="center"> A=1 &#038; B=2 &#038; C=3 </td>
<td> R<sub>1</sub> </td>
</tr>
</table>
<div class="Header2">Логические выражения</div>
<p class="Content2">Каждое высказывание можно выразить в виде логической формулы(логического выражения) состоящей из логических переменных и операций. Для записи логического выражения из составного высказывания выделяют простые высказывания и логические связи между ними. Затем нужно учесть последовательность выполнения логических операций согласно их приоритету:</p>
<ol class="align_justify">
<li>скобки</li>
<li>&#172; &#8212; инверсия &#8212; логическое отрицание</li>
<li>&#038; &#8212; конъюнкция &#8212; логическое умножение</li>
<li>| &#8212; дизъюнкция &#8212; логическое сложение</li>
<li>&#8594; &#8212; импликация &#8212; логическое следование</li>
<li>&#8596; &#8212; эквивалентность – логическое равенство</li>
</ol>
<p class="Content2Top"><strong>Пример 1</strong>. Вычислим истинность сложного высказывания:</p>
<p class="Content2">не 2&#215;2=5 и 2&#215;2=4 или 3&#215;3=8 и 3&#215;3=9</p>
<p class="Content2"><strong>Решение</strong>:</p>
<ol class="align_justify">
<li>Выделим простые высказывания с помощью переменных A, B, C и D:<br />
		А = 2&#215;2=5 значение -ложь (0);<br />
		В = 2&#215;2=4 значение -истина (1);<br />
		C = 3&#215;3=8 значение -ложь (0);<br />
		D = 3&#215;3=9 значение -истина (1)
	</li>
<li>Тогда составное высказывание перепишем в следующей форме:<br />не A и B или C и D</li>
<li>заменим в составном высказывании значения логических переменных:<br />не 0 и 1 или 0 и 1</li>
<li>Подставим логические операции, получим логическое выражение:<br />&#172;0 &#215; 1 V 0 &#215; 1</li>
<li>Запишем по действиям, учитывая последовательность выполнения операций:
<ol class="align_justify">
<li>&#172;0 = 1</li>
<li>1 &#215; 1=1</li>
<li>0 &#215; 1 = 0</li>
<li>1 V 0 = 1</li>
</ol>
</li>
</ol>
<p class="Content2">Ответ: не 2&#215;2=5 и 2&#215;2=4 или 3&#215;3=8 и 3&#215;3=9 = 1</p>
<p class="Content2Top"><strong>Пример 2</strong>: Для какого имени истинно логическое условие:</p>
<p class="Content2">&#172; (Первая буква согласная &#8594;  Третья буква гласная)</p>
<p class="Content2">1. Юлия 2. Пётр 3. Алексей 4. Ксения.</p>
<p class="Content2"><strong>Решение</strong>: По условию нужно получить истину(1), а отрицание &#172; (…) логическому условию вынуждает нас найти в скобках ложь   НЕ(ЛОЖЬ)=ИСТИНА. Т.к. в условии операция импликация, а в ней ложь только в одном случае, когда из истиной предпосылки следует ложный вывод, т.е. нужно найти первую букву действительно согласную, а третью НЕгласную(т.е. согласную).</p>
<p class="Content2">Ответ: Пётр.</p>
<p class="Content2Top"><strong>Пример 3</strong>: Какое из названий имён удовлетворяет условию:</p>
<p class="Content2">первая буква гласная &#038;  последняя буква гласная &#8596; имя содержит букву «о»?</p>
<p class="Content2">1. Иван 2. Алёна 3. Игорь 4. Ирина.</p>
<p class="Content2"><strong>Решение</strong>: По условию нужно получить истину. Операция &#038; имеет приоритет выше чем &#8596;, значит последовательность решения такая:</p>
<ol class="align_justify">
<li>первая буква гласная &#038;  последняя буква гласная</li>
<li>Результат 1-го пункта &#8596; название содержит букву «о»</li>
</ol>
<p class="Content2">Финальное решение примера это пункт 2 содержащий истину операции &#8596;.<br />
	Это либо 1&#8596;1, либо 0&#8596;0. Истинность 1-го пункта – имя под номером 2 или 4. Истинность 2-го пункта это имя 3 с буквой «о» что не верно.<br />
	Значит, ищем ложность обоих пунктов: ложность 1-го пункта – имя под номером 1 или 3. Ложность 2-го пункта это либо имя 1 буквы «о»,<br />
	либо имя 3 без буквы «о».</p>
<p class="Content2"> Ответ: Иван.</p>
<p class="Content2Top"><strong>Пример 4</strong>: Какое из названий имён удовлетворяет условию:</p>
<p class="Content2">первая буква гласная &#038;  последняя буква гласная &#8596; &#172;название содержит букву «а»?</p>
<p class="Content2">1. Иван 2. Алёна 3. Игорь 4. Ирина.</p>
<p class="Content2"><strong>Решение</strong>: По условию нужно получить истину.  Операция &#038; имеет приоритет выше чем &#8596;, а операция &#172;<br />
	имеет приоритет выше чем &#038;, значит последовательность решения такая:</p>
<ol class="align_justify">
<li>&#172; название содержит букву «а»</li>
<li>первая буква гласная &#038;  последняя буква гласная</li>
<li>Результат 2-го пункта &#8596; результат 1-го пункта</li>
</ol>
<p class="Content2">Финальное решение примера &#8212; это пункт 3 содержащий истину операции &#8596;. Это либо 1&#8596;1, либо 0&#8596;0. Истинность 1-го пункта – имя под номером 3. истинность 2-го пункта – имя под номером 2 и 4. Истинность 3-го пункта не может быть из-за неравенства 1-го и 2-го пункта.  Значит для истинности 3-го пункта, ищем ложность 1-го и 2-го пунктов: ложность 1-го пункта – имя под номером 1, 2 или 4 или 4. Ложность 2-го пункта это либо имя 1, либо имя 3.</p>
<p class="Content2">Ответ: 1.</p>
<div class="Header2">Таблицы истинности</div>
<p class="Content2">Для каждого составного высказывания(логического выражения) можно построить таблицу истинности ТИ, учитывающая истинность или ложность всех возможных комбинаций исходных значений простых высказываний.</p>
<p class="Content2"><strong>Пример</strong>. Постройте ТИ для сложного высказывания &#172;А &#038; В | A &#038; B </p>
<p class="Content2"><strong>Решение</strong>:</p>
<ol class="align_justify">
<li>Определим количество строк в ТИ, оно равно количеству возможных комбинаций логических переменных. Если количество переменных n, то количество строк = 2<sup>n</sup>. У нас переменные это А и В значит количество строк 4</li>
<li>Определим количество столбцов в ТИ, оно равно количеству переменных плюс количество логических операций. В нашем случае переменных две, а операций четыре(&#172;, &#038;, | и &#038;), т.е. количество столбцов равно шести.</li>
<li>Построим ТИ с указанным количеством строк и столбцов плюс одна строка сверху с обозначениями столбцов и внесём в таблицу исходные значения логических переменных.</li>
<li>Заполним ТИ, выполняя логические операции в необходимом порядке.</li>
</ol>
<table class=table_11Tahoma>
<tr>
<th width="50px" align="center"> A </th>
<th width="50px" align="center"> B </th>
<th width="50px" align="center"> &#172;A </th>
<th width="100px" align="center"> &#172;A &#038; B </th>
<th width="100px" align="center">A &#038; B  </th>
<th width="160px" align="center"> &#172;A &#038; B | A &#038; B</th>
</tr>
<tr>
<td align="center">0</td>
<td align="center">0</td>
<td align="center">1</td>
<td align="center">0</td>
<td align="center">0</td>
<td align="center">0</td>
</tr>
<tr>
<td align="center">1</td>
<td align="center">0</td>
<td align="center">0</td>
<td align="center">0</td>
<td align="center">0</td>
<td align="center">0</td>
</tr>
<tr>
<td align="center">0</td>
<td align="center">1</td>
<td align="center">1</td>
<td align="center">1</td>
<td align="center">0</td>
<td align="center">1</td>
</tr>
<tr>
<td align="center">1</td>
<td align="center">1</td>
<td align="center">0</td>
<td align="center">0</td>
<td align="center">1</td>
<td align="center">1</td>
</tr>
</table>
<div class="Header3">Равносильные логические выражения</div>
<p class="Content2">Логические выражения, у которых последние столбцы ТИ совпадают, называются равносильными. Обозначаются такие выражения знаком  =. </p>
<p class="Content2"><strong>Пример</strong>. 	Докажем, что выражения <font style="text-decoration:overline;">A</font> &#923; <font style="text-decoration:overline;">B</font> и <font style="text-decoration:overline;">(А V B)</font> равносильны.</p>
<p class="Content2"><strong>Решение</strong>:</p>
<ol class="align_justify">
<li>Построим сначала ТИ логического выражения <font style="text-decoration:overline;">A</font> &#923; <font style="text-decoration:overline;">B</font>:</li>
<p></p>
<table class=table_11Tahoma>
<tr>
<th width="50px" align="center"> A </th>
<th width="50px" align="center"> B </th>
<th width="50px" align="center"> <font style="text-decoration:overline;">A</font> </th>
<th width="50px" align="center"> <font style="text-decoration:overline;">B</font> </th>
<th width="100px" align="center"><font style="text-decoration:overline;">A</font> &#923; <font style="text-decoration:overline;">B</font>  </th>
</tr>
<tr>
<td align="center">0</td>
<td align="center">0</td>
<td align="center">1</td>
<td align="center">1</td>
<td align="center">1</td>
</tr>
<tr>
<td align="center">1</td>
<td align="center">0</td>
<td align="center">0</td>
<td align="center">1</td>
<td align="center">0</td>
</tr>
<tr>
<td align="center">0</td>
<td align="center">1</td>
<td align="center">1</td>
<td align="center">0</td>
<td align="center">0</td>
</tr>
<tr>
<td align="center">1</td>
<td align="center">1</td>
<td align="center">0</td>
<td align="center">0</td>
<td align="center">0	</td>
</tr>
</table>
<p>
<li>Теперь построим ТИ логического выражения <font style="text-decoration:overline;">(А V B)</font>:</li>
<p></p>
<table class=table_11Tahoma>
<tr>
<th width="50px" align="center"> A </th>
<th width="50px" align="center"> B </th>
<th width="100px" align="center"> (A V B) </th>
<th width="100px" align="center"> <font style="text-decoration:overline;">(А V B)</font> </th>
</tr>
<tr>
<td align="center">0</td>
<td align="center">0</td>
<td align="center">0</td>
<td align="center">1</td>
</tr>
<tr>
<td align="center">1</td>
<td align="center">0</td>
<td align="center">1</td>
<td align="center">0</td>
</tr>
<tr>
<td align="center">0</td>
<td align="center">1</td>
<td align="center">1</td>
<td align="center">0</td>
</tr>
<tr>
<td align="center">1</td>
<td align="center">1</td>
<td align="center">1</td>
<td align="center">0</td>
</tr>
</table>
</ol>
<p class="Content2">Значения последних столбцов ТИ совпадают, соответственно логические выражения <br /> <font style="text-decoration:overline;">A</font> &#923; <font style="text-decoration:overline;">B</font> и <font style="text-decoration:overline;">(А V B)</font> равносильны</p>
<p class="Content2Top"><strong>Пример</strong>. Докажите с помощью ТИ, что операция импликации A &#8594; B равносильна логическому выражению  	<font style="text-decoration:overline;">A</font> V B </p>
<p class="Content2Top"><strong>Пример</strong>. Докажите с помощью ТИ, что операция эквивалентности A &#8596; B равносильна логическому выражению (A V 	<font style="text-decoration:overline;">B</font> ) &#923; ( 	<font style="text-decoration:overline;">A</font> V B )</p>
<p class="Content2Top"><strong>Пример</strong>. Дан фрагмент таблицы истинности выражения F.</p>
<table class=table_11Tahoma>
<tr>
<th width="50px" align="center"> X </th>
<th width="50px" align="center"> Y </th>
<th width="50px" align="center"> Z </th>
<th width="50px" align="center"> F </th>
</tr>
<tr>
<td align="center">0</td>
<td align="center">0</td>
<td align="center">0</td>
<td align="center">1</td>
</tr>
<tr>
<td align="center">0</td>
<td align="center">0</td>
<td align="center">1</td>
<td align="center">0</td>
</tr>
<tr>
<td align="center">0</td>
<td align="center">1</td>
<td align="center">0</td>
<td align="center">1</td>
</tr>
</table>
<p class="Content2">Какое выражение соответствует F?</p>
<ol class="align_justify">
<li>&#172;X &#038; &#172;Y &#038; Z</li>
<li>&#172;X | &#172;Y | Z</li>
<li>X | Y | &#172;Z</li>
<li>X | Y | Z</li>
</ol>
<p class="Content2"><strong>Решение</strong>:</p>
<table class=table_11Tahoma>
<tr>
<th width="160px" align="center">&#172;X &#038; &#172;Y &#038; Z</th>
<th width="160px" align="center">&#172;X | &#172;Y | Z</th>
<th width="150px" align="center">X | Y | &#172;Z</th>
<th width="150px" align="center">X | Y | Z</th>
</tr>
<tr>
<td align="center">&#172;0 &#038; &#172;0 &#038; 0 = 0</td>
<td align="center">&#172;0 | &#172;0 | 0 = 1</td>
<td align="center">0 | 0 | &#172;0 = 1</td>
<td align="center">X | Y | Z = </td>
</tr>
<tr>
<td align="center">&#172;0 &#038; &#172;0 &#038; 1 = </td>
<td align="center">&#172;0 | &#172;0 | 1 = 1</td>
<td align="center">0 | 0 | &#172;1 = 0</td>
<td align="center">X | Y | Z = </td>
</tr>
<tr>
<td align="center">&#172;0 &#038; &#172;1 &#038; 0 = </td>
<td align="center">&#172;0 | &#172;1 | 0 =</td>
<td align="center">0 | 1 | &#172;0 = 1</td>
<td align="center">X | Y | Z = </td>
</tr>
</table>
<p class="Content2">Первая проверка первого выражения дала несовпадение, значит последующие две, не производим, а переходим ко второму выражению. </p>
<p class="Content2">Вторая проверка второго выражения дала не совпадение, значит последующую, не производим, а переходим к третьему выражению </p>
<p class="Content2">В третьем выражении, все три проверки дали совпадение, значит четвёртое выражение можно не проверять, хотя на всякий случай проверить можно, ведь если проверка в четвёртом выражении даст совпадение, то в каком то случае мы допустили ошибку.</p>
<p class="Content2">Ответ: 3</p>
<p>	<!-- FLASH OBJECT BEGIN --></p>
<div id="block30x30center">
<object id="Algo" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="768" height="576" align="middle"><param name="movie" value="wp-content/uploads/inf-Logic.swf" /><param name="bgcolor" value="#ffffff" /><param name="scale" value="showall" /><param name="allowFullScreen" value="true" /><param name="AllowScriptAccess" value="sameDomain" /><!--[if !IE]>--><br />
    <object width="768" height="576" type="application/x-shockwave-flash" data="wp-content/uploads/inf-Logic.swf"><param name="bgcolor" value="#ffffff" /><param name="allowFullScreen" value="true" /><param name="AllowScriptAccess" value="sameDomain" /><!--<![endif]--></p>
<p>    <!-- 
<div style="width:800px; height:600px;">--><br />
      <a href="http://www.adobe.com/go/getflash" target="_blank"> <img src="wp-content/uploads/get_flash_player.gif" border="0" alt="Установить Adobe Flash player" /> </a><br />
     <!--</div>

     --></p>
<p>      <!--[if !IE]>--></object><br />
    <!--<![endif]--></object>
</div>
<p><!-- FLASH OBJECT END --></p>
]]></content:encoded>
			<wfw:commentRss>http://kshu.su/?feed=rss2&#038;p=22</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Представление информации</title>
		<link>http://kshu.su/?p=20</link>
		<comments>http://kshu.su/?p=20#comments</comments>
		<pubDate>Mon, 29 Sep 2014 13:06:17 +0000</pubDate>
		<dc:creator><![CDATA[Kirill Schurakhtenkov]]></dc:creator>
				<category><![CDATA[Информатика]]></category>

		<guid isPermaLink="false">http://kshu/?p=20</guid>
		<description><![CDATA[Информация в компьютере представлена в виде нулей и единиц, называемые битами. Одного бита хватает, что бы представить два различных значения, однако этого не достаточно, чтобы представить что-нибудь существенное. Поэтому, чтобы представление имело место быть, из восьми битов формируют блок, который называют байтом. В одном байте можно представить 28 = 256 различных значений. С помощью байтов [&#8230;]]]></description>
				<content:encoded><![CDATA[<p class="Content2">Информация в компьютере представлена в виде нулей и единиц, называемые битами. Одного бита хватает, что бы представить два различных значения,<br />
	однако этого не достаточно, чтобы представить что-нибудь существенное. Поэтому, чтобы представление имело место быть, из восьми битов формируют блок, который называют байтом.<br />
	В одном байте можно представить 2<sup>8</sup> = 256 различных значений. С помощью байтов можно представить числа, текстовые символы, графические цвета, звук и видео.<br />
	Рассмотрим как с помощью нулей и единиц можно представить числа, текст и графику.</p>
<p>	<span id="more-20"></span></p>
<div class="Header2">Числовая информация</div>
<p class="Content2">Первый вид данных с которым стали работать ЭВМ это числа. Числа представлены в двух форматах: формат с фиксированной точкой и формат с плавающей запятой.<br />
	Они представлены в ячейках 1 байт, 2 байта, 4 байта и 8 байт. </p>
<p class="Content2">Целые положительные числа для одного байта</p>
<p class="Content2">Для представления целого положительного числа N в форме с фиксированной точкой состоящего из одного байта его нужно:</p>
<ol class="align_justify">
<li>Перевести число N в двоичную систему счисления</li>
<li>Полученный результат дополнить слева нулями до восьми разрядов</li>
</ol>
<p class="Content2Top"><strong>Задача</strong>. Представим в одном байте число N = 53<sub>10</sub></p>
<p class="Content2"><strong>Решение</strong>: </p>
<ol class="align_justify">
<li>Переведём в двоичную систему, получим 110101<sub>2</sub></li>
<li>Дополним слева нулями  00110101<sub>2</sub></li>
</ol>
<p class="Content2Top">Диапазон положительных (беззнаковых) чисел в одном байте лежит от минимального восьми нулей до максимального восьми единиц.<br />
	В десятичном представлении от 0 до 255, 2<sup>8</sup>=256.</p>
<div class="Header3">Целые отрицательные числа для одного байта</div>
<p class="Content2">А как представить отрицательные числа, если минимальное число это ноль? В этом случае используют знаковые числа – старший(левый) бит используют для знака. Если в нём 0, то знака нет – число положительное и остальные семь бит используют для числа &#8805; 0, если в старшем бите 1, то знак есть – число отрицательное и остальные семь бит используют для числа < 0.</p>
<p class="Content2">Диапазон положительных знаковых чисел для одного байта от 0 до 127, а отрицательных от  -1 до -128.</p>
<p class="Content2">Запись целого отрицательного числа <b>-N</b> в байте:</p>
<ol class="align_justify">
<li>Получить внутреннее(двоичное) представление целого положительного числа <b>N</b>.</li>
<li>Получить обратный код этого числа заменой 0 на 1, и 1 на 0.</li>
<li>К полученному числу прибавить 1.</li>
</ol>
<p class="Content2">Полученная форма представления знаковых чисел позволяет избавиться от операции вычитания, а вместо её использовать операцию сложения. Т.е. сложение положительного с отрицательным числом, даёт вычитание:</p>
<p class="Content2">N – M = N + (-M), значит N + (-N) = 0</p>
<p class="Content2">распишем последнее равенство в двоичном виде на примере числа 53:</p>
<p class="Content2">53 &#8212; 00110101<sub>2</sub>.</p>
<p class="Content2">-53 &#8212; 11001011<sub>2</sub>.</p>
<p class="Content2">Получаем: 00110101<sub>2</sub> + 11001011<sub>2</sub> = 100000000<sub>2</sub> </p>
<p class="Content2">В результате после сложения в восьми битах ноль, а единица вышла за пределы байта и не учитывается.</p>
<div class="Header3">«Многобайтовые» целые числа</div>
<p class="Content2">Т.к. одного байта не хватает для представления чисел больших чем 255, используют соседние байты. Двух байтные или 16 битные числа, имеют диапазон для незнаковых от 0 до 65535, а для знаковых -32768..32767.<br />
	Четырёх байтные или 32 битные числа, имеют диапазон для незнаковых от 0 до 4294967296, а для знаковых -2147483648..2147483647.</p>
<div class="Header3">Числа с плавающей запятой</div>
<p class="Content2">Числа с плавающей запятой R представлены в форме произведения мантиссы m на основание системы счисления p в некоторой степени n или порядка:</p>
<p class="Content2">R = m &#215; p<sup>n</sup></p>
<p class="Content2">Порядок(степень) показывает на какую позицию и в каком направлении должна сместиться запятая. Например, число 25,324 можно представить как:</p>
<p class="Content2">2,5324 &#215; 10<sup>1</sup></p>
<p class="Content2">0,25324 &#215; 10<sup>2</sup></p>
<p class="Content2">0,025324 &#215; 10<sup>3</sup></p>
<p class="Content2">0,0025324 &#215; 10<sup>4</sup></p>
<p class="Content2">и т.д. Следовательно, представление числа в форме с плавающей запятой неоднозначно. Чтобы эту неоднозначность убрать в ПК используют нормализованную форму чисел с плавающей запятой. Мантисса(значащие цифры) в нормализованной форме будет удовлетворять условию:</p>
<p class="Content2">0,1 &le; m < 1</p>
<p class="Content2">Наше число 25,324 в нормализованной форме будет 0,25324&#215;10<sup>2</sup></p>
<p class="Content2">В памяти ПК мантисса будет в виде целого числа содержащая её значащие цифры (ноль и запятая не учитываются)<br />
	и порядка т.е. m =  25324, а n = 2.</p>
<p class="Content2">в старшем бите 1-го байта хранится знак числа. Семь оставшихся битов отводится на порядок. Три оставшихся байта отводится на значащие цифры мантиссы.</p>
<p>	<!-- FLASH OBJECT BEGIN --></p>
<div id="block10x10center">
<object id="Algo" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="384" height="288" align="middle"><param name="movie" value="wp-content/uploads/inf-InformationEncodingDigit.swf" /><param name="bgcolor" value="#ccccff" /><param name="scale" value="showall" /><param name="allowFullScreen" value="true" /><param name="AllowScriptAccess" value="sameDomain" /><!--[if !IE]>--><br />
    <object width="384" height="288" type="application/x-shockwave-flash" data="wp-content/uploads/inf-InformationEncodingDigit.swf"><param name="bgcolor" value="#ccccff" /><param name="allowFullScreen" value="true" /><param name="AllowScriptAccess" value="sameDomain" /><!--<![endif]--></p>
<p>      <a href="http://www.adobe.com/go/getflash" target="_blank"> <img src="wp-content/uploads/get_flash_player.gif" border="0" alt="Установить Adobe Flash player" /> </a> </p>
<p>      <!--[if !IE]>--></object><br />
    <!--<![endif]--></object>
 </div>
<p><!-- FLASH OBJECT END --></p>
<div class="Header2">Текстовая информация</div>
<p class="Content2">Вслед за числовой информацией стали использовать текстовую или символьную информацию. Где каждый символ это прописные, строчные буквы, цифры, знаки пунктуации, скобки и т.д.</p>
<p class="Content2">Изначально был придуман алфавит, состоящий из 256 символов, т.е. один символ представлен в виде 8-ми бит или 1-го байта.<br />
	Т.к. информация в ПК состоит из нулей и единиц, то символ в таком алфавите кодируется от 00000000<sub>2</sub> до 11111111<sub>2</sub>. Такое количество символов достаточно чтобы закодировать прописные,<br />
	строчные буквы латинского, национального алфавита, 10 цифр, скобки, знаки пунктуации и всевозможные знаки.</p>
<p class="Content2">Текстовая информация вводится в ПК путём двоичного кодирования. Т.е. изображение символа преобразуется в двоичный код.<br />
	Когда пользователь нажимает на клавиатуре клавишу с символом, в оперативную память поступает двоичный код этого символа. Чтобы на экране вместо этого двоичного кода мы видели символ,<br />
	точнее его изображение, двоичный код извлекает из таблицы графическое изображение символа, соответствующего этому коду. Эта таблица называется кодовая.<br />
	Кодовая таблица это стандарт, при котором каждому символу ставится свой порядковый номер в двоичном коде. Наименьший номер 0 наибольший 255.</p>
<p class="Header3">ASCII</p>
<p class="Content2">Рассмотрим, как в таблице размещены 256 символов.</p>
<p class="Content2">Первую половину таблицы от 0 до 127 разработали в США, называется она ASCII, эти символы одинаковы для всех стран, там размещены строчные, прописные буквы латинского алфавита, цифры 0..9, знаки препинания, скобки и другие символы. Символы алфавита  расположены  по порядку, что удобно для сортировки символьной информации, широко применимой в электронных таблицах, базах данных.</p>
<p class="Content2">Вторая половина таблицы от 128 до 255 содержит символы национальных алфавитов, т.е. для стран, где не применяют латиницу. Для русского алфавита могут применяться разные варианты таблиц . Например, в MS DOS эта таблица называлась 866, MS Windows это 1251.</p>
<p class="Content2">Наглядно понять кодовую страницу можно в браузере Internet Explorer, где можно изменить шрифт командой меню Вид/Кодировка/Дополнительно/ далее поэкспериментировать с выбором различных вариантов кодовых таблиц.</p>
<p class="Header3">Unicode</p>
<p class="Content2">Но 256 символов недостаточно для представления «экзотических» символов (иврит, китайских, арабских и т.д.), поэтому в настоящее время разработали международный стандарт Unicode где на каждый символ отводится не один, а два байта, следовательно можно закодировать 2<sup>16</sup>=65536 различных символов.</p>
<p>	<!-- FLASH OBJECT BEGIN --></p>
<div id="block10x10center">
<object id="Algo" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="384" height="288" align="middle"><param name="movie" value="wp-content/uploads/inf-InformationEncodingText.swf" /><param name="bgcolor" value="#ccccff" /><param name="scale" value="showall" /><param name="allowFullScreen" value="true" /><param name="AllowScriptAccess" value="sameDomain" /><!--[if !IE]>--><br />
    <object width="384" height="288" type="application/x-shockwave-flash" data="wp-content/uploads/inf-InformationEncodingText.swf"><param name="bgcolor" value="#ccccff" /><param name="allowFullScreen" value="true" /><param name="AllowScriptAccess" value="sameDomain" /><!--<![endif]--></p>
<p>      <a href="http://www.adobe.com/go/getflash" target="_blank"> <img src="wp-content/uploads/get_flash_player.gif" border="0" alt="Установить Adobe Flash player" /> </a> </p>
<p>      <!--[if !IE]>--></object><br />
    <!--<![endif]--></object>
 </div>
<p><!-- FLASH OBJECT END --></p>
<p class="Content2Top"><strong>Задача</strong>. Сколько бит занимает слово <i>круг</i> в кодировке CP1251?</p>
<p class="Content2"><strong>Решение</strong>: Один символ в кодировке CP1251 состоит из 1-го байта. Количество символов в слове <i>круг</i> умножаем на один байт и восемь бит – получаем:</p>
<p class="Content2">4 &#215; 1 &#215; 8 = 32 бит</p>
<p class="Content2Top"><strong>Задача</strong>.Автоматическое устройство осуществило перекодировку информационного сообщения на русском языке, первоначально записанного в 16 битном коде Unicode, в 8 битную кодировку КОИ-8. При этом информационное сообщение уменьшилось на 480 бит. Какова длина сообщения в символах?</p>
<p class="Content2"><strong>Решение</strong>: Здесь неважно в какой кодировке получить длину символов. Итак, один символ в Unicode в два раза больше символа КОИ-8(или любого 8 битного символа) значит, ПОЛУЧЕННАЯ ИНФОРМАЦИЯ УМЕНЬШИЛАСЬ В ДВА РАЗА, т.е. на один полученный символ отводится в два раза меньше бит, чем тому же символу до кодировки. Сообщение уменьшилось на 480 бит, даёт нам право узнать, сколько бит было до кодировки: 480 &#215; 2 = 960. Поскольку один символ занимает 16 бит, получаем 960 &#247; 16  = 60 символов содержало сообщение </p>
<p class="Content2">Но можно не вычислять сколько бит было до кодировки, если догадаться что сообщения в Unicode в два раза больше чем в КОИ-8, значит 480 делим на 8 получаем тоже значение &#8212; 60</p>
<p class="Content2Top"><strong>Задача</strong>. Скорость передачи данных через модем 56 Кбит/с. Передача текстового файла через модем заняла 12с. Определите, сколько символов содержал переданный текст, если он был представлен в кодировке Unicode.</p>
<p class="Content2"><strong>Решение</strong>: Определим сколько бит было передано за 12 с: Переведём Килобиты в биты: т.к. 1Кбит = 1000бит, то 56 &#215; 1000 = 56000, а за 12 с будет передано 56000 &#215; 12 = 672000. Т.к. в кодировке Unicode под каждый символ отводится 2 байта, или 16 бит, вычислим количество символов 672000 &#247; 16 = 42000.</p>
<p class="Content2Top"><strong>Задача</strong>. Для кодирования букв А, Б, В и Г решили использовать двухразрядные последовательные двоичные числа(от 00 до 11) Если таким образом закодировать последовательность БАВГ. Какой получится результат в 16-ричном коде?</p>
<p class="Content2"><strong>Решение</strong>: Выпишем каждый код для каждой буквы, выпишем коды в нужной последовательности, переведём каждый код символа в 16-ричную систему: А(00), Б(01), В(10), Г(11).  Б(01) А(00), В(10), Г(11). Получим 1023<sub>16</sub></p>
<p class="Header2">Графическая информация</p>
<p class="Content2">Чтобы изображение представить в ПК его разбивают на мелкие участки (фрагменты, точки) и каждому фрагменту разбитого изображения,<br />
	присваивают числовое значение цвета. Получается как мозаика. Это разбиение называют пространственная дискретизация.</p>
<p class="Content2">Качество разбитого изображения зависит от:</p>
<ol class="align_justify">
<li>Размера фрагментов, чем размер меньше, тем качество выше, т.е. количество фрагментов из которого состоит изображение, будет больше</li>
<li>От количества возможных цветов, которые представляют фрагмент изображения. Чем больше цветов, тем качество выше</li>
</ol>
<p class="Header3">Разрешающая способность</p>
<p class="Content2">Графическая информация на экране представлена в виде растрового изображения. Оно формируется из определённого количества строк. Каждая строка содержит определённое количество точек(пикселей). Такое формирование называют разрешающей способностью монитора или разрешение. Например разрешение 800&#215;600, это формирование на экране изображения состоящего из 600 горизонтальных строк по 800 точек (пикселей) в каждой строке. Бывают ещё разрешения: 1024&#215;768, 1280&#215;1024.</p>
<p class="Header3">Глубина  цвета</p>
<p class="Content2">Каждая точка(пиксель) может отображать цвет, физически это биты. Количество различных цветов зависит количество бит на точку, это количество называют глубиной точки или просто глубина. Количество цветов N которое может отобразить точка вычисляется по формуле N=2<sup>i</sup> где i число бит в точке.</p>
<p class="Content2">Если пиксель однобитный как в старых компьютерах, то экран может отобразить только 2<sup>1</sup> = 2 цвета,  либо чёрный либо белый. Для двухбитного пикселя количество различных цветов &#8212; 4. Для цветного изображения каждая точка может иметь различное число бит: 4, 8, 16, 24 и 32.</p>
<p class="Content2Top">В современных мониторах, цветное изображение, получается путём смешивания трёх цветов красный, зелёный, синий в одной точке. Такая цветовая модель называется RGB по первым буквам названий английского цвета (Red, Green, Blue).<br />
	На каждый цвет выделяют 8 бит, поэтому один пиксель содержит 24 бита. Другими словами, для красного, зелёного или синего, есть 2<sup>2</sup> = 256 уровней интенсивностей цвета<br />
	от 00000000<sub>2</sub> до 11111111<sub>2</sub>. Число возможных цветов при такой глубине получается по формуле: 2<sup>24</sup> = 16777216.</p>
<p class="Content2">Графический режим – величина разрешающей способности и глубины цвета.</p>
<p>	<!-- FLASH OBJECT BEGIN --></p>
<div id="block10x10center">
<object id="Algo" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="384" height="288" align="middle"><param name="movie" value="wp-content/uploads/inf-InformationEncodingGraphics.swf" /><param name="bgcolor" value="#ccccff" /><param name="scale" value="showall" /><param name="allowFullScreen" value="true" /><param name="AllowScriptAccess" value="sameDomain" /><!--[if !IE]>--><br />
    <object width="384" height="288" type="application/x-shockwave-flash" data="wp-content/uploads/inf-InformationEncodingGraphics.swf"><param name="bgcolor" value="#ccccff" /><param name="allowFullScreen" value="true" /><param name="AllowScriptAccess" value="sameDomain" /><!--<![endif]--></p>
<p>      <a href="http://www.adobe.com/go/getflash" target="_blank"> <img src="wp-content/uploads/get_flash_player.gif" border="0" alt="Установить Adobe Flash player" /> </a> </p>
<p>      <!--[if !IE]>--></object><br />
    <!--<![endif]--></object>
 </div>
<p><!-- FLASH OBJECT END --></p>
<p class="Content2Top"><strong>Задача</strong>. Рассчитаем объём видеопамяти в байтах для 1-го из графических режимов: разрешающей способности 800&#215;600 и глубины 24 бита.</p>
<p class="Content2"><strong>Решение</strong>:</p>
<p class="Content2">800&#215;600 = 480000 &#8212; количество точек</p>
<p class="Content2">теперь учтём, что каждая точка весит 24 бита, получаем:</p>
<p class="Content2">24&#215;480000 = 11 520 000 бит = 1 440 000 байт</p>
]]></content:encoded>
			<wfw:commentRss>http://kshu.su/?feed=rss2&#038;p=20</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Системы счисления</title>
		<link>http://kshu.su/?p=18</link>
		<comments>http://kshu.su/?p=18#comments</comments>
		<pubDate>Mon, 29 Sep 2014 12:49:35 +0000</pubDate>
		<dc:creator><![CDATA[Kirill Schurakhtenkov]]></dc:creator>
				<category><![CDATA[Информатика]]></category>

		<guid isPermaLink="false">http://kshu/?p=18</guid>
		<description><![CDATA[Позиционные системы счисления. Перевод чисел в позиционных системах счисления из одного основания в другое. Арифметические операции в позиционных системах счисления Позиционные системы счисления Рассмотрим основные позиционные системы: Система счисления Основание Алфавит цифр Двоичная 2 0, 1 Восьмеричная 8 0, 1, 2, 3, 4, 5, 6, 7 Десятичная 10 0, 1, 2, 3, 4, 5, 6, [&#8230;]]]></description>
				<content:encoded><![CDATA[<p class="Content2">Позиционные системы счисления. Перевод чисел в позиционных системах счисления из одного основания в другое. Арифметические операции в позиционных системах счисления</p>
<p>	<span id="more-18"></span></p>
<div class="Header2">Позиционные системы счисления</div>
<p class="Content2">Рассмотрим основные позиционные системы:</p>
<table class="table_11Tahoma">
<tr>
<th>Система счисления</td>
<th>Основание</td>
<th>Алфавит цифр</td>
</tr>
<tr>
<td>Двоичная</td>
<td>2</td>
<td>0, 1</td>
</tr>
<tr>
<td>Восьмеричная</td>
<td>8</td>
<td>0, 1, 2, 3, 4, 5, 6, 7</td>
</tr>
<tr>
<td>Десятичная</td>
<td>10</td>
<td>0, 1, 2, 3, 4, 5, 6, 7, 8, 9</td>
</tr>
<tr>
<td>Шестнадцатеричная</td>
<td>16</td>
<td>0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F</td>
</tr>
</table>
<p class="Content2">Из основания видно, сколько различных цифр в алфавите содержит та или другая система.</p>
<p class="Content2">Свойства позиционных систем счисления:</p>
<ol class="align_justify">
<li>В позиционных системах значение цифры зависит от её положения (разряда) в числе.</li>
<li>В позиционных системах счисления с основанием N, основание каждого следующего числа в N раз больше предыдущего. </li>
</ol>
<div class="Header2">Разложение чисел. Перевод чисел в десятичную систему счисления</div>
<p class="Content2">Согласно свойствам позиционных систем счисления разложим число 5327 в разных системах по следующему правилу: каждую цифру умножаем на основание числа, которое возведено в степень равной позиции цифры в числе минус 1. Затем полученные числа суммируются: </p>
<div class="Header3"><strong>в десятичной системе число 5327:</strong></div>
<p class="Content2">5 = 5 * 10<sup>3</sup> = 5 * 1000 = 5000</p>
<p class="Content2">3 = 3 * 10<sup>2</sup> = 3 * 100 = 300</p>
<p class="Content2">2 = 2 * 10<sup>1</sup> = 2 * 10 = 20</p>
<p class="Content2">7 = 7 * 10<sup>0</sup> = 7 * 1 = 7</p>
<p class="Content2">5000 + 300 + 20 + 7 = 5327</p>
<div class="Header3"><strong>в восьмеричной системе число 5327<sub>8</sub>:</strong></div>
<p class="Content2">5 = 5 * 8<sup>3</sup> = 5 * 512 = 2560</p>
<p class="Content2">3 = 3 * 8<sup>2</sup> = 3 * 64 = 192</p>
<p class="Content2">2 = 2 * 8<sup>1</sup> = 2 * 8 = 16</p>
<p class="Content2">7 = 7 * 8<sup>0</sup> = 7 * 1 = 7</p>
<p class="Content2">5327<sub>8</sub> = 2560 + 192 + 16 + 7 = 2775<sub>10</sub></p>
<div class="Header3"><strong>в шестнадцатеричной системе число 5327<sub>16</sub>:</strong></div>
<p class="Content2">5 = 5 * 16<sup>3</sup> = 5 * 4096 = 20480</p>
<p class="Content2">3 = 3 * 16<sup>2</sup> = 3 * 256 = 768</p>
<p class="Content2">2 = 2 * 16<sup>1</sup> = 2 * 32 = 32</p>
<p class="Content2">7 = 7 * 16<sup>0</sup> = 7 * 1 = 7</p>
<p class="Content2">5327<sub>16</sub> = 20480  + 768 + 32 + 7 = 21287<sub>10</sub></p>
<p class="Content2Top">Перевод чисел в десятичную систему счисления осуществляется по упомянутым выше разложениям чисел, при этом разложенное число суммируется, а полученный результат и есть число в десятичной системе.</p>
<p class="Content2Top">Для записи дробных чисел используется отрицательные степени основания:</p>
<p class="Content2">27,<strong>461</strong><sub>10</sub> = 2*10<sup>1</sup> + 7*10<sup>0</sup> + <strong>4*10<sup>-1</sup></strong> + <strong>6*10<sup>-2</sup></strong> + <strong>1*10<sup>-3</sup></strong></p>
<p class="Content2Top">Разложим числа записанные в разных системах счисления:</p>
<p class="Content2">101,01<sub>2</sub> = 1*2<sup>2</sup> + 0*2<sup>1</sup> + 1*2<sup>0</sup> + 0*2<sup>-1</sup> + 1*2<sup>-2</sup></p>
<p class="Content2">673,2<sub>8</sub> = 6*8<sup>2</sup> + 7*8<sup>1</sup> + 3*8<sup>0</sup> + 2*8<sup>-1</sup></p>
<p class="Content2">8A,F<sub>16</sub> = 8*16<sup>1</sup> + A*16<sup>0</sup> + F*16<sup>-1</sup></p>
<div class="Header2">Перевод целых чисел из десятичной системы в двоичную и в остальные</div>
<p class="Content2">Для перевода десятичного числа в двоичное, последовательно делим число на 2, до тех пор, пока частное не будет меньше делителя. После этого, записываем остатки в обратном порядке, а на первое место помещаем последнее частное(которое меньше делителя)</p>
<p class="Content2">Переведём число 19<sub>10</sub> в двоичное:</p>
<table class="table_11Tahoma">
<tr>
<td>Делимое</td>
<td>&nbsp;19</td>
<td>&nbsp;9</td>
<td>&nbsp;4</td>
<td>&nbsp;2</td>
<td>&nbsp;<strong>1</strong></td>
</tr>
<tr>
<td>Делитель (основание системы)</td>
<td>2</td>
<td>2</td>
<td>2</td>
<td>2</td>
<td>2</td>
</tr>
<tr>
<td>Остаток</td>
<td>1</td>
<td>1</td>
<td>0</td>
<td>0</td>
<td></td>
</tr>
</table>
<p class="Content2">Остаток в обратном порядке есть 0011, теперь последнее частное ставим вперёд:</p>
<p class="Content2"><strong>1</strong>0011<sub>2</sub> = 19<sub>10</sub></p>
<p class="Content2Top">Аналогично переводят десятичные целые числа в остальные системы заменяя в делителе основание. Пример переведём число 680<sub>10</sub> в шестнадцатеричное:
</p>
<table class="table_11Tahoma">
<tr>
<td>Делимое</td>
<td>&nbsp;680</td>
<td>&nbsp;42</td>
<td>&nbsp;<strong>2</strong></td>
</tr>
<tr>
<td>Делитель (основание системы)</td>
<td>16</td>
<td>16</td>
<td>16</td>
</tr>
<tr>
<td>Остаток</td>
<td>8</td>
<td>A(10)</td>
<td></td>
</tr>
</table>
<p class="Content2">Остаток в обратном порядке есть A8, теперь последнее частное ставим вперёд:</p>
<p class="Content2"><strong>2</strong>A8<sub>16</sub> = 680<sub>10</sub></p>
<div class="Header2">Перевод дробных чисел из десятичной системы в двоичную и в остальные</div>
<p class="Content2">Последовательно умножаем дробную часть на 2, записывая целую часть в прямом порядке. Повторить до тех пор, пока не получится нулевая дробная часть. </p>
<p class="Content2">Переведём число 0,75<sub>10</sub> в двоичное:</p>
<table class="table_11Tahoma">
<tr>
<td>Десятичная дробь</td>
<td>0,75</td>
<td>0,5</td>
<td>0,0</td>
</tr>
<tr>
<td>Множитель (основание системы)</td>
<td>2</td>
<td>2</td>
<td>2</td>
</tr>
<tr>
<td>Целая часть произведения</td>
<td>1</td>
<td>1</td>
<td></td>
</tr>
</table>
<p class="Content2">Переписываем целую часть в прямом порядке 0,75<sub>10</sub>  = 0,11<sub>2</sub></p>
<p class="Content2Top">Аналогично переводят десятичные дробные числа в остальные системы заменяя  в множителе основание.</p>
<p class="Content2">Переведём число 0,4062510<sub>10</sub> в восьмеричное:</p>
<table class="table_11Tahoma">
<tr>
<td>Десятичная дробь</td>
<td>0,4062510</td>
<td>0,25</td>
<td>0,0</td>
</tr>
<tr>
<td>Множитель (основание системы)</td>
<td>8</td>
<td>8</td>
<td>8</td>
</tr>
<tr>
<td>Целая часть произведения</td>
<td>3</td>
<td>2</td>
<td></td>
</tr>
</table>
<p class="Content2">Переписываем целую часть в прямом порядке 0,4062510<sub>10</sub>  = 0,32<sub>8</sub></p>
<div class="Header2">Перевод чисел из двоичной системы в восьмеричную и шестнадцатеричную и обратно</div>
<p class="Content2">Числа записанные в двоичной, восьмеричной и шестнадцатеричной системе являются числами основания которых есть степень 2. Значит, их легко перевести в двоичную систему для этого нужно знать, сколько разрядов в двоичной системе нужно для записи всех цифр восьмеричной и шестнадцатеричной системы.</p>
<p class="Content2">Мы уже изучили измерение информации, поэтому можем посчитать, сколько каждой системе счисления требуется бит (разрядов) для записи всех их символов:</p>
<div class="Header3">Двоичная система использует 1 разряд:</div>
<p class="Content2">2 = 2<sup>i</sup>, 2 = 2<sup>1</sup>, i = 1. </p>
<div class="Header3">Восьмеричная система использует 3 разряда:</div>
<p class="Content2">8 = 8<sup>i</sup>, 8 = 2<sup>3</sup>, i = 3. </p>
<div class="Header3">Шестнадцатеричная система использует 4 разряда:</div>
<p class="Content2">16 = 16<sup>i</sup>, 16 = 2<sup>4</sup>, i = 4. </p>
<p class="Content2">Т.о. для перевода целого 2-го числа в 8-ое, его нужно разбить на группы по 3 цифры(триады) справа налево. Если в крайней левой группе окажется меньше трёх цифр, то дополнить слева нулями.  Затем каждую группу преобразовать  нужную систему. Для перевода полезно подготовить таблицу преобразования:</p>
<table class="table_11Tahoma">
<tr>
<th>8-ая цифра</td>
<th>триада</td>
</tr>
<tr>
<td>0</td>
<td>000</td>
</tr>
<tr>
<td>1</td>
<td>001</td>
</tr>
<tr>
<td>2</td>
<td>010</td>
</tr>
<tr>
<td>3</td>
<td>011</td>
</tr>
<tr>
<td>4</td>
<td>100</td>
</tr>
<tr>
<td>5</td>
<td>101</td>
</tr>
<tr>
<td>6</td>
<td>110</td>
</tr>
<tr>
<td>7</td>
<td>111</td>
</tr>
</table>
<p class="Content2"><strong>Пример</strong>. Переведём двоичное число 101001<sub>2</sub> в восьмеричное:</p>
<p class="Content2"><strong>Решение</strong>. Разобьём по 3 цифры(нули слева добавлять не нужно) 101  001 получим       5<sub>8</sub> и 1<sub>8</sub>: 101001<sub>2</sub> = 51<sub>8</sub></p>
<p class="Content2Top">Для дробных чисел разбиваем на триады слева направо, и если в последней правой группе окажется меньше трёх цифр, дополним её справа нулями:</p>
<p class="Content2"><strong>Пример</strong>. Переведём дробное двоичное число 0,11010<sub>2</sub> в восьмеричное:</p>
<p class="Content2"><strong>Решение</strong>. 110   10(дополним справа нулями) 110    100.  Получим 6<sub>8</sub> и 4<sub>8</sub>: 0,11010<sub>2</sub> = 0,64<sub>8</sub></p>
<p class="Content2Top">Перевод целого 2-го в 16-ное аналогичен, только здесь разбиваем группы по 4 цифры(тетрады) справа налево, и также если в крайней левой группе меньше четырёх цифр, то добавляем слева нулями</p>
<table class="table_11Tahoma">
<tr>
<th>16-ая цифра</td>
<th>тетрада</td>
</tr>
<tr>
<td>0</td>
<td>0000</td>
</tr>
<tr>
<td>1</td>
<td>0001</td>
</tr>
<tr>
<td>2</td>
<td>0010</td>
</tr>
<tr>
<td>3</td>
<td>0011</td>
</tr>
<tr>
<td>4</td>
<td>0100</td>
</tr>
<tr>
<td>5</td>
<td>0101</td>
</tr>
<tr>
<td>6</td>
<td>0110</td>
</tr>
<tr>
<td>7</td>
<td>0111</td>
</tr>
<tr>
<td>8</td>
<td>1000</td>
</tr>
<tr>
<td>9</td>
<td>1001</td>
</tr>
<tr>
<td>A</td>
<td>1010</td>
</tr>
<tr>
<td>B</td>
<td>1011</td>
</tr>
<tr>
<td>C</td>
<td>1100</td>
</tr>
<tr>
<td>D</td>
<td>1101</td>
</tr>
<tr>
<td>E</td>
<td>1110</td>
</tr>
<tr>
<td>F</td>
<td>1111</td>
</tr>
</table>
<p class="Content2"><strong>Пример</strong>. Число из предыдущего примера 101001<sub>2</sub> переведём в шестнадцатеричное:</p>
<p class="Content2"><strong>Решение</strong>. Разобьём по 4 цифры справа налево 10   1001 (дополнив нулями крайнюю левую группу) 0010  1001 получаем 2<sub>16</sub> и 9<sub>16</sub>: 101001<sub>2</sub> = 29<sub>16</sub></p>
<p class="Content2Top">Для дробных чисел разбиваем на тетрады слева направо, и если в последней правой группе окажется меньше четырёх цифр, дополним её справа нулями:</p>
<p class="Content2"><strong>Пример</strong>. Переведём дробное двоичное число 0,110101<sub>2</sub> в восьмеричное:</p>
<p class="Content2"><strong>Решение</strong>. 1101   01(дополним справа нулями) 1101    0100.  Получим D<sub>16</sub> и 4<sub>16</sub>: 0,110101<sub>2</sub> = 0,D4<sub>16</sub></p>
<div class="Header2">Перевод из 8-ричной и 16-ричной систем счисления в двоичную.</div>
<p class="Content2">Для перевода чисел из восьмеричной или шестнадцатеричной систем счисления в двоичную нужно каждое число преобразовать в группу из трёх (триаду) или в группу из четырёх (тетраду) двоичных цифр соответственно:</p>
<p class="Content2">47<sub>8</sub> = разбиваем на триады: 4 = 100,  7 = 111. 47<sub>8</sub> = 100111<sub>2</sub></p>
<p class="Content2">AB<sub>16</sub> = разбиваем на триады: A = 1010, B = 1011. AB<sub>16</sub> = 10101011<sub>2</sub></p>
<div class="Header2">Арифметические операции в системах счисления</div>
<div class="Header3">Сложение</div>
<p class="Content2">Сложение производится по обычному правилу столбиком, но нужно учитывать, что если при сложении двух чисел<br />
	получается число с основанием большим чем у слагаемых, то полученное при сложении число нужно перевести соответствующую<br />
	систему счисления. Пример 5 + 7 = 12, НО 5<sub>8</sub> + 7<sub>8</sub> &#8800; 12, точнее нужно 12 перевести в<br />
	восьмеричную систему(можно так 12 &minus; 8 = 4. 4 пишем, а 1 переносим): 5<sub>8</sub> + 7<sub>8</sub> = 14<sub>8</sub>.</p>
<p class="Content2Top">Аналогично для сложения шестнадцатеричных чисел 5 + 7 будет также 12, но 12 в 16-ричном коде будет С. </p>
<p class="Content2">
<p class="Content2Top"><strong>Пример</strong>. Вычислим B<sub>16</sub> + D<sub>16</sub></p>
<p class="Content2"><strong>Решение</strong>. B<sub>16</sub> = 11<sub>10</sub>, D<sub>16</sub> = 13<sub>10</sub>. 11<sub>10</sub>+13<sub>10</sub> = 24<sub>10</sub> , 24 &minus; 16 = 8 пишем 1 переносим: B<sub>16</sub> + D<sub>16</sub>  = 18<sub>16</sub></p>
<p class="Content2Top"><strong>Пример</strong>.  Сложим большие шестнадцатеричные числа ABC<sub>16</sub> и CD<sub>16</sub></p>
<p class="Content2"><strong>Решение</strong>:</p>
<ol class="align_justify">
<li>C<sub>16</sub> + D<sub>16</sub> = 12<sub>10</sub> + 13<sub>10</sub> = 25<sub>10</sub>, 25 &minus; 16 = 9, 9 пишем 1 переносим,</li>
<li>B<sub>16</sub> + C<sub>16</sub> = 11<sub>10</sub> + 12<sub>10</sub> = 23<sub>10</sub>, 23 – 16 = 7 + 1(которую перенесли), 8 пишем, 1</li>
<li>A<sub>16</sub> + 1<sub>16</sub>, 10<sub>10</sub>+1<sub>10</sub> = 11<sub>10</sub>, 11 = B<sub>16</sub></li>
</ol>
<p class="Content2">Ответ: ABC<sub>16</sub> + CD<sub>16</sub> = B89<sub>16</sub></p>
<div class="Header3">Вычитание</div>
<p class="Content2Top"><strong>Пример</strong>. Вычислим 2005<sub>16</sub> &minus; B7<sub>16</sub></p>
<p class="Content2"><strong>Решение</strong>:</p>
<ol class="align_justify">
<li>5<sub>16</sub> &minus; 7<sub>16</sub> , но 5 &lt; 7, значит занимаем 10<sub>16</sub> из 4-го разряда (а в 3-й и 2-й на место нулей сваливается 10<sub>16</sub> – 1<sub>16</sub> = 16 &minus; 1 = 15 = F<sub>16</sub>)<br />
получаем 10<sub>16</sub> + 5<sub>16</sub> = 16 + 5 = 21. Теперь 21 – 7 = 14 = <strong>E<sub>16</sub></strong></li>
<li>После заёма, во втором разряде есть 15. Вычитаем из него B<sub>16</sub> получаем: 15 – B<sub>16</sub> = 15 – 11 = 4<sub>10</sub> = <strong>4<sub>16</sub></strong></li>
<li>После заёма, в третьем разряде есть 15, но вычитать нечего просто оставляем <strong>F<sub>16</sub></strong></li>
<li>И наконец, после заёма, в четвёртом разряде вместо 2 оставляем <strong>1<sub>16</sub></strong></li>
</ol>
<p class="Content2">Ответ: 2005<sub>16</sub> &minus; B7<sub>16</sub> = <strong>1F4E<sub>16</sub></strong></p>
<p class="Content2Top">Арифметические операции над числами в разных системах счисления, производятся путём перевода их в одинаковую систему.</p>
<p class="Content2Top"><strong>Пример</strong>. Вычислим 36<sub>8</sub> + 47<sub>16</sub>, , а результат представим в двоичную, восьмеричную и шестнадцатеричную систему счисления.</p>
<p class="Content2"><strong>Решение</strong>:</p>
<ol class="align_justify">
<li>36<sub>8</sub> раскладываем на триады &#8212; 3<sub>8</sub> = 011<sub>2</sub>, 6<sub>8</sub> = 110<sub>2</sub>, 36<sub>8</sub> = 011110<sub>2</sub></li>
<li>47<sub>16</sub> раскладываем на тетрады &#8212; 4<sub>16</sub> = 0100<sub>2</sub>, 7<sub>16</sub> = 0111<sub>2</sub>, 47<sub>16</sub> = 01000111<sub>2</sub></li>
<li>36<sub>8</sub>  + 47<sub>16</sub> = 011110<sub>2</sub> + 01000111<sub>2</sub> = <strong>1100101<sub>2</sub></strong></li>
</ol>
<p class="Content2">Теперь полученное число 1100101<sub>2</sub> переведём восьмеричную и шестнадцатеричную систему:</p>
<p class="Content2">1100101<sub>2</sub> делим на триады = 001<sub>2</sub>, 100<sub>2</sub> и 101<sub>2</sub> = 1<sub>8</sub>, 4<sub>8</sub>, и 5<sub>8</sub>=<strong>145<sub>8</sub></strong></p>
<p class="Content2">1100101<sub>2</sub> делим на тетрады = 0110<sub>2</sub>, 0101<sub>2</sub> = 6<sub>16</sub>, и 5<sub>16</sub> = <strong>65<sub>16</sub></strong></p>
<p class="Content2">1100101<sub>2</sub> = 145<sub>8</sub> = 65<sub>16</sub></p>
]]></content:encoded>
			<wfw:commentRss>http://kshu.su/?feed=rss2&#038;p=18</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Измерение информации</title>
		<link>http://kshu.su/?p=15</link>
		<comments>http://kshu.su/?p=15#comments</comments>
		<pubDate>Mon, 29 Sep 2014 12:08:45 +0000</pubDate>
		<dc:creator><![CDATA[Kirill Schurakhtenkov]]></dc:creator>
				<category><![CDATA[Информатика]]></category>

		<guid isPermaLink="false">http://kshu/?p=15</guid>
		<description><![CDATA[Что такое бит и сколько он может хранить информации. Что такое неопределённость знаний. Сколько информации, может нести сообщение. По какой формуле можно выяснить количество информации из множества событий. Сколько бит в килобите и сколько байт в килобайте. Мощность алфавита и информационный вес символа. Информационный объём текста. Решение задач на измерение информации. Содержательный подход Информация это [&#8230;]]]></description>
				<content:encoded><![CDATA[<p class="Content2">Что такое бит и сколько он может хранить информации. Что такое неопределённость знаний. Сколько информации, может нести сообщение. По какой формуле можно выяснить количество информации из множества событий. Сколько бит в килобите и сколько байт в килобайте. Мощность алфавита и информационный вес символа. Информационный объём текста. Решение задач на измерение информации.</p>
<p>	<span id="more-15"></span></p>
<div class="Header2"><strong>Содержательный подход</strong></div>
<p class="Content2">Информация это сообщения (текст, звук, графика, видео)&#8230;</p>
<p class="Content2">А в чём её измерить.  В информатике за единицу измерения информации приняли бит который может хранить одно из двух различных значений либо 0, либо 1. Для простоты можно вместо 0 и 1 выбрать любые два взаимно противоположные понятия:
</p>
<p class="Content2">ДА-НЕТ;</p>
<p class="Content2">СВЕТЛО-ТЕМНО;</p>
<p class="Content2">ХОЛОДНО-ЖАРКО;</p>
<p class="Content2">ДЕНЬ-НОЧЬ;</p>
<p class="Content2">ПЛЮС-МИНУС;</p>
<p class="Content2">БЕЛЫЙ-ЧЁРНЫЙ</p>
<div class="Header3"><strong>Неопределённость знаний</strong></div>
<p class="Content2">Сообщение, уменьшающее неопределённость знаний в 2 раза несёт 1 бит информации.</p>
<p class="Content2">Перед бросанием монеты есть ДВА равновероятных результатов, т.е. неопределённость знаний равна двум. Игральный кубик с шестью гранями перед броском несёт неопределённость знаний равной шести. Значит неопределённость знаний о некотором событии это количество возможных событий.</p>
<p class="Content2">После того как подбросили монету, мы увидели ОДИН результат. Произошло одно из двух событий. Неопределённость уменьшилась в 2 раза: было 2 варианта, остался 1, мы получили 1 бит информации. Сообщение о том, что произошло одно событие из двух, несёт 1 бит информации.</p>
<p class="Content2">Теперь узнаем в цифрах, сколько информации может нести сообщение</p>
<p class="Content2">Сколько информации несёт сообщение о том, что произошло 1 событие из 4 возможных? Например: Есть шкаф с четырьмя полками, на каждой по одной книге, сколько бит информации мы получили узнав о том, что некто взял книгу из третей полки?</p>
<p class="Content2">Ответом будет количество возможных вопросов, ответы на которых могут быть лишь ДА или НЕТ. При этом после очередного полученного ответа мы должны исключить ровно половину. </p>
<p class="Content2">Итак, перед первым вопросом разделим шкаф с четырьмя полками пополам, узнав в какой половине НЕ лежит книга, делим эту половину на два. Теперь перед вторым вопросом делим эту половину пополам и задаём второй вопрос и т.д. Теперь по действиям:</p>
<p class="Content2">Итак, книгу взяли, и до 1-го вопроса есть четыре полки с тремя книгами. Делим шкаф пополам:</p>
<p class="Content2">Задаём 1-й вопрос: «Книга лежала в левой или в правой части?» Ответ: в правой. Левую часть исключаем, а правую делим пополам:</p>
<p class="Content2">Задаём 2-й вопрос: «Книга лежала в левой или в правой части?» Ответ: в левой. Больше делить нечего. Ответ: Было задано два вопроса, соответственно получили 2 бита информации.</p>
<p class="Content2">Т.е. сообщение КНИГУ ВЗЯЛИ ИЗ ТРЕТЬЕЙ ПОЛКИ несёт 2БИТА информации, при условии что количество полок 4. При этом сообщении неопределённость уменьшилось в 4 раза. </p>
<p class="Content2">Тоже самое сообщение, но при количестве полок 8, уменьшает неопределённость в 8 раз, а несёт уже 3 бита информации, поскольку здесь уже пришлось бы задавать три вопроса. 8 платформ на поезд, пассажир не знает на какую платформу подадут поезд, после объявления номера платформы неопределённость уменьшилась в 8 раз и несёт 3 бита информации,</p>
<div class="Header3"><strong>Формула Хартли</strong></div>
<p class="Content2">Получим формулу позволяющую выводить количество информации из множества событий. Обозначим N число возможных событий, i количество информации содержащейся в сообщении о том, что произошло одно из N возможных событий.</p>
<p class="Content2">Итак пример с монетой N=2, i=1 с книгами в четырёх полках N = 4, i = 2, с платформами N = 8, i = 3. Связь между этими величинами выражается уравнением:</p>
<p class="Content2">2<sup>i</sup> = N</p>
<p class="Content2">А если величина N известна, а найти нужно i, то уравнение будет показательным</p>
<p class="Content2">i=log<sub>2</sub>N</p>
<p class="Content2">его называют формулой Хартли.</p>
<p class="Content2">Но проще выписать в таблицу хотя бы из 10 чисел степени двойки и запомнить их:</p>
<table class=table_11Tahoma>
<tr>
<th width="60">N</td>
<th width="60">i</td>
</tr>
<tr>
<td>2</td>
<td>1</td>
</tr>
<tr>
<td>4</td>
<td>2</td>
</tr>
<tr>
<td>8</td>
<td>3</td>
</tr>
<tr>
<td>16</td>
<td>4</td>
</tr>
<tr>
<td>32</td>
<td>5</td>
</tr>
<tr>
<td>64</td>
<td>6</td>
</tr>
<tr>
<td>128</td>
<td>7</td>
</tr>
<tr>
<td>256</td>
<td>8</td>
</tr>
<tr>
<td>512</td>
<td>9</td>
</tr>
<tr>
<td>1024</td>
<td>10</td>
</tr>
</table>
<p class="Content2"><strong>Задача</strong>. Сколько бит информации несёт сообщение о том, что из колоды в 32 карты достали даму пик?</p>
<p class="Content2"><strong>Решение</strong>: т.к. события равновероятные, то неопределённость равна количеству карт, т.е. N = 32, если i количество информации в сообщении о результате вытаскивания одной карты, то имеем уравнение 2<sup>i</sup> = 32, по формуле Хартли имеем log<sub>2</sub> 32 = 5. Ответ: i = 5</p>
<div class="Header3"><strong>Байт. Килобайт. Килобит</strong></div>
<p class="Content2">В информатике используется величина байт равная 8 битам, т.е. в одном байте может произойти 2<sup>8</sup> = 256 событий. Или, одним байтом можно закодировать 256 различных символов.</p>
<p class="Content2">Для большого количества байтов применяют приставки КИЛО, МЕГА, ГИГА, ТЕРА и получают килобайты(Кб), мегабайты(Мб), гигабайты(Гб) и терабайты(Тб):</p>
<ul class="align_justify">
<li>1 Кб = 2<sup>10</sup> = 1024 байт</li>
<li>1 Мб = 2<sup>20</sup> = 1024 Кб</li>
<li>1 Гб = 2<sup>30</sup> = 1024 Мб</li>
<li>1 Тб = 2<sup>40</sup> = 1024 Гб</li>
</ul>
<p class="Content2">Другими словами: число 1024, это количество байт в килобайте, это количество килобайт в мегабайте, это количество мегабайт в гигабайте.</p>
<p class="Content2">В компьютерных сетях используют килобиты(Кбит), мегабиты(Мбит) и гигабиты(Гбит):</p>
<ul class="align_justify">
<li>1Кбит = 1000 бит</li>
<li>1Мбит = 1000 Кбит = 1000 000 бит</li>
<li>1Гбит = 1000 Мбит = 1000 000 Кбит = 1000 000 000 бит</li>
</ul>
<p class="Header3">Гигабайты, мегабайты, килобайты, байты в биты и наоборот</p>
<p class="Content2">Переведём последовательно 2 гигабайта в биты через мегабайты, килобайты и байты:</p>
<p class="Content2">2 Гб = 2 &#215; 1024 = 2048 Мб</p>
<p class="Content2">2048 Мб = 2048 &#215; 1024 = 2097152 Кб</p>
<p class="Content2">2097152 Кб = 2097152 &#215; 1024 = 2147483648 байт</p>
<p class="Content2">2147483648 байт = 2 147 483 648 &#215; 8 = 17179869184 бит</p>
<p class="Content2Top">Перевод из бит в байты производится делением на 8, а из байт в килобайты, из килобайт в мегабайты и из мегабайт в гигабайты – делением на 1024</p>
<div class="Header2"><strong>Алфавитный подход.</strong></div>
<p class="Content2">Для измерения физических величин(х, m, t) есть эталонные единицы(м, кг, с). И для измерения информации нужно ввести измеряемую величину. Алфавитный подход позволит измерить информационный объём текста на некотором языке.</p>
<div class="Header3"><strong>Мощность алфавита</strong></div>
<p class="Content2">Мощность это полное число символов в алфавите, обозначают N.</p>
<div class="Header3"><strong>Информационный вес символа</strong></div>
<p class="Content2">Каждый символ имеет информационный вес, который зависит от мощности N алфавита. Наименьшая N, или наименьшее число символов в алфавите = 2, и состоит из 0 и 1. А информационный вес этого алфавита i =1 и называется бит.</p>
<p class="Content2">С увеличением N увеличивается информационный вес. 1 символ в 4-х символьном алфавита весит 2 бита, т.е. все символы такого алфавита могут закодированы всеми возможными комбинациями из 2 цифр двоичного алфавита:</p>
<p class="Content2">00</p>
<p class="Content2">01</p>
<p class="Content2">10</p>
<p class="Content2">11</p>
<p class="Content2">Значит, имея 4 различных символа, получаем информационный вес любого из них равный 2 (Если N=4, то i=2). Используя 3 различные цифры, можно составить 8 различных комбинаций. Значит, имея N = 8, получаем информационный вес i =3.</p>
<div class="Header3"><strong>Информационный объём текста</strong></div>
<p class="Content2">Количество информации во всём тексте (или информационный объём текста) I состоящим из К символов равно<br />
произведению информационного веса символа i на количество символов К: I = i &#215; K. </p>
<p class="Content2"><strong>Задача</strong>. Компьютерный текст состоит из алфавита мощностью<br />
256 знаков(символы, цифры, знаки препинания, скобки). Какой информационный объём имеет слово <strong>информация</strong>? </p>
<p class="Content2"><strong>Решение</strong>. Воспользуемся формулой I = i &#215; K, где К это количество символов<br />
в слове <strong>информация</strong> т.е. 10, а i это сколько бит весит один символ:<br />
N = 2<sup>i</sup>, N по условию = 256, находим i=8 . Итого: I = 8 &#215; 10 = 80 бит</p>
<div class="Header2"><strong>Решение задач</strong></div>
<p class="Content2">Решение задач на поиск различных ситуаций(не путать с информационным объёмом текста). Здесь нужно найти, количество предметов и количество свойств, которыми обладает этот предмет (символы, цвета,  сигналы и т.п.). Затем, вычислить число различных ситуаций которые могут возникнуть располагая такими предметами. Данное число получается по следующей формуле:</p>
<p class="Content1">количество свойств  <sup>количество предметов</sup></p>
<p class="Content2Top"><strong>Задача 1</strong>. Сколько различных последовательностей длиной в 6 символов можно составить из цифр 0 и 1?</p>
<p class="Content2"><strong>Решение</strong>: Нужно представить блок из 6 ячеек, каждая из которых может хранить два разных значения в нашем случае это 0 или 1, 2<sup>6</sup> = 64</p>
<p class="Content2">Наглядно представить решение этой задачи можно с помощью flash ролика где можно перебрать все 64 значения нажимая на биты</p>
<p><!-- FLASH OBJECT BEGIN --></p>
<div id="block10x10center">
<object id="Algo" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="384" height="288" align="middle"><param name="movie" value="wp-content/uploads/inf-Dimension1.swf" /><param name="bgcolor" value="#ccccff" /><param name="scale" value="showall" /><param name="allowFullScreen" value="true" /><param name="AllowScriptAccess" value="sameDomain" /><!--[if !IE]--><br />
    <object width="384" height="288" type="application/x-shockwave-flash" data="wp-content/uploads/inf-Dimension1.swf"><param name="bgcolor" value="#ccccff" /><param name="allowFullScreen" value="true" /><param name="AllowScriptAccess" value="sameDomain" /><!--![endif]--></p>
<p>      <a href="http://www.adobe.com/go/getflash" target="_blank"> <img src="wp-content/uploads/get_flash_player.gif" border="0" alt="Установить Adobe Flash player" /> </a> </p>
<p>      <!--[if !IE]--></object><br />
    <!--![endif]--></object>
 </div>
<p><!-- FLASH OBJECT END --></p>
<p class="Content2Top"><strong>Задача 2</strong>. Сколько различных последовательностей длиной в 8 символов можно составить из цифр 0 и 1?</p>
<p class="Content2"><strong>Решение</strong>: Нужно представить блок из 8 ячеек, каждая из которых может хранить два разных значения в нашем случае это 0 или 1, 2<sup>8</sup> = 256.</p>
<p class="Content2Top"><strong>Задача 3</strong>. Дано устройство, состоящее из двух переключателей, каждый из которых может быть установлен в один из трёх режимов. Сколько различных функций может реализовать устройство?</p>
<p class="Content2"><strong>Решение</strong>: Здесь предмет это переключатель (но не устройство), он обладает тремя различными свойствами, количество переключателей два. Получаем: 3<sup>2</sup>=9.</p>
<p class="Content2">Наглядно представить решение этой задачи можно с помощью flash ролика, где нажимая на каждый из двух предметов можно перебрать 9 различных значений (один предмет содержит 3-х различных изображения)</p>
<p><!-- FLASH OBJECT BEGIN --></p>
<div id="block10x10center">
<object id="Algo" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="384" height="288" align="middle"><param name="movie" value="wp-content/uploads/inf-Dimension2.swf" /><param name="bgcolor" value="#ccccff" /><param name="scale" value="showall" /><param name="allowFullScreen" value="true" /><param name="AllowScriptAccess" value="sameDomain" /><!--[if !IE]>--><br />
    <object width="384" height="288" type="application/x-shockwave-flash" data="wp-content/uploads/inf-Dimension2.swf"><param name="bgcolor" value="#ccccff" /><param name="allowFullScreen" value="true" /><param name="AllowScriptAccess" value="sameDomain" /><!--<![endif]--></p>
<p>      <a href="http://www.adobe.com/go/getflash" target="_blank"> <img src="wp-content/uploads/get_flash_player.gif" border="0" alt="Установить Adobe Flash player" /> </a> </p>
<p>      <!--[if !IE]>--></object><br />
    <!--<![endif]--></object>
 </div>
<p><!-- FLASH OBJECT END --></p>
<p class="Content2Top"><strong>Задача 4</strong>. Два туристских лагеря расположенных по разные стороны реки условились передавать друг другу сообщения при помощи цветных фонариков красного и синего цвета, зажигая или гася их на 1 минуту. Каждую минуту наблюдатель с другого берега может зафиксировать одно из трёх событий: светит красный, светит синий или не светит никакой. Сколько различных сообщений можно передать за пять минут? </p>
<p class="Content2"><strong>Решение</strong>: Здесь можно попасться, если принять во внимание что различных сообщений два: красный цвет и синий, но в условии идёт речь что принимающий турист считает выключенный фонарик как третье сообщение. Итак, различных событий три, количество повторений этих событий пять: 3<sup>5</sup>.</p>
<p class="Content2Top"><strong>Задача 5</strong>. Сколько различных сообщений мог бы передать светофор, если бы у него одновременно горели сразу три фонаря, а каждый фонарь мог бы менять цвет на красный, жёлтый, зелёный и синий? </p>
<p class="Content2"><strong>Решение</strong>: Здесь предмет это фонарь(но не светофор!!!), один фонарь обладает четырьмя различными свойствами, количество предметов три: 4<sup>3</sup>.</p>
<p class="Content2Top"><strong>Задача 6</strong>. Табло состоит из ламп, способные находится в следующих различных состояниях: лампа горит, лампа не горит или лампа мигает. Сколько различных сообщений может передать табло, если в нём четыре лампы?</p>
<p class="Content2"><strong>Решение</strong>: Здесь предмет это лампа(не табло), этот предмет обладает тремя различными свойствами, количество предметов четыре: 3<sup>4</sup>.</p>
<p class="Content2Top">Решение задач с информационным объёмом сообщений, ведётся с применением формулы I = i &#215; K, где I это информационный объём, i информационный вес предмета из всех участвующих в задаче предметах и K количество предметов участвующих в конечном результате задачи</p>
<p class="Content2Top"><strong>Задача 7</strong>. В скачках участвуют 20 лошадей. Специальное устройство регистрирует прохождение каждой лошадью финиша, записывая её номер с использованием минимально возможного количества бит, одинакового для каждой лошади. Каков информационный объём сообщения, записанного устройством в байтах, если до финиша добрались 8 лошадей?</p>
<p class="Content2">Наглядно представить решение этой задачи можно с помощью flash ролика, где вначале показано сколько бит нужно выделить для каждой из участвующих лошадей, затем просуммировать эти биты</p>
<p>	<!-- FLASH OBJECT BEGIN --></p>
<div id="block10x10center">
<object id="Algo" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="384" height="288" align="middle"><param name="movie" value="wp-content/uploads/inf-Dimension3.swf" /><param name="bgcolor" value="#ccccff" /><param name="scale" value="showall" /><param name="allowFullScreen" value="true" /><param name="AllowScriptAccess" value="sameDomain" /><!--[if !IE]>--><br />
    <object width="384" height="288" type="application/x-shockwave-flash" data="wp-content/uploads/inf-Dimension3.swf"><param name="bgcolor" value="#ccccff" /><param name="allowFullScreen" value="true" /><param name="AllowScriptAccess" value="sameDomain" /><!--<![endif]--></p>
<p>      <a href="http://www.adobe.com/go/getflash" target="_blank"> <img src="wp-content/uploads/get_flash_player.gif" border="0" alt="Установить Adobe Flash player" /> </a> </p>
<p>      <!--[if !IE]>--></object><br />
    <!--<![endif]--></object>
 </div>
<p><!-- FLASH OBJECT END --></p>
<p class="Content2Top"><strong>Задача 8</strong>. В некоторой стране автомобильный номер длинной 5 символов составлен из заглавных букв(33) и десятичных цифр в любом порядке. Каждый номер помещают в память ПК с использованием минимально возможным и одинаково целым количеством байт, а каждому символу в номере отводится одинаковое количество минимально возможных бит. Сколько байт хватит для записи 35 номеров?</p>
<p class="Content2"><strong>Решение</strong>:</p>
<ol class="align_justify">
<li>Сколько бит хватит для каждого символа в номере, если каждый символ состоит из 43 различных знаков: 6</li>
<li>Сколько целых байт понадобится ПК чтобы записать один номер: имеем 30 бит,  подгоняем биты до такого количества чтобы они уложились в ровное количество байт, т.е. чтобы деление на 8 было без остатка. Получаем 32 бита итого 4 байта на номер</li>
<li>Один номер 4 байта количество номеров 35: итого 140 байт</li>
</ol>
<p class="Content2Top"><strong>Задача 9</strong>. В 2011 году на гран при F1 участвуют одиннадцать команд каждая команда представлена двумя пилотами(в том числе и российский пилот Виталий Петров). Специальное устройство регистрирует прохождение финиша каждого пилота, записывая его номер с использованием минимально возможного количества бит, одинакового для каждого пилота. Каков информационный объём сообщения, записанного устройством, если до финиша добралось 17 пилотов? </p>
<p class="Content2"><strong>Решение</strong>: Итак есть 22 пилота, в такое количество может уложиться пять бит чтобы устройство смогло всех зафиксировать, т.е. на каждого пилота по пять бит. К финишу приехало 17 пилотов получаем 17 * 5</p>
]]></content:encoded>
			<wfw:commentRss>http://kshu.su/?feed=rss2&#038;p=15</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
