Тема 2.7 Процедуры и функции. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Тема 2.7 Процедуры и функции.



   В языках программирования вспомогательные алгоритмы называются подпрограммами. В Паскале различаются две разновидности подпрограмм: процедуры и функции. Рассмотрим этот вопрос на примере следующей задачи: даны два натуральных числа а и b. Требуется определить наибольший общий делитель трех величин: а + Ь, |а – Ь|, а- b. Запишем это так: НОД(a + b, |а- b|, а • b). 

  Идея решения состоит в следующем математическом факте: если х, у, z — три натуральных числа, то НОД(х, у, z) = = НОД(НОД(х, у), z)- Иначе говоря, нужно найти НОД двух величин, а затем НОД полученного значения и третьего числа (попробуйте это доказать).

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

 

Процедура Евклид(цел M,N,K);

Нач

пока M< >N

Нц

 если M>N

то M:=M-N

иначе N:=N-M

кв

кц;

К:=М

Кон

 

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

алг    задача;

цел    а,b,с;

нач       ввод (а,b);

        Евклид(a+b, |a-b|,с);

        Евклид(с,а*b,с);

      вывод(с)

кон.

 

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

 Program NODI;

Var А,В,С: Integer;

   Procedure Evklid(M,N: Integer; Var К: Integer); 

Begin While M< >N Do If M>N 

Then M:=M-N

 Else N:=N-M;

 K:=M

 End;

 Begin 

  Write('a=');

 ReadLn(A); 

  Write('b='); 

    ReadLn(B); 

  Evklid(A+B,Abs(A-B),C);

  Evklid(C,A*B,C); 

  WriteLn('HOД=',C) 

End. 

 

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

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

 

 


  Процедура в качестве результата может передавать в вызываю­ щую программу множество значений (в частном случае — одно), а может и ни одного. Теперь рассмотрим правила обращения к процедуре. Обращение к процедуре производится в форме опера­ тора процедуры (рис. 24).

 

 

 

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

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

         В рассмотренном нами примере формальные параметры Ми N являются параметрами-значениями. Это аргументы процедуры. При обращении к ней первый раз им соответствуют значения выражений а + Ь и abs (a- b); второй раз — с и а • Ь. Параметр К является параметром-переменной. В ней получается результат работы процедуры. В обоих обращениях к процедуре соответствующим фактическим параметром является переменная с. Через эту переменную основная программа получает результат.      

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

 

Program NOD2; 

Var A,B,K,M,N: Integer;

  Procedure Evklid; 

Begin

  While MON Do 

  If M>N 

  Then M:=M-N 

  Else N:=N-M; 

  K:=M 

End; 

Begin 

    Write('a='); 

  ReadLn(A); 

  Write('b='); 

  ReadLn(B); 

  M:=A+B; 

  N:=Abs(A-B); 

  Evklid; 

  M:=K; 

  N:=A*B; 

  Evklid; 

 WriteLn('HOД равен',К) 

End. 

     Чтобы разобраться в этом примере, требуется объяснить новое для нас понятие: область действия описания.  

      Областью действия описания любого программного объекта (переменной, типа, константы и т.д.) является тот блок, в котором расположено это описание. Если данный блок вложен в другой (подпрограмма), то присутствующие в нем описания являются локальными. Они действуют только в пределах внутреннего блока. Описания же, стоящие во внешнем блоке, называются глобальными по отношению к внутреннему блоку. Если глобально описанный объект используется во внутреннем блоке, то на него распространяется внешнее (глобальное) описание. В программе N0D1 переменные М, N, К — локальные внутри процедуры; переменные а, b, с — глобальные. Однако внутри процедуры переменные а, Ь, с не используются. Связь между внешним блоком и процедурой осуществляется через параметры. В программе N0D2 все переменные являются глобальными. В процедуре Evklid нет ни одной локальной переменной (нет и параметров). Поэтому переменные Ми N, используемые в процедуре, получают свои значения через оператор присваивания в основном блоке программы. Результат получается в глобальной переменной К, значение которой выводится на экран.           Использование механизма передачи через параметры делает процедуру более универсальной, независимой от основной программы. Однако в некоторых случаях оказывается удобнее использовать передачу через глобальные переменные. Чаще такое бывает с процедурами, работающими с большими объемами информации. В этой ситуации глобальное взаимодействие экономит память ЭВМ. 

     Функции. Теперь выясним, что такое подпрограмма-функция. Обычно функция используется в том случае, если результатом подпрограммы должна быть скалярная (простая) величина. Тип результата называется типом функции. В Турбо Паскале допускаются функции строкового типа. Синтаксическая диаграмма описания функции представлена на рис. 25.  

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

 

 

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

Program N0D3; 

Var А,В,Rez:Integer;

Function Evklid(M,N:Integer):Integer; 

          Begin 

While HON Do If M>N 

Then M:=M-N 

Else N:=N-M; 

Evklid:=M 

End;

Begin

Write('a='); 

ReadLn(A); 

Write('b='); 

  ReadLn(B);  

  Rez:=Evklid(Evklid(A+B, Abs(A-B)), A*B); 

WriteLnCNOD равен',Rez) 

End.

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

      Обращение к функции является операндом в выражении. Оно записывается в следующей форме:

<Имя функции> (<Список фактических параметров>)

    Правила соответствия между формальными и фактическими параметрами все те же. Сравнивая приведенные выше программы, можно сделать вывод, что программа N0D3 имеет определенные преимущества перед другими. Функция позволяет получить результат путем выполнения одного оператора присваивания. Здесь иллюстрируется возможность того, что фактическим аргументом при обращении к функции может быть эта же функция. 

    По правилам стандарта Паскаля возврат в вызывающую программу из подпрограммы происходит, когда выполнение подпрограммы доходит до ее конца (последний End). Однако в Турбо Паскале есть средство, позволяющее выйти из подпрограммы в любом ее месте. Это оператор-процедура Exit. Например, функцию определения наи­ большего из двух данных вещественных чисел можно описать так:

 

Function Max(X,Y: Real): Real;

Begin

Max:=X; 

If X>Y Then Exit Else Max:=Y 

End;

 

    Еще раз об области действия описаний. В Паскале неукоснительно действует следующее правило: любой программный объект (константа, переменная, тип и т.п.) должен быть описан перед использованием в программе. Иначе говоря, описание объекта дол­ жно предшествовать его первому появлению в других фрагментах программы. Это правило относится и к подпрограммам. 

    На рис. 26 схематически показана структура взаимного расположения описаний подпрограмм в некоторой условной программе. Попробуем, используя эту схему, разобраться в вопросе об области действия описаний подпрограмм. 

       Любая подпрограмма может использоваться лишь в пределах области действия ее описания. Например, область действия подпрограмм А и В — основная программа. Поэтому из основной программы можно обратиться к подпрограммам А и В. В свою очередь, в подпрограмме В могут быть обращения к подпрограмме А; а из А нельзя обратиться к В, поскольку описание А предшествует описанию В. Подпрограммы А\ и А2 локализованы в подпрограмме А и могут использоваться только в ней; из А2 можно обратиться к А1, но не наоборот. 

       Из подпрограммы В1 можно обратиться к А, поскольку ее описание является глобальным по отношению к 51, но нельзя обратиться к А1, поскольку область действия описания А1 не распро­ страняется на блок подпрограммы В. 

       Из подпрограммы 522 можно обратиться только к 521, 51, А. Объясните сами почему.

       Все понятно? Если нет, то прочитайте еще раз этот раздел. Очень важно в нем разобраться. Если одно и то же имя описано во внешнем блоке (глобально) и во внутреннем блоке (локально), то последнее описание (локальное) перекрывает первое в пределах внутреннего блока. Рассмотрим следующий пример:

Program Examplel;        Program Example2;

Var X: Integer;             Var X: Integer;

Procedure P;                      Procedure P;

Var X: Integer;             Begin

Begin WriteLn('x=',X)          WriteLn('x=',X)

End;                                           End;

Begin X:=l;                        Begin X:=l;

P                                                 P

End.                                           End.

 

        Что выведется на экран в результате работы программы Examplel и Example2? Первая программа выдаст результат: 

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

х=1

 

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

    Во втором примере переменная х одна на всю программу. Она описана глобально. Поэтому значение 1, присвоенное ей в основной программе, передается и в подпрограмму. 

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

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

 

Здесь функция факториала определена через факториал. Нетрудно понять справедливость такого определения. Для п > 0

 

Вариант 0!=1 является тривиальным. Но это «опорное» значение, от которого начинается раскручивание всех последующих значений факториала:

Рассмотрим подпрограмму-функцию, использующую в своем описании приведенную выше рекурсивную формулу.

Предполагается, что тип Pozlnt объявлен глобально следующим образом: 

Type Pozlnt=0..Maxlnt;

 

Пусть в основной программе для вычисления в целой переменной х значения 3! используется оператор 

X:=Factor (3);

      При вычислении функции с аргументом 3 произойдет повторное обращение к функции Factor (2). Это обращение потребует вычисления Factor (1). И наконец, при вычислении Factor (0) будет получен числовой результат 1. Затем цепочка вычислений раскрутится в обратном порядке: 

Factor(1)=l*Factor(0)=1 

Factor(2)=2*Factor(l)=2

Factor(3)=3*Factor(2)=6. 

      Последовательность рекурсивных обращений к функции должна обязательно выходить на определенное значение. А весь маршрут последовательных вхождений машина запоминает в специ­ альной области памяти, называемой стеком. Таким образом, выполнение рекурсивной функции происходит в два этапа: прямой ход — заполнение стека; обратный ход — цепочка вычислений по обратному маршруту, сохраненному в стеке. Использование рекурсивных функций — красивый прием с точки зрения программистской эстетики. Однако этот путь не всегда самый рациональный. Рассмотренную задачу с n! можно решить так:

  Очевидно, что такой вариант программы будет работать быстрее, чем рекурсивный. И в том случае, когда важнейшим является сокращение времени выполнения программы, следует отдать предпочтение последнему варианту.

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

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

 

 

 

Тема 2.8 Файлы.

     С термином «файл» вам уже приходилось встречаться. Прежде всего это понятие обычно связывают с информацией на устройствах внешней памяти. В Паскале понятие файла употребляется в двух смыслах: 

• как поименованная информация на внешнем устройстве (внешний файл); 

• как переменная файлового типа в Паскаль-программе (внутренний файл). 

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

     Файловый тип переменной — это структурированный тип, представляющий собой совокупность однотипных элементов, количество которых заранее (до исполнения программы) не определено. Структура описания файловой переменной: Var <имя переменной>: File Of <тип элемента>; где <тип элемента> может быть любым, кроме файлового. 

     Например: 

Var Fi: File Of Integer; 

Fr: File Of Real; 

Fc: File Of Char; 

     Файл можно представить как последовательную цепочку элементов (эл.), пронумерованных от 0, заканчивающуюся специальным кодом, называемым маркером конца (<м. к.>): 

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

     Для того чтобы начать запись в файл, его следует открыть для записи. Это обеспечивает процедура Rewrite (FV); где FV — имя файловой переменной. При этом указатель устанавливается на начало файла. Если в файле есть информация, то она исчезает. Схематически выполнение процедуры Rewrite можно представить так:

 

 

 

     Стрелка внизу отмечает позицию указателя. Запись в файл осуществляется процедурой Write (FV, V); где v — переменная того же типа, что и файл FV. Запись происходит туда, где установлено окно (указатель). Сначала записывается значение,

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

Пример 1. В файловую переменную Fx занести 20 вещественных чисел, последовательно вводимых с клавиатуры.

 

   Для чтения элементов файла с его начала следует открыть файл для чтения. Это делает процедура Reset (FV). 

   В результате указатель устанавливается на начало файла. При этом вся информация в файле сохраняется. Схема выполнения процедуры:

   Чтение из файла осуществляется процедурой Read (FV, v); где v — переменная того же типа, что и файл FV. Значение текущего элемента файла записывается в переменную v; указатель смещается к следующему элементу.

     Доступ к элементам файла может быть последовательным или прямым. В стандартном Паскале реализован только последовательный доступ. 

     Принцип последовательного доступа: для того чтобы прочитать n-ю запись файла, сначала нужно прочитать все предыдущие записи с 1-й по (n-1)-ю.

     Пример 2. В переменной х получить 10-й элемент вещественного файла Fx.

      Функция Eof (FV) проверяет маркер конца файла (end of file). Это логическая функция, которая получает значение true, если указатель установлен на маркер конца, в противном случае — false.  

      Пример 3. Просуммировать все числа из файла Fx, описанного в предыдущем примере.

To же самое с помощью цикла Repeat можно делать следующим образом:

 

   Во втором варианте возможна ошибка чтения, если файл Fx пустой. Первый вариант от такой ошибки застрахован, поэтому он более предпочтителен. 

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

     Стандартные имена логических устройств определяются операционной системой, в среде которой работает Паскаль. В системе MS DOS определены следующие имена: 

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

       PRN (принтер) — логическое имя файла, связанного с устройством печати; 

       AUX — логическое имя коммуникационного канала, который используется для связи ПК с другими машинами; 

       INPUT — логическое имя стандартного устройства ввода, связанного с клавиатурой; при этом вводимые с клавиатуры символы отражаются на экране дисплея;        OUTPUT — логическое имя стандартного устройства вывода на экран. Магнитный диск   (МД) — многофайловое устройство. На нем хранятся как стандартные (системные) файлы, так и файлы, создаваемые пользователем.

        На магнитном диске могут создаваться файлы любых типов. Файлы на МД используются как в режиме чтения, так и в режиме записи. Список файлов на диске хранится в директории (каталоге) диска. Каталог вызывается на экран системной командой DIR. В полной форме каталог содержит идентификаторы файлов, объем занимаемой памяти, дату и время создания файла. Идентификатор файла состоит из имени и типа файла: <имя файла>.<тип файла> 

        Имя содержит от 1 до 8 латинских букв и (или) цифр; тип — необязательный элемент (от 0 до 3 символов), указывающий на характер информации, хранимой в файле. Например: PROGRAM, PAS — в файле текст программы на Паскале; NUMBER. DAT — файл числовых данных; NAMES. тхт — текстовый файл. Для организации связи между файловой переменной и внешним файлом в Турбо Паскале используется процедура назначения: 123 Assign(<имя файловой переменной>, <идентификатор внешнего файла>); Здесь <идентификатор внешнего файла> — строковая вели­ чина (константа или переменная). Например: Assign(Fi,'Number.dat'); 

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

        Работа с файлом в программе завершается его закрытием с помощью процедуры Close (<имя файловой переменной>) Например: Close(Fi) Подведем итог сказанному. Для создания и заполнения файла требуется следующая последовательность действий: 

1. Описать файловую переменную. 

2. Описать переменную того же типа, что и файл. 

3. Произвести назначение (Assign). 

4. Открыть файл для записи (Rewrite).

5. Записать в файл данные (Write). 

6. Закрыть файл (Close). 

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

 

 

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

     Для последовательного чтения данных из файла требуется выполнить следующие действия: 

1. Описать файловую переменную. 

2. Описать переменную того же типа. 

3. Выполнить назначение (Assign). 

4. Открыть файл для чтения (Reset).

5. В цикле читать из файла (Read).

6. Закрыть файл (close). 

Пример 5. Определить среднюю температуру для значений, хранящихся в файле Temp.dat.

 

     В этой программе использована функция определения размера файла: FileSize(<имя файловой переменной>); 

     Ее результат — целое число, равное текущей длине файла. Замечание: согласно стандарту Паскаля в файл, открытый оператором Rewrite, можно только записывать информацию, а файл, открытый оператором Reset, можно использовать только для чтения. В Турбо Паскале допускается запись (Write) в файл, открытый для чтения (Reset). Это создает определенные удобства для модификации файлов. 

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

Var <исентификатор>:text;

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

 

 

Каждый символ представлен во внутреннем коде (ASCII) и занимает 1 байт. Текстовый файл отличается от символьного не только делением на строки. В текстовой файл можно записать и из него прочитать информацию любого типа. Если эта информация несимвольная, то в процессе чтения или записи происходит ее преобразование из символьной формы во внутреннюю и обратно. Текстовый файл можно создать или преобразовать с помощью текстового редактора. Его можно просмотреть на экране дисплея или распечатать на принтере. В программах на Паскале для работы с текстовыми файлами наряду с процедурами Read и Write употребляются процедуры  

ReadLn и WriteLn. 

 

ReadLn(FV,<список ввода>)

   Эта процедура читает строку из файла с именем FV, помещая прочитанное в переменные из списка ввода

WriteLn(FV,<список вывода>)

    Процедура записывает в файл FV значения из списка вывода, после чего выставляет маркер конца строки. Для обнаружения конца строки в текстовом файле используется функция Eoln(FV) (End of line — конец строки). Это логическая функция, которая принимает значение true, если указатель файла достиг маркера конца строки и false — в противном случае. Употребление операторов Read и ReadLn без указания имени файловой переменной обозначает чтение из стандартного файла input (ввод с клавиатуры).

   Употребление операторов Write и WriteLn без имени файловой переменной обозначает запись в стандартный файл Output (вывод на экран). В таком варианте этими операторами мы уже многократно пользовались. Считается, что файлы input и Output всегда открываются соответственно для чтения и записи при работе любой программы. При вводе с клавиатуры маркер конца строки обнаруживается при нажатии на клавишу Enter. Процедура ReadLn может использоваться без списка ввода. В этом случае происходит пропуск текущей строки в читаемом файле.

    Употребление процедуры WriteLn без списка вывода обозначает вывод пустой строки (в файле выставляется маркер конца строки). При записи в текстовый файл в списке вывода могут присутствовать форматы. Действия форматов мы уже рассматривали при обсуждении вывода данных на экран. Точно так же форматы работают и при выводе в текстовые файлы, связанные с любыми другими устройствами. 

    Пример 6. Пусть файл с именем Note. txt содержит некоторый текст. Требуется подсчитать количество строк в этом тексте.

  Используемый здесь оператор ReadLn (Note) «пролистывает» строки из текстового файла Note, не занося их в какую-либо переменную. 

  Пример 7. В текстовом файле Note. txt определить длину самой большой строки.

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

Пример 8. Требуется решить следующую задачу. Под действием силы Fc начальной скоростью К в вязкой среде движется тело массой М. Сопротивление пропорционально квадрату скорости с коэффициентом К. Определить время прохождения пяти контрольных точек траектории, расстояние до которых от точки старта заданы. Пусть с помощью текстового редактора в файле Date. txt сформированы исходные данные в форме следующей таблицы:

Требуется ввести числовые данные в вещественные переменные м, F, V, к и массив х [ 1.. 5 ], произвести расчеты и получить ре­ зультаты в массиве т [ 1.. 5 ]. Результаты следует вывести на экран, а также в текстовый файл на диске с именем Result.txt. 

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

   Результаты будут сохранены в файле Result. txt. Их можно посмотреть на экране, распечатать на бумаге. При необходимости этот файл может стать входным для другой программы, если содержащаяся в нем информация будет исходной для решения другой задачи.



Поделиться:


Последнее изменение этой страницы: 2021-04-05; просмотров: 109; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.144.233.150 (0.119 с.)