ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ Федеральное государственное образовательное учреждение высшего профессионального об...
3 downloads
207 Views
389KB Size
Report
This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
Report copyright / DMCA form
ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ Федеральное государственное образовательное учреждение высшего профессионального образования «ЮЖНЫЙ ФЕДЕРАЛЬНЫЙ УНИВЕРСИТЕТ»
Е.С.НЕВСКАЯ, А.А.ЧЕКУЛАЕВА
ТЕХНОЛОГИЯ ВЫПОЛНЕНИЯ ИНДИВИДУАЛЬНЫХ ЗАДАНИЙ ЧАСТЬ 1
МЕТОДИЧЕСКИЕ УКАЗАНИЯ по курсу
«ИНФОРМАТИКА» для студентов 1 курса дневного и вечернего отделений факультета математики, механики и компьютерных наук
Ростов-на-Дону 2008
Методические указания разработаны сотрудниками кафедры прикладной математики и программирования старшим преподавателем Е.С. Невской и старшим преподавателем А.А. Чекулаевой.
Печатается в соответствии с решением кафедры прикладной математики и программирования факультета математики, механики и компьютерных наук ЮФУ, протокол № 10 от 24 июня 2008 г.
2
СОДЕРЖАНИЕ
Введение....................................................................................................... 4 1 Методология программирования............................................................ 5 2 Стиль программирования ........................................................................ 7 3 Некоторые приемы программирования.................................................. 9 4 Примеры выполнения заданий в первом семестре.............................. 11 4.1 Обработка чисел и последовательностей ....................................... 11 4.2 Табулирование функций .................................................................. 15 4.3 Ряды и пределы................................................................................. 18 4.4 Одномерный массив......................................................................... 25 4.5 Двумерный массив .......................................................................... 34 Литература ................................................................................................. 41
3
ВВЕДЕНИЕ Студенты первого и второго курсов слушают лекции по дисциплинам «Информатика» и « Языки программирования», подкрепляют изучение лекционных курсов на практических и лабораторных занятиях. Методические указания содержат рекомендации для выполнения индивидуальных заданий по программированию. Студент по каждому индивидуальному заданию должен представить отчет, соблюдая установившиеся требования. Отчет должен включать следующие пункты: 1) формулировка условия задачи; 2) постановка задачи; 3) метод решения; 4) описание алгоритма; 5) проверка правильности алгоритма; 6) программа на алгоритмическом языке; 7) тестирование программы для различных наборов входных данных; 8) выполнение программы и анализ результатов. В конкретных заданиях правила могут изменяться и детализироваться. Так, для простых задач пункты формулировка условия задачи и постановка задачи, а также пункты метод решения и описание алгоритма могут быть объединены. В первом семестре студенты выполняют индивидуальные задания по темам: работа с числами, ряды, обработка последовательностей, табулирование функций, работа с одномерным массивом и работа с двумерным массивом. Во втором семестре темы индивидуальных заданий следующие: использование процедурного типа в процедурах и функциях, обработка строк, работа с записями и массивами записей, текстовые и типизированные файлы, использование модульного подхода. Методические указания состоят из двух частей. В первую часть включены задания, выполняемые в первом семестре, а во вторую часть – задания, выполняемые во втором семестре.
4
1 МЕТОДОЛОГИЯ ПРОГРАММИРОВАНИЯ Методология программирования включает следующие компоненты − это наука, техника (ремесло) и искусство. На этапе проектирования программирование требует от программиста немалой изобретательности. Проект программы − это практически изобретение, произведение искусства. Но программирование − это одновременно и техническая задача, для решения которой формулируются технологические правила, представляющие собой эмпирически найденные правила хорошего программирования. Эти правила передаются от мастера к ученикам. Однако программирование − это наука. Наука показывает, как можно достичь множества целей, применяя строго определенные правила построения к основным конструктивным элементам. Наука демонстрирует, какие свойства программы выводимы из свойств, подразумеваемых у ее составляющих. Необходимость и возможность создания математической теории программирования были провозглашены в первые годы развития вычислительных машин. Это объясняется отчасти тем, что первыми программистами были математики и среди них − видные ученые. Математическая теория начала использоваться в таких разделах программирования, как языки и трансляторы, операционные системы и базы данных, далее проникла в исследования готовых программ и затронула сущность процесса программирования. Процесс подготовки задачи к решению на вычислительной машине условно включает следующие этапы: – математическая формулировка задачи; – выбор метода решения задачи; – разработка алгоритма; – описание алгоритма на алгоритмическом языке (получение программы); – тестирование программы; 5
– проведение расчетов, анализ результатов. Первый этап состоит в анализе проблемы и в построении математической модели, или в точной постановке задачи. На основе выделенных закономерностей, характеризующих моделируемое явление, уточняются входные и выходные данные и связи между ними. Таким образом, на этапе математической формулировки задача описывается в виде некоторой математической конструкции. Второй этап состоит в решении поставленной математической задачи. Математическую модель уже можно изучать чисто математическими методами, не вдаваясь в физическую природу объекта. Другими словами, необходимо выбрать метод решения задачи, с помощью которого разработать алгоритм ее решения (третий этап). Далее следует представить алгоритм в таком виде, чтобы вычислительная машина могла его выполнить (четвертый этап). Для этого нужно разбить алгоритм на элементарные операции, которые умеет выполнять машина, и записать каждую такую операцию на языке, понятном этой машине, т.е. представить алгоритм в виде программы. Как следует из анализа приведенных этапов, основная работа выполняется человеком без использования вычислительной машины. Фундаментальные идеи, лежащие в основе конструирования алгоритмов (в конечном итоге программ), можно объяснить и понять, не упоминая при этом вычислительную машину. Перечисленные этапы определяют процесс программирования. Программирование – дисциплина многоплановая; оно содержит множество нетривиальных проблем, требующих теоретического фундамента и систематического подхода. Интересные исследования и сложные проблемы возникают тогда, когда программы достигают определенной сложности и больших размеров.
6
2 СТИЛЬ ПРОГРАММИРОВАНИЯ Большое значение для успешной отладки программы имеют простота и рациональность ее кодирования. Когда программа написана аккуратно и логично, легче избежать ошибок или выявить их в случае возникновения. Простота программирования зависит от стиля программирования. Под стилем будем подразумевать набор приемов или методов программирования, которые используют опытные программисты, чтобы получить правильные, эффективные, удобные для применения и легко читаемые программы. Легко читаемая программа создает впечатление, что ее автор хорошо знал, что делал. Программа должна передавать логику и структуру алгоритма настолько, насколько это возможно. Правила хорошего стиля – это результат соглашения между опытными программистами. Следуя определенному стилю программирования, можно избежать многих трудностей, которые возникают при разработке и модификации программы. Приведем некоторые советы, которые являются результатом здравого смысла и опыта программистов. Пишите программы просто и четко (“Keep it simple!” – придерживайтесь простоты!), помните: программы читаются людьми. Если существует более одного способа сделать что-либо и выбор произвольный, остановитесь на одном способе и всегда его придерживайтесь. Делайте комментарии; комментарии должны содержать дополнительную информацию, а не перефразировать программу; каждая программа должна начинаться с комментария, описывающего цель программы (что делает программа). Делайте пробелы для улучшения читаемости программы. Размещайте пробелы с обеих сторон бинарной операции. Это выделяет операцию и улучшает читаемость программы. Используйте отступы для изображения структуры оператора. 7
Благодаря ступенчатой записи легко прослеживается структура алгоритма в программе. Операторы, принадлежащие одной и той же структурной конструкции, должны начинаться на одинаковом расстоянии от левого края. Этот же прием позволяет легко находить соответствующие друг другу открывающие и закрывающие скобки. Отступы в условных операторах и операторах цикла показывают состав оператора и упрощают чтение программы. Используйте имена с подходящей мнемоникой. Выбор осмысленных имен переменных помогают программе быть «самодокументируемой». Не используйте в качестве идентификаторов зарезервированные слова. В каждой строке программы должно быть не более одного оператора. Выбирайте представление данных, соответствующее задаче.
8
3 НЕКОТОРЫЕ ПРИЕМЫ ПРОГРАММИРОВАНИЯ Остановимся прежде всего на простых, часто встречающихся ошибках, к которым отнесем следующие: 1) отсутствие инициализации переменной; 2) отсутствие повторной инициализации переменной при повторном выполнении сегмента программы; 3) ошибки при расстановке скобок в выражениях; 4) попытка деления на ноль; 5) ожидание целого результата при делении целых чисел – деление двух целых чисел приводит к вещественному результату; 6) повторное использование параметра функции (процедуры) как локальной переменной внутри функции (процедуры) – синтаксическая ошибка; 7) извлечение квадратного корня из отрицательного числа; 8) использование вещественных значений в цикле while может привести к ошибке смещения количества повторений; 9) отсутствие круглых скобок в выражениях, включающих операции and и or, приводит к синтаксической ошибке; 10) индекс элемента массива не должен принимать значений вне диапазона допустимых значений индекса; 11) когда процедура (функция) содержит параметр, который она должна изменять, следует использовать передачу параметра по ссылке (параметрпеременная), иначе возникнет семантическая ошибка. Отсюда вытекают важные замечания, которые следует иметь в виду. Задавайте начальные значения всем счетчикам и переменным для накопления сумм и произведений. Обращайтесь к таблице старшинства операций при написании выражений, содержащих много операций. Убедитесь, что операции в выражении выполняются в ожидаемой последовательности. 9
В теле нерекурсивной функции используйте имя функции только в левой части оператора присваивания. Последний оператор печати должен перемещать курсор в начало новой строки. Это способствует возможности повторного использования программы. При выдаче вещественных значений используйте формат вывода вещественных чисел. Выполняйте тестирование программы. Тестирование представляет собой процесс выполнения программы для некоторого набора проверочных значений и сравнения полученных результатов с ожидаемыми. Успех тестирования заключается в выборе подходящего набора проверочных данных. Грамотно подобранный набор проверочных данных может в большей степени укрепить уверенность в том, что программа функционирует правильно. Необходимо проверять не только, делает ли программа то, для чего она предназначена, но и не делает ли она того, чего не должна делать. Тестирование это процесс исполнения программы с целью обнаружения ошибок. Необходимо досконально изучать результаты каждого теста. Тесты для неправильных и непредусмотренных входных данных следует разрабатывать так же тщательно, как для правильных и предусмотренных данных. Хорошим является тест, который имеет высокую вероятность обнаружения ещё не выявленной ошибки. Используйте так называемый прием
защитного программирования. Это
значит, что нужно составлять каждую программу так, чтобы она защищала саму себя от ошибок. Это, например, значит, что следует отслеживать неправильные данные, проверять на возможность арифметического переполнения, не извлекать корень квадратный из отрицательного числа. Каждая функция или процедура должна содержать одну, точно определённую операцию, а имя функции или процедуры должно отражать смысл данной операции. Это облегчает многократное использование этой операции. 10
4 ПРИМЕРЫ ВЫПОЛНЕНИЯ ЗА ДАНИЙ В ПЕРВОМ СЕМЕСТРЕ 4.1 Обработка чисел и последовательностей Задача 1 Даны длины сторон прямоугольника. Определить, на сколько квадратов можно разрезать прямоугольник, если каждый раз отрезать квадрат максимально возможной площади. Входные данные: a, b - длины сторон прямоугольника (переменные принадлежат классу натуральных чисел). Выходные данные: n – количество квадратов (переменная принадлежит классу натуральных чисел). Метод решения Метод решения задачи состоит в следующем: – выбрать большую сторону прямоугольника и определить, сколько раз в ней целиком поместится меньшая сторона (переменная k); – с остатком большей стороны и меньшей стороной повторить ту же операция (процесс завершается, когда остаток станет равным нулю). Графическая иллюстрация метода решения задачи представлена на рисунке.1.
Рисунок 1– Графическая иллюстрация алгоритма решения задачи.
11
Разработка алгоритма Алгоритм представляется в виде последовательности следующих действий: – определить a = max(a,b); – определить количество повторений меньшей стороны b на большей стороне a: k:=a div b; – определить остаток от деления a на b: a:=a mod b; – последовательность действий выполнить до условия a=0. Текст программы program Cycle; var a,b,k,c,n:
integer;
begin write('Введите стороны прямоугольника'); readln(a,b); n:=0; repeat if a0 then begin s:=s+x; k:=k+1 end else if x=0 then
st:=false
end; if st then writeln('нет нуля')
14
else if k=0 then writeln('нет положительных элементов до нуля') else begin sr:=s/k; writeln('sr=',sr:10:3) end end. Тестовые примеры 1)
n = 5, {xn}= (-3 , 5 , 2 , 0 , 4), sr= 3.5
2)
n = 5, {xn}= (-3 , 5 , 2 , -2 , 5), нет нуля
3)
n = 5, {xn}= (-3 , -5 , 0 , 2 , 4), нет положительных элементов до нуля
4.2 Табулирование функций Задача 3 Выдать таблицу значений двух заданных вещественных функций от одной вещественной переменной f ( x) = tg ( x) и g ( x) = 1 /( x − 2 x ) . Постановка задачи Таблицу получить на заданном отрезке [a, b] с заданным шагом h. При построении таблицы проверять, определена ли табулируемая функция в
очередной точке таблицы. Если функция не определена, то в таблицу вместо значения функции помещать символ ‘- ‘ (прочерк). Входные данные: a, b – границы заданного отрезка, h – шаг таблицы. Выходные данные: таблица значений двух заданных функций. Вспомогательные переменные: x, y, z – переменны для значений аргумента и двух функций f и g. 15
Исследование поведения функций Функция f ( x ) = tg ( x) определена всюду, кроме тех значений x, в которых cos(x)=0. Функция
g ( x) = 1 /( x − 2 x )
не
определена,
если
xeps do begin y:=y+an; n:=n+1; an:=an*x/n end; writeln('сумма=', y:12:7) end. Тестовые примеры 1) x = 1,
eps = 0.01,
y = 2.7083333
2) x = 1,
eps = 0.001,
y = 2.7180556
3) x = 1,
eps = 0.0001, y = 2.7182540
20
Вычисления при разных значениях eps позволяют получать более точные значения результата. Полученные значения можно сравнить с точным значением exp(1)=2.71828182845905. Задача 5 При заданном значении x, ε и а (а – не целое число) вычислить сумму s ( x, ε ) , прекратив вычисления, когда очередной член суммы (слагаемое) по абсолютной величине станет меньше ε . При том же значении x вычислить функцию y(x). Близость значений s ( x, ε ) и y(x) будет указывать на правильность вычислений.
1 x3 1⋅ 3 x5 1⋅ 3 ⋅ 5 x 7 x ⋅ + ...; ⋅ − s ( x, ε ) = − ⋅ + a 2 ⋅ 3 a3 2 ⋅ 4 ⋅ 5 a5 2 ⋅ 4 ⋅ 6 ⋅ 7 a7 ⎛x ⎞ x2 ⎟; [ x 2 < a 2 ] y ( x) = ln⎜ + + 1 . 2 ⎜a ⎟ a ⎝ ⎠ Входные данные: x,a – заданные значения для вычисления s(x, ε ), eps – константа для оценки величины очередного члена суммы. Выходные данные: s – приближённое значение суммы, y – значение функции y(x). Вспомогательные переменные: an – переменная для значения очередного слагаемого, с – переменная для значения x/a, b = с2 , n – обозначает номер очередного слагаемого. Метод решения Вывод рекуррентного соотношения для вычисления an:
(2n − 1)!!⋅x 2 n +1 ⋅ (−1) n an = , (2n)!!⋅(2n + 1) ⋅ a 2 n +1
∞
s ( x, ε ) = ∑ a n , n =0
21
an (2n − 1)!!⋅ x 2 n+1 ⋅ (−1) n (2n − 2)!!⋅(2n − 1) ⋅ a 2 n−1 = ⋅ = a n−1 (2n)!!⋅(2n + 1) ⋅ a 2 n+1 (2n − 3)!!⋅x 2 n−1 ⋅ (−1) n−1 2
x 2 ⋅ (2n − 1) ⋅ (2n − 1) x 2 ⋅ (2n − 1) , = (−1) ⋅ =− 2 a 2 ⋅ (2n + 1) ⋅ 2n a ⋅ (2n + 1) ⋅ 2n так как c=x/a, то
c 2 ⋅ (2n − 1) 2 . a n = −a n −1 ⋅ 2n ⋅ (2n + 1) Описание алгоритма Вначале проверяется условие x 2 ≥ a 2 . И если оно выполняется, выдаётся сообщение “неверный ввод” и программа завершает работу. При не выполнении условия x 2 ≥ a 2 , в цикле на каждой итерации – проверяется абсолютная величина очередного члена суммы ряда: |an| > eps. – если условие выполняется, то слагаемое прибавляется к сумме, определятся значение следующего члена ряда, и вычисления продолжаются. – если условие |an| > eps не выполняется, то завершается подсчёт суммы. Текст программы program Row2; var x, a, b, c, s, y, an, eps :real; n:integer; begin writeln('введите x,а и eps, так чтобы x*x