скачать «Побитное кодирование информации» для профильной подготовки учеников 10—11 классов Сурчалова Лариса Владимировна, учитель информатики МОУ «ЛПН», к.п.н., доцент кафедры информатики СарИПКиПРО Ножкин Алексей Юрьевич Пояснительная записка Творческое название: Программировать интересно! Количество часов на курс:16 Образовательная область: Информатика и информационные технологии Тип курса: профильный, предметно-ориентированный курс, направленный на развитие содержания предмета «Информационные технологии» Курс рассчитан на профильное образование в школах, лицеях, гимназиях по информатике и информационным технологиям в 10 11 классах Идея курса: привить интерес к программированию, научить понимать, как кодируются двоичное представления чисел, символов, пиктограмм, как работает мышь. Обоснованность курса заключается в том, что умение программировать на хотя бы одном алгоритмическом языке позволяет осваивать самостоятельно любые языки программирования, что готовит учащихся к профессиональной деятельности в информационном обществе. Кроме того, подобные задачи встречаются на олимпиадах по информатике, а умение работать с одним устройством (мышь), поможет понять работу с другими внешними устройствами. Построение пиктограммы позволяет акцентировать знания машинных систем счисления и Алгебры логики. Особенностью курса является наличие большого количества очень интересных, специально подобранных задач, ранее не рассмотренных в учебной литературе Состав учебно-методического комплекта Учебно-методический комплект по Элективному курсу для профильной подготовки учеников 10—11 классов «Побитное кодирование информации» включает в себя учебное пособие (теоретически материал и задания для самостоятельной работы), презентации для лекций, дополнительную литературу. Задания в учебно-методическом комплекте разной сложности, что делает возможным личностно-ориентированный подход к учащимся. Ко всем заданиям даны подробные пояснения. Текущий контроль усвоения материала можно осуществить по результатам выполнения заданий, а итоговый контроль - по выполнению творческого задания и его защиты. Организация учебного процесса реализуется в виде уроков, большая часть из которых в виде практических работ на компьютере на алгоритмическом языке Паскаль. Программа курса.
Примечание. В элективном курсе учитывается ситуация, что учащиеся знают основные алгоритмические структуры и основы языка Паскаль. Курс «Побитное кодирование информации» позволяет глубоко понять основы машинного кодирования для разных видов информации. Поэтому изучение элективного курса в концентрическом аспекте делает возможным успешное усвоение языков программирования. Требования к знаниям учащихся После изучения курса учащиеся должны уметь:
Тематическое планирование курса
Побитное кодирование информации Многие сложные вопросы кодирования информации легко понять, решая задачи. Как кодируются знаки письменности в таблице ASCII и почему любой текст можно представить в виде наборов из 0 и 1? Чем отличаются при кодировании прописные и строчные буквы? Зачем нужны логические операции, и какие задачи можно решить с их помощью? Каким образом зашифровать информацию? Как получить двоичный код целого числа самым коротким способом? Почему курсор мыши разный и как его изменить? В задачах, представленные ниже, можно концентрически рассмотреть при темы «Кодирование информации», «Строки», «Системы счисления», «Графика». ^ Задача 1. Распечатаем таблицу кодов ASCII, исключая управляющие символы с кодами 7-10 и 13. Например, в этой таблице шестнадцатеричный код символа 'N' - 4E, а 'я' - EF. Решение задачи program ascii; var i,j:integer; {параметры цикла} const stroka:string='0123456789ABCDEF'; {цифры шестнадцатеричной системы} begin write('':1); for i:=1 to length(stroka) do write(stroka[i]:3);{номера столбцов} for i:=0 to 15 do begin writeln; write (stroka[i+1]); {номера строк} for j:=0 to 15 do if (i*16+j<>10) and (i*16+j<>13) and (i*16+j<>9) and (i*16+j<>8) and (i*16+j<>7) {исключяем управляющие символы} then write(chr(i*16+j):3) else write(' ') end; end Задания для самостоятельной работы: 1. Закодировать свое имя в шестнадцатиричном и двоичном коде. 2. Определить двоичный код латинских букв 'D','d','E','e'. 3. Определить, в каком бите двоичного представления различаются заглавные и строчные буквы латинского алфавита. 4. Определить, в каких битах двоичного представления различаются буквы русского алфавита. ^ Преобразуем прописные латинские буквы в строчные и обратно путем инвертирования 6-го бита в ASCII-коде буквы. В данной программе применяется операция XOR, поэтому приведем таблицу истинности, из которой видно, что единицей бит инвертируется: (i XOR 1) = NOT (i), а двукратное преобразование бита единицей возвращает его в исходное значение. A B A XOR B (A XOR B) XOR B 0 0 0 0 0 1 1 0 1 0 1 1 1 1 0 1 Напомним что, 2^n=exp(n*ln(2)), а в двоичном представлении - одна единица и n нулей, например 32=2^5=100000. Биты в байте нумеруются справа налево от 0 до 7, например, двоичный код буквы N в таблице ASCII: 0 1 0 0 1 1 1 0 двоичный код буквы N 7 6 5 4 3 2 1 0 нумерация битов в байте Решение задачи program registr; var s:string; c:char; i,j:integer; {функция инвертирования n-го бита в байте ASCII-кода буквы} function caps(c:char;n:integer):char; begin caps:= chr(ord(c) xor round(exp(n*ln(2))) ); end; begin writeln('введите строку'); readln(s); for i:=1 to length(s) do {цикл замены регистра всех букв в строке} s[i]:=caps(s[i],5); writeln(s); end. Результат исполнения Question qUESTION Задание для самостоятельной работы: 5. Рассмотреть инвертирование 0-го бита в символах 'B' и 'C' таблицы ASCII. 6. Рассмотреть инвертирование 0-го бита в символах 'Ж' и 'З' таблицы ASCII. Шифрование В предыдущей задаче инвертировался один шестой бит, а здесь мы рассмотрим шифрование строки путем инвертирования k младших битов в ASCII-коде символа. Решение задачи program code_k; const k=4; var s:string; c:char; i,j:integer; {функция инвертирования n-го бита в байте ASCII-кода буквы} function caps(c:char;n:integer):char; begin caps:= chr(ord(c) xor round(exp(n*ln(2)))); end; begin writeln('введите строку'); readln(s); for j:=0 to k do {инвертирование j-го бита} begin for i:=1 to length(s) do {изменение каждого символа в строке} s[i]:=caps(s[i],j); writeln(s); end; for j:=k downto 0 do {инвертирование j-го бита} begin writeln(s); for i:=1 to length(s) do {изменение каждого символа в строке} s[i]:=caps(s[i],j); end; writeln(s); end. Результат исполнения введите строку Question { исходная строка } Ptdruhno { инвертируется 0-й бит } Rvfpwjlm { инвертируется 1-й бит } Vrbtsnhi { инвертируется 2-й бит } ^zj|{f`a { инвертируется 3-й бит } Njzlkvpq { инвертируется 4-й бит } Njzlkvpq { результат } ^zj|{f`a { инвертируется 4-й бит } Vrbtsnhi { инвертируется 3-й бит } Rvfpwjlm { инвертируется 2-й бит } Ptdruhno { инвертируется 1-й бит } Question { инвертируется 0-й бит } ^ Программа демонстрирует действие функции «SHL - сдвиг влево» на i позиций, что соответствует умножению на 2^i и «SHR - сдвиг вправо» на i позиций, что соответствует целочисленному делению на 2^i. Решение задачи program shr_shl; var i:byte; begin for i:=0 to 5 do writeln(i,34:3,34 shl i:5,34 shr i:5); end. Результат исполнения для числа 34 I 34 shl shr 0 34 34 34 1 34 68 17 2 34 136 8 3 34 272 4 4 34 544 2 5 34 1088 1 Задание для самостоятельной работы: 7. Составить программу, которая демонстрирует действия логических операций AND, OR, XOR, NOT над целыми числами. 8. Получить результат действия логических функций над целыми числами 17 и 16 в двоичном представлении и объяснить результат. ^ В программе демонстрируется умножение десятичных чисел типа байт без применения операции умножения. Решение задачи program mult1; var b1,b2:byte; w1:word; i:integer; begin writeln('введите числа меньшие 256'); readln(b1,b2); w1:=0; for i:= 0 to 7 do if ((b2 and (1 shl i))<>0) then {провека i-го бита сомножителя на равенство единице} w1:=w1+(b1 shl i);{прибавляем к сумме множимое, увеличенное в 2^i раз} writeln(w1); end. Результат исполнения 45 2 90 Задание для самостоятельной работы: 9. Выполнить умножение столбиком для чисел 45 и 2 в двоичном представлении. Что проще: умножить 45 на 2 или 2 на 45? 10. Как перевести целое число в двоичное с помощью логических операций? ^ Умножение десятичных чисел типа байт без применения операции умножения c демонстрацией двоичных кодов. Решение задачи program mult2; var b1,b2:byte; w1:word; i,j:integer; procedure binprint(b:word;d:byte);{вывод числа в двоичном формате} var i:integer; begin for i:=d-1 downto 0 do if (b and (1 shl i))<>0 then write('1') else write('0'); writeln; end; begin write('введите множимое b1=');readln(b1); write('введите множитель b2=');readln(b2); w1:=0; write('':8); binprint(b1,8); {вывод множимого в двоичном формате} write('':8); binprint(b2,8); {вывод множителя в двоичном формате} write('':8); writeln('--------'); {подведем черту для умножения столбиком} for i:= 0 to 7 do {цикл по каждому биту множителя} begin if ((b2 and (1 shl i))<>0) then begin w1:=w1+(b1 shl i); {формируем произведение} for j:=1 to 8-i do write(' '); binprint(b1,8); {очередное слагаемое, из которого составлено произведение} end; end; writeln('----------------'); binprint(w1,16); {результат в двоичном формате} writeln(w1); {результат в десятичном формате} end. Результат исполнения введите множимое b1=13 введите множитель b2=5 00001101 13 00000101 5 -------- 00001101 13*1=13 00001101 13*4=42 ---------------- 0000000001000001 65 "Мышь" Программа прорисовывает побитно закодированную пиктограмму с курсором мыши 16х16 пикселей и управляет его перемещением. В программе применяется модуль мыши, описанный ниже. Решение задачи program mouse; uses mouse_n,graph; {шестнадцатеричный код пиктограммы} const a:array [1..16]of word= (0,$0180,$018,$1A58,$2424,$2424,$1A58,$0240, $0420,$0420,$0810,$0810,$0810,$0660,$0188,$00f0); var b,x,y:word; i,j,grDriver,grMode,ErrCode: Integer; function point (x,y:integer):word; begin if getpixel(x,y)=0 then point:=1 { если цвет точки - черный то 1 } else point:=0; { иначе 0 } end; procedure draw_mice(x,y:word); { рисует по пикселам курсор мыши} begin { без следа } for i:=1 to 16 do for j:=1 to 16 do begin if (a[i]shr (j-1) and point(j+x,i+y))=1 then putpixel(j+x,i+y,5) else putpixel(j+x,i+y,0); end; end; begin grDriver := Detect; InitGraph(grDriver, grMode,''); ErrCode := GraphResult; if ErrCode = grOk then begin resetmouse(b); { инициализируем мышь } b:=0; x:=320; { центр экрана} y:=240; while b<>1 do { пока не нажата левая кнопка мыши } begin draw_mice(x,y); { нарисовать курсор мыши } delay(20); draw_mice(x,y); { стереть курсор мыши (нарисовать черным цветом)} mousestate(x,y,b); { возвращает состояние мыши } end; end else Writeln('Graphics error:', GraphErrorMsg(ErrCode)); end. Задание для самостоятельной работы: 11. Изменить цвет фона в программе. 12. Изменить программу так, чтобы мышь оставляла след. 13. Закодировать пиктограмму для курсора мыши. Модуль функций мыши В данном модуле запрограммированы две функции мыши, которые используются в предыдущей задаче . Решение задачи unit mouse_n; interface procedure mousestate(var x,y,b:word); {положение курсора на экране} procedure resetmouse(var result:word); {инициализация мыши} implementation procedure mousestate(var x,y,b:word); {x,y - координаты, b - состояние кнопок мыши} var x1,y1,b1:word; begin asm mov ax,3 {в регистр ax помещаем номер функции драйвера мыши} int 33h {передача управления драйверу мыши} mov x1,cx {получение координат и состояние мыши} mov y1,dx mov b1,bx end; x:=x1;y:=y1;b:=b1; end; procedure resetmouse(var result:word); var result1:word; begin asm xor ax,ax {обнуляем регистр ax} int 33h {передача управления драйверу мыши} mov Result1,ax {результат инициализации} end; result:=result1; end; end. Пиктограмма С помощью 0 и 1 нарисуем картинку 16х16 знаков и закодируем пиктограмму в шестнадцатеричном коде, каждой тетраде двоичных цифр ставя в соответствие шестнадцатеричную цифру. Решение задачи 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 $0000 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 $0180 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 $0180 0 0 0 1 1 0 1 0 0 1 0 1 1 0 0 0 $1A58 0 0 1 0 0 1 0 0 0 0 1 0 0 1 0 0 $2424 0 0 1 0 0 1 0 0 0 0 1 0 0 1 0 0 $2424 0 0 0 1 1 0 1 0 0 1 0 1 1 0 0 0 $1A58 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 $0420 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 $0420 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 $0810 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 $0810 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 $0810 0 0 0 0 0 1 1 0 0 1 1 0 0 0 0 0 $0660 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 $0188 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 $00F0 ^
ЛИТЕРАТУРА
ПриложениеТаблица кодовASSCII ![]()
|