Главная страница

Паскаль лекции. Лекции Паскаль. Программа на языке машинных команд (ее называют объектной). Краткое знакомство


Скачать 1.24 Mb.
НазваниеПрограмма на языке машинных команд (ее называют объектной). Краткое знакомство
АнкорПаскаль лекции
Дата14.01.2020
Размер1.24 Mb.
Формат файлаpdf
Имя файлаЛекции Паскаль.pdf
ТипПрограмма
#104006
страница6 из 7
1   2   3   4   5   6   7
Процедура Write записывает данные в текущую строку. Если надо записать данные и перейти к следующей строке, то можно использовать процедуру Writeln. Если требуется только перейти для записи на новую строку, то применяется процедура Writeln(<имя файловой переменной текстового файла>); которая записывает в файл признак конца строки и устанавливает файловый указатель на начало следующей строки.
Так как в строках может быть разное количество символов, имеется логическая функция Eoln(<имя файловой переменной текстового файла>), которая принимает значение True, если достигнут конец строки.
Процедура Append(<имя файловой переменной текстового файла>). Она открывает файл для «дозаписи», помещая файловый указатель в конец файла.
PDF created with pdfFactory Pro trial version www.pdffactory.com

82
Пример : Дан текстовый файл, содержащий только целые числа, в каждой строке может быть несколько чисел, которые разделяются пробелами. Вывести на экран все числа с учетом разбиения на строки и подсчитать количество элементов в каждой строке.
Решение: Пусть в файле содержится следующая информация:
-32 16 0 8 7 4 5 9 13 11 -5 -8 6 -8 0 -12 5 4 3 2 1 12 1 2
Этот файл можно создать в среде Турбо Паскаль следующим образом:
 создайте новый файл посредством команды New меню File;
 запишите все числа, разделяя их пробелами, и разбейте на строки, как указано в задании;
 сохраните файл, например, под именем INT1.DAT
 теперь напишем программу program rrr; var f : text; x, k: integer; begin
Assign(f,’int1.dat’);
Reset(f);
While Not Eof(f) do {
пока не достигнут конец файла} begin k:=0;
While Not Eoln(f) do {
пока не достигнут конец строки} begin read(f,x); {
считываем очередное число} write(x,’ ‘); {
выводим его на экран}
Inc(k); {
увеличиваем счетчик} end; writeln(‘
в строке’, k, ‘ элементов’);
Readln(f) {
переходим к следующей строке файла} end;
Close(f); end.
Пример. Записать двумерный массив вещественных чисел 5х4 в тестовый файл.
PDF created with pdfFactory Pro trial version www.pdffactory.com

83
Program mas; const m=5; n=4;
Var fil : text; a: real; s: char; i,j : integer; begin
Assign(fil,’massiv.txt’);
Rewrite(fil); for i:=1 to m do begin for j:=1 to n do begin a:=random(100); write(fil,a:5:3,’ ‘); {
число записывается в файл в указанном формате, за ним пробел} end; writeln(fil); {
переход в файле на новую строку} end;
Close(fil);
{
Чтение файла и вывод матрицы на экран по строкам}
Reset(fil); {
открытие уже имеющегося файла} while not Eof(fil) do begin while not Eoln(fil) do begin read(fil,a); {
чтение числа} write(a:5:3); read(fil,s); { чтение пробела после числа} write(s); end; writeln; readln(fil); end;
Close(fil); end.
Пример. Дан текстовый файл f. Переписать в файл g все компоненты исходного файла f в обратном порядке. program tofile; var f, g : text;
PDF created with pdfFactory Pro trial version www.pdffactory.com

84
n, i, j : integer; s : string; x : array [1..32000] of char; begin assign(f,’f.txt’); assign(g,’g.txt’); rewrite(g); rewrite(f); writeln(‘
Введите число строк в создаваемом вами файле ‘); readln(n); writeln(‘
вводите строки, после введения каждой нажмите Enter’); for i:=1 to n do begin readln(s); write(f,s); end; reset(f); i:=0; writeln(‘
Исходный файл :’); while(not eof(f)) and (i<32000) do begin i:=i+1; read(f,x[i]); write(x[i]); end; writeln; writeln(‘
Измененный файл :’); for j:=i downto 1 do begin write(g,x[j]); write(x[j]); end; writeln; close(f); close(g); end.
Задача. Дан текстовый файл. Вставить в начало каждой строки ее номер и записать преобразованные строки в новый файл.
Задача. Даны два текстовых файла. Записать в третий файл только те строки, которые есть и в первом, и во втором файлах.
§22.
Множества
Множество в Паскале представляет собой набор различных элементов одного (базового) типа.
Базовый тип - это совокупность всех возможных элементов множества.
Всего в базовом типе должно быть не более 256 различных элементов.
Значение переменной множественного типа может содержать любое количество различных элементов базового типа - от нуля элементов (пустое множество) до всех возможных значений базового типа
PDF created with pdfFactory Pro trial version www.pdffactory.com

85
Множества, используемые в программе, могут быть описаны либо в разделе Type:
Type <
имя типа> = Set Of <тип элементов>;
Var <
имя множества> : <имя типа>;
Либо непосредственно в разделе описания переменных Var:
Var <
имя множества> : Set Of <тип элементов>;
Пример.
Type mnog_Char=Set Of Char;
Var mn1 : Set Of Char; mn2 : mnog_Char; mn3 : Set Of ‘A’..’Z’; s1 : Set Of Byte; s2 : Set Of 1000..1200;
Здесь mn1 и mn2 - это множества символов; так как различных символов всего 256, то тип Char можно использовать в качестве базового; mn3 - множество больших латинских букв; s1 - множество целых чисел (от 0 до 255); так как тип Byte содержит только целые числа от 0 до 255, его тоже можно использовать в качестве базового типа элементов; s2 - множество целых чисел от 1000 до 1200.
Формирование (конструирование) множеств. В программе элементы множества задаются в квадратных скобках, через запятую. Если элементы идут подряд друг за другом, то можно использовать диапазон.
Пример Type digit = Set Of 1..5;
Var s : digit;
Переменная s может принимать значения, состоящие из любой совокупности целых чисел от 1 до 5;
[ ] - пустое множество;
[1], [2], [3], [4], [5] - одноэлементные множества;
[1,2], [1,3], ...., [2,4], [4,5] - двухэлементные множества (пара любых элементов);
[1,2,3], [1,2,4], ... , [3,4,5] - трехэлементные (тройка элементов);
[1,2,3,4], [1,2,3,5], [1,2,4,5], [1,3,4,5], [2,3,4,5] - четырехэлементные;
[1,2,3,4,5] - полное множество (взяты все элементы базового типа).
Операции над множествами
PDF created with pdfFactory Pro trial version www.pdffactory.com

86
Объединение двух данных множеств называется множество элементов, принадлежащих хотя бы одному из этих множеств. Знак операции объединения множеств - «+».
A B A+B
Примеры
1) [‘A’, ‘F’] + [‘B’, ‘D’] = [‘A’, ‘F’, ‘B’, ‘D’];
2) [1..3, 5, 7, 11] + [3..8, 10, 12, 15..20] = [1..8, 10..12, 15..20]
Пусть S1:=[1..5, 9], a S2:=[3..7, 12]. Тогда если S:=S1 + S2, то S=[1..7, 9, 12].
Пусть А1:=[‘a’..’z’]; A1:=A1 = [‘A’]. Тогда A1=[‘A’, ‘a’..’z’].
Пересечением двух множеств называется множество элементов, принадлежащих одновременно и первому, и второму множеству. Знак операции пересечения - «*».
А B A*B
Примеры.
1) [‘A’, ‘F’] * [‘B’, ‘D’] = [ ] , так как общих элементов нет;
2) [1..3, 5, 7, 11] * [3..8, 10, 12, 15..20] = [3, 5, 7];
3) если S1:=[1..5, 9] и S2:=[3..7, 12], a S:=S1 * S2, то S=[3..5].
Разностью двух множеств называется множество, состоящее из тех элементов первого множества, которые не являются элементами второго.
Знак операций вычитания множеств - «»
A B A-B
Примеры.
[‘A’, ‘F’] - [‘B’, ‘D’] = [‘A’, ’F’ ] , так как общих элементов нет;
[1..3, 5, 7, 11] - [3..8, 10, 12, 15..20] = [1, 2, 11]; если S1:=[1..5, 9] и S2:=[3..7, 12], a S:=S1 - S2, то S=[1, 2, 9];
A1:=[‘A’..’Z’]; A1:=A1 - [‘A’].
Тогда А1=[‘B’..’Z’].
PDF created with pdfFactory Pro trial version www.pdffactory.com

87
Операция определения принадлежности элемента множеству
Эта логическая операция обозначается служебным словом in. Результат операции имеет значение true, если элемент входит в множество, и false в противном случае.
Примеры.
1.
Выражение 5 in [3..7] имеет значение true, так как 5  [3;7]
2.
Выражение ‘a’ in [‘A’..’Z’] имеет значение false, так как маленькой латинской буквы «а» нет среди больших латинских букв.
Сравнение множеств
Для сравнения множеств используются операции отношения:
= - проверка на равенство (совпадение) двух множеств;
<> - проверка на неравенство двух множеств;
<=, < - проверка на вхождение первого множества во второе множество;
>=, > - проверка на вхождение второго множества в первое множество.
Первое множество меньше или равно второму (AB)
B A B A B A true false true
Первое множество меньше второго (A B
B A B A A true false false
Пример. Составить программу выделения следующих множеств из множества целых чисел от 1 до 30 :
- множества чисел, кратных 2;
PDF created with pdfFactory Pro trial version www.pdffactory.com

88
- множества чисел, кратных 3;
- множества чисел, кратных 6;
- множества чисел, кратных 2 или 3;
Вопросы для обсуждения :
1.
Сколько множеств надо описать? (Каков тип их элементов? (четыре множества с элементами типа Byte).
2.
Каково начальное значение множеств ? (начальное значение множеств - пустое множество).
3.
Как формируются множества? (Первые два формируются перебором всех чисел данного промежутка и отбором подходящих, а третье и четвертое получаются из первых двух путем применения операции пересечения или объединения).
4.
Как осуществить вывод сформированных множеств? (Вывод множеств производится ТОЛЬКО поэлементно, поэтому удобно составить процедуру и передавать в нее множество, элементы которого и будут выводить на экран.
Для этого в разделе типов надо создать соответствующий тип и использовать его в дальнейшем).
Program mnog; const n=30; type mn=Set Of 1..n; var n2, n3, n6, n23 : mn; k : integer; procedure print(m: mn); var i: integer; begin for i:=1 to n do if i In m then write(i:3); writeln; end;
BEGIN n2=[ ]; n3=[ ]; for k:=1 to n do begin
{
если число делится на 2, то заносим его в n2 } if k Mod 2 = 0 Then n2:=n2+[k];
{
если число делится на 3, то заносим его в n3 }
if k Mod 3 = 0 Then n3:=n3+[k]; end;
{
числа, кратные 6, - это те, которые кратны и 2 и 3, поэтому это пересечение двух множеств, а числа, кратные 2 или 3, - это объединение этих же множеств}
PDF created with pdfFactory Pro trial version www.pdffactory.com

89 n6:=n2*n3; n23:=n2+n3; writeln(‘
числа, кратные 2’); print(n2); writeln(‘
числа, кратные 3’); print(n3); writeln(‘
числа, кратные 6’); print(n6); writeln(‘
числа, кратные 2 или 3’); print(n23);
END.
Пример 2. Если взять то общее, что есть у боба с ложкой, добавить кота и поместить в тепло, то получится муравей. Так ли это ? program bob; var y1, y2, y3, y4, x : Set Of Char; s : Char;
BEGIN y1:=[‘
б’, ‘о’, ‘б’]; y2:=[‘л’, ‘о’, ‘ж’, ‘к’, ‘а’]; y3:=[‘
к’, ‘о’, ‘т’]; y4:=[‘т’, ‘е’, ‘п’, ‘л’, ‘о’]; x:=(y1*y2) + y3 - y4; writeln(‘
множество х’); for s:=’a’ to ‘
я’ do if s In x then write(s); writeln;
{
проверка: состоит ли муравей из кота} if y3<=x then write(‘
муравей состоит из кота’) else write(‘
муравей не состоит из кота’);
END.
Пример 3. Дан ребус МУХА + МУХА = СЛОН
Каждой букве соответствует некоторая цифра, разным буквам соответствуют разные цифры. Необходимо заменить буквы цифрами так, чтобы получить верное равенство.
Для решения этой задачи применим метод перебора с возвратом.
Используем множество S1 для хранения цифр слова МУХА, причем будем заносить в него цифры последовательно, учитывая уже внесенные цифры.
Начальное значение S1 - пустое множество. После выбора всех цифр первого слова формируем соответствующее число и находим число, соответствующее слову СЛОН. Выделяем цифры СЛОНа (множество S2), и если слова состоят из различных цифр (то есть пересечение S1 и S2 пустое) и все цифры СЛОНа разные, то выводим решение на экран. Далее удаляем из множества S1 последнюю внесенную цифру и пытаемся выбрать еще одно ее значение.
Таким образом, мы перебираем все возможные варианты и выводим на экран только те, которые удовлетворяют равенству.
Заметим, что букве «М» в слове МУХА может соответствовать цифра от 1 до 4, а букве «А» в этом же слове не может соответствовать 0.
PDF created with pdfFactory Pro trial version www.pdffactory.com

90
Program myxa; type mn=Set Of 0..9; var m, y, x, a : 0..9; {
цифры числа МУХА} n1, n2 : integer; {
числа МУХА и СЛОН} a1, a2, a3, a4 : 0..9; {
цифры числа СЛОН}
S1, S2 :mn; procedure Print(x,y:integer); {
вывод решения в виде ребуса } begin writeln(x:5); writeln(‘+’); writeln(x:5); writeln(‘____’); writeln(y:5); end;
BEGIN s1:=[ ]; s2:= [ ]; for m:=1 to 4 do begin s1:=s1+[m]; { заносим первую использованную цифру} for y:=0 to 9 do {
если это цифра не была еще взята, то добавляем ее во множество цифр числа МУХА и выбираем цифру для следующей буквы } if Not (y In s1) then begin s1:=s1+[y]; for x:=0 to 9 do if Not (x In s1) then begin s1:=s1+x; for a:=1 to 9 do if Not (a In s1) then begin s1:=s1+[a]; n1:=1000*m+100*y+10*x+a; n2:=2*n1; a1:=n2 div 1000; a2:=n2 div 100 mod 10; a3:=n2 div 10 mod 10; a4:=n2 mod 10; s2:=[a1,a2,a3,a4]; if (s1*s2=[]) and ([a1]*[a2]*[a3]*a[4]=[]) then Print(n1,n2); s1:=s1-[a]; end; s1:=s1-[x];
PDF created with pdfFactory Pro trial version www.pdffactory.com

91 end; s1:=s1-[y]; end; s1:=s1-[m]; end;
END.
§23.
Комбинированный тип данных
(
записи)
При использовании массивов основное ограничение заключается в том, что все элементы должны иметь один и тот же тип. Но при решении многих задач возникает необходимость хранить и обрабатывать совокупность данных различного типа.
Пусть известны фамилии и оценки (в баллах) по пяти дисциплинам каждого из двадцати пяти учеников класса. Требуется вычислить среднюю оценку каждого из учеников и выбрать человека, имеющего максимальный средний балл.
В данном случае фамилия может быть представлена символьной строкой, оценки - это целые числа, а средний балл должен быть представлен вещественным числом. В Паскале для описания объектов, содержащих данные разных типов, используются записи.
Запись - это структурированный тип, описывающий набор данных разных типов. Составляющие запись объекты называются ее полями. Каждое поле имеет уникальное (в пределах записи) имя. Чтобы описать запись, необходимо указать ее имя, имена объектов, составляющих запись, и их типы.
Общий вид описания записи :
Type <
имя записи> = Record
<
поле 1> : <тип 1>;
<
поле 2> : <тип 2>
<
поле n> : <тип n>
End;
Применительно к рассматриваемой задаче запись можно описать так :
Type pupil = Record fam : string[15]; {
поле фамилии} b1,b2,b3,b4,b5 : 2..5; {
поля баллов} sb : Real {
средний бал}
PDF created with pdfFactory Pro trial version www.pdffactory.com

92
End;
Чтобы хранить в памяти ЭВМ информацию обо всех 25 учениках класса, необходимо ввести массив klass - массив записей.
Var klass : array[1..25] Of pupil;
Доступ к полям записи можно осуществить двумя способами:
1.
С указанием имени переменной и имени поля. Например, klass[2].fam, klass[3].sb, klass[1].b4
Ввод фамилий и оценок учащихся, т.е. элементов массива klass, можно записать так: for i:=1 to 25 do begin readln(klass[i].fam); readln(klass[i].b1); readln(klass[i].b2); readln(klass[i].b3); readln(klass[i].b4); readln(klass[i].b5); end;
2.
С использованием оператора присоединения.
Имеется возможность осуществлять доступ к полям записи таким образом, как если бы они были простыми переменными. Общий вид оператора присоединения:
With <
имя записи> Do <оператор>;
Внутри оператора присоединения к компонентам записи можно обращаться только с помощью имени соответствующего поля.
Пример for i:=1 to 25 do
With klass[i] do begin readln(fam); readln(b1,b2,b3,b4,b5); end;
Программа для решения рассматриваемой задачи может быть записана следующим образом: program zap;
Type pupil = Record fam : string[15]; {
поле фамилии}
PDF created with pdfFactory Pro trial version www.pdffactory.com

93 b1,b2,b3,b4,b5 : 2..5; {
поля баллов} sb : Real {
средний бал}
End;
Var klass : array[1..25] Of pupil; p: pupl; i,m : integer; sbmax : real; begin for i:=1 to 25 do with klass[i] do begin writeln(‘
Введите фамилию и пять оценок’); readln(fam); readln(b1,b2,b3,b4,b5); end; for i:=1 to m do {
вычисление среднего балла} with klass[i] do sb:=(b1+b2+b3+b4+b5)/5; sbmax:=0;
{ поиск максимального среднего балла} for i:=1 to m do if klass[i].sb>=sbmax then sbmax:=klass[i].sb; for i:=1 to m do {
печать результатов} if klass[i].sb=sbmax then with klass[i] do writeln(fam:20,’ - ‘, sb:6:3); end.
Пример. Определите дату завтрашнего дня.
Чтобы определить дату завтрашнего дня, надо знать не только дату сегодняшнего дня, но и количество дней в данном месяце (так как если это последний день месяца, то завтра будет первый день следующего), кроме того, надо знать, какой год - високосный или нет.
Пусть дата вводится в формате число - месяц - год следующим образом:
1 2 1997
Опишем запись для хранения даты таким образом:
Type year=1500..2000; month=1..12; day=1..31; data = Record y : year; m : month; d : day;
PDF created with pdfFactory Pro trial version www.pdffactory.com

94
end;
Заметим, что :
 если дата соответствует не последнему дню месяца, то год и месяц не изменяются, а число увеличивается на 1;
 если дата соответствует последнему дню месяца, то : а) если месяц не декабрь, то год не изменяется, месяц увеличивается на 1, а число устанавливается в 1; б) если месяц - декабрь, то год увеличивается на 1, а месяц и число устанавливаются в 1.
Program datanext;
Type year=1500..2000; month=1..12; day=1..31; data = Record y : year; m : month; d : day; end;
Var dat, next : data;
Function leap(yy:year):boolean; {
функция определяет високосный ли год} begin leap:=(yy Mod 4=0) And (yy Mod 400 <>0); end;
Function Dmonth(mm:month; yy : year) : day; {
функция определения количества дней данного месяца в данном году} begin case mm of
1,3,5,7,8,10,12: Dmonth:=31;
4,6,9,11 : Dmonth:=30;
1   2   3   4   5   6   7


написать администратору сайта