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

учебное пособие. Часть1. Информатика

.pdf
Скачиваний:
42
Добавлен:
04.06.2015
Размер:
2.87 Mб
Скачать

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

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

На последнем этапе программа запускается на выполнение на реальных исходных данных, результаты работы анализируются и делаются выводы.

Контрольные вопросы

1.Назовите основные устройства ЭВМ и их назначение.

2.Из каких этапов состоит решение задачи на ЭВМ?

3.На какие категории можно разделить совокупность программных

средств?

4.Для каких целей предназначены прикладные программы?

5.Для каких целей предназначены системные программы?

6.Для каких целей предназначены системы программирования?

7.Дайте определение алгоритма.

8.Какими свойствами должен обладать алгоритм?

9.На каком этапе решения задачи на ЭВМ выявляются синтаксические

ошибки?

10.На каком этапе решения задачи на ЭВМ выявляются логические

ошибки?

151

2. ГРАФИЧЕСКИЙ СПОСОБ ОПИСАНИЯ АЛГОРИТМОВ

Одним из самых трудоемких этапов решения задачи на ЭВМ является разработка алгоритма. Человечество разработало эффективный алгоритм за- вязывания шнурков на ботинках. Многие дети с пятилетнего возраста могут это делать. Но дать чисто словесное описание этого алгоритма без картинок и демонстрации очень трудно.

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

Графический способ записи алгоритмов наиболее наглядный и рас- пространенный. Он основан на использовании геометрических фигур (сим- волов), краткого пояснительного текста и соединяющих линий. Схемы могут применяться на различных уровнях детализации, причем число уровней за- висит от размеров и сложности задачи обработки данных. Уровень детализа- ции должен быть таким, чтобы различные части и взаимосвязь между ними были понятны в целом. Каждый символ отображает конкретный этап процес- са обработки данных. Символы соединяются между собой прямыми линия- ми, называемыми линиями потока. Обозначение и назначение основных сим- волов графических схем алгоритмов приведено в табл. 1. (ГОСТ 19.701-90, ИСО 5807-85). В поле каждого символа указывают выполняемую функцию. При необходимости справа можно поместить комментарии, относящиеся к данному блоку, группе блоков, обведенных пунктиром, или направлению потока.

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

Минимальное количество текста, необходимого для понимания функ- ции данного символа, следует помещать внутри данного символа. Текст для чтения должен записываться слева направо и сверху вниз независимо от на- правления потока. Если объем текста, помещаемого внутри символа, превы- шает его размеры, следует использовать символ комментария.

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

Потоки управления в схемах показываются линиями. Направление по- тока слева направо и сверху вниз cчитается стандартным. Линии потока, имеющие направление вверх или направо, дополняются стрелками. Линии в схемах должны подходить к символу либо слева, либо сверху, а исходить ли-

152

бо справа, либо снизу. Линии должны быть направлены к центру символа. Две или более входящие линии могут объединяться в одну исходящую ли- нию. Если две или более линии объединяются в одну линию, место объеди- нения должно быть смещено (рис. 2).

 

 

 

 

 

 

 

 

 

 

 

Рис. 2. Соединение линий потока

 

 

 

 

 

 

 

 

 

 

 

 

 

Таблица 1

 

 

 

 

 

 

Основные символы графических схем алгоритмов

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Символ

 

Назначение

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Терминатор. Начало и завершение схемы алго-

 

 

 

 

 

 

 

 

 

 

 

 

ритма, прерывание процесса обработки данных

 

 

 

 

 

 

 

 

 

 

 

 

или выполнения программы

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Процесс. Выполнение операции или группы

 

 

 

 

 

 

 

 

 

 

 

 

операций, в результате которых изменяются

 

 

 

 

 

 

 

 

 

 

 

 

значение, форма представления или расположе-

 

 

 

 

 

 

 

 

 

 

 

 

ние данных

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Решение. Выбор одного из ряда альтернативных

 

 

 

 

 

 

 

 

 

 

 

 

выходов в зависимости от вычисления условия

 

 

 

 

 

 

 

 

 

 

 

 

внутри символа

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Ввод-вывод преобразование данных в форму,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

пригодную для обработки или регистрации ре-

 

 

 

 

 

 

 

 

 

 

 

 

зультатов обработки

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Предопределенный процесс. Вызов подпро-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

граммы: функции или процедуры

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Соединитель. Указывает связь между прерван-

 

 

 

 

 

 

 

 

 

 

 

 

ными линиями потока

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Указания

последовательности связей между

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

символами схемы алгоритма

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Комментарии

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

схемы и вход из другой части этой схемы и используется для обрыва линии и

153

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

Рис. 3. Межстраничные соединители

Из символа решение может быть несколько выходов, которые следует показывать:

несколькими линиями от данного символа к другим символам

(рис. 4, а);

одной линией от данного символа, которая затем разветвляется в со- ответствующее число линий (рис. 4, б).

а

б

Рис. 4. Символ решение: а) с тремя выходами; б) с множеством выходов

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

По своей структуре различают следующие типы алгоритмов: линейные, разветвляющиеся и циклические.

В линейных схемах алгоритмов все предписания выполняются одно за другим. Например, в алгоритме на рис. 5 вычисляется длина окружности по известному радиусу. В этом алгоритме все действия выполняются последова- тельно, и никакое действие не может пропущено.

154

Начало

 

Ввод r

r – радиус

окружности

 

 

l: 2

r

l- длина

окружности

Вывод l

Конец

Рис. 5. Линейный алгоритм

Рис. 6. Разветвляющийся алгоритм

155

 

В разветвляющихся схемах ал-

 

горитмов для конкретных исходных

 

данных выполняются не все заданные

 

предписания. Однако какие именно

 

предписания будут выполняться, а

 

какие нет, определяется по ходу ал-

 

горитма в результате проверки неко-

 

торых условий. Разветвляющийся ал-

 

горитм всегда избыточен. Примером

 

разветвляющегося алгоритма являет-

 

ся алгоритм, приведенный на рис. 6 и

 

определяющий, пройдет ли график

 

функции y

=

3x+4 через точку с

 

координатами x1, y1. В этом алго-

 

ритме при заданных исходных дан-

f = f × i

ных выполняется только одна из двух

ветвей.

 

 

 

 

В циклическом алгоритме мож-

 

но выделить многократно повторяю-

 

щуюся последовательность

предпи-

 

саний, называемую циклом. Для та-

 

ких алгоритмов характерно

наличие

 

параметра цикла, которое перед вхо-

 

дом в цикл имеет начальное значе-

 

ние, а затем изменяется внутри цик-

 

ла. Имеется также предписание о

 

проверке условия окончания цикла.

 

Применение циклов сокращает алго-

 

ритм и, в конечном итоге, длину про-

 

граммы. Примером циклического ал-

 

горитма может служить алгоритм,

 

приведенный на рис. 7 и определяю-

 

щий факториал

натурального числа

Рис. 7. Циклический алгоритм

n. В этом алгоритме введена допол-

нительная

переменная i,

которая

 

является параметром цикла и изменяется от начального значения 1 до конеч-

ного значения n c шагом 1. На каждом шаге итерации искомая величина f

умножается на переменную цикла.

 

 

 

 

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

Способ описания алгоритма с помощью алгоритмического языка рассматри-

вается в следующем разделе. Подробно о словесном и графическом способе

описания алгоритмов изложено в учебном пособии для практических заня-

тий.

 

 

 

 

 

 

 

 

156

Контрольные вопросы

1.Назовите основные способы описания алгоритмов.

2.Какой способ описания алгоритмов является самым наглядным?

3.Какие геометрические фигуры используются в графическом способе описания алгоритмов?

4.Какие типы алгоритмов различают по структуре?

5.Назовите основные признаки линейного алгоритма?

6.Назовите основные признаки разветвляющегося алгоритма?

7.Назовите основные признаки циклического алгоритма?

157

3.ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ С++

3.1.Линейные программы

3.1.1.Структура программы

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

Для составления общего представления о программировании на языке С++, приведем пример простейшей программы pr1, определяющей сумму двух чисел:

/*Пример pr1 -

простейшая

программа*/

 

#include <cstdio>

 

using namespace std;

 

//Главная функция

 

int main ()

 

{

 

int a, b, rezult;

 

printf ( "\nВведите a и b: " ); scanf ( "%d%d", &a, &b ); rezult = a + b;

printf ( "rezult=%d", rezult ); return 0;

}

//строка 0

//строка 1

//строка 2

//строка 3

//строка 4

//строка 5

//строка 6

//строка 7

//строка 8

//строка 9

//строка 10

//строка 11

//строка 12

//строка 13

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

Структура программы на языке C++ представляет собой совокупность функций, из которых одна является главной и присутствует в каждой про- грамме. Эта функция носит стандартное имя main и с неё начинается вы- полнение программы. В приведенном примере программа состоит из одной главной функции.

Рассмотрим каждую строчку программы.

158

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

Нулевая, первая и четвертая строки программы комментарии. Ком- ментарии служат для улучшения читаемости программы, и компилятором игнорируются. Комментарии бывают однострочные и многострочные. В ну- левой и первой строке расположен многострочный комментарий. Он начина-

ется с символов /*, а завершается */. В четвертой строке находится од- нострочный комментарий. Всё, что написано в текущей строке после двух косых линий считается комментарием. Нумерация строк в программе оформ- лена как однострочный комментарий. Многострочные комментарии могут использоваться и для однострочных пояснительных текстов.

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

функции с идентификаторами printf и scanf. Функция scanf служит для ввода исходных данных с клавиатуры, а printf для вывода информа- ции на экран монитора. В четвертой строке объявлено, что программа ис- пользует пространство имён std - это using namespace std.. Про- странство имён стандартной библиотеки делает далее имена из этого про- странства доступными.

Синтаксис директив препроцессора следующий:

#include <имя_файла>

или

#include "имя_файла"

В первом случае поиск файла происходит только в пределах специфи-

цированных каталогов включаемых файлов (include directories). При использовании второй формы сначала просматривается текущий ката- лог, а затем каталоги включаемых файлов [4]. С помощью директивы include можно включить в текст программы любой другой исходный файл.

Впятой строке начинается главная функция, и именно в этой строке

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

Вприведенном примере описаны три переменные с идентификаторами

(именами) a, b, rezult. В языке С++, как и во многих других языках, действует правило: пока переменная, константа и т. д. не описаны, он не мо- жет использоваться. При описании переменных указывается тип перемен- ных. В данном примере все переменные целого типа (int). Описание пе-

159

ременных позволяет определить, сколько байт памяти необходимо выделить под конкретную переменную и какие операции над ней можно выполнять. Идентификаторы (или имена) используются в программе для обозначения переменных, меток, типов, функций, констант. На идентификаторы наклады- ваются некоторые ограничения. Важным ограничением при выборе иденти- фикаторов является невозможность использования ключевых слов, например main или void. Идентификатор должен начинаться с буквы и может со- держать буквы латинского алфавита, цифры и знаки подчеркивания. Длина идентификатора может быть любой, но значащими являются первые 63 сим- вола. Имена могут нести смысловую нагрузку, как, например, rezult. Ис- пользование осмысленных имен предпочтительнее, так как это делает про- грамму более простой для понимания. В идентификаторах, как и во всей про- грамме на языке С++, имеет значение разница в высоте букв. Например, re-

zult и Rezult разные идентификаторы.

Восьмая строка программы содержит вызов функции printf, кото- рая выводит на экран с новой строки сообщение: “Введите a и b:”. Вывод с новой строки обеспечивается специальным символом ’\n’. В девя- той строке находится вызов функции scanf, считающей с клавиатуры зна-

чения переменных a и b в соответствии со спецификацией преобразования %d для целых чисел. Более подробно об этих функциях читайте в разд. 3.1.4.

Десятая строка программы содержит оператор присваивания, вычис-

ляющий сумму целых чисел a и b и размещающий результат в переменной rezult .Далее находится вызов функции printf, выводящей на экран зна-

чение переменной rezult. В предпоследней строке содержится оператор return, который приводит к немедленному завершению функции и воз- вращает значение 0 туда, откуда эта функция была вызвана. В последней строке программы находится фигурная скобка, завершающая тело функции main.

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

Рассмотрим подробнее описания переменных и операторы, необходи- мые для написания линейной программы.

3.1.2.Описание переменных

Вязыке С++ обрабатываются переменные различных типов. Тип любо- го объекта определяет множество допустимых значений и множество допус- тимых операций над этими значениями. Любой идентификатор, используе- мый в исполняемых операторах, должен быть предварительно описан в лю- бом месте программы, но обязательно до начала применения.

160