Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Введение в информатику. Учебно-методическое пособие

.pdf
Скачиваний:
0
Добавлен:
09.08.2026
Размер:
397 Кб
Скачать

e.Свободный объем оперативной памяти компьютера 640 Кбайт. Сколько страниц книги поместится в ней, если на странице 32 строки по 64 символа в строке.

f.Десятичный код (номер) буквы "е" в таблице ASCII кодировки символов равен 101. Какая последовательность десятичных кодов будет соответствовать слову “delete”?

g.Код буквы "о" в таблице ASCII кодировки символов равен 11110. Что зашифровано с помощью последовательности десятичных кодов: 115 105 98 115 117 116 105 115?

h.Какой объем видеопамяти необходим для хранения двух страниц изображения при условии, что разрешающая способность дисплея равна 640 х 350 пикселей, а количество используемых цветов - 32?

i.Какой объем видеопамяти необходим для хранения четырех страниц изображения, если битовая глубина равна 32 бит, а разрешающая способность дисплея - 800 х 600 пикселей?

j.На экране дисплея необходимо отражать 224 различных цветов. Вычислить необходимый объем одной страницы видеопамяти при различных значениях разрешающей способности дисплея 1024 х 800.

k.Битовая глубина равна 32, видеопамять делится на три страницы, разрешающая способность дисплея - 1024 х 800. Вычислить объем видеопамяти.

l.Определить размер (в байтах) цифрового аудиофайла, время звучания которого составляет 20 секунд при частоте дискретизации 22,05 кГц и разрешении 16 бит.

m.Определить объем памяти для хранения цифрового аудиофайла, время звучания которого составляет две минуты при частоте дискретизации 44,1 кГц и разрешении 32 бит.

n.Объем свободной памяти на диске - 6,25 Мб, разрядность звуковой платы

16 бит. Какова длительность звучания цифрового аудиофайла с частотой дискретизации 22,05 кГц.

o.Объем свободной памяти на диске - 0,03 Гб, разрядность звуковой платы

8 бит. Какова длительность звучания цифрового аудиофайла, записанного с частотой дискретизации 44100 Гц?

11

Кодирование информации

Теоретические основы

Одним из направлений информатики является изучение методов преобразования информации. Так для уменьшения объема, требуемого для хранения, данных часто применяется кодирование. Кодирование – способ представления информации в удобном для хранения и передачи виде. При кодировании сообщения, каждому символу или группе символов исходного алфавита сообщения ставится в соответствие некоторый символ или группа из другого алфавита. Группа символов конечного алфавита называется кодовым словом. В целом, совокупность кодовых слов и правил преобразования исходного сообщения называется кодом. Существую коды позволяющие уменьшать объем сообщения. Сжатие в таких кодах достигается за счет уменьшения избыточности информации. Рассмотрим некоторые коды сжатия информации. Обычно, когда кодируется источник информации, собирается статистика, которая описывает определенные свойства, например закономерность появления символов в сообщении. Какие-то символы могут появляться чаще, чем другие. Данная закономерность задается при помощи распределения вероятностей. Каждому символу ставится в соответствие

некоторое p-числовая мера встречаемости символа, такая что

.

Пусть – вероятность появления символа “0”, а

соответственно -“1”.

 

[0,1]

Расчет вероятностей для сообщения “10101010101111011011” осуществляется

так:

 

Количество символов" "

 

 

 

и аналогично

 

. Очевидно,

=

= = 0.35

= 0.65

 

Общееколичествосимволов

 

 

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

Код Хаффмана

Пусть имеется некоторый источник, порождающий символы из алфавита = { , , , , , } c заданным распределением вероятностей = {0.4,0.2,0.15,0.1,0.1,0.05} . Построим код Хаффмана. Предварительно, нам потребуется кодовое дерево. Здесь в каждый новый узел дерева объединяются два дочерних узла, имеющих минимальную суммарную

(накопленную) вероятность. Пример дерева указан на рис. 1.

12

a1 0.4

a2

0.2

 

1

 

0.35

a3 0.15

0.6

a4 0.1

0.25

a5 0.1

0.15

a6 0.05

Рис. 1. Построение дерева Хаффмана

Теперь будем двигаться в обратном порядке, и записывать путь, пройденный от вершины дерева до конечного узла. Переход на верхнюю ветвь обозначим как “0”, нижнюю “1”. Получим следующий код, представленный в Таблице 4.

Исходный символ

Вероятность

Кодовое слово

a1

0.4

0

a2

0.2

100

a3

0.15

101

a4

0.1

110

a5

0.1

1110

a6

0.05

1111

Табл. 4. Построение кода Хаффмана

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

 

Код Шеннона-Фано

 

 

 

 

Пусть имеется некоторый источник, порождающий символы из алфавита

= {

, , , , , } c

распределением

вероятностей

заданным. Построим

код

Шеннона-Фано.

= {0.4,0.15,0.13,0.12,0.1,0.1}

 

 

 

Предварительно, нам потребуется кодовое дерево. Построение дерева начинается с вершины. Символы исходного алфавита упорядочивают по убыванию вероятностей и разбивают их на две группы (соответствующие левому и правому поддереву) так, чтобы разница между суммой вероятностей этих групп была минимальна. Далее записывают путь, пройденный от вершины дерева до конечного узла. Переход на левую ветвь обозначим как “0”, нижнюю

“1”. Получим следующий код, представленный в Таблице 5.

13

Исходный

Вероятность

 

Кодовое слово

 

символ

 

 

a1

0.40

0

 

0

 

 

 

a2

0.15

0

 

1

 

 

 

a3

0.13

1

 

0

 

 

 

a4

0.12

1

 

1

0

 

 

a5

0.10

1

 

1

1

 

0

a6

0.10

1

 

1

1

 

1

Табл. 5. Построение кода Шеннона-Фано

Заметим, что после того как мы закодировали сообщение, то его символы теперь встречаются с (почти) одинаковыми вероятностями. Это означает, что повторно данное сообщение мы сжать уже не сможем (в нем отсутствует избыточность). Мерой качества полученного кода может служить избыточность. Согласно теореме Шеннона минимально возможное значение

средней

длинны кодового слова (

 

) вычисляется по

формуле

= −∑

log

. Соответственно,

избыточность вычисляется как

= ср

.

 

 

 

ср

 

 

 

Считается что, чем меньше избыточность, тем лучше код.

Задания для лабораторной работы

a.Построить код Хаффмана и Шеннона-Фано для алфавита A={a1,a2,…a6}, P={0.3, 0.25,0.2, 0.15, 0.1}.

b.Построить код Хаффмана и Шеннона-Фано для алфавита A={a1,a2,…a6}, P={0.25, 0.3,0.15, 0.1, 0.05, 0.15}.

c.Закодировать следующее сообщение кодом Хаффмана и Шеннона-

Фано:“a1a2a1a2a1a3a2a2a1a3a3a2a4a2a1a5”.

d.Закодировать следующее сообщение кодом Хаффмана и Шеннона-

Фано:“a5 a4 a4 a2 a1 a4 a2 a2 a5 a3 a2 a4 a2 a3 a2 a1”.

e.Написать свое фамилию, имя и отчество закодировать данную последовательность кодом Хаффмана и Шеннона-Фано.

14

Алгоритмы

Теоретические основы

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

описывается функцией трудоемкости

, зависящей от

количества

обрабатываемых элементов. Например,

(бывают)

алгоритмы

сортировки,

имеющие квадратичную трудоемкость

 

= .

 

 

 

Алгоритмы

могут

быть

записаны( )

в

виде

псевдокода:

цикл для j=1 до n-1 шаг 1 fl=0;

цикл для i=1 до n-j шаг 1

если a[i] > a[i+1] то обмен a[i],a[i+1]; fl=1;

следующее i

если f=0 то выход из цикла следующее j,

в виде текста на языке программирования (например, с++, Pascal, assembler) или в виде блок-схемы.

Блок-схема представляет собой набор, связанных друг с другом графических примитивов, и обозначающих какое-либо действие. Имеются следующие элементы блок-схем, указанные в Таблице 6.

Графический примитив

 

Действие

 

 

 

Начало

 

Обозначает начало/конец программы

 

 

 

 

 

 

 

 

 

 

 

Ввод A

 

Операция ввода/вывода данных с клавиатуры или на экран

 

 

 

 

монитора.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Операция присваивания, или вычисления арифметических

 

 

 

A:=3

 

 

 

 

 

 

 

выражений

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Draw

 

 

 

Операция вызова подпрограммы

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

D>0

 

Ветвление в программе (по условию).

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Табл. 6. Элементы блок-схемы

15

При выполнении операции присваивания арифметическое выражение должно быть записано в линейной форме. Так знак дроби заменяется на “/”, умножение на “*”, возведение в степень - “^”, равенство заменяется оператором присваивания “:=”. Важно учитывать приоритеты операций их порядок

 

 

.

 

(

)

5 +2

 

(1+

выполнения.

Например, выражение

 

запишется в виде

 

^2)^(1/3)/(

+2 ) 5 +2

 

Существуют и

другие арифметические

 

 

 

операции, например, остаток отделения “%”, взятие целой части от деления “/”, квадратный корень от x-“sqrt(x)”, синус -“sin(x)”, косинус -“cos(x)”и возведение в степеньxпо основанию экспоненты -“exp(x)”.

Теперь рассмотрим программу поиска максимума из двух чисел, рис. 2. Алгоритм начинает свою работу с элемента «Начало». Затем пользователю предоставляется возможность ввести данные клавиатуры. После ввода данных блок-схема разветвляется. Если число a оказывается больше числа b (то есть условие выполняется), то алгоритм переходит по ветке «да», где выводит значение числа а на экран. Если условие не выполняется (a меньше либо равно b), то выполнение алгоритма идет по ветке «нет» и выводится число b. В конечном итоге алгоритм завершает работу.

Начало

Ввод a,b

нет

a>b

да

 

 

Вывод b

 

Вывод a

Конец

Рис. 2. Блок-схема алгоритма поиска максимума из двух чисел

Каждая ветвь блок-схемы должна иметь выход на конец алгоритма. Блоксхемы позволяют наглядно представлять алгоритмы, и, в дальнейшем, использовать их для написания программ.

Рассмотрим еще один пример, блок-схему алгоритма вычисления корней квадратного уравнения вида ( + + = 0), представленную на рис. 3. Здесь программа ожидает ввода данных (коэффициентов a, b, c уравнения) с клавиатуры. Затем вычисляется дискриминант уравнения D. Далее, если дискриминант больше либо равен нулю, то вычисляются и выводятся на экран корни уравнения x1, x2. Если условие не выполняется (т.е. дискриминант

16

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

Начало

Ввод a, b, с

D:=b*b+4*a*c

нет да

D>=0

x1:=(-b+sqrt(D))/(2*a) x2:=(-b-sqrt(D))/(2*a)

Нет корней

Вывод x1,x2

Конец

Рис. 3. Блок-схема алгоритма вычисления корней квадратного уравнения

Теперь рассмотрим более сложные алгоритмические конструкции, такие как цикл, см. рис. 4. Циклы используются для реализации повторяющихся действий в программе. Например, необходимо вывести на экран ряд чисел от 1 до 10. Для этого мы вводим специальную переменную i для текущего числа. Выводим ее на экран и увеличиваем ее значение на единицу, повторяем эти действия, пока она не станет больше 10. Выражение i:=i+1 означает то, что новое значение i равняется старому значению плюс единица.

Обратите внимание, что в общем случае после построения блок-схемы с циклом ее следует проверить на случай, когда цикл не выполнится ни разу, выполнится один раз и выполнится много раз. Также следует помнить, что циклы могут быть причиной зависания программы. Следовательно, проверьте наличие и достижимость условия окончания цикла.

17

 

Начало

 

i:=1

нет

да

 

i>10

Вывод i

Конец

 

i:=i+1

 

Рис. 4. Блок-схема алгоритма вывода на экран ряда чисел от 1 до 10

Задания для лабораторной работы

Построить блок-схемы для следующих алгоритмов:

a. Вычислить выражение

 

 

(

 

 

)

 

+4 для заданных x и y.

b. Вычислить выражение

(

 

(

 

 

((

 

 

))))

 

 

 

 

+2 для заданных x и y.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

+1 для заданных x и y

c. Вычислить выражение

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

+2 для заданных x и y

d. Вычислить выражение

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

+3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

e. Вычислить выражение

 

 

( )

 

 

 

 

 

 

 

 

(

 

)

 

для заданных x и y

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

(

)

 

 

 

 

 

 

(

 

 

)

 

 

 

 

 

+4 для заданных x и y

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

f. Вычислить выражение

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

( )

g.Вычислить выражение +5 для заданных x и y.

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

i. Найти сумму ряда

 

+

 

 

+ +−

 

.

 

 

 

 

j.Найти сумму цифр числа.

k.Вычислить факториал числа.

18

Основы языка С++

Теоретические основы

Программа на языке С++ представляется собой набор описаний переменных, в которых хранятся обрабатываемые значения и набор функций, которые описывают действия, в том числе и выполняемые над этими переменными. Начнем с описания переменных. Любая переменная описывается в программе по следующей схеме: «<Тип данных><имя>». Тип данных задает размер отводимой памяти для хранения переменной, допустимые диапазоны значений, что актуально для чисел (мы не можем хранить бесконечно большие числа), и набор допустимых операций осуществляемых над заданными переменными. Например, числовые данные допускают только арифметические операции, а строковые типы позволяют менять регистр букв и т.д. Ниже в Таблице 7 идут целочисленные типы данных:

Тип данных

Размер

Диапазон значений

переменной

 

 

shortint

16 бит

от -32768 до 32767

unsigned short int

16 бит

от 0 до 65536

int

32 бит

от -2147483648 до 2147483647

unsigned int

32 бит

от 0 до 4294967295

long

64 бит

от -9223372036854775808

до 9223372036854775807

 

 

char

8бит

от -128 до 127

 

 

 

unsigned char

8бит

от 0 до 255

 

 

 

Табл. 7. Целочисленные типы данных в С++

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

int a; long Ivan1;

unsigned int StopGame1;

Группу однотипных переменных можно описывать через запятую. int b,c,d,е;

Допускается инициализация переменных при объявлении. int x = 10;

int b=9, g=8, h;

В рассмотренных примерах значение переменной задано числовой константой. Для символьных типов имеются символьные константы, например:

19

char ch=’A’;

Также имеются особые символы, указанные в таблице 8.

Специальные символьные

Описание

константы

 

Предупреждение (звонок)

\b

Возврат курсора на шаг

\f

Перевод страницы

 

 

\n

Следующая строка (перевод на новую строку)

\r

Возврат каретки

\t

Табуляция

 

 

\\

Отображение обратной косой черты

\’

Отображение одинарной кавычки

\”

Отображение двойной кавычки

 

 

Табл. 8. Специальные символы в С++

Для чисел с плавающей запятой используются вещественные типы данных, представленные в Таблице 9:

Тип данных

Размер

Диапазон значений

переменной

float

32 бит

от 3.4е-038 до 3.4е+038

double

64 бит

от 1.7е-308 до 1.7е+308

Табл. 9. Типы данных для вещественных чисел

Все константы по умолчанию принадлежат типу double. Для явного задания типа float требуется указывать в конце числа букву “f” или “F”.

float pi=3.14f; double d=3.14;

Допускается преобразование типов из одного типа в другой. float pi=(float) 3.14;

doubled=pi; //здесь преобразование выполняется автоматически. int i=9;

pi=pi+i;

Константы могут быть заданы в экспоненциальной форме. Для отделения мантиссы от порядка используется символ "e" или символ "E"), например,

число -8,85*10-12 записывается как –8.85E-12, а число 7,5*105 – как 7.5E15 . float f=-3e3f; //-3*103;

double d=4e3; //4*103;

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

#include <iostream.h> using namespace std; int main(){

20

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]