Выбор аппаратов высокого напряжения

Цель работы

Обучение студентов вводу данных в программу из текстовых файлов с неоднородной информацией. Использование циклических операторов for, repeat, while для организации ввода, логических переменных для выбора АВН, операторов if для организации списков вывода.

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

1. Создать в своём каталоге папку лаб2.

2. Получить задание на выбор АВН (генераторы, трансформаторы, выключатели, изоляторы и т.п) и скопировать файл данных в созданную папку.

3. Выполнить пункты 2,3 и 5 из лабораторной работы 1.

4. Написать процедуру чтения данных из файла в следующей последовательности:

а) создать раздел описания переменных после заголовка процедуры перед началом основной части, написав var (точку с запятой в коде процедуры после слово var не ставить);

б) в созданном разделе описания переменных предусмотреть использования следующих переменных:

f1,f2: text file;

s,filename:string;

I,N:integer;

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

if OpenDialog1.Execute then assignfile (f1,OpenDialog1.FileName);

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

д) закрыть файл командой closefile(f1);

е) между командами открытия файла данных (reset(f1 )) и закрытия файла данных (closefile(f1)) вставить коды чтения файла неизвестной длины до его конца, считая, что информация в файле чисто строковая:

i:=1;

Repeat

readln(f 1, s);

i:=i+ 1;

until eof(f 1 );

N:=i- 1;

В этом участке кода команда repeat играет роль открывающей операторной скобки, а команда until eof(f 1 ) служит закрывающей скобкой. Все операторы, стоящие между этими скобками будут выполняться до тех пор, пока условие, записанное после until не примет значение истина. В данном случае в качестве условия выхода из цикла используется логическая функция eof(f1) (end of file – конец файла), которая принимает значение истина только если достигнут конец файла. Если мы в процессе чтения информации из файла данных не дошли до конца файла, функция eof(f1) имеет значение ложь, условие выхода из файла не выполняется и чтение данных продолжается.

Строки i:=1; и N:=i- 1 нужны для подсчёта числа строк в файле данных. Поскольку команда увеличения счётчика строк i:=i+ 1; ставится до проверки условия выхода из цикла чтения, то число i всегда будет больше числа прочитанных строк на 1. Поэтому число строк N нужно уменьшить на 1.

5. Запустить программу на исполнение и исправить ошибки.

6. Дополнить код программы строкой вывода информации в поле мемо:

Memo1.Lines.Add( 'i = ' +IntToStr(i)+ ' '+s );

Строку вывода вставить в тело цикла сразу после строки чтения перед увеличением счётчика строк.

Запустить программу на исполнение и добиться вывода строковой информации в поле мемо.

7. Дополнить процедуру чтения выводом числа прочитанных строк:

Memo1.Lines.Add( 'Число строк в файле = ' +IntToStr(N));

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

8. Заменить цикл чтения repeat until на другой цикл чтения данных до конца файла

while not eof(f 1 ) do

Begin

readln(f 1, s);

i:=i+ 1;

end;

Вставить строки вывода информации в поле мемо. Запустить на исполнение и исправить ошибки. Убедиться, что этот цикл чтения также позволяет правильно читать информацию из файла.

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

10. Дописать код программы отдельным циклом чтения общей информации подставив вместо числа n примера число строк с общей информацией

for i:=1 to n do

begin

readln (f 1,s);

Memo1.Lines.Add(s);

end;{for}

Этот пример кода вставить сразу после команды открытия файла reset. Запустить программу на исполнение и исправить ошибки. Определить число строк с фактической информацией. Убедиться, что информация в поле мемо совпадает с информацией в файле данных.

11. Дописать код программы строками описания оборудования высокого напряжения. На пример, для описания трансформаторов следует перед разделом описания переменных var в вашей процедуре записать строки типа:

Type

transformer = record marka:string[20];

Uvn,Usn,Unn, Snom:real;

end{transformer};

transformers = array[1..20] of transformer;

Раздел описания типов (после объявления var дополнить строками типа: tr1, tr2, tr3: transformer; trs: transformers;

После этого описания программа будет понимать, что transformer – это запись, состоящая из полей, у которых имена и тип данных указываются после команды record (запись, играет роль открывающей операторной скобки) до закрывающей запись скобки end (здесь конец записи). В фигурных скобках следует указать, к какой записи относится данный конец. Строка transformers = array[1..20] of transformer; означает, что именем transformers мы описываем массив (однотипное множество) из 20 элементов трансформатор, тип и структура которых были описаны в записи transformer. Число элементов в этом массиве должно быть равно или больше числа соответствующих элементов в файле данных. Например, в файле данных 28 трансформаторов, а в описании массива трансформаторов всего 20, как в примере. Возникнет ошибка, так как 21 по счёту трансформатор некуда будет помещать, поскольку ему места не было предусмотрено. Какие поля должны быть в разделе описания типа оборудования следует выяснить из файла данных.

12. Изменить команду чтения в цикле, заменив строку s на trs[i]. marka.

Должно быть что то типа readln(f 1, trs[i]. marka);

В случае другого оборудования подставить соответствующее имя. В команде вывода в поле мемо сделать такую же замену. Запустить программу на исполнение и добиться правильного чтения марки оборудования. Для более успешного выполнения поиска ошибок кроме марки выводить и номер строки по примеру: Memo1.Lines.Add( 'i = ' +IntToStr(i)+ ' '+ trs[i]. marka );

13. Дополнить процедуру чтения информации из файла: кроме марки прочитать число в поле, следующим за полем марка. Например

readln(f 1, trs[i]. marka, trs[i].Uvn);

Убедиться в правильности чтения, выведя прочитанную информацию в поле мемо, дополнив строку вывода

Memo1.Lines.Add( 'i = ' +IntToStr(i)+ ' '+ trs[i]. marka+' Uvn= '+ FloatToStr( trs[i].Uvn) + ' кВ ');

Запустить программу на исполнение и исправить ошибки.

14. Изменить код программы, чтобы кроме марки оборудования читалось ещё 3 или 4 фактических параметра. Проверить выводом в поле мемо правильность чтения.

15. Дополнить код программы открытием файла для записи и записать в файл вывода всё, что читается из файла данных. Для этого после команды readln(f 1, ……) вставить команду writeln(f2, ……) в соответствующих местах.

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

а) раздел описания переменных дополнить описанием логических переменных. Например: a, a 1, a 2, a 3, a 4: boolean;

б) после выхода из цикла чтения данных вывести в поле мемо и файл вывода строку ' Оборудование, удовлетворяющее заданным условиям ';

в) после определения числа трансформаторов (или другого оборудования), т.е. после стоки N:=i- 1; создать цикл с заданным числом повторений (число трансформаторов то мы уже знаем):

for i:= 1 to N do

begin

end;

г) пусть, например, производится чтения информации по трансформаторам. Высшее напряжение трансформаторов может принимать различные значения, которые содержатся в полях trs[i].Uvn. Нас будут интересовать только те трансформаторы, у которых высшее значение равно, например, 500 кВ. В этом случае логической переменной, например, а1 следует присвоить результат сравнения значения поля trs[i].Uvn с числом 500 кв. Поскольку значения высшего рабочего напряжения в программе описывается числом с плавающей запятой, то в операции сравнения не следует применять знак равно, а только знаки больше или меньше (возможно сочетание этих знаков со знаком равно). Для нашего примера это будет так:

if abs(trs[i].Uvn- 500 ) < 1 then a 1 :=true else a 1 :=false;

Эта же строка означает, что если абсолютное значение (без знака, модуль) разницы trs[i].Uvn- 500 меньше какой то величины, например 1, то логическая переменнтая а1 примет значения истина, а если больше 1, то ложь. Вместо числа 1 можно использовать и другие, большие числа, но они не должны превышать треть различий между ближайшими номинальными напряжениями. С таким же точно смыслом, но более коротко, вместо вышеприведённой строки может быть записана строка условия в виде

a1:=abs(trs[i].Uvn- 500 ) < 1;

одну из этих двух строк вставить в цикл сразу после открывающей цикл скобки (begin);

д) вставить строку вывода информации в поле мемо по условию а1:

if a1 then

begin

writeln(f 2, trs[i]. marka, trs[i].Uvn, trs[i].Usn, trs[i].Unn, trs[i].Snom);

Memo1.Lines.Add( 'i = ' +IntToStr(i)+ ' '+ trs[i]. marka+' Uvn= '+ FloatToStr( trs[i].Uvn) )+ ' кВ '.

end;

Этот участок кода означает, что если выполняется условие а1, то начинается вывод характеристик трансформатора в файл вывода и поле мемо;

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

a:=a1 and a2 and a3 and a4;

В условном операторе вывода следует заменить а1 на а.

Отчет по лабораторной работе должен содержать три файла, расположенные в собственном каталоге lab2, например: trans.pas, trans.dat, lab2.res. В файле lab2.res должен содержаться отчет по всем вариантам расчетов, проводившихся во время выполнения работы.

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

1. В какой позиции находится указатель файла после его открытия оператором reset?

2. Чем различаются однородные и неоднородные файлы? Приведите примеры из техники высоких напряжений.

3. Как правильно организовать текстовый файл с данными об аппаратах высокого напряжения? Приведите пример.

4. Как «пролистать» первые строки файла данных, которые содержат общую информацию о его структуре?

5. Как прочитать целиком строку файла данных?

6. Какой из циклических операторов можно использовать для чтения общей информации о файле?

7. Чем различаются операторы repeat и while? Приведите пример их использования.

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

9. Как определить число строк в файле? Запишите код примера программы.

10. Какие формы оператора if применяются в языке Паскаль? Приведите примеры.

11. Для чего нужен оператор case? Приведите пример синтаксиса.

12. Как описать логические переменные в языке Паскаль? Какие операции с логическими переменными существуют?

13. В чем состоит различие при выборе какого-либо конкретного значения целочисленной переменной и переменной с плавающей запятой? Приведите пример выбора из техники высоких напряжений.

14. Как организовать выбор АВН по нескольким параметрам? Приведите пример кода программы.

15. Чем различаются операторы or и and?

16. Как изменить значение логической переменной на противоположное?

17. Как использовать логическую функцию конца файла для организации чтения файла неизвестной длины?

Лабораторная работа 5


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: