Программирование на языке Pascal

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

Рубрика Программирование, компьютеры и кибернетика
Вид методичка
Язык русский
Дата добавления 06.11.2015
Размер файла 740,6 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

program Р24;

const с: array [1 .. 5] of integer = (36,54,72,18,15);

var x, у, i: integer;

function NOD (a, b: integer): integer; {заголовок функции}

begin

while a < > b do

if a > b then a: = a - b

else b: = b - a;

NOD: = а {результат работы функции присваивается ее имени}

end; {конец описания функции}

begin {начало главной программы}

x: = с [ 1 ];

for i: = 2 to 5 do

begin

y: = с [ i ];

x: = x * у div NOD (x, у) {вызов функции}

end;

write (` HOK = `.x)

end. {конец главной программы}

Методические указания по работе и задания

Условие задачи

1

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

2

Написать процедуру, которая выводит на экран строку, состоящую из звездочек. Длина строки (количество звездочек) является параметром функции.

3

Написать функцию, которая вычисляет значение аb.

4

Написать функцию вычисления факториала.

5

Написать функцию, которая сравнивает два целых числа и возвращает результат сравнения в виде одного из знаков: >,<,=.

6

Написать процедуру ввода элементов матрицы.

7

Написать процедуру ввода и вывода элементов матрицы.

8

Написать функцию, которая находит сумму цифр целого числа.

9

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

10

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

11

Составить программу разложения данного натурального числа на простые множители.(200= 23+52)

12

Дано четное число n>2. Проверить для него гипотезу Гольдбаха: каждое четное n представляется в виде суммы простых чисел.

13

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

14

Дано простое число. Составить функцию, которая будет находить следующее за ним простое число.

15

Дан прямоугольник со сторонами A и B, где А, В- натуральные числа. Начнем отсекать от него квадраты. Сколько квадратов можно отсечь, если каждый раз отсекается самый большой квадрат.

16

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

17

Составить программу разложения данного натурального числа на простые множители.(200= 23+52)

18

Дано четное число n>2. Проверить для него гипотезу Гольдбаха: каждое четное n представляется в виде суммы простых чисел.

19

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

20

Дано простое число. Составить функцию, которая будет находить следующее за ним простое число.

21

Дан прямоугольник со сторонами A и B, где А, В- натуральные числа. Начнем отсекать от него квадраты. Сколько квадратов можно отсечь, если каждый раз отсекается самый большой квадрат.

22

Написать процедуру, которая выводит на экран строку, состоящую из звездочек. Длина строки (количество звездочек) является параметром функции.

ВОПРОСЫ К ЗАЩИТЕ ЛАБОРАТОРНОЙ РАБОТЫ

1. Что такое подпрограмма и для чего она используется?

2. Объясните назначение локальных и глобальных переменных.

3. Как происходит обмен данными с процедурой без параметров?

4. Что такое формальные и фактические параметры?

5. К чему относится описание типа в конце заголовка подпрограммы-функции?

6. Чем отличается вызов функции от вызова процедуры?

7. Как задать значения элементов массива без использования оператора ввода?

Лабораторная работа №9

  • 7. Рекурсия
  • Цель работы: научиться решать задачи с использованием рекурсивных функций и процедур.
  • Краткие теоретические сведения.
  • Если поставить два зеркала напротив друг друга и между ними поместить предмет, то получится бесконечное множество изображении, причем каждое из них содержит свое собственное. Любое из этих изображений можно рассматривать как рекурсивный объект, который частично состоит или определяется с помощью самого себя. Рекурсивные объекты обладают несколькими свойствами: -- простотой построения;
  • -- несхожестью конечного результата с начальными данными;
  • -- внутренним самоподобием.
  • В математике встречаются рекурсивные определения, позволяющие описать объекты через самих себя. К таким определениям относится, например, определение натурального числа:
  • 1) единица есть натуральное число;
  • 2) число, следующее за натуральным (т. е. больше его на единицу), есть натуральное число.
  • Определение, которое задает некоторый объект в терминах более простого случая этого же объекта, называется рекурсивным определением.
  • Мощность рекурсивного определения заключается в том, что оно позволяет с помощью конечного высказывания определить бесконечное множество объектов. Как и цикл, рекурсивное определение содержит повторения, но каждый раз при этом используются новые данные, т. е. повторения не являются явными.
  • Рекурсия -- это способ описания функций или процессов через самих себя.
  • Процесс может быть описан некоторым алгоритмом, называемым в данном случае рекурсивным. В нем выделяется два этапа выполнения:
  • 1) "погружение" алгоритма в себя, т. е. применение определения "в обратную сторону", пока не будет найдено начальное определение, не являющееся рекурсивным;
  • 2) последовательное построение от начального определения до определения с введенным в алгоритм значением.

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

1. Наиболее распространенным рекурсивным определением является определение факториала (нерекурсивное вычисление факториала приведено в примере Р9): (a) 1! = 1, (b) n > 1, n: = n*(n - 1)!

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

program Р25;

var n, у: integer;

function F (x: integer): integer; {описание рекурсивной функции}

begin

if x=1

then F: = 1 {вызов для начального определения}

else F: = х * F (х - 1) {вызов для предыдущего определения}

end; {конец описания функции}

begin {начало главной программы}

readln (n);

Y: = F (n); {вызов функции в главной программе}

write (n, `! = `, Y)

end. {конец главной программы}

Выполним программу Р25 для n = 4. Рекурсивная функция будет работать следующим образом (при вызове функции значение n присваивается переменной х). Сначала осуществляется "погружение", работает оператор ветви else условного оператора:

1-й шаг: х = 4, х-1 = 3, выполняется промежуточное вычисление 4! = 4 * З!

2-й шаг: х = 3, х-1 = 2, выполняется промежуточное вычисление З! = 3 * 2!

3-й шаг: х = 2, х-1 = 1, выполняется промежуточное вычисление 2! = 2 * 1!

4-й шаг (последний): 1! = 1 по начальному определению, работает оператор F: = 1 ветви then условного оператора.

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

5-й шаг: 2! = 2 * 1 = 2

6-й шаг: З! = 3 * 2 = 6

7-й шаг: 4! = 4 * 6 = 24 -- получен результат, он возвращается в главную программу и присваивается переменной Y.

2. Вычисление степени с натуральным показателем можно определить рекурсивно:

x 0 = 1

(b) k > 0: xk = x* xk - 1

Этому определению соответствует рекурсивная функция power (k, x). Программа имеет вид:

program Р26;

var у: real; n: Integer;

function power (k: integer; x: real): real; {описание рекурсивной функции} begin

if k=0

then power: = 1

{начальное определение}

else power: = x * power (k - 1, x) {рекурсивное определение}

end; {конец описания функции}

begin {начало главной программы}

write (` основание степени х = `);

readln (у);

write (`показатель степени k = `);

readln (n);

write (`х в степени k', power(n, у)) {вызов функции и печать результата} end. {конец главной программы}

3. Вычисление чисел Фибоначчи. Итальянский математик Фибоначчи придумал последовательность натуральных чисел: 1, 1, 2, 3, 5, 8, 13, ... . Первые два члена последовательности равны единице, а каждый, начиная с третьего, равен сумме двух предыдущих. Для чисел Фибоначчи верно соотношение:

Fk = Fk + Fk-2

Рекурсивная функция получения значения n-го числа Фибоначчи имеет вид:

function Fib (n: integer): integer;

begin

if k<3

then Fib: = 1

else Fib: = Fib (n - 1) + Fib (n - 2)

end;

Для чисел Фибоначчи используется следующее рекурсивное определение:

(a)n= 1, n=2: fib(n) = 1

(b) n > 2: fib (n) = fib (n - 2) + fib (n - 1)

Для того чтобы определить fib (6), применяя данное рекурсивное определение, надо вычислить:

fib (6) = fib(4) + fib(5) = fib(2) + fib(3) + fib (5) = 1 + fib(3) + fib(5) =

= 1 + fib(l) + fib(2) + fib(5) = 1 + 1 + 1 + fib(5) = 3 + fib(3) + fib(4) =

= 3 + fib(l) + fib (2) + fib(4) = 3 + 1 + 1 + fib(4) = 5 + fib(2) + fib(3) =

= 5 + 1 + fib(l) + fib(2) = = 6+1+1=8

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

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

Эта задача связана с легендой о том, что в одном из восточных храмов находится бронзовая плита с тремя алмазными стержнями. На один из них при сотворении мира нанизали 64 диска из чистого золота так, как показано на рисунке 7. Жрецы должны переносить диски с одного стержня на другой, следуя следующим законам:

1) диски можно перемещать только по одному;

2) нельзя класть больший диск на меньший.

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

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

Рис. 7. Ханойские башни

следуя приведенным выше правилам переноса дисков.

Алгоритм на естественном языке имеет вид:

1) если n = 0, остановиться;

2) переместить верхние п - 1 дисков со стержня А на стержень В, используя стержень С как вспомогательный;

3) переместить оставшийся диск со стержня А на стержень С;

4) переместить п - 1 дисков со стержня В на стержень С, используя стержень А как вспомогательный.

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

program Р27;

var k: integer;

procedure Hanoy (n: integer; One, Two, Three: char);

begin

if n > 0 then

begin

Hanoy (n - 1, One, Three, Two);

write (` переместить диск', n, `со стержня `, One, `на стержень `, Two);

Hanoy (n - 1, Two, One, Three)

end;

end;

begin

write (`введите количество дисков');

readln (k):

Hanoy (k,'А','В','С')

end.

Результат работы программы для n = 3 -- это инструкция из 7 пунктов (п = 4 -- инструкция из 15 пунктов):

переместить диск 1 со стержня А на стержень С

переместить диск 2 со стержня А на стержень В

переместить диск 1 со стержня С на стержень В

переместить диск 3 со стержня А на стержень С

переместить диск 1 со стержня В на стержень А

переместить диск 2 со стержня В на стержень С

переместить диск 1 со стержня А на стержень С

Методические указания по работе и задания

Условие задачи

1

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

2

Найти сумму цифр заданного натурального числа.

3

Найти количество цифр в заданном натуральном числе.

4

Составить программу вычисления суммы четных факториалов. (n-четное, n10)

5

Описать рекурсивную логическую функцию Simm(S,I,J), проверяющую, является ли симметричной часть строки S, начинающаяся i-м и заканчивающаяся j-м ее элементом.

6

Составить программу вычисления суммы нечетных факториалов. (n-четное, n10)

7

Составить программу сортировки массива целых чисел.

8

Составить программу вычисления НОД двух натуральных чисел.

9

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

10

Составить программу перевода данного натурального числа в р-ичную систему счисления( 2р9)

11

Дан прямоугольник со сторонами A и B, где А,В- натуральные числа. Начнем отсекать от него квадраты. Сколько квадратов можно отсечь, если каждый раз отсекается самый большой квадрат.

12

Поиска значений в упорядоченном списке.

13

Найти сумму 1/1+1/2+1/3+1/4+…+1/n,основываясь на рекурсии.(сумма k слагаемых равна сумме (k-1) слагаемых плюс k-е слагаемое).

14

Напишите главную программу для вычисления n-го числа Фибоначчи. Почему использовать рекурсивный алгоритм вычисления n-го числа Фибоначчи невыгодно?

15

Определите рекурсивно умножение как сложение и деление как вычитание и оформите алгоритмы в виде рекурсивных функций с вызовом из главных программ.

16

Составить программу сортировки массива целых чисел.

17

Составить программу вычисления НОД двух натуральных чисел.

18

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

19

Составить программу перевода данного натурального числа в р-ичную систему счисления( 2р9)

20

Дан прямоугольник со сторонами A и B, где А,В- натуральные числа. Начнем отсекать от него квадраты. Сколько квадратов можно отсечь, если каждый раз отсекается самый большой квадрат.

21

Поиска значений в упорядоченном списке.

22

Найти сумму 1/1+1/2+1/3+1/4+…+1/n,основываясь на рекурсии.(сумма k слагаемых равна сумме (k-1) слагаемых плюс k-е слагаемое).

ВОПРОСЫ К ЗАЩИТЕ ЛАБОРАТОРНОЙ РАБОТЫ

1. Что такое рекурсивный объект и каковы его свойства?

2. Приведите примеры рекурсивного определения в математике.

3. Что такое рекурсия?

4. Как выполняется рекурсивный алгоритм?

5. Поясните выполнения рекурсивной функции вычисления степени с натуральным показателем.

Лабораторная работа №10

  • 8. Обработка строк в Паскале
  • Цель работы: приобрести навыки в решении задач, обрабатывающих символьные данные и усвоить функции обработки символьных данных.
  • Краткие теоретические сведения.
  • В памяти компьютера могут храниться числа и символы. Любой символ занимает один байт памяти. Для данного, соответствующего одиночному символу, используется описатель char. Символы могут объединяться в массивы. Каждому элементу массива, как и числовому данному, соответствует порядковый номер, а имя элемента состоит из имени всего массива и его собственного номера. В тексте программы не всегда можно определить, какой массив обрабатывается: числовой или символьный, это можно понять только по описанию массива. Значение символьного данного -- любой символ клавиатуры компьютера, ограниченный апострофами. Например: `А', `?', `5' -- значения символьных величин. Примеры описаний:

var a: array [ 1.. 50 ] of char; x, y: char;

Массив а может состоять из 50 символов, ему отводится при трансляции программы 50 байтов памяти. Элементы массива: a[1], а[2], ..., а[50]. Переменные х и у -- простые, их значения -- одиночные символы. Для ввода символьного массива необходимо использовать цикл:

for i: = 1 to n do read (a[ i ]);

При вводе такого массива достаточно набрать строку из п символов и в конце нажать <Enter>.

Можно объявить в описании таблицу символов и для ее ввода использовать двойной цикл:

const n = 10; m = 15;

var b: array [ 1..n, 1:m ] of char; i, j: integer;

begin

for i: = 1 to n do

begin

for j: = 1 to m do

read (b [ i,j ]);

writeln

end;

end.

В примере используется b -- таблица из 10 строк по 15 символов каждая. При ее вводе необходимо набирать строки по 15 символов и нажимать <Enter>. Неудобство такого ввода заключается в том, что все строки должны содержать по 15 символов, т. е. если набираются слова, то в них не может быть более чем 15 букв, а в коротких словах надо добавлять пробелы.

При обработке символьных массивов используются такие же алгоритмы, как и для числовых. Например, требуется слово, заданное как массив символов, записать в обратном порядке, т. е. справа налево. При разработке алгоритма можно использовать такую постановку задачи: данный числовой массив переписать так, чтобы последний элемент встал на первое место, предпоследний на второе и т. д., а первый -- на последнее. Другими словами, необходимо из массива а1, а2, ..., аn, получить аn, аn-1, ..., а1 ,который будет находиться в массиве b (рис.8).

На рисунке 8 в рамке обведена формула пересчета индекса: когда у массива а номера перечисляются в прямом порядке, т. е. текущий индекс элемента массива изменяется от 1 до n, у элементов массива b индексы должны меняться от n до 1.

Рис. 8. Перемещение элементов из массива а в массив b и пересчет индексов

Такое изменение и обеспечивает данная формула, она приведена для индексов массива b. Программа Р32 производит перемещение элементов в обратном порядке, для символьных данных она называется программой обращения слова:

program Р28;

const n = 15;

var a, b: array [ 1.. n ] of char; i: integer;

begin

for i: = 1 to n do

begin

read (a [ i ]);

b [n-i+1]:= a[i]

end;

for i: = 1 to n do

write (b [ i ])

end.

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

Строка -- это ограниченная апострофами последовательность любых символов.

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

Описание строки имеет вид:

var х: string [ 20 ];

Строка х должна быть не более чем из 20 символов. Если она меньше, то будет занимать в памяти столько байтов, сколько знаков она содержит (плюс 1 байт -- длина). Поэтому при вводе строк нет необходимости дополнять их до указанной в описании длины.

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

Объединение строк. Эта операция позволяет объединить две строки в одну, присоединив начало второй строки к концу первой. Объединение обозначается знаком "+". Например:

var x, у, 2: string [ 10 ];

begin:

x: = `тепло';

у: = `ход';

z: = х + у;

write (z)

end.

Переменным х и у присваиваются значения строк, а переменной z - результат объединения этих строк в одну: `теплоход'. При печати строки будет выдано содержимое области памяти, называемой z.

Очевидно, что операция объединения строк некоммутативная, т. е. для нее

а+b < > b+а,

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

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

Сравнение строк. Для строк используются такие же операции отношения, как и для чисел, но они имеют несколько другой смысл. Если строки сравнивать на "равно" (=), то выполнение равенства означает посимвольное совпадение строк. Соответственно "не равно" (<>) означает несовпадение хотя бы в одном знаке. Остальные отношения (<, , , >) относятся к длинам строк, т. е. сравниваются не символы строк, а их количества. Если записать:

`а' < `b' + `с',

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

Присваивание. Оператор присваивания для строковых данных имеет вид:

Имя_строковой _переменной: = строковое выражение;

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

var x: string [ 6 ];

begin

х: = `мим' + `озабоченный';

write (x)

end.

В результате работы этой программы будет напечатано слово "мимоза". Поэтому допустимая длина x - 6 символов, значение выражения справа от присваивания "мимозабоченный" сократится до "мимоза", остальные символы будут отброшены.

Длина строки. Функция длины строки выдает количество символов строки:

length (строковое_выражение)

Например: program Р29;

var х, у: string [ 20 ]; k, I, n: integer;

begin

writeln (`введите две строки');

readln(x); readln(y);

k: = length (x); I: = length (y); n: = length (x + y);

writeln (`длина первой строки': 25, `длина второй строки': 25);

writeln (k: 25, I: 25);

writeln (x + у, `длина строки', n)

end.

В программе Р29 используется вывод с форматированием результата. Первый раз формат (: 25) указан после строки, выводимой на экран (`длина первой строки'). Это означает, что для данной строки отводится 25 позиций экрана, а поскольку выводимый текст короче (20 символов), он дополнится вначале пробелами, т. е. окажется правоустановленным в отведенном ему поле. Аналогично расположатся в предназначенном для них месте экрана целые числа -- длины строк. Таким образом, результат работы программы будет иметь вид:

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

7 10

С помощью форматирования можно располагать выводимые данные в столбцах, строить на экране дисплея таблицы.

Копирование строки или ее части. Функция копирования называется также "вырезкой". Она позволяет скопировать одну область памяти в другую. Для копирования необходимо указать строковое выражение, из значения которого выделяется часть, а также начальный номер символа и количество символов копируемой части:

copy (строковое выражение, начальный номер символа, количество символов)

Например, результатом работы функции

copy (`информатика', 3, 5)

будет слово `форма'.

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

program Р30;

var x, у: string [10 ]; i: integer;

begin

write (`введите слово');

readln(x);

y: = "; {присваивание результату начального значения --пустого слова}

for i: = 1 to length (x) do

у: = copy (x, i, 1) + у; {присоединение копируемой буквы слева}

writeln;

write (у)

end.

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

роs (подстрока, исходная строка)

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

insert (вставляемая строка, исходная строка, целочисленное выражение);

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

delete (строка, начальный номер, количество символов);

Рассмотрим пример замены буквы в слове. Сделаем из слова "форма" слово "фирма".

program Р31;

var x: string [10];

begin

x: = `форма';

insert (`и', x, 2); {вставка буквы "и", получилось слово "фиорма"}

delete (x, 3, 1); {удаление третьей буквы -- буквы "о"}

write (x)

end.

Методические указания по работе и задания

Условие задачи

1

Удалить из строки заданное слово.

2

Дана строка символов до точки. Подсчитать сколько слов содержит данная строка.

3

Дана строка символов до точки. Определить длину самого длинного и самого короткого слова в ней.

4

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

5

Определить сколько слов содержит хотя бы одну букву "а" в заданной строке.

6

Определить является ли введенная строка правильным скобочным выражением (рассматривать только круглые скобки)

7

Вывести на экран задом наперед данную строку символов.

8

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

9

Подсчитать количество слов в строке заканчивающейся точкой.

10

Определите, является ли данное слово палиндромом ("перевертышем", например, "казак", "потоп", "кок" и т. д.).

11

Дана строка с несколькими запятыми. Получите слово между первой и второй запятыми. Решите задачу с применением массива символов и строки символов.

12

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

13

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

14

Составьте программу циклической перестановки букв слова Х..

15

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

16

Удалить из строки заданное слово.

17

Дана строка символов до точки. Подсчитать сколько слов содержит данная строка.

18

Дана строка символов до точки. Определить длину самого длинного и самого короткого слова в ней.

19

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

20

Определите, является ли данное слово палиндромом ("перевертышем", например, "казак", "потоп", "кок" и т. д.).

21

Дана строка с несколькими запятыми. Получите слово между первой и второй запятыми. Решите задачу с применением массива символов и строки символов.

22

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

ВОПРОСЫ К ЗАЩИТЕ ЛАБОРАТОРНОЙ РАБОТЫ

1. Чем отличается символьный тип данных от строковых?

2.Перечислите специальные функции для обработки символьных данных.

Лабораторная работа №11

  • 9. Компьютерная графика
  • Цель работы: приобрести навыки использования графического режима, закрепить знание графических операторов, научиться строить графики и диаграммы.
  • Краткие теоретические сведения.
  • Для построения изображения на экране дисплея используется специальная библиотека подпрограмм, называемая Graph. В нее входят графические процедуры и функции для выдачи различных по форме фигур и линий, а также средства организации графического режима. Эти средства предназначены для анализа возможностей используемого дисплея -- разбиения поля экрана на различное число мелких квадратиков, каждый из которых считается отдельной точкой изображения и называется пикселем. Для дисплея типа VGA число точек может быть 640 * 480, а количество используемых цветов -- 16. Однако более сложные, не рассматриваемые здесь средства Паскаля позволяют увеличить количество цветов до 256. Цвет, как и координаты экранной точки, задается целым числом. Начало координат экрана находится в левом верхнем углу (точка 0,0), ось Ох направлена вправо, Оу -- вниз (рис.9).
  • Рис. 9. Система координат экрана дисплея
  • Эту особенность направленности оси Оу следует учитывать при построении изображений, особенно графиков функций и диаграмм. Для построенной
  • Рис. 10.
  • Установление соответствия между точками отрезка [а, b] и осью Ох экрана дисплея
  • на рисунке 9 окружности необходимо отмечать координаты центра и радиус, для прямоугольника -- координаты противоположных вершин (например, А и D). Координаты точки А (180, 160) заданы на рисунке. Каждое изображение можно также построить по точкам, указав для каждой точки ее координаты и цвет.
  • При построении изображений используются так называемые графические примитивы -- базовые конструкции и их модификации. К графическим примитивам относятся: точка, отрезок, дуга.
  • Точка. Для выдачи точки на экран используется вызов процедуры

PutPixel (x, у, номер_цвета); где x, у -- координаты точки.

С помощью этого оператора можно построить график функции.

Построение графика функции. Чтобы построить график, необходимо сначала задать отрезок области определения, на котором функция существует, и отобразить этот отрезок на ось Ох экрана дисплея. Точке х отрезка [а, b] из области определения функции должна соответствовать точка х экрана дисплея, а точке у = f(x) -- значению функции -- точка у1 экрана (рис. 10). Таким образом происходит масштабирование графика, что дает возможность отображать на экран любой отрезок области определения. Здесь, безусловно, надо учитывать разрешающую возможность экрана, чтобы масштаб позволил увидеть качественное поведение функции. Точки на экране, в отличие от точек геометрической прямой, имеют дискретные значения. Точки оси Ох нумеруются от 0 до 640, т. е. х1 = 0, 1,2,3, ...,640.

Из пропорции

(х -- а) / (b -- а) = 1 -- 0) / (640 -- 0)

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

: х = а + х1 * (b - а) / xmax

где хтax = 640, если дисплей типа VGA. Для найденного значения аргумента вычисляется значение функции: y=f(x)

Теперь необходимо умножить полученное значение функции на коэффициент масштабирования, показывающий, сколько пикселов (физических точек экрана) содержится в выбранной единице масштаба: k = xmax / (b - а)

Получаем значение у -- координату для выдачи рассчитанной точки графика функции на экран

: у1 = у * xmax / (b - а)

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

у1 = уmax / 2 - у1

С координатами х1 и у1 точка выводится на экран. Поскольку реальные координаты графика функции, по которым она вычисляется, вещественные числа, а координаты точек экрана -- целые, то результат, полученный при использовании в программе формулы для вычисления у1, необходимо округлить до ближайшего целого числа. Округление производит функция trunc. аргумент которой -- выражение вещественного типа: у1: = trunc (у * xmax / (b - а)).

Программа построения графических изображений должна начинаться с оператора подключения библиотеки графических процедур и специальной библиотеки, позволяющей использовать функции операционной системы (библиотеки Crt). Этот оператор располагается сразу за заголовком программы и имеет вид: uses Graph, Crt;

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

repeat until keypressed; {выполнять пустой цикл до нажатия любой клавиши}

Программа построения графика функции у = sin (х) на отрезке [--, ]:

program Р33;

uses Graph, Crt;

procedure Init; {установка графического режима}

var gr, gm: Integer;

begin

gr: = 0; {автоматическое распознавание типа дисплея}

InitGraph (gr, gm, ` `); {файл egavga.bgi находится в одном каталоге с turbo.ехе}

if GraphResult <> grOk then Halt (1); {обработка результата установки}

end;

function f (х: real): real; {вычисление функции f (х)}

begin

f: = sin (х)

end;

procedure grafic;

var xmax, ymax, х1, у1: integer; х, y, a, Ь: real;

begin

xmax: = 640; ymax: = 480; a: = - 3.14; b: = 3.14;

for х1: = 0 to xmax do

begin

х: = a + х1 * (b - a) / xmax;

y: = f (х); {вызов подпрограммы-функции}

у1: = trunc (y * xmax / (b - a));

у1: = ymax div 2 - у1;

PutPixel (х1, у1, 2); {выдача точки зеленым цветом}

end

end;

begin {главная программа}

Init; {вызов процедуры установки графического режима}

Grafic; {вызов процедуры построения графика функции}

repeat until keypressed

end.

0

15

0

15

15

0

15

0

15

15

15

0

Рис. 11.

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

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

SetColor (цвет);

На рисунке 12 приведена таблица цветов, где каждый цвет может быть задан как номером, так и словом (на английском).

Отрезок. Для построения отрезка необходимо указать координаты его концов. Отрезок строится текущим цветом. Оператор построения отрезка:

Line(x1,y1,x2,y2);

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

черный

синий

зеленый

Бирюзовый

0

1

2

3

красный

малиновый

коричневый

серый-с

4

5

6

7

серый-т

голубой

зеленый-с

Бирюзовый-с

8

9

10

11

красный-с

малиновый-с

желтый

Белый

12

13

14

15

Рис. 12. Номера цветов (с-- светлый, т -- темный)

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

Оператор построения отрезка с указанием смещения: LineRel (dx, dy);

Оператор построения отрезка с указанием последней его точки: LineTo (x, у);

Размещено на http://www.allbest.ru/

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

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

MoveRel (dx, dy);

MoveTo (x, у);

Прямоугольник строится подобно отрезку: необходимо указать координаты концов любой диагонали. Прямоугольник может быть построен в виде контура или в виде закрашенной фигуры. Для контурного изображения - оператор Rectangle (x1, у1, х2, у2); для закрашенного Ваг(х1,у1,х2,у2);

Построение столбчатой диаграммы. На рисунке 13 представлена столбчатая (линейная) диаграмма падения успеваемости некоторого учащегося по четвертям учебного года. В первой четверти успеваемость составила 75%, во второй -- 50%, в третьей -- 25%. Построим такую диаграмму с помощью программы, расположив самый высокий столбец в центральной части экрана

(его длина -- 480 : 3 = 160 пикселов) и рассчитав остальные пропорционально их значениям относительно этого размера. По ширине вся диаграмма занимает также 1/3 часть, т. е. первоначальное значение координаты х равно 210 пикселов, ширина столбцов по 35 и расстояние между ними также 35 пикселов. Для расчета высоты второго столбца составим пропорцию 75 : 50 = 160 : х. Отсюда х = 106 (с округлением до целого). Высота третьего столбца 53 пик-

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

Размещение текста на изображении производится с по мощью оператора:

OutTextXY (х, у, `текст');

где х, у -- координаты, начиная с которых будет выдан текст.

Программа построения столбчатой диаграммы имеет такую же структуру, как и программа РЗЗ.

program Р34;

uses Graph, Crt;

procedure Init; {установка графического режима}

var gr, gm: integer;

begin

gr: = 0; {автоматическое распознавание типа дисплея}

InitGraph (gr, gm, ` `); {файл egavga.bgi находится в одном каталоге с turbo.ехе}

if GraphResult <> grOk then Halt(1); {обработка результата установки} end;

procedure Diagram 1;

var х, у, х1, y1, x2, y2: integer;

begin

SetColor (14); Bar (210,160, 245, 320);

SetColor (10); Bar (210 + 2*35, 320 -106, 210 + 3-35, 320);

SetColor (2); Bar (210 + 4*35, 320 - 53, 210 + 5-35, 320);

OutTextXY(210, 320 + 30, `Успеваемость по четвертям');

end;

begin

Init;

Diagram 1; repeat until keypressed

end.

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

Arc (х, у, начальный_угол, конечный_угол, радиус);

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

PieSlice (х, у, начальный_угол, конечный_угол, радиус);

Если указать значения углов соответственно 0 и 359, то получится окружность или закрашенный текущим цветом круг. Окружность можно также изобразить оператором:

Circle (х, у, г);

Рассмотрим пример построения "рога изобилия", состоящего из окружностей. Центры окружностей перемещаются по окружности, представляющей собой траекторию точки, одна координата которой задается косинусом, а другая -- синусом одного и того же угла x1/k. При k = 20 получается замкнутый круг, k = 10 -- два круга, k = 30 -- полукруг.

program Р35;

uses Graph, Crt;

procedure Init; {установка графического режима}

var gr, gm: integer;

begin

gr: = 0; {автоматическое распознавание типа дисплея}

InitGraph (gr, gm, ` `); {файл egavga.bgi находится в одном каталоге с turbo.ехе}

if GraphResult <> grOk then Halt(1); {обработка результата установки} end;

procedure Rog;

var xmax, ymax, х1, y1, х, у, r: integer;

begin

xmax: = 640; ymax: = 480;

for x1: = 1 to 125 do

begin

x: = trunc (xmax / 2 + ymax / 2 * cos (x1/20));

y: = trunc (ymax / 2 + xmax / 4 * sin (x1/20));

r: = trunc (ymax / 4 - x1);

Circle (x, y, r)

Размещено на http://www.allbest.ru/

end

end;

begin

Init; Rog; repeat until keypressed

end

Построение круговой диаграммы

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

Программа имеет вид:

program Р38;

uses Graph, Crt;

procedure Init; {установка графического режима}

var gr, gm: integer;

begin

gr: == 0; {автоматическое распознавание типа дисплея}

InitGraph (gr, gm, ` `); {файл egavga.bgi находится в одном каталоге с turbo.exe}

if GraphResult <> grOk then Halt(1); {обработка результата установки} end;

procedure Diagram2;

var xmax, ymax, x1, y1, x, y, r: integer;

begin

xmax: = 640; ymax: = 480;

x: = 320; у: = 240; r: = 200; {координаты центра и радиус диаграммы}

x1: = trunc (75 * 36 / 15); {расчет длины первой дуги}

SetColor (14); PieSlice (x, у, 0, x1, r);

y1: = trunc (50'36/ 15) +x1;

SetColor (10); PieSlice (x, у, x1+1, y1, r); {вторая дуга + + первая}

SetColor (2); PieSlice (x, y, y1 +1, 359, r); {замыкание круга}

end;

begin

Init;

Diagram2;

repeat until keypressed

end.

Методические указания по работе и задания

Условие задачи

1

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

2

Написать программу, которая выводит на экран оцифрованную координатную сетку.

3

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

4

Написать программу, которая рисует окружность движущуюся по экрану.

5

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

6

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

7

Постройте концентрические окружности, закрасив каждую новым цветом.

8

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

9

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

10

С помощью программы построения графика функции постройте графики logx, tgx, cosx на различных участках областей определения этих функций.

11

Построить график функции cos x и при построения графика функции добавьте выдачу на экран координатных осей и отметку на них единицы измерения.

12

Написать программу, которая выводит на экран точечный график функции y=0,5x2+4x-3. Диапазон изменения аргумента - от -15 до 5, шаг аргумента - 0,1. График вывести на фоне координатных осей, точка пересечения которых должна находится в центре экрана.

13

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

14

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

15

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

16

Построить график функции cos x и при построения графика функции добавьте выдачу на экран координатных осей и отметку на них единицы измерения.

17

Написать программу, которая выводит на экран точечный график функции y=0,5x2+4x-3. Диапазон изменения аргумента - от -15 до 5, шаг аргумента - 0,1. График вывести на фоне координатных осей, точка пересечения которых должна находится в центре экрана.

18

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

19

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

20

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

21

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

22

Написать программу, которая рисует окружность движущуюся по экрану.

ВОПРОСЫ К ЗАЩИТЕ ЛАБОРАТОРНОЙ РАБОТЫ

1. Как расположены оси координат на экране дисплея?

2. Что такое графические примитивы?

3. Как закрасить один пиксел экрана?

4. Как отобразить отрезок [a,b] на всю ширину экрана?

5. Сколько пикселов будет содержать единица измерения на отображаемом на экране отрезке [а, b]?

6. Как расположить график на экране с учетом направленности оси Оу в противоположную от традиционного направления сторону?

7. Какого типа данные соответствуют экранным координатам?

8. В какой библиотеке Паскаля содержатся графические подпрограммы и как подключить эту библиотеку при выполнении программы?

9. Как задержать изображение на экране после полного его построения?


Подобные документы

  • Система программирования Турбо Паскаль. Главные особенности языка С++. Составной и условный оператор в Паскале, алгоритм работы. Метка в Турбо Паскале. Счетный оператор цикла FOR. Описание логической структуры. Свойства функции PieSlice и initgraph.

    курсовая работа [20,8 K], добавлен 23.12.2010

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

    контрольная работа [30,8 K], добавлен 25.12.2010

  • Структура программы в Турбо Паскале и определение переменной в ней. Понятие идентификатора и его основные ограничения. Операторы присваивания в языке программирования. Процедура ввода-вывода информации. Способы описания массива, обработка его элементов.

    контрольная работа [134,5 K], добавлен 28.09.2012

  • Международный стандарт на язык программирования Паскаль. Приемы объектно-ориентированного программирования в Турбо Паскале. Символы языка, его алфавит. Этапы разработки программы. Понятие алгоритмов и алгоритмизации. Структура программ на Паскале.

    курсовая работа [29,8 K], добавлен 28.02.2010

  • Программирование на языке Паскаль: алфавит, решение задач, простейшие программы, разветвляющие программы, циклические программы, ввод-вывод, массивы, подпрограммы, строковые данные, записи, файлы, использование библиотеки CRT, графика в Паскале.

    учебное пособие [211,1 K], добавлен 30.03.2008

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

    лекция [55,7 K], добавлен 21.05.2009

  • Алгоритмы, алфавит языка, структура программы, написанной на Турбо Паскале. Целые, вещественные, логические, символьные типы данных, их совместимость. Линейные алгоритмы, пустой и составной операторы, простейший ввод и вывод, разветвляющиеся алгоритмы.

    курсовая работа [49,8 K], добавлен 03.11.2009

  • Особенности программирования на языке Паскаль в среде Турбо Паскаль. Линейные алгоритмы, процедуры и функции. Структура данных: массивы, строки, записи. Модульное программирование, прямая и косвенная рекурсия. Бинарный поиск, организация списков.

    отчет по практике [913,8 K], добавлен 21.07.2012

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

    презентация [187,9 K], добавлен 02.04.2014

  • Основные сведения о языке программирования Pascal. Листинг программы с комментариями. Диагональ элементов вектора и матрицы. Использование команд ввода-вывода информации. Быстродействие выполнения программы при компиляции. Отражение процессов вычисления.

    курсовая работа [1,9 M], добавлен 05.05.2009

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.