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

Ostreykovsky_Laboratorny_praktikum_po_informa

.pdf
Скачиваний:
105
Добавлен:
07.06.2015
Размер:
7 Mб
Скачать

'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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]