Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Ввод и вывод информации: текстовые файлы



Ранее мы уже рассматривали ввод информации с клавиатуры и вывод ее на экран. Однако процесс ввода с консоли весьма трудоемок, а результат вывода на консоль - недолговечен. К счастью, существует более удобный способ записывать, хранить, пересылать и, по необходимости считывать информацию из постоянной памяти компьютера. Для этого применяются файлы.

Файл - это именованная область внешней памяти

Файлы могут хранить в себе все, что поддается кодированию:

исходные тексты программ или входные данные (тесты);

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

информацию о текущем состоянии какого-либо процесса;

различные документы, в том числе и Интернет-страницы;

картинки (рисунки, фотографии, видео);

музыку;

и т.д. и т.п.

 

Разновидности файлов

В языке Pascal имеется возможность работы с тремя видами файлов:

· текстовыми;

· типизированными;

· бестиповые.

Последние два типа объединяются под названием бинарные, информация в них записывается по байтам и потому не доступна для просмотра или редактирования в удобных для человека текстовых редакторах; зато такие файлы более компактны, чем текстовые.

В отличие от бинарных, текстовые файлы возможно создавать, просматривать и редактировать " вручную" - в любом доступном текстовом редакторе. Кроме того, при считывании данных из текстового файла нет необходимости заботиться об их преобразовании: в языке Pascal имеются средства автоматического перевода содержимого текстовых файлов в нужный тип и формат, и это позволяет сэкономить немало времени и сил.

 

Описание файлов

В разделе var переменные, используемые для работы с файлами (файловые переменные), описываются следующим образом:

var f1, f2: text; {текстовые файлы}

g: file of < тип_элементов_файла>; {типизированные файлы}

t: file; {бестиповые файлы}

 

Файловая переменная не может быть задана константой.

Текстовые файлы.

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

С этого момента и до конца лекции под словом " файл" мы будем подразумевать " текстовый файл" (разумеется, если специально не оговорено обратное). Однако многие описываемые ниже команды пригодны не только для текстовых, но и для бинарных файлов.

Назначение файла

Процедура assign(f, '< имя_файла> '); служит для установления связи между файловой переменной f и именем того файла, за действия с которым эта переменная будет отвечать.

На разных этапах работы программы одной и той же файловой переменной можно присваивать разные значения. Например, если в начале программы мы напишем

assign(f, 'input.txt');

то переменной f будет соответствовать файл, из которого производится считывание входных данных, вплоть до того момента, когда в программе встретится, скажем, команда

assign(f, 'output.txt');

после которой переменной f будет уже соответствовать тот файл, куда выводятся результаты.

Строка '< имя_файла> ' может содержать полный путь к файлу. Если путь не указан, файл считается расположенным в той же директории, что и исполняемый модуль программы. Именно этот вариант обычно считается наиболее удобным.

 

 

Открытие файла

В зависимости от того, какие действия ваша программа собирается производить с открываемым файлом, возможно троякое его открытие:

reset(f); - открытие файла для считывания из него информации; если такого файла не существует, попытка открыть его вызовет ошибку и аварийную остановку работы программы. Эта же команда служит для возвращения указателя на начало файла;
rewrite(f); - открытие файла для записи в него информации; если такого файла не существует, он будет создан; если файл с таким именем уже есть, вся содержащяся в нем ранее информация исчезнет;
append(f); - открытие файла для записи в него информации (указатель помещается в конец этого файла). Если такого файла не существует, он будет создан; а если файл с таким именем уже есть, вся содержащаяся в нем ранее информация будет сохранена, потому что запись будет производиться в его конец.

Закрытие файла

После того, как ваша программа закончит работу с файлом, очень желательно закрыть его:

close(f);

В противном случае информация, содержащаяся в этом файле, может быть потеряна.

Считывание файла

Чтение данных из файла, открытого для считывания, производится с помощью команд read() и readln(). В скобках сначала указывается имя файловой переменной, а затем - список ввода. Например:

read(f, a, b, c); - читать из файла f три переменные a, b и c. После выполнения этой процедуры указатель в файле передвинется за переменную с;
readln(f, a, b, c); - читать из файла f три переменные a, b и c, а затем перевести указатель (" курсор" ) на начало следующей строки; если кроме уже считанных переменных в строке содержалось еще что-то, то этот " хвост" будет проигнорирован.

Если вспомнить, что в памяти компьютера любой файл записывается линейной последовательностью символов и никакой разбивки на строки там реально нет, то действия процедуры readln() можно пояснить так: читать все указанные переменные, а затем игнорировать все символы вплоть до ближайшего символа " конец строки" или " конец файла". Указатель при этом перемещается на позицию непосредственно за первым найденным символом " конец строки".

Если же символ конца строки встретится где-нибудь между переменными, указанными в списке ввода, то обе процедуры его просто проигнорируют.

Считывать из текстового файла можно только переменные простых типов: целых, вещественных, символьных, а также строковых. Численные переменные, считываемые из файла, должны разделяться хотя бы одним пробельным символом. Типы вводимых данных и типы тех переменных, куда эти данные считываются, обязаны быть совместимыми. Здесь действуют все те же правила, что и при считывании с клавиатуры.

Считываемые переменные могут иметь различные типы. Например, если в файле f записана строка

1 2.5 с

то командой read(f, a, b, c, c); можно прочитать одновременно значения для трех переменных, причем все разных типов:

a: byte;

b: real;

c: char;

Замечание: Обратите внимание, что символьную переменную c пришлось считывать дважды, так как после числа " 2.5" сначала идет символ пробела и только затем буква " c".

Из файла невозможно считать переменную составного типа (например, если а - массив, то нельзя написать read(f, a), можно ввести его только поэлементно, в цикле.

Особенно внимательно нужно считывать строки (string[length] и string): эти переменные " забирают" из файла столько символов, сколько позволяет им длина (либо вплоть до ближайшего конца строки). Если строковая переменная неопределенной длины (тип данных string ) является последней в текущей строке файла, то никаких проблем с ее считыванием не возникнет. Но в случае, когда необходимо считывать переменную типа string из начала или из середины строки файла, это придется делать с помощью цикла - посимвольно. Аналогичным образом - посимвольно, от пробела до пробела - считываются из текстового файла слова.

Есть еще один (гораздо более трудоемкий) способ: считать из файла всю строку целиком, а затем " распотрошить" ее - разобрать на части специальной процедурой выделения подстрок copy(). После этого (где необходимо) применить процедуру превращения символьной записи числа в само число, применяя стандартную процедуру val(). Кроме того, совсем не очевидно, что длина вводимой строки не будет превышать 256 символов, поэтому такой способ приходится признать неудовлетворительным.

Запись в файл

Сохранять переменные в файл, открытый для записи командами rewrite(f) или append(f), можно при помощи команд write() и writeln(). Так же, как в случае считывания, первой указывается файловая переменная, а за ней - список вывода:

write(f, a, b, c); - записать в файл f переменные a, b и c;
writeln(f, a, b, c); - записать в файл fпеременные a, b и c, а затем записать туда же символ " конец строки".

Выводить в текстовый файл можно переменные любых базовых типов (вместо значений логического типа выведется их строковый аналог TRUE или FALSE) или строки.

Структурированные типы данных можно записывать только поэлементно.

 

Пробельные символы

К пробельным символам (присутствующим в файле, но невидимым на экране) относятся:

· символ горизонтальной табуляции (#9);

· символ перевода строки (#10) (смещение курсора на следующую строку, в той же позиции);

· символ вертикальной табуляции (#11);

· символ возврата каретки (#13) (смещение курсора на начальную позицию текущей строки; в кодировке UNIX один этот символ служит признаком конца строки);

· символ конца файла (#26);

· символ пробела (#32).

Замечание: Пара символов #13 и #10 является признаком конца строки текстового файла (в кодировках DOS и Windows).

В (текстовом) файле границами чисел служат пробельные символы; при считывании чисел эти пробельные символы игнорируются, сколько бы их ни было. Таким образом, если ввод многих чисел производится с помощью команды read(), то нет никакой разницы, как именно записаны эти числа: в одну строку, в несколько строк или вовсе в один столбик. В любом случае считывание пройдет корректно и завершится только по достижении конца файла.

Если же считывание тестового файла производится посимвольно, то нужно аккуратно отслеживать пробельные (особенно концевые) символы.

Поиск специальных пробельных символов (нас интересуют в основном #10, #13 и #26) можно осуществлять при помощи стандартных функций:

eof(f) – возвращает значение TRUE, если уже достигнут конец файла f (указатель находится сразу за последним элементом файла), и FALSE в противном случае;

seekeof(f) – возвращает значение TRUE, если «почти» достигнут конец файла f (между указателем и концом файла нет никаких символов, кроме пробельных), и FALSE в противном случае;

eoln(f) – возвращает значение TRUE, если достигнут конец строки в файле f (указатель находится сразу за последним элементом строки), и FALSE в противном случае;

seekeoln(f) – возвращает значение TRUE, если «почти» достигнут конец строки в файле f (между указателем и концом строки нет никаких символов, кроме пробельных), и FALSE в противном случае.

Ясно, что в большинстве случаев предпочтительнее использовать функции seekeof(f) и seekeoln(f): они предназначены специально для текстовых файлов, игнорируют концы строк (и вообще все пробельные символы) и потому позволяют автоматически обработать сразу несколько частных случаев.

Например, если по условию задачи файл входных данных может содержать только одну строку, то правильнее всего будет написать программу, обрабатывающую все возможные варианты:

· одна строка, заканчивающаяся символом конца файла;

· одна строка, заканчивающаяся несколькими концевыми пробелами, а затем символом конца файла;

· одна строка, заканчивающаяся символом конца строки, а затем – символом конца файла (на самом деле получается, что в файле содержится не одна, а две строки, но вторая – пустая);

· одна строка, заканчивающаяся несколькими концевыми пробелами, затем символом конца строки, а затем – символом конца файла.

Поскольку функции seekeof() и seekeoln() при каждой проверке пытаются проигнорировать все пробельные символы, то и результаты их работы отличаются от результатов работы функций eof() и eoln(). Эти различия нужно учитывать.

 

Изменение реакции на ошибку

По умолчанию любая ошибка ввода или вывода вызывает аварийную остановку работы программы. Однако существует возможность отключить такое строгое реагирование; в этом случае программа сможет либо игнорировать эти ошибки (что, правда, далеко не лучшим образом отразится на результатах ее работы), либо обрабатывать их при помощи системной функции IOResult: integer.

Директива компилятора 5) {$I-} отключает режим проверки, соответственно директива {$I+} - включает.

Если при отключенной проверке правильности ввода-вывода ( {$I-} ) происходит ошибка, то все последующие операции ввода-вывода игнорируются вплоть до первого обращения к функции IOResult. Ее вызов " очищает" внутренний показатель (" флаг" ) ошибки, после чего можно продолжать ввод или вывод.

Если функция IOResult возвращает нуль, значит, операция ввода-вывода была завершена успешно. В противном случае функция вернет номер произошедшей ошибки.

 

Номер ошибки Описание ошибки Генерирующие процедуры6)
File not found Файл не найден append, erase, rename, reset, rewrite
Path not found Директория не найдена append, chdir, erase, mkdir, rename, reset, rewrite, rmdir
Too many open files Открыто более 15 файлов одновременно append, reset, rewrite
File access denied Отказ в доступе к файлу append, blockread, blockwrite, erase, mkdir, read, readln, rename, reset, rewrite, rmdir, write, writeln
Invalid file access code Попытка использовать текстовый файл как типизированный или наоборот append, reset
Cannot remove current directory Невозможно удалить заданную директорию rmdir
Disk read error Попытка чтения после конца файла read, readln
Disk write error Ошибка записи на диск (диск полон) close, write, writeln
File not assigned   Файл не назначен append, erase, rename, reset, rewrite
File not open Файл не открыт{бинарные файлы} blockread, blockwrite, close, eof, filepos, filesize, read, seek, write
File not open for input Файл не открыт для ввода {текстовые файлы} eof, eoln, read, readln, seekeof, seekeoln
File not open for output Файл не открыт для вывода {текстовые файлы} write, writeln
Invalid numeric format Неправильный числовой формат {текстовые файлы} read, readln
Drive not ready Задано неверное имя диска append, erase, rename, reset, rewrite

 

Задание к работе

А. Выполнить на ЭВМ программу в соответствии с вариантом задания, указанным в таблице 7.1 (п.п. А). Прочитать и напечатать созданный файл.

 

Таблица 7.1

Вариант задания Условие задачи
А. Создать файл, содержащий сведения о месячной зара­ботной плате рабочих завода. Каждая запись содержит поля — фамилия рабочего, наименование цеха, размер заработной платы за месяц. Количество записей — произвольное.   Б. Вычислить общую сумму выплат за месяц по цеху X, а также среднемесячный заработок рабочего этого цеха. Напечатать для бухгалтерии ведомость для начисления заработной платы рабочим этого цеха
А. Создать файл, содержащий сведения о количестве из­делий, собранных сборщиками цеха за неделю. Каждая запись содержит поля: фамилия сборщика, количество изделий, собранных им ежедневно в течение шестиднев­ной недели, т.е. раздельно — в понедельник, вторник и т. д. Количество записей — произвольное.   Б. Написать программу, выдающую на печать следующую информацию: фамилию сборщика и общее количество деталей, собранное им за неделю; фамилию сборщика, собравшего наибольшее число изделий, и день, когда он достиг наивысшей производительности труда
А. Создать файл, содержащий сведения о количестве изде­и категорий А, В, С, собранных рабочим за месяц. Структура записи имеет поля: фамилия сборщика, наиме­нование цеха, количество изделий по категориям, собран­ных рабочим за месяц. Количество записей — произволь­и.   Б. Считая заданными значения расценок SA, SB, SC за вы­полненную работу по сборке единицы изделия категорий А, В, С соответственно, выдать на печать следующую информацию: — общее количество изделий категорий А, В, С, собран­ных рабочим цеха X; ведомость заработной платы рабочих цеха X; средний размер заработной платы работников этого цеха
А. Создать файл, содержащий сведения о телефонах або­нентов. Каждая запись имеет поля: фамилия абонентов, год установки телефона, номер телефона. Количество записей произвольное.   Б. Написать программу, выдающую информацию следую­щего вида: — по вводимой фамилии абонента выдается номер телефона; — определяется количество установленных телефонов с ХХХХ года. Номер года вводится с терминала
А. Создать файл, содержащий сведения об ассортименте игрушек в магазине. Структура записи: название игруш­и, цена, количество, возрастные границы, например 2—5, т. е. от 2 до 5 лет. Количество записей произвольно. Б. Написать программу, в результате выполнения которой выдаются следующие сведения: — названия игрушек, которые подходят детям от 1 до 3 лет; — стоимость самой дорогой игрушки и ее наименование; — название игрушки, которая по стоимости не превы­шает х руб. и подходит ребенку в возрасте от a до b лет. Значения х, а, b ввести с терминала
А. Создать файл, содержащий сведения о сдаче студентами I курса кафедры «ЭВМ» сессии. Структура записи: индекс группы, фамилия студента, оценки по пяти экза­менам, признак участия в общественной работе: «1»— активное участие, «0» неучастие. Количество запи­сей — 30.   Б.Написать программу зачисления студентов группы Х на стипендию. Студент, получивший все оценки «5» и ак­тивно участвующий в общественной работе, зачисляется на повышенную стипендию (доплата 50 %), не активно участвует — доплата 25 %. Студенты, получившие «4» и «5», зачисляются на обычную стипендию. Студент, полу­чивший одну оценку «З», но активно занимающийся об­щественной работой, также зачисляется на стипендию, в противном случае зачисление не производится. Индекс группы вводится с терминала
А. Создать файл, содержащий сведения о сдаче студентами сессии. Структура записи: индекс группы, фамилия сту­дента, оценки по пяти экзаменам и пяти зачетам («з» означает зачет, «н» — незачет). Количество записей—25.   Б. Написать программу, выдающую следующую инфор­мацию: — фамилии неуспевающих студентов с указанием индек­сов групп и количества задолженностей; — средний балл, полученный каждым студентом груп­пы X, и всей группой в целом
А. Создать файл, содержащий сведения о личной коллекции книголюба. Структура записи: шифр книги, автор, название, год издания, местоположение (номер стел­лажа, шкафа и т. п.). Количество записей произвольное.   Б. Написать программу, выдающую следующую инфор­мацию: — местонахождение книги автора Х названия Y. Значе­ния X, Y ввести с терминала; — список книг автора Z, находящихся в коллекции; — число книг издания XX года, имеющееся в библиотеке
А. Создать файл, содержащий сведения о наличии билетов и рейсах Аэрофлота. Структура записи: номер рейса, пункт назначения, время вылета, время прибытия, коли­чество свободных мест в салоне. Количество записей произвольное   Б. Написать программу, выдающую информацию следую­щего вида: — время отправления самолетов в город X; — наличие свободных мест на рейс в город Х с време­нем отправления Y. Значения X, Y вводятся по запросу с терминала
А. Создать файл, содержащий сведения об ассортименте обуви в магазине фирмы. Структура записи: артикул, наименование, количество, стоимость одной пары. Коли­чество записей произвольное. Артикул начинается с бук­вы Д для дамской обуви, М для мужской, П для детской.   Б. Написать программу, выдающую следующую инфор­мацию: — о наличии и стоимости обуви артикула X; — ассортиментный список дамской обуви с указанием наименования и имеющегося в наличии числа пар каждой модели
А. Создать два файла, содержащих сведения о десяти на­падающих хоккейных команд «Динамо» и «Спартак» соответственно: имена нападающих, число заброшенных ими шайб, сделанных голевых передач, заработанное штрафное время.   Б. Написать программу, которая по данным, извлеченным из этих файлов, создает новый третий файл, содержащий имя, команду, сумму очков (голы + передачи) для шести лучших игроков обеих команд. Имена и показатели ре­зультативности хоккеистов вывести на экран
А. Создать файл, содержащий сведения о том, какие из пяти предлагаемых дисциплин по выбору желает слушать студент. Структура записи: фамилия студента, индекс группы, 5 дисциплин, средний балл успеваемости. Выби­раемая дисциплина отмечается символом 1, иначе — пробел. Количество записей — 25.   Б. Написать программу, которая печатает список студентов, желающих прослушать дисциплину X. Если число же­лающих превысит 8 человек, то отобрать студентов, имею­щих более высокий средний балл успеваемости
А. Создать файл, содержащий сведения об отправлении поездов дальнего следования с Казанского вокзала. Структура записи: номер поезда, станция назначения, время отправления, время в пути, наличие билетов. Ко­личество записей произвольное.   Б. Написать программу, которая позволяет получить сле­дующую справочную информацию: — время отправления поездов в город Х во временном интервале от Л до б часов, — наличие билетов на поезд с номером XXX
А. Создать файл, содержащий сведения о сотрудниках института. Структура записи: фамилия работающего, название отдела, год рождения, стаж работы, должность, оклад. Количество записей произвольное.   Б. Написать программу, которая позволяет получить сле­дующую информацию: — список сотрудников пенсионного возраста на сего­дняшний день с указанием стажа работы, — средний стаж работающих в отделе Х
А. Создать файл, содержащий сведения о пациентах глаз­ной клиники. Структура записи: фамилия пациента, пол, возраст, место проживания (город), диагноз. Количество записей произвольное.   Б. Написать программу, выдающую следующую инфор­мацию: — количество иногородних, прибывших в клинику, — список пациентов старше Х лет с диагнозом Y. Значе­ния Х и Y ввести с терминала

 

Задание Б. Выполнить на ЭВМ программу обработки файла, созданного в п. 1, в соответствии с заданием, указан­ным в п.п. Б табл. 7.1 для заданного варианта.

Проверить правильность выполнения обеих программ с помощью тестового варианта исходных данных.

 

Контрольные вопросы

1. Объяснить, что означают следующие термины: файл, запись, метод доступа, структура записи?

2. Каково назначение операторов открытия и закрытия файлов в языке программирования Object Pascal?

3. Допустимы ли различные типы данных для элементов одной записи?

4. Указать, с помощью каких операторов осуществляется запись данных в файл последовательного доступа, чтение из файла?

5. Привести примеры использования файлов последовательного доступа.

6. Как распознать конец файла данных? Как распознать файл на диске?


Часть2

Лабораторная работа № 6
Множественный тип данных

(4 часа)

 

 

Цель работы: Освоить на практике организацию множества, как структуры данных, средствами языка Object Pascal /

 

Домашнее задание:

 

1. Изучить организацию типа множество в Object Pascal

(set of < базовый тип > ).

2. Освоить операции и стандартные функции, допустимые при работе с множествами.

 

Теоретические сведения:

 

Множества - это наборы однотипных логически связанных друг с другом объектов. Характер связей между объектами лишь подразумевается программистом и никак не контролируется Object Pascal. Количество элементов, входящих в множество, может меняться в пределах от 0 до 256 (множество, не содержащее элементов, называется пустым). Именно непостоянством количества своих элементов множества отличаются от массивов и записей.

Два множества считаются эквивалентными тогда и только тогда, когда все их элементы одинаковы, причем порядок следования элементов в множестве безразличен. Если все элементы одного множества входят также и в другое, говорят о включении первого множества во второе. Пустое множество включается в любое другое.

 

Пример определения и задания множеств:

 

Code:
type digitChar = set of '0'..'9'; digit = set of 0..9; var sl, s2, s3: digitChar; s4, s5, s6: digit; begin si: = ['1', '2', '3']; s2: = ['3', '2', '1']; s3: = ['2', '3']; s4: = [0..3, 6]; s5: = [4, 5]; s6: = [3..9]; end.

В этом примере множества si и s2 эквивалентны, а множество S3 включено в s 2, но не эквивалентно ему.

Описание типа множества имеет вид:

 

< имя типа> = set of < базовый тип>;

 

Здесь < имя типа> - правильный идентификатор; set, of - зарезервированные слова (множество, из); < базовый тип> - базовый тип элементов множества, в качестве которого может использоваться любой порядковый тип, кроме Word, Integer, Longint, Int64.

 

Для задания множества используется так называемый конструктор множества: список спецификаций элементов множества, отделенных друг от друга запятыми; список обрамляется квадратными скобками. Спецификациями элементов могут быть константы или выражения базового типа, а также тип-диапазон того же базового типа.

 

Над множествами определены следующие операции:

 

* пересечение множеств; результат содержит элементы, общие для обоих множеств; например, s4*s6 содержит [3], s4*s5 -пустое множество (см. выше);

 

+ объединение множеств; результат содержит элементы первого множества, дополненные недостающими элементами из второго множества:

 

S4+S5 содержит [0, 1, 2, 3, 4, 5, 6];

 

S5+S6 содержит [3, 4, 5, 6, 7, 8, 9];

 

разность множеств; результат содержит элементы из первого множества, которые не принадлежат второму:

 

S6-S5 содержит [3, 6, 7, 8, 9];

 

S4-S5 содержит [0, 1, 2, 3, 6];

 

= проверка эквивалентности; возвращает True, если оба множества эквивалентны;

 

< > проверка неэквивалентности; возвращает True, если оба множества неэквивалентны;

 

< = проверка вхождения; возвращает True, если первое множество включено во второе;

 

> = проверка вхождения; возвращает True, если второе множество включено в первое;

 

in проверка принадлежности; в этой бинарной операции первый элемент - выражение, а второй - множество одного и того же типа; возвращает True, если выражение имеет значение, принадлежащее множеству:

 

3 in s 6 возвращает True;

 

2*2 in si возвращает False.

 

Дополнительно к этим операциям можно использовать две процедуры.

 

include - включает новый элемент во множество. Обращение к процедуре:

 

Include(S, I)

 

Здесь s - множество, состоящее из элементов базового типа TSet Base; I - элемент типа TSetBase, который необходимо включить во множество.

 

exclude - исключает элемент из множества. Обращение:

 

Exclude(S, I)

 

Параметры обращения - такие же, как у процедуры include. В отличие от операций + и -, реализующих аналогичные действия над двумя множествами, процедуры оптимизированы для работы с одиночными элементами множества и поэтому отличаются высокой скоростью выполнения.

 

Учебная программа PRIMSET

 

В следующем примере, иллюстрирующем приемы работы с множествами, реализуется алгоритм выделения из первой сотни натуральных чисел всех простых чисел[ Простыми называются целые числа, которые не делятся без остатка на любые другие целые числа, кроме 1 и самого себя. К простым относятся 1, 2, 3, 5, 7, 11, 13 и т. д.. ]. В его основе лежит прием, известный под названием " решето Эратосфена". В соответствии с этим алгоритмом вначале формируется множество BeginSet, состоящее из всех целых чисел в диапазоне от 2 до N. В множество primerset (оно будет содержать искомые простые числа) помещается 1. Затем циклически повторяются следующие действия:

 

взять из BeginSet первое входящее в него число Next и поместить его В PrimerSet;

удалить из BeginSet число Next и все другие числа, кратные ему, Т. е. 2*Next, 3*Next И Т.Д.

Цикл повторяется до тех пор, пока множество BeginSet не станет пустым.

 

Эту программу нельзя использовать для произвольного N, так как в любом множестве не может быть больше 256 элементов.

 

 

Code:
procedure TfmExample.bbRunClick(Sender: TObject); // Выделение всех простых чисел из первых N целых const N = 255; // Количество элементов исходного множества type SetOfNumber = set of 1..N; var n1, Next, i: Word; // Вспомогательные переменные BeginSet, // Исходное множество PrimerSet: SetOfNumber; // Множество простых чисел S: String; begin BeginSet: = [2..N]; // Создаем исходное множество PrimerSet: = [1]; // Первое простое число Next: = 2; // Следующее простое число while BeginSet о [ ] do // Начало основного цикла begin nl: = Next; //nl-число, кратное очередному простому (Next) // Цикл удаления из исходного множества непростых чисел: while nl < = N do begin Exclude(BeginSet, nl); n1: = nl + Next // Следующее кратное end; // Конец цикла удаления Include(PrimerSet, next); // Получаем следующее простое, которое есть первое // число, не вычеркнутое из исходного множества repeat inc(Next) until (Next in BeginSet) or (Next > N) end; // Конец основного цикла // Выводим результат: S: = '1'; for i: = 2 to N do if i in PrimerSet then S: = S+', '+IntToStr(i); mmOutput.Lines.Add(S) end;

2.

 

Порядок выполнения работы.

 

1. Открыть проект Delphi Structures.

2. Добавить в управляющее главное меню пункт «Лабораторная работа №1», при выборе которого должно появляться окно модуля «Set» (модуль «Set» с формой добавить в проект).

3. Установить на форму модуля Set компоненты, обеспечивающие ввод исходных данных, управляющую кнопку (класса TButton или TBitBtn) и компоненты для вывода результатов на экране в соответствии с вариантом задания таблицы №1.

4. В обработчике события onClick управляющей кнопки на языке

Object Pascal написать фрагмент программы для реализации алгоритма в соответствии с вариантом задания.

Отладить обработчик на тестовых примерах и продемонстрировать работу приложения преподавателю.

5. Составить отчет и защитить работу преподавателю. В отчете обязательно представить блок-схему алгоритма решения задачи.

Таблица 8.1

№ вар. Текст задачи
  1.   Type Stroka= string[80]; Var s: stroka; Описать функцию Schet(s), подсчитывающую общее кол-во цифр и знаков '+', '-', '*', входящих в строку s. Организовать Windows- приложение в Delphi, в котором исходная строка вводится с клавиатуры с помощью объекта класса TEdit, а результаты обращения к Function Schet вывести в объект класса TLabel.
  2. Type month= 1..12; Описать функцию CountDays (m: month), определяющую количество дней в месяце m ( невисокосного типа). Организовать Windows- приложение в Delphi, в котором номер месяца вводить с помощью объекта класса TEdit, а результат обращения к функции CountDays для введенного месяца вывести в объект класса TLabel.  
  3. В языке Паскаль нет стандартной операции, позволяющей узнать, сколько и какие именно элементы входят в некоторое множество. Как реализовать эту операцию другими средствами языка? Пусть имеем описание: Type Lat = set of 'a'.. 'z'; Var А: Lat; Описать: 1)функцию count(А), подсчитывающую количество элементов в множестве А ( например: count(['d', 'q', 's']) =3). 2)процедуру print(A), которая выводит на экран в алфавитном порядке все элементы множества А.  
  4. Не используя дополнительных переменных, поменять местами значения переменных- множеств А и В.  
  5. Дан текст из цифр и малых латинских букв, за которым следует точка. Определить, каких букв- гласных( а, е, i, o, u) или согласных больше в этом тексте. Использовать тип множество.  
  6. Описать функцию Digits(n: integer), подсчитывающую количество различных(значащих) цифр в десятичной записи натурального числа n. Организовать Windows- приложение, в котором с помощью объекта класса TEdit ввести натуральное n, обратиться к функции Digits для подсчета количества различных цифр в записи числа и вывести полученный результат в объект на форму.   Рекомендация. Сначала выделить цифры из числа n и записвть их в множество sd.  
  7. Дан текст из малых латинских букв, за которым следует точка. Организовать программу, которая ищет и выводит: 1) первое вхождение каждой буквы в текст, сохраняя их исходный порядок. 2) все буквы, входящие в текст( на выводе все буквы по одному разу, независимо от того, сколько раз они встречаются в тексте.   Рекомендация. В цикле посимвольной обработки текста формируйте множество, в которое войдут все буквы, встречающиеся в этом тексте.  

 

Контрольные вопросы

 

 

1. Что представляет собой структура данных множество?

2.Какие операции допустимы при работе с множествами?

3.Как добавить элемент в множество?

4.Как убрать элемент из множества?

5.Что представляет собой пустое множество?

6.С помощью какой функции можно извлечь порядковый номер элемента в множестве?

 

 

Лабораторная работа № 7
Организация и использование статической библиотеки (Unit ) в Delphi. Использование списков выбора

 

 

Цель работы:

освоить организацию модуля(статической библиотеки) в DELPHI, научиться подключать модуль и использовать в вызывающей программе подпрограммы модуля.

 

Домашнее задание:

1 Изучить структуру модуля Unit в DELPHI и состав его разделов.

2 Освоить назначение и структуру оператора Uses.

3 Изучить способы передачи параметров в подпрограммы и их возврат в точку вызова в вызывающую программу, а также работу с глобальными переменными.

 

Теоретические сведения:

 

Модули - это программные единицы, предназначенные для размещений фрагментов программ. С помощью содержащегося в них программного кода реализуется вся поведенческая сторона программы.

 

Любой модуль имеет следующую структуру

: заголовок, секция интерфейсных объявлений, секция реализации, терминатор.

Заголовок открывается зарезервированным словом Unit, за которым следует имя модуля и точка с запятой. Секция интерфейсных объявлений открывается зарезервированным словом Interface, a секция реализации - словом Implementation. Терминатором модуля, как и терминатором программы, является end с точкой.

Следующий фрагмент программы является синтаксически правильным вариантом модуля:

unit Unit1;

Interface

// Секция интерфейсных объявлений

Implementation

// Секция реализации

End.

 

В секции интерфейсных объявлений описываются программные элементы (типы, классы, процедуры и функции), которые будут “видны” другим программным модулям, а в секции реализации раскрывается механизм работы этих элементов. Разделение модуля на две секции обеспечивает удобный механизм обмена алгоритмами между отдельными частями одной программы. Он также реализует средство обмена программными разработками между отдельными программистами.


Поделиться:



Популярное:

  1. II.4. Набор прографки таблицы и вывода
  2. P.S., указывающий на несостоятельность выводов расследования, проведенного ГПМ.
  3. XI. Общие психолого-педагогические выводы.
  4. Анализ теоретико-экспериментальных исследований и формулирование выводов и предложений
  5. АС2. Сбор и ввод исходных данных
  6. Астное.8 отдельно отображается ения десятичного с дробью числа, а типовой для него формат вывода может представиться неудобным
  7. База правил нечеткой логики. Блок вывода. Нечеткий вывод на основе правила композиции.
  8. В курсовой и выпускной и выпускной работе применяются только затекстовые и подстрочные ссылки. В затекстовых ссылках – полное библиографическое описание книги, в подстрочных – краткое.
  9. В приведённых ниже предложениях из прочитанного текста пронумерованы все запятые. Выпишите цифры, обозначающие запятые при вводном слове.
  10. Вакцину БЦЖ с целью иммунизации вводят
  11. Ввод в действие генераторов для параллельной работы
  12. Ввод данных в окно Поиск решения


Последнее изменение этой страницы: 2017-03-11; Просмотров: 1500; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.178 с.)
Главная | Случайная страница | Обратная связь