Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Примеры бесконечных циклов
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).
Тема 7. ПОДПРОГРАММЫ, ИХ КЛАССИФИКАЦИЯ. (1 часа) План лекции 9: 1. Способы оформления подпрограмм. 2. Обращение к подпрограммам. 3. Передача фактических параметров.
Интерфейс подпрограммы или, иными словами, та информация, которая «представляет» подпрограмму и достаточна для корректного ее вызова, сосредоточена в заголовке. Синтаксически любая программа выглядит следующим образом < необязательный заголовок программы> < блок>. < необязательный заголовок программы>:: = program < идентификатор>; < блок>:: = < описания типов, переменных, подпрограмм и т.п.> begin < операторы> end Два вида подпрограмм – процедуры и функции – одинаковый смысл и аналогичная структура, но различие в назначении и способе их использования. Функции служат для определения алгоритма вычисления нового значения некоторого простого типа, и вызов функции должен быть операндом в выражении. Процедуры служат для задания совокупности действий, направленных на изменение внешней по отношению к ним программной обстановки и, как следствие, определение новых значений переменных в программе. Вызов процедуры играет роль оператора. Синтаксические диаграммы Пример: Выходной параметр S у процедуры str4 имеет вещественный тип, поэтому лучшим решением является использование не процедуры, а функции. var AB, BC, CD, AD, BD: real; function str4(a, b, c: real): real; {функция вычисляет площадь треугольника со сторонами a, b и c} var p: real; begin p: =(a+b+c)/2; S: =sqrt(p*(p-a)*(p-b)*(p-c)) end; begin read(AB, BC, CD, AD, BD); writeln('площадь=', str4(AB, AD, BD)+str4(BC, CD, BD)); end. Имеются два различных способа передачи фактических параметров в подпрограммы. Если в описании формального параметра ему предшествует var, то этот способ называется передачей параметра по ссылке, а сам параметр называется параметром-переменной. Если var отсутствует, то такой параметр называется параметром-значением, а способ – передачей параметра по значению.
|