Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Stud_2_1 / Kurs_Rab / Metuk.doc
Скачиваний:
20
Добавлен:
03.03.2016
Размер:
523.78 Кб
Скачать

О Б Щ И Е М Е Т О Д И Ч Е С К И Е У К А З А Н И Я

Курсовая работа для студентов специальности 7.091501 "Компьютерные системы и сети" очно-заочной формы обучения включает в себя задания, ориентированные на разработку и выполнение многомодульных программ на языке Турбо Паскаль.

Пояснительная записка к курсовой работе, представленная студентом на кафедру, должна содержать:

- вариант задания;

- условие задачи;

- краткое описание алгоритма и программы;

- листинг программы;

- результаты решения задачи.

В методическом пособии приведено 65 вариантов задач. Выбор варианта производится по согласованию с преподавателем, который ведет в учебной группе занятия по программированию и контролирует выполнение курсовой работы.

Тексты курсовой работы, в том числе листинги программ, следует выполнять на стандартных листах бумаги формата А4. При этом на титульном листе должно быть написано:

Донецкий национальный технический университет

Кафедра электронных вычислительных машин

Пояснительная записка

к курсовой работе по программированию

ст-та гр. (шифр группы)

Фамилия и инициалы

Номер зачетной книжки …

Домашний адрес: …

Текст программы (листинг) и результаты решения задачи должны быть отпечатаны на принтере. Для этого целесообразно использовать непосредственно возможности компилятора языка Турбо Паскаль. Если же по каким-либо причинам печать текста программы осуществляется с помощью текстового процессора Word, то для этого нужно использовать шрифт Courier New размером 12 (в шрифте Courier New каждый символ текста занимает отдельную позицию). В тексте программы в обязательном порядке должны быть выполнены требования по стилю программирования, приведенные в п.9 методуказаний.

Следует отметить, что текст программы, приведенной в данных методуказаниях в качестве примера выполнения типичного задания, отпечатан с помощью текстового процессора Word. Поэтому механический перенос его в операционную среду MS DOS для компиляции транслятором Turbo Pascal связан с определенными трудностями. В то же время многие фрагменты этой программы, в первую очередь сервисные процедуры и функции, могут быть использованы студентами при выполнении своего задания. В связи с этим студентам рекомендуется переписать на дискету в дисплейном классе кафедры ЭВМ оригинальный текст указанного примера (файлы программных модулей DesUnit.pas, BasUnit.pas, InpUnit.pas, WorkUnit.pas, Kursrab.pas, файлы исходных данных Input.txt, Kodif.txt, Add.txt и файл Readme.txt с кратким пояснением примера). Включение указанных фрагментов в свою программу путем копирования файла по крайней мере экономит время, нерационально затрачиваемое при наборе их с клавиатуры.

М Е Т О Д И Ч Е С К И Е У К А З А Н И Я

по теме курсовой работы

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

1. О б щ и е з а м е ч а н и я

В широко распространенных административно-учетных системах (АУС), называемых также автоматизированными системами управления (АСУ), объектом машинной обработки является документ (группа документов).

АСУ с точки зрения программной реализации имеет ряд характерных признаков.

1. Использование большого количества файлов для представления входной, корректирующей, обрабатывающей и результирующей информации.

2. Превалирование операций ввода-вывода в общем времени решения задачи по сравнению с вычислительными операциями (в отличие от научно-технических задач).

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

Любой документ структурно разделяется на три части: "шапка", колонки и строки. Колонки документа, отображающие его содержательную часть, называют также реквизитами.

В документах, обрабатываемых на ЭВМ, часто встречаются повторяющиеся текстовые реквизиты (например, наименование кафедры, название учебной дисциплины в АУС вуза и т.п.). Для уменьшения затрат памяти при хранении и обработке документов такие реквизиты заменяют кодами (шифрами), а соответствие между шифрами и определяющими их текстами отображают в отдельных файлах, которые называют кодификаторами соответствующей информации. Для выходных документов, в случае необходимости, по заданному шифру автоматически определяется из кодификатора его текстовый эквивалент, который и выдается на печать.

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

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

- ввод записей из текстового файла и формирование типизированного файла, который рассматривается в дальнейшем как архив АУС;

- группировку архива по определенному признаку;

- вывод на экран и печать на принтере архива АУС;

- дополнение архива новыми записями;

- удаление заданной записи из архива;

- изменение реквизитов заданной записи;

- формирование выходных документов.

Исходный текстовый файл, как правило, должен содержать не менее 20 записей. Дополнение архива должно производиться с использованием отдельного текстового файла, содержащего 3 - 5 записей.

Использование кодификатора при выполнении курсовой работы необязательно.

2. В в о д з а п и с е й

Предположим, что личная карточка студента содержит следующие реквизиты: фамилия и инициалы, дата рождения, национальность, год окончания школы, пол. Этой карточке поставим в соответствие следующее описание записи:

Type Date = record

Day : 1..31; { число }

Month : 1..12; { месяц }

Year : 1970 .. 2006; { год }

end;

StudType = record

Fam : string[25]; { фамилия и инициалы }

BirthDay : Date; { дата рождения }

Nac : string[15]; { национальность }

SchoolYear { год окончания школы }

: 1990..2000;

Sex : char { пол }

end;

Var Student : StudType; { личная карточка }

F : text; { исходный текстовый файл }

В данном примере для объявления компонентов Day, Month, Year, SchoolYear использован диапазонный тип. С точки зрения объема выделяемой памяти эти объявления не отличаются от следующих:

Day,Month : byte;

Year,ShoolYear : word.

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

Контроль присваивания ординальным переменным новых значений осуществляется автоматически, если включена директива компилятора R. При наличии такой директивы транслятор вставляет в программу группы дополнительных машинных команд, что увеличивает ее объем и замедляет выполнение. Поэтому директиву R рекомендуется использовать лишь в процессе отладки программы.

Рассмотрим два варианта ввода записи из текстового файла F. В обоих вариантах предполагается, что реквизиты записи размещаются в одной строке текстового файла. Значения реквизитов разделяются между собой одним или несколькими пробелами.

Вариант 1.

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

Пример строки файла F:

Петренко А.С. 15 5 1980 украинец 1977 м

Тогда программа ввода одной записи может иметь следующий вид:

With Student do

Begin

Read(F,Fam);

Read(F,BirthDay.Day,BirthDay.Month,

BirthDay.Year);

Repeat

Read(F,ch);

Until ch<>' ';

Read(F,Nac);

Insert(ch,Nac,1);

Read(F,SchoolYear);

Repeat

Read(F,ch);

Until ch<>' ';

Sex:=ch;

Readln(F);

End;

Комментарии к программе:

1. В программе предполагается, что переменная Student.Fam записана с первой позиции строки текстового файла. Если это не так, то пробелы, поставленные в строке файла перед реквизитом "фамилия и инициалы", будут включены в состав переменной Student.Fam, что в дальнейшем отразится на корректности работы программы.

2. В одной строке файла одновременно размещены разнотипные элементы: числа и строки. Эти элементы отделены друг от друга одним или несколькими пробелами. Процедура Read при вводе числовой переменной автоматически выделяет ее из строки текстового файла. При вводе переменной типа string пробел воспринимается как обычный символ. Поэтому в вышеприведенной программе для индикации начала текстовой строки с помощью цикла Repeat перебираются позиции строки файла до тех пор, пока в символьную переменную ch не будет прочитан символ, отличный от пробела, после чего читается строковая переменная Nac.

Поскольку первый символ реквизита "национальность" был прочитан в символьную переменную ch, то его добавление в переменную Nac производится процедурой Insert.

3. Аналогично с помощью цикла Repeat выполняется индикация символа, соответствующего реквизиту Sex.

4. Процедура Readln(F) выполняет переход на новую строку текстового файла для ввода следующей записи.

Предположим, что при формировании текстового файла не соблюдено соответствие между количеством позиций в строке файла и объявлением переменной типа string. Например, для переменной Fam отведено менее 25 позиций:

Петренко А.С. 15 5 1980 украинец 1977 м

Тогда вводимое значение переменной Fam в данном случае будет иметь вид:

'Петренко А.С. 15 5',

для переменной BirthDay.Day будет введено значение 1980 (на самом деле эта переменная, соответствующая типу byte, получит значение 188 - последний байт значения 1980 в формате word (07BC)), а при попытке присвоить переменной BirthDay.Month значение "украинец" произойдет прерывание программы с выводом сообщения "Runtime Error 106: Invalid numeric format" (“Ошибка периода выполнения 106: Неправильный числовой формат”).

С точки зрения пользователя, вариант 1 имеет серьезный недостаток: при подготовке текстового файла необходимо постоянно следить, чтобы значение переменной Student.Fam занимало в строке файла не менее 25 позиций, а переменной Student.Nac - не менее 15 позиций, вне зависимости от текущей длины этих переменных. В то же время для повышения сервиса пользователя более удобно было бы оставить лишь одно ограничение: элементы строки файла должны разделяться одним или несколькими пробелами. Пример реализации ввода записей Student из текстового файла с учетом указанного ограничения приведен ниже как вариант 2.

Вариант 2.

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

Пример строки файла F:

Петренко А.С. 15 5 1980 украинец 1977 м

Программа ввода одной записи может иметь вид:

Var k,k1,k2 : byte;

Code : integer;

Cond : boolean;

Sa,Sb : string;

With Student do

Begin

Readln(F,Sa);

k:=0; k2:=0;

Cond:=true;

While Cond do

Begin

k1:=NotSpace(Sa,k2+1);

If k1=0 then

Cond:=false

Else

Begin

k2:=Space(Sa,k1+1);

If k2=0 then

Begin

k2:=length(Sa)+1;

Cond:=false;

End;

Inc(k);

Sb:=Copy(Sa,k1,k2-k1);

Case k of

1 : Fam:=Sb;

2 : Begin

Fam:=Fam+' '+Sb;

While length(Fam)<25 do

Fam:=Fam+' ';

End;

3 : Val(Sb,BirthDay.Day,Code);

4 : Val(Sb,BirthDay.Month,Code);

5 : Val(Sb,BirthDay.Year,Code);

6 : Begin

Nac:=Sb;

While length(Nac)<15 do

Nac:=Nac+' ';

End;

7 : Val(S2,ScoolYear,Code);

8 : Sex:=Sb[1];

end;

End;

End;

End;

В варианте 2 очередная строка текстового файла вводится в строковую переменную Sa. После этого с помощью функций Space и NotSpace, приведенных в модуле BasUnit (п.7 методуказаний), выделяются отдельные слова строки Sa, формирование компонентов записи Student производится оператором Case в соответствии с порядковым номером k выделенного слова. При этом учтено, что между фамилией и инициалами студента в строке исходного файла имеется по крайней мере один пробел.

Строковые переменные Fam и Nac оператором While дополняются пробелами до объявленной длины. Требование четко выдерживать объявленную длину строковой переменной обусловлено тем, что в программе в дальнейшем может производиться поиск записи по фамилии студента или изменение какого-либо текстового реквизита, используя при этом сравнение строковой переменной со значением, которое вводится с клавиатуры.

Следует обратить внимание на одну ошибку, часто допускаемую при формировании текстового файла.

Если в конце текстового файла имеются одна или несколько строк, заполненных пробелами, то программой будет введено соответствующее количество дополнительных записей. В варианте 1 эти записи будут заполнены нулевыми значениями, в варианте 2 они будут копировать последнюю "нормальную" запись. Чтобы исключить пустые строки в конце текстового файла, рекомендуется следующее:

1. В среде редактора Turbo Pascal или Norton Commander (клавиша F4 - Edit) нажать клавиши Ctrl + PgDn, вследствие чего курсор будет перемещен в конец файла.

2. Если курсор установится ниже последней значащей строки текстового файла, то принудительно установить его после последнего символа последней строки файла и выполнить длительное нажатие клавиши Del (3-5 c).

3. Проверить отсутствие пустых строк последовательным нажатием клавишей Ctrl+PgUp, а затем Ctrl+PgDn (переход курсора в начало, а затем в конец файла).

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

1) пустую строку, читаемую из текстового файла, не воспринимать как содержимое очередной записи;

2) предварительно программно проверить текстовый файл и удалить из него пустые строки, если они имеются.

В примере выполнения курсовой работы (программа Kursrab) реализован второй метод решения указанной проблемы.

Соседние файлы в папке Kurs_Rab