48180 (Приложения технологии языка программирования Паскаль в прикладной механике), страница 3
Описание файла
Документ из архива "Приложения технологии языка программирования Паскаль в прикладной механике", который расположен в категории "". Всё это находится в предмете "информатика" из 1 семестр, которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "курсовые/домашние работы", в предмете "информатика, программирование" в общих файлах.
Онлайн просмотр документа "48180"
Текст 3 страницы из документа "48180"
Пусть корабль может двигаться только по четырем направлениям: на север, на запад, на юг и на восток, то есть текущее направление движения определяется переменной типа Directions = (North, West, South, East);. Этому кораблю можно подавать приказы следующих типов: вперёд, назад, влево, вправо, то есть любой приказ задать переменной типа Orders = (Ahead, Back, Left, Right);. Пусть корабль двигался по направлению d1, после чего ему дали приказ p. Программа должна определить, в каком направлении корабль будет двигаться после выполнения приказа.
Program Ship;
type Courses = (North, West, South, East);
Orders = (Ahead, Back, Left, Right);
var d1, d2: Courses;
p: Orders;
i: integer;
s: string;
begin {Запрашиваем у пользователя информацию о курсе и приказе}
writeln('Введите первоначальный курс корабля ');
write('(0-север, 1-запад, 2-юг, 3-восток) ');
readln(i);
d1:=Courses(i);
writeln('Введите приказ, данный кораблю ');
write('(0-прямо, 1-назад, 2-влево, 3-вправо) ');
readln(i);
p:=Orders(i); {Определяем новый курс}
case p of
Ahead : d2:=d1;
Back : d2:=Courses((ord(d1)+2) mod 4);
Left : d2:=Courses((ord(d1)+1) mod 4);
Right : d2:=Courses((ord(d1)+3) mod 4); {-1 - нельзя, так как (Ord(North)-1) mod 4 = -1}
end; {Выводим результат на экран}
case d2 of
North : s:='север';
West : s:='запад';
South : s:='юг';
East : s:='восток';
end;
writeln('Теперь корабль движется на '+s);
readln;
end.
4. Ограниченный тип
Этот тип также рассмотрим на примере. Пусть в некоторой переменной нужно хранить текущее число, то есть номер дня в месяце. В Турбо Паскале можно задать тип DaysInMonth = 1..31;. Переменные и константы этого типа могут принимать только такие значения, если попытаться задать что-либо другое, то компилятор выдаст ошибку. В качестве границ могут употребляться и отрицательные числа, например Temperature = - 60..50;
В качестве базового типа (то есть типа, из которого выбирается диапазон значений) могут использоваться почти все порядковые типы, то есть те, которые хранятся в виде целых чисел. К порядковым типам относятся: все целые типы (byte, integer, и т. п.), char, boolean, перечисляемые типы и ограниченные типы. В качестве базового типа нельзя использовать лишь сам ограниченный тип (трудно представить, как это можно сделать). С учетом этого правила допустимы такие объявления типов:
type SmallLatin = 'a'..'z'; {малые латинские буквы}
MyBoolean = True..False; {хотя это и бессмысленно}
Holidays = Sat..Sun; {выходные}
Нельзя в качестве базового типа употребить какой-либо вещественный тип, следующее объявление приведет к ошибке:
type Wrong = -1.25..1.25;
Заметим, что функции Ord, Succ и Pred могут применяться к любым порядковым типам, и, в частности, к ограниченным.
Для вывода текста на экран используются две процедуры:
1. OutText(s: string). Эта процедура выводит строку s начиная с текущей позиции, то есть левый верхний угол выводимой строки находится в текущей позиции (по умолчанию это так). Текущая позиция задаётся, например, с помощью MoveTo.
2. OutTextXY(x,y: integer; s: string). Используется для вывода строки в конкретной позиции.
Если требуется вывести какие либо числа, то предварительно требуется преобразовать их в строку, например, с помощью процедуры Str.
Пример:
var r: integer;
s: string;
Str(r,s);
OutTextXY(100,200,’Результат=’+s);
Турбо Паскаль позволяет использовать несколько различных шрифтов для вывода текста. Кроме того, можно менять направление вывода текста, а также размер символов. В этих целях используется процедура SetTextStyle(Font, Direction, CharSize: word). Перечислим возможные константы и значения для параметров этой процедуры.
Font (шрифт):
DefaultFont (шрифт 8x8 (по умолчанию)
TriplexFont (полужирный шрифт);
SmallFont (тонкий шрифт);
SansSerifFont (шрифт без засечек);
GothicFont (готический шрифт);
Direction (ориентация и направление вывода символов):
0 (привычный вывод слева направо
1 (снизу вверх (надпись «положена на бок»)
2 (слева направо, но «лежачими» буквами.
Size (размер шрифта (целые числа от 0 до 10).
Другая возможность при работе с текстом (это выравнивание его относительно задаваемых координат вывода. Для этого используется процедура SetTextJustify(horiz,wert: word). Horiz указывет как текст расположен относительно заданной позиции по горизонтали, а vert (по вертикали. Возможные константы:
для horiz:
LeftText (указанная позиция является левым краем строки);
CenterText (позиция является серединой выводимой строки);
RightText (правым краем строки);
для vert:
BottomText (позиция находится на нижнем крае изображения);
CenterText (по центру);
TopText (позиция является верхним краем изображения);
Процедура (последовательность действий (записанных на Паскале), названная каким-либо именем. Для того чтобы выполнить эту последовательность, нужно в соответствующем месте программы указать её имя (так, например, для очистки экрана при работе с графикой мы указываем ClearDevice;). Кроме того, что программа становится при использовании процедур короче и понятнее, процедуры можно вызывать из разных мест программы (в противном случае пришлось бы повторять в тексте программы одинаковые последовательности действий несколько раз).
Те действия, которые входят в процедуру, записываются до начала основной программы в следующем виде:
program ...
const ...
type ...
var ...
procedure MyProc;
begin {действия}
end;
begin {основная программа}
end.
Рассмотрим пример нахождения максимума из трёх чисел:
Program Max1;
var a,b,c,m: integer;
begin
write('Введите a: '); readln(a);
write('Введите b: '); readln(b);
write('Введите c: '); readln(c);
if a>b then m:=a else m:=b;
if c>m then m:=c;
writeln('Максимум = ',m);
readln;
end. {Перепишем его с использованием процедуры:}
program Max2;
var a,b,c,m: integer;
procedure FindMax;
begin
if a>b then m:=a else m:=b;
if c>m then m:=c;
end;
begin
write('Введите a: '); readln(a);
write('Введите b: '); readln(b);
write('Введите c: '); readln(c);
FindMax;
writeln('Максимум = ',m);
readln;
end.
Этот вариант можно улучшить. Пока наша процедура может искать минимум только среди значений конкретных переменных a, b и c. Заставим её искать минимум среди любых трёх целых чисел и помещать результат в нужную нам переменную, а не всегда в m. Чтобы была видна польза от такой процедуры, рассмотрим пример программы для поиска максимума среди чисел a+b, b+c и a+c:
Program Max3;
var a,b,c,m: integer;
procedure FindMax(n1,n2,n3: integer; var max: integer);
begin
if n1>n2 then max:=n1 else max:=n2;
if n3>max then max:=n3;
end;
begin
write ('Введите a: '); readln(a);
write ('Введите b: '); readln(b);
write ('Введите c: '); readln(c);
FindMax (a+b,b+c,a+c,m);
writeln ('Максимум из сумм = ',m);
readln;
end.
В скобках после имени процедуры (в её описании) записаны так называемые параметры. Эта запись обозначает, что внутри процедуры можно использовать целые числа, обозначенные n1, n2 и n3, а также заносить значения в переменную типа integer, которая внутри процедуры называется max (а реально во время работы программы все действия производятся над переменной m). Параметры, в которых хранятся числа (n1,n2,n3) называются параметрами-значениями; а те, которые обозначают переменные (max) (параметрами-переменными, перед ними в описании ставится слово var. Параметры, на которые имеются ссылки внутри процедуры (n1, n2, n3, max), называются формальными, а те, которые реально используются при вызове (a+b, b+c, a+c, m) — фактическими.
Процедуры последнего вида оказываются достаточно удобными. Можно один раз написать такую процедуру, убедиться в её работоспособности и использовать в других программах. Примерами таких процедур являются процедуры для работы со строками, встроенные в Турбо Паскаль.
В нашем примере можно переписать программу и по-другому. Максимум из трёх чисел определяется по ним однозначно, или, говоря математическим языком, является функцией этих трёх чисел. Понятие функции есть также и в Паскале. Рассмотрим такую программу:
Program Max4;
var a,b,c,m: integer;
function Max(n1,n2,n3: integer) : integer;
var m: integer;
begin
if n1>n2 then m:=n1 else m:=n2;
if n3>m then m:=n3;
Max:=m;
end;
begin
write ('Введите a: '); readln(a);
write ('Введите b: '); readln(b);
write ('Введите c: '); readln(c);
writeln ('Максимум = ',Max(a+b,b+c,a+c));
readln;
end.
Нам уже известно как вызывать функцию из программы (например sqrt, sin и т. п.). Рассмотрим описание функции. Оно очень похоже на описание процедур, но есть два отличия:
1. После имени функции и списка параметров (если есть) через двоеточиезаписывается тип значения функции (возможны не только числовые типы, но и логические, строковые, символьные);
2. Среди операторов в теле функции наиболее важными являются операторы присваивания значения функции (в нашем случае это строчка Max:=m;).
В записанной выше функции используется так называемая локальная переменная m, то есть переменная, которая «видна» только нашей функции, а другие процедуры и функции, а также главная программа её «не видят». Кроме локальных переменных в Турбо Паскале можно определять локальные константы и типы.
Приведём другие примеры процедур и функций.
-
Напишем на Паскале функцию [pic].
function Cube(x: real): real;
begin
Cube:=x*x*x;
end;
2. Вычисление площади треугольника через длины сторон. Здесь будет
использована формула Герона: [pic], где p (полупериметр треугольника,
a, b, c (длины сторон).
function Square(a,b,c: real): real;
var p: real;
begin
p:=(a+b+c)/2;
Square:=sqrt(p*(p-a)*(p-b)*(p-c));
end;
3. Процедура для решения квадратного уравнения. Будем передавать этой процедуре коэффициенты уравнения, а результаты своей работы она будет выдавать в трёх параметрах-переменных. Через первую, логического типа, процедура сообщит, есть ли вещественные корни, а еще в двух она выдаст сами эти корни (если корней нет, то на эти две переменные пользователь нашей процедуры может не обращать внимания).
Procedure SqEquation(a,b,c: real; var RootsExist: boolean; var x1,x2: real);
var d: real;
begin
d:=sqr(b)-4*a*c;
if d>=0 then begin
RootsExist:=true;
x1:=(-b+sqrt(d))/(2*a);
x2:=(-b-sqrt(d))/(2*a);
end
else RootsExist:=false;
end;
Можно вместо процедуры написать и функцию, по логическому значению которой мы определяем, есть ли корни, а сами корни передаются также как и в процедуре:
Function EqHasRoots(a,b,c: real; var x1,x2: real) : boolean;
var d: real;
begin