Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по информатике.doc
Скачиваний:
118
Добавлен:
02.05.2014
Размер:
1.53 Mб
Скачать

Понятие алгоритма. Базовые алгоритмические структуры

Команды алгоритма можно разделить на простые (определяют 1 шаг алгоритма, переработки (отображения информации) – ввод/вывод, присваивание) и составные (формируются из простых команд).

Логическая структура любого алгоритма может быть представлена комбинацией трех базовых структур:

следование, ветвление, цикл.

  1. Базовая структура следование. Образуется из последовательности действий, следующих одно за другим:

начало

Команда 1

Команда 2

Команда N

конец

В Си: {

Оператор 1

Оператор 2

Оператор N

}

Задача: упорядочить a, b, c: abc.

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

Структура ветвление существует в четырех основных вариантах:

  • если-то;

  • если-то-иначе;

  • выбор;

  • выбор-иначе.

Структура ветвления

1. если-то

2. если-то-иначе

3. выбор

4. выбор-иначе

3. Базовая структура цикл. Обеспечивает многократное выполнение некоторой совокупности действий, которая называется телом цикла.

1) Цикл типа пока.

Предписывает выполнять тело цикла до тех пор, пока выполняется условие, записанное после слова пока.

«Пока»

Вычисление факториала

f = n! = 1*2*3*…*(n-1)*n.

Представление данных в памяти персонального компьютера.

Вычислительная техника первоначально возникла как средство автоматизации вычислений, о чем совершенно недвусмысленно говорит название ЭВМ.

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

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

Компьютер по определению способен хранить только дискретную информацию.

Дискретность (от лат. discretus – разделенный, прерывистый) – прерывность; противопоставляется непрерывности. Напр., дискретное изменение к.-л. величины во времени – это изменение, происходящее через определенные промежутки времени (скачками); система целых (в противоположность системе действительных чисел) является дискретной.

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

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

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

Числовая информация была первым видом информации, который начали обрабатывать ЭВМ, и долгое время она оставалась единственным видом. Поэтому не удивительно, что в современном компьютере существует большое разнообразие типов и представлений чисел. Прежде всего, это целые и вещественные числа, которые по своей сути и по представлению в машине различаются очень существенно. Целые числа, в свою очередь, делятся на числа со знаком и без знака, имеющие уже не столь существенные различия. Наконец, вещественные числа имеют два способа представления – с фиксированной и с плавающей запятой

Целые числа. Как мы уже знаем, этот тип информации является дискретным и преобразуется для хранения в компьютере довольно просто: достаточно перевести число в двоичную систему счисления и дополнить полученный результат слева нулями до стандартной разрядности. Например, восьмиразрядное число 14 будет иметь вид

0000 1110

Это же самое число в 16-разрядном представлении будет иметь слева еще 8 нулей.

Не менее просто определить минимальное и максимальное значение чисел для N-разрядного беззнакового целого: минимальное состоит из одних нулей, а значит, при любом N равняется нулю; максимальное, напротив, образовано одними единицами и, разумеется, для разных N различно. Для вычисления максимально допустимого значения обычно используют формулу

Max = 2N – 1

Ниже приведена таблица максимальных значений для некоторых практически интересных N.

Таблица. Максимальные значения для беззнаковых целых N-разрядных чисел

N

8

16

32

64

Max

255

65 535

4 294 967 295

18 446 744 073 709 551 615

В связи с обсуждением граничных значений определенный интерес представляет проблема перехода через эти значения. Если взять самый простой, 8-разрядный случай, то это будут действия 255+1 и 0-1.

Добавление отрицательных значений приводит к появлению некоторых новых свойств. Ровно половина из всех 2N чисел теперь будут отрицательными; учитывая необходимость нулевого значения, положительных будет на единицу меньше, т.е. допустимый диапазон значений оказывается принципиально несимметричным.

Для того, чтобы различать положительные и отрицательные числа, в двоичном представлении чисел выделяется знаковый разряд. По традиции для кодирования знака используется самый старший бит, причем нулевое значение в нем соответствует знаку "+", а единичное – минусу. Подчеркнем, что с точки зрения описываемой системы кодирования число ноль является положительным, т.к. все его разряды, включая и знаковый, нулевые.

Для практического получения кода отрицательных чисел используется следующий эквивалентный алгоритм. Для преобразования отрицательного числа в дополнительный код необходимо:

  • модуль числа перевести в двоичную форму;

  • проинвертировать каждый разряд получившегося кода, т.е. заменить единицы нулями, а нули – единицами (попутно заметим, что такой код называется обратным);

  • к полученному результату обычным образом прибавит единицу.

Например, переведем число –8 в двоичный 8-разрядный код. Возьмем модуль числа и дополним его до необходимого числа разрядов нулями слева:

0000 1000

Теперь проинвертируем:

1111 0111

и, наконец, прибавим единицу. Получим окончательный ответ

1111 1000

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

В любой книге по вычислительной технике сказано, что существует два способа представления вещественных чисел: с фиксированной и с плавающей запятой. Однако первый способ сейчас практически не используется.

В старых машинах, использовавших фиксированное размещение запятой, положение последней в разрядной сетке ЭВМ было заранее обусловлено – раз и навсегда для всех чисел и для всех технических устройств. Поэтому отпадала необходимость в каком-либо способе ее указания во внутреннем представлении чисел. Все вычислительные алгоритмы были заранее "настроены" на это фиксированное размещение.

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

Если наиболее сложным и трудоемким местом является масштабирование данных, возникла задача его автоматизации. Иными словами, надо было научить машину самостоятельно размещать запятую так, чтобы числа при счете по возможности не выходили за разрядную сетку и сохранялись с максимальной точностью. Для этого, разумеется, придется разрешить ЭВМ "перемещать" запятую, а значит, дополнительно как-то сохранять в двоичном представлении числа ее текущее положение. В этом, собственно, и заключается представление чисел с плавающей запятой.

В математике уже существовал подходящий способ записи, основанный на том факте, что любое число A в системе счисления с основанием Q можно записать в виде

A = (±M) * Q ±P ,

где M называют мантиссой, а показатель степени P - порядком числа.

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

3*108 = 30*107 = 0,3*109 = 0,03*1010 = ...

Поэтому договорились для выделения единственного варианта записи числа считать, что мантисса всегда меньше единицы, а ее первый разряд содержит отличную от нуля цифру – в нашем примере обоим требованиям удовлетворит только число 0,3*109. Описанное представление чисел называется нормализованным и является единственным. Любое число может быть легко нормализовано.

Особо подчеркнем, что требования к нормализации чисел вводятся исходя из соображений обеспечения максимальной точности их представления.

Все сказанное о нормализации можно применять и к двоичной системе:

A = (± M) * 2 ±P,   причем ½ ≤ M <1.

Таким образом, мы видим, что при использовании метода представления вещественных чисел с плавающей запятой фактически хранится два числа: мантисса и порядок. Разрядность первой части определяет точность вычислений, а второй – диапазон представления чисел.

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

Символы. Это еще одна дискретная величина, поскольку компьютер оперирует с определенным ограниченным набором символов. Такой набор вполне можно назвать алфавитом машины, а в алфавите все символы имеют свои фиксированные позиции. Отсюда основная идея хранения символов в памяти ЭВМ состоит в замене каждого из них номером в алфавите, т.е. числом. При выводе символа компьютер по номеру определяет, как его надо изобразить на экране или на бумаге. Раньше для каждого символа хранилась его растровая картинка, т.е. некоторая матрица из черных и белых точек, окрашенных в соответствии с начертанием символа. Учитывая, что размеры всех символов были одинаковыми, ориентироваться в такой таблице (ее было принято по научному называть знакогенератором) компьютеру было нетрудно. Главным недостатком подобного метода вывода текста было то, что начертания букв и их размер оказывались жестко зафиксированными. На первых порах с этим мирились, но постоянное увеличение обработки текстов на компьютере потребовало новых принципов организации шрифтов. На современном этапе для каждого символа хранится не его начертание, а своеобразная программа, его порождающая (векторный способ создания изображений). Геометрические параметры этих "программ" могут легко изменяться, что обеспечивает быстрое и удобное масштабирование шрифтов.

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

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

Звук. Звуковая информация также является величиной непрерывной, и, следовательно, для ввода в ЭВМ нуждается в дискретизации. Причем дискретизация должна производится как по времени, так и по величине интенсивности звука. Первый процесс означает, что замеры интенсивности должны производится не непрерывно, а через определенные промежутки времени, а второй – что интенсивность звука, которая в природе может принимать какие угодно значения, должна быть "подтянута" ("округлена") к ближайшему из стандартного набора фиксированных значений. При такой процедуре мы снова получаем последовательность целых чисел, которые и сохраняются в памяти ЭВМ. Таким образом, и в случае звука информацию удается описать определенным образом сформированной последовательностью чисел, что автоматически решает проблему кодирования.