sga-help.ru

Все вопросы к тесту (html) Компьютерный практикум



Программирование алгоритмов линейной структуры на языке Pascal ABC.

Паскаль-программа является текстовым файлом с собственным именем и расширением .pas. Программа на Паскале состоит из двух частей: описательной части и операторной части. Программа может начинаться с заголовка, состоящего из служебного слова Program и имени, имеющего синтаксис идентификатора. Операторная часть начинается служебным словом Begin, а заканчивается программа служебным словом End. После этого оператора ставится точка.

Синтаксис:


Program <Имя программы>;

<Описательная часть>

Begin

<Операторная часть>

End.

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

Хороший стиль программирования предполагает использование комментариев в программе. Комментарии записываются в фигурных скобках и могут содержать любые символы. Вместо фигурных скобок могут использоваться символы (* и *). Например:

{Это комментарий}

(*Это тоже комментарий*)

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

Пример:

Read(x, y, z);

ReadLn(a, b, c);

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

Рассмотрим эту разницу на примере. При выполнении следующего фрагмента программы

Read(a, b);

Read(c);

и при вводе данных

4 5 1

переменной а присвоится значение 4, переменной b — 5, а переменной с — 1. В случае же фрагмента

ReadLn(a, b);

ReadLn(c);

при вводе данных таким же образом, переменной а присвоится значение 4, переменной b — 5. После этого ожидается ввод значения с на новой строке. Значение 1 будет проигнорировано.

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

Пример:

Write(‘Корень уравнения= ', X);

Writeln(‘Сумма =’,Sum,’ Среднее значение=’,Sum/n);

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

WriteLn(X:n:m);

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

Для вывода целых чисел можно использовать формат:

WriteLn(a:n);

В этом случае выводимое значение будет выравниваться по правому краю поля шириной в n символов.

Отличие WriteLn от Write состоит в том, что после вывода всех значений, перечисленных в скобках, производится переход на следующую строку.

Главное окно интегрированной среды PascalABC имеет следующий вид:

Программа записывается в окне редактора, которое открывается при запуске или с помощью команды Файл – Новый (можно воспользоваться функциональными клавишами Ctrl-N).

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

W
rite
и
Write
L
n
, а также для вывода сообщений об ошибках и предупреждений во время работы программы. Окно вывода может быть скрыто. Клавиша F5 показывает/скрывает окно вывода. Для скрытия окна вывода используется также клавиша Esc. Окно вывода обязательно открывается при любом выводе в него. Для очистки окна вывода следует нажать комбинацию клавиш Ctrl-Del.

Окно ввода открывается при выполнении процедур

Read
и
Read
L
n
в ходе работы программы:

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

Для запуска программы в текущем окне редактора следует нажать клавишу F9 или кнопку панели инструментов.

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

Выполнение программы можно в любой момент прервать нажатием комбинации клавиш Ctrl-F2 или кнопки . При этом в окне вывода появится сообщение "Программа прервана пользователем".

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

<Переменная>:=<Выражение>;

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

Пример:

S := (a + b+ c)/3;

L := (S>0) OR (P<100);

В этом примере S и соответствующее выражение в правой части имеют вещественный тип, а L и соответствующее выражение в правой части — логический тип.

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

Пусть необходимо записать оператор присваивания для выражения:

Оператор присваивания:

F := (x*x + 2 * y – SQR(COS(x)))/(y * y + SQRT(2 * x * x + 1))

Еще один пример:

Оператор присваивания:

k := EXP(x+y)/(2*x+3*y)*SQR(SIN(x*x*x))

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



Вариант

1. Составить программу, определяющую функцию h

при заданных значениях x и y. При выводе округлите результаты до двух знаков после запятой.

2. Составить программу, определяющую объем и площадь боковой поверхности цилиндра с заданным радиусом основания r=4 и высотой h=6. При выводе округлите результаты до двух знаков после запятой.

Примечание: V=pr2h; S=2prh; p=3.14

Объем цилиндра равен (разделитель – точка)

Площадь боковой поверхности цилиндра равна (разделитель – точка)

При x=3, y=5 значение h равно (разделитель – точка)

При x=3, y=5 значение k равно (разделитель – точка)

При x=3, y=5 значение l равно (разделитель – точка)



Вариант

1. Составить программу, определяющую функцию r

при заданных значениях x и y. При выводе округлите результаты до двух знаков после запятой.

2. 1 верста = 500 саженей; 1 сажень = 3 аршина; 1 аршин = 16 вершков; 1 вершок = 44,45 мм. Длина некоторого отрезка составляет 5000 метров. Составить программу, которая переводит ее в русскую неметрическую систему - версты. При выводе округлите результат до двух знаков после запятой.

Длина отрезка в верстах равна (разделитель – точка)

При x=3.02, y=6.05 значение r равно (разделитель – точка)

При x=3.02, y=6.05 значение s равно (разделитель – точка)

При x=3.02, y=6.05 значение t равно (разделитель – точка)



Вариант

1. Составить программу, определяющую функцию t

при заданных значениях x и y. При выводе округлите результаты до двух знаков после запятой.

2. Составить программу, вычисляющую расстояние между двумя точками (1,2) и (10,15). При выводе округлите результат до двух знаков после запятой.

Примечание:

При x=7.4, y=3.1 значение t равно (разделитель – точка)

При x=7.4, y=3.1 значение u равно (разделитель – точка)

При x=7.4, y=3.1 значение v равно (разделитель – точка)

Расстояние между двумя точками (разделитель – точка)



Вариант

1. Составить программу, определяющую функцию u

при заданных значениях x и y. При выводе округлите результаты до двух знаков после запятой.

2. В равнобедренном прямоугольном треугольнике известна высота h=3.94, опущенная на гипотенузу. Составить программу, определяющую стороны треугольника. При выводе округлите результаты до двух знаков после запятой.

Примечание: Гипотенуза = 2h; 2a2=4h2; a=hÖ2

Гипотенуза треугольника равна (разделитель – точка)

Катеты треугольника равны (разделитель – точка)

При x=3.8, y=2.7 значение u равно (разделитель – точка)

При x=3.8, y=2.7 значение v равно (разделитель – точка)

При x=3.8, y=2.7 значение w равно (разделитель – точка)



Вариант

1. Составить программу, определяющую функцию v

при заданных значениях x и y. При выводе округлите результаты до двух знаков после запятой.

2. Заданы действительная и мнимая части комплексного числа Z = X + I Y; X=3.4; Y=4.6. Составить программу, преобразующую его в тригонометрическую форму в виде выражения: Z = r(cos j + i sin j). При выводе округлите результаты до двух знаков после запятой.

Примечание:

В тригонометрической форме записи заданного комплексного числа j равно (разделитель – точка)

В тригонометрической форме записи заданного комплексного числа r равно (разделитель – точка)

При x=1.9, y=1.8 значение a равно (разделитель – точка)

При x=1.9, y=1.8 значение v равно (разделитель – точка)

При x=1.9, y=1.8 значение w равно (разделитель – точка)



Задание: Программирование алгоритмов линейной структуры на языке Паскаль

Схема алгоритма:

программа на Паскале в этом случае может иметь следующий вид:

Program Circle; {начало программы}

Const {описание констант}

pi=3.14159;

Var {описание переменных}

r,l,s:Real; {r-радиус окружности, l-длина окружности}

{s-площадь круга}

Begin {начало операторной части}

Write('Введите радиус: '); ReadLn(r); {вывод подсказки ввода, ввод радиуса}

l:=2*pi*r; {вычисление длины окружности}

s:=pi*r*r; {вычисление площади круга}

WriteLn('Длина окружности=',l:8:4); {вывод результатов}

WriteLn('Площадь круга=',s:8:4);

End. {конец программы}

1. Запустите программу PascalABC.

2. Введите текст программы.

3. Запустите программу на выполнение:

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

Какого роста цен за год можно ожидать, если правительство гарантирует, что инфляция в новом году составит р%?

Если за каждый месяц цены возрастут в 1 + р/100 раз, то за год рост цен составит (1+р/100)12 раз или прирост в процентах:

Поясним формулу. За один месяц цены возрастут на р/100 и составят 1 + р/100. Для того чтобы сократить изложение, обозначим эту величину за Х:

Х = 1 + р/100

Единица — это условная цена единица товара. В следующем месяце цены возрастут на тот же процент, но уже от имеющихся цен на остаток месяца: Х* р/100. Цены будут иметь значение Х + Х * р/100 или Х*(1 + р/100).

Х*(1 + р.100) = Х2

В следующем (третьем месяце) цены будут иметь значение: Х2 + Х2*р/100 = Х2*(1+р/100) = Х3

И так далее. В конце 12-го месяца года цена единицы товара будет равна Х12 или(1 + р/100)12. Очевидно, что рост цены будет равен (1 + р/100)12 – 1.

Чтобы получить прирост в процентах, необходимо умножить на 100%.

Схема алгоритма:

Программа на Паскале в этом случае может иметь следующий вид:

Program Procent; {Заголовок программы}

Var a,p,s: Real; {Описание переменных}

{p - процент инфляции в месяц,

a - кратность роста цен, S - рост цен за год в процентах}

Begin {Начало операторной части}

Write('Введите процент месячной инфляции: '); ReadLn(p);

{Вывод подсказки ввода. Ввод переменной р}

a := Power(1+p/100,12);

S := (a - 1) * 100;

WriteLn('Годовой прирост цен составит ', a:10:2, ' раз или ', S:10:2, ' процентов');

{Процедура вывода}

End.

1. Выполните команду Файл – Новый.

2. Введите текст программы.

3. Запустите программу на выполнение:



1178.02.01;ЭПТ2.01;1

Цель:

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

Результаты обучения:

После успешного завершения занятия пользователь должен:

· уметь вводить программу в среде PascalABC;

· уметь компилировать программу и запускать на выполнение;

· записывать операторы присваивания в соответствии с правилами языка Паскаль;

· организовывать ввод и вывод информации в программе.

Список рекомендуемой литературы:

  • Бурменский А.Д. Гринкруг Л.С. Ильина С.В. Тарануха Н.А. Обучение программированию: Язык Pascal: Учебное пособие. – М.: СОЛОН-Пресс, 2009.
  • Потопахин В.В. Turbo Pascal решение сложных задач. – СПб.: БХВ-Петербург, 2006.
  • Моргун А.Н.. Программирование на языке Паскаль (Pascal). Основы обработки структур данных. – М.: Диалектика, 2005.
  • Попов В. Паскаль и Дельфи. Самоучитель. – СПб.: Питер, 2004.

Используемые программы:

PascalABC

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



Тестирование

В языке Паскаль математической записи соответствует выражение

В языке Паскаль операторы отделяются друг от друга

Синтаксис оператора присваивания в языке Паскаль:

Стандартными процедурами ввода данных в языке Паскаль являются:

Число знаков после запятой при выводе переменной X с помощью процедуры WriteLn(X:8:3) равно




Вариант

  • Даны две точки A(x1,y1) и B(x2,y2). Составить программу, определяющую, которая из точек находится ближе к началу координат.

Примечание:

  • Дано натуральное число M. Если оно делится на 7, вывести на экран ответ M=7k (где k – соответствующее частное); если остаток от деления на 7 равен 1, вывести M=7k+1; если остаток от деления на 7 равен 2, вывести M=7k+2; если остаток от деления на 7 равен 3, вывести M=7k+3 и т.д. Например, 14=7*2 или 30=7*4+2. Составить программу с использованием оператора Case…Of.

Даны две точки A(381,-497) и B(-457,390). Которая из точек (A или B) находится ближе к началу координат?

Даны две точки A(461,352) и B(-571,-295). Которая из точек (A или B) находится ближе к началу координат?

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

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



Вариант

  • Даны три числа. Составить программу, которая возводит в квадрат те из них, значения которых неотрицательны, и находит произведение полученных чисел.
  • Дано натуральное число Z. Составить программу, определяющую значение Y. Если Z делится на 6, Y=Z; если остаток от деления Z на 6 равен 1, Y=Z2; если остаток от деления Z на 6 равен 2, Y=Z3; если остаток от деления Z на 6 равен 3, Y=Z-3; если остаток от деления Z на 6 равен 4, Y=Z-2; если остаток от деления Z на 6 равен 5, Y=Z-1. Написать программу с использованием оператора Case…Of.

Во втором задании при Z=67 Y равно

Во втором задании при Z=841 Y равно

Даны три числа: -96; 56; 4. После возведения в квадрат неотрицательных чисел произведение чисел будет равно

Даны три числа: 71; -169; 5. После возведения в квадрат неотрицательных чисел произведение чисел будет равно



Вариант

  • Заданы три натуральных числа. Составить программу, определяющую, является ли среднее арифметическое этих чисел целым числом.
  • Дано натуральное число X. Составить программу, определяющую значение Y. Если X делится на 5, Y=X-5; если остаток от деления X на 5 равен 1, Y=X-4; если остаток от деления X на 5 равен 2, Y=X-4; если остаток от деления X на 5 равен 3, Y=X-4; если остаток от деления X на 5 равен 4, Y=X-1. Написать программу с использованием оператора Case…Of. При выводе округлите результат до четырех знаков после запятой.

Во втором задании при X=68 Y равно (разделитель – точка)

Во втором задании при X=79 Y равно

Является ли среднее арифметическое чисел 674, 352 и 894 целым числом (да/нет)?

Является ли среднее арифметическое чисел 891, 893 и 894 целым числом (да/нет)?



Вариант

  • Составить программу для вычисления функции: . При выводе округлите результат до двух знаков после запятой.
  • Дано натуральное число X. Если оно делится на 7, вывести на экран «воскресенье»; если остаток от деления на 7 равен 1, вывести «понедельник»; если остаток от деления на 7 равен 2, вывести «вторник»; если остаток от деления на 7 равен 3, вывести «среда»; если остаток от деления на 7 равен 4, вывести «четверг»; если остаток от деления на 7 равен 5, вывести «пятница»; если остаток от деления на 7 равен 6, вывести «суббота». Составить программу с использованием оператора Case…Of.

Значение функции при x=1.5 равно (разделитель – точка)
Значение функции при x=7.1 равно (разделитель – точка)

Результатом работы программы, составленной для второго задания, при X=895 будет



Вариант

  • Составить программу, определяющую, пройдет ли график функции y=ax2+bx+c через заданную точку с координатами (m,n).
  • Дано натуральное число N. Если оно делится на 4, вывести на экран ответ N=4k (где k – соответствующее частное); если остаток от деления на 4 равен 1, вывести N=4k+1; если остаток от деления на 4 равен 2, вывести N=4k+2; если остаток от деления на 4 равен 3, вывести N=4k+3. Например, 12=4*3 или 22=4*5+2. Составить программу с использованием оператора Case…Of.

Пройдет ли график функции y=-80x2+76x+59 через точку с координатами (23,78) – (да/нет)?

Пройдет ли график функции y=9x2-80x+60 через точку с координатами (6,-96) – (да/нет)?

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

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



Программирование алгоритмов разветвляющейся структуры на языке Pascal ABC.

Алгоритм решения задачи, как правило, представляет собой совокупность стандартных алгоритмических структур. Одной из таких структур является развилка (полная и неполная). Разветвление применяется, когда в зависимости от условия нужно выполнить либо одно, либо другое действие.

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

Условный оператор:

If <логическое выражение> Then <Действие 1> Else <Действие 2>;

Если логическое выражение имеет значение True, то выполняется <Действие 1>. Если логическое выражение имеет значение False, то выполняется <Действие 2>.

Под обозначением <Действие 1> и <Действие 2> понимается один любой оператор языка. Если в зависимости от условия потребуется выполнить несколько операторов, то такие операторы нужно заключить в операторные скобки Begin и End. В Паскале любая последовательность операторов, находящаяся между словами Begin и End, считается одним оператором, называемым составным оператором.

Условный оператор может использоваться без части Else. В этом случае реализуется структура «развилка неполная».

If <логическое выражение> Then <Действие>;

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

Пример записи оператора If:

If a<c Then m:=c Else m:=a;

If x<y Then min:=x;

If d<0 Then

Write(‘Корней нет’)

Else

Begin

x1:=(-b+sqrt(d))/(2*a);

x2:=(-b-sqrt(d))/(2*a);

End;

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

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

В программах такая структура реализуется с помощью оператора Case … Of.

Синтаксис оператора:

Case <Выражение порядкового типа> Of

<список констант 1> : <оператор 1>;

<список констант 2> : <оператор 2>;

…

<список констант N> : <оператор N>;

Else <Оператор>;

End;

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

Пример записи оператора Case:

Case Ch Of

‘+’ : Z := X + Y;

‘-’ : Z := X - Y;

‘*’ : Z := X * Y;

‘/’ : Z := X / Y;

Else

Stop := True;

End;

Переменная Ch имеет символьный тип. «Список выбора» организуют символьные константы ‘+’, ‘-‘, ‘*’, ‘/’. Часть Else может быть опущена.



Программирование алгоритмов разветвляющейся структуры на языке Паскаль

Пример 1.

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

Даны числа X, Y, Z. Определить, что больше: сумма этих чисел или их произведение.

Схема алгоритма:

Программа на Паскале в этом случае может иметь следующий вид:

Program Comparat;

Var x,y,z,S,P:Real;

Begin

Write('Введите X: '); Readln(x); {Ввод исходной информации}

Write('Введите Y: '); Readln(y);

Write('Введите Z: '); Readln(z);

S:=x+y+z;

P:=x*y*z;

If S > P Then WriteLn('Сумма больше, чем произведение X, Y, Z')

{Оператор, исполняемый в случае,

если логическое выражение имеет значение True}

Else WriteLn('Произведение больше или равно сумме X, Y, Z');

{Оператор, исполняемый в случае,

если логическое выражение имеет значение False}

End.

Результат работы программы:

Пример 2.

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

Даны два числа X и Y. Вычислить квадратные корни данных чисел, если оба значения больше нуля, и оставить числа без изменения, если это не так.

Схема алгоритма:

Программа на Паскале в этом случае может иметь следующий вид:

Program XY;

Var x,y:Real;

Begin

Write('Введите x и y: '); Readln(x,y);

If (x>0) and (y>0) Then Begin {Если лог. выражение имеет значение True,

то выполняется составной оператор}

X := Sqrt(x);

Y := Sqrt(y);

End; {Условный оператор закончился}

Writeln('x=', x, ', y=', y);

End.

Результат работы программы:

Пример 1.

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

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

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

Program W;

Var number:Integer;

Begin

Write('Введите номер дня недели: '); ReadLn(number);

Case number of

1: WriteLn('понедельник');

2: WriteLn('вторник');

3: WriteLn('среда');

4: WriteLn('четверг');

5: WriteLn('пятница');

6: WriteLn('суббота');

7: WriteLn('воскресенье');

else WriteLn('недопустимое значение');

End;

End.

Результат работы программы:

Пример 2.

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

Дано натуральное число n<101, определяющее возраст человека (в годах). Дать для этого числа подпись «год», «года» или «лет». Например, 1 год, 23 года, 45 лет.

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

Program Vzr;

Var n: 1..100;

Begin

Write('Введите возраст (в годах от 1 до 100): '); ReadLn(n);

If n In [11..14] Then WriteLn(n:2,' лет') Else

Case n mod 10 Of

1: WriteLn(n:2, ' год');

2..4: WriteLn(n:2, ' года');

0,5,9: WriteLn(n:2, ' лет');

End;

End.

Результат работы программы:



1178.02.01;ЭПТ2.02;1

Цель:

изучение процесса построения алгоритмов разветвляющейся структуры; программирование разветвляющихся алгоритмов с помощью оператора If…Then…Else и оператора Case…Of; изучение составного оператора Begin…End.

Результаты обучения:

После успешного завершения занятия пользователь должен:

· уметь составлять алгоритмы разветвляющейся структуры;

· знать синтаксис операторов If…Then…Else и Case…Of;

· уметь записывать алгоритмы разветвляющейся структуры на языке Турбо Паскаль;

· уметь использовать составной оператор Begin … End.

Список рекомендуемой литературы:

  • Бурменский А.Д. Гринкруг Л.С. Ильина С.В. Тарануха Н.А. Обучение программированию: Язык Pascal: Учебное пособие. – М.: СОЛОН-Пресс, 2009.
  • Потопахин В.В. Turbo Pascal решение сложных задач. – СПб.: БХВ-Петербург, 2006.
  • Моргун А.Н.. Программирование на языке Паскаль (Pascal). Основы обработки структур данных. – М.: Диалектика, 2005.
  • Попов В. Паскаль и Дельфи. Самоучитель. – СПб.: Питер, 2004.

Используемые программы:

PascalABC

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



Тестирование

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

В операторе Case…Of список констант отделяется от соответствующего оператора с помощью

В языке Паскаль математической записи соответствует оператор

Операторы If и Case могут использоваться без части

Синтаксис условного оператора в языке Паскаль:




Вариант

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

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

Значение при n=15 (разделитель – точка)
Значение при n=4 (разделитель – точка)
Значения функции на отрезке с шагом 0,1 (результаты введите через запятую без пробелов (разделитель в числе – точка))



Вариант

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

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

Значение при n=23 (разделитель – точка)
Значение при n=62 (разделитель – точка)
Значения функции на отрезке с шагом 0,1 (результаты введите через запятую без пробелов (разделитель – точка))



Вариант

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

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

Значение при n=16 (разделитель – точка)
Значение при n=42 (разделитель – точка)
Значения функции на отрезке с шагом 0,1 (результаты введите через запятую без пробелов, разделитель в числе – точка))



Вариант

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

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

Значение при n=28 (разделитель – точка)
Значение при n=46 (разделитель – точка)
Значения функции на отрезке с шагом 1 (результаты введите через запятую без пробелов (разделитель в числе– точка))



Вариант

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

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

Значение при n=5 (разделитель – точка)
Значение при n=8 (разделитель – точка)
Значения функции на отрезке с шагом 1 (результаты введите через запятую без пробелов (разделитель в числе – точка))



Программирование алгоритмов циклической структуры на языке Pascal ABC. Простые циклы

Синтаксис оператора цикла с предусловием:

While <логическое выражение> Do <оператор>;

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

Синтаксис оператора цикла с постусловием:

Repeat <последовательность операторов> Until <логическое выражение>;

Тело цикла расположено между служебными словами Repeat и Until. Это любая последовательность операторов языка. Операторы выполняются в цикле до тех пор, пока логическое выражение имеет значение False. Как только выражение примет значение True, цикл закончит свою работу и осуществится переход к выполнению следующего оператора, расположенного после оператора цикла.

Синтаксис оператора цикла с параметром:

For <идентификатор> := <выражение1> To <выражение2> Do <оператор>;

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

For <идентификатор> := <выражение1> Downto <выражение2> Do <оператор>;

В этом случае шаг изменения параметра равен – 1.

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

Цикл — типичная структура, характерная для программ, реализуемых на ЭВМ. Возможны три способа организации циклических структур алгоритмов:

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

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

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



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

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

Вычислить сумму квадратов первых N чисел натурального ряда.

Схема алгоритма:

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

Программа на Паскале в этом случае может иметь следующий вид:

Program Summa;

Var i, n, Sum: integer;

Begin

Write('n= '); Readln(n);

Sum := 0; {Начальное обнуление суммы}

For i := 1 To n Do

Sum := Sum + i*i;

{Тело цикла - оператор присваивания для накопления суммы}

Writeln('Сумма= ',Sum);

End.

Результат работы программы:

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

Написать программу табулирования функции Y = x – sin x – 0.25.

Схема алгоритма:

Программа на Паскале в этом случае может иметь следующий вид:

Program Tabl1;

Var x, xn, xk, dx, y: Real;

{x - текущее значение аргумента}

{xn - начальное значение аргумента}

{xk - конечное значение аргумента}

{dx - шаг изменения аргумента}

{y - значение функции}

Begin

Write('Начальное значение аргумента: '); Readln(xn);

Write('Конечное значение аргумента: '); Readln(xk);

Write('Шаг изменения аргумента: '); Readln(dx);

Writeln('======================');

Writeln(' X Y');

x := xn; {Присвоили начальное значение аргументу}

While x<= xk Do {Цикл выполняется до тех пор, пока выполняется условие}

Begin {В цикле выполняется один составной оператор}

y := x - sin (x) - 0.25; {Рассчитали значение функции}

Writeln ( x:8:2, y:10:2); {Вывели результат на экран}

x := x + dx; {Текущее значение аргумента увеличили на шаг}

End; {Конец тела цикла}

Writeln('======================');

End.

Результат работы программы:

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

Написать программу табулирования функции Y = x – sin x – 0.25.

Схема алгоритма:

Программа на Паскале в этом случае может иметь следующий вид:

Program Tabl2;

Var x, xn, xk, dx, y: Real;

Begin

Write('Начальное значение аргумента '); Readln(xn);

Write('Конечное значение аргумента '); Readln(xk);

Write('Шаг изменения аргумента '); Readln(dx);

Writeln('======================');

Writeln(' X Y');

x := xn; {Присвоили начальное значение аргументу}

Repeat

{Начало тела цикла}

Y := x - sin (x) - 0.25; {Рассчитали значение функции}

Writeln ( x:8:2, y:10:2); {Вывели результат на экран}

X := x + dx; {Текущее значение аргумента увеличили на шаг}

{Конец тела цикла}

Until x>xk; {Проверка условия окончания цикла}

Writeln('======================');

End.

Результат работы программы:



1178.02.01;ЭПТ2.03;1

Цель:

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

Результаты обучения:

После успешного завершения занятия пользователь должен:

· уметь составлять алгоритмы циклической структуры;

· знать синтаксис операторов Repeat … Until, While … Do, For … To … Do;

· уметь использовать эти операторы при организации циклов в программах.

Список рекомендуемой литературы:

  • Бурменский А.Д. Гринкруг Л.С. Ильина С.В. Тарануха Н.А. Обучение программированию: Язык Pascal: Учебное пособие. – М.: СОЛОН-Пресс, 2009.
  • Потопахин В.В. Turbo Pascal решение сложных задач. – СПб.: БХВ-Петербург, 2006.
  • Моргун А.Н.. Программирование на языке Паскаль (Pascal). Основы обработки структур данных. – М.: Диалектика, 2005.
  • Попов В. Паскаль и Дельфи. Самоучитель. – СПб.: Питер, 2004.

Используемые программы:

PascalABC

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



Тестирование

Заранее известно число повторений в цикле с

Из перечисленного возможны три способа организации циклических структур алгоритмов:

Оператор цикла с предусловием (While <логическое выражение> Do <оператор>;) выполняется до тех пор, пока логическое выражение имеет значение

Повторяющаяся последовательность действий – это тело ___

Укажите соответствие между оператором цикла языка программирования Паскаль и его синтаксисом




Вариант

1. Составить программу вычисления суммы бесконечного ряда с точностью e=10-3. При выводе округлите результат до двух знаков после запятой.

2. Составить программу, определяющую первое значение функции , меньшее а, если k = 1, 2, 3, …. При выводе округлите результат до трех знаков после запятой.

Наименьший номер последовательности, для которого значение функции меньше 0,01, если k = 1, 2, 3, … (разделитель в числе – точка)
Первое значение функции , меньшее 0,01, если k = 1, 2, 3, … (разделитель в числе – точка)
Сумма бесконечного ряда при x=0,9 (разделитель в числе – точка)
Число шагов, необходимых для расчета суммы бесконечного ряда с точностью e=10-3 при x=0,9 (разделитель в числе – точка)



Вариант

1. Составить программу вычисления суммы бесконечного ряда с точностью e=10-3. При выводе округлите результат до двух знаков после запятой.

2. Составить программу, определяющую первое значение функции , меньшее а, если k = 1, 2, 3, …. При выводе округлите результат до трех знаков после запятой.

Наименьший номер последовательности, для которого значение функции меньше 0,01, если k = 1, 2, 3, … (разделитель в числе – точка)
Первое значение функции, меньшее 0,01, если k = 1, 2, 3, … (разделитель в числе – точка)
Сумма бесконечного ряда при x=0,5 (разделитель в числе – точка)
Число шагов, необходимых для расчета суммы бесконечного ряда с точностью e=10-3 при x=0,5 (разделитель в числе – точка)



Вариант

1. Составить программу вычисления суммы бесконечного ряда с точностью e=10-3. При выводе округлите результат до двух знаков после запятой.

2. Составить программу, определяющую первое значение функции 1/x+1/x2+1/x3+1/x4 + … , большее a. При выводе округлите результат до двух знаков после запятой.

Наименьший номер последовательности, для которого значение функции 1/x+1/x2+1/x3+1/x4 + … больше 10, при x=0,9 (разделитель в числе – точка)

Первое значение функции 1/x+1/x2+1/x3+1/x4 + …, большее 10, при x=0,9 (разделитель в числе – точка)

Сумма бесконечного ряда при x=0,8
Число шагов, необходимых для расчета суммы бесконечного ряда с точностью e=10-3 при x=0,8 (разделитель в числе – точка)



Вариант

1. Составить программу вычисления суммы бесконечного ряда с точностью e=10-3. При выводе округлите результат до двух знаков после запятой.

2. Составить программу, определяющую среди чисел 1+1/2, 1+1/2+1/3, 1+1/2+1/3+1/4,… первое большее а. При выводе округлите результат до двух знаков после запятой.

Наименьший номер последовательности 1+1/2, 1+1/2+1/3, 1+1/2+1/3+1/4,…, значение которого больше 4 (разделитель в числе – точка)

Среди чисел 1+1/2, 1+1/2+1/3, 1+1/2+1/3+1/4,… - первое число, большее 4 (разделитель в числе – точка)

Сумма бесконечного ряда (разделитель в числе – точка)
Число шагов, необходимых для расчета суммы бесконечного ряда с точностью e=10-3 (разделитель в числе – точка)



Вариант

1. Составить программу вычисления суммы бесконечного ряда с точностью e=10-3. При выводе округлите результат до одного знака после запятой.

2. Составить программу, определяющую первое значение функции z = xk / k, большее а, если k = 1, 2, 3, …. При выводе округлите результат до одного знака после запятой.

Наименьший номер последовательности, для которого значение функции z = xk / k больше 5000, если k = 1, 2, 3, …, x=3

Первое значение функции z = xk / k, большее 5000, если k = 1, 2, 3, … при x=3 (разделитель в числе – точка)

Сумма бесконечного ряда (разделитель в числе – точка)
Число шагов, необходимых для расчета суммы бесконечного ряда с точностью e=10-3 (разделитель в числе – точка)



Программирование итерационных алгоритмов на языке Паскаль

Если для организации цикла в задаче вычисления экспоненты с заданной точностью использовать оператор цикла For, то необходимо организовать принудительный выход из цикла. Принудительный выход из цикла в программе на Паскале можно организовать, используя оператор перехода Goto. Предельное значение параметра цикла будет определяться лимитом числа повторений тела цикла. Как только выполнится условие |U| £ e, следует выйти из цикла.

Схема алгоритма:

Программа на Паскале в этом случае может иметь следующий вид:

Program Iteration;

Var x, Eps, S, U: Real; n: Integer;

Const Limit = 100;

Label M1, M2; {Метки должны быть описаны}

Begin

Write('Аргумент x= '); Readln(x);

Write('Погрешность Eps= '); Readln(Eps);

S := 1;

U := 1;

For n := 1 To Limit Do

Begin

U := x / n * U;

S := S + U;

If (abs(U) <= Eps) Then Goto M1; {Выход из цикла}

End;

{Цикл доработал до конца}

Writeln(n, ' шагов не хватило для достижения заданной точности');

Goto M2;

M1: Writeln('Расчетное значение= ', S:10:2, ' число шагов= ',n);

M2: End.

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

Результат работы программы:

Программа вычисления экспоненты с заданной точностью

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

Рассчитать экспоненту с точностью e путем разложения ее в ряд: + …

При построении алгоритма примем следующие обозначения:

S — искомая сумма, U — текущее слагаемое получаемое рекуррентно, n — определяет число шагов и используется для расчета факториала в знаменателе слагаемого.

Схема алгоритма:

Программа на Паскале в этом случае может иметь следующий вид:

Program Iteration;

Var x, Eps, S, U: Real; n: Integer;

Const Limit = 100; {Предельное значение шагов задано константой}

Begin

Write('Аргумент x= '); Readln(x);

Write('Погрешность Eps= '); Readln(Eps);

S := 1; {Частичная сумма}

U := 1; {Первое слагаемое}

n := 1; {Число шагов}

Repeat

U := x / n * U;

S := S + U;

N := n + 1;

Until (abs(U) <= Eps) Or (n >= Limit);

If n>= Limit

Then Writeln(n, ' шагов не хватило для достижения заданной точности')

Else Writeln('Расчетное значение= ', S:10:2, ' число шагов= ',n);

End.

Результат работы программы:



Программирование алгоритмов циклической структуры на языке Pascal ABC. Итерационные алгоритмы

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

Goto <Метка>;

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

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

Рассмотрим пример. Необходимо рассчитать экспоненту с точностью e путем разложения ее в ряд:

+ …

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

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

При построении таких алгоритмов полезно подстраховаться от зацикливания («вечного цикла»). Зацикливания могут возникнуть из–за ошибок в программе или вследствие накопления погрешностей. Чтобы избежать зацикливания, достаточно поставить лимит числа повторений цикла.



1178.02.01;ЭПТ2.04;1

Цель:

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

Результаты обучения:

После успешного завершения занятия пользователь должен:

· уметь составлять схемы итерационных алгоритмов;

· знать, что такое рекуррентная формула и как она может быть использована в алгоритмах;

· уметь программировать итерационные алгоритмы на языке Паскаль;

· изучить оператор передачи управления Goto.

Список рекомендуемой литературы:

  • Бурменский А.Д. Гринкруг Л.С. Ильина С.В. Тарануха Н.А. Обучение программированию: Язык Pascal: Учебное пособие. – М.: СОЛОН-Пресс, 2009.
  • Потопахин В.В. Turbo Pascal решение сложных задач. – СПб.: БХВ-Петербург, 2006.
  • Моргун А.Н.. Программирование на языке Паскаль (Pascal). Основы обработки структур данных. – М.: Диалектика, 2005.
  • Попов В. Паскаль и Дельфи. Самоучитель. – СПб.: Питер, 2004.

Используемые программы:

PascalABC

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



Тестирование

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

Повторение последовательности операторов с проверкой условия в начале каждого прохода цикла называется ___

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

Укажите соответствие между оператором цикла языка программирования Паскаль и его синтаксисом

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




Вариант

1. Даны n и k. Подсчитать сумму . При выводе округлите результат до двух знаков после запятой.

2. Найти такие первые значения i и j , при которых сумма станет больше 15.

Первое значение i, при котором сумма станет больше 15, равно
Первое значение j, при котором сумма станет больше 15, равно
Сумма при n=20, k=30 равна (разделитель – точка)
Сумма при n=45, k=65 равна (разделитель – точка)



Вариант

1. Даны n и m. Подсчитать сумму . При выводе округлите результат до двух знаков после запятой.

2. Найти такие первые значения i и j , при которых сумма станет больше 1000.

Первое значение i, при котором сумма станет больше 1000, равно (разделитель – точка)
Первое значение j, при котором сумма станет больше 1000, равно (разделитель – точка)
Сумма при n=20, m=30 равна (разделитель – точка)
Сумма при n=45, m=65 равна (разделитель – точка)



Вариант

1. Даны n и m. Подсчитать сумму . При выводе округлите результат до двух знаков после запятой.

2. Найти такие первые значения i и j , при которых сумма станет больше 1000.

Первое значение i, при котором сумма станет больше 1000, равно (разделитель – точка)
Первое значение j, при котором сумма станет больше 1000, равно (разделитель – точка)
Сумма при n=20, m=30 равна (разделитель – точка)
Сумма при n=45, m=65 равна (разделитель – точка)



Вариант

1. Даны n, m, x. Подсчитать сумму . При выводе округлите результат до двух знаков после запятой.

2. Найти такие первые значения i и j , при которых сумма станет меньше

(–1.5).

Первое значение i, при котором сумма станет меньше (–1.5) для x=15, равно (разделитель – точка)
Первое значение j, при котором сумма станет меньше (–1.5) для x=15, равно
Сумма при n=20, m=30, x=10 равна (разделитель – точка)
Сумма при n=45, m=65, x=15 равна (разделитель – точка)



Вариант

1. Даны n, m. Подсчитать сумму . При выводе округлите результат до двух знаков после запятой.

2. Вывести значения переменных k и L, при которых сумма становится больше 100.

Первое значение L, при котором сумма станет больше 100, равно
Первое значение k, при котором сумма станет больше 100, равно
Сумма при n=20, m=30 равна (разделитель – точка)
Сумма при n=45, m=65 равна (разделитель – точка)



Теоретическая часть

Организовать выход из цикла можно, воспользовавшись оператором безусловного перехода Goto. Для передачи управления чаще используются стандартные процедуры Exit, Halt, Break, Continue.

Процедура Exit осуществляет выход из блока (цикла или подпрограммы). Процедура Halt выполняет выход из программы. Процедура Break осуществляет выход из цикла. Continue осуществляет переход к следующей итерации, даже если предыдущая еще не завершена.

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

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



Изучение процесса алгоритмизации и программирования вложенных циклов на примерах

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

Вычислить значение переменной Y = 2k + n при всех значениях переменных n = 1, 2, 3 и k = 2, 4, 6, 8.

Схема алгоритма:

Внешний цикл организован с помощью структуры «Цикл с параметром». Параметр n изменяется от 1 до 3. Для каждого n выполняется тело цикла, которое представляет собой один вычислительный блок (подготовка внутреннего цикла) и цикл структуры «Пока». Для каждого значения n полностью выполняется цикл по k (k побегает все значения от k = 2 до k = 8 с шагом 2).

Программа на Паскале в этом случае может иметь следующий вид:

Program VlogCikl;

Var n, k, Y: Integer;

Begin

For n := 1 To 3 Do {Начало внешнего цикла}

Begin

K := 2;

While k <= 8 Do {Начало внутреннего цикла}

Begin

Y := 2 * k + n;

Writeln('n=',n:4,' k=',k:4,' Y=',Y:4);

K := k + 2;

End; {Конец внутреннего цикла}

End; {Конец внешнего цикла}

End.

Результат работы программы:

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

Задана функция: . Для каждого Х в интервале [1 … 10] с шагом 1 найти первое значение Y, при котором функция Z превысит значение 100.

Организуем два вложенных цикла: внешний цикл по Х и внутренний по Y. При каждом значении X и Y рассчитаем значение функции. Когда Z примет значение большее 100, можно прервать продолжение цикла по Y и вывести результат. Приведем фрагмент схемы алгоритма:

Вывод x, y, z будет производиться и в случае, когда цикл по Y доработает до конца. В задаче же требуется выводить только те значения, которые соответствуют условию Z >100, следовательно, необходимо еще раз проверить условие во внешнем цикле. В схеме алгоритма это не отображено. Этот недостаток исправлен в программе.

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

Program Cikl___Brk;

Var yn, yk, dy, x, y, z: Real;

Begin

Write('Y начальное? '); Readln(yn);

Write('Y конечное? '); Readln(yk);

Write('Шаг изменения Y? '); Readln(dy);

x :=1;

Repeat {*Начало внешнего цикла}

y := yn;

While y <= yk Do {**Начало внутреннего цикла}

Begin

z := (y*y-x*x)/0.25;

y := y + dy;

If z > 100 Then Break; {Принудительный выход из цикла}

{При выполнении условия следующим

исполняемым оператором будет — x := x +1}

End; {**Конец внутреннего цикла}

x := x + 1;

If z <= 100 Then Continue; {Переход к следующей итерации}

{При выполнении условия оператор вывода не выполнится}

Writeln('X= ', (x-1):10:2,' Y= ',(y-dy):10:2,' Z= ', z:10:2);

Until x>10; {*Конец внешнего цикла}

End.

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

Результат работы программы:



1178.02.01;ЭПТ2.05;1

Цель:

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

Результаты обучения:

После успешного завершения занятия пользователь должен:

· уметь составлять схемы алгоритмов, содержащие вложенные циклы;

· знать правила записи операторов цикла языка Паскаль в программах, содержащих вложенные циклы;

· изучить процедуры передачи управления break и continue.

Список рекомендуемой литературы:

1. Бурменский А.Д. Гринкруг Л.С. Ильина С.В. Тарануха Н.А. Обучение программированию: Язык Pascal: Учебное пособие. – М.: СОЛОН-Пресс, 2009.

2. Потопахин В.В. Turbo Pascal решение сложных задач. – СПб.: БХВ-Петербург, 2006.

3. Моргун А.Н.. Программирование на языке Паскаль (Pascal). Основы обработки структур данных. – М.: Диалектика, 2005.

4. Попов В. Паскаль и Дельфи. Самоучитель. – СПб.: Питер, 2004.

Используемые программы:

PascalABC

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



Тестирование

В языке Паскаль выход из цикла до завершения его работы осуществляет процедура

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

Для организации выхода из цикла в языке Паскаль используются стандартные процедуры:

Если циклическая вычислительная структура содержит в себе другую циклическую структуру, то такие циклы называются ___

Организовать выход из цикла можно, воспользовавшись оператором безусловного перехода ___




Вариант

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

2. Составить программу, формирующую массив B из массива A (см. задачу 1): . Определить количество элементов полученного одномерного массива B, значения которых принадлежат интервалу [9;30], и среднее арифметическое всех элементов массива B. При выводе округлите результат до двух знаков после запятой.

Количество элементов одномерного массива B, значения которых принадлежат интервалу [9;30] равно

Произведение первых семи элементов одномерного массива A равно

Среднее арифметическое всех элементов одномерного массива B равно (разделитель – точка)

Сумма элементов одномерного массива A равна



Вариант

1. Составить программу, заполняющую одномерный массив A натуральными числами, делящимися нацело на 13 и лежащими в интервале [20;300]. Определить количество и сумму элементов одномерного массива A.

2. Составить программу, формирующую массив B из массива A (см. задачу 1): . Определить среднее арифметическое всех элементов массива B и произведение первых трех элементов массива B.

Количество элементов одномерного массива A равно

Произведение первых трех элементов одномерного массива B равно

Среднее арифметическое всех элементов одномерного массива B равно

Сумма элементов одномерного массива A равна



Вариант

1. Составить программу, заполняющую одномерный массив A пятнадцатью первыми членами геометрической прогрессии (первый член прогрессии равен 1, ее знаменатель равен 2): . Определить сумму элементов массива A.

2. Составить программу, формирующую массив B из массива A (см. задачу 1): . Определить среднее арифметическое всех элементов и произведение первых пяти элементов полученного одномерного массива B. При выводе округлите результаты до двух знаков после запятой.

Десятый элемент одномерного массива A равен

Произведение первых пяти элементов полученного одномерного массива B равно

Среднее арифметическое всех элементов одномерного массива B равно (разделитель – точка)

Сумма элементов одномерного массива A равна



Вариант

1. Составить программу, заполняющую одномерный массив A тридцатью первыми членами арифметической прогрессии (первый член прогрессии равен 10, ее разность равна 5): . Определить сумму элементов массива A.

2. Составить программу, формирующую массив B из массива A (см. задачу 1), при этом все элементы, превышающие заданное число Z, заменяются этим числом. Подсчитать количество выполненных замен. Определить произведение первых четырех элементов полученного одномерного массива B.

При Z=100 количество выполненных замен при формировании одномерного массива B равно

Произведение первых четырех элементов одномерного массива B равно

Пятнадцатый элемент одномерного массива A равен

Сумма элементов одномерного массива A равна



Вариант

1. Составить программу, заполняющую одномерный массив A: . Определить сумму элементов массива A. При выводе округлите результат до двух знаков после запятой.

2. Составить программу, формирующую массив B из массива A (см. задачу 1): . Определить количество элементов полученного одномерного массива B, значения которых меньше 0.1, и среднее арифметическое всех элементов массива B. При выводе округлите результат до двух знаков после запятой.

Количество элементов полученного одномерного массива B, значения которых меньше 0.1, равно

Пятнадцатый элемент одномерного массива A равен (разделитель – точка)

Среднее арифметическое всех элементов массива B равно (разделитель – точка)

Сумма элементов одномерного массива A равна (разделитель – точка)



Теоретическая часть

Массив – это структура данных, которую можно рассматривать как набор переменных одинакового типа, имеющих общее имя (например, a). Каждый элемент массива имеет свой порядковый номер, называемый индексом (a[1], a[2], a[3], …, a[n]). Доступ к элементам массива осуществляется по индексу.

Массивы бывают одномерные и многомерные. Массив, в котором положение элемента определяется одним индексом, называется одномерным. В математике аналогом такой структуры является вектор —.

Индексом может быть произвольное выражение порядкового типа, заключенное в квадратные скобки. Например, Sum[True], Vect[ i + 1 ].

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

Массивом называют как тип данных, так и переменную этого типа. Пример описания типа данных массив:

Type SomeArr = Array [1 .. 100] Of Real;

Var a, b, c : SomeArr;

Имя типа — SomeArr. Индексы в этом типе — переменные, выражения или константы целого типа. Индексы могут изменяться в интервале от 1 до 100. Каждый элемент массива имеет вещественный тип. В разделе описания переменных описаны переменные типа массив a, b, c.

Массив можно описать сразу в разделе описания переменных:

Var a, b, c: Array [1 .. 100] Of Real;

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

При обработке массивов часто используется структура «цикл с параметром», так как индекс массива представляет собой счетчик и изменяется с шагом, равным 1.

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

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

Фрагмент ввода массива:

For i := 1 To n Do

Begin

Write('Введите a[', i, ']'); Readln(a[i]);

End;

Ввод массива необходимо производить поэлементно. Индекс элемента массива должен пробежать все значения от 1 до n. Для этого необходимо организовать цикл, в котором индекс массива является параметром цикла. Оператору ввода предшествует оператор вывода, с помощью которого осуществляется вывод подсказки.

Под выводом массива понимается вывод всех значений элементов массива.

Фрагмент вывода массива:

For i := 1 To n Do

Begin

Writeln('a[' , i, ']=', a[i]);

End;

Для расчета суммы элементов одномерного массива используется прием накопления суммы:

S := 0;

For i := 1 To n Do S := S + a[i];

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

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



Решение задач обработки одномерных массивов

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

В массиве символов подсчитать количество символов, представляющих собой открывающую скобку «(».

Схема алгоритма:

Программа на Паскале в этом случае может иметь следующий вид:

Program Count___1;

Const nn = 100;

Var a: Array[1..nn] Of Char;

i, n, Kol: Integer;

Begin

Write('Количество элементов? '); Readln(n);

For i := 1 To n Do

Begin

Write('Введите a[' , i, ']='); Readln(a[i]);

End;

Kol := 0;

For i := 1 To n Do

If a[i] = '(' Then Kol := Kol + 1;

Writeln('Количество открывающихся скобок в заданном массиве: ', Kol:3);

End.

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

В переменной Kol накапливается значение количества элементов. Эти элементы массива а удовлетворяют условию аi =’(‘. Суммируются единицы, которые в результате дадут значение общего количества элементов, отвечающих заданному условию.

Результат работы программы:

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

Найти максимальный элемент последовательности, состоящей из n элементов.

Фрагмент схемы алгоритма:

Программа на Паскале в этом случае может иметь следующий вид:

Program p___max; {Поиск максимального элемента}

Const nn = 100;

Type list = 1..nn;

Var i : list;

max, n : Integer;

a : Array [list] Of Integer;

Begin

Write('Количество элементов? '); Readln(n); {Ввод количества элементов массива}

For i := 1 To n Do {Ввод элементов массива}

Begin

Write('Введите ',i,'-й элемент массива: '); Readln(a[i])

end;

max := a[1];

For i:= 2 To n Do

If a[i] > max Then max := a[i];

Write ('Максимальный элемент массива: ', max)

end.

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

Переменная max, принимает значение первого элемента массива а. Над всеми остальными элементами массива выполняется однотипная операция: элемент массива сравнивается с переменной max. Если встречается элемент массива больший max, то max приобретает значение этого элемента. Если условие ai > max не выполняется, то присваивания не происходит. По окончании цикла в переменной max останется значение самого большого элемента.

Результат работы программы:

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

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

Схема алгоритма:

Программа на Паскале в этом случае может иметь следующий вид:

Program mid;

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

элементов массива}

Const nn = 10;

Var

a: Array[1..nn] Of Integer;

i, n: Integer;

S: Real;

Begin

{Ввод количества элементов массива}

Write('Количество элементов? '); Readln(n);

{Ввод элементов массива}

For i := 1 To n Do

Begin

Write('Введите a[' , i, ']='); Readln(a[i]);

End;

{Вычисление суммы элементов массива}

S := 0;

For i := 1 To n Do S := S + a[i];

{Вывод результата на экран}

Writeln('Среднее арифметическое значение элементов массива: ', (S/n):5:3);

End.

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

Массив а описан в разделе описания переменных. Это массив целых чисел. Индекс элементов массивы изменяется в интервале от 1 до nn.

Переменная i используется в качестве параметра оператора цикла. Переменная n — количество элементов массива, исходная величина. S — результат вычислений. В этой переменной накапливается сумма элементов массива.

Результат работы программы:

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

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

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

Перебираются все элементы массива и производятся сравнения: первый элемент со вторым второй с третьим, и так далее до n–го. Если значение некоторого элемента больше значения следующего элемента, то эти элементы меняются местами.

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

Фрагмент схемы алгоритма:

Программа на Паскале в этом случае может иметь следующий вид:

Program puzirok;

{Упорядочивание элементов массива методом "пузырька"}

Const nn = 100;

Type mass = Array [1 .. nn] Of Real;

Var i, j, n : Integer;

y : Real;

x : mass;

Begin

{Ввод исходной информации}

Write('Количество элементов? '); Read(n);

For i := 1 To n Do

Begin

Write('Введите ',i,'-й элемент массива: '); Readln(x[i])

End;

{Упорядочивание массива по возрастанию}

For i := 2 To n Do {Проход}

Begin

For j := n Downto i Do {Цикл для сравнения}

If x[j - 1] > x[j] Then

Begin

y := x[j - 1]; x[j - 1] := x[j]; x[j] := y {Перестановка}

End;

End;

{Вывод результата - упорядоченного массива}

Writeln('Упорядоченный массив:');

For i:= 1 To n Do Write(x[i]:8:2)

End.

Этот алгоритм реализуется с помощью двух циклов For — внутреннего и внешнего. Число повторений внешнего цикла на 1 меньше числа элементов массива (так как последовательность из одного значения проверять нет смысла). Число повторений внутреннего цикла последовательно сокращаться от n до 1.

Внешний цикл по i определяет количество проходов. Цикл по j создан для сравнения пар элементов массива. Сравниваются два элемента, расположенных рядом. Если XJ-1 > XJ, то осуществляется перестановка элементов местами. Для того чтобы не потерять значение одного из переставляемых элементов, вводится вспомогательная переменная Y, которая представляет собой буфер для хранения x[j-1].

Для вывода массива, так же как и для ввода, требуется организовать цикл, определяющий индекс каждого элемента массива. Вывести массив — значит вывести все его элементы. Выводится Хi, при этом i пробегает все значения от 1 до n с шагом 1.

Результат работы программы:



1178.02.01;ЭПТ2.06;1

Цель:

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

Результаты обучения:

После успешного завершения занятия пользователь должен:

· знать синтаксис объявления массива;

· знать правила записи переменной с индексом;

· знать алгоритмы ввода/вывода одномерного массива;

· уметь программировать задачи по обработке одномерных массивов.

Список рекомендуемой литературы:

· Бурменский А.Д. Гринкруг Л.С. Ильина С.В. Тарануха Н.А. Обучение программированию: Язык Pascal: Учебное пособие. – М.: СОЛОН-Пресс, 2009.

· Потопахин В.В. Turbo Pascal решение сложных задач. – СПб.: БХВ-Петербург, 2006.

· Моргун А.Н.. Программирование на языке Паскаль (Pascal). Основы обработки структур данных. – М.: Диалектика, 2005.

· Попов В. Паскаль и Дельфи. Самоучитель. – СПб.: Питер, 2004.

Используемые программы:

PascalABC

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



Тестирование

___ - структура данных, которую можно рассматривать как набор переменных одинакового типа, имеющих общее имя

Верно записан элемент одномерного массива

Доступ к каждому элементу массива выполняется путем указания значения индекса в

Имеется описание типа данных массив TYPE ARR=ARRAY[1..15] OF INTEGER; VAR AR:ARR. Верно записан оператор вывода:

Имеется описание типа данных массив TYPE ARR=ARRAY[5..15] OF INTEGER; VAR AR:ARR. Верно записаны элементы массива AR:




Вариант

1. Дано действительное число Х=2.1. Получить действительную квадратную матрицу размером 4 на 4, элементы которой равны:

При выводе округлите результаты до двух знаков после запятой.

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

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

Значение элемента A(3,4) равно (разделитель – точка)

Значение элемента A(4,3) равно (разделитель – точка)

Сумма элементов второй строки матрицы A (разделитель – точка)

Сумма элементов матрицы A, лежащих выше главной диагонали (разделитель – точка)

Сумма элементов матрицы A, лежащих ниже главной диагонали (разделитель – точка)

Сумма элементов первой строки матрицы A (разделитель – точка)



Вариант

1. Составить программу, заполняющую матрицу A размером 20 строк и 30 столбцов, каждый элемент которой получается по формуле , где i — номер строки, j — номер столбца. При выводе округлите результаты до двух знаков после запятой.

2. Определить количество отрицательных и положительных элементов матрицы A.

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

Значение элемента A(10,12) равно (разделитель – точка)

Значение элемента A(14,12) равно (разделитель – точка)

Количество отрицательных элементов матрицы A (разделитель – точка)

Количество положительных элементов матрицы A (разделитель – точка)

Среднее арифметическое элементов десятой строки матрицы A (разделитель – точка)

Среднее арифметическое элементов семнадцатой строки матрицы A (разделитель – точка)



Вариант

1. Составить программу, заполняющую матрицу A размером 20 строк и 30 столбцов, каждый элемент которой получается по формуле , где i — номер строки, j — номер столбца. При выводе округлите результаты до двух знаков после запятой.

2. Определить количество отрицательных и положительных элементов матрицы A.

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

Значение элемента A(12,10) равно (разделитель – точка)

Значение элемента A(18,25) равно (разделитель – точка)

Количество отрицательных элементов матрицы A (разделитель – точка)

Количество положительных элементов матрицы A (разделитель – точка)

Сумма элементов восемнадцатого столбца матрицы A (разделитель – точка)

Сумма элементов пятнадцатого столбца матрицы A (разделитель – точка)



Вариант

1. Составить программу, заполняющую матрицу A размером 20 строк и 30 столбцов, каждый элемент которой получается по формуле , где i — номер строки, j — номер столбца. При выводе округлите результаты до трех знаков после запятой.

2. Определить количество элементов матрицы A, значение которых превышает заданное число.

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

Значение элемента A(17,18) равно (разделитель – точка)

Значение элемента A(20,2) равно (разделитель – точка)

Количество элементов матрицы A, значение которых превышает значение 0.02 (разделитель – точка)

Количество элементов матрицы A, значение которых превышает значение 0.04 (разделитель – точка)

Среднее арифметическое элементов пятнадцатого столбца матрицы A (разделитель – точка)

Среднее арифметическое элементов седьмого столбца матрицы A (разделитель – точка)



Вариант

1. Составить программу, формирующую квадратную матрицу A порядка n=20:

2. Определить сумму и среднее арифметическое элементов матрицы A, лежащих на главной диагонали.

3. Найти сумму элементов каждого из столбцов матрицы A.

Значение элемента A(15,18) равно (разделитель – точка)

Значение элемента A(17,10) равно (разделитель – точка)

Среднее арифметическое элементов матрицы A, лежащих на главной диагонали (разделитель – точка)

Сумма элементов девятнадцатого столбца матрицы A (разделитель – точка)

Сумма элементов матрицы A, лежащих на главной диагонали (разделитель – точка)

Сумма элементов четырнадцатого столбца матрицы A (разделитель – точка)



Работа с двухмерными массивами

Массив – это структура данных, которую можно рассматривать как набор переменных одинакового типа, имеющих общее имя (например, a). Массивы бывают одномерные и многомерные.

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

В математике аналогом двухмерного массива является матрица.

А =

Матрица А состоит из четырех строк и четырех столбцов. В матрице каждый элемент идентифицируется номером строки и номером столбца, на пересечении которых он расположен.

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

A[2, 3]

В двухмерном массиве первый индекс указывает на номер строки, а второй индекс указывает на номер столбца, на пересечении которых расположен элемент. В матрице А, записанной выше, элемент A[2, 3] равен 1, а элемент A[3, 2] равен 0.

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

Формат записи двухмерного массива в языке Паскаль:

<имя>: Array [<нижний___индекс1>..<верхний___индекс1>,

<нижний___индекс2>..<верхний___индекс2>] Of <тип>;

Пример описания типа данных двухмерный массив:

Type SomeArr = Array [1 .. 10, 1 .. 20] Of Real;

Var a, b, c : SomeArr;

Имя типа — SomeArr. Первый индекс может изменяться в интервале от 1 до 10, второй индекс может изменяться в интервале от 1 до 20. Каждый элемент массива имеет вещественный тип. В разделе описания переменных описаны переменные типа массив a, b, c.

Массив можно описать сразу в разделе описания переменных:

Var a, b, c: Array [1 .. 10, 1 .. 20] Of Real;

Обработка массивов производится путем изменения индексов компонент. То есть имеется способ перехода от одного элемента массива к другому путем изменения индексов.

При обработке массивов часто используется структура «цикл с параметром», так как индекс массива представляет собой счетчик и изменяется с шагом, равным 1.

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

For i:=1 To n Do a [1, i] := 0;

Первый индекс элемента остается неизменным, он равен 1. Это номер строки. Второй индекс изменяется от 1 до n. Это номер столбца.

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

For i:=1 To n Do a [i ,1] := 0;

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

Если нужно обнулить все элементы матрицы, то следует организовать два вложенных цикла:

For i := 1 To n Do

For j := 1 To m Do

a[i,j] := 0;

При каждом значении i (номера строки) j пробегает все значения от 1 до m.

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

Фрагмент ввода двухмерного массива:

For i := 1 To n Do

For j := 1 To m Do

Begin

Write('Введите a[', i, ',' j, ']='); Readln(a[i,j]);

End;

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

Под выводом массива понимается вывод всех значений элементов массива.

Фрагмент вывода двухмерного массива в виде таблицы:

For i := 1 To n Do

Begin

For j := 1 To m Do

Write(a[i,j]);

Writeln;

End;

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

Для расчета суммы элементов двухмерного массива используется прием накопления суммы:

S := 0;

For i := 1 To n Do

For j := 1 To m Do

S := S + a[i,j];

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

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

Для расчета произведения элементов двухмерного массива используется прием накопления произведения:

P := 1;

For i := 1 To n Do

For j := 1 To m Do

P := P * a[i,j];

Начальное значение произведения должно быть равно 1.



Решение задач обработки двухмерных массивов

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

Дана матрица размером N на M. Поменять местами четные и нечетные столбцы матрицы.

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

Для перестановки элементов четных и нечетных столбцов организован цикл с шагом 2. Внутри цикла по строкам организован цикл структуры «До». Перебираются только четные столбцы (со второго по последний с шагом 2). Нечетный столбец определен как J – 1. Во избежание потери информации вводится вспомогательная переменная Z, которая является буфером для хранения значения элемента нечетного столбца.

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

Program Change___Stolb;

Var i, j, n, m: Integer;

Z: Real;

D: Array [1..10, 1..10] Of Real;

Begin

{Ввод размера матрицы}

Write('Количество строк матрицы? '); Readln(n);

Write('Количество столбцов матрицы? '); Readln(m);

{Ввод матрицы}

For i:=1 To n Do

For j:=1 To m Do

Begin

Write('Введите D[', i, ',', j,']='); Readln(D[i,j]);

End;

{ ***Перестановка столбцов ***}

For i:=1 To n Do {Цикл по строкам}

Begin

j:=2; {Подготовка цикла по столбцам}

Repeat {Цикл по столбцам}

{Перестановка четного и нечетного элементов}

Z:=D[i,j-1]; D[i,j-1]:=D[i,j]; D[i,j]:=Z;

j:=j+2; {Перебираем только четные столбцы}

Until j>m;

End;

{Вывод результирующей матрицы}

For i:=1 To n Do

Begin

For j:=1 To m Do

Write(D[i,j]:8:3);

Writeln;

End;

End.

Результат работы программы:

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

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

В этой задаче задана матрица размером N на M и вектор, состоящий из M элементов. Задано k — номер новой строки.

Фрагмент программы (описательная часть):

Const nn=20; mm=40;

Var a: array [1..nn+1, 1..mm] Of Real;

c: array [1..mm] Of Real;

I, j, n, m, k: Integer;

Фрагмент схемы алгоритма:

Фрагмент программы (исполняемая часть):

For I := n DownTo k Do

For j:= 1 To m Do

a[i + 1, j] := a[i, j]; {с n –ой по k –ую строки матрицы передвинули вниз}

N := n+1;

For j:= 1 To m Do

a[k, j] := c[j]; {На место k –ой строки матрицы записали вектор}

Матрица [A] будет увеличена на одну строку, поэтому в описании переменной [A] максимальный размер строк увеличен на единицу.

Два первых цикла организуют перемещение строк матрицы вниз на одну строку.

В цикле по строкам параметр цикла изменяется с шагом –1. Начиная с n-ой строки и до k-ой, все строки смещаются вниз, оставляя k-ую строку свободной для элементов вектора С. Перемещение одной строки связано с пересылкой всех элементов этой строки, что требует организации цикла по номеру столбца. Отдельно организован цикл для записи элементов вектора С на место k-ой строки матрицы [A]. В цикле по j элементам Akj присваивается значение Cj

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

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

Удалить k-ую строку матрицы можно, сдвинув строки, следующие за k-ой строкой на одну позицию вверх.

Фрагмент схемы алгоритма:

Фрагмент программы:

For i:= k To n – 1 Do

For j:= 1 To m Do

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

Все строки, начиная с (k+1)-й, нужно переместить вверх. Цикл по строкам начинается с k-ой строки. Все элементы k-ой строки заменяются на k + 1 строку. Число строк уменьшается на единицу.

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

Сформировать матрицу размером N на M и вывести ее на экран.

Схема алгоритма:

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

Program Mass___1;

{Программа формирует двухмерный массив с помощью датчика случайных чисел и выводит массив на экран}

Const nn = 10; mm = 10;

Var a: Array[1..nn, 1..mm] Of Real;

i, j, n, m: Integer;

Begin

{Ввод размера массива}

Write('Количество строк матрицы? '); Readln(n);

Write('Количество столбцов матрицы? '); Readln(m);

{Задание элементов массива}

For i:=1 To n Do

For j:=1 To m Do

Begin

a[i, j] := Random;

End;

{Вывод результата на экран}

For i:=1 To n Do

Begin

For j:=1 To m Do

Write(a [i, j]:8:3);

Writeln;

End;

End.

Результат работы программы:

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

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

Дано: n — количество строк матрицы, m — количество столбцов матрицы.

[B] — матрица с элементами bij, где i изменяется от 1 до n, j изменяется от 1 до m.

Найти: Sumi =

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

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

Program SumStrok;

Type Mass = Array [1..10] Of Real;

Var i, j, n, m: Integer;

Sum: Mass;

b: Array [1..10,1..10] Of Real; {Описали массив}

Begin

Write('Количество строк матрицы? '); Readln(n);

Write('Количество столбцов матрицы? '); Readln(m);

For i:=1 To n Do

For j:=1 To m Do

Begin

Write('Введите b[' , i, ',', j,']='); Readln(b[i,j]);

End;

For i:=1 To n Do

Begin

Sum[i]:=0;

For j:=1 To m Do Sum[i] := Sum[i] + b[i,j];

End;

For i:= 1 To n Do WriteLn ('Сумма элементов строки ', i, ' = ',Sum[i] : 10:3);

End.

Сумма каждой строки матрицы должна храниться в соответствующем элементе одномерного массива. Так, сумма 1-ой строки должна храниться в первом элементе Sum1, сумма 2-ой строки в элементе Sum2 и так далее. Цикл по i определяет номер элемента одномерного массива Sum и номер строки матрицы В. Индекс j определяет номер строки матрицы. В цикле по j накапливается сумма элементов соответствующей строки матрицы.

На поиск в массиве элемента, с заданными значениями индексов, затрачивается время. (Адрес i-го элемента определяется прибавлением к адресу начала массива значения i). Поэтому для повышения эффективности лучше использовать вспомогательную переменную S при суммировании, что исключает многократное обращение к элементам массива Sum:

For i:=1 To n Do

Begin

S:=0;

For j:=1 To m Do S:= S + b[i,j];

Sum[i] := S;

End;

Результат работы программы:



Цель:

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

Результаты обучения:

После успешного завершения занятия пользователь должен:

· знать синтаксис объявления двухмерного массива и типа «массив»;

· знать алгоритмы ввода/вывода двухмерного массива;

· уметь программировать задачи по обработке двухмерных массивов.

Список рекомендуемой литературы:

  • Бурменский А.Д. Гринкруг Л.С. Ильина С.В. Тарануха Н.А. Обучение программированию: Язык Pascal: Учебное пособие. – М.: СОЛОН-Пресс, 2009.
  • Потопахин В.В. Turbo Pascal решение сложных задач. – СПб.: БХВ-Петербург, 2006.
  • Моргун А.Н.. Программирование на языке Паскаль (Pascal). Основы обработки структур данных. – М.: Диалектика, 2005.
  • Попов В. Паскаль и Дельфи. Самоучитель. – СПб.: Питер, 2004.

Используемые программы:

PascalABC

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



Тестирование

В программе имеется следующее описание:

CONST N=2; VAR A:ARRAY[1..N,1..N] OF INTEGER; I,J:INTEGER;

После выполнения операторов

FOR I:=1 TO N DO FOR J:=1 TO N DO IF I=J THEN A[I,J]:=3 ELSE A[I,J]:=4;

будет сформирована матрица:

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

Массив B, описанный как B: ARRAY [2..4,2..4] OF INTEGER содержит элементов -

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

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

FOR I:=1 TO 3 DO FOR J:=1 TO 4 DO READ(A[I,J]);

элементы матрицы вводятся




Вариант

1. Составить программу, заменяющую во введенном тексте двоеточие на точку с запятой.

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

3. Составить программу, определяющую во введенном тексте количество символов, предшествующих двоеточию.

Текст программы, заменяющей во введенном тексте двоеточие на точку с запятой:

Var Str:String;

i:Integer;

Begin

Write('Введите текст: ');

Readln(Str);

For i:=1 To ___ Do

If Str[i]=':' Then Str[i]:=';';

Writeln('Результат: ', Str);

End.

Введите пропущенное выражение (без пробелов, прописными буквами).

Текст программы, определяющей во введенном тексте количество символов, предшествующих двоеточию:

Const Q=':';

Var S:String;

D:Integer;

Begin

Write('Введите текст: '); Readln(S);

D:=Pos(Q,S);

If D<>0 Then Writeln('Количество символов перед двоеточием: ', ___ )

Else Writeln('Двоеточие в тексте отсутствует');

End.

Введите пропущенное выражение (без пробелов, прописными буквами).

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

Const Str___1='0123456789!@#$%^&*()___+|{}:"<>?[];,./\';

Var Str:String;

i,kl:Integer;

Begin

Write('Введите текст: '); Readln(Str);

kl:=0;

For i:=1 to Length(Str) Do

If ___ <>0 Then Begin kl:=1; Break; End;

If kl=0 Then Writeln('Текст не содержит символы, отличные от букв и пробела')

Else Writeln('Текст содержит символы, отличные от букв и пробела');

End.

Введите пропущенное выражение (без пробелов, прописными буквами).



Вариант

1. Составить программу, определяющую длину введенной строки.

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

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

Текст программы, определяющей длину введенной строки:

Var Str:String;

Begin

Write('Введите текст: ');

Readln(Str);

Writeln('Длина строки: ', ___ );

End.

Введите выражение (без пробелов, прописными буквами), вычисляющее длину введенной строки.

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

Const Q=' '; K='K';

Var V,G,T:String;

P,kol:Integer;

Begin

Write('Введите текст: '); Readln(T);

G:=T; kol:=0; P:=Pos(Q,T);

While P<>0 Do

Begin

V:=Copy(T,1,P-1); Writeln(V);

If ( ___ =K) Then kol:=kol+1;

Delete(T,1,P);

P:=Pos(Q,T);

End;

V:=T; Writeln(V);

If ( ___ =K) Then kol:=kol+1;

Writeln('Количество слов, начинающихся на букву K: ', kol);

End.

Введите пропущенное выражение (без пробелов, прописными буквами).

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

Const Str___1='0123456789.';

Var Str:String;

i,kl:Integer;

Begin

Write('Введите текст: '); Readln(Str);

kl:=0;

For i:=1 to Length(Str) Do

If ___ =0 Then Begin kl:=1; Break; End;

If kl=0 Then Writeln('Текст является десятичной записью вещественного числа')

Else Writeln('Текст не является десятичной записью вещественного числа');

End.

Введите пропущенное выражение (без пробелов, прописными буквами).



Вариант

1. Составить программу, определяющую длину введенной строки.

2. Составить программу, определяющую, является ли введенный текст идентификатором.

3. Составить программу, удаляющую часть введенного текста, заключенную в скобки (вместе со скобками).

Текст программы, определяющей длину введенной строки:

Var S:String;

D:Integer;

Begin

Write('Введите текст: ');

Readln(S);

D:= ___ ;

Writeln('Длина строки: ',D);

End.

Введите выражение (без пробелов, прописными буквами), вычисляющее длину введенной строки.

Текст программы, определяющей, является ли введенный текст идентификатором (проверяется только первая буква текста):

Const Alph='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijlmnopqrstuvwxyz___';

Var S:String;

Begin

Write('Введите текст: '); Readln(S);

If ___ <>0 Then Writeln('Текст может быть идентификатором')

Else Writeln('Текст не является идентификатором');

End.

Введите пропущенное выражение (без пробелов, прописными буквами).

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

Const S1='(';

S2=')';

Var S:String;

k1,k2,k3:Integer;

Begin

Write('Введите текст: '); Readln(S);

k1:=Pos(S1,S);

k2:=Pos(S2,S);

if (k2>k1) then

begin

k3:=k2-k1+1;

Delete(___);

end;

Writeln('Результат: ',S);

End.

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



Вариант

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

2. Составить программу, определяющую количество символов * во введенном тексте.

3. Составить программу, определяющую, сколько раз во введенном тексте содержится группа букв abc.

Текст программы, определяющей длину первого слова введенной строки:

Var Str:String;

D:Integer;

Begin

Write('Введите текст: ');

Readln(Str);

D:=Pos(' ',Str);

Writeln('Длина первого слова текста: ' ___ ,);

End.

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

Текст программы, определяющей количество символов * во введенном тексте:

Var Str:String;

i,k:Integer;

Begin

Write('Введите текст: ');

Readln(Str);

k:=0;

For i:=1 To Length(Str) Do

If ___ ='*' Then k:=k+1;

Writeln('Количество символов * в тексте: ',k);

End.

Введите пропущенное выражение (без пробелов, прописными буквами).

Текст программы, определяющей, сколько раз во введенном тексте содержится группа букв abc:

Const Q='abc';

Var G,T:String;

P,D:Integer;

Begin

Write('Введите текст: '); Readln(T); G := T;

P:= ___;

D:=0;

While P<>0 Do

Begin

D:=D+1;

Delete(T,3,P);

P:= ___;

End;

Writeln('Количество групп букв abc: ', D);

End.

Введите пропущенное выражение (без пробелов, прописными буквами).



Вариант

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

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

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

Текст программы, выводящей на экран символы, расположенные во введенном тексте внутри скобок:

Const S1='(';

S2=')';

Var S:String;

k1,k2,k3:Integer;

Begin

Write('Введите текст: '); Readln(S);

k1:=Pos(S1,S)+1;

k2:=Pos(S2,S);

if (k2>k1) then k3:=k2-k1-1;

Writeln('Результат: ',Copy( ___ ));

End.

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

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

Var S:String;

i:Integer;

Begin

Write('Введите текст: ');

Readln(S);

For i:=1 To Length(S) Do

If S[i]='.' Then ___ ;

Writeln('Результат: ', S);

End.

Введите пропущенное выражение (без пробелов, прописными буквами).

Текст программы, определяющей длину последнего слова введенной строки:

Var Str:String;

i,D:Integer;

Begin

Write('Введите текст: ');

Readln(Str);

For i:= ___ DownTo 1 Do

If Str[i]=' ' Then Begin D:=Length(Str)-i; Break; End;

Writeln('Длина последнего слова текста: ',D);

End.

Введите пропущенное выражение (без пробелов, прописными буквами).



Теоретическая часть

Для обработки текстов в языке Паскаль используется строковый тип.

Строковая константа широко использовалась в комментариях для списков вывода оператора Write. Строковая константа — это совокупность любых символов, заключенная в апострофы, например: 'Количество отрицательных элементов вектора =', 'Введите n', 'Нажмите <Enter>' и т.д.

Переменная строкового типа описывается с помощью служебного слова String, например:

Var

S: String;

Str___simv: String[20];

В описании типа String длина строки может принимать любое целое значение от 1 до 255. Если длина не указана, то берется максимальная длина, равная 255. Переменная Str___simv может хранить строки длиной не более 20 символов. Описание String без указания длины отводит для переменной место, как и описание String[255].

Можно описать строковый тип, а затем этот тип использовать для описания переменных:

Const N=10;

Type

Str = String[20]; Str___1 = String[N];

Var

Value___a, Property___b: Str;

. . .

Для переменной типа String[N] выделяется N+1 байт памяти.

S[0] — хранит код, соответствующий числу символов в строке.

Ord(S[0]) — длина строки S.

Значением строки может быть любая последовательность символов, заключенная в одинарные кавычки:

'abcde-абвгд'

'123 ? 321'

Строки можно присваивать, объединять и сравнивать.

S := 'Кон' +'кат' + 'ена' + 'ция';

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

Произвольные пары строк могут сравниваться с помощью операторов отношений: = , <> , < , > , <=, >= :

'Abcd' < 'abcd'

Сравнение происходит посимвольно слева направо. При этом символ 1 считается меньше символа 2, если его код в таблице ASCII меньше, чем у символа 2. Код заглавной буквы «А» меньше, чем у прописной буквы «а». Результат сравнения этих двух строк (Abcd с заглавной буквой «А» и abcd с прописной “а”) есть TRUE (истина).

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

К любому символу в строке можно обратиться так же, как к элементу одномерного массива. Элементы строки идентифицируются именем строки с индексом, заключенным в квадратные скобки. Например: N[5], S[i], Slovo[k+1].Первый номер строки имеет номер 1. Значение индекса не должно выходить за границы описания.

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

Процедура/функция

Действие

Примеры

Length(S : String): Integer;

Возвращает текущую длину строки S (число символов, из которых состоит строка S).

Stroka := 'Пример';

L := Length(Stroka);

L равно 6.

Copy(S : String; Start, Len: Integer) : String;

Результат — строковая величина, состоящая из Len символов строки S, начиная с символа номер Start.

Str := Copy('Function', 2, 4);

Результат: 'unct'.

Str := Copy('Сарай', 3, 3);

Результат: 'рай'.

Pos(Subs, S : String) : Integer;

Ищет вхождение подстроки Subs в строке S и возвращает номер первого символа Subs в S или 0 , если S не содержит Subs.

i := Pos('o', 'Космодром');

Результат: 2.

p := Pos('одр', 'Космодром');

Результат: 5.

Insert(Subs : String; Var S : String; Start : Integer);

Вставляет подстроку Subs в строку S , начиная с позиции Start.

S := 'Начало–конец';

Insert(S, 'середина–', 8);

Результат: 'Начало–середина–конец'.

Delete(Var S : String; Start, Len : Integer);

Видоизменяет строку S, удаляя Len символов, начиная с номера Start.

S := 'Строка';

Delete(S, 2, 4);

Результат: ‘Са’.

Str(X [ : Width [ : Dec] ]; Var S : String);

Преобразует численную величину X в последовательность символов, соответствующей значению величины, затем преобразует эту последовательность в строковую величину, которую присваивает переменной S.

Str(45, S);

Результат: '45'.

Str(45:3, S);

Результат: '45'.

Val(S: String; Var V; Var ErrCode : Integer);

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

Пусть Var IntVar, Rep : Integer;

Процедура:

Val('23', IntVar, Rep);

IntVar = 23.

Rep = 0

Процедура:

Val('23.0', IntVar, Rep);

IntVar = неизменно.

Rep = 3.

Concat(S1,S2,...SN : String): String;

Возвращает строку, являющуюся результатом слияния строк s1,..., sn. Результат тот же, что у выражения s1+s2+...+sn.

Stroka1:='Комп';

Stroka2:='ьютер';

Stroka:= Stroka:=Concat(Stroka1,

Stroka2);

Stroka равна 'Компьютер'.

IntToStr(I:Integer):String;

Преобразует целое число к строке.

I:=6;

Str:=IntToStr(I);

Str равна '6'.

StrToInt(S:String):Integer;

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

Str:='6';

I:=StrToInt(Str);

I равно 6.

FloatToStr(V:Real):String;

Преобразует вещественное число к строке.

V:=6.5;

Str:=FloatToStr(I);

Str равна '6.5'.

StrToFloat(S:String):Real;

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

Str:='6.5';

V:=StrToFloat(Str);

V равно 6.5.

UpCase(C:Char):Char;

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

C:=UpCase('a');

Результат: 'A'.

LowCase(C:Char):Char;

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

C:=LowCase('A');

Результат: 'a'.

UpperCase(S:String):String;

Возвращает строку S, преобразованную к верхнему регистру.

S:=UpperCase('abcd');

Результат: 'ABCD'.

LowerCase(S:String):String;

Возвращает строку S, преобразованную к нижнему регистру

S:=UpperCase('ABCD');

Результат: 'abcd'.

Trim(S:String):String;

Возвращает копию строки S с удаленными лидирующими и заключительными пробелами.

S:=Trim(' Abcd ');

Результат: 'Abcd'.

TrimLeft(S:String):String;

Возвращает копию строки

S
с удаленными лидирующими пробелами.

S:=TrimLeft(' Abcd ');

Результат: 'Abcd '.

TrimRight(S:String):String;

Возвращает копию строки

S
с удаленными заключительными пробелами.

S:=TrimRight(' Abcd ');

Результат: ' Abcd'.



Задание

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

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

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

Var V, T : String; P1 : integer;

Begin

Write('Введите текст: '); Readln(T);

P1 := Pos(' ', T);

V := Copy(T, 1, P1 - 1);

Writeln('Первое слово введенного текста: ', V);

End.

Функция Pos определяет номер позиции заданного символа – пробела в исходном тексте Т.

С помощью функции Copy выделяется цепочка символов от начала текста до позиции пробела P1. Выделенный фрагмент является первым словом текста. Оператор Writeln(V) выводит первое слово на экран.

Результат работы программы:

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

Выяснить, является ли буква гласной или согласной.

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

Const Str___1 = 'йуеыаоэяиюё';

Var a : Char;

. . .

If Pos(a, Str___1) <>0 Then Writeln('Гласная')

Else Writeln('Согласная');

В разделе описания констант опишем строковую константу. Эта строковая константа содержит в качестве своих символов только гласные. В тексте программы достаточно проверить номер позиции буквы в строке Str___1. Если буква совпадает с каким–либо элементом массива гласных, т.е. позиция вхождения этой буквы в строку неравна 0, то это означает, что буква гласная.

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

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

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

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

For i := 1 To Col Do

If T[i] = ' ' Then P := i;

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

Program Prim___3;

Const Col = 20;

Var V, G, T : String; P, i : integer;

Begin

Write('Введите текст: '); Readln(T);

G := T; {Сохраним исходный текст в переменной G}

While Pos(' ', T) <> 0 Do

{До тех пор, пока в тексте имеются пробелы

(позиция пробела в тексте не равна 0) выполняем}

Begin

For i := 1 To Col Do {поиск ближайшего к позиции Col пробела}

If T[i] = ' ' Then P := i;

{копирование подстроки и вывод ее на экран}

V := Copy(T, 1, P); Writeln(V);

{формирование нового текста, в котором предыдущая строка вырезана}

T := Copy(T, P+1, Length(T));

End;

Writeln(T);

End.

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

Результат работы программы:

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

Распечатать исходный текст по словам. Слова в тексте разделены символом – пробелом.

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

Const Q = ' ';

Var V, G, T : String; P : Integer;

Begin

Write('Введите текст: '); Readln(T); G := T;

P := Pos(Q, T);

While P <> 0 Do

Begin

V := Copy(T, 1, P - 1); Writeln(V);

Delete(T, 1, P);

P := Pos(Q, T);

End;

Writeln(T);

End.

С помощью оператора цикла While организуем повтор действий: копируем из исходного текста подстроку, ограниченную первым символом и символом – пробелом. Позиция пробела определена в переменной P. Распечатываем подстроку. Удаляем эту строку из исходного текста. Процедура Delete удаляет из строки Т Р символов, начиная с первого. С помощью функции Pos определяем позицию следующего пробела. Цикл продолжается до тех пор, пока Р — позиция пробела не станет равной 0.

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

Результат работы программы:

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

For i := 1 To Length(T) Do

If T[I] = Q Then Writeln Else Write(T[I]);



Цель:

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

Результаты обучения:

После успешного завершения занятия пользователь должен:

· узнать синтаксис объявления данных строкового типа;

· знать стандартные процедуры и функции по работе со строковыми данными;

· уметь программировать задачи по обработке строковых данных.

Список рекомендуемой литературы:

1. Бурменский А.Д. Гринкруг Л.С. Ильина С.В. Тарануха Н.А. Обучение программированию: Язык Pascal: Учебное пособие. – М.: СОЛОН-Пресс, 2009.

2. Потопахин В.В. Turbo Pascal решение сложных задач. – СПб.: БХВ-Петербург, 2006.

3. Моргун А.Н.. Программирование на языке Паскаль (Pascal). Основы обработки структур данных. – М.: Диалектика, 2005.

4. Попов В. Паскаль и Дельфи. Самоучитель. – СПб.: Питер, 2004.

Используемые программы:

PascalABC

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



Тестирование

Для доступа к отдельному символу в строке типа STRING используются скобки

Для определения фактической длины текстовой строки используется функция

Для строковой переменной A верно составлено описание

Осуществить в строке поиск определенного фрагмента можно с помощью функции

По умолчанию размер строки типа STRING принимается равным ___ символам (введите цифрами)