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

Методичка Программирование

.pdf
Скачиваний:
35
Добавлен:
13.03.2016
Размер:
3.61 Mб
Скачать

Рис. 25. Результат работы программы

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

1.Составить функцию, которая переносит в начало не пустого списка его последний элемент. Составить функцию, которая меняет местами первый и последний элемент списка L.

2.Составить функцию, которая находит среднее арифметическое всех элементов непустого списка L. Составить функцию, которая определяет, входит ли элемент Е в список L. Составить функцию, которая подсчитывает число вхождений элемента с указанным пользователем значением в список L.

3.В стеке помещены сведения – запись, имеющая следующие поля: ФИО, количество несданных предметов. Создать и вывести на экран список студентов, у которых более трех несданных предметов.

4.Составить функцию, которая заменяет в списке L все вхождения Е1 на Е2. Составить функцию, которая находит максимальный элемент непустого списка L.

5.Составить функцию, которая удаляет из списка L только первое вхождение элемента Е, если такой есть.

6.Составить функцию, которая строит L1 – копию списка L. Составить функцию, которая удаляет из списка L все вхождения элемента Е.

101

7.Включить элемент Е в начало списка, если такого элемента в списке нет.

8.Составить функцию, которая включает новый элемент Е в упорядоченный список.

9.Составить функцию, которая объединяет два упорядоченных по возрастанию списка L1 и L2 в один упорядоченный по возрастанию список L. Компоненты списков – целые числа.

10.Составить функцию, которая формирует список L, включив в него по одному разу элементы, которые входят одновременно в оба списка L1 и L2.

 

Список литературы

 

1. Касаткин А.И.,

Вальвачев А.Н.

Профессиональное

программирование на языке Си: От Turbo C к Borland C++: Справ.пособие.– Мн.: Выш.шк., 1992.– 240 с.

2.Затонский А.В. Программирование на языке высокого уровня. Основные алгоритмы и их реализация на языку Си – Перм. гос. техн.

ун-т.– Пермь, 2006.– 97с.

3.Бильфельд Н.В., Затонский А.В. Программирование и основы алгоритмизации. Теоретические основы и примеры реализации численных методов. – Пермь: Перм. гос. техн. ун-т., Березниковский филиал, 2007.– 131 с.

4.Кореневская О.В. Турбо Паскаль 7.0 – М.: НТ Пресс, 2007.– 144 с.

5.Красиков И.В., Красикова И.Е. Алгоритмы. Просто как дважды два – М.: Эксмо, 2006.– 256 с.

6. Алексеев Ю.Е., Ваулин А.С., Куров А.В. Практикум по программированию: Обработка числовых данных: учеб. пособие.– М.: Изд-во МГТУ им. Н.Э. Баумана, 2008.– 288 с.

102

Приложение 1. Функция перекодировки кириллицы

При выводе на экран русскоязычных текстов можно использовать следующую функцию перекодировки символов из кодировки windows (cp1251) в кодировку OEM (cp866) :

function Rus(S:String):String; var i:byte;

begin

Result:='';

for i:=1 to Length(S) do case S[i] of

'А'..'п':Result:=Result+Chr(Ord(S[i])-64); 'р'..'я':Result:=Result+Chr(Ord(S[i])-16); 'Ё': Result:=Result+Chr(240);

'ё': Result:=Result+Chr(241); else

Result:=Result+S[i];

end; end;

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

Пример использования:

Writeln(Rus(‘Введите длину пути в метрах:’));

103

Приложение 2. Приемы, используемые для минимизации объема вычислений

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

Вынесение общих множителей за скобки. Например, вместо оператора

Z : =Sin(X) *Y-Sin(X)*Sqr(У)*Y+Sqr(X)*Х+Х;

лучше использовать оператор

Z:=Sin(X)*Y*(l-Sqr(Y) )+Х* (Sqr (X)+1) ;

Использование схемы Горнера для полиномов. Например, полином

2 x5 5 x4 2 x3 7 x2 4 x 6,

преобразованный по схеме Горнера, примет вид

((((2 x-5) x 2) x 7) x-4) x 6,

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

((((2*X - 5)*X + 2)*X + 7)*X - 4)*X + 6,

а по первому –

2*IntPower(X,5) - 5*IntPower(X,4) + 2*IntPower(X,3) + 7*IntPower(X,2) - 4*X + 6.

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

1 2! 3! 4! 5! 1 2(1 3(1 4(1 5)))

Использование дополнительных переменных. Например, при расчете

значения

функции

Z (x y)

1 (x y)3

целесообразно предварительно

1 (x y)2

 

 

 

 

вычислить

A X Y

и B A2 , а исходную формулу преобразовать к виду

Z A1 AB . В этом случае в программе будут использованы три оператора

1 A

присваивания:

A:=X-Y;

B:=Sqr(A);

Z:=A*(1+A*B)/(1+B);

104

Приложение 3. Отладка программы

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

Классификация ошибок

Ошибки, которые могут быть в программе принято делить на три группы:

1)синтаксические;

2)ошибки времени выполнения;

3)алгоритмические.

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

Ошибки времени выполнения, в Delphi они называются исключениями (exception), тоже, как правило, легко устранимы. Они обычно проявляются уже при первых запусках программы и во время тестирования.

При возникновении ошибки в программе, запущенной из Delphi, среда разработки прерывает работу программы, о чем свидетельствует заключенное в скобки слово Stopped в заголовке главного окна Delphi, и на экране появляется диалоговое окно, которое содержит сообщение об ошибке и информацию о типе (классе) ошибки. На рис. П.1 приведен пример сообщения об ошибке, возникающей при попытке открыть несуществующий файл.

После возникновения ошибки программист может либо прервать выполнение программы, для этого надо из меню Run выбрать команду Program Reset, либо продолжить ее выполнение, например, по шагам (для этого из меню Run надо выбрать команду Step), наблюдая результат выполнения каждой инструкции.

Рис. П.1. Сообщение об ошибке при запуске программы из Delphi

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

105

Рис. П.2. Сообщение об ошибке при запуске программы из Windows

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

Предотвращение и обработка ошибок

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

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

Инструкция обработки исключения в общем виде выглядит так:

try

// здесь инструкции, выполнение которых может вызвать исключение

except // начало секции обработки исключений on ТипИсключения1 do Обработка1;

on ТипИсключения2 do Обработка2; on ТипИсключенияJ do ОбработкаJ; else

// здесь инструкции обработки остальных исключений end;

где:

try – ключевое слово, обозначающее, что далее следуют инструкции, при выполнении которых возможно возникновение исключений, и что обработку этих исключений берет на себя программа;

except – ключевое слово, обозначающее начало секции обработки исключений. Инструкции этой секции будут выполнены, если в программе возникнет ошибка;

106

on – ключевое слово, за которым следует тип исключения, обработку которого выполняет инструкция, следующая за do;

else – ключевое слово, за которым следуют инструкции, обеспечивающие обработку исключений, тип которых не указаны в секции except.

Как было сказано выше, основной характеристикой исключения является его тип. В табл. П.1 перечислены наиболее часто возникающие исключения и указаны причины, которые могут привести к их возникновению.

 

 

Таблица П.1.

 

Типичные исключения

Тип исключения

 

Возникает

EZeroDivide

 

При выполнении операции деления,

 

 

если делитель равен нулю

EConvertError

 

При выполнении преобразования, если

 

 

преобразуемая величина не может

 

 

быть приведена к требуемому виду.

 

 

Наиболее часто возникает при

 

 

преобразовании строки символов в

 

 

число или вводе вещественного числа

 

 

с неправильным разделителем

EFilerError

 

При обращении к файлу. Наиболее

 

 

частой причиной является отсутствие

 

 

требуемого файла или, в случае

 

 

использования сменного диска,

 

 

отсутствие диска в накопителе

107

Приложение 4. Диагностические сообщения компилятора Delphi 7

Ниже приведен список наиболее часто возникающих ошибок и сообщение среды Delphi выдаваемое при возникновение подобной ошибки.

1.<Выражение_1> expected but < Выражение_2> found.

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

')' expected but ';' found (вместо ожидавшейся скобки найдена запятая);

2.<Имя> is not a type identifier.

Данное <Имя> не является именем типа;

3.‘;’ not allowed before 'Else'.

Перед else нельзя ставить точку с запятой;

4.Array type required.

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

5.Assignment to FOR-loop variable <Имя>.

Присваивание значения параметру FOR-цикла в теле цикла;

6.Break or Continue outside of loop.

Операторы Break или Continue – находятся не в цикле;

7.Cannot initialize local variables.

Локальные переменные запрещено инициализировать (задавать им значения при описании);

8.Constant expression expected.

Вэтом месте должна стоять константа или константное выражение, например константа выбора в структуре Case;

9.Constant or type identifier expected.

Требуется имя типа или тип-диапазон. 10. Could not compile used unit <Имя>.

Компиляция присоединенного модуля <Имя> невозможна; 11. Data type too large.

Тип определяет структуру размером более 2 Гбайт; это слишком много.

12.Declaration expected but <Что-то> found.

Пропущено описание или оператор;

13.Declaration of <Имя> differs from previous declarations.

Данный заголовок блока не соответствует более раннему

объявлению блока;

14.Expression expected.

Вэтом месте программы должно стоять выражение;

15.For loop control variable must be simple local variable.

Параметр цикла должен быть простой локальной переменной; 16. For loop control variable must have ordinal type.

108

Параметр цикла должен иметь порядковый тип. Вещественный тип запрещен;

17.Function needs result type.

Взаголовке функции надо указывать тип ее результата;

18.Identifier expected but <Что-то> found.

Вэтом месте должно стоять имя. Например, пропущено имя функции после function;

19.Identifier redeclared <Имя>.

<Имя> описано повторно, но в пределах блока имя можно описать лишь раз. Проверьте, не обозначена ли локальная переменная тем же именем, что и формальный параметр блока;

20. Illegal character in input file <Знак>.

Запретный знак, например «русская» буква, либо оставлена скобка }, и убрана открывающаяся скобка {;

21.Illegal type in Read/Readln (Write/Writeln) statement.

Элемент запрещенного типа в списке ввода/вывода;

22.Incompatible types <Указание типов>.

Несоответствие типов по присваиванию или типов операндов одной операции;

23. Invalid function result type.

Недопустимый тип результата функции; 24. Missing operator or semicolon.

Пропуск операции (например перед скобкой) или пропуск точки с запятой. При пропуске ';' маркер ошибки стоит на следующей строке;

25. Not enough actual parameters.

He хватает фактических параметров при вызове подпрограммы; 26. Operator not applicable to this operand type.

Операция не применима к операндам данного типа; 27. Ordinal type required.

Требуется порядковый тип (например, в индексе);

28.Statement expected but <Что-то> found.

Вэтом месте должен стоять оператор. Сообщение выдается во всех случаях, когда в тело блока или секцию инициализации ошибочно помещают описание (<Что-то>). Ошибочная форма обращения к процедуре Procedure <Имя> или к функции Function <Имя> также вызывает сообщение;

29.Syntax error in real number.

Синтаксическая ошибка в записи числа вещественного типа;

30.There is no overload version of <Имя> that can be called with these arguments.

Не предусмотрена подпрограмма, которая могла бы вызываться с таким аргументом. Пример: IntToStr(x), где х – выражение вещественного типа;

31.Too many actual parameters.

Фактических параметров больше, чем формальных;

109

32. Type of expression must be <Тип>.

Выражение должно быть указанного типа. Например, после while и until должно стоять логическое выражение;

33. Undeclared identifier: <Имя>.

Не объявленный идентификатор. Например, используемая переменная не объявлена;

34. Unexpected end of file in comment started on line <N>.

Неожиданный конец файла при незавершенном комментарии, начало комментария – в строке N;

35. Unterminate string.

Не закрыта апострофом строка-константа типа string;

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

1.Return value of function <Имя> might be undefined.

Втеле функции нет присваивания её результата;

2.Variable <Имя> might not have been initialized.

Указывает имя переменой, которой не задали значения до первого использования на чтение;

3.For-Loop variable <Имя> may be undefined after loop.

Попытка использования значения параметра for-цикла после завершения этого цикла, её значение не гарантируется;

4.Text after final ‘END.' ignored by compiler.

Текст, идущий за конечной строкой модуля, игнорируется компилятором;

5. Variable <Имя> is declared but never used in <Имя блока>.

Обращает внимание на переменную <Имя>, описанную, но не нашедшую применения;

6.Value assigned to <Имя> never used.

Последнее записанное значение переменной <Имя> никак не использовано.

110