- Lektsia - бесплатные рефераты, доклады, курсовые работы, контрольные и дипломы для студентов - https://lektsia.info -

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



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

Пример.

Задача: вычислить сумму ряда S для заданного х с точностью eps.

Организация надежного ввода:

Способ 1. Анализ аномалий.

Аномалии: abs(x)>=1, eps<=0, eps>=1.

Входная форма описывает однократный последовательный ввод переменных х и eps.

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

Чтобы выполнить программу при исправленных данных, требуется повторно ее запустить.

Способ 2. Надежный ввод.

Правильность данных проверяется при вводе. Данные повторяются до тех пор, пока не введутся правильные данные.

Реализация повторения с использованием цикла:

а) Метод объединения условий.

Этот метод структурирования состоит в объединении нескольких условий выхода из цикла в одно сложное логическое выражение:

 

repeat

writeln('Введите правильно х, eps');

readln (x,eps)

until (abs(x)<1) and (eps>0) and (eps<1);

 

Повторяется ввод данных до тех пор, пока не выполнятся одновременно три условия: abs(х)<1 и 0<eps и eps<1.

 

б) Метод флажка (метод булева признака).

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

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

 

flag:=true;

repeat

writeln ('Введите правильно x,eps);

readln (x,eps);

if(abs(x)<=1)then

begin

writeln ('Ошибка в x'); flag:=false

end

else

if ((eps<=0) or (eps>=1)) then

begin

writeln ('Ошибка в eps'); flag:=false

end

until flag;

 

Повторяется ввод данных с детальным анализом правильности х и eps и выводом сообщений об ошибке.

Для завершения цикла используется переменная-флажок flag, которая принимает значения:

flag = true, если данные правильные и flag = false, если данные неправильные.

При flag = true цикл завершается.

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

Var f1:text

Begin

clrscr;

assign(f1,'file.txt');

reset(f1);

Процедура ввода массива может иметь разную степень универсальности

1) инициализация файлов и ввод длины массива происходит в главной программе;

(как в приведенном ниже примере); а ввод массива – в процедуре;

{вход: f– имя ф.п.,n – длина массива; выход: X - массив}

Procedure Input1_mas (var f : text; n : ind; var X : mas);

2) инициализация файлов происходит в главной программе, а ввод длины массива и самого массива – в процедуре;

{вход: f– имя ф.п.,выход:n – длина массива; X - массив}

Procedure Input2_mas (var f: text; var n :ind; var X : mas);

3) в главной программе вводятся внешние имена файлов, а инициализация файлов и ввод длины массива и самого массива – в процедуре;

{вход: Namef– внешнее имя файла,выход:n – длина массива; X - массив}

Procedure Input3_mas (Namef : str8; var n : ind; var X : mas);

4) в процедуре выполняются все операции: вводятся внешние имена файлов, инициализация файлов и ввод длины массива и самого массива

{вход: -- ,выход:n – длина массива; X - массив}

Procedure Input4_mas (var n : ind; var X : mas);

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

5) в главной программе вводятся внешние имена файлов и длины массива, а инициализация файлов и ввод самого массива – в процедуре;

{вход: Namef– внешнее имя файла,n – длина массива; выход: X - массив}

Procedure Input5_mas (Namef : str8; n : ind; var X : mas);

Локализация процедур Паскаля. Внешние процедуры.

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

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

 

Пример.

 

var k: integer;

procedure a;

var x, z: real;

begin

{ через x, z обозначены две величины –

локальные переменные для a;

k – глобальная переменная для a }

…………………………………

end;

procedure b;

var x, y: integer;

begin

{ через x, y обозначены две другие величины –

локальные переменные для b;

k – глобальная переменная для b }

…………………………………

end;

begin

{ k – единственная переменная, которую

можно использовать в основной ветке программы }

…………………………………

end.

 

Стандартная версия языка Паскаль содержит только внутренние процедуры: описание и вызов процедур локализованы в голвном модуле и компиляться вместе с ним. Это обеспечивает необходимую строгость при локализации объектов.

 

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

С т.з. ОС модуль(внешний модуль) – это отдельно компил. Часть программы. В паскаль-программе м.б. только один головной модуль и несколько процедурных. В ТП имеется механизм работы с внешними модулями, что вместе с процедурными типами и средставми программирования нулевого уравня приближает паскаль к языку Модуля.

 

Unit<name>;

INTERFACE

<interface part>

IMPLEMENTATION

<imp. Part>

Begin

<init part>

End.

 

Для установления связи программы с модулем Unit следует после заголовка программы добавить предложение Uses<список модулей>.

Program P;

Uses A;

……….

Имя модуля должно совпадать с именем файла, содержащим модуль: A.pas, B.pas…

 

В интерфейсной части содержатся описания всех глобальных объектов модуля(констанст, типов, переменных, заголовков процедур). Все объекты основной программы и интерф. Части модуля помещаются в общий сегмент даннхы. Макс длина его = 65521 байт.

 

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

 

Структурирование циклов. Метод объединения условий при решении задачи информационного поиска в файле.

(поиск 1 к\ф вышедшего в 1990)

repeat

Readln(fin,name,year);

Until eof(f) or (year=1990);

If eof(fin) then

Writeln(fout, ‘net takogo’);

Else

Writeln(fout, name);

Close (fin); close (fout);

End.

 

53. Структурирование циклов. Метод флажка на примере организации надежного ввода с детальным анализом каждой переменной.

Метод флажка (метод булева признака).

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

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

 

flag:=true;

repeat

writeln ('Введите правильно x,eps);

readln (x,eps);

if(abs(x)<=1)then

begin

writeln ('Ошибка в x'); flag:=false

end

else

if ((eps<=0) or (eps>=1)) then

begin

writeln ('Ошибка в eps'); flag:=false

end

until flag;

 

Повторяется ввод данных с детальным анализом правильности х и eps и выводом сообщений об ошибке.

Для завершения цикла используется переменная-флажок flag, которая принимает значения:

flag = true, если данные правильные и flag = false, если данные неправильные.

При flag = true цикл завершается.