Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Урок 2. Учимся правильно считать.



Выпуск 5 Уроки программирования на Turbo Pascal 2006-09-10


Крепкого всем коннекта!


В этом выпуске:
1. Читаем правильные книжки
2. Учимся вместе
3. Узнаем больше про ОСи
4. Еще раз про инструменты
5. Урок 2: Учимся правильно считать


Читаем правильные книжки


  Меня умиляют подписчики (не только этой моей рассылки) гордо заявляющие, что бумажные книги их не интересуют. Ребята! Я знаю только ДВЕ _хорошие_ книги, которые _исходно_ были электронными. Почему-то эти подписчики (иногда достаточно сильные специалисты) даже не подозревают, что не каждую _хорошую_ книгу можно найти в электронном виде. Да и прежде чем искать книгу - надо хотя бы узнать, что такая книга существует! А как это узнать? Думаете поисковики помогут? Проверьте фамилии - Шульман, Питрэк, Рихтер, Вильямс, Харт. И что нашли? В каком порядке читать будете? А без усвоения книг этих авторов - ой, как не понятно, под Windows программировать. А есть еще области, крайне необходимые для генерации качественного софта - рефакторинг, шаблоны, UML,... о которых простым запросом к поисковиками ответа не найдешь. Как об этом узнать - читать книги. Как узнать, что входит в тот минимум области, о которой ничего не слышал? Ответ тривиален - надо спросить Ворчунию в её книжной рассылке. Что не читала я, то подскажут другие специалисты, читающие и пишущие в мою рассылку. Хотите стать таким специалистом, присоединяйтесь: ( Подписаться по почте )

Ворчуния о книгах для админов и программистов -2

   



Учимся вместе


  Все, кто учился самостоятельно, прекрасно знают, когда есть напарник в познании - процесс понимания и выработки навыков идет в несколько раз быстрее. Вы один сидите за компьютером, но у Вас есть почта, а Вам всего лишь надо присоединиться к совместному общению таких же учеников: ( Подписаться по почте )

Учим паскаль вместе

   

  Тех, кто хочет обсудить принципы, положенные в основу этого курса, или сами уроки, ТОЖЕ приглашаю присоединиться к этой почтовой конференции.




Узнаем больше про ОСи


  "Правильные" программисты, как правило, навязывают мнение, что простым программистам интересоваться каким-либо другими операционными системами (ОСями) кроме Windows или, в крайнем случае, nix-семейством верх неприличия. Но не понимая, как функционирует та среда, для которой пишешь, нельзя написать качественный устойчивый код. Мир осей не ограничен всего двумя семействами, он гораздо богаче. И как говорится в одном путеводителе по реалу - "чем больше знаешь, тем меньше влипаешь!".

  Если Вы умеете самостоятельно добывать знание, следуя ссылкам, для Вас рассылка: ( Подписаться по почте )

Лучшие сайты про устройство ОСей

   



Инструменты


  Для практической работы Вам потребуется программа-компилятор. Если у Вас есть комплект Turbo Pascal, Borland Pascal, Delphi или Kylix, то в конце выпуска указывается название файла компилятора. Если у Вас нет этих комплектов, то вы сейчас можете скачать 82 Кб.

  Так как все примеры являются консольными, для компиляции удобней использовать соответствующий консольный компилятор. Командные строки для запуска компиляции

Turbo Pascal
   \там где он стоит\tpc.exe путь_до_hello\hello.pas
или
   \там где он стоит\BIN\tpc.exe путь_до_hello\hello.pas

Borland pascal
   \там где он стоит\BIN\tpc.exe путь_до_hello\hello.pas
или
   \там где он стоит\BIN\bpc.exe путь_до_hello\hello.pas

Delphi
   \там где она стоит\BIN\dcc32.exe -CC путь_до_hello\hello.pas
или
   \там где она стоит\BIN\dcc.exe -CC путь_до_hello\hello.pas


Kylix
   \там где он стоит\BIN\dcc путь_до_hello\hello.pas

  Для запуска консольного компилятора удобней работать в консоли, либо используя консольное окно командного процессора, либо используя оболочку FAR

  Если у Вас еще нет FARа (бесплатен для русскоговорящих), то




УРОК 2


  Сегодняшний урок посвящен цифрам и числам. Текст урока предполагает, что его просто прочтут. Вопросы по тексту задавать можно! (лично мне или в листе - адреса были выше). Ничего заучивать не надо - примите к сведению. В последующих уроках мы неоднократно будем возвращаться к этому материалу и отработаем до автоматизма при создании более содержательных программ.


  Если ещё не известно, то сообщу новость: компьютер "понимает" только числа, причем только две штуки - 0 и 1.
Для любознательных

Так как компьютеры нынче работают на электричестве, то эти две цифры для него "выглядят" как два разных не нулевых уровня напряжения.

Возникает вопрос - а как же компьютер понимает числа больше единицы? Ответом будет вопрос: а как люди понимают, например, число одиннадцать, если цифр всего десять: 0,1,2,3,4,5,6,7,8,9?

11 = 10+1 = 1*10 + 1
Для любознательных

ПОЗИЦИОННАЯ система исчисления, в которой значимость цифры зависит от того сколько справа(до точки) есть еще цифр, была изобретена в Индии, а называется арабской. Десятичная (т.е. с 10-цифрами) позтционная система, заменив в Европе систему римский цифр, позволила простейшим образом записывать очень-очень большие числа, а главное тривиально _действовать_ с числами (сложение, вычитание, умножение, деление "в столбик" для римских цифр не доступно).

Для любознательных

В Computer Science системы исчисления являются частным случаем кодирования информации.

  Запишем
3 = 2+1 = 1*2 + 1 = 11b
Для любознательных

b - это программистское от binary, т.е. бинарное ака двоичное. В теоретических книгах для указания основания (количество используемых цифр) исчисления используют нижний индекс в конце числа, т.е. вместо b может быть приписана крохотная двоечка.

Используя эту логику представим в виде 0 и 1 числа от 0 до 15: Заполните сами таблицу:
0 = 4 = 8 = 12 =
1 = 5 = 9 = 13 =
2 = 6 = 10 = 14 =
3 = 7 = 11 = 15 =
Посчитайте на пальцах правой руки:
0 - кулак сжат ладонью к себе
1 - большой палец вытянули,
2 - прижали большой палей, вытянули указательный,
3 - вытянули большой и указательный,
4 - прижали большой и указательный, вытянули средний,
5 - среднему добавили большой,
6 - убрали большой, к среднему добавили указательный,
7 - теперь показываете три пальца - большой, указательный, средний
...
продолжите самостоятельно
`
`
`
`
`
`
`
`
Сколько пальцев Вам потребовалось для числа пятнадцать? `
`
`
`
`
`
`
`
Проверьте таблицу:
0 =0b 4 =100b8 =1000b12 =1100b
1 =1b 5 = 101b9 =1001b 13 =1101b
2 =10b 6 = 110b10 =1010b 14 =1110b
3 =11b 7 = 111b11 =1011b 15 =1111b

  Чем больше число, тем при таком кодировании длиннее последовательность из нулей и единиц. А как узнать сколько требуется "0 и 1"(bit = бит) для записи, например, текущего года?

     1 бита нам хватило для 2 чисел: 0..1
     2 бит  уже хватило для 4 чисел: 0..3
     3 бит   достаточно для 8 чисел: 0..7
     4 бит                  ? чисел: 0..?
     5 бит                  ? числа: 0..?
     6 бит                 64 числа: 0..63
     

  Уловили, что добавление всего одного бита удваивает диапазон чисел? А это значит, что для ответа "сколько бит нужно для записи года(числа) 2006", нужно найти такое произведение двоек, которое строго больше нашего 2006, а затем подсчитать количество двоек в этом произведении.

  Ничего сложного в этом нет, я уверена, Вы уже почти помните последовательность произведений двоек, только не догадываетесь :-) 2,4,8,16,32,64,128,256,1024,.... Правда знакомо? :-)

  Теперь Вам не составит труда объяснить почему нужно 10 бит для записи этого года, и какое максимальное число можно записать десятичным десятком бит, и как эти два числа выглядят в двоичном представлении.


  Вероятно, Вы уже пришли в уныние от предположения, что и Вам придется отказаться от привычных десятичных чисел, переводить всё в двоичное исчисление. Ситуация плоха, но с точностью до наоборот. Помните мы на первом уроке говорили про компилятор - ту программу, которая превращает текст на человеческом языке (pascal - это язык _для_ людей) в машинный язык (язык нулей и единиц)? Компилятор не поймёт, если Вы напишите число в двоичном виде, а не в десятичном :-(

  А как же увидеть двоичное представление? - А вот для этого Вам придется усвоить новую операцию над одиночными битами и еще одну операцию над последовательностью бит.

  Четыре арифметические операции никто не отменял. Суть сложения/вычитания, умножения/деления числе не меняется от того, в какой системе исчисления числа записаны. Но для 1 бита, имеющего всего два значения 1 и 0, они не интересны. Поэтому над битом были определены _логические_ операции: AND, OR, XOR, NOT.
Для любознательных

Операции названы логическими, так как произошли от операций в логике. В логике вместо чисел используются понятия ЛОЖЬ и ИСТИНА. В русской литературе операторы принято называть И, ИЛИ, Исключающее ИЛИ, Отрицание. Для записи этих операций существуют специальные знаки.

  На этом уроке нас интересует только первая операция - AND. Чтобы Вы прочувствовали результаты применения AND, напишем программу
Программа bit AND bit

  PROGRAM andbits;
  BEGIN
                   writeln(0 AND 0);
                   writeln(0 AND 1);
                   writeln(1 AND 0);
                   writeln(1 AND 1);
  END. 

  Вот этим свойством ( результирующая единица возможна только в случае единичности обоих бит) мы и воспользуемся во второй программе
Программа число AND 1bit

  PROGRAM andnums;
  BEGIN
                   writeln(7 AND 1);
                   writeln(7 AND 2);
                   writeln(7 AND 4);
                   writeln(7 AND 8);
  END. 
Подумайте, чем примечательны числа: 1,2,4,8? Подсказка: посмотрите на их двоичный вид. Поиграйте: замените 7 на другие числа: 5, 9, 15.

  Напоминаю, любое число в компьютере имеет двоичное представление, поэтому к битам двух числе мы можем попарно применить AND:


     7 = 0111b    7 = 0111b  7 = 0111b  7 = 0111b
     and          and        and        and
     1 = 0001b    2 = 0010b  4 = 0100b  8 = 1000b
         ----         ----       ----       ----
     1 = 0001b    2=  0010b  4=  0100b  0=  0000b

  Кстати, 7=1+2+4. Почему? Подсказка - запишите числа в двоичном виде в столбик и сложите ;-)

  Т.е. применяя операцию AND к числу содержащему только один единичный бит и произвольному числу, мы узнаём единичный ли соответствующий бит в этом произвольном числе.

  Замечательно, но мы же хотим увидеть на экране двоичное представление числа. А в этом нам поможет операция сдвига битов SHR
Программа Сдвиг вправо

  PROGRAM SHR;
  BEGIN
                   writeln(8 SHR 1);
                   writeln(8 SHR 2);
                   writeln(8 SHR 3);
                   writeln(8 SHR 4);
  END. 
8 = 1000b. Сдвинем вправо на 1 бит: 1000b SHR 1 = 0100b =4. На 2 бита: 1000b SHR 2 = 0010b =2. Замените восьмерку на числа содержащие большее количество единичных бит. Прочувствуйте суть сдвига.

  А вот теперь мы готовы написать программу представляющую любое число (пока 4-битное) в двоичном виде:
Программа Бинарный вид

  PROGRAM binary;
  BEGIN
                   writeln(13);
                   write( 13 and 8 shr 3 );
                   write( 13 and 4 shr 2 );
                   write( 13 and 2 shr 1 );
                   write( 13 and 1       );
                   writeln;
  END. 
Первая строка кода выводит число в десятичном виде. Обратите внимание, что в следующих четырех строках использовано более короткое слово - WRITE, позволяющее вывести четыре числа на 1 строке. Последняя строка кода - "закрывает" строку. Удалите её. И дважды запустите программу на выполнение. Понравились "слипшиеся" строки? Замените в программе 13 на другие числа и сравните результат с таблицей в начале урока.

  ДОМАШНЕЕ ЗАДАНИЕ - переделать программу так, чтобы она показывала двоичное представление 8-битных чисел. (Ответы будут публиковаться в дискуссионном листе)

  Сейчас Вы уже знаете все и можете легко написать программу, которая будет выводить два числа и результат операции AND для этих числе в двоичном виде. Попробуйте выполнить это задание самостоятельно. Это очень просто: `
`
`
`
`
`
`
`
`
`
`
`
`
если страшно, то смотрите ниже: `
`
`
`
`
`
`
`
`
`
`
`
`
Программа Двоичное сложение

  PROGRAM andbin;
  BEGIN
                   writeln(13);
                   writeln(15);
                   writeln(13 and 15);

                   write( 13 and 8 shr 3 );
                   write( 13 and 4 shr 2 );
                   write( 13 and 2 shr 1 );
                   write( 13 and 1       );
                   writeln;

                   write( 15 and 8 shr 3 );
                   write( 15 and 4 shr 2 );
                   write( 15 and 2 shr 1 );
                   write( 15 and 1       );
                   writeln;

                   write( 13 and 15 and 8 shr 3 );
                   write( 13 and 15 and 4 shr 2 );
                   write( 13 and 15 and 2 shr 1 );
                   write( 13 and 15 and 1       );
                   writeln;
  END. 

  Видите, как всё просто! Потренируйтесь с другими числами, а свои вычисления на бумажке - сверяйте с результатом модифицированной программы.

  Со следующего урока мы уже начнем работать с памятью!

С уважением,
Ворчуния












В избранное