
- •Конспект лекций
- •Тема 1. Программные средства пк. Основы алгоритмизации задач.
- •Тема 2. Программирование на базовом процедурно-ориентированном алгоритмическом зыке. Классификация операторов алгоритмического языка. Оператор присваивания. Операторы управления. (2 часа)
- •Тема 3. Описание линейных и разветвляющихся структур алгоритмов. Программирование разветвляющихся структур.(1 часа)
- •Тема 4. Организация выполнения программ на пк. Структуры данных: массивы. Множества. Записи. (2 часа)
- •Тема 5. Организация алгоритмов циклической структуры. Алгоритмическое описание вложенных циклических структур. (1 часа)
- •Оператор цикла с параметром
- •Оператор цикла с постусловием
- •Примеры бесконечных циклов
- •Тема 6. Программирование ввода-вывода массивов. Строковые данные. Библиотека стандартных подпрограмм. (1 часа)
- •Тема 7. Подпрограммы, их классификация. (1 часа)
- •Параметры-значения
- •Тема 8. Алгоритмы поиска и сортировки. (1 часа)
- •Тема 9. Программирование в среде delphi. (1 часа)
- •Тема 10. Работа с файлами. Различные типы файлов.
- •Тема 11. Динамические структуры данных. Указатели. Работа с очередями и стеком. (2 часа)
- •Добавление в конец списка
- •Рекурсивная процедура добавления элемента в список
- •Включение в список
- •Рекурсивная процедура удаления элемента из списка
- •Тема 12. Машинная графика.Примеры программ с различной структурной организацией. (1 часа)
- •Литература
Примеры бесконечных циклов
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:
Программирование обработки числовых массивов
Задачи упорядочения компонент массивов.
Ввода-вывод строковых данных.
Программирование задач обработки символьных данных.
Использование библиотеки подпрограмм для решения задач.
Элемент массива считается переменной:
он может получать значения (например, в операторе присваивания);
он может участвовать в выражениях там, где может присутствовать переменная данного типа.
Напечатать матрицу построчно.
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).