Фигура ввода вывода данных

Ввод-вывод (от англ. input/output , I/O) в информатике — взаимодействие между обработчиком информации (например, компьютер) и внешним миром, который может представлять как человек, так и любая другая система обработки информации. Ввод — сигнал или данные, полученные системой, а вывод — сигнал или данные, посланные ею (или из неё). Термин также может использоваться как обозначение (или дополнение к обозначению) определенного действия: «выполнять ввод-вывод» означает выполнение операций ввода или вывода. Устройства ввода-вывода используются человеком (или другой системой) для взаимодействия с компьютером. Например, клавиатуры и мыши — специально разработанные компьютерные устройства ввода, а мониторы и принтеры — компьютерные устройства вывода. Устройства для взаимодействия между компьютерами, как модемы и сетевые карты, обычно служат устройствами ввода и вывода одновременно.

Содержание

Классификация [ править | править код ]

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

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

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

В контексте языка программирования Алгол-68 механизмы ввод и вывод совместно назывались обменом. Библиотека обмена Алгола-68 распознавала следующие стандартные файлы (устройства): stand in , stand out , stand error и stand back .

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

Интерфейс ввода-вывода [ править | править код ]

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

Установление контакта должно быть реализовано интерфейсом при помощи соответствующих команд типа (ЗАНЯТ, ГОТОВ, ЖДУ), чтобы процессор мог взаимодействовать с устройством ввода-вывода через интерфейс.

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

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

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

Режимы адресации [ править | править код ]

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

Режимы адресации делятся на множество типов, как например, прямая адресация, косвенная (непрямая) адресация, непосредственная адресация, индексная адресация, базовая адресация, базово-индексная адресация, предполагаемая адресация и т. д.

Прямая адресация [ править | править код ]

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

Читайте также:  Как загрузить вацап на компьютер

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

Косвенная адресация [ править | править код ]

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

Ввод-вывод с распределением (вводимой информации) по портам (памяти) [ править | править код ]

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

Выводом называется процедура переноса данных из памяти компьютера на внешние устройства.

При вводе данных напротив, информация извне вносится в память компьютера.

Данные можно ввести с клавиатуры или из файла на диске, вывести их на экран, отпечатать на принтере, кроме того, данные можно сохранить на магнитной ленте или послать по телефонной линии через модем или по факсу.

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

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

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

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

В отличие от переменной, файл (в частности, его имя) имеет смысл вне конкретной программы. Работа с файлами реализуется средствами операционных систем. Более подробно мы рассмотрим работу с файлами позднее.

Различают буферизованный и небуферизованный (прямой) ввод/вывод данных.

Небуферизованный ввод/вывод характерен тем, что символ немедленно доступен ожидающей программе. Примером могут служить функции ch=getch(), putch(ch) из библиотеки conio.

При буферизованном вводе/выводе символы сначала помещаются в специальную область памяти, называемую буфером. Здесь они накапливаются до тех пор, пока не нажата клавиша ENTER или полностью не заполнится буфер. Только после этого накопленный блок данных становится доступным программе. Большинство библиотечных функций языка С и С++ работают с буферизацией, например getchar(), putchar(ch).

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

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

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

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

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

Отметим одно интересное свойство функций ввода языка С. Когда данные вводятся с клавиатуры, они отображаются на экране монитора, при этом в программе не используются никакие функции вывода на экран, это «явление» называется эхопечать. Эхопечать используется в большинстве функций ввода, таких как getchar(), gets(), scanf().

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

Читайте также:  Маленький шрифт английских букв

Герберт Шилдт. Справочник программиста С/С++

Схемаэто абстракция какого-либо процесса или системы, наглядно отображающая наиболее значимые части. Схемы широко применяются с древних времен до настоящего времени — чертежи древних пирамид, карты земель, принципиальные электрические схемы. Очевидно, древние мореплаватели хотели обмениваться картами и поэтому выработали единую систему обозначений и правил их выполнения. Аналогичные соглашения выработаны для изображения схем-алгоритмов и закреплены ГОСТ и международными стандартами.

На территории Российской Федерации действует единая система программной документации (ЕСПД), частью которой является Государственный стандарт — ГОСТ 19.701-90 «Схемы алгоритмов программ, данных и систем» [1]. Не смотря на то, что описанные в стандарте обозначения могут использоваться для изображения схем ресурсов системы, схем взаимодействия программ и т.п., в настоящей статье описана лишь разработка схем алгоритмов программ.

Рассматриваемый ГОСТ практически полностью соответствует международному стандарту ISO 5807:1985.

Содержание:

Элементы блок-схем алгоритмов

Блок-схема представляет собой совокупность символов, соответствующих этапам работы алгоритма и соединяющих их линий. Пунктирная линия используется для соединения символа с комментарием. Сплошная линия отражает зависимости по управлению между символами и может снабжаться стрелкой. Стрелку можно не указывать при направлении дуги слева направо и сверху вниз. Согласно п. 4.2.4, линии должны подходить к символу слева, либо сверху, а исходить снизу, либо справа.

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

Терминатор начала и конца работы функции

Терминатором начинается и заканчивается любая функция. Тип возвращаемого значения и аргументов функции обычно указывается в комментариях к блоку терминатора.

Операции ввода и вывода данных

В ГОСТ определено множество символов ввода/вывода, например вывод на магнитные ленты, дисплеи и т.п. Если источник данных не принципиален, обычно используется символ параллелограмма. Подробности ввода/вывода могут быть указаны в комментариях.

Выполнение операций над данными

В блоке операций обычно размещают одно или несколько (ГОСТ не запрещает) операций присваивания, не требующих вызова внешних функций.

Блок, иллюстрирующий ветвление алгоритма

Блок в виде ромба имеет один вход и несколько подписанных выходов. В случае, если блок имеет 2 выхода (соответствует оператору ветвления), на них подписывается результат сравнения — «да/нет». Если из блока выходит большее число линий (оператор выбора), внутри него записывается имя переменной, а на выходящих дугах — значения этой переменной.

Вызов внешней процедуры

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

Начало и конец цикла

Символы начала и конца цикла содержат имя и условие. Условие может отсутствовать в одном из символов пары. Расположение условия, определяет тип оператора, соответствующего символам на языке высокого уровня — оператор с предусловием (while) или постусловием (do … while).

Подготовка данных

Символ «подготовка данных» в произвольной форме (в ГОСТ нет ни пояснений, ни примеров), задает входные значения. Используется обычно для задания циклов со счетчиком.

Соединитель

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

Комментарий

Комментарий может быть соединен как с одним блоком, так и группой. Группа блоков выделяется на схеме пунктирной линией.

Примеры блок-схем

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

Сортировка вставками

Массив в алгоритме сортировки вставками разделяется на отсортированную и еще не обработанную части. Изначально отсортированная часть состоит из одного элемента, и постепенно увеличивается.

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

Блок-схема алгоритма сортировки вставками

Читайте также:  Iphone 7 из чего сделан корпус

В приведенной блок-схеме для организации цикла используется символ ветвления. В главном цикле (i Блок-схема алгоритма сортировки пузырьком

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

Сортировка выбором

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

Блок-схема сортировки выбором

На блок-схеме приведен пример использования блока «подготовка», а также показано, что в ряде случаев можно описывать алгоритм более «укрупнённо» (не вдаваясь в детали). К сортировке выбором не имеют отношения детали реализации поиска индекса минимального элемента массива, поэтому они могут быть описаны символом вызова внешней процедуры. Если блок-схема алгоритма внешней процедуры отсутствует, не помешает написать к символу вызова комментарий, исключением могут быть функции с говорящими названиями типа swap, sort, … .

На блоге можно найти другие примеры блок-схем:

Часть студентов традиционно пытается рисовать блок-схемы в Microsoft Word, но это оказывается сложно и не удобно. Например, в MS Word нет стандартного блока для терминатора начала и конца алгоритма (прямоугольник со скругленными краями, а не овал). Наиболее удобными, на мой взгляд, являются утилиты MS Visio и yEd [5], обе они позволяют гораздо больше, чем строить блок-схемы (например рисовать диаграммы UML), но первая является платной и работает только под Windows, вторая бесплатная и кроссплатфомренная. Все блок-схемы в этой статье выполнены с использованием yEd.

Нужны ли блок-схемы? Альтернативы

Частные конторы никакие блок-схемы не используют, в книжках по алгоритмам [6] вместо них применяют словесное описание (псевдокод) как более краткую форму. Возможно блок-схемы применяют на государственных предприятиях, которые должны оформлять документацию согласно требованиям ЕСПД, но есть сомнения — даже для регистрации программы в Государственном реестре программ для ЭВМ никаких блок-схем не требуется.

Тем не менее, рисовать блок-схемы заставляют школьников (примеры из учебников ГОСТ не соответствуют) — выносят вопросы на государственные экзамены (ГИА и ЕГЭ), студентов — перед защитой диплом сдается на нормоконтроль, где проверяется соответствие схем стандартам.

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

Появляются подозрения, что система образования прогнила и отстала лет на 20, однако аналогичная проблема наблюдается и за рубежом. Международный стандарт ISO 5807:1985 мало чем отличается от ГОСТ 19.701-90, более нового стандарта за рубежом нет. Там же производится множество программ для выполнения этих самых схем — Dia, MS Visio, yEd, …, а значит списывать их не собираются. Вместо блок-схем иногда применяют диаграммы деятельности UML [6], однако удобнее они оказываются, разве что при изображении параллельных алгоритмов.

Периодически поднимается вопрос о том, что ни блок-схемы, ни UML не нужны, да и документация тоже не нужна. Об этом твердят программисты, придерживающиеся методологии экстремального программирования (XP) [7], ходя даже в их кругу нет единого мнения.

В ряде случаев, программирование невозможно без рисования блок-схем, т.к. это один процесс — существуют визуальные языки программирования, такие как ДРАКОН [8], кроме того, блок-схемы используются для верификации алгоритмов (формального доказательства их корректности) методом индуктивных утверждений Флойда [9].

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *