Автор Анна Евкова
Преподаватель который помогает студентам и школьникам в учёбе.

Основы программирования на языке Pascal

Содержание:

Введение

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

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

Терминология "высокий уровень" означает, что язык программирования приближен к мышлению человека. В них не учитываются особенности архитектуры конкретной модели компьютера, поэтому разрабатываемые программы легко переносятся на другие платформы. Разнообразие языков программирования обусловлено их специфическими особенностями и предназначением. Basic разработан в 60е годы как язык программирования для начинающих. Pascal, созданный в конце 70х для обучения программированию как систематической дисциплине. С для разработки программ системного назначения, обладающих преимуществами как языков программирования низкого уровня (компактность и эффективность разрабатываемых программ), так и преимуществами языков высокого уровня (независимость от машинных архитектур).

Первая версия Turbo Pascal появилась в 1983 году и использовалась недолго. Через год вышла в свет вторая версия, получившая широкое распространение. В 1985 году вышла третья версия языка, удобная в эксплуатации и более быстродействующая. В четвертой версии появился встроенный компилятор, а в пятой встроенный отладчик. Разработанная в 1989 году версия 5.5, позволила перейти к поддержке объектно-ориентированной технологии программирования. Turbo Pascal 6.0 был расширен поддержкой многодокументного интерфейса, обладал встроенным ассемблером, что позволяло эффективно выполнять процедуры работы с устройствами компьютера на низком уровне. В 1992 году фирма Borland выпускает два пакета Borland Pascal 7.0 и Turbo Pascal 7.0. Эти пакеты позволяют не только использовать в разработке программ объектно-ориентированную методологию, но и разрабатывать приложения с поддержкой защищённого режима работы микропроцессора, а также создавать приложения для работы под популярную операционную среду "Windows". Дальнейшее своё продолжение Pascal получил в визуальной среде, поддерживающей технологию быстрой разработки приложений RAD (Rapid Application Development) Delphi. Delphi одно из наиболее распространённых в настоящий момент средств разработки программных продуктов, объединяющее средства визуального проектирования и объектный Pascal. Поскольку Pascal предназначен, в первую очередь, для изучения программирования как дисциплины, то многие профессиональные программисты начинали свой путь именно с изучения программирования на языке Pascal.

Глава 1. ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ ПАСКАЛЬ

1.1 Описание языка Object Pascal

Турбо Паскаль был создан в 1983 году компанией Borland на базе Паскаль. От оригинала программа отличалась скоростью компиляции – она была значительно выше. Этот фактор позволил ей приобрести популярность среди программистов и учащихся 20 века, благодаря чему она была переработана 10 раз, и последняя ее версия – Turbo Pascal 7.1 – вышла в 1994 году. Этот язык считается уже устаревшим, и был заменен на Object Pascal.

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

У любой программы есть свои сильные и слабые стороны, Object Pascal тому не исключение. Преимущества:

  • высокая скорость компиляции;
  • возможность использовать вставки на машинно-ориентированном
    языке;
  • простота использования и встроенная обучающая база;
  • набор функций, позволяющих ускорить работу с утилитой;
  • поддержка нескольких видов программирования: структурного, объектно-ориентированного, и «сверху-вниз».

Недостатки:

  • устаревший язык программирования, который редко используется в современной практике;
  • наличие фундаментальных ошибок в работе утилиты, которые так и не были устранены.
  • Несмотря на преобладание плюсов, Pascal версии Turbo сейчас используется только в обучающих целях, да и то большинство школ уже перешли к преподаванию типа Object.

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

Следующая его особенность – простой синтаксис, который позволяет понять текст программы даже тому, кто очень поверхностно знает принцип ее функционирования. Это упрощает процесс обучения и позволяет работать с Turbo Pascal, основываясь на примерах кодов, приведенных во встроенной справочной базе.

Программа, написанная на языке программирования Pascal,
состоит из заголовка, раздела описаний и тела программы (блока
операторов).

Для объявления заголовка необходимо указать слово Program, а затем название самой программы, например:

Program Programma;

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

Раздел описания употребляется как общее обозначение, а входят в него следующие разделы:

1) Раздел описания модулей:

Uses <имя 1, имя 2, … >;

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

Пример:

Uses Crt, Graph;

2) Раздел описания меток:

Label <метка 1, метка 2,…>;

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

3) Раздел описания констант:

Const <имя 1, имя 2, …> ;

Константе (не изменяющийся величине) можно присвоить значение посредством знака =, который будет отделять его от имени константы,
например:

Соnst

A = 10;

B = 0;

C = ‘C’;

Exit = ‘Exit’;

Char = оrd (‘B’) — ord (‘А’) + 1;

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

4) Раздел описания типов:

Type

<имя типа 1> = <определение типа 1>;

<имя типа 2> = <определение типа 2>; …

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

Пример:

type

degrees =1..40;

month=string[30];

var

mart: month;

monday: degrees;

5) Раздел описания переменных:

Var <имя 1, имя 2, …, имя N>: <тип>;

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

Пример:

Var

A, B, C: Integer;

Number: Char;

Y, N: Boolean;

6) Раздел описания процедур и функций;

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

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

Раздел операторов является телом программы и представляет собой составной оператор, начало которого обозначается словом Begin, а конец – End.. Заключенный в нем операторы заканчиваются символом. Без этого раздела программа не имеет ни какого смысла.

В итоге получилась следующая структура программы на Паскаль:

Program <имя программы>; { Заголовок программы }

Uses <имя 1, имя 2, … >; { Раздел описания модулей }

Label <метка 1, метка 2,…>; { Раздел описания меток }

Const <имя 1, имя 2,…>; { Раздел описания констант }

Type { Раздел описания типов }

<имя типа 1> = <определение типа 1>;

<имя типа 2> = <определение типа 2>;

Var <имя 1, имя 2,…>: <тип>; { Раздел описания переменных }

{Раздел описания процедур и функций}

Begin { Тело программы }

<операторы>

End.

Комментарии используются для пояснения определенного участка программы, и представляют собой любой текст, заключенный в фигурные скобки {..} или в (*..*). Они не могут включать в себя внутренние комментарии, но возможна конструкция (*..{..}..*). Также стоит отметить, что если после открывающей скобки следует знак $, то этот комментарий воспринимается как директива компилятора.

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

1.2 Работа со строками в Object Pascal

Чтобы обработать строковую информацию, в предусмотрен строковый тип данных Паскаль. Строка в Паскале — это совокупность определенного числа символов (это число определяет длину строки). Представим синтаксис строки Паскаль:

var st:string[n];

var st:string;

где n означает максимально возможную длину строки (целое число от 1 до 255). В случае, когда этот параметр отсутствует, по умолчанию он равен 255. Строковые константы записывают в виде определенной программистом последовательности символов, которую ограничивают апострофами. Возможно также формировать строки, используя:

  • запись символов по десятичному коду (т.е. комбинация: «#» + код символа),
  • управляющие символы (т.е. комбинация: «^» + некоторые заглавные латинские буквы).

Примеры строк Паскаль:

‘Программа’

#23#45#67

‘pascal’^С^N

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

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

Прямой доступ к отдельным символам строки в Паскале определяется следующим образом: i-тый символ строковой переменной stroka записывают в виде stroka[i]. Например, если stroka=’Символ’, то stroka[1] — есть ‘С’, stroka[2] — ‘и’, stroka[3] — ‘м’ и т.д.

В Паскале над строками определена операция конкатенации (слияния строк), которая обозначается символом «+». Например:

a:=’Сегодня’;

b:=’ понедельник’;

c:=a+b;

В результате выполнения операции конкатенации переменной c присваивается значение ‘Сегодня понедельник’. Помимо операции конкатенации в Паскале над строками применяются операции сравнения:

< , > <> = =< =>

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

1.3 Работа с файлами в Object Pascal

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

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

В Паскале различают следующие три вида файлов (в скобках описаны ключевые слова для инициализации файловой переменной):

  • текстовые файлы (text);
  • типизированные (file of <тип>);
  • бестиповые (file).

Рассмотрим основные операции для работы с файлами.

  1. Создание файла: Assign(<имя файловой переменной>, <имя
    файла>).

Процедура Assign связывает переменную файлового типа с физическим файлом. Например, установить соответствие между переменной Fil и текстовым файлом lot, расположенном на диске D, можно так:

Assign(Fil, ‘D:\lot.txt’)

2. Режим чтения: Reset(<имя файловой переменной>).

Процедура Reset открывает файл в режиме чтения, после чего оператором Read(<файловая переменная>, <считываемый элемент>) можно осуществить последовательное считывание элементов в программу.

3. Конец файла: ЕOF(<имя файловой переменной>).

Количество элементов в файле заранее не определяется, но часто необходимо знать о моменте достижения конца файла. Для этого в Паскале существует логическая функция EOF, которая проверяет достигнут ли конец, и если это так, то принимает значение True, иначе – False. Осуществляется проверка, как правило, в цикле, в качестве условного выражения выступает функция EOF.

4. Режим записи: Rewrite(<имя файловой переменной>).

Открыв файл в режиме записи, можно поэлементно записать в него информацию, воспользовавшись процедурой Write(<файловая переменная>, <элемент>).

5. Закрытие файла: Close(<имя файловой переменной>).

Процедура Close закрывает открытый файл, а также освобождает файловую переменную, указанную в качестве параметра.

6. Удаление файла: Erase(<имя файловой переменной>).

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

7. Изменение имени файла: Rеnаmе(<имя файловой переменной>, ‘<новое имя файла>’).

Rеnаmе переименовывает физический файл, который перед этим следует закрыть процедурой Close.

8. Смещение указателя файла: Sееk(<имя файловой переменной>, <номер элемента>).

Процедура Sееk устанавливает позицию указателя в файле на необходимый элемент (нумерация элементов начинается с нуля).

9. Определение положения указателя: FilePos(<имя файловой
переменной>).

Функция FilePos принимает значение порядкового номера элемента, над которым в момент вызова находиться указатель.

10. Определение количества элементов: FileSize(<имя файловой переменной>).

Функция FileSize определяет количество всех имеющихся в файле
элементов.

Текстовые файлы могут состоять из элементов символьного (char) и строкового (string) типа данных. Ключевое слово Text указывает, что файловая переменная создается для работы именно с текстовым файлом:

Var <идентификатор>: Text;

Структура текстового файла представляет собой последовательность строк, которые в свою очередь состоят из символов. Любая строка оканчивается признаком «конца строки», а сам файл признаком «конца файла». Для определения конца файла в Паскаль есть функция EOF, а для конца строки – EOLn:

EOLn(<имя файловой переменной>)

В случае достижения конца строки она (функция EOLn) принимает значение True, в противном случае False.

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

Для текстовых файлов в Паскале определены следующие процедуры и функции:

  1. Append(<имя файловой переменной>)

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

  1. SeekEOLn(<имя файловой переменной>)

Если до конца строки остались пробелы/знаки табуляции, то функция SeekEOLn возвращает значение True, иначе False.

  1. SeekEOF(<имя файловой переменной>)

Если до конца файла остались лишь строки с пробелами/знаками табуляции, то функция SeekEOF возвращает значение True, иначе False.

Процедуры при работе с текстовыми файлами Паскаль:

1) Чтение текстового файла обеспечивают процедуры:

  • read(f,перечень переменных);
  • readln(f,перечень переменных);

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

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

Readln отличается от read тем, что при завершении прочтения
данных происходит пропуск всех оставшихся символов в данной строке,
принимая во внимание метку конца строки. В случае, когда перечень переменных опущен, процедура readln(f) осуществляет пропуск строки при чтении файла текстового типа.

2) Чтобы записать в текстовый файл, используют процедуры:

write(f, перечень переменных);

writeln(f, перечень переменных);

Как и в случае вывода на экран, вариант записи в текстовый файл зависит от типа переменных, помещенных в перечень. При этом следует учитывать
формат вывода. Отличие writeln от write состоит в том, что при завершении
записи всех значений из перечня переменных процедура writeln осуществляет запись и метки конца строки (т.е. происходит формирование законченной строки файла).

3) Для добавления информации в конец файла используют процедуру append(f). Рекомендуется использовать данную процедуру заместо процедуры rewrite.

ГЛАВА 2. РАЗРАБОТКА ПРОГРАММЫ ПОДСЧЕТА СЛОВ В ТЕКСТОВОМ ФАЙЛЕ

2.1 Описание постановки задачи

Разработать программу «Список слов». Файл содержит текст на русском языке.

Составить в алфавитном порядке список всех слов, встречающихся в тексте, и количество этих слов

2.2 Разработка алгоритма реализации задачи

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

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

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

  • Дискретность – представление алгоритма в виде непрерывной последовательности действий. Каждое действие должно выполняться только после полного завершения предшествующего ему.
  • Определенность – каждое выполняемое действие должно быть четко и однозначно определено. Исполнитель должен понять что ему необходимо выполнить только указанные инструкции, без какого-либо отклонения на произвольные действия. За счет данного свойства процесс выполнения алгоритма называют механическим, не требующим никаких дополнительных предписаний или данных о решаемой задаче.
  • Результативность – алгоритм должен помочь исполнителю достигнуть решения задачи с определенным количеством шагов.
  • Массовость – алгоритм выполнения задачи создается в обобщенном виде, т.е. для одной задачи с различными исходными данными может быть применен один и тот же алгоритм её решения.

Для реализуемой задачи внешний вид алгоритма представлен на рисунке 2.1.

Рисунок 2.1 – Алгоритм решения задачи

2.3 Разработка исходного кода программы

На основании построенного алгоритма был реализован программный
код:

Program 1;

var s,sub:string;

i,j,n:integer;

a:array[1..100] of string;

q:set of char;

F : Text;

begin

Assign(F, 'D:\1.txt');

Reset(F);

i:=0;n:=0;

q:=[' ' , ',' , '-' , '!' , '?' , ';' , ':' , '.'];

While not EoF(F) do

begin

Readln(F,s);

repeat

inc(i);

if s[i] in q then begin

inc(n);

a[n]:=sub;

sub:='';

end

else if not (s[i] in q) then

sub:=sub+s[i];

until i=length(s);

end;

Close(F);

if sub <> ' ' then begin

inc(n);

a[n]:=sub;

end;

writeln;

for i:=1 to n-1 do

for j:=n-1 downto i do

if a[j]>a[j+1] then begin

sub:=a[j+1];

a[j+1]:=a[j];

a[j]:=sub;

end;

for i:=1 to n do

writeln(a[i]);

Writeln;

Write('Количество слов: ',n);

end.

Глава 3. СИСТЕМА АВТОМАТИЧЕСКОГО ТЕСТИРОВАНИЯ ПРОГРАММ, НАПИСАННЫХ НА ЯЗЫКЕ ПАСКАЛЬ

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

Классификация типичных ошибок в программах

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

2. Программы часто выдают неверный результат на исходных данных, которые являются «критическими» для данной задачи. Это такие исходные данные, минимальное изменение которых приводит к изменению результата. В качестве примера можно привести задачу вычисления наименьшего числа Фибоначчи, большего (большего или равного) заданного значения. Ошибка в неравенстве, т.е. использование знака «>» вместо «?», или наоборот, приводит к неверному результату для любого числа, совпадающего с каким-либо числом Фибоначчи.

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

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

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

6. Частой ошибкой студентов является использование в программах типа данных integer вместо real.

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

7. Нередко не продумывается, какой тип цикла должен быть использован: пошаговый (for), с проверкой условия до цикла (while) или с проверкой условия после цикла (repeat). Для большинства задач это не имеет

значения, но в ряде задач выбор типа цикла принципиален.

8. Типичной ошибкой начинающих является отсутствие else-части в нескольких подряд идущих условных

операторах. Такая ошибка иногда пропускается при ручной проверке и не проявляется на простых тестах.

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

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

Примеры ошибочных программ и их коррекция

1. Рассмотрим задачу нахождения количества значащих цифр целого неотрицательного числа. Можно

предложить следующую программу на Паскале для ее решения:

var n, k:integer;

begin readln(n); k:=0;

while n>0 do begin k:=k+1; n:=n div 10 end;

writeln(k);

end.

Эта программа выдает верный ответ для всех исходных данных, к

70 Издательство ГРАМОТА www.gramota.net

if r=0 then k:=k+1 else

begin if k>m then m:=k; k:=0;end;

end;

writeln (m)

end.

дает верный результат для всех исходных данных, кроме тех, в которых наиболее длинная последовательность нулей находится в конце. Для исправления этой ошибки достаточно перед оператором writeln(m) вставить оператор if k>m then m:=k.

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

После запуска системы на выполнение пользователю предлагается выбрать задачу для тестирования из списка. В качестве задач взяты упражнения из книги. Этот задачник используется студентами Факультета вычислительной математики и кибернетики Московского государственного университета при изучении языка Паскаль. После выбора задачи предлагается выбрать файл с программой студента. Затем производятся анализ и тестирование выбранной программы.

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

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

В качестве примера можно привести следующую программу для решения задачи нахождения количества

значащих цифр неотрицательного целого числа:

var n, k:integer;

begin read(n);

if n<10 then writeln (1)

else if n<100 then writeln (2)

else if n<1000 then writeln (3)

else if n<10000 then writeln (4)

else writeln (5)

end.

Эта программа дает верный результат для всех чисел типа integer (его неотрицательный диапазон – [0…32767]), но тем не менее, не может рассматриваться как правильная. Для каждой задачи на составление циклов системой проверяется наличие в программе хотя бы одного цикла while, repeat или for, и, в случае их отсутствия, фиксируется ошибка.

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

К настоящему времени реализовано тестирование для случаев, когда результирующие данные могут быть следующих типов: boolean, integer, real, char и string. Если результат имеет тип boolean, то в качестве ответа программа может вывести любое из слов, содержащих буквы ‘T’, ‘Y’, ‘Д’, ‘t’, ‘y’ или ‘д’, для значения ‘true’ и любое из слов, содержащих буквы ‘F’, ‘N’, ‘Н’, ‘f’, ‘n’ или ‘н’, для значения ‘false’. Если тип результата real, то проверяется не точное совпадение результата с эталонным, a близость его на заданную малую константу? Что касается результатов типа integer, char или string, то проверяется полное совпадение данных, выдаваемых программой, с эталонами.

К настоящему времени созданы и встроены в систему тесты к 100 задачам из по темам «Оператор цикла», «Символьный тип», «Перечислимые и ограниченные типы. Оператор варианта» и «Регулярные типы: векторы». Система написана в среде программирования Delphi на языке Object-Pascal и может выполняться в операционной среде Windows.

Программный пакет занимает объем около 10 Mб на диске без FPC-компилятора. Общий объем системы Free-Pascal, включающий компилятор, – около 140 Мб.

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

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

Заключение

В курсовой работе были рассмотрены основные вопросы, касающиеся основ структурного программирования в среде Turbo Pascal. Turbo Pascal является одним из наиболее востребованных языков программирования которые используются при обучения студентов основам алгоритмизации и программирования. Он был создан Николаусом Виртом для обучения студентов в 70-х годах прошлого века, но до сих пор пользуется популярностью у начинающих программистов благодаря своей простоте и возможности создавать от простых программ до сложных многострочных кодов.

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

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

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

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

В процессе написания данной курсовой работы были рассмотрены основные понятия и определения программирования.

Также была проведена систематизация знаний о подходах и принципах создании новых языков программирования.

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

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

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

Список использованной литературы и источников

  1. Баранов А.Н., Крейдлин Е.Г. Информационная безопасность // ВЯ, № 2. 2015. с.84-99.
  2. Григорьев Ю.А., Ревунков Г.И. Банки данных: Учеб. для вузов. М: Изд-во МГТУ им. Н.Э. Баумана, 2017.
  3. Дейт, К. Руководство по реляционной СУБД [Текст] / К. Дейт. 2016. – М. – 519 с. –ISBN – 5-3216-3254-4.
  4. Инструментарий ARIS. Методы. Версия 4.1 М.: Весть-Мета Технология, 2015.
  5. Куправа, Т.А. Создание и программирование баз данных средствами СУБД dBase III Plus, FoxBASE Plus, Clipper [Текст] / Т.А. Куправа. – М. : Мир, 2015. – 468 с. – ISBN 6-0934-22981-3.
  6. Мартин, Г. SQL: Справочное руководство [Текст] / Г. Мартин. – М. : Лори, 2014. – 316 с. – ISBN 7-0932-023411-9.
  7. Монахов, В. Язык программирования Pascal [Текст] / В. Моняхов. – СПб. : БХВ-Петербург, 2017. - 640 с. - ISBN 978-5-9775-0216-0.
  8. Моргун, А. Н. Справочник по Turbo Pascal для студентов [Текст] / А. Н. Моргун. – М. : Вильямс, 2015. – 608 с. ISBN 5-8459-1028-5.
  9. Орлов С.А. Технологии разработки программного обеспечения: Учебник для вузов. ‑3-е издание. СПб.: Питер, 20164.
  10. Сафронов, И. Visual Basic в задачах и примерах [Текст] / И. Сафронов. – СПб. : БХВ-Петербург, 2015. - 400 с. - ISBN 5-94157-495-9.
  11. Фаронов, В. В. Turbo Pascal. Наиболее полное руководство [Текст] / В. В. Фарофонтов. – СПб. : Питер, 2017. – 763 с. - ISBN 5-89251-054-9.
  12. Фрост Р., Дей Дж., Ван К., Базы данных. Проектирование и разработка. М.: NT Пресс, 2016.
  13. Хорстманн, К. С., Корнелл, Г. Java 2. Библиотека профессионала [Текст] / К. С. Хорстман, Г. Корнелл. – М. : Вильямс, 2015. - 898 с. - ISBN 978-5-8459-0970-1.
  14. Шафрин Ю.А. Информационные технологии в 2ч. Ч.1: Основы информатики и информационных технологий / Шафрин Ю.А. – М.: БИНОМ. Лаборатория знаний, 2016. – 316 с.
  15. Шилдт, Г. Полный справочник по С++ [Текст] / Г. Шилдт. - М. : Вильямс, 2014. – 800 с. - ISBN 5-8459-0563-X.

Приложение А

Исходная программа

Текстовый редактор

Библиотеки

Компилятор

Редактор связей

Объектная программа

Исполняемый файл

Исходный код

Редактор ресурсов

Загрузчик

Ресурсы интерфейса

Компилятор ресурсов

Выполнение программы

Рисунок А.1 - Структура современной системы программирования