Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции Алгоритмизация.doc
Скачиваний:
2
Добавлен:
01.04.2025
Размер:
445.44 Кб
Скачать

Примеры бесконечных циклов

y:=0;i:=1;

while i<=n do y:=y+1/i;i:=i+1;

while true do <оператор>

{Вычислить площадь под параболой f(x)=x2 от a=0 до b=10 по формуле трапеции S=h*[f(a)/2+f(a+h)+f(a+2*h)+...+f(b-h)+f(b)/2],где h=(b-a)/n }

h:=(b-a)/n;

S:=h*(a*a+b*b)/2;

x:=a;

repeat

x:=x+h;

S:=S+x*x*h

until x=b-h; {Нужно x>=b-h, иначе равенство может и не выполниться}

Тема 6. Программирование ввода-вывода массивов. Строковые данные. Библиотека стандартных подпрограмм. (1 часа)

План лекции 8:

  1. Программирование обработки числовых массивов

  2. Задачи упорядочения компонент массивов.

  3. Ввода-вывод строковых данных.

  4. Программирование задач обработки сим­вольных данных.

  5. Использование библиотеки подпрограмм для решения задач.

Элемент массива считается переменной:

  • он может получать значения (например, в операторе присваивания);

  • он может участвовать в выражениях там, где может присутствовать переменная данного типа.

Напечатать матрицу построчно.

for i:=1 to n do

begin

for j:=1 to m do

write(s[i,j],' ');

writeln

end;

Строковый тип обобщает понятие символьных массивов, позволяя динамически менять длину строки.

Строковый тип данных определяет множество символьных цепочек произвольной длины от нуля символов до заданного их числа.

<описание строкового типа>::=

string | string[<максимальная длина строки>]

Максимальная длина строки, если не указана, то подразумевается равной 255, иначе может быть любое целое от 0 до 255.

Пример:

type

line=string[80];

var

myLine:line;

myLineShort:string[10];

Описание

Var St: string[80];

резервирует для St 81 байт памяти. Если учесть, что на каждый символ отводится один байт, возникает естественный вопрос, а откуда взялся еще один байт, 81-й, а точнее, нулевой байт? Дело в том, что после того как переменной St присвоено какое-то значение, нулевой байт содержит фактическую длину строки St. Длина строки в байтах при этом равна значению кода символа, находящегося в St[0].

Например, присваивание

St := ‘abcdefgh’;

дает такой результат:

St[0] = Chr(8).

St[1] = ‘a’.

St[8] = ‘h’.

Фактическая длина строковой переменной St равна Ord(St[0]). Значение 255 для верхнего предела длины строки объясняется тем, что одиночный байт может принимать 256 различных значений от 0 до 255.

Символьный массив, в отличие от строки, может быть очень большим!

Операция конкатенации (сцепления) применяется для соединения (сцепления) нескольких строк в одну результирующую строкуНапример, выражение 'Т ' + 'у' + 'р' + +'бо' + 'паскаль' дает 'Турбо паскаль'.

Пример:

myLine:='Короткая строка'; {длина 15}

myLine:=MyLine+' стала длинее'; {длина 28}

myLine:=''; {длина 0}

Операции сравнения =,<>,>,<,>=,<=

При сравнении строк используется лексикографический порядок:

а) сравнение строк производится с первых символов (слева направо) до первого несовпадающего символа, и та строка считается больше, в которой первый несовпадающий символ больше;

б) если строки имеют различную длину и одна строка полностью входит во вторую, то более короткая строка меньше, чем более длинная.

Пример:

'abcd'>='abc'

'abcde'>'aacde'>'aacdd'

Элементы строки нумеруются целыми числами, начиная с 1.

Строковые выражения могут использоваться там, где используется строковый тип. В операторах присваивания, если значение переменной после выполнения присваивания превышает по длине максимально допустимую величину, то все лишние символы отбрасываются! значение

a:string[6] a:='группа 1'; 'группа'

a:string[8] a:='группа 1'; 'группа 1'

a:string[2] a:='группа 1'; 'гр'

Стандартная функция Length(<выражение строкового типа>). Значение функции есть текущая длина строки – фактического параметра.

Пример:

var myLine:string;

i:integer;

.....

for i:=1 to Length(myLine) do

myLine[i]:=chr(ord(myline[i])+1);

Нет полной идентичности между строковыми типами и символьными массивами, поэтому возможна ошибка при работе с элементами строки без учета ее текущей длины.

Пример:

var

str:string[26];

i:integer;

begin

str:='A';

for i:=1 to 26 do

str[i]:=chr(ord('A')+i-1);

writeln(str)

end.

Предполагается, что данная программа сформирует строку из 26 букв латинского алфавита, но печать writeln(str) дает просто A! Объяснение: присваивание значений элементам строки не влияет на ее текущую длину (здесь текущая длина = 1).

Правильная программа:

var

str:string[26];

i:integer;

begin

str:='';

for i:=1 to 26 do

str:=str+chr(ord('A')+i-1);

writeln(str)

end.

Стандартные процедуры и функции для работы со строковыми типами

Процедура

delete(var St:string;Poz:integer;N:integer)

производит удаление N символов строки St, начиная с позиции Poz. Если Poz>255, то осуществляется программное прерывание.

St:='abcdef';

delete(St,4,2);

writeln(St); ====> abcf

St:='река Волга';

delete(St,1,5);

writeln(St); ====> Волга

Процедура

insert(Source:string;var S:string;Index:integer)

осуществляет вставку строки Source в строку S, начиная с позиции Index.

S:='Золотойключик';

insert(' ',S,8);

writeln(S); =====> Золотой ключик

Функция copy(S:string;Index:integer;Count:integer):string

Функция выделяет из строки S подстроку длиной Count символов, начиная с позиции Index.

Если Index > length(S), то возвращается пустая строка.

Если Count+Index > length(S), то возвращается конец строки.

Если Index > 255, то диагностируется ошибка при выполнении.

copy('abcdefg',2,3)='bcd'

copy('abcdefg',4,10)='defg'

Функция

concat(S1,S2,...,SN:string):string

производит соединение последовательности строк, эта функция равносильна операции конкатенации +.

Функция

pos(Substr:string;S:string):integer

обнаруживает первое появление в строке S подстроки Substr. Результат равен номеру той позиции, где начинается подстрока Substr. Если подстроки нет, то результат равен 0.

pos('de','abcdef')=4

pos('z','abcdef')=0

Имеются две процедуры преобразования числовых значений в строковые и наоборот: Str и Val. Процедура Str при обращени к ней вида

Str(num, strnum);

где num – значение числового типа, а strnum – переменная строкового типа, присваивает переменной strnum строковое значение. Процедура Val выполняет обратное преобразование. Обращение к ней имеет вид:

Val(strnum, num, errcode);

Третий параметр в этой процедуре равен нулю при успешном выполнении преобразования. В том случае, когда первый параметр содержит символы, недопустимые при записи числа, значение параметра errcode равно номеру позиции с ошибочно заданным символом.

Пример использования процедур Str и Val дается ниже:

var

i, errcode: Integer;

S: String;

begin

Str(2000,S);

Writeln('Строковое значение ',S);

Readln;

Val(S, i, errcode);

If errcode <> 0 then

Writeln('Ошибка ввода в позиции: ', errcode)

else

Writeln('Числовое значение = ', i);

Readln;

End.

В этом примере вначале выполняется преобразование целочисленного значения 2000 в строковое (обращение к процедуре Str), а затем, наоборот, строка символов «2000» преобразуется в значение типа Integer (процедура Val).