1. Главная страница » Компьютеры

Free pascal примеры программ

Автор: | 16.12.2019

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

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

Обратите внимание на то, что в таблице аргумент x задается в радианах. Хоте- лось бы написать более универсальную программу, которая выводит k строк по- добной таблицы, начиная с заданного значения x0. Приведенный выше фрагмент таблицы должен получиться при k=10 и x0=0.

Самый простой (и одновременно самый тупой) вариант тела программы может состоять из строк, представленных в листинге 2.1.

Листинг 2.1. Программа table1

program table1; var

В программе table1 использована единственная переменная с именем x, кото- рая может принимать вещественные значения с удвоенной точностью (тип double). Первый оператор writeln предназначен для вывода заголовка таблицы. Его три аргумента представлены строковыми константами, которые, в принципе, можно было бы объединить в одну строку. Затем переменной x присваивается начальное значение. Операция присваивания, образованная двумя символами :=, унаследова- на Паскалем от своего предшественника — языка АЛГОЛ-60. После этого 10 раз повторяется пара операторов, которая выводит на экран значения x, sin(x) и cos(x) и увеличивает значение переменной x на 0.1.

В поле редактора FPC IDE эта программа выглядела бы следующим образом

Рис. 2.1. Внешний вид первого варианта программы

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

Рис. 2.2. Окно для сохранения текста программы

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

readln, который приостановит работу программы до нажатия клавиши .

Результаты, выданные программой и приведенные на рис. 2.3, очень слабо на- поминают вид таблицы, указанной в задании. Во-первых, по умолчанию использо- ван так называемый "научный формат" записи вещественных чисел. Символ "E" означает, что число, расположенное слева, надо умножить на 10 в степени, распо- ложенной справа. Во-вторых, нам выдано слишком много значащих цифр.

Рис. 2.3. Выдача результатов программы table1.pas

С этим легко побороться — достаточно в операторе writeln после каждого вы- водимого значения указать его общую длину и количество цифр в дробной части:

Однако самая большая нелепость в первом варианте программы заключается в десятикратном повторении однотипных операций. Любой алгоритмический язык, и Free Pascal в том числе, предусматривает возможность циклического повторения таких действий. Этих способов не один, мы воспользуемся оператором цикла for. В результате второй вариант нашей программы будет выглядеть так, как представ- лено в листинге 2.2.

Листинг 2.2. Программа table2

program table2; var

for k:=1 to 10 do

Второй вариант программы выводит результаты в соответствии с заданием. Единственная небрежность — заголовок таблицы немного смещен относительно столбцов соответствующих значений (рис. 2.4).

Рис. 2.4. Усовершенствованный вывод

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

writeln(‘ x’,’ sin(x)’,’ cos(x)’);

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

Листинг 2.3. Программа table3

program table3; var

Обратите внимание на ввод числовых данных по запросу программы — в на- шем примере программа остановит свою работу на первом же операторе тела про- граммы и будет ждать завершения ввода значений k и x с клавиатуры. Между на- бираемыми значениями должен быть хотя бы один пробел. Внутри чисел пробелы

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

Натуральное число N называется простым, если оно имеет только два разных делите- ля — 1 и само себя. Примеры простых чисел — 2, 3, 5, 7, 11, 13, … Некоторые матема- тики считают, что 1 не является простым числом, т. к. имеет единственный делитель. Считать 1 составным числом тоже нет никакого резона. Задачей нашей следующей про- граммы является запрос у пользователя числа N и анализ его на простоту.

В математике известен достаточно сложный алгоритм такого анализа, требую- щий минимального числа операций. Но мы воспользуемся следующим алгоритмом, более затратным по времени, но более простым по реализации. Если число N — четное и не равно 2, то оно составное. Если N — нечетное, то будем делить его на последовательные нечетные числа (3, 5, 7, 9, 11, …, M, где M не превосходит N ) и анализировать остатки от деления. Первый же нулевой остаток свидетельствует о том, что N — составное число. Если все остатки будут отличны от 0, то N — про- стое.

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

Листинг 2.4. Программа prime1

msg1=’ is prime’; msg2=’ is not prime’;

if N 000 000 тому, кто докажет или опровергнет эту гипотезу. Приз пока не востребован. Задача нашей следующей программы — запро- сить четное число N и найти хотя бы одно его разложение на сумму двух простых чисел (то, что задача имеет не единственное решение, вытекает из конкретных примеров: 4 = 2 + 2 и 4 = 1 + 3).

Идея реализуемого алгоритма предельно проста. Пусть, например, N=a+b и a a[j] then

В этой программе появились новые типы данных. Во-первых, массив a, объяв- ляемый с помощью служебного слова array (массив), вслед за которым указывает- ся диапазон изменения индексов элементов массива (от 1 до 100) и их тип (integer). Во-вторых, для переменных i, j, N выбран тип byte, обеспечивающий хранение данных в диапазоне от 0 до 255. Элемент a[i] сравнивается со всеми ос- тальными — a[j]. Поэтому в цикле по i появился вложенный цикл по j. Наконец, для перестановки пары a[i] и a[j] понадобилось использовать временную пере- менную tmp. Соответствующий блок перестановки данных — достаточно широко используемый программистский прием.

Результат работы программы сортировки приведен на рис. 2.7.

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

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

Рис. 2.7. Сортировка числового массива

Листинг 2 .8 . Программа sort_nam

program sort_nam; var

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

for i:=1 to N-1 do

Теперь элементы массива a могут хранить строковые значения длиной до 20 сим- волов. Переменную tmp тоже пришлось объявить типа string [20].

Пример работы программы сортировки фамилий приведен на рис. 2.8.

Рис. 2.8. Сортировка фамилий

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

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

определить, является ли введенная фраза палиндромом. Один из наиболее цитируемых в литературе палиндромов — фраза "А роза упала на лапу Азора". Произношения ее при чтении слева направо и справа налево звучат одинаково. Естественно, что при этом не обращают внимания на разницу в больших и малых буквах и не учитывают располо- жение пробелов в строке и ее перевертыше.

Чтобы не усложнять алгоритм очередной программы, мы будем считать, что введенная фраза S1 набирается только малыми буквами. Первым нашим шагом должно стать удаление пробелов, мешающих решению задачи. Устранив пробелы и получив строку S2, мы сформируем строку S3, в которой символы следуют в об- ратном порядке. Если строки S2 и S3 окажутся равными, то введенная фраза явля- ется палиндромом.

Описанный выше алгоритм реализуется программой из листинга 2.9.

Листинг 2.9. Программа palindrome

program palindrome; var

S1,S2,S3: string; j,n: byte;

if S1[j] = ‘ ‘ then continue;

if S2=S3 then writeln(‘S1 – palindrome’) else writeln(‘S1 – not palindrome’);

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

строки по его номеру, например, S1[j] или S3[j]. Символы в строке нумеруются с 1, их можно читать или присваивать им новые значения. В цикле удаления пробе- лов важную роль играет оператор continue (продолжить), после которого продол- жение тела цикла обходится, но сам цикл продолжается. В этом же цикле исполь- зована операция конкатенации (от англ. concatenation — сцепка), обозначаемая знаком +. Ее действие сводится к присоединению второго операнда вслед за по- следним символом первого операнда. Еще одна деталь, на которую следует обра- тить внимание, связана с использованием полной формы условного оператора if… then… else (если… то… иначе). Оператор, расположенный справа от then, не должен завершаться точкой с запятой. Точка с запятой в Паскале считается при- знаком конца оператора, тогда как фрагмент else… является не самостоятельным оператором, а всего лишь продолжением предыдущего фрагмента.

Работа программы palindrome продемонстрирована на рис. 2.9.

Рис. 2.9. Анализ палиндромов

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

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

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

карт. Мы остановимся на самом примитивном способе, когда каждой карте колоды при- своен порядковый номер, например, от 1 до 36 или от 1 до 52.

Идея алгоритма базируется на использовании датчика случайных чисел. Пред- ставим себе, что в нашем распоряжении имеется физический (типа лототрона) или программно реализованный датчик случайных чисел из диапазона [1, N], где N равно 36 или 52. Первоначально наша колода напоминает фабричную упаковку карт, в которой все разложено по мастям и внутри каждой масти по возрастающим номиналам — 2, 3, 4, …, 10, валет, дама, король, туз. Это соответствует тому, что коды карт образуют последовательность натуральных чисел — 1, 2, 3, …, N. Обра- щаемся к датчику случайных чисел и получаем число k, принадлежащее диапазону [1..N]. Меняем местами первый элемент массива A[1] с элементом A[k]. Затем повторяем аналогичную операцию достаточно много раз, например 10 000. После этого первоначальный массив A окажется достаточно хорошо перемешанным. И если последовательность случайных чисел, выдаваемых генератором, окажется непред- сказуемой, то такой алгоритм можно взять на вооружение.

В арсенале стандартных функций языка Паскаль имеется функция random(M), которая при каждом новом обращении выдает очередной элемент последователь- ности равномерно распределенных случайных целых чисел из диапазона [0, M-1]. Ею мы и воспользуемся в новой программе (листинг 2.10).

Листинг 2.10. Программа mixer

program mixer; const

A: array [1..Nmax] of byte; j,k,tmp: byte;

for j:=1 to Nmax do

Обратите внимание на использование в программе константы Nmax. Если мы перейдем на колоду из 52 карт, то нам понадобится изменить единственную строч- ку в программе. Без константы Nmax такой переход потребовал бы изменения в че- тырех операторах.

Первый же запуск программы mixer приводит к вполне приличным результа- там (рис. 2.10). Каждое число из диапазона [1..36] представлено по одному разу (т. е. дублирующихся карт нет), да и об их порядке тоже ничего плохого сказать нельзя.

Рис. 2.10. Структура перетасованной колоды карт

Но второй запуск программы mixer приводит к тем же результатам. Такого по- втора в карточной игре терпеть нельзя. Игра с заранее известным порядком карт в колоде — это не игра. Причина кроется в работе системной функции random(). Ко- гда она вызывается в первый раз, то в ее теле присутствуют две начальные кон- станты, назовем их x и y. По вполне определенному алгоритму из них генерируется новое случайное число z. Перед тем как возвратить результат z, функция осущест- вляет пересылки y®x и z®y. Теперь становится понятным, что при повторном за- пуске программы функция random() начинает свою работу с тех же самых значе- ний x и y, и последовательность "случайных" чисел снова повторяется.

Для того чтобы "возмутить" начальное состояние программы random, использу-

ется процедура randomize, которая, применяя различные ухищрения, непредска- зуемым образом изменяет значения начальных констант x и y. Например, это мож- но сделать по текущему показанию системных часов, меняющих свое состояние каждую миллисекунду (листинг 2.11).

Листинг 2 .1 1 . М од иф ик а ция програ ммы mixer

program mixer; const

A: array [1..Nmax] of byte; k,tmp: byte;

j: integer; begin

for j:=1 to 10000 do

На рис. 2.11 приведены результаты пяти последовательных запусков модифи- цированной программы mixer. Теперь ее можно использовать при разработке кар- точных игр.

Рис. 2.11. Результаты работы модифицированной программы mixer

Источник: Кетков, Ю. Л., Свободное программное обеспечение. FREE PASCAL для студентов и школьников, Ю. Л. Кетков, А. Ю. Кетков. — СПб.: БХВ-Петербург, 2011. — 384 с.: ил. + CD-ROM — (ИиИКТ)

Любая программа на языке Pascal имеет следующую структуру:

// Раздел описания программы

program _1; // _1 – название программы

uses // Подключение модулей (например, CRT, Graph, Strings и др.)

const // Описание констант, определяемых на этапе компиляции

type // Описание пользовательских типов

var // Описание переменных

label // Описание меток

procedure …; // Описание подпрограмм – процедур и функций

function …;

Begin

// Тело программы (операторы)

End.

Программа подразделяется на 2 раздела:

Раздел описания (interface), где помещаются все данные, необходимые для правильной компиляции и организации взаимосвязей элементов программы.

Раздел реализации (implementation), где содержится непосредственно набор операторов для решения задачи по поставленному алгоритму.

Описание элементов программы.

program name; // name – имя программы, состоящее из [a..z, A..Z, 0..9, _]

Нельзя, чтобы имя программы начиналось с цифры.

После названия программы ставится точка с запятой (";").

uses CRT, Graph;

Pascal имеет в своем составе набор библиотечных модулей, в которых определены служебные функции, например, функции для работы с экраном и функции для математических вычислений. Для использования этих функций необходимо указать требуемый модуль в секции "uses". Названия модулей указываются через запятую.

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

Const

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

Константные выражения вычисляются компилятором без выполнения программы на этапе ее создания.

Type

T2 = record

end;

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

(_1, _2, _3) – перечисляемый

array[1..12] of String – структурированный

Секция type определяет типы, созданные пользователем. После определения каждого типа ставится точка с запятой.

Некоторые типы (например, Byte, Integer, String и др.) не разрешается переопределять.

Аналогично (как для const) определяется видимость секции type.

Var

X, X2, X3: Integer;

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

В Pascal применяется строгая типизация переменных.

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

Явное описание: A, B: TData;

Неявное описание: A, B: (_1, _2);

Аналогично (как для const и type) определяется видимость секции var.

Label

Секция label определяет метки для безусловного перехода. При выполнении оператора goto происходит переход на метку, имя которой описано как в секции label, так и в теле программы или подпрограммы.

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

procedure P1;

function P2: Integer;

function имя(параметры): возвр. значение // заголовок

раздел описания (const, type, var, label)

begin// тело

end;

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

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

Раздел реализации – набор операторов, решающий задачу по поставленному алгоритму. Этот раздел ограничивается ключевыми словами begin и end ("операторные скобки") и содержит непосредственно набор операторов для решения задачи.

После описания раздела реализации ставится ключевое слово end. с точкой.

3. Типы данных. Понятие "переменная" и "идентификатор".

Основные свойства концепции типов языка Pascal:

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

— Каждая операция или подпрограмма требует аргументов фиксированного типа и выдает результат фиксированного типа (строгая типизация).

Тип определяет:

— возможные значения констант, переменных, функций, выражений;

— внутреннюю форму представления данных в ЭВМ;

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

Все типы данных можно разделить на 4 основных класса:

скалярные: Значения не зависят от составных частей. Такие типы подразделяются на порядковые и вещественные.

порядковые: Значение элементов можно четко определить по количеству и порядку. Пример –

Byte, Integer, подинтервалы (1..31), перечисление и т.д. В свою очередь, порядковые

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

адресный, перечисляемый, интервальный.

вещественные: числа с точкой (фиксированной или плавающей).

структурированные: Такие типы представляют собой набор элементов скалярного либо структурированного типа. Пример – записи (record), массивы (array), множества (set), файлы (file).

объектные: Типы, определяющие совокупность данных и методы их обработки.

процедурные: Типы, определяющие набор операций, имеющих общий заголовок (типизированные указатели на процедуру/функцию).

Целые типы:

Название Размер Значения
Shortint -2 7 ..2 7 -1
Byte 0..2 8
Smallint -2 15 ..2 15 -1
Word 0..2 16
Longint -2 31 ..2 31 -1
LongWord 0..2 32
Int64 -2 63 ..2 63 -1
Integer varies -2 x — 1 ..2 x -1 -1
Cardinal varies 0..2 x

На 16-битных платформах тип Integer по размеру и значению совпадает с Smallint; на 32-битных – с Longint (т.е. размер Integer не гарантируется).

То же самое справедливо и для Cardinal (Word и LongWord соответственно).

Компилятор Free Pascal по умолчанию использует 16-битный вариант.

Логический тип – Boolean, имеет 2 возможных значения: False или True. (False ac, abc ,

Последнее изменение этой страницы: 2016-08-26; Нарушение авторского права страницы

Задание:

Ввести с клавиатуры n чисел. Определить количество четных.

Код программы:

Задание:

Дано четырехзначное число. Верно ли, что сумма первой и последней цифр равна сумме средних цифр?

Пример теста:

1234 — да: 1+4=2+3
7459 — нет: 7+9 ≠ 4+5

Код программы:

Задание:

Решение квадратного уравнения ax 2 +bx+c=0

Пример теста:

Код программы:

Задание:

При попадании в маленький круг (радиус = 1), игроку начисляется 2 балла, при попадании в большой круг (радиус 2) — 1 балл, мимо мишеней — 0 баллов.

Пример теста:

0.5; 0.6 — 2
-1.2; -1.3 — 1
2.6; 3 — 0

Код программы:

Задание:

Вычислить значение функции

Пример теста:

при x = 2, y = -4.441979

Код программы:

Задание:

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

Пример теста:

1 2 3 4
7 1 3 0
2 7 4 3
1 3 2 1

Читайте также:  Family tree картинки шаблоны

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *