Паскал - страница 5
Алгоритъм за решаване на проблема:
Нека създадем две процедури за попълване на едномерен масив с цели числа: една, използваща произволната функция, и една, при която потребителят сам задава стойностите. Ще създадем и процедура за показване на масив на екрана. След това извикваме тези процедури в главния клон на програмата, като им предаваме променливи, свързани с масиви като аргументи.
Програма Паскал:
miniarr = масив [1.. n] от цяло число;
процедура arr_rand (k: цяло число; var arr: miniarr); var i: байт;
writeln ('Попълване на масива с произволни числа.') ; рандомизирам;
за i := 1 до k направи
arr [i] := случаен (100);
процедура arr_user (k: цяло число; var arr: miniarr); var i: байт;
write ('Въведете' , k , 'разделени с интервал числа:' ) ; за i := 1 до k направи
процедура arr_out (k: цяло число; var arr: miniarr); var i: байт;
write ('Array output: ' ) ; за i := 1 до k направи
запис (arr [i]: 4);
arr_rand (n, a); arr_out (n, a); writeln ; arr_user (n, b); arr_out (n, b);
Низовете в Pascal са данни от тип string. Те се използват за съхраняване на последователности от знаци. В Pascal дължината на стандартния низ е ограничена до 255 знака. За всеки символ се отделя един байт, в който се съхранява кодът на знака. Освен това всеки ред съдържа допълнителен байт, който съхранява дължината на реда.
Ако предварително е известно, че дължината на низа ще бъде по-малка от 255 знака, тогава програмистът може сам да зададе максималната дължина на низа.
Примери за описание на редове:
str_type = низ [12];
s2, s3: str_type;
s5, s6, s7: низ [7];
Дължината на низ се съхранява в неговия първи байт, чийто индекс е 0.Декларацията на въведена константа за типа низ е както следва:
s: низ = 'FreePascal'
Съществува понятието празен низ, т.е. низ, който няма елементи. Празен низ се обозначава с два съседни апострофа (например st := '' ).
Операции върху низове
Низовете могат да се присвояват един на друг. Ако максималната дължина на променливата отляво е по-малка от дължината на присвоения низ, тогава допълнителните символи отдясно се отхвърлят.
s1 := 'това е текст' ;
Низовете могат да бъдат конкатенирани с помощта на оператора за конкатенация, който се обозначава със знака +.
Низовете могат да се сравняват един с друг с помощта на релационни операции. Когато се сравняват низове, те се разглеждат символ по знак отляво надясно, докато кодовете на съответните двойки знаци се сравняват. Низовете са равни, ако имат еднаква дължина и са еквивалентни символ по знак. В низове с различна дължина съществуващ знак винаги е по-голям от съответстващия му липсващ знак. По-малкият низ ще бъде този, който има по-малкия код на първия несъвпадащ знак (независимо от максималната и текущата дължина на сравняваните низове).
'abc' = 'abc' (true) 'abc' (s1); запис(s1);
Отделен знак в низ може да бъде достъпен като елемент от масив от знаци, като s1 [ 3 ] . Символът за низ е съвместим с типа char, те могат да се използват едновременно в изрази, например:
writeln (s2 [3] + 'r');
Можете да коригирате произволен знак от низова променлива, за което в съответния оператор е достатъчно да посочите името на променливата от тип string , последвано от номера на нейния елемент в квадратни скоби (например str [ 3 ] := 'j' ).
Линейните елементи са номерирани от едно, т.к във всяка низова променлива има елемент с номер 0, в който като знакдължината на текущия ред се съхранява. За да разберете текущата дължина, е достатъчно да приложите функцията ord към нулевия елемент на низа. Например:
writeln(ord(st[0]))
Нулевият елемент на низова променлива може да бъде коригиран. Това ще промени текущата дължина на низа. Например изразът str [ 0 ] := # 50 задава текущата дължина на 50.
Процедури и функции за работа с низове
Пон, 03/07/2011 - 23:37 — тех
Функцията Concat(s1, s2, . sn) връща низ, който е конкатенацията на низовете s1, s2, . сн.
Функцията Copy (s, start, len) връща подниз с дължина len, започващ от началната позиция на низ s.
Процедурата Delete (s, start, len) премахва от низа s, започвайки от позиция start, подниз с дължина len.
Процедурата Insert (subs, s, start) вмъква подниза subs в низа s, започвайки от позиция start.
Функцията Length(s) връща действителната дължина на низа s, резултатът е от тип byte.
Функцията Pos(subs, s) търси срещане на подниза subs в низа s и връща номера на първия знак от subs в s или нула, ако subs не се съдържа в s.
Процедури за преобразуване на типа
Процедурата Str(x, s) преобразува числовата стойност x в низа s и x може да бъде форматиран както в изходните процедури write и writeln. Например:
Резултат: s = '123'.
Процедурата Val (s, x, errcode) преобразува низа s в стойността на числовата променлива x, докато низът s трябва да съдържа символно представяне на числото. Ако преобразуването е успешно, променливата errcode е нула. Ако бъде открита грешка, тогава errcode ще съдържа номера на позицията на първия знак за грешка и стойността x е недефинирана.
Указатели или връзки (Pointer)
вт., 28.09.2010 г. - 00:48 ч. — тех
Когато преводачътанализира var секциите в програмата (основен клон, функции, процедури), разпределя подходящия брой клетки от паметта за всяка променлива и ги присвоява на тази променлива за цялата продължителност на блока. Такива променливи се наричат статични. Те не могат да бъдат използвани от системата за други нужди, дори ако тези променливи вече не са необходими по време на по-нататъшната работа на програмата.
Данните могат да бъдат представени в паметта на компютъра. Данните могат да се съхраняват в някаква област на паметта, която не е обозначена с име на променлива, а използвайки препратка към тази област. Този тип организация на данните ви позволява динамично да улавяте и освобождавате памет по време на работа на програмен блок. Следователно самите променливи, които могат да се създават и елиминират според нуждите, се наричат динамични.
Динамичните променливи по-често се изпълняват като обвързани структури.
Пример за свързана структура. На опашката при лекаря всеки пациент помни за кого се е наредил. Всички пациенти са свързани във верига според опашката, но в пространството те
поставени произволно: новоприближеният сяда на всяка свободна седалка, т.е. съседните елементи на опашката могат да бъдат на произволно разстояние в пространството.
По подобен начин се изгражда структура от свързани данни, които могат да заемат памет не подред, а да се поставят там, където има свободно място. Всеки елемент от такава структура трябва да „знае“ кого „отстоява“, т.е. съдържат връзка към предишния елемент във веригата.
За да илюстрираме предимствата на динамичните променливи, нека продължим аналогията с опашката на пациента.
Накарайте един от пациентите да напусне опашката. Този процес не изисква движение в пространството на други пациенти: просто стоейки зад починалия сега си спомня другиячовек. Тоест премахването на елемент от веригата от данни се свежда до промяна на една единствена препратка и не изисква преместване на останалите елементи, какъвто би бил случаят с масив.
Изключеният елемент вече може да бъде освободен от участие в блока и да използва заеманата от него област на паметта за други цели.
Връзките улесняват вмъкването на нов компонент във веригата от данни. За целта е достатъчно да смените две връзки.
Нов динамичен компонент може да бъде поставен във всяко свободно пространство в паметта, разпределено за такива променливи. Самата динамична променлива не е обозначена с идентификатор. Динамичната променлива е „невидима“ в програмата: тя не е обозначена с идентификатор, транслаторът не отделя място в паметта за нея. Паметта за такава променлива се запазва и освобождава динамично по време на процеса на изчисление (чрез специални процедури).
Транслаторът заделя място в паметта на машината за референтна променлива; тази променлива има име и е изрично спомената в програмата. Референтните променливи формират нов тип данни - "препратки" (указатели).
Динамичните променливи, като правило, имат тип "запис" ( запис ), т.к трябва да съдържа, в допълнение към стойността (цяло число, реално и т.н.), препратка към друга динамична променлива от свързаната структура.
Нека обозначим типа на референтната променлива като point , а типа на динамичната променлива като ct . Тогава този факт се описва по следния начин:
Твърди се, че типът point сочи към (препраща към) компоненти от тип ct или тип point е свързан с тип ct.
Референтната променлива R може да бъде описана по два начина:
Променливата R сочи към компонент от тип ct.
За да свържете динамични променливи във верига, всеки компонент трябва да има връзка към предишния компонент.
Например компонентите, съдържащи числата 5, 10, 15, 8, също трябва да имат информация къде се намира предходният елемент, т.к. това не е масив и компонентите не са непременно поставени в ред.
Нека опишем вида на тези данни, като ги обозначим ct. Очевидно този тип е "запис" с две полета: поле за целочислена стойност ( I ) и референтно поле