Реферат Курсовая Конспект
Информатика - раздел Информатика, Информатика ...
|
Program Ex2_1;
Var
S:String;
I,k:Byte;
C:char;
Begin
Write(‘s=’);Readln(s);
Write(‘c=’);readln(c);
Del_sp_l(s);
If s[1]=c then k:=1;
Else k:=0;
For i:=2 to length(s) – 1do
If s[i]=’ ’ and s[i+1]=c then
Inc(k);
Writeln(‘k=’,k);
End.
Record
Re:real;
Im:real;
End;
Var x,y:Compl;
x:=3.2+i1.4;
x.Re:=3.2;
y.Im:=1.4;
y:=x;
Пример//вычеслить сумму разность и т.п в комплексном пространестве .
Var x,y,u,v,w:Compl;
Begin
Readln(x.re,x,im);
Readln(y.re,y.im);
u.re:=x.re+y.re;
u.im:=x.im+y.im;
v.re:=x.re – y.re;
v.im:=x.im – y.im;
w.re:=x.re*y.re – x.im*y.im;
w.im:=x.re*y.im+y.re*x.im;
End.
Оператор присоеденения
With r1,r2,… do s;
With r1 do with r2 do
Индитификатор поля в операторе присоеденения обозночает компоненту комбинированной переменной из ближайшего объемлющего оператора присоединения, в котором указана переменая с таким полем. При определении комбинированого типа, имена отдельных полей могут совпадать с именам переменных, но при этом в частичной – переменной записи указываеться и имя этой переменной записи.
Вариантная запись
Запись может иметь вариантную часть, чтобы в пределах одного типа задать несколько различных структур, непосредственный выбор структуры будет определеяться контекстом или каким либо сигнальным значением. Вариантные поля указываются после того, как указаны фиксированные поля. Уточним описание:
<список полей>:=<постоянное поле>|<вариантное поле>
Вариантное поле по структуре похож на оператор выбора:
case <селектор>:<тип селектора> of <элементы списка вариантов>
Точное описание смотри в GOOGLE.
Пример:
Type Rec_Type=
Revord
Dlina:byte;
case mera_Dl: char of
‘д’,’Д’:(Inches:Word);
‘с’,’С’:(Santimeters:LongInt);
‘?’:(Comment1,Comment2:string)
End;
// в данном примере два фиксированных поля: длина и мера длины в зависимости от меры длины будут разные наборы для record
Операции над множествами
Это двуместные операции, операндами которых являються константы переменные или выражения множественного типа
A:=[1,2,3,4,5]
B:=[2,5,6,7,8]
C:=A+B; {[1..8]}
C:=A*B; {[2,5]}
C:=A – B; {[1,3,4]}
Приоретет операций над множествами анологичен приоретету арифмитических операций. >_<
Операции отношения
математческая запись || паскаль
А=В||A=B
A!=B||A<>B
В включено в А||A>=B
X принадлежит А||A in B
Результатом этих операций будет true or false
Примеры
Ввести два множества малых латинских букв. Получить их объеденение, пересечение и разность. Признаком конца ввода являеться *.
Program Ex_23;
Type
Letters=’a’..’z’;
Set_Let=Set of Letters;//множество
var A,B,C:Set_Let;
Procedure In_set(var D:Set_let);
Var
c:char;
Begin
D:=[];
Readln(c);
while (c<>’*’) do
Begin
if c in [‘a’..’z’] then
d:=d+[c];
Readln(c);
End;
End;
Procedure Out_set(D:set_let);
Var
c:Letters;
Begin
for c:=’a’ to ‘z’ do
If c in D then
Write(c);
End;
Begin
write(‘A=’);In_set(a);
write(‘B=’);In_set(b);
c:=a – b;
write(‘A – B’); Out_Set(c);
Etc.
End.
Какие символы есть в строке.
Program Ex_24;
Var
s:string;
a:set of char;
c:char;
Begin
Readln(S);
for i:=1 to length(s) fo
A:=A+[s[i]];
out_let(a);//эта функция выводит все символы только от а до z там изменить
End.
Получить все простые числа из диапозона 2n.
Для решения задачи вопользуемся вариантом метода решето Эратосфена. В одно множество помещаем очередное простое число, а из другого множества, где содержатья все числа извлекаем его и кратные ему числа.
Суть алгоритма нашел число и удалил его делители.
Program Ex_25;
Const
N=201;
Type Nat=1..N;
Set_Nat=Set of Nat;
Var
Num,Pr_Num:Set_nat;
p,k:Nat;
Begin
num:=[2..n];
pr_num:=[];
p:=2;
Repeat
While not(p in num) do
p:=p+1;
pr_num:=pr_num+[p];
k:=p;
Repeat
num:=num – [k];
k:=k+p;
until k>n;//иногда может срабатывать и на равенство
until num=[];
for k:=2 to n do
If k in pr_num then
write(k:4);
End.
Дано предложение, вы вести кол – во вхождение каждого из используемых символов
Процедуры для работы с файлами
Read(f,x);
write(f,’ ‘);
assign(f,’input.txt’);
reset(f) –для чтения
rewrite(f) –для записи
Close(f);
rename(f,’output.txt’);
Erase(f) – delete
EOF –конец строки
Var
s:string;
f:text;
Begin
assign(f,’ex_27.pas’);
Reset(f);
While not EOF(f) do
Begin
Readln(f,s);
Writeln(s);
End;
Close(f);
End;
Типизированные файлы
File of <тип компонент> –т.е любой тип, кроме типа файл. При работе с файлом есть два этапа: создание и использование файла. Эти два этапа могут быть реализованы, как в разных программа так и в одной
Program ex_28;//создать файл целых чисел из диапозона m n
Var
i,m,n:integer;
f:file of integer;
Begin
assign(f,’Int.dat’);
Rewrite(f);
write(‘M=’);readln(m);
write(‘N=’);readln(n);
for i:=m to n do
Write(f,i);
Close(f);
End.
IOResult –возварщаетусловный признак последней операции ввода вывода. Если опреация завершилась успешно то выдаст 0. Функйия IOResultдоступна только при отключонном контроле ошибок ввода вывода {$I – } – off {$I+} – onавтоконтроль. Если автоконтроль отключен, а операция ввода – вывода привела к ошибке, устанавливаеться флаг ошибки и последующие обрашения к вводу выводу блокируються пока не будет вызвана функция IOResult.
Program ex_29;//по значениям целых чисел из файла int.dat получить вещественный файл //Re.dat удваивая каждую компоненту
Var
k:integer;
x:real;
f:file of integer;
g:file of real;
Begin
assign(f,’Int.dat’);
{$I – }
Reset(f);
{$I+}
if IOResult=0 then
Begin
assign(g,’re.dat’);
Rewrite(g);
While notEOF(f) do
Begin
Read(f,k);
x:=k*2.;
Write(g,x);
End;
Close(f);
Close(g);
Reset(g);
While notEOF(g) do
Begin
Read(g,x);
write(x:6:1);
End;
Writeln();
End
Else
Begin
writeln(‘Error:’,IOResult);
End;
End.
Некоторые коды ошибок ввода – вывода:
2 – файл 404
3 – путь 404
4 – слишком много открытых файл
100 – ошибка чтения диска, поптыка чтения из полностью прочитанного файла.
101 – ошибка записи на диск
102 – файлу не присвоено имя
103 – файл не открыт
Безтиповые файлы, операции ввода – вывода
Стандарт паскаля, вводит особый файловый тип являеться по сути, обобщенным файловым типом, который будем называть безтиповым файлом.
Var
f:file;
Безтиповый файл – это мощное средство обработки, так как позволяет манипулировать данными незадумываясь об их типе. С его помощью можно записывать на диск произвольные участки оперативной памяти и считываться их с диска. Можно так – же преобразовывать данные безтипового файла в любой формат посредствам приведения типов. Ввод – вывод для безтиповых файлов осуществляеться специальными процедурами: BlockRead and BlockWrite.Кроме этого расширяеться синтаксис процедур:
ReSet(var f:file; BufSize:word);
ReWrite(var f:file; BufSize:word);
BufSize – задает число байтов, обрабатываемых за одно обращения, чем больше тем лучше. Минимальный блок который может быть записан или прочитан 1 байт. Максимальный размер 64к.
Program std;
Type
TEL=integer;
TFile=file of TEL;
Var
l:integer;
f:Tfile;
Procedure Out_File(var g:TFile);
Var
x:TEL;
Begin
Reset(g);
While not EOF(g) do
Begin
Read(g,x);
write(x:3);
End;
Writeln();
End;
Procedure Ins_Field(var g:TFile; R:TEL);
Begin
Seek(g,FileSize(g));
Write(g,R);
End;
Procedure DelField(var g:TFile; k:integer);
Var
N,i:Integer;
x:TEL;
Begin
N:=FileSize(g);
if k<=N then
Begin
for i:=k to N – 1 do
Begin
Seek(g,i); read(g,x);
seek(g,i – 1); write(g,x);
End;
Truncate(g);
End;
End;
procedure MakeFile(var f:TFile);
Begin
Rewrite(f);
Write(f,1,2,3,4,5);
Close(f);
End;
Begin
assign(f,'in.txt');
MakeFile(f);
Reset(f);
Out_File(f);
DelField(f,2);
Out_File(f);
Close(f);
End.
Модули
Модуль Unitв турбопаскале – это специальным образом оформленная библиотека определений, типов, констант, переменных, а так – же процедур и функций. Модули в отличии от программы не может быть запущен на выполнение самостоятельно он может только учавствовать для построения программы или другого модуля. В отличии от фрагментов текстов программ подключаемых к программе при компиляции дерективы {$I имя файла} модуль предварительно компилируться независимо от программы.
Результат компиляции модуля являеться файл с расширением .TPV. Для подключения модуля к программе его имя необходимо указать в дерективе Uses.
При программирование возможность модульного построения особенно полезно при создании собственных библиотек, процедур и функций, которые в последствии могут подключаться к разным программам, не требуя никаких переделок.
Общая структура модуля:
Unit имя модуля
Interface {начало раздела объявлений}
Uses …//раздел поключений других модулей
Сonst
Type
Var
Заголовки процедур и функций
Implementation {раздел реализации}
Uses…//модули используемые при реализации
Const
Type
Var
Описание процедур и функций
Begin
End.
Все блоки соствеляющие эти разделы являються необезательными и могут опускаться, так и повотряться неоднократно. Если не вводиться раздел инициализации, то beginне указываеться.
Заголовок модуля определят имя, по которому модуль будет подключаться к другим программам. Имя должно быть уникально и соответствовать именю файла *.pas, хранящий исходный код модуля, а после компиляции модуль с расширением *.TPV
Раздел реализации состоит, как правило, из тела процедур и функций описанных в разделе объявлений. В разделе реализации могут быть введены свои типы, константы и пременные, они будут глобальными но относительно к подпрограмма этого раздела. В разделе реализации могут описываться подпрограммы, которые учавствуют в работе объявления процедур и функций, но сами не являющиеся объявленными. Обычно в разделе реализации происходит заполнение стартовыми значениями библиотечных переменных и выполнються одноразовые действия, обязательные в начале программы.
Система библиотечных модулей
В турбо паскале определен ряд стандартных модулей, они обеспечивают функции ввода – вывода, работу со строками, управление экраном, работу с принтером и т.п
SYSTEM.TPVвключает все стандартные функции объявленные в стандартном паскале(по сути sin, cos and etc).
соответствующие
DOS.TPVсодержит стандартные процедуры для работы с функциями операционной ситемы
CRT.TPVбиблиотека для работы с клавиатурой и диспелеем
Program CodeKey;
Var
cc:char;
cr:byte;
Begin
Repeat
cc:=readKey;
cr:=Ord(cc);
writeln(cc,’ – >’,cr);
until cr=27;
End;
Модуль Graph
Представляет собой библиотеку процедур управления графияескими режимами. Для работы в графическом режиме необоходимо инициализировать графику поцедруой InitGraphс соответвующими параметрами, один из которых путь к файлам .BGI, яркий пример инициализации графика будет приведм на пратике.
Type
TArr1=Array[1..100] of integer;
Ref_Arr:^TArr1;
Var
p:^Integer;
q:^real;
RMass:Ref_Arr;
Связь указателя с объектом
указатель |
объект |
Существует Nil,который не связывает никакой объект. При описании ссылочной переменной, она не указывает ни на какой объект, и даже не имеет значение Nil.Таким образом описание указателя вводит в употребление переменную, но не определяет никакого программного объекта на который будет указываеть, значение ссылочной пременной. Для пораждения динамического объекта служит процедура New(указатель)в которой задаеться указатель сопостовляемая порождаемому динамическому объекту. Обратим внимание на то, что этому объекту не присваиваеться какое – либо значение, т.е процедура Newдля динамического объекта играет туже роль,что и описание для статического объекта. Для того, чтобы извлечь значение хранящиеся по некоторому адресу используеться унарная операция «^» – разименование. <имя_указателя>^;
Var
p:^integer;
…
New(p);
p^:=123;
Переменная с указателем, может использоваться в любых конструкциях языка, где допустимо использование переменных данного типа.
Операции над указателями
Допускаеться только «:=» и две операции сравнения: = && <>
v=e;где е ссылочное выражение, которая задает ссылочное значение того – же типа, что и переменная v. В качестве ссылочного выражения,могут использоваться:Nill,ссылочная переменная и ссылочная функция(значением которой являеться ссылка), для указателей действует более жесткие требование к совместимости типов, чем к обычным выражений. В операции присваивания, могут фигурировать только указатели на переменные одинаковых типов. Так на пример:
Var
p:^integer;
q:^byte;
p:=q; – Это будет ошибкой;
Обойти эти ограничения позволяет универсальность нетипизированного указателя
t:Poniter;
t:=q; p:=t;
Var
p,d:^integer;
…
New(p);
Динамические структуры данных
Линейный список:В этом случаее каждому элементу, нужно сопоставить ссылку на следующий элемент
Type TEL={некоторй тип}
Ref=^Node;
Node=Record
Inf:TEL;
Next:Ref;
End;
Var
First,p:Ref;
Обрашаем внимание на то, что при описании Refиспользуеться описание которое, описываеться позже. Это ед. в паслке исключение сделано для возможности организации динамических структур. Информационное поле Infможет содержать любую информацию произвольной структуры, которая определяеться типом TEL.Графически список можно представить в виде
* |
Inf 1 |
Next |
Inf 2 |
Next |
При описании любой динамической структуры данных главное определить возможные операции над ее элементами. Так элементами линейного списка выполняються следуюшие элементарные операции:
1) включение элемента в список
2) удаление
3) поиск
При написание процедур реализуюших основные операции над списками будем предпологать наличие приведенных ранее описание типов. Короче смотри выше.
Включение нового эллемента, после эллемента со ссылкой Р.
Procedure In_Spi(NewInf:TEL; R:Ref);
Var
p:Ref;
Begin
New(p);
p^.inf=NewInf;
p^.next:=R^.next;
R^.next:=p;
End;
Удаление эллемента из списка:
Procedure Del_Spi(R:Ref);
Var
p:ref;
Begin
p:=R^.next;
R^.next:=p^.next;
Dispose(p);
End;
Вывjд списка на экран:
Procedure Out_Spi(R:Ref);
Var
p:ref;
Begin
write(‘List<’);
p:=R;
while p<>Nil do
Begin
write(p^.Inf:4);
p:=p^.next;
End;
writeln(‘>’);
End;
В качестве примера приведем формирование списка целых чисел тип элемента TEL=integer;признак завершения ввода 0.
First:=nil;
write(‘ – >’);readln(x);
if x<>0 then
Begin
New(q);
q^.inf:=x;
q^.next:=nil;
first:=q;
write(‘ – >’);Readln(x);
while x<>0 do
Begin
In_Spi(x,q);
q:=q^.next;
write(‘ – >’);
Readln(x);
End;
End;
Процедуру поиска элемента я легко сделаю сам.
Procedure (find:TEL);
Var
p:Ref;
find:TEL;
Begin
p:=First;
while (p<>nill) or (p^.inf<>find) do
Begin
find:=p^.inf;
p:=p^.next;
End;
End;
End;
Var
c:TEL;
Begin
Read(c);
if c=’(’ then
Begin
New(p);
Infix(p^.left);
read(p^.inf);
infix(p^.Right);
Read(c);
End
Else
Begin
New(p);
p^.inf:=c;
p^.left:=nil;
p^.right:=nil;
End;
End;
2) из префиксной. Если не достигнут конец строки ввода, прочитать очередной символ, создать новую вершину дерева, записать в него этот символ. Если символ операция, то выполнить алгоритм префикс для левого поддерева и тут же выполнить алгортим префикс для правого поддерерва.
Procedre Prefix(var p:Ptree);
Var
c:TEL;
Begin
New(p);
Read(p^.inf);
if p^.inf in [+-*/] then
Begin
Prefix(p^.left);
Prefix(p^.right);
End
Else
Begin
p^.left:=nil;
p^.right:=nil;
End;
End;
Будем считать что из записи удалены все скобки и запятые, это допустимо так как операция всегда предшествует своим опреандам. И следовательно путанци невозможно.
3)построение из постфиксной записи. В этом случае так-же будем считать будут удалены все скобки и запятые. Описание алгоритмa смотри код
Procedure Postfix(var Stack:PTree);
Var
p:PTree;
//для разнообразия символы будем считать из файла
Begin
stack:=nil;
While not seekEOLn(f) do
Begin
New(p);
Read(f,p^.inf);
if p^.inf in [+-*/] then
Begin
p^.right:=stack;
p^.left:=stack^.next;
p^.next:=stack^.next^.next;
stack:=p;
End
Else
Begin
p^.left:=nil;
p^.right:=nil;
p^.next:=stack;
Stack:=p;
End;
End;
Begin
p^.mark:=k;
if p^.lift<>nil then
PreOrder(p^,left,k+1);
if p^.right<>nil then
PreOrder(p^.right,k+1);
End;
Обратный обход:
Результатом обхода будет постфиксный вариант записи. Обход в глубину снизу верх. Начать с коря совершить обратный обход левого поддерева и правого.
Procedure PostOrder(p:PTree; k:Integer);
Begin
if p^.lift<>nil then
PostOrder (p^,left,k+1);
if p^.right<>nil then
PostOrder (p^.right,k+1);
p^.mark:=k;
End;
Синтасический обход:
В результате получим инфиксный вариант. В ширину
Procedure SyntOrder(p:PTree; k:Integer);
Begin
if p^.lift<>nil then
SyntOrder (p^,left,k+1);
p^.mark:=k;
if p^.right<>nil then
SyntOrder (p^.right,k+1);
End;
Repeat
Tail^.next:=Head^.left;
if Head^.Left<>nil then Tail:=Tail^.next;
Tail^.next:=Head^.right;
if head^.right<>nil then Tail:=Tail^.next;
Inc(k);
Head^.mark:=k;
Head:=Head^.next;
until Head=nil;
Type
TInd=1..N;
TEL=Integer;
TArr1=Array [TInd] of TEL;
Var
A:TArr1;
i,j:TInd;
В силу токого, что часто придеться менять местами
procedure swap(var a1,a2:TEL);
Var
temp:TEL;
Begin
temp:=a1;
a2:=a2;
a2:=temp;
End;
Сортировка прямым включением.
Самый простой способ сортировки – это упроядочение данных по мере их поступления. В этом случае при вводе каждого нового элемента будем считать, что предыдушие элементы образуют уже отсоритрованную последовательность в этом случае этот алгоритм можно описать так.
1) Включить первый эллемент
2) Включить второй эллемент, пока не закончиться последовательность вводимых данных, для кадого нового эллемента выполнять: начиная с конца существующей упорядоченной последовательности все эллементы, которые больше чем новый вводимы эллемент сдвинуть на одну позицию вправо. И записать новый эллемент на освободившиеся место. Будем считать что все эллементы находяться в массиве и очередной вводимый эллемент, будет очередным эллементом массива
{ Сортировка прямым включением }
Procedure Insert(Var A: TArr1);
Var i, j: TInd;
Key: TEL;
Begin Вес Число раз
For j:=2 To N Do Begin c1 N-1
Key:=A[j]; c2 N-1
{ Добавить A[j] к отсортированной части A[1..j-1] }
i:=j-1; c2 N-1
While (i>0) And (A[i]>Key) Do Begin c3 0..N-1
A[i+1]:=A[i]; c2 0..N-2
i:=i-1; c2 0..N-2
End;
A[i+1]:=Key; c2 N-1
End;
End;
для оценки укажем количество повторений всех операций. Отсюда следует, что в случае когда на вход подаеться уже упорядочанная последовательность внутренний цикл не выполенеться ни разу, и общее число сравнений, и присваиваний будет линейно зависить от N.В худшем случае упорядоченность в обратном порядке. Сложность О(N^2)
Сортировка простым выбором
Этот алгоритм уже был реализован.
Procedure Select(Var A: TArr1);
Var i, j, k: TInd;
Begin
For j:=1 To N-1 Do Begin
k:=j; { Поиск минимального, начиная с j-го }
For i:=k+1 To N Do
If x[i] < x[k] Then k:=i;
{Меняем местами минимальный x[k] с x[j]}
Swap(x[k], x[j]);
End;
End;
ООП
– Конец работы –
Используемые теги: информатика0.039
Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: Информатика
Если этот материал оказался полезным для Вас, Вы можете сохранить его на свою страничку в социальных сетях:
Твитнуть |
Новости и инфо для студентов