Приложение A - Северо-Кавказский горно

advertisement
ОСНОВЫ ПРОГРАММИРОВАНИЯ
Методические указания к курсовой работе
Для студентов, обучающихся по направлению подготовки
230100.62 – «Информатика и вычислительная техника»
Составитель А. А. Будаева
Владикавказ 2015
0
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ
Федеральное государственное бюджетное образовательное учреждение
высшего профессионального образования
"СЕВЕРО-КАВКАЗСКИЙ ГОРНО-МЕТАЛЛУРГИЧЕСКИЙ ИНСТИТУТ
(ГОСУДАРСТВЕННЫЙ ТЕХНОЛОГИЧЕСКИЙ УНИВЕРСИТЕТ)"
Кафедра автоматизированной обработки информации
ОСНОВЫ ПРОГРАММИРОВАНИЯ
Методические указания к курсовой работе
Для студентов, обучающихся по направлению подготовки
230100.62 – «Информатика и вычислительная техника»
Составитель А. А. Будаева
Допущено
редакционно-издательским советом
Северо-Кавказского горно-металлургического института
(государственного технологического университета).
Протокол заседания РИСа № 1 от 17.01.2014 г.
Владикавказ 2015
1
УДК 004.432.2
ББК 32.973.26-0.18.1
Б90
Рецензент
кандидат технических наук,
доцент Северо-Кавказского горно-металлургического института
(государственного технологического университета)
Даурова А. А.
Б90
Основы программирования: Методические указания к курсовой работе. Для студентов, обучающихся по направлению подготовки 230100.62 – "Информатика и вычислительная техника" / Сост. А. А. Будаева; Северо-Кавказский горно-металлургический институт (государственный технологический университет). –
Владикавказ: Северо-Кавказский горно-металлургический институт (государственный технологический университет). Изд-во «Терек», 2015. – 36 с.
Методические указания содержат инструкции по выполнению курсовой работы по дисциплине «Основы программирования» для студентов направления подготовки «Информатика и вычислительная техника» 230100.62.
Методические указания способствуют углубленному изучению приемов программирования, а также практическому освоению всех этапов разработки программного продукта от постановки задачи до практической реализации, сопровождающейся документацией и инструкциями по его использованию.
Приводится тематика курсовых работ, основные принципиальные положения, практические примеры.
УДК 004.432.2
ББК 32.973.26-0.18.1
Работа публикуется в авторской редакции, орфографии, пунктуации.
 Составление. ФГБОУ ВПО «Северо-Кавказский
горно-металлургический институт
(государственный технологический университет)», 2015
 Будаева А. А., составление, 2015
Подписано в печать 19.02.2015. Формат 60х84 1/16. Бумага офсетная. Гарнитура «Таймс».
Печать на ризографе. Усл. п.л. 2,09. Уч.-изд. л. 1,28. Тираж 20 экз. Заказ №
.
Северо-Кавказский горно-металлургический институт (государственный технологический
университет). Издательство «Терек».
Отпечатано в отделе оперативной полиграфии СКГМИ (ГТУ).
362021, г. Владикавказ, ул. Николаева, 44.
2
СОДЕРЖАНИЕ
Введение .....................................................................................................
1. Задание на курсовую работу .................................................................
2. Содержание пояснительной записки (ПЗ) ...........................................
2.1. Структура ПЗ ..................................................................................
2.2. Порядок выполнения ПЗ курсовой работы ..................................
3. Теоретические основы, необходимые для выполнения курсовой
работы .........................................................................................................
3.1. Перечень вопросов, подлежащих изучению ...............................
3.2. Создание и обработка файлов .......................................................
3.3. Указатели и динамическая память ...............................................
Список рекомендуемой литературы ........................................................
Приложение A ............................................................................................
Приложение B ............................................................................................
Приложение C ............................................................................................
Приложение D ............................................................................................
3
4
–
5
–
–
7
–
8
16
23
24
25
32
34
Введение
Целью курсовой работы является закрепление основ и углубление
знаний приемов программирования на языке Delphi, получение практических навыков в создании программного продукта.
В курсовой работе предлагается разработать программный продукт
по созданию и обработке файлов, используемых для долговременного
хранения информации. При этом требуется самостоятельно определить
структуру и характеристики значений вводимых данных, обосновать используемый способ обмена информацией, создать файл во внешней памяти, предусмотреть ряд функций по обработке информации.
При выполнении курсовой работы студент самостоятельно осваивает
все этапы создания программного продукта от постановки задачи до
практической реализации, сопровождающейся документацией и инструкциями по его использованию. При выполнении курсовой работы
студентам необходимо обратить внимание на качество создаваемой программы.
1. Задание на курсовую работу
Необходимо разработать программу по созданию и обработке файлов, используемых для хранения информации. Вводимые данные представляют собой следующую структуру:
Элемент 1
Элемент 2
Элемент 3
…
Элемент N
где 5<=N<=12.
Студент должен самостоятельно:
1. Определить число информационных полей для выбранного объекта, предложить конкретную структуру записи.
2. Сформулировать техническое задание (ТЗ) для конкретной системы.
Любая информационно-поисковая система должна выполнять следующие функции:
 вывод содержимого файла;
 добавление новых данных в файл;
 выборка информации по любому элементу данных;
 удаление информации об объекте по заданному признаку;
4
сортировка информации по выбранному признаку;
3. Выполнить программную реализацию на языке Delphi, для проверки работоспособности программы взять вариант исходных данных не
менее 15-20 записей.
4. Результаты проверки работоспособности программы сохранить в
файле-протоколе.

2. Содержание пояснительной записки (ПЗ)
2.1. Структура ПЗ
Пояснительная записка должна содержать все разделы, отражающие
этапы создания программного комплекса, должны быть выполнены рубрикация текста (см. как это выполнено в данном пособии), пронумерованы страницы, сделаны ссылки на используемую литературу (для ссылок
используются квадратные скобки, например [3]) и составлено оглавление.
Основные разделы пояснительной записки:






техническое задание на разработку информационного и программного обеспечения (1–2 стр.);
структура информационного и программного обеспечения; (1 стр.)
описание алгоритмов и подпрограмм (функций и процедур), используемых для создания программного обеспечения; (2–3 стр.)
тексты программных модулей; (5–10 стр.)
протоколы работы программного обеспечения (ПО) по всем
функциям, заложенным в техническом задании; (3–5 стр.)
список используемой литературы (1 стр.).
2.2. Порядок выполнения ПЗ курсовой работы
2.2.1. Техническое задание
В процессе разработки технического задания (ТЗ) студент получает
первоначальные навыки в составлении ТЗ на программное обеспечение
по выданному заданию на курсовую работу. В ТЗ должны быть проработаны следующие основные вопросы:
 введение (состояние поставленной задачи на момент получения
задания), где должна быть указана цель разработки, область применения
программного обеспечения (ПО), сформулировано авторское наименова5
ние программного продукта (ПП), который соответствует заданию на
курсовую работу;
 требования к программному продукту. Здесь должны быть перечислены все функции, которые необходимо реализовать в процессе создания программы.
2.2.2. Структура информационного обеспечения
Студент должен выбрать тип организации для хранения данных и
способ доступа к ним. Применительно к языку Delphi можно остановиться на последовательном файле. Структура записи должна иметь все поля,
необходимые для реализации заказанных функций в ТЗ. Для каждого поля записи необходимо определиться с типом данных.
2.2.3. Структура программного обеспечения
Структура программы зависит от заданных функций в ТЗ и от выбора
структуры информационного обеспечения. Рекомендуется вести диалог с
пользователем через меню, где для каждого заказанного требования
предусмотреть отдельную функцию.
2.2.4. Алгоритмы по созданию процедур и функций
Алгоритмы могут быть приведены в словесной форме, в виде графических схем, либо в некоторых случаях можно привлечь математический
аппарат. Простые алгоритмы реализации программных модулей можно
не приводить, обеспечив необходимыми комментариями тексты процедур
(тексты разместить в следующем разделе).
В данном разделе необходимо привести полный перечень всех подпрограмм, входящих в состав программы с указанием выполняемой
функции, описать назначение формальных параметров, пояснив тип данных для каждого параметра.
2.2.5.
Тексты программных модулей
Тексты распечатываются после получения правильных результатов
по всем запланированным функциям ПО. Тексты должны быть снабжены
комментариями. Комментариями нельзя злоупотреблять, большое количество загромождает суть программы, ухудшает читабельность текста,
как и их полное отсутствие. При размещении пояснений по тексту программы следует придерживаться следующих рекомендаций:
6
написать комментарии по разработанным функциям;
выделить логически завершенные участки, важные по содержательному пониманию работы программы.


2.2.6.
Протоколы, подтверждающие работоспособность
программы
Для проверки работоспособности программы необходимо:
 самостоятельно подготовить данные, подобрав конкретные значения таким образом, чтобы можно было убедиться в правильности работы
каждой заданной функции в ТЗ;
 выполнить проверку конкретных значений контрольного примера
по всем предусмотренным в ТЗ функциям;
 распечатать файл с протоколом работы программы, включающий
распечатку данных и, если требуется, пояснения результатов.
2.2.7.
Список используемой литературы
Список литературы приводится по общепринятым правилам для технической литературы. На приведенную литературу должны быть сделаны
ссылки в тексте пояснительной записки.
3. Теоретические основы, необходимые для выполнения
курсовой работы
3.1.
Перечень вопросов, подлежащих изучению
В процессе выполнения работы студент должен разобраться в следующих вопросах:
 основы файлового ввода/вывода информации;
 произвольный доступ к файлу;
 организация ввода/вывода для типов, определенных пользователем;
 основные принципы работы с динамической памятью;
 динамические структуры данных.
В курсовой работе рассматриваются типизированные и текстовые
файлы, прямой и последовательный доступы к данным. Студенту необходимо, прежде всего, понимать, как распространяется блок описания данных на текст программы, что такое файл, поток ввода и вывода, внешнее
имя файла, объявление файла в программе, связь потока ввода-вывода с
внешним именем файла в среде операционной системы.
7
Специфика поставленной задачи состоит в том, что размер базы данных не ограничен, поэтому для ее хранения необходимо использовать динамические структуры данных.
Основное внимание при программировании поставленной задачи
следует уделить разбиению на процедуры (функции) и спецификации их
интерфейсов. Например, логично оформить в виде процедуры (функции)
каждую операцию с базой данных (формирование, поиск, добавление и
удаление элементов и т. д.), поскольку они представляют собой законченные действия.
3.2. Создание и обработка файлов
3.1.1.
Общие сведения о файлах
Под файлом понимается либо именованная совокупность внешней
память ПК, либо логического устройства – потенциальный источник или
приемник информации.
Любой файл имеет три характерные особенности. Во-первых, у него
есть имя, что дает возможность программе работать одновременно с несколькими файлами. Во-вторых, он содержит компоненты одно типа. Типом
компонентов может быть любой тип Delphi, кроме файлов. В-третьих, длина
вновь создаваемого файла никак не оговаривается при его объявлении и
ограничивается только емкостью устройств внешней памяти.
Работа с физическими файлами происходит через так называемые
файловые переменные.
Файловые переменные имеют специфическое применение. Над ними
нельзя выполнять никаких операций (присваивать значение, сравнивать и
т. д.). Их можно использовать лишь для выполнения операций с файлами
(чтение, запись и т. д.).
Элементы файла считаются расположенными последовательно, то
есть так же, как элементы линейного массива. Отличие же состоит в том,
что, во-первых, размеры файла могут меняться, во-вторых, способ обращения к элементам совсем другой: невозможно обратиться к произвольному элементу файла; элементы его просматриваются только подряд от
начала к концу, при этом в каждый момент времени доступен только один
элемент. Можно представить себе, что для каждого файла существует
указатель, показывающий в данный момент на определенный компонент
файла. После проведения операции чтения или записи указатель автоматически передвигается на следующий компонент.
Файловый тип или переменную файлового типа можно задать одним
из трех способов:
8
<имя> = FILE OF <тип>;
<имя> = TEXT;
<имя> = FILE;
Здесь <имя> – имя файлового типа (правильный идентификатор);
FILE, OF – зарезервированные слова
TEXT – имя стандартного типа текстовых файлов;
<тип> – любой тип Delphi, кроме файлов.
Например:
type
product = record
name : string;
code : Word;
cost : comp;
end;
text80 = file of String [80];
var
f1 : file of char;
f2 : text;
f3 : file;
f4 : text80;
f5 : file of product;
В зависимости от способа объявления можно выделить три вида
файлов:
 типизированные файлы (задаются предложением FILE OF);
 текстовые файлы (определяются типом TEXT);
 нетипизированные файлы (определяются типом FILE).
Вид файла, вообще говоря, определяет способ хранения информации
в файле. Однако в Delphi нет средств контроля вида ранее созданных
файлов. При объявлении уже существующих файлов программист должен
следить за соответствием вида объявления характеру файла.
3.1.2. Доступ к файлам
Любой программе доступны два предварительно объявленных файла
со стандартными файловыми переменными: INPUT – для чтения данных с
клавиатуры и OUTPUT – для вывода на экран.
Любые другие файлы, а также логические устройства становятся доступны программе после выполнения особой процедуры открытия файла
9
(логического устройства). Эта процедура заключается в связывании ранее
объявленной файловой переменной с именем существующего или вновь
создаваемого файла, а также в указании направления обмена информацией: чтение из файла или запись в него.
Файловая переменная связывается с именем файла в результате обращения к стандартной процедуре AssignFile:
AssignFile(<ф.п.>, <имя файла или л.у.>);
здесь <ф.п.> – файловая переменная (правильный идентификатор, объявленный в программе как переменная файлового типа);
<имя файла или л.у.> – текстовое выражение, содержащее имя файла
или логическое устройство.
Если имя файла задается в виде пустой строка, например,
AssignFile(f, ‘’), то в зависимости от направления обмена данными файловая переменная связывается со стандартным файлом INPUT
или
OUTPUT.
Имя файла – это любое выражение строкового типа, которое строится по правилам определения имен в MS-DOS (операционной системе ПК).
Максимальная длина имени вместе с путем – 79 символов, например:
var
finp : text;
fout : file of String;
const
name = ‘c:\dir\subdir\out.txt’;
begin
AssignFile( finp, ‘123.dat’ );
AssignFile( fout, name );
end.
3.1.3.
Процедуры и функции общие для всех видов файлов
Процедура Reset( var f ); – открывает логический файл f для последующего чтения данных или, как говорят, открывает входной файл. После успешного выполнения процедуры Reset файл готов к чтению из него
первого элемента.
Процедура Rewrite( var f ); – открывает логический файл f для последующей записи данных (открывает выходной файл). После успешного выполнения этой процедуры файл готов к записи в него первого элемента. Если файл существовал, то он затирается новым.
10
Процедура CloseFile( var f ); – закрывает открытый до этого логический файл. Вызов процедуры CloseFile необходим при завершении работы с файлом. Если по какой-то причине процедура CloseFile не будет
выполнена, файл все же будет создан на внешнем устройстве, но содержимое последнего буфера в него не будет перенесено. Для входных файлов использование оператора закрытия файла необязательно.
Функция EOF( var f ): Boolean; – возвращает значение TRUE, когда
при чтении достигнут конец файла. Это означает, что уже прочитан последний элемент в файле или файл после открытия оказался пуст.
Процедура Rename( var f; NewName: String ); –позволяет переименовать физический файл на диске, связанный с логическим файлом f. Переименование возможно после закрытия файла.
Процедура Erase( var f ); – уничтожает физический файл на диске,
который был связан с файловой переменной f. Файл к моменту вызова
процедуры Erase должен быть закрыт.
Функция IOResult: Integer; – возвращает целое число, соответствующее коду последней ошибки ввода - вывода. При нормальном завершении операции функция вернет значение 0. Значение функции IOResult
необходимо присваивать какой-либо переменной, так как при каждом
вызове функция обнуляет свое значение. Функция IOResult работает
только при выключенном режиме проверок ошибок ввода - вывода или с
ключом компиляции {$I-}.
3.1.4.
Текстовые файлы
Текстовые файлы связываются с файловыми переменными, принадлежащими стандартному типу TEXT. Они предназначены для хранения
текстовой информации.
Текстовый файл трактуется как совокупность строк переменной длины. Доступ к каждой строке файла возможен лишь последовательно,
начиная с первой. При создании текстового файла в конце каждой записи
(строки) ставится специальный признак EOLN (End Of LiNe – конец строки), а в конце всего файла – признак EOF (End Of File – конец файла). Эти
признаки можно протестировать одноименными логическими функциями.
Процедура Reset(var t:text); -открывает текстовый файл t только для
чтения.
Процедура ReWrite(var t:text); - открывает текстовый файл t только
для записи.
Процедура Append( var t: Text ) служит для специального открытия
выходных файлов. Она применима к уже существующим физическим
файлам и открывает их для дозаписи в конец файла.
11
Процедура Read(var t:text, X1,X2,...XK) – предназначена для чтения
информации из текстового файла. Переменные Х1, Х2,...ХК могут быть
либо переменными целого, действительного, символьного типа, либо
строкой. При вводе переменных типа CHAR выполняется чтение одного
символа из файла и присваивание считанного значения переменной. При
вводе переменных типа STRING количество считанных процедурой и помещенных в строку символов равно максимальной длине строки, если
только раньше не встретились символы перевода каретки. Если количество символов во входном потоке данных больше максимальной длины
строки, «лишние» символы отбрасываются, а новое обращение к READ
возвращает пустую строку. Таким образом, данная процедура не в состоянии прочесть последовательность строк. Для этой цели нужно использовать процедуру READLN.
Процедура ReadLn(var t:text, X1, X2, …,XK); – идентична процедуре READ за исключением того, что после считывания последней переменной оставшаяся часть строки до маркера EOLN пропускается, поэтому
следующее обращение к READLN или READ начинается с первого символа новой строки. Кроме того, эту процедуру можно использовать без
списка ввода (Readln(t:text)), что приведет к пропуску всех символов текущей строки вплоть до EOLN.
Процедура Write(var t:text, X1, X2, …, XK); – предназначена для
записи данных в файл. Переменные X1, X2, …, XK могут быть переменными типа CHAR, STRING, BOOLEAN, а также любого целого или вещественного типа. Любой элемент списка вывода может иметь форму:
OutExpr [ : MinWidth [ : DecPlaces ] ], где OutExpr – выводимое выражение; MinWidth – минимальная ширина поля, в которое записывается
OutExpr; DecPlaces – количество десятичных знаков в дробной части вещественного числа.
Процедура WriteLn(var t:text, X1, X2, …, XK); – идентична предыдущей, за исключением того, что выводимая строка символов завершается маркером конца строки. При вызове WRITELN без списка вывода в текущую позицию файла ставится маркер конца строки, что при выводе на
экран приведет в переводу курсора в начало следующей строки.
Функция EOLN(var t:text); – возвращает TRUE, если во входном
текстовом файле достигнут маркер конца строки.
Процедура SetTextBuf( var t: Text; var Buf; BufSize: Word ); – служит для увеличения или уменьшения буфера ввода - вывода текстового
файла t. Значение размера буфера для текстовых файлов по умолчанию
равно 128 байтам. Увеличение размера буфера сокращает количество обращений к диску. Рекомендуется изменять размер буфера до открытия
файла. Буфер файла начнется с первого байта переменной Buf. Размер
12
буфера задается в необязательном параметре BufSize, а если этот параметр отсутствует, размер буфера определяется длиной переменной Buf.
Процедура Flush(var t:Text); – применяется к открытым выходным
файлам. Она принудительно записывает данные из буфера в файл независимо от степени его заполнения.
Функция SeekEOLn( var t: Text ): Boolean; – возвращает значение
TRUE, если до конца строки остались только пробелы.
Функция SeekEOF( var t: Text ): Boolean; возвращает значение
TRUE, если до конца файла остались строки, заполненные пробелами.
3.1.5.
Типизированные файлы
Компонентный или типизированный файл - это файл с объявленным
типом его компонент. Компонентные файлы состоят из машинных представлений значений переменных, они хранят данные в том же виде, что и
память ЭВМ. Длина любого компонента типизированного файла строго
постоянна, что дает возможность организовывать прямой доступ к каждому из них (т.е. доступ к компоненту по его порядковому номеру).
Перед первым обращением к процедурам ввода-вывода указатель
файла стоит в его начале и указывает на первый компонент с номером 0.
После каждого чтения или записи указатель сдвигается к следующему
компоненту файла. Переменные в списках ввода-вывода должны иметь
тот же тип, что и компоненты файла. Если этих переменных в списке несколько, указатель будет смещаться после каждой операции обмена данными между переменными и дисковым файлом.
Компонентами файла могут быть все скалярные типы, а из структурированных - массивы, множества, записи. Практически во всех конкретных реализациях языка Pascal конструкция "файл файлов" недопустима.
Все операции над компонентными файлами производятся с помощью стандартных процедур: Reset, Rewrite, Read, Write, Close.
Процедура Read(f , X[ , X1, …, XK]); – считывает из типизированного файла одну компоненту файла и присваивает ее переменной Х. Х –
переменная (массив, строка, множество, запись) с таким же описанием,
какое имеет компонента файла. Повторное применение процедуры обеспечит чтение следующей компоненты файла и запись ее в X. Если файл
исчерпан обращение к процедуре READ вызовет ошибку ввода-вывода.
Процедура Write(f , X[ , X1, …, XK]); – используется для записи
данных в типизированный файл. Переменная Х записывается в виде одной компоненты файла. Повторное применение этой процедуры обеспечит запись X как следующей компоненты файла.
13
3.1.6.
Нетипизированные файлы
Бестиповые (нетипизированные) файлы позволяют записывать на
диск произвольные участки памяти ЭВМ и считывать их с диска в память.
Операции обмена с бестиповыми файлами осуществляется с помощью процедур BlokRead и BlockWrite. Кроме того, вводится расширенная форма процедур Reset и Rewrite. В остальном, принципы работы
остаются такими же, как и с типизированными файлами.
Перед использованием логический файл должен быть связан с физическим с помощью процедуры AssignFile. Далее файл должен быть
открыт для чтения или для записи процедурой Reset или Rewrite, а после окончания работы закрыт процедурой CloseFile.
При открытии файла длина буфера устанавливается по умолчанию в
128 байт. Delphi позволяет изменить размер буфера ввода - вывода, для
чего следует открывать файл расширенной записью процедур
Reset(var f: File; BufSize: Word )
или
Rewrite(var f: File; BufSize: Word )
Параметр BufSize задает число байтов, считываемых из файла или
записываемых в него за одно обращение. Минимальное значение BufSize
– 1 байт, максимальное - 64 К байт.
Чтение данных из бестипового файла осуществляется процедурой
BlockRead( var f: File; var X; Count: Word; var QuantBlock:
Word );
Эта процедура осуществляет за одно обращение чтение в переменную X количества блоков, заданное параметром Count, при этом
длина блока равна длине буфера. Значение Count не может быть меньше
1. За одно обращение нельзя прочесть больше, чем 64 К байтов.
Необязательный параметр QuantBlock возвращает число блоков
(буферов), прочитанных текущей операцией BlockRead. В случае успешного завершения операции чтения QuantBlock = Count, в случае аварийной ситуации параметр QuantBlock будет содержать число удачно прочитанных блоков. Отсюда следует,
что с помощью параметра
QuantBlock можно контролировать правильность выполнения операции
чтения.
Запись данных в бестиповой файл выполняется процедурой
14
BlockWrite( var f: File; var X; Count: Word; var QuantBlock: Word );
которая осуществляет за одно обращение запись из переменной X количества блоков, заданное параметром Count, при этом длина блока равна
длине буфера.
Необязательный параметр QuantBlock возвращает число блоков (буферов), записанных успешно текущей операцией BlockWrite.
3.1.7. Прямой и последовательный доступ
Смысл последовательного доступа заключается в том, что в каждый
момент времени доступна лишь одна компонента из всей последовательности. Для того, чтобы обратиться (получить доступ) к компоненте с номером К, необходимо просмотреть от начала файла К–1 предшествующую компоненту. После обращения к компоненте с номером К можно
обращаться к компоненте с номером К+1. Отсюда следует, что процессы
формирования (записи) компонент файла и просмотра (чтения) не могут
произвольно чередоваться. Таким образом, файл вначале строится при
помощи последовательного добавления компонент в конец, а затем может
последовательно просматриваться от начала до конца.
Рассмотренные ранее средства работы с файлами обеспечивают последовательный доступ.
Delphi позволяет применять к типизированным и нетипизированным
файлам, записанным на диск, способ прямого доступа. Прямой доступ
означает возможность заранее определить в файле блок, к которому будет
применена операция ввода-вывода. В случае нетипизированных файлов
блок равен размеру буфера, для типизированных файлов блок – это одна
компонента файла.
Прямой доступ предполагает, что файл представляет собой линейную
последовательность блоков. Если файл содержит n блоков, то они нумеруются от 1 через 1 до n. Кроме того, вводится понятие условной границы
между блоками, при этом условная граница с номером 0 расположена перед блоком с номером 1, граница с номером 1 расположена перед блоком
с номером 2 и, наконец, условная граница с номером n находится после
блока с номером n.
Реализация прямого доступа осуществляется с помощью функций и
процедур FileSize, FilePos, Seek и Truncate.
Функция FileSize(var f): Longint возвращает количество блоков в открытом файле f.
Функция FilePos(var f): Longint возвращает текущую позицию в
файле f. Позиция в файле – это номер условной границы. Для только что
15
открытого файла текущей позицией будет граница с номером 0. Это значит, что можно записать или прочесть блок с номером 1. После чтения
или записи первого блока текущая позиция переместится на границу с
номером 1, и можно будет обращаться к блоку с номером 2. После прочтения последней записи значение FilePos равно значению FileSize.
Процедура Seek( var f; N: Longint) обеспечивает назначение текущей
позиции в файле (позиционирование). В параметре N должен быть задан
номер условной границы, предшествующей блоку, к которому будет производиться последующее обращение. Например, чтобы работать с блоком
4, необходимо задать значение N, равное 3. Процедура Seek работает с
открытыми файлами.
Процедура Truncate( var f ) устанавливает в текущей позиции признак конца файла и удаляет (стирает) все последующие блоки.
3.2. Указатели и динамическая память
3.2.1. Общие сведения
Динамическая память (куча) – это оперативная память, предоставляемая программе при ее работе за вычетом сегментов данных и стека и
собственного тела программы. По умолчанию под кучу отводится вся незанятая память. Динамическое размещение данных означает использование динамической памяти непосредственно при работе программы.
Статическим программным объектом называется объект фиксированного размера, память под которые резервируется на все время выполнения программы. Ссылки на статические объекты (доступ) осуществляются по имени – это так называемый непосредственный доступ. При
трансляции имя заменяется адресом данного объекта, то есть номеров
первой ячейки памяти, отведенной для объекта.
Динамическими программными объектами называются объекты, возникающие, исчезающие, изменяющие свои размеры во время выполнения
программы.
Указатель – это переменная, которая в качестве своего значения содержит адрес байта памяти. Как правило, указатель связывается с некоторым типом данных. Такие указатели называются типизированными. Для
объявления типизированных указателей используется значок ^, который
помещается перед соответствующим типом.
type
<имя ссылочного типа> = ^ <имя статического типа>;
16
Например:
type
PString = ^String;
{тип-указатель на строку}
TMas = array[1..100] of word; {статический тип-массив}
PMas = ^TMas;
{тип-указатель на массив}
var
StPtr : PString;
{переменная-указатель на строку}
MasPtr : PMas;
{переменная-указатель на массив}
Mas : TMas;
{статический массив}
St1Ptr : ^String;
{переменная-указатель на строку}
P
: Pointer;
{нетипизированный указатель}
После объявления переменные-указатели занимают по 4 байта в сегменте данных, их значениями являются произвольные адреса и им не соответствуют никакие объекты в куче. Для порождения в куче динамического объекта, на который будет указывать ранее объявленная переменная-указатель, необходима процедура New(P). В результате в динамической памяти порождается переменная (резервируется область памяти) типа, согласованного с указателем P.
Указатель P принимает значения, равные адресу порожденной динамической переменной. Обращение к динамической переменной производится через указатель в формате P^.
Процедура Dispose(P) – возвращает в кучу фрагмент динамической
памяти, который ранее был зарезервирован за типизированным указателем P. При повторном использовании процедуры применительно к уже
освободившемуся фрагменту возникает ошибка периода исполнения. После выполнения данного оператора значение переменной P становится
неопределенным и ее можно считать неинициализированной, поэтому ей
обязательно нужно присвоить значение nil (пустая ссылка, например P:=
nil;). Это предопределенная константа типа Pointer, равная адресу
0000:0000.
3.2.2. Динамические структуры данных
Алгоритмы работы любой программы, предназначенной для обработки данных, зависят от способа обработки данных. Выбор структур данных
должен предшествовать созданию алгоритмов.
Если до начала работы с данными невозможно определить, сколько
памяти потребуется для их хранения, память выделяется по мере необходимости отдельными блоками, связанными друг с другом с помощью ука17
зателей. Такой способ организации данных называется динамическими
структурами данных, поскольку их размер изменяется во время выполнения программы. Из динамических структур в программах чаще всего
используются линейные списки, стеки, очереди, и двоичные деревья. Они
различаются способами связи отдельных элементов и допустимыми операциями. Динамическая структура может занимать несмежные участки
оперативной памяти.
Элемент любой динамической структуры данных представляет собой
запись (record), содержащую, по крайней мере, два поля: для хранения
данных и для указателя. Полей данных и указателей может быть несколько. Поля данных могут быть любого типа: простого, составного или типа
указатель. Описание простейшего элемента (компонента, узла) выглядит
следующим образом:
type
PRec = ^ TRec;
TRec = record
D: <тип данных>;
Next: PRec;
end;
Рассмотрим реализацию основных операций с динамическими
структурами данных.
Стеки
Стеком называется динамическая структура данных, добавление
компоненты в которую и исключение компоненты из которой производится из одного конца, называемого вершиной стека. Стек работает по
принципу LIFO (Last-In, First-Out) - поступивший последним, обслуживается первым.
Обычно над стеками выполняется три операции:
 начальное формирование стека (запись первой компоненты);
 добавление компоненты в стек;
 выборка компоненты (удаление).
Для формирования стека и работы с ним необходимо иметь две переменные типа указатель, первая из которых определяет вершину стека, а
вторая - вспомогательная. Пусть описание этих переменных имеет вид:
var pTop, pAux: Pointer;
где pTop - указатель вершины стека;
pAux - вспомогательный указатель.
18
Начальное формирование стека выполняется следующими операторами:
New(pTop)
pTop^.pNext:=NIL;
pTop^.D:=D1;
Последний оператор или группа операторов записывает содержимое
поля данных первой компоненты.
Добавление компоненты в стек производится с использованием вспомогательного указателя:
New(pAux);
pAux^.pNext:=pTop;
pTop:=pAux;
pTop^.D:=D2;
Добавление последующих компонент производится аналогично.
Рассмотрим процесс выборки компонент из стека. Пусть к моменту
начала выборки стек содержит три компоненты:
Первый оператор или группа операторов осуществляет чтение данных из компоненты - вершины стека. Второй оператор изменяет значение
указателя вершины стека:
D3:=pTop^.D;
pTop:=pTop^.pNext;
Таким образом, при чтении компонент удаляется из стека.
Очереди
Очередью называется динамическая структура данных, добавление
компоненты в которую производится в один конец, а выборка осуществляется с другого конца. Очередь работает по принципу: FIFO (First-In,
First-Out) – поступивший первым, обслуживается первым.
Для формирования очереди и работы с ней необходимо иметь три переменные типа указатель, первая из которых определяет начало очереди,
вторая – конец очереди, третья – вспомогательная.
Описание компоненты очереди и переменных типа указатель дадим
следующим образом:
type
PComp=^Comp;
19
Comp=record
D:T;
pNext:PComp
end;
var
pBegin, pEnd, pAux: PComp;
где pBegin - указатель начала очереди; pEnd - указатель конца очереди;
pAux - вспомогательный указатель; тип Т определяет тип данных компоненты очереди.
Начальное формирование очереди выполняется следующими операторами:
New(pBegin);
pBegin^.pNext:=NIL;
pBegin^.D:=D1;
pEnd:=pBegin;
Добавление компоненты в очередь производится в конец очереди:
New(pAux);
pAux^.pNext:=NIL;
pBegin^.pNext:=pAux;
pEnd:=pAux;
pEnd^.D:=D2;
Добавление последующих компонент производится аналогично.
Выборка компоненты из очереди осуществляется из начала очереди, одновременно компонента исключается из очереди. Пусть в памяти
ЭВМ сформирована очередь, состоящая из трех элементов:
Выборка компоненты выполняется следующими операторами:
D1:=pBegin^.D;
pBegin:=pBegin^.pNext;
Линейные списки
В стеки или очереди компоненты можно добавлять только в какойлибо один конец структуры данных, это относится и к извлечению компонент.
20
Связный (линейный) список является структурой данных, в произвольно выбранное место, которого могут включаться данные, а также
изыматься оттуда.
Каждая компонента списка определяется ключом. Обычно ключ либо число, либо строка символов. Ключ располагается в поле данных
компоненты, он может занимать как отдельное поле записи, так и быть
частью поля записи.
Основные отличия связного списка от стека и очереди следующие:
 для чтения доступна любая компонента списка;
 новые компоненты можно добавлять в любое место списка;
 при чтении компонента не удаляется из списка.
Над списками выполняются следующие операции:
 начальное формирование списка (запись первой компоненты);
 добавление компоненты в конец списка;
 чтение компоненты с заданным ключом;
 вставка компоненты в заданное место списка (обычно после компоненты с заданным ключом);
 исключение компоненты с заданным ключом из списка.
Для формирования списка и работы с ним необходимо иметь пять переменных типа указатель, первая из которых определяет начало списка,
вторая – конец списка, остальные – вспомогательные.
Описание компоненты списка и переменных типа указатель дадим
следующим образом:
type
PComp= ^Comp;
Comp= record
D:T;
pNext:PComp
end;
var
pBegin, pEnd, pCKey, pPreComp, pAux: PComp;
где pBegin – указатель начала списка, pEnd – указатель конца списка,
pCKey, pPreComp, pAux - вспомогательные указатели.
Начальное формирование списка, добавление компонент в конец
списка выполняется так же, как и при формировании очереди.
21
Для чтения и вставки компоненты по ключу необходимо выполнить
поиск компоненты с заданным ключом:
pCKey:=pBegin;
while (pCKey<>NIL) and (Key<>pCKey^.D) do
pCKey:=pCKey^.pNext;
здесь Key – ключ, тип которого совпадает с типом данных компоненты.
После выполнения этих операторов указатель pСKey будет определять компоненту с заданным ключом или такая компонента не будет
найдена.
Пусть pCKey определяет компоненту с заданным ключом. Вставка
новой компоненты выполняется следующими операторами:
New(pAux);
pAux^.D:= DK1;
pAux^.pNext:=pCKey^.pNext;
pCKey^.pNext:=pAux;
Для удаления компоненты с заданным ключом необходимо при поиске нужной компоненты помнить адрес предшествующей:
pCKey:=pBegin;
while (pCKey<>NIL) and (Key<>pCKey^.D) do
begin
pPreComp:=pCKey;
pCKey:=pCKey^.pNext
end;
Здесь указатель pCKey определяет компоненту с заданным ключом,
указатель pPreComp содержит адрес предыдущей компоненты.
Удаление компоненты с ключом Key выполняется оператором:
pPreComp^.pNext:=pCKey^.pNext;
22
Список рекомендуемой литературы
1. Архангельский А. Я. Язык Pascal и основы программирования в
Delphi. Учебное пособие. М.: Бином-Пресс, 2004. 496 с.
2. Глинский Я. Н., Анохин В. Е., Ряжская В. А. Turbo Pascal 7.0 и
Delphi. Учебное пособие. СПб: ООО «ДиаСофтЮП», 2003. 208 с.
3. Моргун А. Н., Кривель И. А. Программирование на языке Паскаль.
Основы обработки структур данных, М.: Вильямс, 2006. 328 с.
4. Немнюгин С. А. Turbo Pascal. Практикум. СПб.: Изд-во «Питер»,
2003. 272 с.
5. Немнюгин С. А. Turbo Pascal. Программирование на языке высокого уровня. СПб.: Изд-во «Питер», 2003. 544 с.
6. Окулов С. М. Основы программирования. М.: ЮНИМЕДИАСТАЙЛ, 2002. 453 с.
7. Павловская Т. А. Паскаль. Программирование на языке высокого
уровня. Учебник. СПб.: Изд-во «Питер», 2003. 400 с.
8. Павловская Т. А. Паскаль. Программирование на языке высокого
уровня. Практикум. СПб.: Изд-во «Питер», 2006. 320 с.
23
Приложение A
Образец оформления титульного листа курсовой работы
Министерство образования и науки Российской Федерации
Северо-Кавказский горно-металлургический институт
(государственный технологический университет)
Кафедра автоматизированной обработки информации
КУРСОВАЯ РАБОТА
по дисциплине:
Основы программирования
Выполнил:
Студент ___________________
Группа ____________________
Проверил:
Преподаватель: ______________
Дата защиты ________________
Оценка ____________
Владикавказ 2015
24
Приложение B
Пример текста программы с минимальным набором функций
program kursovik;
{$APPTYPE CONSOLE}
uses
SysUtils;
type
TYear = 1000..3000;
bibl = record {определение типа элемента данных}
avtor:string;
title:string;
izdan:string;
year:TYear;
tirazh: word;
end;
PBibl = ^TBibl; {Определение типа структуры данных(список)}
TBibl = record
book:bibl;
next, pred:PBibl;
end;
MyFile = file of bibl; {объявление файловой переменной для доступа к
файлу}
const filename = 'C:\mybibl.dat'; {задаем полное имя файла}
var
beg, en,au:PBibl;
x:bibl;
f:MyFile;
c:char;
function MainMenu:byte;
{отображает главное меню и возвращает номер выбранного пункта}
var c:byte;
begin
25
writeln; writeln;
writeln('===========================================');
writeln('||
MAIN MENU
||');
writeln('===========================================');
writeln('|| 1. Add book.
||');
writeln('|| 2. List biblioteka.
||');
writeln('|| 3. Sort biblioteka.
||');
writeln('|| 4. Save to file.
||');
writeln('|| 5. Exit.
||');
writeln('===========================================');
writeln;writeln;
write('Your choise: '); read(c);
Result:=c;
end;{of MainMenu}
function SortMenu:byte;
{отображает меню сортировки, возвращает выбранный пункт меню}
var c:byte;
begin
writeln; writeln;
writeln('===========================================');
writeln('||
SORT MENU
||');
writeln('===========================================');
writeln('|| 1. Book avtor.
||');
writeln('|| 2. Book title.
||');
writeln('|| 3. Book izdanie.
||');
writeln('|| 4. Book year.
||');
writeln('|| 5. Tirazh.
||');
writeln('|| 6. Back to Main Menu.
||');
writeln('===========================================');
writeln; writeln;
write('Your choise: '); read(c);
Result:=c;
end; {of SortMenu}
procedure BookToList(var beg, en:PBibl;b:PBibl);
26
{добавление элемента b в конец списка}
begin
if en<>nil then
begin
en^.next:=b;
b^.pred:=en;
en:=b;
en^.next:=nil;
end else
begin
en:=b;
en^.next:=nil;
en^.pred:=nil;
beg:=en;
end;
end;
function AddBook(en:PBibl; var beg:PBibl):PBibl;
{добавление нового элемента в динамический список}
var b:Pbibl;
begin
new(b);
readln;
Write('Avtor : ');Readln(b^.book.avtor);
Write('Title : ');Readln(b^.book.title);
Write('Izdanie : ');Read(b^.book.izdan);
Write('Year : ');Readln(b^.book.year);
Write('Tirazh : ');Readln(b^.book.tirazh);
BookToList(beg, en, b);
AddBook:=en;
end; {of AddBook}
procedure LoadBase(var beg, en:PBibl);
{загрузка базы из файла в динамический список}
var book:PBibl;
x:bibl;
begin
beg:=nil; en:=beg;
assign(f, filename);
{I-}
reset(f);
27
if IOResult=0 then
begin
while not eof(f) do
begin
new(book);
read(f,x);
book^.book.avtor:=x.avtor;
book^.book.title:=x.title;
book^.book.izdan:=x.izdan;
book^.book.year :=x.year;
book^.book.tirazh:=x.tirazh;
BookToList(beg, en, book);
end;
end;
{I+}
end;{of LoadBase}
procedure ExitProgram;
{Освобождение памяти и выход из программы}
var book:PBibl;
begin
book:=beg;
while book<>nil do
begin
beg:=beg^.next;
dispose(book);
book:=beg;
end;
halt;
end;{of Exit}
procedure List(beg:PBibl);
{вывод содержимого базы на экран из списка}
var book:PBibl;
function str_(s:string;n:byte):string;
var i:byte;
s1:string;
begin
s1:='';
for i:=1 to n - Length(s) do s1:=s1+' ';
Result:=s1;
28
end;
begin
book:=beg;
writeln('==========================================');
writeln('|| Avtor
|| Title
|| Izdanie || Year || Tirazh ||');
writeln('===========================================');
while book<>nil do
begin
writeln('|| ',book^.book.avtor,str_(book^.book.avtor,13),
'|| ',book^.book.title,str_(book^.book.title,24),
'|| ',book^.book.izdan,str_(book^.book.izdan,12),
'|| ',book^.book.year:5,
'|| ',book^.book.tirazh:7,'||');
book:=book^.next;
end;
writeln('===========================================');
readln;
end;{of List}
procedure Save(beg:PBibl);
{запись данных списка в файл}
var book:PBibl;
begin
rewrite(f);
book:=beg;
while book<>nil do
begin
write(f,book^.book);
book:=book^.next;
end;
close(f);
writeln('Bibl has been saved!!!');
readln;
end;{of Save}
procedure Sort(beg:PBibl;sort_krit:byte);
{сортировка списка по критерию sort_krit }
var flag:byte;
krit:boolean;
b:PBibl;
temp:bibl;
29
begin
repeat
b:=beg;
flag:=0;
while b^.next<>nil do
begin
case sort_krit of
1:krit := b^.book.avtor>b^.next^.book.avtor;
2:krit := b^.book.title>b^.next^.book.title;
3:krit := b^.book.izdan>b^.next^.book.izdan;
4:krit := b^.book.year>b^.next^.book.year;
5:krit := b^.book.tirazh>b^.next^.book.tirazh;
end;
if krit then begin
flag:=1;
temp :=b^.book;
b^.book:=b^.next^.book;
b^.next^.book:=temp;
b:=beg;
end
else b:=b^.next;
end;
until flag=0;
List(beg);
end;
procedure SortBase(beg:PBibl);
{выбор критерия сортировки из меню}
begin
while true do
case SortMenu of
1: Sort(beg,1);
2: Sort(beg,2);
3: Sort(beg,3);
4: Sort(beg,4);
5: Sort(beg,5);
6: exit;
else begin
writeln('Input number between 1 and 6!!! ');
readln;
end;
end;
30
end;
begin{of main program}
beg:=nil;
en:=beg;
LoadBase(beg, en);
while true do
case MainMenu of
1: begin
repeat
en:=AddBook(en, beg);
write('Continue input (Y/N)? ');
read(c);
until c in['N','n'];
end;
2: List(beg);
3: SortBase(beg);
4: Save(beg);
5: ExitProgram;
else begin
writeln('Input number between 1 and 5!!! ');
readln;
end;
end;
end.
31
Приложение C
Пример протокола работы программы
1. Создание нового файла
Ф.И.О. автора
Шилдт Г
Касаткин А.И.
Брябрин В.М
Кормен Т.
Хансен Г.
Нейбауэр
Название книги
Самоучитель С++
Программирование
ПО ПЭВМ
Алгоритмы
Базы данных
Программирование
Год
1998
1990
1988
2000
1998
1998
2. Добавление информации в файл
Ф.И.О. автора : Шилдт Г.
Название книги : Программирование
Год
: 1996
Издательство : BHV
Тираж
: 5000
Ф.И.О. автора
Шилдт Г
Касаткин А.И.
Брябрин В.М
Кормен Т.
Хансен Г.
Нейбауэр
Шилдт Г.
Название книги
Самоучитель С++
Программирование
ПО ПЭВМ
Алгоритмы
Базы данных
Программирование
Программирование
Год
1998
1990
1988
2000
1998
1998
1996
3. Поиск информации
a. по названию: Программирование
Ф.И.О. автора
Касаткин А.И.
Нейбауэр
Шилдт Г.
Название книги
Программирование
Программирование
Программирование
Название книги
Самоучитель С++
Программирование
32
Просмотр информации
Издательство Тираж
BHV
500
Минск
1000
Наука
1000
Москва
2000
Бином
3000
BHV
4000
BHV
5000
Год
1990
1998
1996
Просмотр информации
Издательство Тираж
Минск
1000
BHV
4000
BHV
5000
Год
1998
1996
Просмотр информации
Издательство Тираж
BHV
500
BHV
5000
b. по Ф.И.О автора: Шилдт Г.
Ф.И.О. автора
Шилдт Г
Шилдт Г.
Просмотр информации
Издательство Тираж
BHV
500
Минск
1000
Наука
1000
Москва
2000
Бином
3000
BHV
4000
c. по Ф.И.О автора: Кузнецов
В библиотеке нет книг заданного автора!
4. Удаление информации по фамилии автора
Фамилия автора для удаления: Кормен Т.
Информация удалена!
Ф.И.О. автора
Шилдт Г
Касаткин А.И.
Брябрин В.М
Хансен Г.
Нейбауэр
Шилдт Г.
Название книги
Самоучитель С++
Программирование
. ПО ПЭВМ
Базы данных
Программирование
Программирование
33
Год
1998
1990
1988
1998
1998
1996
Просмотр информации
Издательство Тираж
BHV
500
Минск
1000
Наука
1000
Бином
3000
BHV
4000
BHV
5000
Приложение D
Примерные задания на курсовую работу
1. Информационно-поисковая система Библиотека
Написать программу, реализующую следующие возможности «Библиотеки»:
1) формирование и ведение базы данных;
2) ввод данных о книге – автор, название, тематика, год издания, издательство и т.д.
3) поиск книг по различным критериям. Результаты поиска вывести
в алфавитном порядке;
4) сортировка списка книг.
Осуществить выбор параметров поиска. Данные библиотеки должны
быть записаны в файле. Программа должна обеспечивать диалог с помощью меню и контроль ошибок. Результат всех действий программы занести в файл
2. Информационно-поисковая система Студент
Во входном файле записана следующая информация о каждом студенте: фамилия, имя, отчество, пол, возраст, курс. Сведения о студентах
отделены друг от друга точкой с запятой. Написать программу, которая
вводит эту информацию и печатает следующие данные:
1) формирование и ведение базы данных;
2) номер курса, на котором наибольший процент мужчин;
3) самые распространенные мужские и женские имена;
4) фамилия (в алфавитном порядке) и инициалы всех студенток, возраст и отчества которых являются одновременно самыми распространенными;
5) самого молодого студента.
Программа должна обеспечивать диалог с помощью меню и контроль
ошибок. Результат всех действий программы занести в файл.
3. Информационно-поисковая система Железнодорожный вокзал
Система содержит сведения об отправлении поездов дальнего следования: номер поезда, станция назначения; время отправления и т.д. Данные организованы в виде линейного списка. Составить программу, которая:
34
1) обеспечивает первоначальный ввод данных в систему и формирование линейного списка;
2) производит вывод всего списка;
3) поиск информацию по поездам;
4) вводит название станции назначения и выводит данные обо всех
поездах, следующих до этой станции.
Программа должна обеспечивать диалог с помощью меню и контроль
ошибок. Результат всех действий программы занести в файл.
4. Информационно-поисковая система Сессия
Во входном файле содержится информация об итогах сессии на 1
курсе. Сведения о каждом студенте заданы в виде следующего текста:
фамилия (не более 12 букв), номер группы (целое от 101 до 116), оценка
по физике, оценка по алгебре, оценка по программированию. Сведения о
студентах отделены точкой с запятой. Написать программу, которая вводит эту информацию и печатает следующие данные:
1) формирование и ведение базы данных.
2) фамилии студентов, имеющих задолженности хотя бы по одному
предмету;
3) «качество» успеваемости (процент студентов, сдавших все экзамены на 5 и 4);
4) информация о самом лучшем и худшем студентах по итогам сессии;
Программа должна обеспечивать диалог с помощью меню и контроль
ошибок. Результат всех действий программы занести в файл.
5. Информационно-поисковая система Кадры
Написать программу «Кадры», реализующую следующие возможности:
1) ввод, редактирование и удаление данных о сотруднике;
2) просмотр информации о выбранном сотруднике;
3) поиск всех сотрудников, поступивших на работу за последний год;
4) просмотр списка сотрудников пенсионного возраста.
Результаты поиска выводить в алфавитном порядке. Осуществить
выбор параметров поиска. Все данные брать из файла. Программа должна
обеспечивать диалог с помощью меню и контроль ошибок. Результат всех
действий программы занести в файл.
35
6. Информационно-поисковая система Абонент
Во входном файле содержится информация об абонентах. Сведения о
каждом абоненте заданы в виде следующего текста: ФИО, город, улица,
дом квартира, телефон, общая сумма долга, общая сумма оплаты, дата
оплаты. Написать программу «Абонент», реализующую следующие действия:
1) Ввод, редактирование и удаление данных по абоненту;
2) Вывод базы абонентов;
3) Поиск абонента по телефону, адресу и т. д.;
4) Вывод в алфавитном порядке всех абонентов, имеющих задолженность на текущий момент.
Программа должна обеспечивать диалог с помощью меню и контроль
ошибок. Результат всех действий программы занести в файл.
7. Информационно-поисковая система Склад
Написать программу «Склад», реализующую следующие действия:
1) Ввод, редактирование и удаление данных о товарах – наименование, сезон, количество, стоимость, дата поступления, вид товара и т. д.
2) просмотр отчета о товарах на складе;
3) поиск товаров на складе по наименованию, по дате поступления,
по сезону;
4) удаление информации о товарах, которых нет на складе (количество равно 0).
Результаты поиска выводить в алфавитном порядке. Осуществить
выбор параметров поиска. Все данные брать из файла. Программа должна
обеспечивать диалог с помощью меню и контроль ошибок. Результат всех
действий программы занести в файл.
36
Related documents
Download