Учебное пособие Омск Издательство Омгту 2010 удк 004. 4 (075) ббк 32. 973018я73 ч 49 Рецензенты
Скачать 1.07 Mb.
|
При выводе логических выражений в зависимости от значения выводятся подстроки TRUE и FALSE. Ввод логических констант процедурами READ и READLN не предусмотрен. 10.7. Примеры и задания для работы с файлами Пример 1. Написать программу, которая вводит с клавиатуры три вещественных числа и записывает эти числа и их сумму в файл FXD.DAT. PROGRAM FileFD; VAR y, x1, x2, x3: real; FD: TEXT; BEGIN ASSIGN(FD, 'FXD.DAT'); READ(x1, x2, x3); {ввод трех чисел} REWRITE(FD); {открыть файл для записи} y := x1 + x2 + x3; WRITELN(FD,' x1=',x1,' x2=',x2,' x3=',x3); {вывод в файл x1,x2,x3} WRITELN(FD,' сумма = ',y); {вывод в файл суммы} CLOSE(FD); {закрыть файл} END. Пример 2. Вычислить суммы элементов в столбцах двумерного числового массива А[1..2,1..4], заданного в файле FILE1.dat. Полученные значения поместить в файл FILE2.dat. Для решения задачи разработана СА (рис. 16) и программа: Program lr_11; Var a: array [1..2,1..4] of integer; s: array[1..4] of integer; i, j: integer; f1, f2: text; {объявление файловых переменных текстового типа} Begin ASSIGN(f1,’FILE1.dat’); {связывание f1 с физическим файлом} ASSIGN(f2,’FILE2.dat’); RESET(f1); {открыть файл для чтения} for i:=1 to 2 do for j:=1 to 4 do Read(f1, a[i, j]); {чтение из файла, связанного с f1 } CLOSE (f1); {закрыть файл, связанный с f1} REWRITE (f2); {открыть файл для записи} WRITELN (f2,’ 1 2 3 4 - столбцы’); {вывод в файл через f2} WRITELN (F2,’суммы по столбцам); {вывод в файл через F2} for j:=1 to 4 do begin s[j] := 0; for i:=1 to 2 do s[j] := s[j] + a[i,j]; write(f2, s[j]:3) {вывод в файл через F2} end; CLOSE(F2) {закрыть файл, связанный с F2} END. Файл результатов Исходный файл FILE2.dat FILE1.dat 1 2 3 4 столбцы 2 2 3 4 суммы по столбцам 5 2 3 4 7 4 6 8 Задания для самостоятельного выполнения Задание 1 Выполнить задачу из раздела 7.10, считывая исходные данные из одного файла и записывая полученные результаты в другой текстовый файл. Файл с исходными данными должен быть подготовлен предварительно. Задание 2 1. В текстовом файле Т1 записана последовательность целых чисел, разделенных пробелами. Написать программу, записывающую в текстовый файл Т2 все положительные числа из Т1. 2. В текстовом файле f1 записана последовательность чисел. Сформировать текстовый файл f 2, содержащий все числа в обратном порядке. 3. В текстовом файле Т1 записана последовательность чисел. Разработать программу, переписывающую в текстовый файл Т2 сначала все положительные числа из Т1, нуль, затем – все отрицательные числа. 4. В текстовом файле f 1 дана последовательность целых чисел, разделенных пробелами. Записать в текстовый файл F2 все положительные числа, а в файл F3 – отрицательные числа и нулевые элементы. 5. Сформировать файл из девяти строк, в первой из которых – одна единица, во второй – две двойки,…, в девятой – девять девяток. 6. Даны два файла F1, F2. Сформировать третий файл F, в который сначала записать все элементы файла F1, а затем – элементы файла F2. 7. Элементы каждого из заданных в двух файлах массивов X и Y упорядочены по возрастанию. Объединить элементы этих двух массивов в один файл F с упорядочением их по возрастанию. 8. В заранее подготовленном файле K задан массив из 15 целых чисел. Выделить в другой файл те элементы массива K, индексы которых являются степенями двойки. 9. В текстовом файле S1 записана последовательность из N*K чисел. Написать программу, формирующую в файле S2 матрицу из N строк по K чисел в каждой строке. 10. В файле W задан массив из девяти элементов. В новом файле WW сформировать массив, в котором каждому элементу будет присвоено значение соседнего с ним справа. Последнему элементу присвоить значение первого. 11. В файле D1 задана квадратная матрица вещественных чисел. Сформировать файл D2, в котором поменять местами первую и последнюю строки. 12. В текстовом файле F подготовить последовательность целых чисел, разделенных пробелами. Написать программу, записывающую в текстовый файл FF все различные значения, встречающиеся в файле F. 13. В файле X1 задана матрица целых чисел. Сформировать файл Х2, в котором все элементы с четными номерами строки и столбца матрицы заменить нулем (стереть). 14. В файле X задан массив из 20 чисел. Упорядочить его по возрастанию и занести в файл Y. 15. Задана в файле строка текста. Выполнить все циклические сдвиги слов в заданном тексте влево. Каждый полученный при этом текст вывести в другой файл. 16. В файле Y1 задана матрица вещественных чисел. Сформировать файл Y2, в котором строки матрицы упорядочены по убыванию элементов первого столбца. 17. В файле дан текст из 20 символов. Напечатать сначала все цифры, входящие в него, затем латинские буквы, далее русские буквы и все остальные литеры, сохраняя при этом взаимное расположение символов в каждой из четырех групп. Создать четыре новых файла, каждый из которых содержит свою группу символов. 18. Имеется текстовый файл BOOK. Написать программу, которая игнорирует исходное деление этого файла на строки, переформирует его, разбивая на строки так, чтобы каждая строка оканчивалась точкой либо содержала ровно 40 литер, если среди них нет точки. 19. Имеется текстовый файл T. Вывести в новый файл и напечатать первую из самых коротких его строк. 20. Имеется текстовый файл, содержащий фразу. Написать программу, которая считывает из файла литеры до первой точки и записывает их (без точки) в другой текстовый файл, формируя в нем строки по 20 символов (в последней строке литер может быть меньше). 11. КОМБИНИРОВАННЫЙ ТИП – ЗАПИСИ Запись описание комбинированного типа, состоящее из нескольких полей, каждое из которых имеет свой тип. Структура записи аналогична таблице. Записи состоят из фиксированного числа компонентов, называемых полями записи. В отличие от массива компоненты (поля) записи могут быть различного типа. 11.1. Структура данных типа записи Структура объявления типа "запись" имеет следующий вид: TYPE <ИмяТипа> = RECORD <поле1>: <тип поля1>; <поле2>: <тип поля2>; . . . <полеN>: <тип поляN> end; Если тип нескольких полей совпадает, то имена полей можно перечислить через запятую. <ИмяТипа> и поля являются правильными идентификаторами. Например: TYPE DENROGD = RECORD name: string; {фамилия или имя } den, mes: byte; {день, месяц} god: word {год} end; Определение константы – записи будет иметь вид <идентификатоp>: <тип_записи > = (<список_значений_полей>); Список значений полей представляет собой список из последовательностей вида: имя поля, двоеточие и константа. Поля должны указываться в той же последовательности, в какой они перечислены в объявлении типа. Например: TYPE POINT = record x, y: real; end; CONST p: POINT = (x:1; y:1); Объявление переменных производится в разделе VAR: VAR a, b: DENROGD; Доступ к каждой компоненте записи производится указанием составного имени: имени переменной и затем через точку имени поля. Например: a.name := ' MARINA'; a.god := 1991; a.den := 23; a.mes := 3; Таким образом, в типе "запись" определена операция присваивания. Кроме того, как и в массиве, все значения переменных типа "запись" можно присваивать другим переменным того же типа: B := A; . Над полями можно выполнять действия, разрешенные для базового типа: b.god := а.god + 1; {на год старше}. В качестве переменной может быть объявлен массив записей: VAR s: array[1..20] of STUDENT; Пример. Разработать программу формирования списка студентов с указанием дат рождения. Распечатать список в алфавитном порядке. Program zapis; Type {определение нового типа} student = record {запись} name: string[15]; den, mes: byte; god: word end; Var Z: ARRAY [1..20] OF student; k, m, i, n: byte; r: string[15]; {вспомогательная строка для перестановки} BEGIN writeln('ВВЕДИТЕ КОЛИЧЕСТВО СТУДЕНТОВ'); READln(n); for i:=1 to n do begin writeLN('ВВЕДИТЕ имя ',i,' студента с прописной буквы'); readLN (z[i].name); WRITELN('ВВЕДИТЕ день рождения'); readLN(z[i].den); WRITELN('ВВЕДИТЕ месяц рождения'); readLN(z[i].mes); WRITELN('ВВЕДИТЕ год рождения'); readLN(z[i].god); end; for I := n downto 2 do {********* Упорядочение списка *********] begin {поиск "наибольшего" значения поля NAME} m:=1; for k:=2 to i do if z[k].name > z[m].name then m := k; r := z[i].name; {перестановка записей} z[i].name := z[m].name; z[m].name := r end; {**************************************} writeln(' Упорядоченный список '); for i:=1 to n do begin WRITE(z[i].name); WRITELN(' Дата рождения:', z[i].den, '.' ,z[i].mes, '.', z[i].god); end END. 11.2. Обработка полей записей Для упрощения доступа к полям записи может использоваться оператор присоединения. Структура оператора имеет вид WITH <переменная_Типа_Запись> DO <оператор>; где WITH, DO ключевые слова ( с, делать). Пример. WITH a DO // где a – запись, структуру см. в п. 11.1 begin name:='MARINA'; god:=1991; date:=23; mes:=3 end; Поле записи может иметь практически любой тип (массив, другая запись, множество). Доступ к вложенным элементам сложных структур, например к записи в записи, выполняется перечислением ряда полей через точку или оператор присоединения. Пример. Определим вложенную запись (запись в записи) TYPE STUDENT = RECORD name: string; DenRogden: RECORD den, mes: byte; god: word end; end; VAR z: STUDENT; Имя DenRogden в свою очередь тоже является записью, тогда обращение к вложенным полям выполняется в виде z.name := 'LIZA'; z.DenRogden.god := 1994; Используя оператор присоединения, к этим же полям можно получить доступ другими способами: WITH z DO begin name := 'LIZA'; with DenRogden DO god := 1994; end; или WITH z DO name := 'LIZA'; WITH Z DO with DenRogden DO god := 1994; К полю GOD можно также обратиться и следующим оператором: WITH z.DenRogden DO god:=1994; Используя тип "запись", можно составить базы данных для разных назначений, а затем обрабатывать их с помощью программы [3–6]. При этом нужно следить, чтобы среди идентификаторов полей не было одинаковых. 11.3. Задания с обработкой записей Задание 1 1. Ввести оценки студента по 5 экзаменам. Определить средний балл и подсчитать количество удовлетворительных, хороших и отличных оценок. Напечатать название предмета, если есть «неуд». 2. Дан список студентов и оценка каждого на экзамене (оценки на N экзаменах). Подсчитать количество удовлетворительных оценок, хороших, отлич- ных и средний балл в группе. Напечатать фамилии неуспевающих студентов. 3. Дан список студентов группы. Заполнить его следующими сведениями: фамилия, имя, отчество; имеет ли компьютер (если имеет, то какой и с какого года). Подсчитать сколько студентов имеют ПК. 4. Сформировать список студентов группы со следующими сведениями: фамилия, имя, отчество, знает ли языки программирования Pascal ABC, Cи (если да, где обучался и сколько лет). Подсчитать, сколько студентов знают язык Си, сколько – Pascal ABC, сколько – оба языка. 5. Сформировать список студентов группы, в котором указать фамилию (имя, отчество); город, в котором получил среднее образование (номер школы, если обучался в Омске). Подсчитать, сколько в группе иногородних студентов. 6. Сформировать запись «ключевые слова Pascal ABC»: слово и перевод. Подсчитать их количество. Организовать поиск: ключевое слово – перевод и наоборот. 7. Сформировать телефонный справочник. По номеру организовать поиск владельца, и наоборот. 8. Сформировать запись «Даты – праздники». Организовать в программе ввод дат, подсчитать число праздничных дней и рабочих. 9. Сформировать запись «английское слово – перевод». Вводя слово (английское или русское), найти перевод или выдать сообщение «нет в словаре». По возможности предусмотреть пополнение словаря. 10. Сформировать запись «операторы Pascal ABC»: оператор, действие. Подсчитать их количество и число операторов, имеющих повторяющиеся ключевые слова. 11. Сформировать запись «типы Pascal ABC»: имя, тип, операции, разрешенные в данном типе. Подсчитать количество разных операций и вывести списки типов для каждой операции. 12. Сформировать пополняемую базу данных «Континент – страны», в которой указать столицы, численность населения, крупные города. Организовать поиск страны по городу, стран или городов на континенте. 13. В файле задан список книг (автор, название, год издания). Разработать программу выбора книг, выпущенных ранее заданного года. 14. Сформировать список граждан, в котором указать фамилию, имя, отчество; адрес; профессию. Организовать в программе выборку и подсчет граждан с одинаковой профессией. 15. Сформировать список студентов группы, в котором указать фамилию, имя, отчество; день, число и месяц рождения. Организовать выборки по месяцу и году рождения. 16. Дан список студентов группы. Заполнить его следующими сведениями: фамилия, имя, отчество; день, число и месяц рождения. Распечатать список в порядке возрастания дат рождения. 17. Сформировать базу данных «Единицы измерения», в которой указать название единицы, обозначение, назначение, соотношение. Организовать поиск по любому полю. 18. Разработать базу данных «География. Реки», в которой указать название реки, местоположение, длину, глубину. 19. Разработать базу данных «Астрономия», в которой указать название звезды, величину, созвездие. 20. Разработать базу данных «Планеты солнечной системы», в которой указать название планеты, величину, удаленность, спутники. 21. Сформировать базу данных «Химические элементы», в которой указать название элемента, формулу, группу, организовать выборки. 22. Ввести сведения о человеке: фамилия, имя, отчество, пол, национальность, рост, вес, дата рождения. 23. Ввести сведения о гражданине: Ф.И.О., дата рождения, ИНН, № страхового свидетельства, № медицинского полиса. Запрограммировать поиск. 24. Сформировать справочник о спортивных командах: название, город, число сыгранных игр, число очков, количество игроков. Задание 2 Дополнить программу для предыдущего задания заполнением и обработкой файлов. Имя файла вводить с клавиатуры в процессе работы программы. 12. Процедурные типы Для организации передачи в качестве фактических параметров процедур и функций в Pascal ABC применяются два процедурных типа: тип-процедура и тип-функция. При объявлении процедурных типов используется только заголовок процедуры или функции, например: TYPE Proc1 = Procedure(a, b, c: real; var d: real); Proc2 = Procedure(var b1, b2:byte); Proc3 = Procedure; Func = Function(x: real):real; Func2 = Function(s: string): string; Для объявления переменных процедурного типа используется запись: VAR pr: proc1; f: func; Пример применения параметра – функции : type Func = Function(x : real): real; Function F1(x: real): real; Begin . . . end; Procedure FF(n:byte; F:Func); Var ...; Begin . . . end; BEGIN . . . FF(2,F1); ... FF(5,F1); END. Библиографический список
Приложение Обозначения графические в схемах алгоритмов (ГОСТ 19.701-90)
СОДЕРЖАНИЕ Введение 3 1. Система программирования Pascal ABC 4 1.1. Структура меню среды 5 1.2. Команды редактора Pascal ABC 6 1.3. Правила оформления программ 8 1.4. Компиляция и исправление синтаксических ошибок 9 1.5. Этапы подготовки и решения задач на компьютере 10 1.6. Словарь основных терминов 11 2. Начальные сведения о языке Pascal ABC 12 2.1. Алфавит языка 12 2.2. Константы 13 2.3. Идентификаторы и типы данных 14 2.4. Переменные и именованные константы 15 2.5. Структура простой программы и комментарий 16 3. Оператор присваивания и числовые данные 17 3.1. Арифметические выражения 17 3.2. Оператор присваивания 18 3.3. Процедуры ввода-вывода 18 3.4. Стандартные функции Pascal ABC 19 3.5. Целые типы в Pascal ABC 20 3.6. Вещественные типы 22 3.7. Примеры и задания к самостоятельному выполнению 23 4. Программирование разветвленных алгоритмов 26 4.1. Логические выражения 26 4.2. Условный оператор IF 28 4.3. Составной и пустой операторы 29 4.4. Оператор безусловного перехода 29 4.5. Пример и задания с оператором IF 30 4.6. Оператор выбора варианта CASE 34 4.7. Примеры и задания с оператором CASE 35 5. Программирование алгоритмов циклической структуры 37 5.1.Оператор счётного цикла 37 5.2. Примеры и задания для оператора цикла со счётчиком 38 5.3. Оператор цикла с предусловием 41 5.4. Пример и задания для оператора цикла с предусловием 41 5.5. Оператор цикла с постусловием 44 5.6. Процедуры прерываний циклов 44 5.7. Примеры и задания для циклов с постусловием 45 6. Структурированные типы данных 48 6.1. Массивы данных 48 6.2. Пример и задания для одномерных массивов 50 6.3. Ограниченный тип (диапазон) 52 6.4. Пример и задания для двумерных массивов 53 7. Структурное программирование 56 7.1. Структура сложной программы 56 7.2. Подпрограммы. Процедуры и функции 58 7.3. Структура подпрограммы-функции 60 7.4. Примеры и задания с подпрограммой-функцией 60 7.5. Структура подпрограммы-процедуры 64 7.6. Передача в подпрограмму массивов и строк 65 7.7. Рекурсия в программе 65 7.8. Вложенные подпрограммы. 66 7.9. Процедуры EXIT и HALT 67 7.10. Пример и задания с подпрограммой-процедурой 67 8. Обработка символьных данных 71 8.1. Символьный тип 71 8.2. Задания для символьных данных 73 9. Обработка строк текста 74 9.1. Строковый тип 74 9.2. Встроенные функции и процедуры для обработки строк 75 9.3. Пример и задания для обработки строк 77 10. Файлы 79 10.1. Процедура связывания файлов 80 10.2. Процедуры и функции для работы с файлами 81 10.3. Типизированные файлы 82 10.4. Текстовые файлы 83 10.5. Процедуры ввода 84 10.6. Процедуры вывода 85 10.7. Примеры и задания для работы с файлами 87 11. Комбинированный тип – записи 90 11.1. Структура данных типа записи 90 11.2. Обработка полей записей 93 11.3. Задания с обработкой записей 94 12. Процедурные типы 96 Библиографический список 97 Приложение. Обозначения графические в схемах алгоритмов 98 Редактор Е.С. Воронкова Компьютерная верстка О.Г. Белименко ИД № 06039 от 12.10.2001 Свод. темплан 2010 г. Подписано в печать 03.06.10. Формат 60х84 1/16. Отпечатано на дупликаторе. Бумага офсетная. Усл. печ. л. 6,25. Уч.-изд. л. 6,25. Тираж 100 экз. Заказ 398. Издательство ОмГТУ. Омск, пр. Мира, 11. Т. 23-02-12 Типография ОмГТУ |