Ostreykovsky_Laboratorny_praktikum_po_informa
.pdf'D', так как его код — 68, а при выполнении WriteLn(Ord('D')); — число 68, так как именно ему соответствует символ 'D'.
Переменная для хранения одного символа имеет тип char. Сим вольную константу в программе можно указать двумя способами: 'D' или #68. Первый способ удобнее использовать, когда символ легко ввести с клавиатуры.
Обрабатывать текстовую информацию удобнее более крупными частями. Строка символов в Паскале — это последовательность симво лов длиной от 0 до 255, ее тип имеет название String. Фактически — это массив, нулевой элемент которого содержит логическую длину строки. Если там находится #0, то считается, что строка пуста, если #20 — значит, в строке 20 символов. (Тип всех, в том числе и нулево го, элементов — char, поэтому перед 0 и 20 стоит знак #.) Физиче ская же длина строки задается при написании программы (по умолча нию — 255 байт под содержимое +1 байт, отвечающий за длину), на пример:
var
si: String; s2: String[10];
переменная si будет занимать в памяти 256 байт, a s2 — 11.
Доступ к каждому элементу аналогичен доступу к элементам мас сива:
имястроки[значение_индекса].
Процедуры для работы со строками (вызываются как отдельные операторы):
Ое1е1е(<Строковая_переменная>,<Позиция>,<Количество_символов>); — удаляет из строки указанное количество символов, начиная с указанной позиции.
1пзеЛ(<Исходная_строка>,<Строковая_переменная>,<Позиция>); — вставляет последовательность символов в строковую переменную.
8и-(<Число>,<Строковая_переменная>); — преобразует число в строку. После числа может стоять спецификация формата. Например, после выполнения оператора Str(f:7:3,s); при/ = -1,8 в строке s будет находиться '_—1.800'.
Уа1(<Строка>,<Численная_переменная>,<Код_результата>); — если строка содержит число, оно будет помещено в численную переменную и переменная «Код результата» будет равна 0. Если же при преобразо вании произойдет ошибка (будет обнаружен недопустимый в числе символ, например, буква), позиция ошибочного символа помещается в
120
переменную «Код результата». (Похожие действия автоматически вы полняются при вводе чисел с клавиатуры — ведь вводятся символы, а результатом должно стать число, но тогда при обнаружении ошибоч ного символа программа аварийно завершается).
Функции для работы со строками (должны быть частью выражений соответствующих типов):
Length(<cTpoKa>) — возвращает целое число — логическую длину строки.
Сору(<Строка>, <Позиция>, <Размер>) — возвращает подстроку из указанной строки.
Ро5(<Искомая_подстрока>,<Строка>) — возвращает число — пози цию первого вхождения подстроки в строку, или 0, если строка не со держит такую последовательность символов где-то внутри себя.
Запись (структура данных). Тип записи включает ряд компонент, называемых полями, которые могут быть разных типов.
Формат объявления типа записи:
Туре
<имя типа> = record <поле 1> :тип 1;
<поле N>: тип М
End;
Туре
Complex = record Re,Im: real;
End;
Data = record Yeanlnteger; Month: 1.. 12; Day: 1..31
End; Var
X,Y,Z:complex;
Spisok:array [1..100] of Data; Const
Birthday: Data =(Year:1971; Month:12; Day:9).
121
Доступ к полям записи осуществляется указанием имени перемен ной (константы) и имени поля через точку, например:
X.Re, Birthday.Day, Spisok[99].Year и т.д.
Чтобы упростить доступ к полям записи, используется оператор присоединения With:
With <переменная>00<оператор>.
Множества представляют собой ограниченный набор однотипных логически связанных друг с другом объектов. Характер связей между объектами лишь подразумевается программистом и никак не контро лируется Турбо Паскалем. Количество элементов, входящих в множе ство, может меняться в пределах от 0 до 256 ( возможно пустое мно жество). Именно непостоянством количества элементов множества от личаются от массивов и записей. Элементами множества могут быть значения скалярных типов byte и char.
Описание типа — множество имеет вид:
<имя типа>= SET OF <баз. тип> , где <баз. тип> — базовый тип элементов множества, в качестве которого может использоваться так же порядковый тип.
Пример определения и задания множеств: Туре
dgl = Set of '0'..'9'; mn2 = Set of Byte;
Var
si: dgl; s2: mn2;
Begin
si: = ['17273']; s2: = [0..3.6].
Два множества считаются эквивалентными, когда все их элементы одинаковы, причем порядок следования элементов безразличен.
Мощностью множества называется количество неповторяющихся элементов, входящих в него.
Над множеством определены следующие операции:
122
*— пересечение множеств, результат содержит элементы, общие для обоих множеств. Математическое обозначение S l n S 2 , логиче ское умножение.
+ — объединение множеств. Результат содержит все элементы первого множества, дополненные недостающими элементами из второго множества. Математическое обозначение SI u S2, логиче ское сложение.
разность множеств Математическое обозначение S3=S2\S1,
дополнение.
С& |
» |
Щ^2 |
Пересечение |
Объединение |
Разность |
= — проверка эквивалентности ; результат True , если множества эквивалентны.
о— проверка неэквивалентности.
<= и >= — проверка вхождения. Математическое обозначение S1 с S2, S1 содержится в S2 SK=S2.
IN — проверка принадлежности. Математическое обозначение Р € SI, P является элементом множества S1.
Ввод элементов множества с клавиатуры:
xl:=[ ]; {Задание пустого множества} For i:=l to 10 do
Begin Readln (a); xl: = xl + [a];
End.
Вывод множества на экран:
For i: = 1 to N do
If i in xl then Write(i: 4).
Файлы — средство связи с внешними источниками, приемниками и носителями информации.
Традиционно под файлом понимается поименованная совокупность данных на внешнем носителе, однако в ТР файлом считается также любое внешнее устройство (называемое логическим), по своему назна чению являющееся источником или приемником информации, напри мер клавиатура, дисплей, принтер и т.д.
С двумя файлами INPUT (текстовый файл, вводимый с клавиату ры) и OUTPUT (текстовый файл, выводимый на экран монитора и со держащий результаты работы программы) мы уже знакомы. Результа-
123
ты работы программы можно сохранить и отправить в файлы, записан ные на диски. В качестве источника данных могут также использо ваться файлы, записанные заранее на диски. Каждый такой файл дол жен иметь имя, а его тип должен быть объявлен в разделе VAR. Одно временно могут быть открыты несколько файлов, в ходе выполнения одной программы один и тот же файл может быть открыт для записи и впоследствии установлен на чтение. До начала операции ввода-выво да конкретному внешнему файлу должна быть поставлена в соответст вие переменная файлового типа. Затем файл необходимо открыть для чтения информации, записи информации или для чтения и записи со вместно.
В ТР определены три типа файлов: типизированные, нетипизированные и текстовые. В общем случае переменные типа FILE могут объявляться следующим образом:
Var <Имя файловой переменной> :File [of <Тип данных элемента>].
Если зарезервированное слово OF и параметр тип опущены, объяв ляемый файл является нетипизированным. Типизированные и нетипизированные файлы могут эксплуатироваться как в режиме последова тельного доступа, так и в режиме произвольного доступа, когда допус кается выборочное обращение к конкретным записям, которые задают ся их именами.
Формат объявления текстовых файлов, используемых только в ре жиме последовательного доступа:
Var <Имя файловой переменной> : Text; Примеры:
Туре
FF = Record Name: string[10]; Tele: word;
end; Var
Txtfile:text; Spisok: file of FF; SshFile.
Стандартные средства обработки файлов. Процедура Assign (Fl, ' ttt.pas') служит для связи файловой переменной F1 с некоторым фай лом ttt.pas, расположенным в текущем каталоге. В общем случае имя типа должно быть написано в соответствии с правилами MS DOS, мо жет включать путь и не должно превышать 79 символов.
124
Процедура Reset (F1) открывает существующий файл данных, имя которого перед этим было связано при помощи процедуры Assign с некоторой файловой переменной, указанной в процедуре RESET как параметр.
Если возможности открыть файл tttpas нет, то возникает ошибоч ная ситуация, подавить которую при выполнении можно, блокировав директивой компилятора {$1-} проверку ошибок ввода / вывода.
Процедура Rewrite (F1) создает новый пустой файл и присваивает ему имя, заданное процедурой Assign, и открывает его для записи или чтения. Если файл существует, его содержимое стирается, а сам файл открывается заново.
Процедура Append (F1), где F1 — имя файловой переменной по зволяет добавлять новые записи — строки в файлы, объявленные в программе как текстовые.
Процедура Close (F1) закрывает открытый ранее файл, связанный с указанной в качестве параметра файловой переменной.
Процедуры Rename (Fl, New) и Erase(Fl) позволяют переимено вать или стереть существующий файл с диска.
Функция Eof (End Of File) — позволяет в процессе считывания ин формации проверить, достигнут ли конец файла, т.е. находится ли ука затель файла за последним элементом или нет.
Процедура While not Eof (Fl) Do Read(Fl, X) будет выполнять счи тывание порций данных из файла, связанного с файловой переменной F1, до тех пор, пока файловый указатель не достигнет конца открыто го логического файла. Такая операция необходима при дополнении со держимого типизированных файлов, так как в противном случае дан ные, которые должны быть приписаны к концу файла, запишутся по верх уже существующих данных.
Функция SeekEof (Fl) — принимает значение TRUE, если указа тель установлен на признак конца файла EOF, во всех остальных слу чаях возвращается значение FALSE.
Функция IoResult предназначена для поиска ошибок, возникающих при работе с файлами. В следующем фрагменте программы выполня ется проверка корректности завершения ввода / вывода. Для этого бло кируются средства контроля компилятора за ошибками ввода / вывода, в противном случае неудачная попытка открытия файла приведет к прекращению работы программы
{$1-} {Отключение контроля ошибок ввода/вывода}.
Reset(Fl);
If IoResult о 0 Then Begin
Rewrite(Fl);{Co3flaHHe нового файла}
125
If IoResultoO Then Write ('Ошибка при создании файла');
end
Else {Если файл существует} While not Eof(Fl) do Read(Fl, X);
{Позиционирование указателя на конец файла} {$!+} {Включение контроля ошибок ввода / вывода}
Практическая работа
Работа № 1. Полный цикл работы с программой
Методика выполнения работы
1.Запустите интегрированную среду Паскаль (двойной щелчок ле вой кнопкой мышки на ярлыке Borland Pascal).
2.Смените при необходимости рабочий каталог, установленный по умолчанию:
File -> Change dir.
3. Откройте новое окно для записи текста программы: File —> New. Наберите в окне редактора следующую исходную программу, написан ную на языке Паскаль, предназначенную для вычисления корней квад ратного уравнения.
Program kwur; |
(*Имя программы*) |
Uses crt; |
{Использование библиотечного модуля CRT} |
Var a,b,c,d,w,z,xl,x2 :Real; {Объявление переменных} |
|
otvet:Char; |
|
Begin |
{Начало основного блока программы} |
Clrscr; |
{Очистка экрана} |
WriteLn ('Вы работаете с программой вычисления корней'); WriteLn ('квадратного уравнения общего вида ахх + Ьх + с = О'); Repeat {Начало цикла с постусловием} Write('BBeflHTe значение a'); ReadLn (а); {Ввод коэффициента а} If a=0 Then Writeln ('Уравнение не квадратное') Else
Begin
Write ('Введите значение b='); ReadLn (b); Write ('Введите значение с ='); ReadLn (с);
D: = b*b - 4*a*c; {Вычисление дискриминанта} Z:= -b/(2*a);
126
W:=sqrt(abs(d))/(2*a);
WriteLn ('При а=',а:5:2,' b=',b:5:2, ' c=',c:5:2); If D<0 then
Begin
WriteLn ('Xl= ', Z:6:3,' + j*',w:5:3); WriteLn ('X2= ', Z:6:3,' - j*',w:5:3);
End
Else
Begin xl: = z + w; x2: = z - w;
WriteLn ('xl=',xl:5:2,' x2=',x2:5:2);
End
End;
WriteLn ('Желаете продолжить работу? (y/n)'); Readln (otvet);
Until огуе:о'у';{Повторять, пока переменная otvet примет значе ние отличное от у}
WriteLn ('Спасибо! До свидания!'); End.
4.Используя команду Save пункта меню File, запишите набранную вами программу на диск под именем kwurl. Расширение указывать не обязательно. Откомпилируйте исходную программу <Alt> +<F9>. Ис правьте допущенные ошибки. Запустите программу на выполнение — <Ctrl>+<F9>.
5.Запишите в тетрадь 3 уравнения для тестирования программы. Решите их на калькуляторе и сравните результаты ваших вычислений
срезультатами решения уравнений на ЭВМ.
6.Окончание работы — выход из Паскаля: <Alt>+<X>.
Работа № 2. Выполнение вычислительных операци
Задание. Вычислить значения/>=lg(a+x2) + sin2 — , t-xa |
и |
|
|
W |
|
y = atgJ(a+x2) + J— |
при а = 0,59; z = -4,8; х = 2,\. |
|
a2 |
+x |
|
Методика выпонения работы
Program pr_2;
Uses crt;
Const a=0.59; z=-4.8; x=2.1;
127
Var у, р, с, t: real; Begin Clrscr; c:=Sin(x*x) /Cos (x*x);
y:=a*c*Sqr(c)+Sqrt(z*z/(a*a+x*x)); p:=(Ln(a+x*x))/Ln( 10)+Sqr(Sin(z/a)); t:=Exp(a*Ln(x));
Writeln('npH a=\ a: 4:2,' z=', z:4:l,' x=\ x: 3:1); Writeln ('p=\ p:9:4,' y=', y:9:4,' t=', t: 9:4); Readln
End.
Результаты вычислений: При a=0.59 z =-4.8 x =2.1
p =1.6217 у = 21.6350 t =1.5492
Работа №3. Пример использования арифметического цикла
Задание . Вывести на экран таблицу вычислений значений^ при из менении х о т а = - 5 д о Ь = + 5 с шагом h = 0.5 по соответствую щим формулам:
х+2 |
при х< -2 |
|
|
У = 2-х1 |
при-2<х<+2 |
\g(x) + ex при х>2
Определение числа повторов JV= (Ь - a)/h + 1 = (5 - (- 5))/0.5 + 1 = 21.
Методика выполнения работы
Program pr_3a;
Uses crt;{Подключение библиотечного модуля CRT} Var i:Integer; x,y:Real; {Описание переменных}
Begin Clrscr; Writeln ('Таблица'); {Вывод на экран шапки таблицы} Writeln('x у'); х: = -5;
For i: = 1 То 21 Do {Арифметический цикл} Begin
if x<-2 Then y:=l/(x+2) Else
if (x>= -2) And (x<=2) Then y:=2*Exp(3*Ln (x)) Else y:=Ln(x)/Ln(10)+Exp(x);
128
Writeln(x:7:2,y:10:4); x:=x+0.5; Readln;
End.
Выполнить вычисления примера № 2a, не используя оператора цикла. Переменная х принимает следующие значения: {- 5; - 8; 0,53; 11; 4,7; 0,88}.
Program pr_3b; Uses Crt; Label ml;
Const x:Array[1..7] Of Real={-5; - 8 ; 0,53; 11; 4,7; 0,88}; Var i:Integer; y:Real;
Begin Clrscr;
Writeln(' Т А Б Л И Ц А ' ) ; Writeln(' x y');
I:=l;
ml: If x[i]<-2 Then y:=l/(x[i]+2) Else
If (x[i]>=-2) And (x[i]<=2) Then y:=2*x[i] Else y:=Ln(x[i])/Ln(10)+Exp(x[i]); Writeln(x[i]:7:2,' ', y:12:4);
i:=i+l; If i<=7 Then Goto ml;
Readln;
End.
Результаты вычислений:
Т А Б Л И Ц А
x |
у |
-5.00 |
-0.3333 |
-8.00 |
-0.1667 |
0.531.0600
11.0059875.1831
4.70110.6193
0.881.7600
Работа №4. Использование оператора цикла while
Задание. Вычислить сумму членов бесконечного ряда с заданной точностью eps = 10"4 при х = 5.
129