Учебное пособие для школьников 79 классов СанктПетербург Павловск 20152016 Введение
Скачать 0.84 Mb.
|
if A[i]>max then max:=A[i]; writeln('Maximum=',max); Напишем теперь целиком программу, использовав полученные знания: Program Massiv; Const N = 10; Var A : array [1..N] of integer; i, max : integer; begin for i:=1 to N do // Ввод массива begin write('Ввeдите ',i,'-й элемент: '); readln(A[i]) end; max:=A[1]; // Поиск максимального значения for i:=2 to N do if A[i]>max then max:=A[i]; writeln('Maximum=',max); end Тема №12. Массивы А.С.Цветков, ABC Pascal - 36 - 19.09.2015 Задание 12 1. Внимательно прочитать текст. Знать определение массива и способы его описания. (2 балла) 2. Напишите программу, которая вводит с клавиатуры значения массива, состоящего из 10 элементов, а затем выводит его. (2 балла) 3. Модифицируйте предыдущую программу, так чтобы она выводила элементы массива в обратном порядке (используйте цикл for i:=N downto 1 do) . (1 балл) 4. По аналогии с примером на стр. 35 напишите программу, находящую минимальный элемент массива и выводящую его значение. (2 балла) 5. Модифицируйте предыдущий пример, так чтобы программа определяла максимальный и минимальный элемент массива. (1 балл) 6. * Напишите программу, которая бы определяла среднее арифметическое значение элементов массива (конечно, это будет вещественная величина типа real) (* 3 балла) 7. * Напишите программу, которая бы вводила значения элементов целочисленного массива, а затем рисовала бы N окружностей, радиусы которых бы равнялись введенным значениям. (* 3 балла) Задачи, отмеченные *, являются необязательными и их баллы – дополнительными. Тема №13. Сортировка массивов А.С.Цветков, ABC Pascal - 37 - 19.09.2015 Занятие №13 СОРТИРОВКА МАССИВОВ Тема имеет исключительно важное значение Первой серьезной задачей программирования, с которой сталкивается начинающий программист – это задача сортировки массива. Под сортировкой понимается упорядочивание элементов массива по возрастанию (или по убыванию) без создания копии массива (т.е. «на месте»). Самый простой алгоритм – это линейная сортировка. Рассмотрим рис. 13.1. Проведем последовательно сравнение первого элемента со всеми последующими, при если при очередном сравнении (например сразу 4 и 2) выяснится, что элементы стоят в «неправильном» порядке – переставим их местами, затем продолжим сравнение (рис. 13.2). По окончании одного прохода, можно сказать, что в первом элементе массива находится минимальный элемент (Рис. 13.4). Далее применим указанную процедуру к неотсортированному «остатку» массива (рис. 13.5) до тех пор, пока не переставим два последних элемента (рис. 13.6-13.7). Алгоритм линейной сортировки очень прост, но не экономичен, среднее число просмотров и перестановок пропорционально квадрату числа элементов (точнее 2 2 N ∼ ). 1 2 3 4 Рис 13.7 1 2 4 3 Рис 13.6 1 2 4 3 Рис 13.6 1 4 3 2 Рис 13.5 1 4 3 2 Рис 13.4 2 4 3 1 Рис 13.3 2 4 3 1 Рис 13.2 4 2 3 1 Рис 13.1 Тема №13. Сортировка массивов А.С.Цветков, ABC Pascal - 38 - 19.09.2015 Приведем программу сортировки. Обратите внимание, что мы использовали массив в качестве параметра процедуры. Для этого необходимо создать тип Massiv (стр. 34). Часто для экономии памяти массив передают через var-параметр (стр. 32), даже если не предполагается его модифицировать в подпрограмме. Т.е. заголовок процедуры print мог бы выглядеть следующим образом: procedure print(var m : Massiv); Program LinerSort; Const N = 10; // Число элементов массива Type Massiv = array [1..N] of integer; // Определение типа Massiv procedure swap(var x,y: integer); // Перестановка элементов местами var z : integer; begin z:=x; x:=y; y:=z; end ; procedure print(m : Massiv); // Вывод массива var i : integer; begin for i:=1 to N do write(m[i]:5); writeln; // Новая строка end ; // Переменные главной программы Var a : Massiv; i,j : integer; begin // Заполнение массива случайными числами в диапазоне от 0 до 99 for i:=1 to N do a[i]:=random(100); print(a); // Вывод массива for i:=1 to N-1 do // Внешний цикл до N-1 (обратите внимание!) for j:=i+1 to N do // Внутренний цикл от i+1 (обратите внимание!) if (a[i]>a[j]) then swap(a[i],a[j]); // Перестановка элементов print(a); // Вывод отсортированного массива end Задание 13 1. Внимательно прочитать текст. Оформите сортировку массива в виде отдельной процедуры (здесь уже применение var-параметра будет обязательным). (2 балла) 2. Добавьте в процедуру сортировки операторы, которые позволил ли бы узнать сколько раз происходят перестановки в процессе сортировки. Выясните этот вопрос для N=10, 100, 1000. (3балла) Тема №14 Работа с файлами А.С.Цветков, ABC Pascal - 39 - 19.09.2015 Занятие №14 РАБОТА С ФАЙЛАМИ Многим программам требуется сохранять и читать информацию, используя файловую систему компьютера. В языке Pascal изначально были предусмотрены специальные операторы и типы данных для работы с файлами. В ABC Pascal есть два вида файлов: текстовые и типизированные. В типизированных файлах обмен с внешними устройствами производится без какого либо преобразования данных, т.е., например, числа типа integer непосредственно копируются на диск, занимая по 4 байта каждое. Попытка просмотра такого файла в текстовом редакторе обречена на неудачу, мы увидим лишь бессмысленный набор знаков. Однако скорость ввода/вывода для таких файлов будет максимальной. Типизированные файлы мы рассмотрим позже в связи с типом данных record. Работа с текстовым файлами очень похожа на работу с обычным консольным вводом/выводом. Числовые данные преобразуются в цифры в соответствии с заданными форматами (стр. 15 и стр. 26). Строковый и символьный тип данных выводится без преобразований. Следует учесть, что текстовый файл может быть открыт либо на чтение, либо на запись Созданный текстовый файл можно прочитать в простом текстовом редакторе (notepad, aditor, в редакторе ABC Pascal, [можно и в Word 12 ]). В текстовом файле ABC Pascal используется кодировка Win-1251, в которой один символ занимает один байт. Текстовый файл можно создать в редакторе (в соответствии с указанными правилами) и прочитать в программе на ABC Pascal. Рассмотрим сразу простой пример – вывод таблицы квадратов первых 10 чисел в текстовый файл table.txt. Program TextOut; const name = 'text.txt'; // имя файла в текущем каталоге var f : text; // файловая переменная n : integer; // переменная для цикла for begin assign(f,name); // связывание файловой переменной с именем файла на диске rewrite(f); // создание и открытие файла на запись for n:=1 to 10 do writeln(f,n:2,sqr(n):4); // вывод в файл writeln(f,...); close(f); // закрытие файла, сохранение всех еще незаписанных данных на диск end В этом пример надо обратить внимание на несколько операторов: 1. f : text – переменная специального встроенного типа «текстовый файл»; 2. assign(f,name) – сопоставление файлу f в программе файла name на диске; 3. rewrite(f) – «перезаписывает» файл f, т.е. либо создает новый пустой файл, либо уничтожает старый (будьте осторожны поэтому) и опять создает новый пустой файл; 4. writeln(f,…) – модификация уже известного оператора writeln, отличается от привычного только тем, что первый параметр – имя файловой переменной 5. close(f) – файлы надо обязательно закрывать, особенно файлы, открытые на запись (как в приведенном примере), иначе часть данных может быть утеряна. 12 Для этого в MS Word при создании файла надо выбрать тип «*.txt – обычный текст», а при открытии указать, что мы открываем текстовый файл в кодировке Win-1251. Тема №14 Работа с файлами А.С.Цветков, ABC Pascal - 40 - 19.09.2015 Вместо оператора rewrite, файл можно открыть оператором append, в этом случае будет произведено открытие уже существующего файла в режиме дозаписи в конец файла. 13 Рассмотрим теперь пример чтения уже существующего файла, в качестве файла используем созданный в предыдущем примере файл text.txt. Program TextIn; Uses CRT; const name = 'text.txt'; // имя файла в текущем каталоге var f : text; // файловая переменная a,b : integer; // переменные для чтения begin assign(f,name); // связывание файловой переменной с именем файла на диске reset(f); // открытие существующего файла на чтение repeat readln(f,a,b); // чтение из файла информации из целой строки writeln(a:5,b:5); // вывод в окно CRT until Eof(f); // Функция eof возвращает true при достижении конца файла close(f); // закрытие файла end В этом пример надо обратить внимание на следующее: 1. reset(f) – открытие существующего файла на чтение, если файла нет, то произойдет ошибка выполнения программы; 2. readln(f,…) – оператор чтения из файла, при работе с файлами действие операторов read(f,…) и readln(f,…) различно, первый прочитает необходимую информацию посредине строки, так что следующий оператор чтения продолжит чтение со средины строки. Оператор readln после чтения информации пропустит все оставшиеся до конца строки символы, таким образом следующий оператор чтения начнет ввод с начала следующей строки; 3. Функция eof(f) возвращает всегда ложное значение, кроме одного единственного случая: достигнут конец строки. Для того, чтобы обойти всякие тонкие случаи, когда в конце файла есть несколько символов «конец строки» или лишние пробелы и символы табуляции, рекомендуются использовать функцию SeekEof(f) – ее действие аналогично eof, но она возвращает true, если до конца файла есть только «пустые» символы: конец строки, табуляция и пробелы 14 Задание 14 1. Напишите программу, создающую таблицу умножения в файле mult.txt. Для ее создания используйте вложенные циклы for (стр. 20). Откройте получившийся файл в текстовом редакторе (3балла) 2. Напишите программу чтения файла, созданного в упражнении 14.1 (2 балла) 13 В ABC Pascal существуют функции FileExists(name), проверяющая, существует ли файл с таким именем, и CanCreateFile(name), проверяющая можно ли создать файл с таким именем. 14 В ABC Pascal существуют две аналогичные функции Eoln и SeekEoln, которые вместо конца файла ищут конец строки. Тема №15 Работа со строками символов А.С.Цветков, ABC Pascal - 41 - 19.09.2015 Занятие №15 СИМВОЛЬНЫЕ ПЕРЕМЕННЫЕ И СТРОКИ СИМВОЛОВ В языке Pascal присутствуют два типа для работы с символьной информацией. Переменные типа char могут принимать значение одного из 256 символов стандартной таблицы кодировки. Константы типа char записываются в виде одного символа в апострофах. Символьные переменные можно вводить оператором readln , но при этом придется еще нажимать Enter для подтверждения ввода. В модуле CRT есть очень удобная функция ReadKey , которая вводит символьную переменную без подтверждения ввода. Для работы с символьными переменными в языке Pascal есть две специальные функции: ord и chr. Первая функция возвращает код (порядковый номер в таблице кодировки) символа, например ord('A') вернет значение 65. Вторая функция имеет обратный смысл, по коду, возвращает символ, т.е. chr(65) будет символ 'A'. Следующий пример выводит все символы кодовой таблицы, начиная с кода 32 15 и заканчивая кодом 255. Оператор if в цикле производит переход на новую строку после вывода линейки из 32 символов. Результат работы программы приведен справа. Program ANSI; Uses CRT; var c : char; i : integer; begin for i:=32 to 255 do begin write(Chr(i)); if (i+1) mod 32 = 0 then writeln; end; end В языке Turbo Pascal появился специальный тип string, который имеет черты массива символов, а также некоторые дополнительные удобные возможности. Тип string реализован и в языке ABC Pascal. Строки в Pascal ABC имеют тип string и состоят из не более чем 255 символов. При описании var s: string; под переменную s отводится 256 байт, при этом в нулевом байте хранится длина строки. Для экономии памяти предусмотрено описание вида var s1: string[40]; В этом случае под строку отводится 41 байт (нулевой байт – под длину строки). В случае присваивания переменной s1 строки из более чем 40 символов лишние символы отсекаются, и длина строки s1 полагается равной 40. При выполнении операции конкатенации («склеивания») вида s1+s1 результат считается строкой типа string, т.е. занимает 256 байт. Однако если при конкатенации результат будет занимать более 255 символов, то программа завершится с ошибкой. Строки можно сравнивать, подразумевается их упорядоченность по алфавиту. К символам в строке можно обращаться, используя индекс: s[i] обозначает i-й символ в строке. Обращение к нулевому символу s[0] считается ошибочным. 15 Коды с 0 по 31 являются служебными и в таблице ANSI им не соответствуют никакие печатные символы. Пример: var c : char; … c:='a'; readln(c); c:=ReadKey; Тема №15 Работа со строками символов А.С.Цветков, ABC Pascal - 42 - 19.09.2015 Для того чтобы узнать длину строки следует воспользоваться встроенной функцией Length (s) . Чтобы изменить длину строки, следует воспользоваться процедурой SetLength (s,n) . Если индекс i выходит за пределы памяти, отводимой под строку, то выдается сообщение об ошибке. Однако если индекс i выходит лишь за пределы длины строки, то сообщение об ошибке не выдается. Тип char и тип string могут быть параметрами процедур и функций, а также возвращаться функциями. Для иллюстрации работы со строками и символами напишем функцию, заменяющую в строки заданный символ на другой и возвращающую результат. Program Strings; // замена символов a на b в строке s function replace(s : string; a,b : char):string; var i : integer; begin for i:=1 to Length(s) do // цикл для всех символов строки if s[i]=a then s[i]:=b; // замена символов replace:=s; // имени функции присваивается значение end; begin writeln(replace('мама мыла раму','м','н')); // Проверка работы функции end Тип char или string может использоваться для чтения информации из текстового файла, например: Program ReadText; Uses CRT; var name : string; // Имя файла s : string; // Буфер для чтения строки f : text; // Файловая переменная n : integer; // Счетчик строк begin write('Введите имя файла: '); readln(name); // Ввод имени файла assign(f,name); reset(f); // Открытие файла n:=0; // Обнуление счетчика while not eof(f) do // Чтение «пока не конец файла» begin readln(f,s); // Чтение одной строки из файла f writeln(n:4,': ',s); // Вывод номера и строки на экран inc(n); // inc(n) – операция увеличения на единицу if n mod 25 = 0 then readln; // Пауза после каждой 25-й строки end; close(f); end. Задание 15 1. С помощью функций ReadKey и Ord напишите программу, которая выводила бы сразу символ и его код по нажатию одной клавиши. (2 балла) 2. Напишите целочисленную функцию с двумя параметрами, подсчитывающую сколько раз символ, заданный вторым параметром, встречается в строке, заданной первым параметром, и проверьте её работу. (2 балла) 3. Напишите программу, запрашивающую имена файлов, и копирующую один файл в другой, заодно вычисляя число строк (или символов) в файле (3 балла) Тема №15 Работа со строками символов А.С.Цветков, ABC Pascal - 43 - 19.09.2015 Для работы с текстовыми строками в языке Pascal существует набор функций, который немного расширен в реализации ABC Pascal. Приведем справочник по этим функциям. Стандартные процедуры и функции для работы со строками Имя и параметры Типы параметров Тип возвраща- емого значения Действие Length(s) s - string integer возвращает длину строки s Copy(s,index,count) s - string, index и count - integer string возвращает подстроку строки s длины count, начиная с позиции index Delete(s,index,count) s - string, index и count - integer удаляет в строке s count символов начиная с позиции index Insert(subs,s,index) s, subs - |