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

Методическое пособие 555

.pdf
Скачиваний:
4
Добавлен:
30.04.2022
Размер:
2.33 Mб
Скачать

Рассмотрим пример. Пусть целочисленная переменная day содержит номер дня недели. В зависимости от ее значения программа должная вывести на экран одно из следующих сообщений: «Сегодня будний день», «Сегодня выходной», «Ура, сегодня пятница!». Соответствующий фрагмент программы будет выглядеть так:

case day of

1..4: writeln('Сегодня будний день'); 5: writeln('Ура, сегодня пятница!'); 6,7: writeln('Сегодня выходной');

else writeln('Где-то возникла ошибка…'); end;

1.6. Комментарии к программе

Комментарии – это участки кода, игнорируемые компилятором и используемые программистом для пояснения текста программы. В PascalABC.NET комментарий помещается между фигурными скобками { } или символами (* и *), а также после символов // до конца строки:

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

// До конца строки будет комментарий

Ясность исходного кода программы существенно возрастает при грамотном использовании отступов (пробелов, табуляций) и пустых строк. Обычно отступами обозначают внутренние операторы управляющих структур (см., например, приведенные выше записи операторов if и case).

2. Практическая часть

Задание 1. Написать программу для вычисления расстояния между двумя точками на плоскости, координаты x и y которых вводит пользователь.

Решение. Запустите среду PascalABC.Net и в редакторе кода введите следующую программу:

81

program lab_3_p1; //Заголовок программы var //Раздел объявления переменных

x1,y1,x2,y2: Real; //координаты двух точек d: Real; //расстояние между точками

begin

//Получение исходных данных writeln('Введите координаты двух точек'); write('x1 = ');

readln(x1); write('y1 = '); readln(y1); write('x2 = '); readln(x2); write('y2 = '); readln(y2);

//Вычисляем расстояние между точками d:=sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)); //Выводим результат на экран writeln('Расстояние между точками d = ',d);

end.

Рассмотрим подробно эту программу. Очевидно, для решения поставленной задачи необходимо четыре вещественных переменных для хранения координат двух точек, поэтому в разделе объявления переменных var мы объявили переменные x1, y1, x2, y2 типа Real. Также мы объявили переменную d типа Real, в которую в дальнейшем будет помещен результат вычисления расстояния между точками.

Сделав объявления всех необходимых переменных, начинаем основной блок программы (begin). Сначала обеспечиваем пользователю возможность ввода координат двух точек: при помощи операторов вывода writeln и write выводим пользователю поясняющие сообщения (все выводимые строковые константы должны быть заключены в апострофы), а при помощи оператора ввода readln получаем от пользователя значения переменных x1, y1, x2, y2.

82

В строке

d:=sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2));

в переменную d присваивается результат вычисления рас-

стояния

 

 

 

между

 

 

 

точками

по

формуле

d

(x

x

2

)2

( y

y

2

)2

(функция

sqrt()

вычисляет

 

1

 

 

1

 

 

 

 

 

квадратный корень).

Далее выводим значение переменной d при помощи оператора writeln. Заметим, что мы могли обойтись и без использования переменной d, поместив выражение для вычисления расстояния между точками «внутрь» последнего оператора writeln.

Выполните команду Программа -> Выполнить (или клавиша F9) – будет произведена компиляция программы и она будет запущена на выполнение. Программа будет выводить все сообщения в расположенном внизу «окне вывода». Введите произвольные координаты двух точек и получите результат расчета.

Запустите программу другим способом – «Без связи с оболочкой» (Программа -> Выполнить без связи с оболочкой, Shift+F9) – в этом случае будет сформирован исполняемый файл с расширением exe, который в дальнейшем можно запускать независимо от среды PascalABC.Net.

Задание 2. Изучите средства отладки программ, доступ-

ные в среде PascalABC.Net:

1)выполните пошаговое выполнение программы из предыдущего задания, последовательно нажимая клавишу F8 (Программа->Шаг без входа в подпрограмму).

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

3)проследите за изменением значений переменных другим способом: откройте окно просмотра выражений (Вид ->

83

Просмотр выражений) и введите в это окно имена переменных x1, y1, x2, y2, d. Выполите пошаговое выполнение программы, наблюдая за изменением значений переменных в окне просмотра выражений.

4)изучите работу команды Программа -> Идти к курсору (клавиша F4).

5)щелчком левой кнопки мыши на полосе слева от текста программы поставьте «точку остановки»: появится красный кружок и соответствующая строка программы выделится красным цветом. Запустите программу на выполнение, нажав клавишу F9. Убедитесь, что процесс выполнения программы остановился на выделенной строчке. Продолжите выполнение программы пошагово (клавиша F8).

Задание 3. Измените программу из задания 1 таким образом, чтобы программа записывала ответ с точностью до трех знаков после запятой.

Задание 4. Написать программу, вычисляющую площадь треугольника по заданным координатам его вершин (на плоскости), которые вводит пользователь.

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

Указание. Решить данную задачу можно при помощи операций div (частное от деления) и mod (остаток от деле-

ния). Пусть дано целое число A = a2a1a0, где a2a1a0 – цифры этого числа. Легко догадаться, что

a2 = A div 100;

a1 = (A div 10) mod 10 (или a1 = (A mod 100) div 10); a0 = A mod 10.

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

84

Решение. Код программы представлен ниже:

Program lab_3_p6; var

a_str: string[3]; //строковая переменная a2,a1,a0: Integer; //цифры числа

begin

writeln('Введите трехзначное число'); readln(a_str);

//Переводим отдельные символы строки //в целые числа

a2 := StrToInt(a_str[1]);

a1 := StrToInt(a_str[2]);

a0 := StrToInt(a_str[3]); writeln('Сумма цифр равна: ', a0+a1+a2);

end.

Рассмотрим работу этой программы. Сначала при помощи оператора readln мы получаем от пользователя значение строковой (string) переменной a_str. Строки в языке Pascal представляют собой цепочки отдельных символов (char). К каждому символу строки можно обратиться как отдельной символьной переменной следующим образом: следует написать имя строки, а затем указать номер символа в квадратных скобках. Нумерация символов в строке осуществляется слева направо, начиная с единицы. Например, в строке s = ’Это пример строки’ мы получим s[1] = ’Э’, s[2] = ’т’ и т.д.

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

Char или String в данные типа Integer.

85

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

Указание. Чтобы узнать номер последнего символа в строке, используйте стандартную функцию Length(s), которая возвращает длину (число символов) строки s.

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

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

f (x)

3.165589 * x , при x

0,

.

 

 

 

3.165589 * ln(- x 1), при x

0

Значение аргумента x вводит пользователь. Для удобства объявить константу C = 3.165589 в разделе const.

Указание. Используйте полный условный оператор.

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

 

 

 

x, при x

0;

 

f (x)

3x 2

 

x

 

, при - 5

x

0; .

 

 

 

x cos(x

 

/ 3), при x

-5.

Значение аргумента x вводит пользователь.

Указание. Используйте составной условный оператор.

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

Указание. Как определить цифры трехзначного числа, показано в задаче 4. Цифра является четной, если остаток от деления на 2 равен нулю.

86

Задание 11. Пользователь вводит целое число от одного до пяти. Программа должная вывести словесное описание оценки (1, 2 – «неудовлетворительно», 3 – «удовлетворительно», 4 – «хорошо», 5 – «отлично»). Если пользователь ввел число, не укладывающееся в диапазон от 1 до 5, программа должна вывести сообщение об ошибке. Сделать два варианта программы: а) с использованием оператора if, б) с использованием оператора case.

3. Контрольные вопросы и задания

1. Как можно добавить комментарии в тексте программы?

2. Какие простые типы данных существуют в языке Pascal, для чего они предназначаются?

3. Какие операции могут применяться к переменным ти-

па Integer, Real, Boolean?

4. Какие типы данных называют порядковыми? Каково назначение функций Ord, Pred, Succ и процедур Inc и Dec?

5.Дано следующее условие: x ( ,0] (3,8] (9, ) . Cоставьте соответствующее логическое выражение на языке Pascal (используя логические операции and и or).

6.Из каких основных разделов состоит программа на

Pascal?

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

икак они объявляются?

8.Почему необходима «инициализация» переменных?

9. Для чего служит оператор присваивания?

10. Каким образом можно осуществить обмен значениями между двумя переменными a и b?

11. Пусть переменные a и b имеют тип Integer, переменная c – тип Real, а переменная d – тип Boolean. Какие из следующих операторов присваивания допустимы:

1) c := a; 2) а := c; 3) a := a*b; 4) a := a/b; 5) a := 4/2; 6) c := a/b; 7) d := a < b .

12. Как работают операторы вывода write и writeln? 13. Как работают операторы ввода read и readln?

87

14. Для чего используется условный оператор if?

15. Как записывается полная, короткая и составная форма оператора if?

16. Составьте блок-схему алгоритма работы составного условного оператора.

17. В каких случаях используется оператор выбора case?

18. Всегда ли можно заменить оператор case оператором if? А наоборот?

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

ИСПОЛЬЗОВАНИЕ ЦИКЛОВ В ЯЗЫКЕ PASCAL

Цель работы: научиться программировать циклические вычислительные процессы на языке Pascal.

1. Теоретические сведения

Часто, согласно алгоритму, некоторую группу операторов требуется выполнить многократно. Для этого в языке Pascal предусмотрены операторы цикла: while, repeat и for. Многократно повторяемую в цикле группу операторов обычно называют телом цикла, а однократное выполнение этой группы – шагом цикла или итерацией.

Циклы while и repeat являются недетерминирован-

ными: количество итераций может быть неизвестно до начала выполнения цикла. Синтаксис оператора while (цикл с пре-

дусловием) имеет вид

while условие do begin

[операторы;] end;

Синтаксис цикла repeat (цикл с постусловием) имеет вид

88

repeat

[операторы;] until условие;

Выражение условие должно быть булева типа, оно вычисляется после каждой итерации цикла. Тело цикла while выполняется, пока значение условия равно true, а тело цикла repeat – пока условие рано false. При выходе из цикла управление передается оператору, следующему непосредственно за циклом. В том случае, если тело цикла while состоит только из одного оператора, операторные скобки begin end можно не указывать. Блок-схемы циклов while и repeat представлены на рис. 4.1.

Рис. 4.1. Блок-схемы циклов while (слева) и repeat (справа)

Основное отличие циклов while и repeat состоит в следующем: тело цикла repeat всегда выполняется хотя бы один раз, а тело цикла while может не выполниться ни разу. Соответственно цикл repeat обычно легко преобразовать в цикл while, обратное же преобразование сложнее: чтобы учесть тот фактор, что тело цикла while может не выполниться ни разу, может потребоваться дополнительное условие

89

if в начале тела цикла. Указанное отличие является основным критерием выбора между циклами while и repeat: если согласно алгоритму тело цикла всегда должно быть выполнено хотя бы один раз, то лучше использовать цикл repeat, в противном случае – цикл while.

Цикл for (цикл со счетчиком) является детерминиро-

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

Синтаксист инкрементного цикла for имеет следующий вид:

for счетчик := НЗ to КЗ do begin

[операторы;] end;

Целочисленная1 переменная счетчик называется счетчиком цикла. Целочисленные выражения НЗ и КЗ определяют соответственно начальное и конечное значение счетчика. Если тело цикла состоит только из одного оператора, операторные скобки begin end указывать не обязательно.

Инкрементный цикл for работает следующим образом (см. блок-схему на рис. 4.2). При входе в цикл вычисляются целочисленные выражения НЗ и КЗ, и переменной счетчик присваивается значение НЗ. После выполнения очередной итерации цикла переменная счетчик автоматически увеличивается на единицу, затем счетчик сравнивается со значением КЗ. Если выполняется условие счетчик КЗ, тело цикла выполняется повторно, в противном случае происходит выход из цикла. Если НЗ > КЗ, тело цикла не будет выполнено ни разу.

1 Точнее говоря, переменная счетчик может быть любого порядкового типа, типы выражений НЗ и КЗ должны быть совместимы по присваиванию с типом переменной счетчик.

90