<?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://freeschool.altlinux.ru/?feed=rss2&#038;tag=%D1%87%D0%B5%D1%80%D0%BD%D1%8B%D0%B9" rel="self" type="application/rss+xml" />
	<link>http://freeschool.altlinux.ru</link>
	<description>Команда ALT Linux рассказывает о внедрении свободного программного обеспечения в школах России</description>
	<lastBuildDate>Fri, 03 Feb 2017 13:54:35 +0000</lastBuildDate>
	<language>ru-RU</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=4.2.2</generator>
	<item>
		<title>BASIC-256. Книга целиком</title>
		<link>http://freeschool.altlinux.ru/?p=4303</link>
		<comments>http://freeschool.altlinux.ru/?p=4303#comments</comments>
		<pubDate>Wed, 04 May 2011 11:25:09 +0000</pubDate>
		<dc:creator><![CDATA[Владимир Черный]]></dc:creator>
				<category><![CDATA[Методические материалы]]></category>
		<category><![CDATA[BASIC-256]]></category>
		<category><![CDATA[Ирюпин]]></category>
		<category><![CDATA[Черный]]></category>

		<guid isPermaLink="false">http://freeschool.altlinux.ru/?p=4303</guid>
		<description><![CDATA[Сравнительно недавно мы публиковали главы из книги Джеймса Рено &#171;So You Want To Learn to Programm?&#187;. Теперь доступен для скачивания перевод всей книги. По сравнению с публикацией на этом блоге, в книге содержится полная справочная информация по операторам и функциям языка, снабженная примерами, а также дополнительная справочная информация, полезная для начинающих программистов. Перевод выполнен Сергеем [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Сравнительно недавно мы <a href="http://freeschool.altlinux.ru/?p=4062">публиковали главы</a> из книги <a href="http://basicbook.org/download">Джеймса Рено &#171;So You Want To Learn to Programm?&#187;</a>. Теперь доступен для скачивания перевод всей книги.<br />
По сравнению с публикацией <a href="http://freeschool.altlinux.ru/?p=4062">на этом блоге</a>, в книге содержится полная справочная информация по операторам и функциям языка, снабженная примерами, а также дополнительная справочная информация, полезная для начинающих программистов.<br />
Перевод выполнен Сергеем Ирюпиным (мантейнер пакета <a href="http://sisyphus.ru/ru/srpm/Sisyphus/basic256">basic256</a> для репозитория Альт Линукс) и Владимиром Черным.<br />
Скачать перевод можно <a href="http://www.altlinux.org/Books:Basic-256">тут</a>.<br />
Комментарии, критика и ошибки приветствуются.</p>
]]></content:encoded>
			<wfw:commentRss>http://freeschool.altlinux.ru/?feed=rss2&#038;p=4303</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>BASIC-256. Глава 20</title>
		<link>http://freeschool.altlinux.ru/?p=4062</link>
		<comments>http://freeschool.altlinux.ru/?p=4062#comments</comments>
		<pubDate>Fri, 18 Mar 2011 00:00:15 +0000</pubDate>
		<dc:creator><![CDATA[Владимир Черный]]></dc:creator>
				<category><![CDATA[Методические материалы]]></category>
		<category><![CDATA[BASIC-256]]></category>
		<category><![CDATA[Ирюпин]]></category>
		<category><![CDATA[Черный]]></category>

		<guid isPermaLink="false">http://freeschool.altlinux.ru/?p=4062</guid>
		<description><![CDATA[Этой главой мы завершаем публикацию перевода книги Джеймса Рено. Далее в книге только технические приложения. Всю эту информацию можно взять из справочника внутри самой программы или из сети. Эту главу перевел Владимир Черный. Оглавление: Глава 1: Знакомство с BASIC-256 – cкажи «Привет» Глава 2: Рисуем основные фигуры Глава 3: Звуки и музыка Глава 4: Мыслить [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Этой главой мы завершаем публикацию перевода <a href="http://basicbook.org/download">книги Джеймса Рено</a>. Далее в книге только технические приложения. Всю эту информацию можно взять из справочника внутри самой программы или из сети. Эту главу перевел Владимир Черный.<br />
Оглавление:</p>
<ul>
<li><a href="http://freeschool.altlinux.ru/?p=3401">Глава 1: Знакомство с BASIC-256 – cкажи «Привет»</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3461">Глава 2: Рисуем основные фигуры</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3504">Глава 3: Звуки и музыка</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3569#g4">Глава 4: Мыслить как программист</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3569#g5">Глава 5: Программа задает вам вопросы</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3643">Глава 6: Сравнения, сравнения, сравнения</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3689">Глава 7: Циклы и счетчики — повторяем снова и снова</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3719">Глава 8: Графика на заказ — создание фигур своими руками</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3755">Глава 9: Подпрограммы — повторное использование кода</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3805">Глава 10: Управляем мышкой, перемещаем объекты</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3842">Глава 11: Использование клавиатуры для управления программой</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3867">Глава 12: Картинки, музыка и спрайты</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3906">Глава 13 Массивы — коллекции данных</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3930">Глава 14 Математика &mdash; развлечемся с числами</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3988">Глава 15 Работаем со строками</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3992">Глава 16 Файлы. Сохраним информацию на будущее</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=4015">Глава 17 Стеки, очереди, списки и сортировка</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=4048">Глава 18 Ловушки для ошибок времени исполнения</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=4054">Глава 19 Программирование баз данных</a></li>
</ul>
<p><a href="#basic">Где взять BASIC-256</a><br />
<span id="more-4062"></span><br />
<ljcut></p>
<h2>Глава 20. Сетевые соединения</h2>
<p>В этой главе мы обсудим как использовать сетевые возможности BASIC-256. Сетевые функции в BASIC-256 реализованы как простое соединение через сокет с использованием TCP протокола (Transmission Control Protocol &mdash; протокол управления передачей). Здесь вы не найдете полного введения в программирование для TCP/IP сокетов.</p>
<h3>Соединение с сокетом</h3>
<p>Сетевые сокеты создают соединение между двумя компьютерами или программами. Пакеты с информацией могут быть отправлены или получены в двух направлениях через такое соединение.</p>
<p><a href="http://freeschool.altlinux.ru/wp-content/uploads/2011/02/chapter20-img35.png"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2011/02/chapter20-img35-300x126.png" alt="" title="chapter20-img35" width="300" height="126" class="aligncenter size-medium wp-image-4064" /></a><br />
Рисунок 35 Взаимодействие между сокетами.</p>
<p>Когда вы звоните по телефону, то вы (как клиент) должны знать номер телефона абонента, кому вы звоните (он &mdash; сервер). Мы называем такие номера &mdash; IP-адрес. BASIC-256 использует IP-адреса версии 4, которые обычно записывают четырьмя десятичными числами, разделенными точкой (A.B.C.D, где A,B,C и D в диапазоне от 0 до 255).</p>
<p>Дополнительно к IP-адресу сервера, клиент и сервер должны общаться через определенный порт. Можно представлять порт, как дополнительный номер к многоканальному телефонному номеру. Если вам (как клиенту) нужен определенный человек в большой компании (имеющей один общий входящий номер), то вам необходимо набрать дополнительно внутренний номер (порт) в ответ на сообщение (телефонного сервера) о соединении с общим номером компании (IP-адресом).</p>
<p>Номера портов могут быть любыми в диапазоне от 0 до 65535, но обычно порты в диапазоне от 0 до 1023 заняты различными системными службами (приложениями), поэтому такие порты не следует использовать.</p>
<p>Пример простого сервера и клиента.<br />
<code><br />
 1 # simple_server.kbs пример сервера<br />
 2 print &quot;Прием запросов по порту 9999 на IP:&quot; + netaddress()<br />
 3 NetListen 9999<br />
 4 NetWrite &quot;Тестовое сообщение простого сервера.&quot;<br />
 5 NetClose<br />
</code><br />
Программа 106 Простой сервер<br />
<code><br />
 1 # simple _client.kbs пример клиента<br />
 2 input &quot;Введите IP-адрес сервера: &quot;, addr$<br />
 3 if addr$ = &quot;&quot; then addr$ = &quot;127.0.0.1&quot;<br />
 4 #<br />
 5 NetConnect addr$, 9999<br />
 6 print NetRead<br />
 7 NetClose<br />
</code><br />
Программа 107 Простой клиент.<br />
<code><br />
Прием запросов по порту 9999 на IP:10.1.2.103<br />
</code><br />
Пример вывода программы 106 Простой сервер<br />
<code><br />
Введите IP-адрес сервера:<br />
Тестовое сообщение простого сервера.<br />
</code><br />
Пример вывода программы 107 Простой клиент</p>
<table>
<tr>
<td align="center"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2010/11/new_concept.png" alt="" title="Новое понятие" width="80" height="80" class="aligncenter size-full wp-image-3467" /></td>
<td><strong>netaddress</strong><br />
  <strong>netaddress()</strong></p>
<p>  Эта функция возвращает числовой Ipv4 адрес сетевого компьютера
  		</td>
</tr>
</table>
<table>
<tr>
<td align="center"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2010/11/new_concept.png" alt="" title="Новое понятие" width="80" height="80" class="aligncenter size-full wp-image-3467" /></td>
<td><strong>netlisten</strong> <i>номер_порта</i><br />
  <strong>netlisten</strong> (<i>номер_порта</i>)<br />
  <strong>netlisten</strong> <i>номер_сокета, номер_порта</i><br />
  <strong>netlisten</strong> (<i>номер_сокета, номер_порта</i>)</p>
<p>  Открывает сетевое соединение (со стороны сервера) на указанном порту и ожидает соединений от других программ. Если <i>номер_сокета</i> не указан, используется нулевой (0) номер.
  		</td>
</tr>
</table>
<table>
<tr>
<td align="center"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2010/11/new_concept.png" alt="" title="Новое понятие" width="80" height="80" class="aligncenter size-full wp-image-3467" /></td>
<td><strong>netclose</strong><br />
  <strong>netclose()</strong><br />
  <strong>netclose</strong> <i>номер_сокета</i><br />
  <strong>netclose</strong> (<i>номер_сокета</i>)</p>
<p>  Завершает указанное сетевое соединение (сокет). Если <i>номер_сокета</i> не указан, сокет с номером ноль (0) будет закрыт.
  		</td>
</tr>
</table>
<table>
<tr>
<td align="center"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2010/11/new_concept.png" alt="" title="Новое понятие" width="80" height="80" class="aligncenter size-full wp-image-3467" /></td>
<td><strong>netwrite</strong> <i>строка</i><br />
  <strong>netwrite</strong> (<i>строка</i>)<br />
  <strong>netwrite</strong> <i>номер_сокета, строка</i><br />
  <strong>netwrite</strong> (<i>номер_сокета, строка</i>)</p>
<p>  Посылает текстовое сообщение в указанное сетевое соединение. Если <i>номер_сокета</i> не указан, используется нулевой (0) номер.
  		</td>
</tr>
</table>
<table>
<tr>
<td align="center"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2010/11/new_concept.png" alt="" title="Новое понятие" width="80" height="80" class="aligncenter size-full wp-image-3467" /></td>
<td><strong>netconnect</strong> <i>имя_сервера, номер_порта</i><br />
  <strong>netconnect</strong> (<i>имя_сервера, номер_порта</i>)<br />
  <strong>netconnect</strong> <i>номер_сокета, имя_сервера, номер_порта</i><br />
  <strong>netconnect</strong> (<i>номер_сокета, имя_сервера, номер_порта</i>)</p>
<p>  Открывает соединение с сервером со стороны клиента по указанному порту. В параметре <i>имя_сервера</i> указывается IP адрес или сетевое имя сервера. Если <i>номер_сокета</i> не указан, используется нулевой (0) номер.
  		</td>
</tr>
</table>
<table>
<tr>
<td align="center"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2010/11/new_concept.png" alt="" title="Новое понятие" width="80" height="80" class="aligncenter size-full wp-image-3467" /></td>
<td><strong>netread</strong><br />
  <strong>netread()</strong><br />
  <strong>netread</strong> <i>(номер_сокета)</i></p>
<p>  Читает данные из указанного сетевого соединения и возвращает в виде текстовой строки. Эта функция является блокирующей &mdash; она ждет, пока данные не будут получены. Если <i>номер_сокета</i> не указан, используется нулевой (0) номер.
  		</td>
</tr>
</table>
<h3>Сетевой чат</h3>
<p>Следующий пример использует еще одну сетевую функцию (<strong>netdata</strong>). Использование этой новой функции позволит нашему сетевому клиенту обрабатывать такие события, как нажатия клавиш и чтение сетевых данных только тогда, когда они действительно есть.</p>
<p>Программа сетевого чата (программа 108) комбинирует в себе и свойства сервера и свойства клиента. Если при запуске программы она не сможет соединиться с сервером, это событие будет перехвачено и, программа сама станет сервером. Это один из многих способов дать возможность одной программе выполнять как клиентскую, так и серверную роли.<br />
<code><br />
 &nbsp;1 # chat.kbs чат<br />
 &nbsp;2 # использует порт 9999 когда работает сервером<br />
 &nbsp;3<br />
 &nbsp;4 input &quot;Адрес сервера чата (ввод для локальной машины)?&quot;, addr$<br />
 &nbsp;5 if addr$ = &quot;&quot; then addr$ = &quot;127.0.0.1&quot;<br />
 &nbsp;6 #<br />
 &nbsp;7 # Пробуем соединиться с сервером, если неудачно - становимся сервером сами<br />
 &nbsp;8 OnError startserver<br />
 &nbsp;9 NetConnect addr$, 9999<br />
 10 OffError<br />
 11 print &quot;Соединение с сервером установлено&quot;<br />
 12<br />
 13 chatloop:<br />
 14 while true<br />
 15 &nbsp;&nbsp;&nbsp;&nbsp;# получаем код нажатой клавиши и отсылаем его<br />
 16 &nbsp;&nbsp;&nbsp;&nbsp;k = key<br />
 17 &nbsp;&nbsp;&nbsp;&nbsp;if k &lt;&gt; 0 then<br />
 18 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gosub show<br />
 19 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;netwrite string(k)<br />
 20 &nbsp;&nbsp;&nbsp;&nbsp;end if<br />
 21 &nbsp;&nbsp;&nbsp;&nbsp;# получаем данные из сети и показываем их<br />
 22 &nbsp;&nbsp;&nbsp;&nbsp;if NetData() then<br />
 23 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k = int(NetRead())<br />
 24 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gosub show<br />
 25 &nbsp;&nbsp;&nbsp;&nbsp;end if<br />
 26 &nbsp;&nbsp;&nbsp;&nbsp;pause .01<br />
 27 end while<br />
 28 end<br />
 29<br />
 30 show:<br />
 31 if k=16777220 then<br />
 32 &nbsp;&nbsp;&nbsp;&nbsp;print<br />
 33 else<br />
 34 &nbsp;&nbsp;&nbsp;&nbsp;print chr(k);<br />
 35 end if<br />
 36 return<br />
 37<br />
 38 startserver:<br />
 39 OffError<br />
 40 print &quot;Сервер запущен, ждем чат-клиента&quot;<br />
 41 NetListen 9999<br />
 42 print &quot;Клиент установил соединение&quot;<br />
 43 goto chatloop<br />
 44 return<br />
</code><br />
Программа 108 Сетевой чат</p>
<p>Запустите две копии BASIC-256 с программой 108 Сетевой чат. На первой запущенной копии заработает сервер, а на второй клиент. На клиенте напишите «Привет сервер!», а на сервере напишите в ответ «Привет клиент!». Вывод программы для сервера и для клиента приведены ниже.</p>
<p><code><br />
Адрес сервера чата (ввод для локальной машины)?<br />
Сервер запущен, ждем чат-клиента<br />
Клиент установил соединение<br />
ПРИВЕТ СЕРВЕР !<br />
ПРИВЕТ КЛИЕНТ !<br />
</code><br />
Пример вывода программы 108.1 Сетевой чат со стороны сервера<br />
<code><br />
Адрес сервера чата (ввод для локальной машины)?<br />
Соединение с сервером установлено<br />
ПРИВЕТ СЕРВЕР !<br />
ПРИВЕТ КЛИЕНТ !<br />
</code><br />
Пример вывода программы 108.2 Сетевой чат со стороны клиента.</p>
<table>
<tr>
<td align="center"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2010/11/new_concept.png" alt="" title="Новое понятие" width="80" height="80" class="aligncenter size-full wp-image-3467" /></td>
<td><strong>netdata</strong><br />
  <strong>netdata()</strong></p>
<p>  Возвращает истину (<strong>true</strong>), если есть сетевые данные ожидающие чтения. Это позволяет программе продолжать работать без ожидания прибытия сетевого пакета.
  		</td>
</tr>
</table>
<table>
<tr>
<td align="center"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2010/11/big_program.png" alt="" title="Большая программа" width="80" height="80" class="aligncenter size-full wp-image-3493" />
                </td>
<td> Большая программа этой главы создает сетевую аркадную игру в танки для двух игроков. </p>
<p>У каждого из игроков на экране имеется белый танк (свой) и черный танк (чужой). Используя стрелки можно управлять движением танка. Стреляем пробелом.
                </td>
</tr>
</table>
<p><code><br />
 &nbsp;1 # battle.kbs танковое сражение<br />
 &nbsp;2 # используем порт 9998 когда сервер<br />
 &nbsp;3<br />
 &nbsp;4 kspace = 32<br />
 &nbsp;5 kleft = 16777234<br />
 &nbsp;6 kright = 16777236<br />
 &nbsp;7 kup = 16777235<br />
 &nbsp;8 kdown = 16777237<br />
 &nbsp;9 dr = pi / 16    # смена направление<br />
 10 dxy = 2.5       # скорость передвижения<br />
 11 scale = 20      # размер танка<br />
 12 shotscale = 4   # размер снаряда<br />
 13 shotdxy = 5     # скорость снаряда<br />
 14 port = 9998     # номер порта для связи с сервером<br />
 15<br />
 16 dim tank(30)<br />
 17 tank = {-1,-.66, -.66,-.66, -.66,-.33, -.33, -.33, 0,-1, .33,-.33, .66,-.33, .66,-.66, 1,-.66, 1,1, .66,1, .66,.66, -.66,.66, -.66,1, -1,1}<br />
 18 dim shot(14)<br />
 19 shot = {0,-1, .5,-.5, .25,0, .5,.75, -.25,.75, -.25,0, -.5,-.5}<br />
 20<br />
 21 print &quot;Танковое сражение - вы на белом танке.&quot;<br />
 22 print &quot;Ваша задача поразить выстрелом черный&quot;<br />
 23 print &quot;танк. Используйте стрелки для перемещения&quot;<br />
 24 print &quot;и пробел для стрельбы.&quot;<br />
 25 print<br />
 26 input &quot;Адрес сервера (ввод для локальной машины)?&quot;, addr$<br />
 27 if addr$ = &quot;&quot; then addr$ = &quot;127.0.0.1&quot;<br />
 28<br />
 29 # Пробуем соединиться с сервером, если неудачно - становимся сервером сами<br />
 30 OnError startserver<br />
 31 NetConnect addr$, port<br />
 32 OffError<br />
 33 print &quot;Соединение с сервером установлено&quot;<br />
 34<br />
 35 playgame:<br />
 36<br />
 37 myx = 100<br />
 38 myy = 100<br />
 39 myr = 0<br />
 40 # Позиция снаряда (для себя): направление и оставшееся расстояние<br />
 41 # (снарядов нет, если mypl=0)<br />
 42 mypx = 0<br />
 43 mypy = 0<br />
 44 mypr = 0<br />
 45 mypl = 0<br />
 46 yourx = 200<br />
 47 youry = 200<br />
 48 yourr = pi<br />
 49 # Позиция снаряда (для противника): направление и оставшееся расстояние<br />
 50 # (снарядов нет, если yourpl=0)<br />
 51 yourpx = 0<br />
 52 yourpy = 0<br />
 53 yourpr = 0<br />
 54 yourpl = 0<br />
 55 gosub writeposition<br />
 56<br />
 57 fastgraphics<br />
 58 while true<br />
 59 &nbsp;&nbsp;&nbsp;&nbsp;# Получаем значение нажатой клавиши и перемещаем танк на экране<br />
 60 &nbsp;&nbsp;&nbsp;&nbsp;k = key<br />
 61 &nbsp;&nbsp;&nbsp;&nbsp;if k &lt;&gt; 0 then<br />
 62 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if k = kup then<br />
 63 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myx = myx + sin(myr) * dxy<br />
 64 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myy = myy - cos(myr) * dxy<br />
 65 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end if<br />
 66 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if k = kdown then<br />
 67 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myx = myx - sin(myr) * dxy<br />
 68 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myy = myy + cos(myr) * dxy<br />
 69 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end if<br />
 70 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if k = kspace then<br />
 71 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mypr = myr<br />
 72 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mypx = myx + sin(mypr) * scale<br />
 73 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mypy = myy - cos(mypr) * scale<br />
 74 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mypl = 100<br />
 75 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end if<br />
 76 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if myx &lt; scale then myx = graphwidth - scale<br />
 77 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if myx &gt; graphwidth-scale then myx = scale<br />
 78 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if myy &lt; scale then myy = graphheight - scale<br />
 79 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if myy &gt; graphheight-scale then myy = scale<br />
 80 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if k = kleft then myr = myr - dr<br />
 81 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if k = kright then myr = myr + dr<br />
 82 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gosub writeposition<br />
 83 &nbsp;&nbsp;&nbsp;&nbsp;end if<br />
 84 &nbsp;&nbsp;&nbsp;&nbsp;# перемещаем свой снаряд (если есть снаряды)<br />
 85 &nbsp;&nbsp;&nbsp;&nbsp;if mypl &gt; 0 then<br />
 86 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mypx = mypx + sin(mypr) * shotdxy<br />
 87 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mypy = mypy - cos(mypr) * shotdxy<br />
 88 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if mypx &lt; shotscale then mypx = graphwidth - shotscale<br />
 89 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if mypx &gt; graphwidth-shotscale then mypx = shotscale<br />
 90 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if mypy &lt; shotscale then mypy = graphheight - shotscale<br />
 91 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if mypy &gt; graphheight-shotscale then mypy = shotscale<br />
 92 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (mypx-yourx)^2 + (mypy-youry)^2 &lt; scale^2 then<br />
 93 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NetWrite &quot;!&quot;<br />
 94 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print &quot;Противник убит, Игра закончена.&quot;<br />
 95 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br />
 96 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end if<br />
 97 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mypl = mypl - 1<br />
 98 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gosub writeposition<br />
 99 &nbsp;&nbsp;&nbsp;&nbsp;end if<br />
100 &nbsp;&nbsp;&nbsp;&nbsp;# Получаем из сети позицию<br />
101 &nbsp;&nbsp;&nbsp;&nbsp;gosub getposition<br />
102 &nbsp;&nbsp;&nbsp;&nbsp;#<br />
103 &nbsp;&nbsp;&nbsp;&nbsp;gosub draw<br />
104 &nbsp;&nbsp;&nbsp;&nbsp;#<br />
105 &nbsp;&nbsp;&nbsp;&nbsp;pause .1<br />
106 end while<br />
107<br />
108 writeposition: ###<br />
109 # 10 символов для x, 10 символов для y, 10 символов для r (поворот)<br />
110 position$ =  left(myx + &quot;          &quot;,10)+left(myy + &quot;          &quot;,10)+left(myr + &quot;          &quot;,10)+left(mypx + &quot;          &quot;,10)+left(mypy + &quot;          &quot;,10)+left(mypr + &quot;          &quot;,10)+left(mypl + &quot;          &quot;,10)<br />
111 NetWrite position$<br />
112 return<br />
113<br />
114 getposition: ###<br />
115 # Получаем из сети позицию и устанавливаем переменные для противника<br />
116 while NetData()<br />
117 &nbsp;&nbsp;&nbsp;&nbsp;position$ = NetRead()<br />
118 &nbsp;&nbsp;&nbsp;&nbsp;if position$ = &quot;!&quot; then<br />
119 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print &quot;Вы убиты. Игра окончена.&quot;<br />
120 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br />
121 &nbsp;&nbsp;&nbsp;&nbsp;end if<br />
122 &nbsp;&nbsp;&nbsp;&nbsp;yourx = 300 - float(mid(position$,1,10))<br />
123 &nbsp;&nbsp;&nbsp;&nbsp;youry = 300 - float(mid(position$,11,10))<br />
124 &nbsp;&nbsp;&nbsp;&nbsp;yourr = pi + float(mid(position$,21,10))<br />
125 &nbsp;&nbsp;&nbsp;&nbsp;yourpx = 300 - float(mid(position$,31,10))<br />
126 &nbsp;&nbsp;&nbsp;&nbsp;yourpy = 300 - float(mid(position$,41,10))<br />
127 &nbsp;&nbsp;&nbsp;&nbsp;yourpr = pi + float(mid(position$,51,10))<br />
128 &nbsp;&nbsp;&nbsp;&nbsp;yourpl = pi + float(mid(position$,61,10))<br />
129 end while<br />
130 return<br />
131<br />
132 draw: ###<br />
133 clg<br />
134 color green<br />
135 rect 0,0,graphwidth,graphheight<br />
136 color white<br />
137 stamp myx, myy, scale, myr, tank<br />
138 if mypl &gt; 0 then<br />
139 &nbsp;&nbsp;&nbsp;&nbsp;stamp mypx, mypy, shotscale, mypr, shot<br />
140 end if<br />
141 color black<br />
142 stamp yourx, youry, scale, yourr, tank<br />
143 if yourpl &gt; 0 then<br />
144 &nbsp;&nbsp;&nbsp;&nbsp;color red<br />
145 &nbsp;&nbsp;&nbsp;&nbsp;stamp yourpx, yourpy, shotscale, yourpr, shot<br />
146 end if<br />
147 refresh<br />
148 return<br />
149<br />
150 startserver:<br />
151 OffError<br />
152 print &quot;Сервер запущен, ожидаем присоединения клиента&quot;<br />
153 NetListen port<br />
154 print &quot;Клиент соединился с сервером&quot;<br />
155 goto playgame<br />
156 return<br />
</code><br />
Программа 109 Танковое сражение по сети<a NAME="m1" HREF="#ref1"><sup>1</sup></a></p>
<p><img src="http://freeschool.altlinux.ru/wp-content/uploads/2011/02/chapter20-p109.png" alt="" title="chapter20-p109" width="300" height="300" class="aligncenter size-full wp-image-4065" /><br />
Пример графического экрана программы 109 Танковое сражение по сети.</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
 <a NAME="ref1" HREF="#m1">1</a>Программа нуждается в доработке: а) Выстрел в сторону может попасть в противника, т.&nbsp;к. поле рассматривается как сферическое, при этом снаряд может пройти и через ваш танк, не причинив ему вреда, что довольно странно б) Если первый выстрел еще не долетел, а вы выстрелили вновь &mdash; первый выстрел пропадет (<i>прим. редактора</i>).</p>
<p>============================<br />
<a name="basic"></a><br />
<h3>Где скачать BASIC-256:</h3>
<p><strong>Для дистрибутивов ALT Linux</strong></p>
<ul>
<li>ветка 4.0 <a href="http://ftp.altlinux.org/pub/distributions/ALTLinux/4.0/branch/files/i586/RPMS/basic256-0.9.6-alt5.M40.1.i586.rpm">basic256-0.9.6-alt5.M40.1.i586.rpm</a></li>
<li>ветка 4.1 <a href="http://ftp.altlinux.org/pub/distributions/ALTLinux/4.1/branch/files/i586/RPMS/basic256-0.9.6-alt5.M41.1.i586.rpm">basic256-0.9.6-alt5.M41.1.i586.rpm</a></li>
<li>ветка p5 <a href="http://ftp.altlinux.org/pub/distributions/ALTLinux/p5/branch/files/i586/RPMS/basic256-0.9.6-alt5.M50P.1.i586.rpm">basic256-0.9.6-alt5.M50P.1.i586.rpm</a></li>
<li>ветка 5.1 <a href="http://ftp.altlinux.org/pub/distributions/ALTLinux/5.1/branch/files/i586/RPMS/basic256-0.9.6-alt5.M51.1.i586.rpm">basic256-0.9.6-alt5.M51.1.i586.rpm</a></li>
</ul>
<p><strong>Windows версия</strong><br />
<a href="http://basic256.org">http://basic256.org</a> (<a href="http://www.sourceforge.net/projects/kidbasic">http://www.sourceforge.net/projects/kidbasic</a>)</p>
<h3> Как установить BASIC-256 в Linux</h3>
<p><strong>Для Альт Линукс:</strong> настроить репозиторий и обновить/установить пакет через synaptic или apt<br />
<strong>Для rpm-based дистрибутивов:</strong> rpm -Uvh &lt;имя_пакета&gt;.rpm<br />
</ljcut></p>
]]></content:encoded>
			<wfw:commentRss>http://freeschool.altlinux.ru/?feed=rss2&#038;p=4062</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>BASIC-256. Глава 19</title>
		<link>http://freeschool.altlinux.ru/?p=4054</link>
		<comments>http://freeschool.altlinux.ru/?p=4054#comments</comments>
		<pubDate>Fri, 11 Mar 2011 00:00:50 +0000</pubDate>
		<dc:creator><![CDATA[Владимир Черный]]></dc:creator>
				<category><![CDATA[Методические материалы]]></category>
		<category><![CDATA[BASIC-256]]></category>
		<category><![CDATA[Ирюпин]]></category>
		<category><![CDATA[Черный]]></category>

		<guid isPermaLink="false">http://freeschool.altlinux.ru/?p=4054</guid>
		<description><![CDATA[Продолжаем публиковать перевод книги Джеймса Рено. Эту главу перевел Владимир Черный. Оглавление: Глава 1: Знакомство с BASIC-256 – cкажи «Привет» Глава 2: Рисуем основные фигуры Глава 3: Звуки и музыка Глава 4: Мыслить как программист Глава 5: Программа задает вам вопросы Глава 6: Сравнения, сравнения, сравнения Глава 7: Циклы и счетчики — повторяем снова и [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Продолжаем публиковать перевод <a href="http://basicbook.org/download">книги Джеймса Рено</a>. Эту главу перевел Владимир Черный.<br />
Оглавление:</p>
<ul>
<li><a href="http://freeschool.altlinux.ru/?p=3401">Глава 1: Знакомство с BASIC-256 – cкажи «Привет»</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3461">Глава 2: Рисуем основные фигуры</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3504">Глава 3: Звуки и музыка</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3569#g4">Глава 4: Мыслить как программист</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3569#g5">Глава 5: Программа задает вам вопросы</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3643">Глава 6: Сравнения, сравнения, сравнения</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3689">Глава 7: Циклы и счетчики — повторяем снова и снова</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3719">Глава 8: Графика на заказ — создание фигур своими руками</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3755">Глава 9: Подпрограммы — повторное использование кода</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3805">Глава 10: Управляем мышкой, перемещаем объекты</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3842">Глава 11: Использование клавиатуры для управления программой</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3867">Глава 12: Картинки, музыка и спрайты</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3906">Глава 13 Массивы — коллекции данных</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3930">Глава 14 Математика &mdash; развлечемся с числами</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3988">Глава 15 Работаем со строками</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3992">Глава 16 Файлы. Сохраним информацию на будущее</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=4015">Глава 17 Стеки, очереди, списки и сортировка</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=4048">Глава 18 Ловушки для ошибок времени исполнения</a></li>
</ul>
<p><a href="#basic">Где взять BASIC-256</a><br />
<span id="more-4054"></span><br />
<ljcut></p>
<h2>Глава 19 Программирование баз данных</h2>
<p>В этой главе вы увидите, как BASIC-256 может установить соединение с простой реляционной базой данных для хранения в ней и получения из нее полезных данных.</p>
<h3>Что такое база данных</h3>
<p>База данных, говоря упрощенно, &mdash; это организованная коллекция чисел, строк и информации другого типа. Наиболее известны базы данных реляционного типа. Реляционные базы данных состоят из четырех главных составляющих: таблиц, строк, колонок и отношений между ними (связей, см табл 8).</p>
<table border="1">
<tr>
<td> Таблица </td>
<td> Таблица состоит из заранее определенного числа колонок и любого количества строк содержащих информацию об объектах или субъектах. Таблицу также называют отношением. </td>
</tr>
<tr>
<td> Строка </td>
<td> Также называемая кортеж </td>
</tr>
<tr>
<td> Колонка </td>
<td> Также называют атрибут </td>
</tr>
<tr>
<td> Связи </td>
<td> Ссылка ключевого столбца одной таблицы на колонку другой таблицы, создающее взаимосвязь таблиц. </td>
</tr>
</table>
<p>Таблица 8 Главные компоненты реляционной базы данных.</p>
<h3>Язык SQL</h3>
<p>Большинство реляционных баз данных сегодня используют язык, называемый SQL для выбора и управления данными. SQL это акроним от Structured Query Language — Структурированный язык запросов. Первый SQL язык был разработан IBM в 1970 году и стал главным языком используемым в реляционных базах.</p>
<p>SQL достаточно мощный язык и был реализован многими компаниями за все годы с момента появления. В результате такого многообразия появилось и используется множество различных диалектов языка SQL. BASIC-256 использует SQLite в качестве системы управления базой данных. Пожалуйста ознакомьтесь с диалектом этого SQL языка на веб-странице SQLite: <a href="http://www.sqlite.org/">http://www.sqlite.org</a>, поскольку данный диалект используется в приведенных ниже примерах.</p>
<h3>Создание базы и добавление данных в нее</h3>
<p>SQLite база данных не требует установки сервера или создания какой-то сложной системы. База данных и все ее части хранятся в простом файле на вашем компьютере. Этот файл можно скопировать на другой компьютер и использовать там без проблем. Первая программа (программа 102. Создаем базу данных) создает новый файл базы данных и таблицы. Таблицы представлены на ER-диаграмме (см. рис.34)</p>
<p><img src="http://freeschool.altlinux.ru/wp-content/uploads/2011/02/chapter19-img34.png" alt="" title="chapter19-img34" width="378" height="331" class="aligncenter size-full wp-image-4056" /><br />
Рисунок 34 ER-диаграмма базы данных</p>
<p><code><br />
 &nbsp;1 # chapter 19 dbcreate.kbs<br />
 &nbsp;2 # Удаляем прежний файл базы данных и создаем базу с двумя таблицами<br />
 &nbsp;3 errors = 0<br />
 &nbsp;4 file$ = &quot;pets.sqlite3&quot;<br />
 &nbsp;5 if exists(file$) then kill(file$)<br />
 &nbsp;6 dbopen file$<br />
 &nbsp;7<br />
 &nbsp;8 stmt$ = &quot;CREATE TABLE owner (owner_id INTEGER, ownername TEXT, phonenumber TEXT, PRIMARY KEY (owner_id));&quot;<br />
 &nbsp;9 gosub execute<br />
 10<br />
 11 stmt$ =  &quot;CREATE TABLE pet (pet_id INTEGER, owner_id INTEGER, petname TEXT, type TEXT, PRIMARY KEY (pet_id), FOREIGN KEY (owner_id) REFERENCES owner (owner_id));&quot;<br />
 12 gosub execute<br />
 13<br />
 14 # Закрываем все.<br />
 15 dbclose<br />
 16 print file$ + &quot; создан. &quot; + errors + &quot; ошибок.&quot;<br />
 17 end<br />
 18<br />
 19 execute:<br />
 20 print stmt$<br />
 21 onerror executeerror<br />
 22 dbexecute stmt$<br />
 23 offerror<br />
 24 return<br />
 25<br />
 26 executeerror:<br />
 27 errors = errors + 1<br />
 28 print &quot;ERROR: &quot; + lasterror + &quot; &quot; + lasterrormessage + &quot; &quot; + lasterrorextra<br />
 29 return<br />
</code><br />
Программа 102 Создаем базу данных</p>
<p><code><br />
CREATE TABLE owner (owner_id INTEGER, ownername TEXT, phonenumber TEXT, PRIMARY KEY (owner_id));<br />
CREATE TABLE pet (pet_id INTEGER, owner_id INTEGER, petname TEXT, type TEXT, PRIMARY KEY (pet_id), FOREIGN KEY (owner_id) REFERENCES owner (owner_id));<br />
pets.sqlite3 создан. 0 ошибок.<br />
</code><br />
Пример вывода программы 102 Создаем базу данных</p>
<p>В приведенной выше программе вы видели три новых функции для работы с базами данных: <strong>dbopen</strong> – открывает файл базы данных или создает новый, если файл не существует, <strong>dbexecute </strong>– выполняет SQL команду на открытой базе данных, и <strong>dbclose</strong> – закрывает открытый файл базы данных.</p>
<table>
<tr>
<td align="center"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2010/11/new_concept.png" alt="" title="Новое понятие" width="80" height="80" class="aligncenter size-full wp-image-3467" /></td>
<td><strong>dbopen</strong> <i>имя_файла</i></p>
<p>  Открывает файл SQLite базы данных. Если база не существует, создается пустой файл базы данных.
  </td>
</tr>
</table>
<table>
<tr>
<td align="center"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2010/11/new_concept.png" alt="" title="Новое понятие" width="80" height="80" class="aligncenter size-full wp-image-3467" /></td>
<td><strong>dbexecute</strong> <i>sql-запрос</i></p>
<p>  Выполняет <i>sql-запрос </i>на текущей открытой базе данных. Эта функция не возвращает данных, но возможно перехватить ошибку, если таковая возникнет в процессе выполнения запроса.
  </td>
</tr>
</table>
<table>
<tr>
<td align="center"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2010/11/new_concept.png" alt="" title="Новое понятие" width="80" height="80" class="aligncenter size-full wp-image-3467" /></td>
<td><strong>dbclose </strong></p>
<p>  Закрывает текущий открытый файл SQLite базы данных. Эта функция гарантирует, что все данные будут записаны в файл базы.
  </td>
</tr>
</table>
<p>Эти же три функции можно использовать и для выполнения других SQL запросов к базе. Например, вставка новых строк в таблицы (см программу 103) с помощью INSERT INTO и обновление имеющихся строк таблицы с помощью SQLзапроса UPDATE (см. программу 104).<br />
<code><br />
 &nbsp;1 # chapter19 dbinsert.kbs<br />
 &nbsp;2 # add rows to the database<br />
 &nbsp;3<br />
 &nbsp;4 file$ = &quot;pets.sqlite3&quot;<br />
 &nbsp;5 dbopen file$<br />
 &nbsp;6<br />
 &nbsp;7 owner_id = 0<br />
 &nbsp;8 pet_id = 0<br />
 &nbsp;9<br />
 10 ownername$ = &quot;Джим&quot;: phonenumber$ = &quot;555-3434&quot;<br />
 11 gosub addowner<br />
 12 petname$ = &quot;Пятнышко&quot;: type$ = &quot;Кот&quot;<br />
 13 gosub addpet<br />
 14 petname$ = &quot;Фред&quot;: type$ = &quot;Кот&quot;<br />
 15 gosub addpet<br />
 16 petname$ = &quot;Элвис&quot;: type$ = &quot;Кот&quot;<br />
 17 gosub addpet<br />
 18<br />
 19 ownername$ = &quot;Сью&quot;: phonenumber$ = &quot;555-8764&quot;<br />
 20 gosub addowner<br />
 21 petname$ = &quot;Альфред&quot;: type$ = &quot;Кот&quot;<br />
 22 gosub addpet<br />
 23 petname$ = &quot;Фидо&quot;: type$ = &quot;Собака&quot;<br />
 24 gosub addpet<br />
 25<br />
 26 ownername$ = &quot;Эми&quot;: phonenumber$ = &quot;555-9932&quot;<br />
 27 gosub addowner<br />
 28 petname$ = &quot;Домино&quot;: type$ = &quot;Собака&quot;<br />
 29 gosub addpet<br />
 30<br />
 31 ownername$ = &quot;Ди&quot;: phonenumber$ = &quot;555-4433&quot;<br />
 32 gosub addowner<br />
 33 petname$ = &quot;Сэм&quot;: type$ = &quot;Козел&quot;<br />
 34 gosub addpet<br />
 35<br />
 36 # закрываем все<br />
 37 dbclose<br />
 38 end<br />
 39<br />
 40 addowner:<br />
 41 owner_id = owner_id + 1<br />
 42 stmt$ = &quot;INSERT INTO owner (owner_id, ownername, phonenumber) VALUES (&quot; + owner_id + &quot;,&quot; + chr(34) + ownername$ + chr(34) + &quot;,&quot; + chr(34) + phonenumbe    r$ + chr(34) + &quot;);&quot;<br />
 43 print stmt$<br />
 44 onerror adderror<br />
 45 dbexecute stmt$<br />
 46 offerror<br />
 47 return<br />
 48<br />
 49 addpet:<br />
 50 pet_id = pet_id + 1<br />
 51 stmt$ = &quot;INSERT INTO pet (pet_id, owner_id, petname, type) VALUES (&quot; + pet_id + &quot;,&quot; + owner_id + &quot;,&quot; + chr(34) + petname$ + chr(34) + &quot;,&quot; + chr(34) +     type$ + chr(34) + &quot;);&quot;<br />
 52 print stmt$<br />
 53 onerror adderror<br />
 54 dbexecute stmt$<br />
 55 offerror<br />
 56 return<br />
 57<br />
 58 adderror:<br />
 59 print &quot;ERROR: &quot; + lasterror + &quot; &quot; + lasterrormessage + &quot; &quot; + lasterrorextra<br />
 60 return<br />
</code><br />
Программа 103 Вставка строк в базу данных<br />
<code><br />
INSERT INTO owner (owner_id, ownername, phonenumber) VALUES (1,"Джим","555-3434");<br />
INSERT INTO pet (pet_id, owner_id, petname, type) VALUES (1,1,"Пятнышко","Кот");<br />
INSERT INTO pet (pet_id, owner_id, petname, type) VALUES (2,1,"Фред","Кот");<br />
INSERT INTO pet (pet_id, owner_id, petname, type) VALUES (3,1,"Элвис","Кот");<br />
INSERT INTO owner (owner_id, ownername, phonenumber) VALUES (2,"Сью","555-8764");<br />
INSERT INTO pet (pet_id, owner_id, petname, type) VALUES (4,2,"Альфред","Кот");<br />
INSERT INTO pet (pet_id, owner_id, petname, type) VALUES (5,2,"Фидо","Собака");<br />
INSERT INTO owner (owner_id, ownername, phonenumber) VALUES (3,"Эми","555-9932");<br />
INSERT INTO pet (pet_id, owner_id, petname, type) VALUES (6,3,"Домино","Собака");<br />
INSERT INTO owner (owner_id, ownername, phonenumber) VALUES (4,"Ди","555-4433");<br />
INSERT INTO pet (pet_id, owner_id, petname, type) VALUES (7,4,"Сэм","Козел");<br />
</code></p>
<p>Пример вывода программы 103 Вставка строк в базу данных<br />
<code><br />
 &nbsp;1 # chapter 19 dbupdate.kbs<br />
 &nbsp;2 # Обновление данных<br />
 &nbsp;3<br />
 &nbsp;4 dbopen &quot;pets.sqlite3&quot;<br />
 &nbsp;5<br />
 &nbsp;6 # create and populate<br />
 &nbsp;7 s$ = &quot;UPDATE owner SET phonenumber = &quot; + chr(34) + &quot;555-5555&quot; + chr(34) + &quot; where owner_id = 1;&quot;<br />
 &nbsp;8 print s$<br />
 &nbsp;9 dbexecute s$<br />
 10 dbclose<br />
</code><br />
Программа 104 Обновление данных строки</p>
<p><code><br />
UPDATE owner SET phonenumber = &quot;555-5555&quot; where owner_id = 1;<br />
</code><br />
Пример вывода программы 104 Обновление данных строки</p>
<h3>Получение информации из базы данных</h3>
<p>Итак, мы умеем открывать и закрывать файл базы данных, а также исполнять SQL-запрос, который не возвращает данных. База данных, из которой нельзя получить информацию достаточно бесполезна.</p>
<p>Оператор SELECT (выбор) языка SQL позволяет нам получать необходимые данные. После выполнения SQL-запроса содержащего оператор SELECT создается набор записей, содержащих информацию из строк и столбцов таблиц базы данных. Программа 105 демонстрирует три различных запроса на выборку данных и как BASIC-256 программа может их использовать.<br />
<code><br />
 &nbsp;1 # chapter 19 dbselect.kbs<br />
 &nbsp;2 # Get data from the pets database<br />
 &nbsp;3<br />
 &nbsp;4 dbopen &quot;pets.sqlite3&quot;<br />
 &nbsp;5<br />
 &nbsp;6 # Показываем владельцев и номера их телефонов<br />
 &nbsp;7 print &quot;Владельцы и номера телефонов&quot;<br />
 &nbsp;8 dbopenset &quot;SELECT ownername, phonenumber FROM owner ORDER BY ownername;&quot;<br />
 &nbsp;9 while dbrow()<br />
 10 &nbsp;&nbsp;&nbsp;&nbsp;print dbstring(0) + &quot; &quot; + dbstring(1)<br />
 11 end while<br />
 12 dbcloseset<br />
 13<br />
 14 print<br />
 15<br />
 16 # Показываем вадельцев и их питомцев<br />
 17 print &quot;Владельцы и питомцы&quot;<br />
 18 dbopenset &quot;SELECT owner.ownername, pet.pet_id, pet.petname, pet.type FROM owner JOIN pet ON pet.owner_id = owner.owner_id ORDER BY ownername, petname;&quot;<br />
 19 while dbrow()<br />
 20 &nbsp;&nbsp;&nbsp;&nbsp;print dbstring(0) + &quot; &quot; + dbint(1) + &quot; &quot; + dbstring(2) + &quot; &quot; + dbstring(3)<br />
 21 end while<br />
 22 dbcloseset<br />
 23<br />
 24 print<br />
 25<br />
 26 # Показываем среднее значение количества питомцев<br />
 27 print &quot;Среднее количество питомцев&quot;<br />
 28 dbopenset &quot;SELECT AVG(c) FROM (SELECT COUNT(*) AS c FROM owner JOIN pet ON pet.owner_id = owner.owner_id GROUP BY owner.owner_id) AS numpets;&quot;<br />
 29 while dbrow()<br />
 30 &nbsp;&nbsp;&nbsp;&nbsp;print dbfloat(0)<br />
 31 end while<br />
 32 dbcloseset<br />
 33<br />
 34 # Закрываем все<br />
 35 dbclose<br />
</code></p>
<p>Программа 105 Получение данных из базы</p>
<p><code><br />
Владельцы и номера телефонов<br />
Джим 555-5555<br />
Ди 555-4433<br />
Сью 555-8764<br />
Эми 555-9932</p>
<p>Владельцы и питомцы<br />
Джим 1 Пятнышко Кот<br />
Джим 2 Фред Кот<br />
Джим 3 Элвис Кот<br />
Ди 7 Сэм Козел<br />
Сью 4 Альфред Кот<br />
Сью 5 Фидо Собака<br />
Эми 6 Домино Собака</p>
<p>Среднее количество питомцев<br />
1.75<br />
</code></p>
<p>Пример вывода программы 105 Получение данных из базы</p>
<table>
<tr>
<td align="center"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2010/11/new_concept.png" alt="" title="Новое понятие" width="80" height="80" class="aligncenter size-full wp-image-3467" /></td>
<td><strong>dbopenset</strong> <i>sql-запрос</i></p>
<p>  Выполняет запрос на выборку данных (SELECT) из базы данных создавая набор строк как результат, так что программно можно их читать. Результатом запроса может быть 0 или более строк в зависимости от запроса.
  </td>
</tr>
</table>
<table>
<tr>
<td align="center"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2010/11/new_concept.png" alt="" title="Новое понятие" width="80" height="80" class="aligncenter size-full wp-image-3467" /></td>
<td><strong>dbrow</strong><br /> <br />
  <strong>dbrow</strong>()</p>
<p>  Читает очередную строку из набора строк сформированного функцией <strong>dbopenset.</strong> Если строчки кончились, возвращает <strong>false</strong> (ложь)</p>
<p>  Для чтения первой строки из набора необходимо использовать <strong>dbrow</strong> сразу после <strong>dbopenset.</strong>
  </td>
</tr>
</table>
<table>
<tr>
<td align="center"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2010/11/new_concept.png" alt="" title="Новое понятие" width="80" height="80" class="aligncenter size-full wp-image-3467" /></td>
<td><strong>dbint</strong> (<i>колонка</i>)<br />
  <strong>dbfloat</strong> (<i>колонка</i>)<br />
  <strong>dbstring </strong> (<i>колонка</i>)</p>
<p>  Эти функции возвращают данные из текущей строки запроса. Необходимо знать цифровой номер (начинающийся с нуля) колонки с необходимыми данными.</p>
<table border="1">
<tr>
<td> <strong>dbint</strong> </td>
<td> Возвращает содержимое ячейки как целое </td>
</tr>
<tr>
<td> <strong>dbfloat</strong> </td>
<td> Возвращает содержимое ячейки как десятичную дробь </td>
</tr>
<tr>
<td> <strong>dbstring</strong> </td>
<td> Возвращает содержимое ячейки как строку. </td>
</tr>
</table>
</td>
</tr>
</table>
<table>
<tr>
<td align="center"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2010/11/new_concept.png" alt="" title="Новое понятие" width="80" height="80" class="aligncenter size-full wp-image-3467" /></td>
<td><strong>dbcloseset</strong></p>
<p>  Закрывает и сбрасывает результат предыдущего запроса функции <strong>dbopenset</strong>
  </td>
</tr>
</table>
<p>============================<br />
<a name="basic"></a><br />
<h3>Где скачать BASIC-256:</h3>
<p><strong>Для дистрибутивов ALT Linux</strong></p>
<ul>
<li>ветка 4.0 <a href="http://ftp.altlinux.org/pub/distributions/ALTLinux/4.0/branch/files/i586/RPMS/basic256-0.9.6-alt5.M40.1.i586.rpm">basic256-0.9.6-alt5.M40.1.i586.rpm</a></li>
<li>ветка 4.1 <a href="http://ftp.altlinux.org/pub/distributions/ALTLinux/4.1/branch/files/i586/RPMS/basic256-0.9.6-alt5.M41.1.i586.rpm">basic256-0.9.6-alt5.M41.1.i586.rpm</a></li>
<li>ветка p5 <a href="http://ftp.altlinux.org/pub/distributions/ALTLinux/p5/branch/files/i586/RPMS/basic256-0.9.6-alt5.M50P.1.i586.rpm">basic256-0.9.6-alt5.M50P.1.i586.rpm</a></li>
<li>ветка 5.1 <a href="http://ftp.altlinux.org/pub/distributions/ALTLinux/5.1/branch/files/i586/RPMS/basic256-0.9.6-alt5.M51.1.i586.rpm">basic256-0.9.6-alt5.M51.1.i586.rpm</a></li>
</ul>
<p><strong>Windows версия</strong><br />
<a href="http://basic256.org">http://basic256.org</a> (<a href="http://www.sourceforge.net/projects/kidbasic">http://www.sourceforge.net/projects/kidbasic</a>)</p>
<h3> Как установить BASIC-256 в Linux</h3>
<p><strong>Для Альт Линукс:</strong> настроить репозиторий и обновить/установить пакет через synaptic или apt<br />
<strong>Для rpm-based дистрибутивов:</strong> rpm -Uvh &lt;имя_пакета&gt;.rpm<br />
</ljcut></p>
]]></content:encoded>
			<wfw:commentRss>http://freeschool.altlinux.ru/?feed=rss2&#038;p=4054</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>BASIC-256. Глава 18</title>
		<link>http://freeschool.altlinux.ru/?p=4048</link>
		<comments>http://freeschool.altlinux.ru/?p=4048#comments</comments>
		<pubDate>Fri, 04 Mar 2011 00:00:19 +0000</pubDate>
		<dc:creator><![CDATA[Владимир Черный]]></dc:creator>
				<category><![CDATA[Методические материалы]]></category>
		<category><![CDATA[BASIC-256]]></category>
		<category><![CDATA[Ирюпин]]></category>
		<category><![CDATA[Черный]]></category>

		<guid isPermaLink="false">http://freeschool.altlinux.ru/?p=4048</guid>
		<description><![CDATA[Продолжаем публиковать перевод книги Джеймса Рено. Эту главу перевел Владимир Черный. Оглавление: Глава 1: Знакомство с BASIC-256 – cкажи «Привет» Глава 2: Рисуем основные фигуры Глава 3: Звуки и музыка Глава 4: Мыслить как программист Глава 5: Программа задает вам вопросы Глава 6: Сравнения, сравнения, сравнения Глава 7: Циклы и счетчики — повторяем снова и [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Продолжаем публиковать перевод <a href="http://basicbook.org/download">книги Джеймса Рено</a>. Эту главу перевел Владимир Черный.<br />
Оглавление:</p>
<ul>
<li><a href="http://freeschool.altlinux.ru/?p=3401">Глава 1: Знакомство с BASIC-256 – cкажи «Привет»</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3461">Глава 2: Рисуем основные фигуры</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3504">Глава 3: Звуки и музыка</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3569#g4">Глава 4: Мыслить как программист</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3569#g5">Глава 5: Программа задает вам вопросы</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3643">Глава 6: Сравнения, сравнения, сравнения</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3689">Глава 7: Циклы и счетчики — повторяем снова и снова</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3719">Глава 8: Графика на заказ — создание фигур своими руками</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3755">Глава 9: Подпрограммы — повторное использование кода</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3805">Глава 10: Управляем мышкой, перемещаем объекты</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3842">Глава 11: Использование клавиатуры для управления программой</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3867">Глава 12: Картинки, музыка и спрайты</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3906">Глава 13 Массивы — коллекции данных</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3930">Глава 14 Математика &mdash; развлечемся с числами</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3988">Глава 15 Работаем со строками</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3992">Глава 16 Файлы. Сохраним информацию на будущее</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=4015">Глава 17 Стеки, очереди, списки и сортировка</a></li>
</ul>
<p><a href="#basic">Где взять BASIC-256</a><br />
<span id="more-4048"></span><br />
<ljcut></p>
<h2>Глава 18 Ловушки для ошибок времени исполнения</h2>
<p>Если вы работали над примерами и создавали свои программы, то видели ошибки, случающиеся, когда программа выполняется. Такие ошибки называются «ошибки времени исполнения» (по английски: «runtime errors»). BASIC-256 включает группу специальных команд, которые позволяют запрограммировать восстановление после ошибки или их обработку.</p>
<p>Перехват ошибок, даже если вы об этом не думаете, может вызвать проблемы. Его следует использовать только если это нужно и отключать такие ловушки, когда в этом нет необходимости.</p>
<h3>Перехват ошибок</h3>
<p>Когда режим перехвата ошибок включен с помощью оператора <strong>onerror</strong>, программа переходит на указанную подпрограмму в момент возникновения ошибки. Если мы посмотрим в программу 99, то увидим, что подпрограмма обработки ошибки вызывается в момент, когда программа пытается прочитать значение переменной z (неопределенная переменная). Если закомментировать первую строку этой программы и попробовать ее запустить, она просто завершится, когда произойдет ошибка.<br />
<code><br />
 1 onerror errortrap<br />
 2<br />
 3 print &quot;z = &quot; + z<br />
 4 print &quot;все еще работает после ошибки&quot;<br />
 5 end<br />
 6<br />
 7 errortrap:<br />
 8 print &quot;Я поймал ошибку!&quot;<br />
 9 return<br />
</code><br />
Программа 99 Простой пример перехвата ошибок.<br />
<code><br />
Я поймал ошибку!<br />
z = 0<br />
все еще работает после ошибки<br />
</code><br />
Пример вывода программы 99 Простой пример перехвата ошибок.</p>
<table>
<tr>
<td align="center"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2010/11/new_concept.png" alt="" title="Новое понятие" width="80" height="80" class="aligncenter size-full wp-image-3467" /></td>
<td><strong>onerror</strong> метка</p>
<p>  Создает ловушку для ошибки, программа автоматически переходит к подпрограмме, определенной меткой, когда произойдет ошибка.
  </td>
</tr>
</table>
<h3>Какая ошибка произошла?</h3>
<p>Иногда знание того, что произошла ошибка не достаточно. Есть функции, которые возвращают номер ошибки (<strong>lasterror</strong>), строку программы, где произошла ошибка (<strong>lasterrorline</strong>), текстовое сообщение, поясняющее суть ошибки (<strong>lasterrormessage</strong>) и дополнительные сообщения об ошибке (<strong>lasterrorextra</strong>).</p>
<p>Программа 100 модифицирует предыдущую программу и печатает деталировку произошедшей ошибки. </p>
<p><code><br />
 &nbsp;1 onerror errortrap<br />
 &nbsp;2<br />
 &nbsp;3 print &quot;z = &quot; + z<br />
 &nbsp;4 print &quot;все еще работает после ошибки&quot;<br />
 &nbsp;5 end<br />
 &nbsp;6<br />
 &nbsp;7 errortrap:<br />
 &nbsp;8 print &quot;Ловушка активирована!&quot;<br />
 &nbsp;9 print &quot;  Ошибка = &quot; + lasterror<br />
 10 print &quot;  На строке = &quot; + lasterrorline<br />
 11 print &quot;  Сообщение = &quot; + lasterrormessage<br />
 12 return<br />
</code><br />
Программа 100 Ловушка для ошибок с комментариями<br />
<code><br />
Ловушка активирована!<br />
Ошибка = 12<br />
На строке = 3<br />
Сообщение = Неизвестная переменная<br />
z = 0<br />
все еще работает после ошибки<br />
</code><br />
Пример вывода программы 100 Ловушка для ошибок с комментариями</p>
<table>
<tr>
<td align="center"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2010/11/new_concept.png" alt="" title="Новое понятие" width="80" height="80" class="aligncenter size-full wp-image-3467" /></td>
<td><strong>lasterror</strong> или <strong>lasterror()</strong><br />
  <strong>lasterrorline</strong> или <strong>lasterrorline()</strong><br />
  <strong>lasterrormessage</strong> или <strong>lasterrormessage()</strong> <br />
  <strong>lasterrorextra</strong> или <strong>lasterrorextra()</strong></p>
<p>  Четыре функции  возвращают информацию о последней перехваченной ошибке. Значения остаются неизменными, пока не произойдет еще одна ошибка.</p>
<table border="1">
<tr>
<td><strong>lasterror</strong></td>
<td>Возвращает номер последней перехваченной ошибки. Если ошибок не было, возвращает нуль. См. Дополнение J Номера ошибок — там полный список перехватываемых ошибок.</td>
</tr>
<tr>
<td><strong>lasterrorline</strong></td>
<td>Возвращает номер строки, где произошла ошибка</td>
</tr>
<tr>
<td><strong>lasterrormessage</strong></td>
<td>Возвращает строку описания ошибки</td>
</tr>
<tr>
<td><strong>lasterrorextra</strong></td>
<td>Возвращает строку с дополнительным описанием ошибки. Для большинства ошибок эта функция ничего не выводит.</td>
</tr>
</table>
</td>
</tr>
</table>
<h3>Отключение режима перехвата ошибок</h3>
<p>Иногда нужно, чтобы программа перехватывала ошибки в одной своей части и не перехватывала в другой. Вы увидите такие примеры в следующих главах.</p>
<p>Оператор <strong>offerror</strong> отключает режим перехвата ошибок. После него, любая ошибка приведет к остановке выполнения программы.<br />
<code><br />
 &nbsp;1 onerror errortrap<br />
 &nbsp;2 print &quot;z = &quot; + z<br />
 &nbsp;3 print &quot;Продолжаю работать после первой ошибки&quot;<br />
 &nbsp;4<br />
 &nbsp;5 offerror<br />
 &nbsp;6 print &quot;z = &quot; + z<br />
 &nbsp;7 print &quot;Продолжаю работать после второй ошибки&quot;<br />
 &nbsp;8<br />
 &nbsp;9 end<br />
 10<br />
 11 errortrap:<br />
 12 print &quot;Перехват ошибок активирован&quot;<br />
 13 return<br />
</code><br />
Программа 101 Отключение перехвата ошибок<br />
<code><br />
Перехват ошибок активирован<br />
z = 0<br />
Продолжаю работать после первой ошибки<br />
ОШИБКА в строке 6: Неизвестная переменная<br />
</code><br />
Пример вывода программы 101 Отключение перехвата ошибок</p>
<p>============================<br />
<a name="basic"></a><br />
<h3>Где скачать BASIC-256:</h3>
<p><strong>Для дистрибутивов ALT Linux</strong></p>
<ul>
<li>ветка 4.0 <a href="http://ftp.altlinux.org/pub/distributions/ALTLinux/4.0/branch/files/i586/RPMS/basic256-0.9.6-alt5.M40.1.i586.rpm">basic256-0.9.6-alt5.M40.1.i586.rpm</a></li>
<li>ветка 4.1 <a href="http://ftp.altlinux.org/pub/distributions/ALTLinux/4.1/branch/files/i586/RPMS/basic256-0.9.6-alt5.M41.1.i586.rpm">basic256-0.9.6-alt5.M41.1.i586.rpm</a></li>
<li>ветка p5 <a href="http://ftp.altlinux.org/pub/distributions/ALTLinux/p5/branch/files/i586/RPMS/basic256-0.9.6-alt5.M50P.1.i586.rpm">basic256-0.9.6-alt5.M50P.1.i586.rpm</a></li>
<li>ветка 5.1 <a href="http://ftp.altlinux.org/pub/distributions/ALTLinux/5.1/branch/files/i586/RPMS/basic256-0.9.6-alt5.M51.1.i586.rpm">basic256-0.9.6-alt5.M51.1.i586.rpm</a></li>
</ul>
<p><strong>Windows версия</strong><br />
<a href="http://basic256.org">http://basic256.org</a> (<a href="http://www.sourceforge.net/projects/kidbasic">http://www.sourceforge.net/projects/kidbasic</a>)</p>
<h3> Как установить BASIC-256 в Linux</h3>
<p><strong>Для Альт Линукс:</strong> настроить репозиторий и обновить/установить пакет через synaptic или apt<br />
<strong>Для rpm-based дистрибутивов:</strong> rpm -Uvh &lt;имя_пакета&gt;.rpm<br />
</ljcut></p>
]]></content:encoded>
			<wfw:commentRss>http://freeschool.altlinux.ru/?feed=rss2&#038;p=4048</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>BASIC-256. Глава 17</title>
		<link>http://freeschool.altlinux.ru/?p=4015</link>
		<comments>http://freeschool.altlinux.ru/?p=4015#comments</comments>
		<pubDate>Fri, 25 Feb 2011 00:00:14 +0000</pubDate>
		<dc:creator><![CDATA[Владимир Черный]]></dc:creator>
				<category><![CDATA[Методические материалы]]></category>
		<category><![CDATA[BASIC-256]]></category>
		<category><![CDATA[Ирюпин]]></category>
		<category><![CDATA[Черный]]></category>

		<guid isPermaLink="false">http://freeschool.altlinux.ru/?p=4015</guid>
		<description><![CDATA[Продолжаем публиковать перевод книги Джеймса Рено. Эту главу перевел Владимир Черный. Оглавление: Глава 1: Знакомство с BASIC-256 – cкажи «Привет» Глава 2: Рисуем основные фигуры Глава 3: Звуки и музыка Глава 4: Мыслить как программист Глава 5: Программа задает вам вопросы Глава 6: Сравнения, сравнения, сравнения Глава 7: Циклы и счетчики — повторяем снова и [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Продолжаем публиковать перевод <a href="http://basicbook.org/download">книги Джеймса Рено</a>. Эту главу перевел Владимир Черный.<br />
Оглавление:</p>
<ul>
<li><a href="http://freeschool.altlinux.ru/?p=3401">Глава 1: Знакомство с BASIC-256 – cкажи «Привет»</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3461">Глава 2: Рисуем основные фигуры</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3504">Глава 3: Звуки и музыка</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3569#g4">Глава 4: Мыслить как программист</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3569#g5">Глава 5: Программа задает вам вопросы</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3643">Глава 6: Сравнения, сравнения, сравнения</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3689">Глава 7: Циклы и счетчики — повторяем снова и снова</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3719">Глава 8: Графика на заказ — создание фигур своими руками</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3755">Глава 9: Подпрограммы — повторное использование кода</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3805">Глава 10: Управляем мышкой, перемещаем объекты</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3842">Глава 11: Использование клавиатуры для управления программой</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3867">Глава 12: Картинки, музыка и спрайты</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3906">Глава 13 Массивы — коллекции данных</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3930">Глава 14 Математика &mdash; развлечемся с числами</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3988">Глава 15 Работаем со строками</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3992">Глава 16 Файлы. Сохраним информацию на будущее</a></li>
</ul>
<p><a href="#basic">Где взять BASIC-256</a><br />
<span id="more-4015"></span><br />
<ljcut></p>
<h2>Глава 17 Стеки, очереди, списки и сортировка</h2>
<p>Эта глава посвящена введению в достаточно сложные понятия, которые рассматриваются на первых курсах факультетов информатики университетов. Первые три темы (стеки, очереди и связанные списки) описывают наиболее общие способы хранения информации в компьютерных системах, последние две описывают алгоритмы сортировки информации.</p>
<h3>Стек</h3>
<p>Стек, наиболее общая структура данных, используемая программистами во многих задачах. Стек работает как колода карт в игре «сумасшедшая восьмерка»<a name="m1"></a><a href="#ref1"><sup>1</sup></a>. Когда вы добавляете данные в стек, они добавляются сверху (называется «<em>push</em>»<a name="m2"></a><a href="#ref2"><sup>2</sup></a>) и эти данные расположены в стеке над другими. Когда вы хотите получить информацию из стека, то можете взять только самый верхний элемент, открывая доступ к нижележащему (называется «<em>pop</em>»<a name="m3"></a><a href="#ref3"><sup>3</sup></a>). Рисунок 27 демонстрирует эту схему.<br />
<a href="http://freeschool.altlinux.ru/wp-content/uploads/2011/02/chapter17-img27.png"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2011/02/chapter17-img27-300x261.png" alt="" title="chapter17-img27" width="300" height="261" class="alignnone size-medium wp-image-4017" /></a><br />
Рис. 27 Что такое стек</p>
<p>Операции со стеком также можно описать как «последним пришел, первым ушел», или как принято в англоязычных странах «last in, first out» сокращенно <em>LIFO</em>. Последнее добавленное в стек значение, будет следующим, которое из него извлечено. Программа 94 организует стек используя массив и указатель на последний добавленный элемент. В подпрограмме «pushstack» вы увидите как с помощью изменения размеров массива реализуется теоретически произвольный размер стека.</p>
<p><code><br />
 &nbsp;1 # stack.kbs<br />
 &nbsp;2 # реализация стека, используя массив<br />
 &nbsp;3<br />
 &nbsp;4 dim stack(1) # массив для хранения стека в начале<br />
 &nbsp;5 nstack = 0  # количество элементов стека<br />
 &nbsp;6<br />
 &nbsp;7 value = 1<br />
 &nbsp;8 gosub pushstack<br />
 &nbsp;9 value = 2<br />
 10 gosub pushstack<br />
 11 value = 3<br />
 12 gosub pushstack<br />
 13 value = 4<br />
 14 gosub pushstack<br />
 15 value = 5<br />
 16 gosub pushstack<br />
 17<br />
 18 while nstack &gt; 0<br />
 19 &nbsp;&nbsp;&nbsp;&nbsp;gosub popstack<br />
 20 &nbsp;&nbsp;&nbsp;&nbsp;print value<br />
 21 end while<br />
 22<br />
 23 end<br />
 24<br />
 25 popstack: #<br />
 26 # получаем значение верхнего элемента стека и помещаем его в переменную value<br />
 27 if nstack = 0 then<br />
 28 &nbsp;&nbsp;&nbsp;&nbsp;print &quot;стек пуст&quot;<br />
 29 else<br />
 30 &nbsp;&nbsp;&nbsp;&nbsp;nstack = nstack - 1<br />
 31 &nbsp;&nbsp;&nbsp;&nbsp;value = stack[nstack]<br />
 32 end if<br />
 33 return<br />
 34<br />
 35 pushstack: #<br />
 36 # помещает число в переменную стека<br />
 36 # помещает число в переменную стека<br />
 37 # увеличивает размер стека, если он уже полон<br />
 38 if nstack = stack[?] then redim stack(stack[?] + 5)<br />
 39 stack[nstack] = value<br />
 40 nstack = nstack + 1<br />
 41 return<br />
</code><br />
Программа 94 Стек<br />
<code><br />
5<br />
4<br />
3<br />
2<br />
1<br />
</code><br />
Пример вывода программы 94 Стек</p>
<h3>Очередь</h3>
<p>Очередь &mdash; еще одна из распространенных форм представления данных. Очередь, в простейшем виде, напоминает цепочку выстроившуюся у линии раздачи завтрака в школе. Первый в очереди, первым получает еду. Рисунок 28 демонстрирует блочную. диаграмму очереди.</p>
<p><a href="http://freeschool.altlinux.ru/wp-content/uploads/2011/02/chapter17-img28.png"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2011/02/chapter17-img28-300x275.png" alt="" title="chapter17-img28" width="300" height="275" class="alignnone size-medium wp-image-4018" /></a><br />
Рисунок 28 Что такое очередь</p>
<p>Термины <em>enqueue</em> и <em>dequeue</em> используются для обозначения процессов добавления нового элемента в хвост очереди и удаления элемента из головы очереди соответственно. Иногда очередь описывают, как «первым пришел, первым ушел» или на английском языке <em>FIFO</em> («first in, first out»). Пример в программе 95 использует массив и два указателя, для отслеживания «головы» и «хвоста» очереди.</p>
<p><code><br />
 &nbsp;1 # queue.kbs<br />
 &nbsp;2 # реализация очереди через массив<br />
 &nbsp;3<br />
 &nbsp;4 # размер очереди в любой момент времени<br />
 &nbsp;5 queuesize = 4<br />
 &nbsp;6 # массив для элементов очереди<br />
 &nbsp;7 dim queue(queuesize)<br />
 &nbsp;8 # Положение следующего входящего элемента (указатель на хвост)<br />
 &nbsp;9 tail = 0<br />
 10 # Положение в очереди возвращаемого элемента (указатель на голову)<br />
 11 head = 0<br />
 12 # количество элементов в очереди<br />
 13 inqueue = 0<br />
 14<br />
 15 value = 1<br />
 16 gosub enqueue<br />
 17 value = 2<br />
 18 gosub enqueue<br />
 19<br />
 20 gosub dequeue<br />
 21 print value<br />
 22<br />
 23 value = 3<br />
 24 gosub enqueue<br />
 25 value = 4<br />
 26 gosub enqueue<br />
 27<br />
 28 gosub dequeue<br />
 29 print value<br />
 30 gosub dequeue<br />
 31 print value<br />
 32<br />
 33 value = 5<br />
 34 gosub enqueue<br />
 35 value = 6<br />
 36 gosub enqueue<br />
 37 value = 7<br />
 38 gosub enqueue<br />
 39<br />
 40 # очищение очереди<br />
 41 while inqueue > 0<br />
 42 &nbsp;&nbsp;&nbsp;&nbsp;gosub dequeue<br />
 43 &nbsp;&nbsp;&nbsp;&nbsp;print value<br />
 44 end while<br />
 45<br />
 46 end<br />
 47<br />
 48 dequeue: #<br />
 49 if inqueue = 0 then<br />
 50 &nbsp;&nbsp;&nbsp;&nbsp;print &quot;очередь пуста&quot;<br />
 51 else<br />
 52 &nbsp;&nbsp;&nbsp;&nbsp;inqueue = inqueue - 1<br />
 53 &nbsp;&nbsp;&nbsp;&nbsp;value = queue[head]<br />
 54 &nbsp;&nbsp;&nbsp;&nbsp;print &quot;удаление элемента  value=&quot; + value + &quot; из положения=&quot; + head + &quot; в очереди=&quot; + inqueue +&quot; элементов&quot;<br />
 55 &nbsp;&nbsp;&nbsp;&nbsp;# перемещение указателя на начало. Если мы в конце массива, переходим к началу.<br />
 56 &nbsp;&nbsp;&nbsp;&nbsp;head = head + 1<br />
 57 &nbsp;&nbsp;&nbsp;&nbsp;if head = queuesize then head = 0<br />
 58 end if<br />
 59 return<br />
 60<br />
 61 enqueue: #<br />
 62 if inqueue = queuesize then<br />
 63 &nbsp;&nbsp;&nbsp;&nbsp;print &quot;очередь заполнена&quot;<br />
 64 else<br />
 65 &nbsp;&nbsp;&nbsp;&nbsp;inqueue = inqueue + 1<br />
 66 &nbsp;&nbsp;&nbsp;&nbsp;queue[tail] = value<br />
 67 &nbsp;&nbsp;&nbsp;&nbsp;print &quot;добавляемый элемент value=&quot; + value + &quot; в положение=&quot; + tail + &quot; в очереди=&quot; + inqueue +&quot; элементов&quot;<br />
 68 &nbsp;&nbsp;&nbsp;&nbsp;# перемещаем указатель конца очереди, если достигли конца, переходим к началу.<br />
 69 &nbsp;&nbsp;&nbsp;&nbsp;tail = tail + 1<br />
 70 &nbsp;&nbsp;&nbsp;&nbsp;if tail = queuesize then tail = 0<br />
 71 end if<br />
 72 return<br />
</code><br />
Программа 95 Очередь<br />
<code><br />
добавляемый элемент value=1 в положение=0 в очереди=1 элементов<br />
добавляемый элемент value=2 в положение=1 в очереди=2 элементов<br />
удаление элемента  value=1 из положения=0 в очереди=1 элементов<br />
1<br />
добавляемый элемент value=3 в положение=2 в очереди=2 элементов<br />
добавляемый элемент value=4 в положение=3 в очереди=3 элементов<br />
удаление элемента  value=2 из положения=1 в очереди=2 элементов<br />
2<br />
удаление элемента  value=3 из положения=2 в очереди=1 элементов<br />
3<br />
добавляемый элемент value=5 в положение=0 в очереди=2 элементов<br />
добавляемый элемент value=6 в положение=1 в очереди=3 элементов<br />
добавляемый элемент value=7 в положение=2 в очереди=4 элементов<br />
удаление элемента  value=4 из положения=3 в очереди=3 элементов<br />
4<br />
удаление элемента  value=5 из положения=0 в очереди=2 элементов<br />
5<br />
удаление элемента  value=6 из положения=1 в очереди=1 элементов<br />
6<br />
удаление элемента  value=7 из положения=2 в очереди=0 элементов<br />
7<br />
</code><br />
Пример вывода программы 95 Очередь</p>
<h3>Связный список</h3>
<p>В большинстве книг обсуждение материала этой главы начинается со связных списков. Однако BASIC-256 по другому организует память, чем другие языки, поэтому мы обсуждаем связные списки после стеков и очередей.</p>
<p>Связный список, это последовательность элементов, содержащих данные и указатель на следующий элемент в списке. Кроме этих элементов нам необходимо иметь указатель на первый объект списка. Мы назовем первый элемент списка «голова». Взгляните на рисунок 29, где видно, как каждый объект списка указывает на другой.<br />
<a href="http://freeschool.altlinux.ru/wp-content/uploads/2011/02/chapter17-img29.png"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2011/02/chapter17-img29-300x58.png" alt="" title="chapter17-img29" width="300" height="58" class="alignnone size-medium wp-image-4019" /></a><br />
Рисунок 29 Связный список</p>
<p>Преимущество связных списков над массивом в том, что можно с легкостью добавлять или удалять его элементы. Чтобы стереть элемент списка достаточно поменять указатель у предыдущего элемента на последующий (см. рисунок 30) и освобождение элемента так, чтобы его можно было использовать.<br />
<a href="http://freeschool.altlinux.ru/wp-content/uploads/2011/02/chapter17-img30.png"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2011/02/chapter17-img30-300x84.png" alt="" title="chapter17-img30" width="300" height="84" class="alignnone size-medium wp-image-4020" /></a><br />
Рисунок 30. Удаление элемента списка.</p>
<p>Добавление нового элемента тоже просто. Надо создать элемент и связать его с предыдущим и последующим элементом в списке. Рисунок 31 иллюстрирует этот процесс.</p>
<p><a href="http://freeschool.altlinux.ru/wp-content/uploads/2011/02/chapter17-img31.png"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2011/02/chapter17-img31-300x79.png" alt="" title="chapter17-img31" width="300" height="79" class="alignnone size-medium wp-image-4021" /></a><br />
Рисунок 31 Добавление элемента в связный список.</p>
<p>Связные списки обычно рассматривают как простейшие структуры данных. В языке BASIC мы не можем выделять память так как это делается в большинстве языков, поэтомы мы имитируем поведение списка через массивы. В программе 96 мы используем массив data$ для хранения текста в списке, массив nextitem для хранения указателей на следующий элемент списка и freeitem массив для хранения стека свободных (неиспользуемых) индексов.</p>
<p><code><br />
&nbsp;&nbsp;1&nbsp;#&nbsp;linkedlist.kbs<br />
&nbsp;&nbsp;2&nbsp;#&nbsp;Cвязный&nbsp;список&nbsp;через&nbsp;массивы<br />
&nbsp;&nbsp;3&nbsp;#&nbsp;наибольшее&nbsp;количество&nbsp;элементов&nbsp;списка<br />
&nbsp;&nbsp;4&nbsp;n&nbsp;=&nbsp;8<br />
&nbsp;&nbsp;5&nbsp;#&nbsp;данные&nbsp;для&nbsp;элементов&nbsp;списка<br />
&nbsp;&nbsp;6&nbsp;dim&nbsp;data$(n)<br />
&nbsp;&nbsp;7&nbsp;#&nbsp;указатели&nbsp;на&nbsp;следующий&nbsp;элемент&nbsp;списка<br />
&nbsp;&nbsp;8&nbsp;dim&nbsp;nextitem(n)<br />
&nbsp;&nbsp;9&nbsp;#&nbsp;список&nbsp;(стек)&nbsp;свободных&nbsp;элементов<br />
&nbsp;10&nbsp;dim&nbsp;freeitem(n)<br />
&nbsp;11&nbsp;<br />
&nbsp;12&nbsp;#&nbsp;начальный&nbsp;стек&nbsp;свободных&nbsp;элементов<br />
&nbsp;13&nbsp;for&nbsp;t&nbsp;=&nbsp;0&nbsp;to&nbsp;n-1<br />
&nbsp;14&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;freeitem[t]&nbsp;=&nbsp;t<br />
&nbsp;15&nbsp;next&nbsp;t<br />
&nbsp;16&nbsp;lastfree&nbsp;=&nbsp;n-1<br />
&nbsp;17&nbsp;<br />
&nbsp;18&nbsp;#&nbsp;начало&nbsp;списка&nbsp;-&nbsp;&nbsp;-1&nbsp;=&nbsp;указатель&nbsp;&quot;в&nbsp;никуда&quot;<br />
&nbsp;19&nbsp;head&nbsp;=&nbsp;-1<br />
&nbsp;20&nbsp;<br />
&nbsp;21&nbsp;#&nbsp;список&nbsp;из&nbsp;3&nbsp;элементов<br />
&nbsp;22&nbsp;text$&nbsp;=&nbsp;&quot;Голова&quot;<br />
&nbsp;23&nbsp;gosub&nbsp;append<br />
&nbsp;24&nbsp;text$&nbsp;=&nbsp;&quot;еще&quot;<br />
&nbsp;25&nbsp;gosub&nbsp;append<br />
&nbsp;26&nbsp;text$&nbsp;=&nbsp;&quot;нечто&quot;<br />
&nbsp;27&nbsp;gosub&nbsp;append<br />
&nbsp;28&nbsp;gosub&nbsp;displaylist<br />
&nbsp;29&nbsp;gosub&nbsp;displayarrays<br />
&nbsp;30&nbsp;gosub&nbsp;wait<br />
&nbsp;31&nbsp;<br />
&nbsp;32&nbsp;print&nbsp;&quot;удаляем&nbsp;второй&nbsp;элемент&quot;<br />
&nbsp;33&nbsp;r&nbsp;=&nbsp;2<br />
&nbsp;34&nbsp;gosub&nbsp;delete<br />
&nbsp;35&nbsp;gosub&nbsp;displaylist<br />
&nbsp;36&nbsp;gosub&nbsp;displayarrays<br />
&nbsp;37&nbsp;gosub&nbsp;wait<br />
&nbsp;38&nbsp;<br />
&nbsp;39&nbsp;print&nbsp;&quot;вставляем&nbsp;элемент&nbsp;1&quot;<br />
&nbsp;40&nbsp;r&nbsp;=&nbsp;1<br />
&nbsp;41&nbsp;text$&nbsp;=&nbsp;&quot;что-то&quot;<br />
&nbsp;42&nbsp;gosub&nbsp;insert<br />
&nbsp;43&nbsp;gosub&nbsp;displaylist<br />
&nbsp;44&nbsp;gosub&nbsp;displayarrays<br />
&nbsp;45&nbsp;gosub&nbsp;wait<br />
&nbsp;46&nbsp;<br />
&nbsp;47&nbsp;print&nbsp;&quot;вставляем&nbsp;элемент&nbsp;2&quot;<br />
&nbsp;48&nbsp;r&nbsp;=&nbsp;2<br />
&nbsp;49&nbsp;text$&nbsp;=&nbsp;&quot;кое-что&quot;<br />
&nbsp;50&nbsp;gosub&nbsp;insert<br />
&nbsp;51&nbsp;gosub&nbsp;displaylist<br />
&nbsp;52&nbsp;gosub&nbsp;displayarrays<br />
&nbsp;53&nbsp;gosub&nbsp;wait<br />
&nbsp;54&nbsp;<br />
&nbsp;55&nbsp;print&nbsp;&quot;удаляем&nbsp;элемент&nbsp;1&quot;<br />
&nbsp;56&nbsp;r&nbsp;=&nbsp;1<br />
&nbsp;57&nbsp;gosub&nbsp;delete<br />
&nbsp;58&nbsp;gosub&nbsp;displaylist<br />
&nbsp;59&nbsp;gosub&nbsp;displayarrays<br />
&nbsp;60&nbsp;gosub&nbsp;wait<br />
&nbsp;61&nbsp;<br />
&nbsp;62&nbsp;end<br />
&nbsp;63&nbsp;<br />
&nbsp;64&nbsp;wait:&nbsp;##&nbsp;ждем&nbsp;ввода<br />
&nbsp;65&nbsp;input&nbsp;&quot;нажмите&nbsp;ввод?&nbsp;&quot;,&nbsp;garbage$<br />
&nbsp;66&nbsp;print<br />
&nbsp;67&nbsp;return<br />
&nbsp;68&nbsp;<br />
&nbsp;69&nbsp;#&nbsp;показываем&nbsp;список&nbsp;следуя&nbsp;связям&nbsp;<br />
&nbsp;70&nbsp;displaylist:<br />
&nbsp;71&nbsp;print&nbsp;&quot;Список...&quot;<br />
&nbsp;72&nbsp;k&nbsp;=&nbsp;0<br />
&nbsp;73&nbsp;i&nbsp;=&nbsp;head<br />
&nbsp;74&nbsp;do<br />
&nbsp;75&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k&nbsp;=&nbsp;k&nbsp;+&nbsp;1<br />
&nbsp;76&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;k&nbsp;+&nbsp;&quot;&nbsp;&quot;;<br />
&nbsp;77&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;data$[i]<br />
&nbsp;78&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;=&nbsp;nextitem[i]<br />
&nbsp;79&nbsp;until&nbsp;i&nbsp;=&nbsp;-1<br />
&nbsp;80&nbsp;return<br />
&nbsp;81&nbsp;<br />
&nbsp;82&nbsp;#&nbsp;Показываем&nbsp;сохраненные&nbsp;в&nbsp;массивах&nbsp;данные:&nbsp;что&nbsp;и&nbsp;как<br />
&nbsp;83&nbsp;displayarrays:<br />
&nbsp;84&nbsp;print&nbsp;&quot;массивы...&quot;<br />
&nbsp;85&nbsp;for&nbsp;i&nbsp;=&nbsp;0&nbsp;to&nbsp;n-1<br />
&nbsp;86&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;i&nbsp;+&nbsp;&quot;&nbsp;&quot;&nbsp;+&nbsp;data$[i]&nbsp;+&nbsp;&quot;&nbsp;-&gt;&quot;&nbsp;+&nbsp;nextitem[i]&nbsp;;<br />
&nbsp;87&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;k&nbsp;=&nbsp;0&nbsp;to&nbsp;lastfree<br />
&nbsp;88&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;freeitem[k]&nbsp;=&nbsp;i&nbsp;then&nbsp;print&nbsp;&quot;&nbsp;&lt;&lt;свободно&quot;;<br />
&nbsp;89&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next&nbsp;k<br />
&nbsp;90&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;head&nbsp;=&nbsp;i&nbsp;then&nbsp;print&nbsp;&quot;&nbsp;&lt;&lt;голова&quot;;<br />
&nbsp;91&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print<br />
&nbsp;92&nbsp;next&nbsp;i<br />
&nbsp;93&nbsp;return<br />
&nbsp;94&nbsp;<br />
&nbsp;95&nbsp;#&nbsp;вставить&nbsp;в&nbsp;text$&nbsp;в&nbsp;позицию&nbsp;r<br />
&nbsp;96&nbsp;insert:<br />
&nbsp;97&nbsp;if&nbsp;r&nbsp;=&nbsp;1&nbsp;then<br />
&nbsp;98&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gosub&nbsp;createitem<br />
&nbsp;99&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nextitem[index]&nbsp;=&nbsp;head<br />
100&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;head&nbsp;=&nbsp;index<br />
101&nbsp;else<br />
102&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k&nbsp;=&nbsp;2<br />
103&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;=&nbsp;head<br />
104&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;i&nbsp;&lt;&gt;&nbsp;-1&nbsp;and&nbsp;k&nbsp;&lt;&gt;&nbsp;r<br />
105&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k&nbsp;=&nbsp;k&nbsp;+&nbsp;1<br />
106&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;=&nbsp;nextitem[i]<br />
107&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;while<br />
108&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;i&nbsp;&lt;&gt;&nbsp;-1&nbsp;then<br />
109&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gosub&nbsp;createitem<br />
110&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nextitem[index]&nbsp;=&nbsp;nextitem[i]<br />
111&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nextitem[i]&nbsp;=&nbsp;index<br />
112&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br />
113&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;&quot;Нельзя&nbsp;вставить&nbsp;после&nbsp;конца&nbsp;списка&quot;<br />
114&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;if<br />
115&nbsp;end&nbsp;if<br />
116&nbsp;return<br />
117&nbsp;<br />
118&nbsp;#&nbsp;удалить&nbsp;элемент&nbsp;r&nbsp;из&nbsp;связного&nbsp;списка<br />
119&nbsp;delete:<br />
120&nbsp;if&nbsp;r&nbsp;=&nbsp;1&nbsp;then<br />
121&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;index&nbsp;=&nbsp;head<br />
122&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;head&nbsp;=&nbsp;nextitem[index]<br />
123&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gosub&nbsp;freeitem<br />
124&nbsp;else<br />
125&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k&nbsp;=&nbsp;2<br />
126&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;=&nbsp;head<br />
127&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;i&nbsp;&lt;&gt;&nbsp;-1&nbsp;and&nbsp;k&nbsp;&lt;&gt;&nbsp;r<br />
128&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k&nbsp;=&nbsp;k&nbsp;+&nbsp;1<br />
129&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;=&nbsp;nextitem[i]<br />
130&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;while<br />
131&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;i&nbsp;&lt;&gt;&nbsp;-1&nbsp;then<br />
132&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;index&nbsp;=&nbsp;nextitem[i]<br />
133&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nextitem[i]&nbsp;=&nbsp;nextitem[nextitem[i]]<br />
134&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gosub&nbsp;freeitem<br />
135&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br />
136&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;&quot;нельзя&nbsp;удалить&nbsp;после&nbsp;конца&nbsp;списка&quot;<br />
137&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;if<br />
138&nbsp;end&nbsp;if<br />
139&nbsp;return<br />
140&nbsp;<br />
141&nbsp;#&nbsp;добавляем&nbsp;&nbsp;text$&nbsp;в&nbsp;конец&nbsp;связного&nbsp;списка<br />
142&nbsp;append:<br />
143&nbsp;if&nbsp;head&nbsp;=&nbsp;-1&nbsp;then<br />
144&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gosub&nbsp;createitem<br />
145&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;head&nbsp;=&nbsp;index<br />
146&nbsp;else<br />
147&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;=&nbsp;head<br />
148&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;nextitem[i]&nbsp;&lt;&gt;&nbsp;-1<br />
149&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;=&nbsp;nextitem[i]<br />
150&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;while<br />
151&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gosub&nbsp;createitem<br />
152&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nextitem[i]&nbsp;=&nbsp;index<br />
153&nbsp;endif<br />
154&nbsp;return<br />
155&nbsp;<br />
156&nbsp;#&nbsp;освобожденный&nbsp;элемент&nbsp;из&nbsp;index&nbsp;добавляем&nbsp;к&nbsp;стеку&nbsp;свободных&nbsp;элементов<br />
157&nbsp;freeitem:<br />
158&nbsp;lastfree&nbsp;=&nbsp;lastfree&nbsp;+&nbsp;1<br />
159&nbsp;freeitem[lastfree]&nbsp;=&nbsp;index<br />
160&nbsp;return<br />
161&nbsp;<br />
162&nbsp;#&nbsp;сохраняем&nbsp;значение&nbsp;text$&nbsp;в&nbsp;data$&nbsp;и&nbsp;возвращаем&nbsp;указатель&nbsp;на&nbsp;новое&nbsp;положение<br />
163&nbsp;createitem:<br />
164&nbsp;if&nbsp;lastfree&nbsp;&lt;&nbsp;0&nbsp;then<br />
165&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;&quot;нет&nbsp;свободного&nbsp;места&quot;<br />
166&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br />
167&nbsp;end&nbsp;if<br />
168&nbsp;index&nbsp;=&nbsp;freeitem[lastfree]<br />
169&nbsp;data$[index]&nbsp;=&nbsp;text$<br />
170&nbsp;nextitem[index]&nbsp;=&nbsp;-1<br />
171&nbsp;lastfree&nbsp;=&nbsp;lastfree&nbsp;-&nbsp;1<br />
172&nbsp;return<br />
</code><br />
Программа 96 Связный список.</p>
<table>
<tr>
<td align="center"><a href="http://freeschool.altlinux.ru/wp-content/uploads/2010/11/explore.png"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2010/11/explore.png" alt="" title="Попробуй, исследуй!" width="80" height="80" class="aligncenter size-full wp-image-3482" /></a></td>
<td>Перепишите программу 96 чтобы реализовать стек и очередь через связный список.
                </td>
</tr>
</table>
<h3>Медленно и не эффективно &mdash; сортировка пузырьком</h3>
<p>Пузырьковая сортировка, возможно, самый плохой алгоритм, придуманный для сортировки данных. Он очень медлителен и не эффективен за исключением небольших объемов данных. Это классический пример плохого алгоритма.</p>
<p>Единственная польза этого алгоритма в том, что его легко объяснить и реализовать. Рисунок 32 показывает блок-схему этого алгоритма. Суть пузырьковой сортировки в том, что мы многократно просматриваем массив переставляя смежные элементы до тех пор, пока все не отсортируем.</p>
<p><a href="http://freeschool.altlinux.ru/wp-content/uploads/2011/02/chapter17-img32.png"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2011/02/chapter17-img32-300x300.png" alt="" title="chapter17-img32" width="300" height="300" class="alignnone size-medium wp-image-4022" /></a><br />
Рис. 32 Блок-схема пузырьковой сортировки</p>
<p><code><br />
 &nbsp;1 # bubblesort.kbs<br />
 &nbsp;2 # реализация простой сортировки<br />
 &nbsp;3<br />
 &nbsp;4 # Пузырьковая сортировка один из самых медлительных<br />
 &nbsp;5 # алгоритмов для сортировки, но он прост для понимания<br />
 &nbsp;6 # и реализации.<br />
 &nbsp;7 #<br />
 &nbsp;8 # Алгоритм Пузырьковой сортировки состоит из<br />
 &nbsp;9 # 1. Просмотра всех элементов массива с перестановкой<br />
 10 # соседних значений так, что меньшее значение<br />
 11 # перемещается вперед.<br />
 12 # 2. Шаг 1 повторяется многократно, пока не прекратятся<br />
 13 # перестановки (массив отсортирован)<br />
 14 #<br />
 15<br />
 16 dim d(20)<br />
 17<br />
 18 # Заполняем массив случайными<br />
 19 # неотсортированными данными<br />
 20 for i = 0 to d[?]-1<br />
 21 &nbsp;&nbsp;&nbsp;&nbsp;d[i] = rand * 1000<br />
 22 next i<br />
 23<br />
 24 print &quot;*** До сортировки ***&quot;<br />
 25 gosub displayarray<br />
 26<br />
 27 gosub bubblesort<br />
 28<br />
 29 print &quot;*** Отсортировано ***&quot;<br />
 30 gosub displayarray<br />
 31 end<br />
 32<br />
 33 displayarray:<br />
 34 # распечатка значений массива<br />
 35 for i = 0 to d[?]-1<br />
 36 &nbsp;&nbsp;&nbsp;&nbsp;print d[i] + &quot; &quot;;<br />
 37 next i<br />
 38 print<br />
 39 return<br />
 40<br />
 41 bubblesort:<br />
 42 do<br />
 43 &nbsp;&nbsp;&nbsp;&nbsp;sorted = true<br />
 44 &nbsp;&nbsp;&nbsp;&nbsp;for i = 0 to d[?] - 2<br />
 45 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if d[i] &gt; d[i+1] then<br />
 46 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sorted = false<br />
 47 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp = d[i+1]<br />
 48 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d[i+1] = d[i]<br />
 49 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d[i] = temp<br />
 50 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end if<br />
 51 &nbsp;&nbsp;&nbsp;&nbsp;next i<br />
 52 until sorted<br />
 53 return<br />
</code><br />
Программа 97 Пузырьковая сортировка</p>
<h3>Лучшая сортировка &mdash; сортировка вставками</h3>
<p>Сортировка вставками &mdash; еще один алгоритм сортировки данных. Обычно он быстрее чем пузырьковая сортировка, но в худшем случае может занять столько же времени.</p>
<p>Сортировка вставками получила свое название из-за принципа работы. Во время сортировки просматривает массив элементов (от index=1 до length-1) и вставляет значение в правильное положение, по отношению к предыдущим уже отсортированным элементам массива. Рисунок 33 демонстрирует этот принцип.</p>
<p><a href="http://freeschool.altlinux.ru/wp-content/uploads/2011/02/chapter17-img33.png"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2011/02/chapter17-img33-300x289.png" alt="" title="chapter17-img33" width="300" height="289" class="alignnone size-medium wp-image-4023" /></a><br />
Рис. 33 Сортировка вставкой, шаг за шагом.</p>
<p><code><br />
 &nbsp;1 # insertionsort.kbs<br />
 &nbsp;2 # реализация эффективной сортировки<br />
 &nbsp;3<br />
 &nbsp;4 dim d(20)<br />
 &nbsp;5<br />
 &nbsp;6 # заполнение массива случайными данными<br />
 &nbsp;7 for i = 0 to d[?]-1<br />
 &nbsp;8 &nbsp;&nbsp;&nbsp;&nbsp;d[i] = rand * 1000<br />
 &nbsp;9 next i<br />
 10<br />
 11 print &quot;*** Без сортировки ***&quot;<br />
 12 gosub displayarray<br />
 13<br />
 14 gosub insertionsort<br />
 15<br />
 16 print &quot;*** Отсортировано ***&quot;<br />
 17 gosub displayarray<br />
 18 end<br />
 19<br />
 20 displayarray:<br />
 21 # Печать данных массива<br />
 22 for i = 0 to d[?]-1<br />
 23 &nbsp;&nbsp;&nbsp;&nbsp;print d[i] + &quot; &quot;;<br />
 24 next i<br />
 25 print<br />
 26 return<br />
 27<br />
 28 insertionsort:<br />
 29 # цикл по массиву начиная со второго элемента<br />
 30 # берем текущий элемент и вставляем его<br />
 31 # в правильное (по сортировке) место<br />
 32 # среди цепочки предыдущих отсортированных элементов<br />
 33<br />
 34 # двигаясь в обратном направлении от текущего положения<br />
 35 # и сдвигая элементы с большим значением<br />
 36 # для получения места для текущего элемента в правильном<br />
 37 # месте (в уже частично отсортированном массиве)<br />
 38<br />
 39 for i = 1 to d[?] - 1<br />
 40 &nbsp;&nbsp;&nbsp;&nbsp;currentvalue = d[i]<br />
 41 &nbsp;&nbsp;&nbsp;&nbsp;j = i - 1<br />
 42 &nbsp;&nbsp;&nbsp;&nbsp;done = false<br />
 43 &nbsp;&nbsp;&nbsp;&nbsp;do<br />
 44 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if d[j] > currentvalue then<br />
 45 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d[j+1] = d[j]<br />
 46 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j = j - 1<br />
 47 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if j &lt; 0 then done = true<br />
 48 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br />
 49 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;done = true<br />
 50 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;endif<br />
 51 &nbsp;&nbsp;&nbsp;&nbsp;until done<br />
 52 &nbsp;&nbsp;&nbsp;&nbsp;d[j+1] = currentvalue<br />
 53 next i<br />
 54 return<br />
</code><br />
Программа 98. Сортировка вставкой.</p>
<table>
<tr>
<td align="center"><a href="http://freeschool.altlinux.ru/wp-content/uploads/2010/11/explore.png"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2010/11/explore.png" alt="" title="Попробуй, исследуй!" width="80" height="80" class="aligncenter size-full wp-image-3482" /></a></td>
<td>Перепишите программу 98 используя связные списки как в программе 96
                </td>
</tr>
</table>
<table>
<tr>
<td align="center"><a href="http://freeschool.altlinux.ru/wp-content/uploads/2010/11/explore.png"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2010/11/explore.png" alt="" title="Попробуй, исследуй!" width="80" height="80" class="aligncenter size-full wp-image-3482" /></a></td>
<td>Узнайте про другие алгоритмы сортировки и реализуйте их на BASIC-256
                </td>
</tr>
</table>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
 <a name="ref1"></a><a href="#m1"><sup>1</sup></a> Можно сравнить стек с магазином патронов у автомата или автоматического пистолета (<em>прим. переводчика</em>)</p>
<p><a name="ref2"></a><a href="#m2"><sup>2</sup></a> В данном случае слово «push» можно перевести как «продавить», что очевидно, если сравнивать стек с магазином, а добавление информации с помещением патрона в магазин. (<em>прим. переводчика</em>)</p>
<p><a name="ref3"></a><a href="#m3"><sup>3</sup></a> вытолкнуть (<em>прим. переводчика</em>)</p>
<p>============================<br />
<a name="basic"></a><br />
<h3>Где скачать BASIC-256:</h3>
<p><strong>Для дистрибутивов ALT Linux</strong></p>
<ul>
<li>ветка 4.0 <a href="http://ftp.altlinux.org/pub/distributions/ALTLinux/4.0/branch/files/i586/RPMS/basic256-0.9.6-alt5.M40.1.i586.rpm">basic256-0.9.6-alt5.M40.1.i586.rpm</a></li>
<li>ветка 4.1 <a href="http://ftp.altlinux.org/pub/distributions/ALTLinux/4.1/branch/files/i586/RPMS/basic256-0.9.6-alt5.M41.1.i586.rpm">basic256-0.9.6-alt5.M41.1.i586.rpm</a></li>
<li>ветка p5 <a href="http://ftp.altlinux.org/pub/distributions/ALTLinux/p5/branch/files/i586/RPMS/basic256-0.9.6-alt5.M50P.1.i586.rpm">basic256-0.9.6-alt5.M50P.1.i586.rpm</a></li>
<li>ветка 5.1 <a href="http://ftp.altlinux.org/pub/distributions/ALTLinux/5.1/branch/files/i586/RPMS/basic256-0.9.6-alt5.M51.1.i586.rpm">basic256-0.9.6-alt5.M51.1.i586.rpm</a></li>
</ul>
<p><strong>Windows версия</strong><br />
<a href="http://basic256.org">http://basic256.org</a> (<a href="http://www.sourceforge.net/projects/kidbasic">http://www.sourceforge.net/projects/kidbasic</a>)</p>
<h3> Как установить BASIC-256 в Linux</h3>
<p><strong>Для Альт Линукс:</strong> настроить репозиторий и обновить/установить пакет через synaptic или apt<br />
<strong>Для rpm-based дистрибутивов:</strong> rpm -Uvh &lt;имя_пакета&gt;.rpm<br />
</ljcut></p>
]]></content:encoded>
			<wfw:commentRss>http://freeschool.altlinux.ru/?feed=rss2&#038;p=4015</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Альт Линукс в Санкт-Петербурге 24-25 февраля</title>
		<link>http://freeschool.altlinux.ru/?p=4089</link>
		<comments>http://freeschool.altlinux.ru/?p=4089#comments</comments>
		<pubDate>Tue, 22 Feb 2011 10:04:07 +0000</pubDate>
		<dc:creator><![CDATA[ALT Linux]]></dc:creator>
				<category><![CDATA[Конференции, семинары и выставки]]></category>
		<category><![CDATA[Санкт-Петербург]]></category>
		<category><![CDATA[Смирнов]]></category>
		<category><![CDATA[Хахаев]]></category>
		<category><![CDATA[Черный]]></category>

		<guid isPermaLink="false">http://freeschool.altlinux.ru/?p=4089</guid>
		<description><![CDATA[Компания Альт Линукс примет участие в 3-й научно-практической конференции «Проблемы и перспективы внедрения свободно распространяемого программного обеспечения в образовательных учреждениях Санкт-Петербурга». Конференция пройдет 24-25 февраля 2011 года в г. Санкт-Петербург. 24 февраля по адресу: Вознесенский пр., 34А (РЦОКОиИТ) с 14.00 – 18.00, а 25 февраля &#8212; Миргородская д. 16 с 11:00 &#8212; 14:00 часов. В [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Компания Альт Линукс примет участие в 3-й научно-практической конференции<a href="http://www.rcokoit.ru/confspo2011.html"> «Проблемы и перспективы внедрения свободно распространяемого программного обеспечения в образовательных учреждениях Санкт-Петербурга»</a>.</p>
<p>Конференция пройдет 24-25 февраля 2011 года в г. Санкт-Петербург. 24 февраля по адресу: Вознесенский пр., 34А (РЦОКОиИТ) с 14.00 – 18.00, а 25 февраля &mdash; Миргородская д. 16 с 11:00 &mdash; 14:00 часов.<br />
В конференции примут участие как представители компаний, занимающихся разработкой и внедрением свободного программного обеспечения, так и представители различных учебных заведений. </p>
<p>Генеральный директор компании ООО &#171;Альт Линукс&#187;, Алексей Смирнов выступит с докладом &#171;Национальная программная платформа и образование&#187;, а начальник отдела образовательных проектов Владимир Черный расскажет о &#171;Новых возможностях комплекта ПСПО (Альт Линукс 5.0 Школьный)&#187;. От петербуржцев с докладом выступит руководитель Авторизованного учебного центра Альт Линукс при <a href="http://www.altlinux.ru/partners/partners-list/trainers/">РХГА («Русская Христианская Гуманитарная Академия»)</a>, Иван Хахаев. Он расскажет об опыте использования и особенностях методической поддержки СПО в образовании.</p>
<p>В рамках конференции, 24 февраля состоится серия мастер-классов. Один из них, на тему &#171;Установка, настройка и использование школьного сервера на основе ОС ALT Linux&#187; будет проведен Алексеем Авдеевым, инженером петербургского отделения компании Альт Линукс.</p>
<p>Подробнее о конференции: <a href="http://www.rcokoit.ru/confspo2011.html">http://www.rcokoit.ru/confspo2011.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://freeschool.altlinux.ru/?feed=rss2&#038;p=4089</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>BASIC-256. Глава 16</title>
		<link>http://freeschool.altlinux.ru/?p=3992</link>
		<comments>http://freeschool.altlinux.ru/?p=3992#comments</comments>
		<pubDate>Fri, 18 Feb 2011 00:00:28 +0000</pubDate>
		<dc:creator><![CDATA[Владимир Черный]]></dc:creator>
				<category><![CDATA[Методические материалы]]></category>
		<category><![CDATA[BASIC-256]]></category>
		<category><![CDATA[Ирюпин]]></category>
		<category><![CDATA[Черный]]></category>

		<guid isPermaLink="false">http://freeschool.altlinux.ru/?p=3992</guid>
		<description><![CDATA[Продолжаем публиковать перевод книги Джеймса Рено. Эту главу перевел Владимир Черный. Оглавление: Глава 1: Знакомство с BASIC-256 – cкажи «Привет» Глава 2: Рисуем основные фигуры Глава 3: Звуки и музыка Глава 4: Мыслить как программист Глава 5: Программа задает вам вопросы Глава 6: Сравнения, сравнения, сравнения Глава 7: Циклы и счетчики — повторяем снова и [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Продолжаем публиковать перевод <a href="http://basicbook.org/download">книги Джеймса Рено</a>. Эту главу перевел Владимир Черный.<br />
Оглавление:</p>
<ul>
<li><a href="http://freeschool.altlinux.ru/?p=3401">Глава 1: Знакомство с BASIC-256 – cкажи «Привет»</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3461">Глава 2: Рисуем основные фигуры</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3504">Глава 3: Звуки и музыка</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3569#g4">Глава 4: Мыслить как программист</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3569#g5">Глава 5: Программа задает вам вопросы</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3643">Глава 6: Сравнения, сравнения, сравнения</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3689">Глава 7: Циклы и счетчики — повторяем снова и снова</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3719">Глава 8: Графика на заказ — создание фигур своими руками</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3755">Глава 9: Подпрограммы — повторное использование кода</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3805">Глава 10: Управляем мышкой, перемещаем объекты</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3842">Глава 11: Использование клавиатуры для управления программой</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3867">Глава 12: Картинки, музыка и спрайты</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3906">Глава 13 Массивы — коллекции данных</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3930">Глава 14 Математика &mdash; развлечемся с числами</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3988">Глава 15 Работаем со строками</a></li>
</ul>
<p><a href="#basic">Где взять BASIC-256</a><br />
<span id="more-3992"></span><br />
<ljcut></p>
<h2>Глава 16 Файлы. Сохраним информацию на будущее</h2>
<p>Мы исследовали оперативную память компьютера с помощью переменных и массивов, но как сохранить данные надолго? Существует много разных способов долгосрочного хранения данных.</p>
<p>BASIC-256 поддерживает запись и чтение информации из файлов на вашем жестком диске. Этот процесс ввода и вывода информации часто обозначают I/O<a name="m1"></a><a href="#ref1"><sup>1</sup></a>.</p>
<p>Эта глава покажет как читать данные из файла и как их потом туда записывать для долгосрочного хранения.</p>
<h3>Чтение строк из файла</h3>
<p>В первой программе этой главы вы увидите много новых операторов и констант (постоянных) которые нужны для управления данными.<br />
<code><br />
 &nbsp;1 # readfile.kbs<br />
 &nbsp;2 input &quot;имя файла&gt;&quot;, fn$<br />
 &nbsp;3 if not exists(fn$) then<br />
 &nbsp;4 &nbsp;&nbsp;&nbsp;&nbsp;print fn$ + &quot; не существует.&quot;<br />
 &nbsp;5 &nbsp;&nbsp;&nbsp;&nbsp;end<br />
 &nbsp;6 end if<br />
 &nbsp;7 #<br />
 &nbsp;8 n = 0<br />
 &nbsp;9 open fn$<br />
 10 while not eof<br />
 11 &nbsp;&nbsp;&nbsp;&nbsp;l$ = readline<br />
 12 &nbsp;&nbsp;&nbsp;&nbsp;n = n + 1<br />
 13 &nbsp;&nbsp;&nbsp;&nbsp;print n + &quot; &quot; + l$<br />
 14 end while<br />
 15 #<br />
 16 print &quot;Файл &quot; + fn$ + &quot; содержит &quot; + size + &quot; байт.&quot;<br />
 17 close<br />
</code></p>
<p>Программа 90 Чтение строк из файла<br />
<code><br />
имя файла&gt;test_ru.txt<br />
1 Настало время испытать<br />
2 силу человеческой души!<br />
3 - Томас Пейн<br />
Файл test_ru.txt содержит 110 байт.<br />
</code><br />
Пример вывода программы 90 Чтение строк из файла</p>
<table>
<tr>
<td align="center"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2010/11/new_concept.png" alt="" title="Новое понятие" width="80" height="80" class="aligncenter size-full wp-image-3467" /></td>
<td><strong>exist</strong>(<i>выражение</i>)</p>
<p>  Ищет на компьютере файл, имя которого определено переменной <i>выражение</i>. Имя диска<a name="m2"></a><a href="#ref2"><sup>2</sup></a> и путь должны быть указаны, как часть имени файла. Если они опущены, происходит поиск по текущему рабочему каталогу.</p>
<p>  Возвращает <i>true</i> (истина или 1) если файл существует и <i>false</i> (ложь или 0) в противном случае.
  </td>
</tr>
</table>
<table>
<tr>
<td align="center"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2010/11/new_concept.png" alt="" title="Новое понятие" width="80" height="80" class="aligncenter size-full wp-image-3467" /></td>
<td><strong>open</strong><i>выражение</i><br />
  <strong>open</strong><i> (</i><i>выражение</i><i>)</i><br />
  <strong>open</strong><i> номер_файла, </i><i>выражение</i><br />
  <strong>open</strong><i> (номер_файла, </i><i>выражение</i><i>)</i></p>
<p>  Открывает указанный переменной <i>выражение</i> файл, задавая ему указанный <i>номер_файла</i>. Если файл не существует, создается новый файл так, что в него можно добавлять информацию (см. операторы <b>write</b> и <b>writeln</b>). Не забудьте выполнить команду <b>close</b>, когда ваша программа закончит работать с файлом.</p>
<p>  BASIC-256 может открыть одновременно не более восьми (8) файлов с номерами от 0 до 7. Если номер файла не указан, он открывается с номером нуль (0).
  </td>
</tr>
</table>
<table>
<tr>
<td align="center"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2010/11/new_concept.png" alt="" title="Новое понятие" width="80" height="80" class="aligncenter size-full wp-image-3467" /></td>
<td><strong>eof</strong><br />
  <strong>eof</strong> ()<br />
  <strong>eof</strong>(<i>номер_файла</i>)<br/></p>
<p>  Функция <strong>eof</strong> возвращает истину (<i>true</i>) если достигнут конец файла в процессе чтения и ложь (<i>false</i>) в если еще есть не прочтенные данные.</p>
<p>  Если <i>номер_файла</i> не указан используется значение нуль (0).
  </td>
</tr>
</table>
<table>
<tr>
<td align="center"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2010/11/new_concept.png" alt="" title="Новое понятие" width="80" height="80" class="aligncenter size-full wp-image-3467" /></td>
<td><strong>readline</strong><br />
  <strong>readline</strong> ()<br />
  <strong>readline</strong> (<i>номер_файла</i>)</p>
<p>  Возвращает прочитанную из файла строку. Если достигнут конец файла [<b>eof</b>(<i>номер_файла</i>)=<i>true</i>], тогда функция возвращает пустую строку (&quot;&quot;)</p>
<p>  Если <i>номер_файла</i> не указан используется значение нуль (0).
  </td>
</tr>
</table>
<table>
<tr>
<td align="center"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2010/11/new_concept.png" alt="" title="Новое понятие" width="80" height="80" class="aligncenter size-full wp-image-3467" /></td>
<td><strong>size</strong><br />
  <strong>size</strong> ()<br />
  <strong>size</strong>(<i>номер_файла</i>)</p>
<p>  Возвращает длину файла в байтах.</p>
<p>  Если <i>номер_файла</i> не указан используется значение нуль (0).
  </td>
</tr>
</table>
<table>
<tr>
<td align="center"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2010/11/new_concept.png" alt="" title="Новое понятие" width="80" height="80" class="aligncenter size-full wp-image-3467" /></td>
<td><strong>close</strong><br />
  <strong>close ()</strong><br />
  <strong>close</strong>(<i>номер_файла</i>)</p>
<p>  Функция <strong>close</strong> закрывает ввод/вывод в файл и позволяет другому файлу использовать тот же номер.</p>
<p>  Если <i>номер_файла</i> не указан используется значение нуль (0).
  </td>
</tr>
</table>
<h3>Запись строк в файл</h3>
<p>В программе 90 мы видели, как читать информацию из файла. Следующие две программы демонстрируют различные варианты записи информации в файл. В программе 91 мы открываем файл для записи стирая всю имеющуюся там ранее информацию, а в программе 92 добавляем новые строчки в конец файла, сохраняя предыдущую информацию.</p>
<p><code><br />
 &nbsp;1 # resetwrite.kbs<br />
 &nbsp;2 open &quot;resetwrite.dat&quot;<br />
 &nbsp;3<br />
 &nbsp;4 print &quot;введите пустую строку для завершения записи&quot;<br />
 &nbsp;5<br />
 &nbsp;6 # стираем данные из файла (reset) и начинаем туда писать сначала<br />
 &nbsp;7 reset<br />
 &nbsp;8 repeat:<br />
 &nbsp;9 input &quot;&gt;&quot;, l$<br />
 10 if l$ &lt;&gt; &quot;&quot; then<br />
 11 &nbsp;&nbsp;&nbsp;&nbsp;writeline l$<br />
 12 &nbsp;&nbsp;&nbsp;&nbsp;goto repeat<br />
 13 end if<br />
 14<br />
 15 # переходим к началу файла и отображаем содержимое<br />
 16 seek 0<br />
 17 k = 0<br />
 18 while not eof()<br />
 19 &nbsp;&nbsp;&nbsp;&nbsp;k = k + 1<br />
 20 &nbsp;&nbsp;&nbsp;&nbsp;print k + &quot; &quot; + readline()<br />
 21 end while<br />
 22<br />
 23 close<br />
 24 end<br />
</code><br />
Программа 91 Очищение файла и запись.<br />
<code><br />
введите пустую строку для завершения записи<br />
&gt;Вот простая информация<br />
&gt;которую я записал в файл<br />
&gt;раз, два, три, четыре пять<br />
&gt;Я иду искать!<br />
&gt;<br />
1 Вот простая информация<br />
2 которую я записал в файл<br />
3 раз, два, три, четыре пять<br />
4 Я иду искать!<br />
</code><br />
Пример вывода программы 91 Очищение файла и запись.</p>
<table>
<tr>
<td align="center"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2010/11/new_concept.png" alt="" title="Новое понятие" width="80" height="80" class="aligncenter size-full wp-image-3467" /></td>
<td><strong>reset</strong><br />
  <strong>reset ()</strong><br />
  <strong>reset </strong><i>номер_файла</i><br />
  <strong>reset </strong>(<i>номер_файла</i>)</p>
<p>  Стирает все данные в открытом файле, и перемещает указатель файла на начало.</p>
<p>  Если <i>номер_файла</i> не указан, используется нулевой номер (0).
  </td>
</tr>
</table>
<table>
<tr>
<td align="center"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2010/11/new_concept.png" alt="" title="Новое понятие" width="80" height="80" class="aligncenter size-full wp-image-3467" /></td>
<td><strong>seek</strong><i>выражение</i><br />
  <strong>seek</strong>(<i>выражение</i>)<br />
  <strong>seek</strong> <i>номер_файла, выражение</i><br />
  <strong>seek</strong>(<i>номер_файла, выражение</i>)</p>
<p>  Перемещает указатель чтения или записи файла в указанную позицию. Для перемещения указателя в начало файла используйте значение нуль (0). Для перемещения указателя в конец файла используйте значение функции <strong>size</strong>(). </p>
<p>  Если <i>номер_файла</i> не указан, используется нулевой номер (0).
  </td>
</tr>
</table>
<table>
<tr>
<td align="center"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2010/11/new_concept.png" alt="" title="Новое понятие" width="80" height="80" class="aligncenter size-full wp-image-3467" /></td>
<td><strong>writeline</strong><i>выражение</i><br />
  <strong>writeline</strong>(<i>выражение</i>)<br />
  <strong>writeline</strong> <i>номер_файла, выражение</i><br />
  <strong>writeline</strong> (<i>номер_файла, выражение</i>)</p>
<p>  Записывает значение аргумента <i>выражение</i> в открытый файл и добавляет символ конца строки. Указатель файла перемещается в конец записи так, что следующая команда записи запишет данные непосредственно за этими.</p>
<p>  Если <i>номер_файла</i> не указан, используется нулевой номер (0).
  </td>
</tr>
</table>
<p><code><br />
 &nbsp;1 # appendwrite.kbs<br />
 &nbsp;2 open &quot;appendwrite.dat&quot;<br />
 &nbsp;3<br />
 &nbsp;4 print &quot;введите пустую строку для завершения записи&quot;<br />
 &nbsp;5<br />
 &nbsp;6 # перемещаем указатель файла в конец и добавляем записи<br />
 &nbsp;7 seek size<br />
 &nbsp;8 repeat:<br />
 &nbsp;9 input &quot;&gt;&quot;, l$<br />
 10 if l$ &lt;&gt; &quot;&quot; then<br />
 11 &nbsp;&nbsp;&nbsp;&nbsp;writeline l$<br />
 12 &nbsp;&nbsp;&nbsp;&nbsp;goto repeat<br />
 13 end if<br />
 14<br />
 15 # перемещаем указательк началу файла, чтобы вывести его содержимое<br />
 16 seek 0<br />
 17 k = 0<br />
 18 while not eof()<br />
 19 &nbsp;&nbsp;&nbsp;&nbsp;k = k + 1<br />
 20 &nbsp;&nbsp;&nbsp;&nbsp;print k + &quot; &quot; + readline()<br />
 21 end while<br />
 22<br />
 23 close<br />
 24 end<br />
</code></p>
<p>Программа 92 Дописываем строчки в файл<br />
<code><br />
введите пустую строку для завершения записи<br />
&gt;sed sed sed<br />
&gt;vim vim vim<br />
&gt;</p>
<p>1 bar bar bar<br />
2 foo foo foo<br />
3 grap grap grap<br />
4 sed sed sed<br />
5 vim vim vim<br />
</code><br />
Пример вывода программы 92 Дописываем строчки в файл</p>
<h3>Функция read() и оператор write</h3>
<p>В первых трех программах этой главы мы обсуждали функцию <strong>readline</strong>() и оператор <strong>writeline</strong>. Вот еще два других способа читать из файла и писать в файл: функция <strong>read</strong>() и оператор <strong>write</strong>.</p>
<table>
<tr>
<td align="center"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2010/11/new_concept.png" alt="" title="Новое понятие" width="80" height="80" class="aligncenter size-full wp-image-3467" /></td>
<td><strong>read</strong><br />
  <strong>read</strong> ()<br />
  <strong>read</strong> (<i>номер_файла</i>)</p>
<p>  Читает следующее слово или число (токен) из файла. Токены отделяются друг от друга пробелом, табуляцией или символом конца строки. Множественные пробельные элементы воспринимаются как один.</p>
<p>  Если <i>номер_файла</i> не указан, используется нулевой номер (0).
  </td>
</tr>
</table>
<table>
<tr>
<td align="center"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2010/11/new_concept.png" alt="" title="Новое понятие" width="80" height="80" class="aligncenter size-full wp-image-3467" /></td>
<td><strong>write</strong> <i>выражение</i><br />
  <strong>write</strong> (<i>выражение</i>)<br />
  <strong>write</strong> <i>номер_файла, выражение</i><br />
  <strong>write</strong> (<i>номер_файла, выражение</i>)</p>
<p>  Записывает значение аргумента <i>выражение</i> в открытый файл и не добавляет символ конца строки. </p>
<p>  Если <i>номер_файла</i> не указан, используется нулевой номер (0).
  </td>
</tr>
</table>
<table>
<tr>
<td align="center"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2010/11/big_program.png" alt="" title="Большая программа" width="80" height="80" class="aligncenter size-full wp-image-3493" />
                </td>
<td>Эта программа использует простой текстовый файл имитируя телефонную записную книжку.
                </td>
</tr>
</table>
<p><code><br />
 &nbsp;1 # phonelist.kbs<br />
 &nbsp;2 # Добавляем номер телефона в список и показываем<br />
 &nbsp;3 filename$ = &quot;phonelist.txt&quot;<br />
 &nbsp;4<br />
 &nbsp;5 print &quot;phonelist.kbs - Управление списком телефонов.&quot;<br />
 &nbsp;6 do<br />
 &nbsp;7 input &quot;Добавить, Посмотреть, Закончить (a/l/q)?&quot;,action$<br />
 &nbsp;8 if left(lower(action$),1) = &quot;a&quot; then gosub addrecord<br />
 &nbsp;9 if left(lower(action$),1) = &quot;l&quot; then gosub listfile<br />
 10 until left(lower(action$),1) = &quot;q&quot;<br />
 11 end<br />
 12<br />
 13 listfile:<br />
 14 if exists(filename$) then<br />
 15 &nbsp;&nbsp;&nbsp;&nbsp;# отображаем список имен и телефонов из файла<br />
 16 &nbsp;&nbsp;&nbsp;&nbsp;open filename$<br />
 17 &nbsp;&nbsp;&nbsp;&nbsp;print &quot;Файл имеет размер &quot; + size + &quot; байт&quot;<br />
 18 &nbsp;&nbsp;&nbsp;&nbsp;while not eof<br />
 19 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# читаем следующую строки из файла и печатаем ее<br />
 20 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print readline<br />
 21 &nbsp;&nbsp;&nbsp;&nbsp;end while<br />
 22 &nbsp;&nbsp;&nbsp;&nbsp;close<br />
 23 else<br />
 24 &nbsp;&nbsp;&nbsp;&nbsp;print &quot;В файле нет записей.  Добавьте первую.&quot;<br />
 25 end if<br />
 26 return<br />
 27<br />
 28 addrecord:<br />
 29 input &quot;Имя?&quot;, name$<br />
 30 input &quot;Номер телефона?&quot;, phone$<br />
 31 open filename$<br />
 32 # ищем конец файла<br />
 33 seek size()<br />
 34 # мы достигли конца файла, - добавляем строку<br />
 35 writeline name$ + &quot;, &quot; + phone$<br />
 36 close<br />
 37 return<br />
</code></p>
<p>Программа 93 Большая программа &mdash; Телефонная книжка<br />
<code><br />
phonelist.kbs - Управление списком телефонов.<br />
Добавить, Посмотреть, Закончить (a/l/q)?l<br />
Файл имеет размер 76 байт<br />
Аня, 555-5555<br />
Валя, 555-7777<br />
Дима, 555-3333<br />
Паша, 555-0987<br />
Петя, 234-3445<br />
Добавить, Посмотреть, Закончить (a/l/q)?a<br />
Имя?Вася<br />
Номер телефона?345-4556<br />
Добавить, Посмотреть, Закончить (a/l/q)?l<br />
Файл имеет размер 95 байт<br />
Аня, 555-5555<br />
Валя, 555-7777<br />
Дима, 555-3333<br />
Паша, 555-0987<br />
Петя, 234-3445<br />
Вася, 345-4556<br />
Добавить, Посмотреть, Закончить (a/l/q)?q<br />
</code></p>
<p>Пример вывода программы 93 Большая программа &mdash; Телефонная книжка</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
 <a name="ref1"></a><a href="#m1"><sup>1</sup></a> I/O &mdash; от английских слов Input (ввод) и Output (вывод)</p>
<p> <a name="ref2"></a><a href="#m2"><sup>2</sup></a>Имя диска имеет смысл только на операционных системах Windows<sup>TM</sup> (прим. редактора)</p>
<p>============================<br />
<a name="basic"></a><br />
<h3>Где скачать BASIC-256:</h3>
<p><strong>Для дистрибутивов ALT Linux</strong></p>
<ul>
<li>ветка 4.0 <a href="http://ftp.altlinux.org/pub/distributions/ALTLinux/4.0/branch/files/i586/RPMS/basic256-0.9.6-alt5.M40.1.i586.rpm">basic256-0.9.6-alt5.M40.1.i586.rpm</a></li>
<li>ветка 4.1 <a href="http://ftp.altlinux.org/pub/distributions/ALTLinux/4.1/branch/files/i586/RPMS/basic256-0.9.6-alt5.M41.1.i586.rpm">basic256-0.9.6-alt5.M41.1.i586.rpm</a></li>
<li>ветка p5 <a href="http://ftp.altlinux.org/pub/distributions/ALTLinux/p5/branch/files/i586/RPMS/basic256-0.9.6-alt5.M50P.1.i586.rpm">basic256-0.9.6-alt5.M50P.1.i586.rpm</a></li>
<li>ветка 5.1 <a href="http://ftp.altlinux.org/pub/distributions/ALTLinux/5.1/branch/files/i586/RPMS/basic256-0.9.6-alt5.M51.1.i586.rpm">basic256-0.9.6-alt5.M51.1.i586.rpm</a></li>
</ul>
<p><strong>Windows версия</strong><br />
<a href="http://basic256.org">http://basic256.org</a> (<a href="http://www.sourceforge.net/projects/kidbasic">http://www.sourceforge.net/projects/kidbasic</a>)</p>
<h3> Как установить BASIC-256 в Linux</h3>
<p><strong>Для Альт Линукс:</strong> настроить репозиторий и обновить/установить пакет через synaptic или apt<br />
<strong>Для rpm-based дистрибутивов:</strong> rpm -Uvh &lt;имя_пакета&gt;.rpm<br />
</ljcut></p>
]]></content:encoded>
			<wfw:commentRss>http://freeschool.altlinux.ru/?feed=rss2&#038;p=3992</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>BASIC-256. Глава 15</title>
		<link>http://freeschool.altlinux.ru/?p=3988</link>
		<comments>http://freeschool.altlinux.ru/?p=3988#comments</comments>
		<pubDate>Fri, 11 Feb 2011 00:00:09 +0000</pubDate>
		<dc:creator><![CDATA[Владимир Черный]]></dc:creator>
				<category><![CDATA[Методические материалы]]></category>
		<category><![CDATA[BASIC-256]]></category>
		<category><![CDATA[Ирюпин]]></category>
		<category><![CDATA[Черный]]></category>

		<guid isPermaLink="false">http://freeschool.altlinux.ru/?p=3988</guid>
		<description><![CDATA[Продолжаем публиковать перевод книги Джеймса Рено. Эту главу перевел Владимир Черный. Оглавление: Глава 1: Знакомство с BASIC-256 – cкажи «Привет» Глава 2: Рисуем основные фигуры Глава 3: Звуки и музыка Глава 4: Мыслить как программист Глава 5: Программа задает вам вопросы Глава 6: Сравнения, сравнения, сравнения Глава 7: Циклы и счетчики — повторяем снова и [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Продолжаем публиковать перевод <a href="http://basicbook.org/download">книги Джеймса Рено</a>. Эту главу перевел Владимир Черный.<br />
Оглавление:</p>
<ul>
<li><a href="http://freeschool.altlinux.ru/?p=3401">Глава 1: Знакомство с BASIC-256 – cкажи «Привет»</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3461">Глава 2: Рисуем основные фигуры</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3504">Глава 3: Звуки и музыка</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3569#g4">Глава 4: Мыслить как программист</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3569#g5">Глава 5: Программа задает вам вопросы</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3643">Глава 6: Сравнения, сравнения, сравнения</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3689">Глава 7: Циклы и счетчики — повторяем снова и снова</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3719">Глава 8: Графика на заказ — создание фигур своими руками</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3755">Глава 9: Подпрограммы — повторное использование кода</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3805">Глава 10: Управляем мышкой, перемещаем объекты</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3842">Глава 11: Использование клавиатуры для управления программой</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3867">Глава 12: Картинки, музыка и спрайты</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3906">Глава 13 Массивы — коллекции данных</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3930">Глава 14 Математика &mdash; развлечемся с числами</a></li>
</ul>
<p><a href="#basic">Где взять BASIC-256</a><br />
<span id="more-3988"></span><br />
<ljcut></p>
<h2>Глава 15 Работаем со строками</h2>
<p>Мы использовали строки, чтобы хранить нечисловую информацию, формировать вывод на экран и получать вводимые пользователем символы. В главе 11 мы использовали Unicode значения отдельных символов для построения строк.</p>
<p>В этой главе мы узнаем несколько новых функций для действий со строками.</p>
<h3>Строковые функции</h3>
<p>BASIC-256 имеет восемь стандартных функций для преобразования строк, которые собраны в таблице 7</p>
<table border="1" width=100% CELLPADDING=4 CELLSPACING=0>
<tr>
<th>Функция</th>
<th>Описание</td>
</tr>
<tr>
<td>string(<i>выражение</i>)</td>
<td> приводит <i>выражение</i> (строковое или целое или дробь) к строке </td>
</tr>
<tr>
<td> length(<i>строка</i>) </td>
<td> возвращает длину строки </td>
</tr>
<tr>
<td> left(<i>строка, длина</i>) </td>
<td> возвращает часть строки заданной длины, отсчитывая слева </td>
</tr>
<tr>
<td> right(<i>строка, длина</i>) </td>
<td> возвращает часть строки заданной длины, отсчитывая справа </td>
</tr>
<tr>
<td> mid(<i>строка, начало, длина</i>) </td>
<td> возвращает среднюю часть строки заданной длины от позиции начало </td>
</tr>
<tr>
<td> upper(<i>выражение</i>) </td>
<td> Возвращает строку в верхнем регистре (заглавные буквы) </td>
</tr>
<tr>
<td> lower(<i>выражение</i>) </td>
<td> Возвращает строку в нижнем регистре (строчные буквы) </td>
</tr>
<tr>
<td> instr(<i>стог, иголка</i>) </td>
<td> Ищет <i>иголку</i> в <i>стоге</i> (сена) и возвращает ее позицию. </td>
</tr>
</table>
<p></p>
<h3>Функция string()</h3>
<p>Функция <strong>string</strong>() берет выражение в любом формате и преобразовывает его в строку. Она очень удобна для преобразования целых или дробных чисел в символы так, что с ними можно работать как со строками.<br />
<code><br />
 1 # string.kbs<br />
 2 a$ = string(10 + 13)<br />
 3 print a$<br />
 4 b$ = string(2 * pi)<br />
 5 print b$<br />
</code><br />
Программа 84 Функция string()<br />
<code><br />
23<br />
6,283185<br />
</code><br />
Пример вывода программы 84 Функция string()</p>
<table>
<tr>
<td align="center"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2010/11/new_concept.png" alt="" title="Новое понятие" width="80" height="80" class="aligncenter size-full wp-image-3467" /></td>
<td><strong>string</strong>(<i>выражение</i>)<br />
Преобразует <i>выражение</i> (строку, целое или дробное число) в строку
  </td>
</tr>
</table>
<h3>Функция length()</h3>
<p>Функция length() возвращает количество символов (букв, знаков) входящих в строку.<br />
<code><br />
 1 # length.kbs<br />
 2 # печатает 7, 0, и 22<br />
 3 print length(&quot;Привет!&quot;)<br />
 4 print length(&quot;&quot;)<br />
 5 print length(&quot;Программировать круто!&quot;)<br />
</code><br />
Программа 85 Функция length()<br />
<code><br />
7<br />
0<br />
22<br />
<code><br />
Вывод программы 85 Функция length()</p>
<table>
<tr>
<td align="center"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2010/11/new_concept.png" alt="" title="Новое понятие" width="80" height="80" class="aligncenter size-full wp-image-3467" /></td>
<td><strong>length</strong>(<i>выражение</i>)</p>
<p>Принимает строковое <i>выражение</i> и возвращает его длину. Для пустой строки (&quot;&quot;) возвращает нуль (0).
  </td>
</tr>
</table>
<h3>Функции left(), right() и mid()</h3>
<p>Функции left(), right() и mid() извлекают из строки определенную подстроку (часть строки).<br />
<code><br />
 1 # leftrightmid.kbs<br />
 2 a$ = &quot;автомашина&quot;<br />
 3 # печатает &quot;авто&quot;<br />
 4 print left(a$,4)<br />
 5 # печатает &quot;на&quot;<br />
 6 print right(a$,2)<br />
 7 # печатает &quot;маш&quot; и &quot;шина&quot;<br />
 8 print mid(a$,5,3)<br />
 9 print mid(a$,7,9)<br />
</code><br />
Программа 86 Функции left(), right() и mid()<br />
<code><br />
авто<br />
на<br />
маш<br />
шина<br />
</code><br />
Пример вывода программы 86 Функции left(), right() и mid()</p>
<table>
<tr>
<td align="center"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2010/11/new_concept.png" alt="" title="Новое понятие" width="80" height="80" class="aligncenter size-full wp-image-3467" /></td>
<td><strong>left</strong>(<i>строка, длина</i>)</p>
<p>Возвращает подстроку заданной длины, начиная слева. Если <i>длина</i> равна или больше длины переменной <i>строка</i>, то только <i>строка</i> и будет возвращена.
  </td>
</tr>
</table>
<table>
<tr>
<td align="center"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2010/11/new_concept.png" alt="" title="Новое понятие" width="80" height="80" class="aligncenter size-full wp-image-3467" /></td>
<td><strong>right</strong>(<i>строка, длина</i>)</p>
<p>Возвращает подстроку заданной длины, начиная справа. Если <i>длина</i> равна или больше длины переменной <i>строка</i>, то только <i>строка</i> и будет возвращена.
  </td>
</tr>
</table>
<table>
<tr>
<td align="center"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2010/11/new_concept.png" alt="" title="Новое понятие" width="80" height="80" class="aligncenter size-full wp-image-3467" /></td>
<td><strong>mid</strong>(<i>строка, начало, длина</i>)</p>
<p>Возвращает подстроку заданной длины переменной <i>строка</i> из ее середины. Параметр <i>начало</i> указывает, где эта подстрока должна начаться (1 = начало строки)<a name="m1"></a><a href="#ref1"><sup>1</sup></a>
  </td>
</tr>
</table>
<h3>Функции upper() и lower()</h3>
<p>Функции <strong>upper</strong>() и <strong>lower</strong>() просто возвращают строку состоящую из заглавных (upper) или строчных (lower) букв. Эти функции наиболее полезны, когда надо сравнить значения двух строк и вам не важно в каком регистре они написаны.<br />
<code><br />
 1 # upperlower.kbs<br />
 2 a$ = &quot;Привет!&quot;<br />
 3 # печатает &quot;привет!&quot;<br />
 4 print lower(a$)<br />
 5 # печатает &quot;ПРИВЕТ!&quot;<br />
 6 print upper(a$)<br />
</code><br />
Программа 87 Функции upper() и lower()<br />
<code><br />
привет!<br />
ПРИВЕТ!<br />
</code><br />
Пример вывода программы 87 Функции upper() и lower()<a name="m2"></a><a href="#ref2"><sup>2</sup></a></p>
<table>
<tr>
<td align="center"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2010/11/new_concept.png" alt="" title="Новое понятие" width="80" height="80" class="aligncenter size-full wp-image-3467" /></td>
<td><strong>lower</strong>(<i>строка</i>)<br />
<strong>upper</strong>(<i>строка</i>)</p>
<p>Возвращает копию переменной <i>строка</i>, в которой все символы заменены на строчные (lower) или заглавные (upper) буквы. Остальные (не буквы) символы возвращаются без изменений.
  </td>
</tr>
</table>
<h3>Функция instr()</h3>
<p>Функция <strong>instr()</strong> ищет первое вхождение подстроки в заданную строку и возвращает местоположение первого символа подстроки в строке. Если подстрока отсутствует в строке, возвращается нуль (0).<br />
<code><br />
 1 # instr.kbs<br />
 2 a$ = &quot;автомашина&quot;<br />
 3 # ищем подстроку &quot;шина&quot;<br />
 4 print instr(a$,&quot;шина&quot;)<br />
 5 # ищем подстроку &quot;колесо&quot;<br />
 6 print instr(a$,&quot;колесо&quot;)<br />
</code><br />
Программа 88 Функция instr()<br />
<code><br />
7<br />
0<br />
</code><br />
Пример вывода программы 88 Функция instr()</p>
<table>
<tr>
<td align="center"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2010/11/new_concept.png" alt="" title="Новое понятие" width="80" height="80" class="aligncenter size-full wp-image-3467" /></td>
<td><strong>instr</strong>(<i>стог_сена, иголка</i>)<br />
Ищет подстроку (<i>иголка</i>) в другой строке (<i>стог_сена</i>). Возвращает позицию первого символа подстроки. Если подстрока не найдена, возвращает нуль (0).
  </td>
</tr>
</table>
<table>
<tr>
<td align="center"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2010/11/big_program.png" alt="" title="Большая программа" width="80" height="80" class="aligncenter size-full wp-image-3493" />
                </td>
<td> Десятичная система счисления (по основанию 10), используемая наиболее часто, использует цифры от 0 до 9 для записи чисел.<br />
  А теперь, давайте представим, что случится, если у нас будет только 5 цифр от 0 до 4. В этом случае число 23 (23=2*10<sup>1</sup>+3*10<sup>0</sup>) станет 43 (4*5<sup>1</sup>+3*5<sup>0</sup>), но будет представлять одно и то же количество предметов. Такое преобразование чисел называется сменой основания системы счисления.</p>
<p>  Компьютер, в своем внутреннем устройстве, не использует и не понимает числа по основанию 10, он преобразует все числа в двоичную систему (по основанию 2) и их он хранит в памяти и с ними только оперирует.</p>
<p>  «Большая программа» этой главы преобразует (конвертирует) положительные целые числа из одной системы счисления в интервале от 2 до 36 в любую другую. В качестве цифр от 11-ой до 36-ой используются заглавные буквы английского алфавита.<a name="m3"></a><a href="#ref3"><sup>3</sup></a>
                </td>
</tr>
</table>
<p><code><br />
&nbsp;1 # radix.kbs<br />
&nbsp;2 # преобразование чисел из одного основания (2-36) в другое<br />
&nbsp;3<br />
&nbsp;4 digits$ = &quot;0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ&quot;<br />
&nbsp;5<br />
&nbsp;6 message$ = &quot;из основания&quot;<br />
&nbsp;7 gosub getbase<br />
&nbsp;8 frombase = base<br />
&nbsp;9<br />
10 input &quot;число по основанию &quot; + frombase + &quot; &gt;&quot;, number$<br />
11 number$ = upper(number$)<br />
12<br />
13 # преобразуем число в десятичную систему (основание 10) и сохраняем его в переменной n<br />
14 n = 0<br />
15 for i = 1 to length(number$)<br />
16 &nbsp;&nbsp;&nbsp;&nbsp;n = n * frombase<br />
17 &nbsp;&nbsp;&nbsp;&nbsp;n = n + instr(digits$, mid(number$, i, 1)) - 1<br />
18 next i<br />
19<br />
20 message$ = &quot;в основание&quot;<br />
21 gosub getbase<br />
22 tobase = base<br />
23<br />
24 # строим строку в tobase<br />
25 result$ = &quot;&quot;<br />
26 while n &lt;&gt; 0<br />
27 &nbsp;&nbsp;&nbsp;&nbsp;result$ = mid(digits$, n % tobase + 1, 1) + result$<br />
28 &nbsp;&nbsp;&nbsp;&nbsp;n = n \ tobase<br />
29 end while<br />
30<br />
31 print &quot;по основанию &quot; + tobase + &quot; это число равно &quot; + result$<br />
32 end<br />
33<br />
34 getbase: # получение основания от 2 до 36<br />
35 do<br />
36 &nbsp;&nbsp;&nbsp;&nbsp;input message$+&quot;&gt; &quot;, base<br />
37 until base &gt;= 2 and base &lt;= 36<br />
38 return<br />
</code><br />
Программа 89. Большая программа – Смена основания системы счисления<br />
<code><br />
из основания&gt; 10<br />
число по основанию 10, &gt;999<br />
в основание&gt; 16<br />
по основанию 16, это число равно 3E7<br />
</code><br />
Пример вывода программы 89 Большая программа &mdash; Смена основания системы счисления</p>
<p>---------------------------------------------------<br />
 <a name="ref1"></a><a href="#m1"><sup>1</sup></a>Если сумма параметров <i>начало</i>+<i>длина</i> больше, чем длина строки, то вернется только часть строки от места <i>начало</i> до конца строки, что и показано в последнем выводе программы 86. (прим. редактора)</p>
<p> <a name="ref2"></a><a href="#m2"><sup>2</sup></a>Если у вас эти функции не работают с русскими буквами - обновите BASIC-256 (прим. редактора).</p>
<p> <a name="ref3"></a><a href="#m3"><sup>3</sup></a>Как известно, в английском алфавите ровно 26 букв. A означает «цифру» 10, B – 12 и т.&nbsp;д. Наиболее известна в среде программистов шестнадцатеричная система счисления, где цифрами от 10 до 15 являются буквы от A до F</p>
<p>============================<br />
<a name="basic"></a><br />
<h3>Где скачать BASIC-256:</h3>
<p><strong>Для дистрибутивов ALT Linux</strong></p>
<ul>
<li>ветка 4.0 <a href="http://ftp.altlinux.org/pub/distributions/ALTLinux/4.0/branch/files/i586/RPMS/basic256-0.9.6-alt5.M40.1.i586.rpm">basic256-0.9.6-alt5.M40.1.i586.rpm</a></li>
<li>ветка 4.1 <a href="http://ftp.altlinux.org/pub/distributions/ALTLinux/4.1/branch/files/i586/RPMS/basic256-0.9.6-alt5.M41.1.i586.rpm">basic256-0.9.6-alt5.M41.1.i586.rpm</a></li>
<li>ветка p5 <a href="http://ftp.altlinux.org/pub/distributions/ALTLinux/p5/branch/files/i586/RPMS/basic256-0.9.6-alt5.M50P.1.i586.rpm">basic256-0.9.6-alt5.M50P.1.i586.rpm</a></li>
<li>ветка 5.1 <a href="http://ftp.altlinux.org/pub/distributions/ALTLinux/5.1/branch/files/i586/RPMS/basic256-0.9.6-alt5.M51.1.i586.rpm">basic256-0.9.6-alt5.M51.1.i586.rpm</a></li>
</ul>
<p><strong>Windows версия</strong><br />
<a href="http://basic256.org">http://basic256.org</a> (<a href="http://www.sourceforge.net/projects/kidbasic">http://www.sourceforge.net/projects/kidbasic</a>)</p>
<h3> Как установить BASIC-256 в Linux</h3>
<p><strong>Для Альт Линукс:</strong> настроить репозиторий и обновить/установить пакет через synaptic или apt<br />
<strong>Для rpm-based дистрибутивов:</strong> rpm -Uvh &lt;имя_пакета&gt;.rpm<br />
</ljcut></p>
]]></content:encoded>
			<wfw:commentRss>http://freeschool.altlinux.ru/?feed=rss2&#038;p=3988</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>BASIC-256. Глава 14</title>
		<link>http://freeschool.altlinux.ru/?p=3930</link>
		<comments>http://freeschool.altlinux.ru/?p=3930#comments</comments>
		<pubDate>Fri, 04 Feb 2011 00:30:20 +0000</pubDate>
		<dc:creator><![CDATA[Владимир Черный]]></dc:creator>
				<category><![CDATA[Методические материалы]]></category>
		<category><![CDATA[BASIC-256]]></category>
		<category><![CDATA[Ирюпин]]></category>
		<category><![CDATA[Черный]]></category>

		<guid isPermaLink="false">http://freeschool.altlinux.ru/?p=3930</guid>
		<description><![CDATA[Продолжаем публиковать перевод книги Джеймса Рено. Эту главу перевел Владимир Черный. Оглавление: Глава 1: Знакомство с BASIC-256 – cкажи «Привет» Глава 2: Рисуем основные фигуры Глава 3: Звуки и музыка Глава 4: Мыслить как программист Глава 5: Программа задает вам вопросы Глава 6: Сравнения, сравнения, сравнения Глава 7: Циклы и счетчики — повторяем снова и [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Продолжаем публиковать перевод <a href="http://basicbook.org/download">книги Джеймса Рено</a>. Эту главу перевел Владимир Черный.<br />
Оглавление:</p>
<ul>
<li><a href="http://freeschool.altlinux.ru/?p=3401">Глава 1: Знакомство с BASIC-256 – cкажи «Привет»</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3461">Глава 2: Рисуем основные фигуры</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3504">Глава 3: Звуки и музыка</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3569#g4">Глава 4: Мыслить как программист</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3569#g5">Глава 5: Программа задает вам вопросы</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3643">Глава 6: Сравнения, сравнения, сравнения</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3689">Глава 7: Циклы и счетчики — повторяем снова и снова</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3719">Глава 8: Графика на заказ — создание фигур своими руками</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3755">Глава 9: Подпрограммы — повторное использование кода</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3805">Глава 10: Управляем мышкой, перемещаем объекты</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3842">Глава 11: Использование клавиатуры для управления программой</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3867">Глава 12: Картинки, музыка и спрайты</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3906">Глава 13 Массивы — коллекции данных</a></li>
</ul>
<p><a href="#basic">Где взять BASIC-256</a><br />
<span id="more-3930"></span><br />
<ljcut></p>
<h2>Глава 14. Математика &mdash; развлечемся с числами</h2>
<p>В этой главе мы рассмотрим некоторые дополнительные математические операторы и функции. Глава разбита на 4 части: 1) новые операторы 2) новые целые функции 3) новые функции для работы с числами с плавающей точкой (действительные числа), и 4) тригонометрические функции.</p>
<h3>Новые операторы</h3>
<p>В дополнение к базовым математическим операциям, которые мы использовали с первой главы книги, есть еще три оператора в BASIC-256. Операции, аналогичные этим есть в большинстве языков программирования. Это операция деления по модулю, целочисленного деления и возведения в степень.</p>
<table border="1">
<tr>
<td> Операция </td>
<td> Оператор </td>
<td> Описание </td>
</tr>
<tr>
<td> Деление по модулю </td>
<td align="center"> <strong>%</strong> </td>
<td> Возвращает остаток от деления на целое число </td>
</tr>
<tr>
<td> Целочисленное деление </td>
<td align="center"> <strong>\</strong> </td>
<td> Возвращает (целое) частное от деления одного целого на другое </td>
</tr>
<tr>
<td> Степень </td>
<td align="center"> <strong>^</strong> </td>
<td> Возводит одно (целое) число в степень другого (целого) </td>
</tr>
</table>
<h3>Деление по модулю</h3>
<p>Операция деления по модулю возвращает остаток от деления нацело. Когда вы делите два целых числа «уголком», остаток, полученный в результате и есть модуль.</p>
<p><code><br />
  1 # c12_mod.kbs<br />
  2 input "Введите целое число ", n<br />
  3 if n % 2 = 0 then print "делится на 2"<br />
  4 if n % 3 = 0 then print "делится на 3"<br />
  5 if n % 5 = 0 then print "делится на 5"<br />
  6 if n % 7 = 0 then print "делится на 7"<br />
  7 end<br />
</code></p>
<p>Программа 78 Деление по модулю<br />
<code><br />
Введите целое число 10<br />
делится на 2<br />
делится на 5<br />
</code><br />
Пример вывода программы 78 Деление по модулю</p>
<table>
<tr>
<td align="center"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2010/11/new_concept.png" alt="" title="Новое понятие" width="80" height="80" class="aligncenter size-full wp-image-3467" /></td>
<td><em>выражение1</em> <strong>%</strong> <em>выражение2</em></p>
<p>  Оператор деления по модулю (<strong>%</strong>) возвращает остаток от деления числа <em>выражение1</em> на число <em>выражение2</em></p>
<p>  Если одно или оба выражения не целые, то сначала они округляются до целого отбрасыванием дробной части (как это делает функция <strong>int()</strong> ) до того, как операция будет произведена.
  </td>
</tr>
</table>
<p>Вы может и не задумывались, но операция деления по модулю используется программистами довольно часто. Основные два применения это 1) проверить делится ли одно число на другое (программа 78) и 2) получить числа из ограниченного диапазона (программа 79)</p>
<p><code><br />
 &nbsp;1 # moveballmod.kbs<br />
 &nbsp;2 # Переписанная программа moveball.kbs с использованием оператора<br />
 &nbsp;3 # деления по модулю для ограничения движения мяча экраном<br />
 &nbsp;4<br />
 &nbsp;5 print "клавиша i - вверх, j - влево, k - вправо, m - вниз, q - закончить"<br />
 &nbsp;6<br />
 &nbsp;7 fastgraphics<br />
 &nbsp;8 clg<br />
 &nbsp;9 ballradius = 20<br />
 10<br />
 11 # позиция мяча<br />
 12 # начинаем с центра экрана<br />
 13 x = graphwidth /2<br />
 14 y = graphheight / 2<br />
 15<br />
 16 # рисуем мяч в начальном положении на экране<br />
 17 gosub drawball<br />
 18<br />
 19 # цикл ожидания ввода пользователем нажатий на клавиши<br />
 20 while true<br />
 21&nbsp;&nbsp;&nbsp;&nbsp;k = key<br />
 22&nbsp;&nbsp;&nbsp;&nbsp;if k = asc("I") then<br />
 23&nbsp;&nbsp;&nbsp;&nbsp;# y может стать отрицательным, + graphheight делает это число положительным<br />
 24&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y = (y - ballradius + graphheight) % graphheight<br />
 25&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gosub drawball<br />
 26&nbsp;&nbsp;&nbsp;&nbsp;end if<br />
 27&nbsp;&nbsp;&nbsp;&nbsp;if k = asc("J") then<br />
 28&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x = (x - ballradius + graphwidth) % graphwidth<br />
 29&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gosub drawball<br />
 30&nbsp;&nbsp;&nbsp;&nbsp;end if<br />
 31&nbsp;&nbsp;&nbsp;&nbsp;if k = asc("K") then<br />
 32&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x = (x + ballradius) % graphwidth<br />
 33&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gosub drawball<br />
 34&nbsp;&nbsp;&nbsp;&nbsp;end if<br />
 35&nbsp;&nbsp;&nbsp;&nbsp;if k = asc("M") then<br />
 36&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y = (y + ballradius) % graphheight<br />
 37&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gosub drawball<br />
 38&nbsp;&nbsp;&nbsp;&nbsp;end if<br />
 39&nbsp;&nbsp;&nbsp;&nbsp;if k = asc("Q") then end<br />
 40 end while<br />
 41<br />
 42 drawball:<br />
 43 color white<br />
 44 rect 0, 0, graphwidth, graphheight<br />
 45 color red<br />
 46 circle x, y, ballradius<br />
 47 refresh<br />
 48 return<br />
</code><br />
Программа 79 Двигаем мяч с использованием деления по модулю.</p>
<h3>Целочисленное деление</h3>
<p>Операция целочисленного деления (<strong>\</strong>) производит обычное деление, но работает только с целыми числами и возвращает целое число. Например 13 разделить на 4 будет 3 и в остатке 1. Результатом операции целочисленного деления будет 3.<br />
<code><br />
  1 # c12_integerdivision.kbs<br />
  2 input "Делимое ", dividend<br />
  3 input "Делитель ", divisor<br />
  4 print dividend + " / " + divisor + " = частное ";<br />
  5 print dividend \ divisor;<br />
  6 print " и остаток (r) ";<br />
  7 print dividend % divisor;<br />
</code></p>
<p>Программа 80 Проверь как ты делишь уголком<br />
<code><br />
Делимое 43<br />
Делитель 6<br />
43 / 6 = частное 7 и остаток (r) 1<br />
</code><br />
Пример вывода программы 80 Проверь как ты делишь уголком</p>
<table>
<tr>
<td align="center"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2010/11/new_concept.png" alt="" title="Новое понятие" width="80" height="80" class="aligncenter size-full wp-image-3467" /></td>
<td><em>выражение1</em> <strong>\</strong> <em>выражение2</em></p>
<p>  Целочисленное деление (\) делит выражение1 на выражение2 и в качестве результата возвращает целое число, которое показывает во сколько раз <em>выражение1</em> больше <em>выражение2</em> (частное от деления)</p>
<p>  Если одно или оба числа не целые, они округляются до целого, отбрасыванием десятичной части (как это делает <strong>int()</strong>) до того, как операция будет произведена.
  </td>
</tr>
</table>
<h3>Возведение в степень</h3>
<p>Оператор возведения в степень возвращает степень первого числа относительно второго.<br />
<code><br />
 1 # c12_power.kbs<br />
 2 for t = 0 to 16<br />
 3   print &quot;2 ^ &quot; + t + &quot; = &quot;;<br />
 4   print 2 ^ t<br />
 5 next t<br />
</code><br />
Программа 81 Степени числа 2<br />
<code><br />
2 ^ 0 = 1<br />
2 ^ 1 = 2<br />
2 ^ 2 = 4<br />
2 ^ 3 = 8<br />
2 ^ 4 = 16<br />
2 ^ 5 = 32<br />
2 ^ 6 = 64<br />
2 ^ 7 = 128<br />
2 ^ 8 = 256<br />
2 ^ 9 = 512<br />
2 ^ 10 = 1024<br />
2 ^ 11 = 2048<br />
2 ^ 12 = 4096<br />
2 ^ 13 = 8192<br />
2 ^ 14 = 16384<br />
2 ^ 15 = 32768<br />
2 ^ 16 = 65536<br />
</code><br />
Примерный вывод программы 81 Степени числа 2</p>
<table>
<tr>
<td align="center"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2010/11/new_concept.png" alt="" title="Новое понятие" width="80" height="80" class="aligncenter size-full wp-image-3467" /></td>
<td><em>выражение1</em> <strong>^</strong> <em>выражение2</em></p>
<p>  Оператор степень (^) возводит <em>выражение1</em> в степень заданную числом <em>выражение2</em>.</p>
<p>  Математическая запись степени a = b<sup>c</sup> в BASIC-256 записывается как a&nbsp;=&nbsp;b^c
                </td>
</tr>
</table>
<h3>Новые целочисленные функции</h3>
<p>Три новые функции этой главы связаны с преобразованием строк и чисел с плавающей точкой (действительных чисел) в целые числа. Все три эти функции по разному обрабатывают десятичную часть числа.</p>
<p>Функция <strong>int</strong>() просто отбрасывает десятичную часть числа, что равносильно вычитанию дробной части от (положительного) числа или прибавления десятичной части к отрицательному числу. Это может привести к проблемам, если мы пытаемся округлить числа меньшие нуля (0).</p>
<p>Функции <strong>ceil</strong>() и <strong>floor</strong>() по своему решают проблему <strong>int</strong>(). Функция <strong>ceil</strong>() дополняет дробное число до ближайшего целого, большего, чем исходное число, в то время как <strong>floor</strong>() всегда уменьшает число до ближайшего целого, меньшего данного числа.</p>
<p>Всех нас учили округлять, прибавляя 0.5 и отбрасывать дробную часть. Если мы используем <strong>int</strong>(), то она работает с положительными числами и не работает с отрицательными. В BASIC-256 для округления («как привычно») следует использовать формулу типа <i>a=floor(b+0.5) </i>.</p>
<table>
<tr>
<td align="center"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2010/11/new_concept.png" alt="" title="Новое понятие" width="80" height="80" class="aligncenter size-full wp-image-3467" /></td>
<td>
<table>
<tr>
<th>Функция</th>
<th>Описание</th>
</tr>
<tr>
<td><strong>int</strong>(<em>выражение</em>)</td>
<td>Преобразует <em>выражение</em> (строку, целое или десятичную дробь) в целое число. При этом дробная часть просто отбрасывается. Если строка не содержит числа возвращается нуль.</td>
</tr>
<tr>
<td><strong>ceil</strong>(<em>выражение</em>)</td>
<td>Преобразует <i>выражение</i> в ближайшее большее целое</td>
</tr>
<tr>
<td><strong>floor</strong>(<em>выражение</em>)</td>
<td>Преобразует <em>выражение</em> в ближайшее меньшее целое. Для округления следует использовать формулу <i>a=floor(b+0.5)</i></td>
</tr>
</table>
</td>
</tr>
</table>
<p><code><br />
 1 # c12_intceilfloor.kbs<br />
 2 for t = 1 to 10<br />
 3 &nbsp;&nbsp;&nbsp;&nbsp;n = rand * 100 - 50<br />
 4 &nbsp;&nbsp;&nbsp;&nbsp;print n;<br />
 5 &nbsp;&nbsp;&nbsp;&nbsp;print &quot; int=&quot; + int(n);<br />
 6 &nbsp;&nbsp;&nbsp;&nbsp;print &quot; ceil=&quot; + ceil(n);<br />
 7 &nbsp;&nbsp;&nbsp;&nbsp;print &quot; floor=&quot; + floor(n)<br />
 8 next t<br />
</code><br />
Программа 82 Различие между <em>int</em>, <em>ceil</em> и <em>floor</em><br />
<code><br />
-34,342984 int=-34 ceil=-34 floor=-35<br />
23,295121 int=23 ceil=24 floor=23<br />
-25,956241 int=-25 ceil=-25 floor=-26<br />
10,697896 int=10 ceil=11 floor=10<br />
-16,144697 int=-16 ceil=-16 floor=-17<br />
44,576658 int=44 ceil=45 floor=44<br />
35,383576 int=35 ceil=36 floor=35<br />
4,651446 int=4 ceil=5 floor=4<br />
-39,022827 int=-39 ceil=-39 floor=-40<br />
47,965051 int=47 ceil=48 floor=47<br />
</code><br />
Примерный вывод программы 82 Различие между <em>int</em>, <em>ceil</em> и <em>floor</em></p>
<h3>Новые функции для дробных чисел</h3>
<p>Математические функции, в которые погрузила нас эта глава могут пригодиться при написании некоторых специальных программ. В подавляющем большинстве программ они не нужны.</p>
<table>
<tr>
<td align="center"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2010/11/new_concept.png" alt="" title="Новое понятие" width="80" height="80" class="aligncenter size-full wp-image-3467" /></td>
<td>
<table>
<tr>
<th>Функция</th>
<th>Описание</th>
</tr>
<tr>
<td><strong>float</strong>(<em>выражение</em>)</td>
<td>Преобразует <em>выражение</em> (строку, целое или десятичную дробь)  в дробное число. Обычно используется для преобразования строк в числа. Если строка не содержит числа возвращается нуль.</td>
</tr>
<tr>
<td><strong>abs</strong>(<em>выражение</em>)</td>
<td>Возвращает беззнаковое значение выражения (абсолютное значение)</td>
</tr>
<tr>
<td><strong>log</strong>(<em>выражение</em>)</td>
<td>Возвращает натуральный логарифм числа (логарифм по основанию e)</td>
</tr>
<tr>
<td><strong>log10</strong>(<em>выражение</em>)</td>
<td>Возвращает десятичный логарифм числа (логарифм по основанию 10)</td>
</tr>
</table>
</td>
</tr>
</table>
<h3>Тригонометрические функции (для знакомых с ними)</h3>
<p>Тригонометрия &mdash; наука об измерении углов и сторон (и их соотношений) в треугольнике. BASIC-256 поддерживает основные тригонометрические функции. Углы измеряются в радианах (0-2π). Если вы хотите использовать градусы (0-360) в своей программе, то необходимо значения в градусах предварительно преобразовать в радианы, а потом использовать в тригонометрических функциях.</p>
<table>
<tr>
<td align="center"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2010/11/new_concept.png" alt="" title="Новое понятие" width="80" height="80" class="aligncenter size-full wp-image-3467" /></td>
<td>
<table>
<tr>
<th>Функция</th>
<th>Описание</th>
</tr>
<tr>
<td><strong>cos</strong>(<em>выражение</em>)</td>
<td>Возвращает значение косинуса угла</td>
</tr>
<tr>
<td><strong>sin</strong>(<em>выражение</em>)</td>
<td>Возвращает значение синуса угла</td>
</tr>
<tr>
<td><strong>tan</strong>(<em>выражение</em>)</td>
<td>Возвращает значение тангенса угла</td>
</tr>
<tr>
<td><strong>degrees</strong>(<em>выражение</em>)</td>
<td>Преобразует число из радиан (0-2π) в градусы (0<sup>0</sup>&nbsp;360<sup>0</sup>)</td>
</tr>
<tr>
<td><strong>radians</strong>(<em>выражение</em>)</td>
<td>Преобразует число градусов (0<sup>0</sup>&nbsp;360<sup>0</sup>) в радианы (0-2π)</td>
</tr>
<tr>
<td><strong>acos</strong>(<em>выражение</em>)</td>
<td>Функция, обратная косинусу (арккосинус)</td>
</tr>
<tr>
<td><strong>asin</strong>(<em>выражение</em>)</td>
<td>Функция, обратная синусу (арксинус)</td>
</tr>
<tr>
<td><strong>atan</strong>(<em>выражение</em>)</td>
<td>Функция, обратная тангенсу (арктангенс)</td>
</tr>
</table>
</td>
</tr>
</table>
<p>Первые три функции имеют прямое отношение к сторонам прямоугольного треугольника. Рисунок 20 демонстрирует прямоугольный треугольник, его стороны и углы.</p>
<p><img src="http://freeschool.altlinux.ru/wp-content/uploads/2011/01/chapter14-img20-300x186.png" alt="" title="chapter14-img20" width="300" height="186" class="aligncenter size-medium wp-image-3932" /><br />
Рисунок 20 Прямоугольный треугольник.</p>
<h3>Косинус</h3>
<p>Косинус угла равен отношению прилежащего катета к гипотенузе:<br />
<img src="http://freeschool.altlinux.ru/wp-content/uploads/2011/01/chapter14-cos.gif" alt="" title="chapter14-cos" width="69" height="39" class="alignnone size-full wp-image-3941" />.<br />
Косинус повторяет свои значения в диапазоне от -1 до 1 на каждом интервале длиной 2π радиан. Рисунок 21 показывает волновой график косинуса в диапазоне от 0 до 2π.</p>
<p><img src="http://freeschool.altlinux.ru/wp-content/uploads/2011/01/chapter14-img21.png" alt="" title="chapter14-img21" width="344" height="115" class="aligncenter size-full wp-image-3933" /><br />
Рисунок 21 Функция cos()</p>
<h3>Синус</h3>
<p>Синус равен отношению прилежащего катета к гипотенузе:<br />
<img src="http://freeschool.altlinux.ru/wp-content/uploads/2011/01/chapter14-sin.gif" alt="" title="chapter14-sin" width="67" height="39" class="alignnone size-full wp-image-3942" />.<br />
Синус также, как и косинус повторяет свои значения из диапазона от -1 до 1 на каждом интервале длиной 2π</p>
<p><img src="http://freeschool.altlinux.ru/wp-content/uploads/2011/01/chapter14-img22.png" alt="" title="chapter14-img22" width="344" height="116" class="aligncenter size-full wp-image-3934" /><br />
Рисунок 22 Функция sin()</p>
<h3>Тангенс</h3>
<p>Тангенс равен отношению противолежащего катета к прилежащему:<br />
<img src="http://freeschool.altlinux.ru/wp-content/uploads/2011/01/chapter14-tg.gif" alt="" title="chapter14-tg" width="62" height="39" class="alignnone size-full wp-image-3943" />.<br />
Тангенс повторяет свои значения лежащие в диапазоне от -∞ до ∞ на каждом отрезке в π радиан. Такой диапазон тангенса объясняется тем, что когда угол треугольника становится очень маленьким, противолежащий катет становится очень маленьким.</p>
<p><img src="http://freeschool.altlinux.ru/wp-content/uploads/2011/01/chapter14-img23.png" alt="" title="chapter14-img23" width="344" height="164" class="aligncenter size-full wp-image-3935" /><br />
Рис. 23 Функция tan()</p>
<h3>Функция degrees</h3>
<p>Функция <strong>degrees</strong>() преобразует значения угла из радиан в градусы по формуле: <i>градусы&nbsp;=&nbsp;(радианы/2π)*360</i>.</p>
<h3>Функция radians</h3>
<p>Функция <strong>radians</strong>() преобразует значения угла из градусов в радианы по формуле <i>радианы&nbsp;=&nbsp;(градусы/360)*2π</i> Запомните, все тригонометрические функции BASIC-256 используют в качестве аргумента радианы, а не градусы.</p>
<h3>Арккосинус</h3>
<p>Арккосинус (<strong>acos</strong>()) — функция обратная косинусу. Ее значением является величина угла, косинус которого равен заданному числу.</p>
<p><img src="http://freeschool.altlinux.ru/wp-content/uploads/2011/01/chapter14-img24.png" alt="" title="chapter14-img24" width="336" height="194" class="aligncenter size-full wp-image-3936" /><br />
Рисунок 24 Функция acos()</p>
<h3>Арксинус</h3>
<p>Арксинус (<strong>asin</strong>()) – функция, обратная синусу. Ее значением является величина, синус которого равен заданному числу.</p>
<p><img src="http://freeschool.altlinux.ru/wp-content/uploads/2011/01/chapter14-img25.png" alt="" title="chapter14-img25" width="337" height="196" class="aligncenter size-full wp-image-3937" /><br />
Рисунок 25 Функция asin()</p>
<h3>Арктангенс</h3>
<p>Арктангенс (<strong>atan</strong>()) – функция, обратная тангенсу. Ее значением является угол, тангенс которого равен заданному числу.</p>
<p><img src="http://freeschool.altlinux.ru/wp-content/uploads/2011/01/chapter14-img26-300x165.png" alt="" title="chapter14-img26" width="300" height="165" class="aligncenter size-medium wp-image-3938" /><br />
Рисунок 26 Функция atan()</p>
<table>
<tr>
<td align="center"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2010/11/big_program.png" alt="" title="Большая программа" width="80" height="80" class="aligncenter size-full wp-image-3493" />
                </td>
<td>Большая программа этой главы воспроизводит процесс деления целых чисел уголком. Программа использует логарифм, чтобы вычислить количество знаков в числах, деление по модулю и целочисленное деление для определения цифр, и в целом очень сложная программа. Не расстраивайтесь и не опускайте руки, если сразу не поймете в полностью, как она работает.
                </td>
</tr>
</table>
<p><code><br />
 &nbsp;1 # longdivision.kbs<br />
 &nbsp;2 # Показывает графически процесс деления уголком<br />
 &nbsp;3 # двух положительных целых чисел.<br />
 &nbsp;4<br />
 &nbsp;5 input "Делимое? ", b<br />
 &nbsp;6 input "Делитель? ", a<br />
 &nbsp;7<br />
 &nbsp;8 originx = 100<br />
 &nbsp;9 originy = 20<br />
 10 height = 12<br />
 11 width = 9<br />
 12 margin = 2<br />
 13<br />
 14 b = int(abs(b))<br />
 15 a = int(abs(a))<br />
 16<br />
 17 color white<br />
 18 rect 0,0,graphwidth, graphheight<br />
 19 color black<br />
 20<br />
 21 # Отображение задания на деление<br />
 22 row = 0<br />
 23 col = -1<br />
 24 number = a<br />
 25 underline = false<br />
 26 gosub drawrightnumber<br />
 27 row = 0<br />
 28 col = 0<br />
 29 number = b<br />
 30 gosub drawleftnumber<br />
 31 line originx - margin, originy, originx + (width * 11), originy<br />
 32 line originx - margin, originy, originx - margin, originy + height<br />
 33<br />
 34 # Сколько цифр в делимом?<br />
 35 lb = ceil(log10(abs(b)))<br />
 36<br />
 37 r = 0<br />
 38 bottomrow = 0&nbsp;&nbsp;&nbsp;&nbsp;## номер последнего ряда вычислений<br />
 39<br />
 40 # Цикл по всем цифрам слева направо<br />
 41 for tb = lb-1 to 0 step -1<br />
 42&nbsp;&nbsp;&nbsp;&nbsp;# получаем следующюю цифру текущего остатка и убираем ее из делимого<br />
 43&nbsp;&nbsp;&nbsp;&nbsp;r = r * 10<br />
 44&nbsp;&nbsp;&nbsp;&nbsp;r = r + (b \ (10 ^ tb))<br />
 45&nbsp;&nbsp;&nbsp;&nbsp;b = b % (10 ^ tb)<br />
 46&nbsp;&nbsp;&nbsp;&nbsp;# отображаем текущий остаток<br />
 47&nbsp;&nbsp;&nbsp;&nbsp;row = bottomrow<br />
 48&nbsp;&nbsp;&nbsp;&nbsp;bottomrow = bottomrow + 1<br />
 49&nbsp;&nbsp;&nbsp;&nbsp;col = lb - tb - 1<br />
 50&nbsp;&nbsp;&nbsp;&nbsp;number = r<br />
 51&nbsp;&nbsp;&nbsp;&nbsp;underline = false<br />
 52&nbsp;&nbsp;&nbsp;&nbsp;gosub drawrightnumber<br />
 53&nbsp;&nbsp;&nbsp;&nbsp;# вычисляем следующую цифру ответа и отображаем ее<br />
 54&nbsp;&nbsp;&nbsp;&nbsp;digit = r \ a<br />
 55&nbsp;&nbsp;&nbsp;&nbsp;row = -1<br />
 56&nbsp;&nbsp;&nbsp;&nbsp;col = lb - tb - 1<br />
 57&nbsp;&nbsp;&nbsp;&nbsp;gosub drawdigit<br />
 58&nbsp;&nbsp;&nbsp;&nbsp;# вычисляем количество которое надо удалить из текущего остатка и отображаем<br />
 59&nbsp;&nbsp;&nbsp;&nbsp;number = digit * a<br />
 60&nbsp;&nbsp;&nbsp;&nbsp;r = r - number<br />
 61&nbsp;&nbsp;&nbsp;&nbsp;col = lb - tb - 1<br />
 62&nbsp;&nbsp;&nbsp;&nbsp;row = bottomrow<br />
 63&nbsp;&nbsp;&nbsp;&nbsp;bottomrow = bottomrow + 1<br />
 64&nbsp;&nbsp;&nbsp;&nbsp;underline = true<br />
 65&nbsp;&nbsp;&nbsp;&nbsp;gosub drawrightnumber<br />
 66 next tb<br />
 67 #<br />
 68 # печатаем остаток в нижнем ряду<br />
 69 row = bottomrow<br />
 70 col = lb - 1<br />
 71 number = r<br />
 72 underline = false<br />
 73 gosub drawrightnumber<br />
 74 end<br />
 75<br />
 76 drawdigit:<br />
 77 # вычисляем строку и столбец для отображения<br />
 78 text col * width + originx, row * height + originy, digit<br />
 79 if underline then<br />
 80&nbsp;&nbsp;&nbsp;&nbsp;line col * width + originx - margin, (row + 1) * height + originy, (col + 1) * width + originx - margin, (row + 1) * height + originy<br />
 81 end if<br />
 82 return<br />
 83<br />
 84 drawleftnumber:<br />
 85 # передаем начальный ряд и колонку, а также число для левой колонки<br />
 86 if number &lt; 10 then<br />
 87&nbsp;&nbsp;&nbsp;&nbsp;digit = number<br />
 88&nbsp;&nbsp;&nbsp;&nbsp;gosub drawdigit<br />
 89 else<br />
 90&nbsp;&nbsp;&nbsp;&nbsp;lnumber = ceil(log10(abs(number)))<br />
 91&nbsp;&nbsp;&nbsp;&nbsp;for tnumber = lnumber-1 to 0 step -1<br />
 92&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;digit = (number \ (10 ^ tnumber)) % 10<br />
 93&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gosub drawdigit<br />
 94&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;col = col + 1<br />
 95&nbsp;&nbsp;&nbsp;&nbsp;next tnumber<br />
 96 endif<br />
 97 return<br />
 98<br />
 99 drawrightnumber:<br />
100 # передаем начальный ряд, колонку и число для отображения в правой колонке<br />
101 if number &lt; 10 then<br />
102&nbsp;&nbsp;&nbsp;&nbsp;digit = number<br />
103&nbsp;&nbsp;&nbsp;&nbsp;gosub drawdigit<br />
104 else<br />
105&nbsp;&nbsp;&nbsp;&nbsp;lnumber = ceil(log10(abs(number)))<br />
106&nbsp;&nbsp;&nbsp;&nbsp;for tnumber = 0 to lnumber - 1<br />
107&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;digit = (number \ (10 ^ tnumber)) % 10<br />
108&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gosub drawdigit<br />
109&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;col = col - 1<br />
110&nbsp;&nbsp;&nbsp;&nbsp;next tnumber<br />
111 endif<br />
112 return<br />
</code><br />
Программа 83 Большая программа Деление уголком<br />
<code><br />
Делимое? 123456<br />
Делитель? 78<br />
</code><br />
<img src="http://freeschool.altlinux.ru/wp-content/uploads/2011/01/chapter14-p83.png" alt="" title="chapter14-p83" width="132" height="192" class="aligncenter size-full wp-image-3939" /><br />
Пример вывода программы 83 Большая программа Деление уголком</p>
<p>============================<br />
<a name="basic"></a><br />
<h3>Где скачать BASIC-256:</h3>
<p><strong>Для дистрибутивов ALT Linux</strong></p>
<ul>
<li>ветка 4.0 <a href="http://ftp.altlinux.org/pub/distributions/ALTLinux/4.0/branch/files/i586/RPMS/basic256-0.9.6-alt5.M40.1.i586.rpm">basic256-0.9.6-alt5.M40.1.i586.rpm</a></li>
<li>ветка 4.1 <a href="http://ftp.altlinux.org/pub/distributions/ALTLinux/4.1/branch/files/i586/RPMS/basic256-0.9.6-alt5.M41.1.i586.rpm">basic256-0.9.6-alt5.M41.1.i586.rpm</a></li>
<li>ветка p5 <a href="http://ftp.altlinux.org/pub/distributions/ALTLinux/p5/branch/files/i586/RPMS/basic256-0.9.6-alt5.M50P.1.i586.rpm">basic256-0.9.6-alt5.M50P.1.i586.rpm</a></li>
<li>ветка 5.1 <a href="http://ftp.altlinux.org/pub/distributions/ALTLinux/5.1/branch/files/i586/RPMS/basic256-0.9.6-alt5.M51.1.i586.rpm">basic256-0.9.6-alt5.M51.1.i586.rpm</a></li>
</ul>
<p><strong>Windows версия</strong><br />
<a href="http://basic256.org">http://basic256.org</a> (<a href="http://www.sourceforge.net/projects/kidbasic">http://www.sourceforge.net/projects/kidbasic</a>)</p>
<h3> Как установить BASIC-256 в Linux</h3>
<p><strong>Для Альт Линукс:</strong> настроить репозиторий и обновить/установить пакет через synaptic или apt<br />
<strong>Для rpm-based дистрибутивов:</strong> rpm -Uvh &lt;имя_пакета&gt;.rpm<br />
</ljcut></p>
]]></content:encoded>
			<wfw:commentRss>http://freeschool.altlinux.ru/?feed=rss2&#038;p=3930</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>BASIC-256. Глава 13</title>
		<link>http://freeschool.altlinux.ru/?p=3906</link>
		<comments>http://freeschool.altlinux.ru/?p=3906#comments</comments>
		<pubDate>Fri, 28 Jan 2011 00:00:17 +0000</pubDate>
		<dc:creator><![CDATA[Владимир Черный]]></dc:creator>
				<category><![CDATA[Методические материалы]]></category>
		<category><![CDATA[BASIC-256]]></category>
		<category><![CDATA[Ирюпин]]></category>
		<category><![CDATA[Черный]]></category>

		<guid isPermaLink="false">http://freeschool.altlinux.ru/?p=3906</guid>
		<description><![CDATA[Продолжаем публиковать перевод книги Джеймса Рено. Эту главу перевел Владимир Черный. Оглавление: Глава 1: Знакомство с BASIC-256 – cкажи «Привет» Глава 2: Рисуем основные фигуры Глава 3: Звуки и музыка Глава 4: Мыслить как программист Глава 5: Программа задает вам вопросы Глава 6: Сравнения, сравнения, сравнения Глава 7: Циклы и счетчики — повторяем снова и [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Продолжаем публиковать перевод <a href="http://basicbook.org/download">книги Джеймса Рено</a>. Эту главу перевел Владимир Черный.<br />
Оглавление:</p>
<ul>
<li><a href="http://freeschool.altlinux.ru/?p=3401">Глава 1: Знакомство с BASIC-256 – cкажи «Привет»</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3461">Глава 2: Рисуем основные фигуры</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3504">Глава 3: Звуки и музыка</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3569#g4">Глава 4: Мыслить как программист</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3569#g5">Глава 5: Программа задает вам вопросы</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3643">Глава 6: Сравнения, сравнения, сравнения</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3689">Глава 7: Циклы и счетчики — повторяем снова и снова</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3719">Глава 8: Графика на заказ — создание фигур своими руками</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3755">Глава 9: Подпрограммы — повторное использование кода</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3805">Глава 10: Управляем мышкой, перемещаем объекты</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3842">Глава 11: Использование клавиатуры для управления программой</a></li>
<li><a href="http://freeschool.altlinux.ru/?p=3867">Глава 12: Картинки, музыка и спрайты</a></li>
</ul>
<p><a href="#basic">Где взять BASIC-256</a><br />
<span id="more-3906"></span><br />
<ljcut></p>
<h2>Глава 13 Массивы — коллекции данных</h2>
<p>Мы использовали простые строковые и числовые переменные во многих программах, но они могут содержать только одно значение за раз. Очень часто приходится иметь дело с набором или списком значений. Для работы с такими объектами придуманы линейные (одномерные) и двухмерные массивы. В этой главе вы узнаете как создавать, инициализировать (задавать начальные значения), использовать массивы, а также как изменять их размеры.</p>
<h3>Одномерный числовой массив.</h3>
<p>Одномерный массив создает список в памяти так, что вы можете обращаться к его элементам по числовому адресу, называемому индексом. Массивы могут быть как числовыми, так и строковыми в зависимости от типа переменной, использованной в операторе <strong>dim</strong>.<br />
<code><br />
  1 # numeric1d.kbs<br />
  2<br />
  3 dim a(10)<br />
  4<br />
  5 a[0] = 100<br />
  6 a[1] = 200<br />
  7 a[3] = a[1] + a[2]<br />
  8<br />
  9 input &quot;Введите число: &quot;, a[9]<br />
 10 a[8] = a[9] - a[3]<br />
 11<br />
 12 for t = 0 to 9<br />
 13 &nbsp;&nbsp;&nbsp;&nbsp;print &quot;a[&quot; + t + &quot;] = &quot; + a[t]<br />
 14 next t<br />
</code><br />
Программа 66 Одномерный числовой массив<br />
<code><br />
Введите число: 63<br />
a[0] = 100<br />
a[1] = 200<br />
a[2] = 0<br />
a[3] = 200<br />
a[4] = 0<br />
a[5] = 0<br />
a[6] = 0<br />
a[7] = 0<br />
a[8] = -137<br />
a[9] = 63<br />
</code><br />
Примерный вывод программы 66 Одномерный числовой массив</p>
<table>
<tr>
<td align="center"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2010/11/new_concept.png" alt="" title="Новое понятие" width="80" height="80" class="aligncenter size-full wp-image-3467" /></td>
<td> <strong>dim</strong> variable(количество_элементов)<br />
  <strong>dim</strong> variable$(количество_элементов)<br />
  <strong>dim</strong> variable(количество_рядов, количество_столбцов)<br />
  <strong>dim</strong> variable$(количество_рядов, количество_столбцов)</p>
<p>  Оператор <strong>dim</strong> создает массив в оперативной памяти компьютера размером равном указанному в скобках и именем variable или variable$ (можно задать свое). Размер массива (количество элементов, строк и рядов) должно быть целым положительным числом.</p>
<p>  Оператор <strong>dim</strong> автоматически назначает значение элементам массива равное нулю (0), если массив числовой или равное пустой строке (&quot;&quot;), если массив строковый.
                </td>
</tr>
</table>
<table>
<tr>
<td align="center"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2010/11/new_concept.png" alt="" title="Новое понятие" width="80" height="80" class="aligncenter size-full wp-image-3467" /></td>
<td><strong>variable</strong>[номер_элемента]<br />
  <strong>variable</strong>[номер_строки, номер_столбца]<br />
  <strong>variable$</strong>[номер_элемента]<br />
  <strong>variable$</strong>[номер_строки, номер_столбца]</p>
<p>  где <strong>variable</strong> или <strong>variable$</strong> &#8212; имя массива.<br />
  Вы можете делать ссылки на элементы массива (с помощью его имени и индекса внутри квадратных скобок) в любом месте, где можно использовать простые переменные. Индексы должны быть целым числом от 0 до уменьшенного на один значения указанного в операторе <strong>dim</strong></p>
<p>  Вас может смутить тот факт, что BASIC-256 использует нуль (0) для первого элемента массива и число на единицу меньшее, чем его размер для последнего, но так принято в программировании. Массивы с отсчетом от нуля – так называют такие объекты программисты.
                </td>
</tr>
</table>
<p>Мы можем использовать числовые массивы для рисования большого количества одновременно прыгающих на экране мячиков. Программа 66 использует 5 массивов для хранения местоположения каждого из мячей, его направления движения и цвета. С помощью циклов мы задаем начальные значения этим массивам, а также заставляем мячи двигаться. Эта программа также использует функцию <strong>rgb()</strong>, которая определяет и сохраняет цвет каждого мяча.</p>
<p><code><br />
  1 # manyballbounce.kbs<br />
  2 fastgraphics<br />
  3<br />
  4 r = 10  # размер мяча<br />
  5 balls = 50  # количество мячей<br />
  6<br />
  7 dim x(balls)<br />
  8 dim y(balls)<br />
  9 dim dx(balls)<br />
 10 dim dy(balls)<br />
 11 dim colors(balls)<br />
 12<br />
 13 for b = 0 to balls-1<br />
 14 &nbsp;&nbsp;&nbsp;&nbsp; # начальная позиция мяча<br />
 15 &nbsp;&nbsp;&nbsp;&nbsp; x[b] = 0<br />
 16 &nbsp;&nbsp;&nbsp;&nbsp; y[b] = 0<br />
 17 &nbsp;&nbsp;&nbsp;&nbsp; # скорость по осям x и y<br />
 18 &nbsp;&nbsp;&nbsp;&nbsp; dx[b] = rand * r + 2<br />
 19 &nbsp;&nbsp;&nbsp;&nbsp; dy[b] = rand * r + 2<br />
 20 &nbsp;&nbsp;&nbsp;&nbsp; # каждому мячу — свой цвет!<br />
 21 &nbsp;&nbsp;&nbsp;&nbsp; colors[b] = rgb(rand*256, rand*256, rand*256)<br />
 22 next b<br />
 23<br />
 24 color green<br />
 25 rect 0,0,300,300<br />
 26<br />
 27 while true<br />
 28 &nbsp;&nbsp;&nbsp;&nbsp; # очистим экран<br />
 29 &nbsp;&nbsp;&nbsp;&nbsp; clg<br />
 30 &nbsp;&nbsp;&nbsp;&nbsp; # позиционируем и рисуем мячики<br />
 31 &nbsp;&nbsp;&nbsp;&nbsp; for b = 0 to balls -1<br />
 32 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x[b] = x[b] + dx[b]<br />
 33 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; y[b] = y[b] + dy[b]<br />
 34 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # если мяч выходит за боковые границы поля &mdash; поворачиваем его<br />
 35 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if x[b] &lt; 0 or x[b] &gt; 300 then<br />
 36 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dx[b] = dx[b] * -1<br />
 37 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end if<br />
 38 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # если мяч выходит за верхнюю/нижнюю границу &mdash; поворачиваем его<br />
 39 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if y[b] &lt; 0 or y[b] &gt; 300 then<br />
 40 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dy[b] = dy[b] * -1<br />
 41 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end if<br />
 42 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # рисуем новый мяч<br />
 43 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; color colors[b]<br />
 44 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; circle x[b],y[b],r<br />
 45 &nbsp;&nbsp;&nbsp;&nbsp; next b<br />
 46 &nbsp;&nbsp;&nbsp;&nbsp; # обновляем экран<br />
 47 &nbsp;&nbsp;&nbsp;&nbsp; refresh<br />
 48 &nbsp;&nbsp;&nbsp;&nbsp; pause .05<br />
 49 end while<br />
 </code><br />
Программа 67 Много прыгающих мячиков.</p>
<p><img src="http://freeschool.altlinux.ru/wp-content/uploads/2011/01/chapter13-p67.png" alt="" title="chapter13-p67" width="314" height="372" class="aligncenter size-full wp-image-3908" /><br />
Пример экрана программы 67. Много прыгающих мячиков.</p>
<table>
<tr>
<td align="center"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2010/11/new_concept.png" alt="" title="Новое понятие" width="80" height="80" class="aligncenter size-full wp-image-3467" /></td>
<td> <strong>rgb</strong> (красный, зеленый, синий)</p>
<p>  Функция <strong>rgb</strong> возвращает одно число, которое представляет цвет, вычисленный из трех значений (красного, зеленого и синего). Аргументами этой функции могут быть арифметические выражения, но с одним условием &mdash; их значение должно быть в интервале от 0 до 255.
                </td>
</tr>
</table>
<p>Еще один вариант реализации прыгающих мячей приведен в программе 68. В этом примере используются спрайты и два массива для хранения их траекторий.<br />
<code><br />
  1 #manyballsprite.kbs<br />
  2<br />
  3 # Еще один способ заставить прыгать мячи с использованием спрайтов<br />
  4<br />
  5 fastgraphics<br />
  6 color white<br />
  7 rect 0, 0, graphwidth, graphheight<br />
  8<br />
  9 n = 20<br />
 10 spritedim n<br />
 11<br />
 12 dim dx(n)<br />
 13 dim dy(n)<br />
 14<br />
 15 for b = 0 to n-1<br />
 16 &nbsp;&nbsp;&nbsp;&nbsp; spriteload b, "greenball.png"<br />
 17 &nbsp;&nbsp;&nbsp;&nbsp; spriteplace b,graphwidth/2,graphheight/2<br />
 18 &nbsp;&nbsp;&nbsp;&nbsp; spriteshow b<br />
 19 &nbsp;&nbsp;&nbsp;&nbsp; dx[b] = rand * 5 + 2<br />
 20 &nbsp;&nbsp;&nbsp;&nbsp; dy[b] = rand * 5 + 2<br />
 21 next b<br />
 22<br />
 23 while true<br />
 24 &nbsp;&nbsp;&nbsp;&nbsp; for b = 0 to n-1<br />
 25 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if spritex(b) &lt;=0 or spritex(b) &gt;= graphwidth -1 then<br />
 26 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dx[b] = dx[b] * -1<br />
 27 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end if<br />
 28 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if spritey(b) &lt;= 0 or spritey(b) &gt;= graphheight -1 then<br />
 29 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dy[b] = dy[b] * -1<br />
 30 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end if<br />
 31 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; spritemove b, dx[b], dy[b]<br />
 32 &nbsp;&nbsp;&nbsp;&nbsp; next b<br />
 33 &nbsp;&nbsp;&nbsp;&nbsp; refresh<br />
 34 end while<br />
</code><br />
Программа 68 Много прыгающих мячиков с использованием спрайтов.</p>
<p><img src="http://freeschool.altlinux.ru/wp-content/uploads/2011/01/chapter13-p68.png" alt="" title="chapter13-p68" width="314" height="372" class="aligncenter size-full wp-image-3909" /><br />
Пример вывода программы 68 Много прыгающих мячиков с использованием спрайтов.</p>
<h3>Массивы строк</h3>
<p>Массивы могут хранить не только числа, но и строки. Чтобы открыть строковый массив необходимо использовать идентификатор строковой переменной в операторе <strong>dim</strong>. Все, что мы знаем про числовые массивы применимо и к строковым с учетом различия в типах данных. Использование строковых массивов показано в программе 69.<br />
<code><br />
  1 # listoffriends.kbs<br />
  2 print "Составь список друзей"<br />
  3 input "Сколько всего друзей?", n<br />
  4<br />
  5 dim names$(n)<br />
  6<br />
  7 for i = 0 to n-1<br />
  8 &nbsp;&nbsp;&nbsp;&nbsp;input "Напиши имя друга ?", names$[i]<br />
  9 next i<br />
 10<br />
 11 cls<br />
 12 print "Мои друзья"<br />
 13 for i = 0 to n-1<br />
 14 &nbsp;&nbsp;&nbsp;&nbsp;print "Друг номер ";<br />
 15 &nbsp;&nbsp;&nbsp;&nbsp;print i + 1;<br />
 16 &nbsp;&nbsp;&nbsp;&nbsp;print " это " + names$[i]<br />
 17 next i<br />
</code><br />
Программа 69 Список друзей.<br />
<code><br />
Составь список друзей<br />
Сколько всего друзей?3<br />
Напиши имя друга ?Иван<br />
Напиши имя друга ?Артем<br />
Напиши имя друга ?Денис<br />
-- очистка экрана --<br />
Мои друзья<br />
Друг номер 1, это Иван<br />
Друг номер 2, это Артем<br />
Друг номер 3, это Денис<br />
</code><br />
Пример вывода программы 69 Список друзей.</p>
<h3>Присваивание значений массивам</h3>
<p>Мы использовали фигурные скобки ({}) для воспроизведения музыки, рисования многоугольников и штампов. Фигурные скобки можно также использовать для задания конкретных значений массивам.<br />
<code><br />
  1 # arrayassign.kbs<br />
  2 dim number(3)<br />
  3 dim name$(3)<br />
  4<br />
  5 number = {1, 2, 3}<br />
  6 name$ = {"Юра", "Аня", "Петя"}<br />
  7<br />
  8 for i = 0 to 2<br />
  9 &nbsp;&nbsp;&nbsp;&nbsp;print number[i] + " " + name$[i]<br />
 10 next i<br />
</code><br />
Программа 70 Задание значений массива списком.</p>
<p><code><br />
1 Юра<br />
2 Аня<br />
3 Петя<br />
</code><br />
Пример вывода программы 70 Задание значений массива списком.</p>
<table>
<tr>
<td align="center"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2010/11/new_concept.png" alt="" title="Новое понятие" width="80" height="80" class="aligncenter size-full wp-image-3467" /></td>
<td><strong>array = {</strong>знач0, знач1, &#8230; <strong>}</strong><br />
  <strong>array$ = {</strong>текст0, текст1, &#8230; <strong>}</strong></p>
<p>  Массиву можно задать значения (начиная с индекса 0) с помощью списка значений, заключенных в фигурные скобки. Это применимо как к числовым, так и строковым массивам.
                </td>
</tr>
</table>
<h3>Звуки и массивы</h3>
<p>В главе 3 мы видели как использовать список частот и длительностей (заключенных в фигурные скобки) для проигрывания нескольких звуков одновременно. Команда <strong>sound</strong> также может принять список частот и длительностей из массива. Массив должен иметь четное чиcло элементов, причем частоты хранятся в элементах с четными индексами (0, 2, 4, …), а длительности в элементах с нечетными индексами (1,3,5, …)</p>
<p>Следующий пример (программа 71) ниже использует простую линейную зависимость для создания фонового звука типа чириканья.</p>
<p><code><br />
  1 # spacechirp.kbs<br />
  2<br />
  3 # четные значения 0,2,4... - частота звука<br />
  4 # нечетные значения 1,3,5... - длительность<br />
  5<br />
  6 # чириканье начинается со 100гц и увеличивается на 40 для каждого из 50 звуков в списке, длительность всегда равна 10<br />
  7<br />
  8 dim a(100)<br />
  9 for i = 0 to 98 step 2<br />
 10 &nbsp;&nbsp;&nbsp;&nbsp;a[i] = i * 40 + 100<br />
 11 &nbsp;&nbsp;&nbsp;&nbsp;a[i+1] = 10<br />
 12 next i<br />
 13 sound a<br />
</code><br />
Программа 71 Космическое чириканье</p>
<table>
<tr>
<td align="center"><a href="http://freeschool.altlinux.ru/wp-content/uploads/2010/11/explore.png"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2010/11/explore.png" alt="" title="Попробуй, исследуй!" width="80" height="80" class="aligncenter size-full wp-image-3482" /></a></td>
<td>Как много разных фантастических звуков ты сможешь запрограммировать? Поэкспериментируй с предложенными формулами для изменения частот и длительностей.
                </td>
</tr>
</table>
<h3>Графики и массивы</h3>
<p>В главе 8 мы использовали списки для создания многоугольников и штампов. Массивы также применимы для этой цели, что приведет к упрощению кода. Достаточно один раз определить штамп или многоугольник, сохраняя данные в массиве, и использовать этот массив в разных местах программы.</p>
<p>В массиве, используемом для штампов и многоугольников четные элементы (0,2,4,&#8230;) содержат абсциссы (х), а нечетные элементы (1,3,5,..) содержат ординату (y) точек, образующих фигуру, по два значения на каждую точку.<br />
<code><br />
  1 # shadowstamp.kbs<br />
  2<br />
  3 dim xmark(24)<br />
  4 xmark = {-1, -2, 0, -1, 1, -2, 2, -1, 1, 0, 2, 1, 1, 2, 0, 1, -1, 2, -2, 1, -1, 0, -2, -1}<br />
  5<br />
  6 clg<br />
  7 color grey<br />
  8 stamp 160,165,50,xmark<br />
  9 color black<br />
 10 stamp 150,150,50,xmark<br />
</code></p>
<p>Программа 72 Штамп с тенью</p>
<p><img src="http://freeschool.altlinux.ru/wp-content/uploads/2011/01/chapter13-p72.png" alt="" title="chapter13-p72" width="314" height="372" class="aligncenter size-full wp-image-3910" /><br />
Пример вывода программы 72 Штамп с тенью</p>
<p>Массивы также можно использовать, чтобы создать многоугольник математически (по формулам). В программе 73 мы создаем массив из 10 элементов (5 точек) придавая им случайные значения. BASIC-256 заполняет эти формы как умеет, но если линии сторон пересекаются (невыпуклый многоугольник), заполнение может оставлять пустоты и дырки.<br />
<code><br />
  1 # mathpoly.kbs<br />
  2<br />
  3 dim shape(10)<br />
  4<br />
  5 for t = 0 to 8 step 2<br />
  6 &nbsp;&nbsp;&nbsp;&nbsp;x = 300 * rand<br />
  7 &nbsp;&nbsp;&nbsp;&nbsp;y = 300 * rand<br />
  8 &nbsp;&nbsp;&nbsp;&nbsp;shape[t] = x<br />
  9 &nbsp;&nbsp;&nbsp;&nbsp;shape[t+1] = y<br />
 10 next t<br />
 11<br />
 12 clg<br />
 13 color black<br />
 14 poly shape<br />
</code></p>
<p>Программа 73 создание случайного прямоугольника</p>
<p><img src="http://freeschool.altlinux.ru/wp-content/uploads/2011/01/chapter13-p73.png" alt="" title="chapter13-p73" width="314" height="372" class="aligncenter size-full wp-image-3911" /><br />
Примерный вывод программы 73 создание случайного прямоугольника</p>
<h3>Для продвинутых: Двумерные массивы</h3>
<p>До сих пор в этой главе мы использовали массивы, как простые списки чисел или строк. Такие массивы называются одномерными, поскольку они похожи на линейку значений. Массивы также могут быть созданы с использованием строк и столбцов данных — такие массивы называют двумерными. Программа 74 использует одномерные и двумерные массивы для вычисления средней оценки студента. (см таблицу к программе 74)</p>
<table width=100% CELLPADDING=4 CELLSPACING=0 border="1">
<tr>
<td>&nbsp;</td>
<td> Оценка 1 </td>
<td> Оценка 2 </td>
<td> Оценка 3 </td>
<td> Оценка 4 </td>
<td> Среднее </td>
</tr>
<tr>
<td> Джим </td>
<td> 90 </td>
<td> 92 </td>
<td> 81 </td>
<td> 55 </td>
<td> ? </td>
</tr>
<tr>
<td> Сью </td>
<td> 66 </td>
<td> 99 </td>
<td> 98 </td>
<td> 88 </td>
<td> ? </td>
</tr>
<tr>
<td> Тони </td>
<td> 79 </td>
<td> 81 </td>
<td> 87 </td>
<td> 73 </td>
<td> ? </td>
</tr>
</table>
<p>Таблица к программе 74<a name="m1"></a><a href="#ref1"><sup>1</sup></a><br />
<code><br />
  1 # grades.kbs<br />
  2 # вычисление средней оценки студента<br />
  3 # и для всего класса<br />
  4<br />
  5 nstudents = 3 # количество студентов<br />
  6 nscores = 4 # количество оценок у студента<br />
  7<br />
  8 dim students$(nstudents)<br />
  9<br />
 10 dim grades(nstudents, nscores)<br />
 11 # сохраняем оценки студента в столбцах одного ряда<br />
 12 # первый студент<br />
 13 students$[0] = "Джим"<br />
 14 grades[0,0] = 90<br />
 15 grades[0,1] = 92<br />
 16 grades[0,2] = 81<br />
 17 grades[0,3] = 55<br />
 18 # второй студент<br />
 19 students$[1] = "Сью"<br />
 20 grades[1,0] = 66<br />
 21 grades[1,1] = 99<br />
 22 grades[1,2] = 98<br />
 23 grades[1,3] = 88<br />
 24 # Третий студент<br />
 25 students$[2] = "Тони"<br />
 26 grades[2,0] = 79<br />
 27 grades[2,1] = 81<br />
 28 grades[2,2] = 87<br />
 29 grades[2,3] = 73<br />
 30<br />
 31 total = 0<br />
 32 for row = 0 to nstudents-1<br />
 33 &nbsp;&nbsp;&nbsp;&nbsp;studenttotal = 0<br />
 34 &nbsp;&nbsp;&nbsp;&nbsp;for column = 0 to nscores-1<br />
 35 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;studenttotal = studenttotal + grades[row, column]<br />
 36 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;total = total + grades[row, column]<br />
 37 &nbsp;&nbsp;&nbsp;&nbsp;next column<br />
 38 &nbsp;&nbsp;&nbsp;&nbsp;print students$[row] + " - среднее равно ";<br />
 39 &nbsp;&nbsp;&nbsp;&nbsp;print studenttotal / nscores<br />
 40 next row<br />
 41 print "Среднее по классу ";<br />
 42 print total / (nscores * nstudents)<br />
 43<br />
 44 end<br />
</code><br />
Программа 74 Вычисление успеваемости</p>
<p><code><br />
Джим - среднее равно 79,5<br />
Сью - среднее равно 87,75<br />
Тони - среднее равно 80,<br />
Среднее по классу 82,416667<br />
</code><br />
Пример вывода программы 74 Вычисление успеваемости</p>
<h3>Для действительно продвинутых — Размеры массива</h3>
<p>Иногда необходимо в программе использовать массив, размеры которого мы не знаем. Если поставить вместо индекса внутри квадратных скобок знак вопроса, BASIC-256 вернет размер этого массива. В программе 75 мы распечатываем массив независимо от размера. В строке 16 обратите внимание на специальный знак <strong>[?]</strong> использованный для получения размера массива.<br />
<code><br />
  1 # size.kbs<br />
  2 dim number(3)<br />
  3 number = {77, 55, 33}<br />
  4 print "до"<br />
  5 gosub shownumberarray<br />
  6<br />
  7 # добавляем новый элемент в конец<br />
  8 redim number(4)<br />
  9 number[3] = 22<br />
 10 print "после"<br />
 11 gosub shownumberarray<br />
 12 #<br />
 13 end<br />
 14 #<br />
 15 shownumberarray:<br />
 16 for i = 0 to number[?] - 1<br />
 17 &nbsp;&nbsp;&nbsp;&nbsp;print i + " " + number[i]<br />
 18 next i<br />
 19 return<br />
</code></p>
<p>Программа 75 Получение размера массива</p>
<p><code><br />
до<br />
0,<br />
77,<br />
1,<br />
55,<br />
2,<br />
33,<br />
после<br />
0,<br />
77,<br />
1,<br />
55,<br />
2,<br />
33,<br />
3,<br />
22,<br />
</code><br />
Пример вывода программы 75 Получение размера массива</p>
<table>
<tr>
<td align="center"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2010/11/new_concept.png" alt="" title="Новое понятие" width="80" height="80" class="aligncenter size-full wp-image-3467" /></td>
<td><strong>array</strong>[?]<br />
  <strong>array$</strong>[?]<br />
  <strong>array</strong>[?,]<br />
  <strong>array$</strong>[?,]<br />
  <strong>array</strong>[,?]<br />
  <strong>array$</strong>[,?]</p>
<p>  Ссылка на [?] элемент массива возвращает длину одномерного массива или полное число элементов (количество строк умноженное на количество столбцов) двумерного массива. [?,] – возвращает количество строк , а [,?] – возвращает количество столбцов двумерного массива.
                </td>
</tr>
</table>
<h3>Для очень продвинутых – Динамические массивы</h3>
<p>BASIC-256 позволяет изменять размер существующего массива. Оператор <strong>redim</strong> предназначен для изменения массива с сохранением существующих данных. Если новый массив больше старого, новые элементы заполняются нулями (0) или пустыми строками (&quot;&quot;). Если новый массив меньше старого, значения, которые выходят за рамки нового массива обрезаются. Массивы, размеры которых можно менять во время работы программы называются динамическими<a name="m2"></a><a href="#ref2"><sup>2</sup></a>.</p>
<p><code><br />
  1 # redim.kbs<br />
  2 dim number(3)<br />
  3 number = {77, 55, 33}<br />
  4 # создаем новый элемент в конце массива<br />
  5 redim number(4)<br />
  6 number[3] = 22<br />
  7 #<br />
  8 for i = 0 to 3<br />
  9 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print i + " " + number[i]<br />
 10 next i<br />
</code><br />
Программа 76 Изменение размера массива<br />
<code><br />
0&nbsp;&nbsp;77<br />
1&nbsp;&nbsp;55<br />
2&nbsp;&nbsp;33<br />
3&nbsp;&nbsp;22<br />
</code><br />
Пример вывода программы 76 Изменение размера массива</p>
<table>
<tr>
<td align="center"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2010/11/new_concept.png" alt="" title="Новое понятие" width="80" height="80" class="aligncenter size-full wp-image-3467" /></td>
<td><strong>redim</strong> variable(количество_элементов)<br />
  <strong>redim</strong> variable$(количество_элементов) <br />
  <strong>redim</strong> variable(число_рядов, число_колонок)<br />
  <strong>redim</strong> variable$(число_рядов, число_колонок) </p>
<p>  Оператор <strong>redim</strong> изменяет размер массива в памяти компьютера. Данные, хранившиеся в массиве сохраняются, если они подходят по размеру к новому массиву.</p>
<p>  Когда изменяется размер двухмерного массива данные копируются линейно, и могут нежелательно сдвинутся, если вы измените количество колонок.
                </td>
</tr>
</table>
<table width=650 CELLPADDING=4 CELLSPACING=0>
<table>
<tr>
<td align="center"><img src="http://freeschool.altlinux.ru/wp-content/uploads/2010/11/big_program.png" alt="" title="Большая программа" width="80" height="80" class="aligncenter size-full wp-image-3493" />
                </td>
<td>Большая программа в этой главе использует три числовых массива для хранения позиций и скоростей падающего космического мусора. Тут вы не играете в пинг-понг, а наоборот, стараетесь увернуться от падающих объектов, чтобы заработать очки.
                </td>
</tr>
</table>
<p><code><br />
  1 # spacewarp.kbs<br />
  2 # Игра Космический мусор<br />
  3<br />
  4 balln = 5&nbsp; # количество мячей<br />
  5 dim ballx(balln)  # массивы для хранения положения и скоростей мячей<br />
  6 dim bally(balln)<br />
  7 dim ballspeed(balln)<br />
  8 ballr = 10&nbsp;# радиус мяча<br />
  9<br />
 10 minx = ballr # минимальное значение координаты х мяча<br />
 11 maxx = graphwidth - ballr # максимальное значение координаты х мяча<br />
 12 miny = ballr # минимальное значение координаты y мяча<br />
 13 maxy = graphheight - ballr&nbsp;# максимальное значение координаты y мяча<br />
 14 score = 0&nbsp;# в начале счет равен 0<br />
 15 playerw = 30&nbsp; # ширина игрока<br />
 16 playerm = 10&nbsp; # шаг игрока<br />
 17 playerh = 10&nbsp; # высота игрока<br />
 18 playerx = (graphwidth - playerw)/2&nbsp;&nbsp;# начальное значение координаты х игрока - середина поля<br />
 19 keyj = asc("J") # значение для клавиши 'j'<br />
 20 keyk = asc("K") # значение для клавиши 'k'<br />
 21 keyq = asc("Q") # значение для клавиши 'q'<br />
 22 growpercent = .20&nbsp; # случайное расширение игрока - чем больше, тем быстрее<br />
 23 speed = .15&nbsp;  # скорость - чем меньше, тем быстрее<br />
 24<br />
 25 print "Космический мусор - использовать j и k клавиши чтобы избежать столкновения с космическим мусором"<br />
 26 print "q - закончить"<br />
 27<br />
 28 fastgraphics<br />
 29<br />
 30 # установка начальных значений скорости и положения мячей<br />
 31 for n = 0 to balln-1<br />
 32&nbsp;&nbsp;&nbsp;&nbsp; gosub setupball<br />
 33 next n<br />
 34<br />
 35 more = true<br />
 36 while more<br />
 37&nbsp;&nbsp;&nbsp;&nbsp; pause speed<br />
 38&nbsp;&nbsp;&nbsp;&nbsp; score = score + 1<br />
 39<br />
 40&nbsp;&nbsp;&nbsp;&nbsp; # очистка экрана<br />
 41&nbsp;&nbsp;&nbsp;&nbsp; color black<br />
 42&nbsp;&nbsp;&nbsp;&nbsp; rect 0, 0, graphwidth, graphheight<br />
 43<br />
 44&nbsp;&nbsp;&nbsp;&nbsp; # рисуем мячи и проверяем на наличие столкновений<br />
 45&nbsp;&nbsp;&nbsp;&nbsp; color white<br />
 46&nbsp;&nbsp;&nbsp;&nbsp; for n = 0 to balln-1<br />
 47&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bally[n] = bally[n] + ballspeed[n]<br />
 48&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if bally[n] &gt; maxy then gosub setupball<br />
 49&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; circle ballx[n], bally[n], ballr<br />
 50&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((bally[n]) &gt;= (maxy-playerh-ballr)) and ((ballx[n]+ballr) &gt;= playerx) and ((ballx[n]-ballr) &lt;= (playerx+playerw)) then more = false<br />
 51&nbsp;&nbsp;&nbsp;&nbsp; next n<br />
 52<br />
 53&nbsp;&nbsp;&nbsp;&nbsp; # рисуем игрока<br />
 54&nbsp;&nbsp;&nbsp;&nbsp; color red<br />
 55&nbsp;&nbsp;&nbsp;&nbsp; rect playerx, maxy - playerh, playerw, playerh<br />
 56&nbsp;&nbsp;&nbsp;&nbsp; refresh<br />
 57<br />
 58&nbsp;&nbsp;&nbsp;&nbsp; # игрок растет в ширину<br />
 59&nbsp;&nbsp;&nbsp;&nbsp; if (rand&lt;growpercent) then playerw = playerw + 1<br />
 60<br />
 61&nbsp;&nbsp;&nbsp;&nbsp; # проверяем нажата ли клавиша и перемещаем игрока, если нажата<br />
 62&nbsp;&nbsp;&nbsp;&nbsp; k = key<br />
 63&nbsp;&nbsp;&nbsp;&nbsp; if k = keyj then playerx = playerx - playerm<br />
 64&nbsp;&nbsp;&nbsp;&nbsp; if k = keyk then playerx = playerx + playerm<br />
 65&nbsp;&nbsp;&nbsp;&nbsp; if k = keyq then more = false<br />
 66<br />
 67&nbsp;&nbsp;&nbsp;&nbsp; # не вышел ли игрок за границы поля?<br />
 68&nbsp;&nbsp;&nbsp;&nbsp; if playerx &lt; 0 then playerx = 0<br />
 69&nbsp;&nbsp;&nbsp;&nbsp; if playerx &gt; graphwidth - playerw then playerx = graphwidth - playerw<br />
 70<br />
 71 end while<br />
 72<br />
 73 print "счет " + string(score)<br />
 74 print "вы погибли."<br />
 75 end<br />
 76<br />
 77 setupball:<br />
 78 bally[n] = miny<br />
 79 ballx[n] = int(rand * (maxx-minx)) + minx<br />
 80 ballspeed[n] = int(rand * (2*ballr)) + 1<br />
 81 return<br />
</code></p>
<p>Программа 77 Большая программа – Игра Космический мусор</p>
<p><img src="http://freeschool.altlinux.ru/wp-content/uploads/2011/01/chapter13-p77.png" alt="" title="chapter13-p77" width="314" height="372" class="aligncenter size-full wp-image-3912" /><br />
Примерный экран программы 77 Большая программа – Игра Космический мусор</p>
<p> &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
 <a name="ref1"></a><a href="#m1"><sup>1</sup></a>В школах многих зарубежных стран используется 100-бальная система оценок (<em>прим. переводчика</em>)</p>
<p><a name="ref2"></a><a href="#m2"><sup>2</sup></a>Программа 75 также является демонстрацией динамических массивов. Обратите внимание на оператор <strong>redim</strong> (<em>прим. переводчика</em>).</p>
<p>============================<br />
<a name="basic"></a><br />
<h3>Где скачать BASIC-256:</h3>
<p><strong>Для дистрибутивов ALT Linux</strong></p>
<ul>
<li>ветка 4.0 <a href="http://ftp.altlinux.org/pub/distributions/ALTLinux/4.0/branch/files/i586/RPMS/basic256-0.9.6-alt5.M40.1.i586.rpm">basic256-0.9.6-alt5.M40.1.i586.rpm</a></li>
<li>ветка 4.1 <a href="http://ftp.altlinux.org/pub/distributions/ALTLinux/4.1/branch/files/i586/RPMS/basic256-0.9.6-alt5.M41.1.i586.rpm">basic256-0.9.6-alt5.M41.1.i586.rpm</a></li>
<li>ветка p5 <a href="http://ftp.altlinux.org/pub/distributions/ALTLinux/p5/branch/files/i586/RPMS/basic256-0.9.6-alt5.M50P.1.i586.rpm">basic256-0.9.6-alt5.M50P.1.i586.rpm</a></li>
<li>ветка 5.1 <a href="http://ftp.altlinux.org/pub/distributions/ALTLinux/5.1/branch/files/i586/RPMS/basic256-0.9.6-alt5.M51.1.i586.rpm">basic256-0.9.6-alt5.M51.1.i586.rpm</a></li>
</ul>
<p><strong>Windows версия</strong><br />
<a href="http://basic256.org">http://basic256.org</a> (<a href="http://www.sourceforge.net/projects/kidbasic">http://www.sourceforge.net/projects/kidbasic</a>)</p>
<h3> Как установить BASIC-256 в Linux</h3>
<p><strong>Для Альт Линукс:</strong> настроить репозиторий и обновить/установить пакет через synaptic или apt<br />
<strong>Для rpm-based дистрибутивов:</strong> rpm -Uvh &lt;имя_пакета&gt;.rpm<br />
</ljcut></p>
]]></content:encoded>
			<wfw:commentRss>http://freeschool.altlinux.ru/?feed=rss2&#038;p=3906</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
