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

Основы программирования. Учебное пособие-1

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

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

4. Пример задачи из класса обработки сложных данных. Дана последовательность из n вещественных чисел, n не превышает 50. Преобразоватьпоследовательностьпоследующемуправилу:циклическисдвинуть ее элементы на k позиций вправо.

Входные данные: n N, n 50, k N, k < 50, A = {ai |ai R, i = 1, n}

Выходные данные: A = {ai |ai R, i = 1, n}.

Решение:

Начальная спецификация решения задачи:

ПРИ n = 1 ПОВТОРЯТЬ

| y = an

| сдвиг элементов A на одну позицию вправо (к концу последовательности A)

| an = y

| n = n + 1

ПОКА n k

Более детальное описание решения задачи:

ПРИ n =1 ПОВТОРЯТЬ

| ПРИ i = n, y = ai

| ПОВТОРЯТЬ

| | ai = ai-1 | | i = i – 1

| Пока i > 1

| ai = y

| n = n + 1

ПОКА n k

Комментарии к анализу задачи. Входными данными являются три величины: простая n – количество элементов последовательности, простая k – величина сдвига и сложная A – последовательность вещественных чисел. Свойства величин: n и k – натуральные числа, n ограничено

сверху значением 50; A – последовательность, состоящая из элементов ai,

11

где ai есть вещественное число, фактическое количество элементов последовательности не превышает n.

Результатом решения будет эта же последовательность A с измененными значениями элементов в результате сдвига.

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

Возможно несколько способов решения данной задачи. Один из них основан на использовании дополнительной памяти размером не менее 50, другой – на минимальном использовании дополнительной памяти: для хранения одного элемента. В первом варианте решения поместим в дополнительную память последние k элементов последовательности. Первые n k элементов A сместим на k позиций вправо (к концу последовательности). Отложенные в дополнительную память k элементов перенесем в первые k позиций A. Во втором варианте решение задачи заключается в смещении (сдвиге) элементов A вправо на одну позицию. Для циклического сдвига, используя дополнительную память, последний элемент помещаем в первую позицию. Повторив это смещение k раз, выполним циклический сдвиг элементов A на k позиций вправо. В приведенном решении реализован второй вариант.

5. Пример задачи из класса обработки сложных данных. Дана последовательность, содержащая не более 50 слов, в каждом слове не более 10 строчных латинских букв; между соседними словами пробел, за последним словом точка. Среди слов, отличных от последнего, найти слова, длина которых максимальна.

Входные данные: A = {ai |ai WORD, i = 1, n, n 50},

WORD = {wj | wj {‘a’, ’b’, ‘c’…’x’, ’y’, ’z’}, j = 1, m, m 10}.

Выходные данные: B = {bi |bi WORD, i = 1, k}, –1 < k < 50.

Решение:

ПРИ i = 1, k = 0, n = |A|, max = 0

12

ПОВТОРЯТЬ

| если |aiесли≠ an,длинато ai > max, то k = 1, bk = ai , max = длина ai | иначе если длина ai = max, то k = k + 1, bk = ai

| i = i + 1

ПОКА i n

Комментарии к анализу задачи. Так как не всегда можно в после-

довательности найти слова, отличные от последнего, то результатом решения будет либо пустая, либо непустая последовательность слов (B). Пустую последовательность будем представлять величиной k со значением 0, в противном случае результатом будут две величины: k (со значением отличным от 0 и равным числу найденных слов, удовлетворяющих условию задачи) и последовательность слов B.

6. Пример задачи из класса обработки сложных данных. Дана информация о группе из n людей (n не превышает 50), содержащая сведения о каждом человеке из группы следующего вида: имя, пол, рост, год рождения. Найти имена и годы рождения всех женщин из группы.

Входные данные:

A = {ai = (namei, pi, ri, yi) |namei WORD, pi, {‘m’;’h’} ri, R, yi N, i =1,n}, n 50,

WORD = {wj | wj {‘a’, ’b’, ‘c’…’x’, ’y’, ’z’}, j = 1,m, m 15 }.

Выходные данные: B = {bi = (namei,,yi) |namei WORD, yi N, i =1, k}, 0 k 50.

Решение:

ПРИ i =1, k=0

ПОВТОРЯТЬ

| если pai =’h’,то k=k+1, namebk = nameai, ybk = yai | | i=i+1

ПОКА i n

Комментарии к анализу задачи. Входными данными являются две величины: простая n – количество элементов последовательности (количество людей в группе) и сложная A – последовательность сведений о каждом человеке в группе. Свойства величин: n – натуральное число, n ограничено сверху значением 50; A – последовательность, состоящая из элементов ai, где ai есть сложная неоднородная величина, фактическоеколичествоэлементовпоследовательностинепревышаетn.Таккак

13

ai – неоднородная величина, то для ее представления в ОП будем использовать неоднородный тип структура. Это позволит рассматривать элемент последовательности (ai) как совокупность из четырех частей: имя, пол, рост, дата рождения.

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

Так как размер последовательности заранее известен (50), то будем отображать в ОП компьютера все элементы последовательностей. Для этого используем тип массив, для обращения к элементу будем использовать индекс элемента.

Алгоритм решения задачи

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

При описании алгоритма линейного процесса используйте управляющую структуру структурного программирования Следование (после-

довательность).

При описании алгоритма разветвляющегося процесса используйте управляющую структуру структурного программирования Ветвление.

Алгоритм решения задачи 2 на C:

{

if (a > d) if (a > b)

if (a > c) x = a;

14

else

x = c;

else

if (b > c) x = b;

else

x = c;

else

if (d > b) if (d > c)

x = d; else

x = c;

else

if (b > c) x = b;

else

x = c;

}

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

{

x = c;

if (a > d) if (a > b)

if (a > c) x = a;

else

if (b > c) x = b;

else

15

if (d > b) if (d > c)

x = d; else

if (b > c) x = b;

}

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

Алгоритм решения задачи 3 на псевдо C:

{

x = 1 й элемент A; i = 1;

WHILE(i < n)

{

y = следующий элемент A; if (x < y)

x = y; i = i + 1;

}

}

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

Алгоритм решения задачи 4 на псевдо C:

{

m = 1; WHILE(m k)

{

i = n;

y = ai; WHILE(i > 1)

{

ai =ai 1; i ;

16

}

ai = y; m++;

}

}

Алгоритм решения задачи 6 на псевдо C:

{

i = 1; k = 0;

WHILE(i n) if(a[i].p == ‘h’)

{

k++;

strcopy(b[k].name, a[i].name); b[k].y = a[i].y;

}

}

РЕКОМЕНДАЦИИ ПО ВЫПОЛНЕНИЮ ПЗ

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

Требования к выполнению ПЗ

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

17

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

продумать и обосновать способ решения задачи;

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

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

Формализация и анализ задачи

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

Пример 1. В задаче «Определить радиус и центр окружности, на которой лежит наибольшее число точек заданного на плоскости множества точек» формализация условия задачи требует уточнения понятия множества исходя из предметной области (математики). Множество точек на плоскости – это конечное, возможно, пустое множество попарно различных пар вещественных чисел, соответствующих координатам точек на плоскости.

18

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

Результатом формализации задачи является определение входных данных и результатов решения задачи.

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

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

Пример 2 – входными данными, задающими предложение, будет последовательность, состоящая из элементов-слов, каждый из которых тоже является последовательностью, состоящей из элементов-букв. Также задаются символы – разделители слов. Размер предложения и слова определяется как максимально допустимая его длина.

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

Пример 1 – выходными данными будут четыре величины: t, r, x, y, где t {0;1}, x R, y R, r R. Переменная t определяет главный результат решения задачи. Значение t, равное 0, сообщает что задача не решена. Значение t, равное 1, сообщает, что задача решена, и x, y – это координаты центра окружности (абсцисса и ордината точки),

19

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

Пример 2 – выходными данными будут две величины: t, A, где t

{0;1},

A = {ai |ai WORD, i = 1, n, n 50}, WORD = {wj | wj {‘a’, ’b’, ‘c’…’x’, ’y’, ’z’}, j = 1, m, m 10} задает последовательность слов, отвечающих условию задачи.

Установление основных отношений между входными и выход-

нымиданнымизадачи(ввидеформули/илиматематическихзакономерностей).

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

Выбор и описание способа решения задачи.

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

Например, в задаче «Определить радиус и центр окружности, на которой лежит наибольшее число точек заданного на плоскости множества точек» решение задачи состоит в переборе всех вариантов различных троек точек заданного множества. Для каждой тройки точек, не лежащих на одной прямой,необходимовычислить центр и радиус описанной вокруг треугольника окружности по приведенным выше формулам. Перебрав оставшиеся точки множества, определить, сколько из них лежит на построенной окружности. Если количество точек, лежащих на

20

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