Текстовый ввод-вывод

Буферизированный (потоковый) ввод-вывод. Часть II

Разбить на страницы
Показывать лекцию целиком

7.1. Вывод в стандартный поток вывода

7.1.1. Вывод средствами языка Си

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

  • форматированный вывод - функция printf ;
  • вывод строки символов - функция puts ;
  • вывод одиночного символа - функция putchar ;
  • вывод одиночного символа в поток - функция putc ;
  • С синтаксисом этих функция можно ознакомиться в приложении №I (7.3) к данной лекции. Автор хочет отметить, что, в отличие от функций чтения консоли, вывод на консоль совершенно безопасен и не приводит к "зависанию" программ и ошибкам системы типа "переполнения буфера". Однако если Вы пишете программу-фильтр, которая будет интенсивно работать с "перенаправлением потоков", необходимо всё-таки использовать функции файлового вывода, указывая в качестве потока вывода поток "stdout".

    Пример 7.1

    /* File ex07001.c */
    /* Пример вывода символов средствами языка Си */
    #include <stdio.h>
    #include <string.h>
    #include <conio.h>
    #ifndef	STR_LENGTH
    #define	STR_LENGTH	5 // Длина строки 3 символа
    #endif
    void main()
    {
    	char str[STR_LENGTH]; // Текстовый буфер
    	char c, *s;	// Временная переменна
    	int icsize;	// Временная переменна
    	memset( str, '\0', STR_LENGTH ); // Обнуляем буфер
    	icsize = STR_LENGTH;
    	puts( "\nВведите строку символов длиной в 2 символа\n" );
    	s = fgets( str, icsize, stdin ); // Читаем не более 2 символов с входного потока
    				      // (вместе с нулевым символом)
    	printf( "\nДлина строки: %2d символов,", strlen(s) ); //Выводим длину строки
    	printf( "\nЗначение строки: %5s.", s ); // Выводим значение строки
    	puts( "\nPress any key to continue...");
    	while( !(c = getch()) ); // Цикл пока не нажата клавиша
    }

    7.1.2. Вывод средствами языка C++

    Консольный потоковый вывод осуществляется при помощи оператора "<<" и функций: cout.put и cout.write. Стандартный поток ввода в языке C++ обозначается как cout (см. таблицу 6.1 к лекции 6).

    Описание функций для потокового ввода средствами языка C++ смотри в приложении №3 (6.6) к лекции 6.

    C помощью оператора "<<" можно осуществить как неформатированный, так и форматированный ввод-вывод. Однако автор советует для вывода, с целью совместимости с выводом с использованием библиотек API, использовать неформатированный вывод в поток с помощью оператора, а данные для него подготовить при помощи функции sprintf (см. пример 7.2.).

    Пример 7.2

    /* File ex07002.cpp */
    /* Файл иллюстрирует ввод-вывод средствами C++*/
    /* Данный пример тестировался в системе программировани
       Borland C/C++ 3.10 */
    #include <iostream.h>
    #include <stdio.h>
    #include <string.h>
    #include <conio.h>
    #ifndef NAME_LENGTH
    #define NAME_LENGTH	81 // Длина строки  80 символов + завершающий символ '\0'
    #endif
    #ifndef AGE_LENGTH
    #define AGE_LENGTH	81 // Длина строки 80 символов + завершающий символ '\0'
    #endif
    #ifndef OUTPUT_STR_LENGTH
    #define OUTPUT_STR_LENGTH	67
    #endif
    void main( void )
    {
    	const char format_in[] = "%3d";
    	const char format_out[] = "Добрый день, %s!\nВаш возраст, %-.10s, - %3d лет"; // Формат вывода
    	char name_length[NAME_LENGTH];
    	char cage[AGE_LENGTH];
    	char soutstr[OUTPUT_STR_LENGTH];
    	char ctemp, c;
    	int temp;
    	int iage;
    	(void) memset( name_length, '\0', NAME_LENGTH ); // Обнуляем строку;
    	(void) memset( soutstr, '\0', OUTPUT_STR_LENGTH );
    	cerr << "Введите своё имя: ";
    	cin >> name_length;
    	cerr << "Введите Ваш возраст: ";
    	cin >> cage;
    	if( !sscanf( cage, format_in, iage ) ) // Если ошибка ввода
    	{
    		cerr << "\nНичего не введено или неправильный формат данных!\n";
    		return;
    	}
    	if( iage < 40 )
    		temp = sprintf( soutstr, format_out, "Молодой человек", name_length, iage );
    	else
    		temp = sprintf( soutstr, format_out, "Папаша", name_length, iage );
    	if( temp  == EOF ) // Если ошибка вывода
    	{
    		cerr << "\nНичего не выведено или неправильный формат данных!\n";
    		return;
    	}
    	cout << soutstr; // Выводим сформированную строку
    	cerr << "\nПрограмма завершена нормально\n";
    	cerr << "\nPress any key to continue...";
    	while( !(c = getch()) ); // Цикл пока не нажата клавиша
    }

    7.1.3. Вывод средствами языка Basic

    Для вывода данных на языке Quick Basic используются операторы PRINT и PRINT USING. Их синтаксис следующий:

    ОПЕРАТОР PRINT
    НАЗНАЧЕНИЕ: Вывод списка числовых и символьных переменных, выражений и литералов на экран дисплея;
    СИНТАКСИС: PRINT [expressionlist] [{; | ,}], где
  • expressionlist - список из одной или более числовых или символьных выражений, выводимых на печать;
  • {; | ,} - разделители, применяемые к выводу следующего выражения и означающие следующее:
  • ; - означает печать сразу после вывода предыдущего выражения;
  • , - означает печать следующего выражения сначала следующей "зоны вывода"
  • <пусто> - означает вывод с новой строки;
  • ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Нет.
    ПРИМЕЧАНИЕ: в Quick Basic зона печати имеет ширину в 14 символов.

    ОПЕРАТОР PRINT USING
    НАЗНАЧЕНИЕ: Форматированный вывод списка числовых и символьных переменных, выражений и литералов на экран дисплея. Формат выводимых выражений определяется строкой формата: formatstring$ ;
    СИНТАКСИС: PRINT USING formatstring$; expressionlist [{; | ,}], где
  • formatstring$ - текстовая строка, содержащая в себе один или более "опций формата". Её формат смотри ниже, в таблице 7.1;
  • expressionlist - список из одной или более числовых или символьных выражений, выводимых на печать;
  • {; | ,} - разделителители, применяемые к выводу следующего выражения и означающие следующее:
  • ; - означает печать сразу после вывода предыдущего выражения;
  • , - означает печать следующего выражения сначала следующей "зоны вывода"
  • ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Нет.
    Опция строки формата Quick Basic для функции PRINT USING.
    Строка форматов Quick Basic для оператора PRINT USING
    Символ Назначение
    Символы формата для числовых выражений
    # Позиция числа
    . Позиция десятичной точки
    , Запятая, помещённая слева от десятичной точки, печатает запятую перед каждой третьей цифрой
    $$ Печатает знак доллара перед числом.
    + Позиция знака числа
    ** Заполняет предшествующие пробелы числа "звёздочками"
    - Помещённый после числа, печатает trailing знак для отрицательных символов.
    ^^^^ Печатает числа в "научном" ("экспоненциальном") формате
    **$$ Комбинация ** and $$.
    Символы, используемые для форматирования строковых выражений
    Печатает всю строку
    \ \ Печатает первые n символов, где n – число пробелов между чёрточками + 2
    ! Печатает только первый символ строки
    Символы, используемые для печати литеральных символов
    _ Печатает следующий символ форматирования как литерал
    Любой символ не из этой таблицы печатается как литерал

    В качестве примера вывода текста средствами Quick Basic смотри пример 6.5 из предыдущей лекции.

    7.1.4. Вывод средствами языка Perl

    Для вывода средствами языка Perl используется функции: die, print, printf и write. Их описание смотри ниже.

    die
    Синтаксис: die СПИСОК
    Описание: Вне тела функции eval выводит значения элементов списка, заданных параметром: СПИСОК, в стандартный файл ошибок STDERR и завершает выполнение сценария Perl с текущим значением специальной переменной $!. Если используется в теле функции eval(), то сообщение об ошибке помещается в переменную: $@, и функция eval завершается неопределённым значением. Такое поведение позволяет использовать функцию: die - для генерирования исключительных ситуаций.

    print
    Синтаксис:
    print ДЕСКРИПТОР СПИСОК
    print СПИСОК;
    print
    Описание: Выводит список строковых данных в файл, связанный с дескриптором: ДЕСКРИПТОР. Если этот параметр опущен, то вывод осуществляется в стандартный файл вывода STDOUT, или текущий файл, установленный функцией select(). Если отсутствует параметр: СПИСОК, то выводится содержимое специальной переменной: $_.

    printf
    Синтаксис:
    printf ДЕСКРИПТОР ФОРМАТ, СПИСОК
    printf ФОРМАТ, СПИСОК
    Описание: Выводит форматированный список строковых данных в файл, связанный с дескриптором: ДЕСКРИПТОР. Если этот параметр опущен, то вывод осуществляется в стандартный файл вывода STDOUT, или текущий файл, установленный функцией select(). Параметр: ФОРМАТ - представляет собой строку, содержащую символы форматирования, полностью совпадающие с символами форматирования системной функции UNIX printf (смотри приложение №2 к лекции 6 данного курса).

    write
    Синтаксис:
    write ДЕСКРИПТОР
    write
    Описание: Осуществляет форматированный вывод в файл, связанный с заданным дескриптором: ДЕСКРИПТОР, в соответствии с определённым форматом. Если параметр: ДЕСКРИПТОР - не задан, то выводит в стандартный файл вывода: STDOUT, - или в файл, выбранной функцией: select().

    Информацию о форматированном выводе данных смотри, например, в [18].

    Пример 7.3.

    #!perl -w
    # File ex07003.pl
    # Данный пример тестировался интерпретатором языка
    # ActiveState Perl 5.8.0.
    #
    # Данная функция запрашивает имя и возраст пользовател
    # и выводит приветствие.
    #
    # Определение строки форматирования:
    $format_out = "Добрый день, %s!\nВаш возраст, %-.10s, - %3d лет\n";
    # Ввод персональных данных
    print "\nВведите своё имя: ";
    $name = <>;
    print "\nВведите Ваш возраст: ";
    $age = <>;
    # Выбор приветстви
    if( $age < 40 )
    {
    	printf $format_out, "Молодой человек", $name, $age;
    }
    else
    {
    	printf $format_out, "Папаша", $name, $age;
    }
    # Завершение работы
    print STDERR "\nPress key Enter to Exit...";
    $junk = <STDIN>;
    # Конец файла

    7.1.5. Вывод средствами языка Python

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

    ФУНКЦИЯ: PRINT
    НАЗНАЧЕНИЕ: Осуществляет неформатированный вывод списка переменных в поток;
    СИНТАКСИС:
    print ДЕСКРИПТОР СПИСОК
    print СПИСОК
    ОПИСАНИЕ: Выводит список строковых данных в файл, связанный с дескриптором: ДЕСКРИПТОР. Если этот параметр опущен, то вывод осуществляется в стандартный файл вывода STDOUT ;

    Примечание: В конец вывода переменной print автоматически вставляется символ новой строки ( "EOL" ). Чтобы этого не происходило, после последнего элемента из списка выводимых объектов необходимо поставить запятую.

    ФУНКЦИЯ: PRINT
    НАЗНАЧЕНИЕ: Осуществляет форматированный вывод списка переменных в поток;
    СИНТАКСИС:
    print ДЕСКРИПТОР, '"строка форматов"' % (СПИСОК)
    print '"строка форматов"' % (СПИСОК)
    ОПИСАНИЕ: Выводит список строковых данных в файл, связанный с дескриптором: ДЕСКРИПТОР. Если этот параметр опущен, то вывод осуществляется в стандартный файл вывода STDOUT. Строка форматов имеет то же описание параметров, как и в функции printf на языке Си (смотри Приложение №2 к лекции 6 данного курса);

    ФУНКЦИЯ: STR
    НАЗНАЧЕНИЕ: Вывод символов в поток;
    СИНТАКСИС: str( object )
    ОПИСАНИЕ: Возвращает строку, содержащую представление object для печати. Функция расставляет или убирает кавычки, то есть выполняет оформление объекта. Основное отличие от функции repr() в том, что данная функция формирует строку для человеческого восприятия, а не для eval().

    ФУНКЦИЯ: REPR
    НАЗНАЧЕНИЕ: Вывод символов в поток;
    СИНТАКСИС: repr( object )
    ОПИСАНИЕ: Возвращает строку, содержащую представление object для печати. Основная задача функции - формирование строки для использования в функции eval().

    В Питоне имеется несколько способов форматированного ввода/вывода. Самый простой из них - оператор print, печатающий переменные и строковые константы, применяя формат по умолчанию. Другой простой способ вывода данных на дисплей - функция str(), которая выводит любую переменную, используя также формат по умолчанию. Есть также функция repr(), которая выводит данные в машинном(неформатированном) виде. Некоторые типы переменных, которые не могут должным образом отформатироваться функцией str(), обрабатываются схоже с repr().

    Пример 7.4.

    # Пример тестировался на интерпретаторе
    # ActiveState Python 2.5
    >>> s = 'Hello, world.'
    >>> str(s)
    'Hello, world.'
    >>> 's' # Такое выражение значит то же, что и repr(s)
    "'Hello, world.'"#Машинный формат
    >>> str(0.1) # Переменная с точкой
    '0.1'
    >>> '0.1' # repr(0.1)
    '0.10000000000000001' # Ошибка округления чисел с точкой
    >>> x = 10 * 3.25
    >>> y = 200 * 200
    >>> s = 'Значение x равно' + `x` + ', а значение y равно ' + `y` + '...'#Использование операции
    ...	#строк для форматировани
    >>> print s
    Значение x равно 32.5, а y равно 40000...
    >>> # Заключение переменных в кавычки работает для всех типов данных
    ... p = [x, y]
    >>> ps = repr(p)
    >>> ps
    '[32.5, 40000]'
    >>> # Окружение строки дополнительными кавычками
    ... hello = 'hello, world\n'
    >>> hellos = `hello`
    >>> print hellos
    'hello, world\n'
    >>> # Можно заключать в кавычки и константные списки
    ... `x, y, ('Linux', 'BSD')`
    "(32.5, 40000, ('Linux', 'BSD'))"

    Для форматированного вывода удобно использовать выравнивание по краю. Для этой цели в Питоне предусмотрены следующие функции модуля string: string.rjust(), string.ljust() и string.center(). Эти функции возвращают выровненную строку по правому и левому краю, а также по центру до определённого количества символов. Они принимают два параметра: саму строку и количество символов, зарезервированных под строку(если строка длиннее, то она выводится как есть, а для удаления лишних символов воспользуйтесь "string.ljust(x, n)[0:n]". На примере это выглядит так:

    Пример 7.5.

    # Пример тестировался на интерпретаторе
    # ActiveState Python 2.5
    >>> import string
    >>> for x in range(1, 11):
    ...	print string.rjust(`x`, 2), string.rjust(`x*x`, 3),
    ...	# В предыдущем операторе print была поставлена в конце запятая, перевода строки нет:
    ...	print string.rjust(`x*x*x`, 4)
    Для этой же цели можно использовать оператор print со строкой формата, аналогичной Си 
      (смотри приложение №2 к лекции 06 данного курса):
    >>> for x in range(1,11):
    ...	print '%2d %3d %4d' % (x, x*x, x*x*x) # %d означает целое число

    Пример 7.6.

    #! %PYTHON%/python
    # -*- coding: cp866 -*-
    #
    # Пример тестировался на интерпретаторе
    # ActiveState Python 2.5
    #
    # File ex07006.pl
    # Данная функция запрашивает имя и возраст пользовател
    # и выводит приветствие.
    #
    def ex07006():
    # Определение строки форматирования:
    	format_out0 = 'Добрый день, %s!'
    	format_out1 = 'Ваш возраст, %-.10s,'
    	format_out2 = ' - %3d лет'
    # Ввод персональных данных
    	name = raw_input( 'Введите своё имя: ' )
    	age = int( raw_input( 'Введите Ваш возраст: ' ) )
    # Выбор приветстви
    	if( age < 40 ):
    		print format_out0 % 'Молодой человек'
    	else:
    		print format_out0 % 'Папаша'
    	print format_out1 % name,
    	print format_out2 % age
    # Завершение работы
    	junk = raw_input( 'Press key Enter to Exit...')
    # Конец файла

    7.1.6. Вывод средствами языка Turbo Prolog

    Для вывода данных в стандартный поток вывода в языке Turbo Prolog используются следующие функции:

    ФУНКЦИЯ: write
    СИНТАКСИС: write( Variable|Constant* ), где Variable - "связанная" переменная любого типа, Constant - константа любого типа. Список выводимых переменных и констант может быть произвольной длины. Элементы списка разделяются запятыми;
    НАЗНАЧЕНИЕ: Выводит данное количество аргументов;
    ОПИСАНИЕ: Функция write записывает данные константы или переменные в текущее окно или на текущее устройство вывода. Функция write может быть связана с произвольным ненулевым числом аргументов. Аргументы в функции write не могут быть свободными переменными.
    ШАБЛОНЫ: (i, i*);
    ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Всегда успех (истина);
    ОШИБКИ: * 2001 Не могу выполнить операцию записи.

    ФУНКЦИЯ: nl
    СИНТАКСИС: nl
    НАЗНАЧЕНИЕ: Переводит вывод текста на экране на новую строку;
    ШАБЛОНЫ: Нет;
    ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Всегда успех;
    ОШИБКИ: Нет;

    ФУНКЦИЯ: writef
    СИНТАКСИС: writef( FormatString, Variable|Constant* ), где
  • FormatString - строковая переменная, указывающая на формат чисел выводимых данных,
  • Variable и Constant - те же аргументы, что и для функции write ;
  • НАЗНАЧЕНИЕ: Выводит список аргументов функций, форматы которых записаны в строке форматов;
    ОПИСАНИЕ: Функция writef выполняет форматированный вывод. Аргументы Арг1 - АргN могут быть константами или переменными, которые относятся к стандартным доменам. Формат строки содержит обычные символы, которые печатаются без модификации, и формат спецификаций формы %-m.pf
    ШАБЛОНЫ: (i, i, i*);
    ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Всегда успех (истина);
    ОШИБКИ: * 1025 Слишком много аргументов в формате строки.

    Назначение символов в формате спецификации смотри в Приложении №2 к лекции 6 данного курса.

    Ниже рассмотрен пример программы на языке Turbo Prolog, реализующей алгоритм из примера 7.2.

    Пример 7.7.

    /* Файл EX07007.PRO */
    /* Пример тестировался в системе программировани
       Borland Turbo Prolog 2.0. */
    /* Данная функция запрашивает имя и возраст пользовател
       и выводит приветствие  */
    domains
    /* Описываем переменные */
    	Age = integer
    	Name = string
    predicates
    	output_age( Age )
    clauses
    /* Определяем правило output_age */
    	output_age( Age ) :- Age < 40, write( "Молодой человек!" ), !.
    	output_age( Age ) :- write( "Папаша!" ).
    goal
    /* Описываем алгоритм работы программы */
    	write( "Введите Ваше имя: " ), readln( Name ),
    	write( "Введите Ваш возраст: " ), readint( Age ),
    	write( "Добрый день, "), output_age( Age ), nl,
    	writef( "Ваш возраст, %s, -- %3d лет", Name, Age ),nl,
    	write( "Press key Enter to exit..." ), readchar( _ ).

    7.1.7. Вывод средствами языка VBScript

    Вывод в стандартный поток вывода и стандартный поток ошибок осуществляется на языке Visual Basic Script только при выполнении макроса в оболочке CScript.

    Для вывода данных в стандартный поток вывода средствами языка VBScript используются следующие функции:

    ФУНКЦИЯ WRITE
    ОПРЕДЕЛЕНА В: WScript;
    СИНТАКСИС: WScript.Std[Out|Err].Write( String ), где String - выводимая на экран строка текста;
    НАЗНАЧЕНИЕ: Выводит строку символов на экран;
    ОПИСАНИЕ: Записывает в поток StdOut или StdErr строку string (без символа конца строки);
    ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Нет;
    ПЕРЕНОСИМОСТЬ: Только сценарии CScript;

    ФУНКЦИЯ WRITEBLANKLINES
    ОПРЕДЕЛЕНА В: WScript;
    СИНТАКСИС: WScript.Std[Out|Err].WriteBlankLines(n), где n - число пропущенных (пустых) строк;
    НАЗНАЧЕНИЕ: Печать пустых строк на экране;
    ОПИСАНИЕ: Записывает в поток StdOut или StdErr заданное параметром n число пустых строк;
    ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Нет;
    ПЕРЕНОСИМОСТЬ: Только сценарии CScript;

    ФУНКЦИЯ WRITELINE
    ОПРЕДЕЛЕНА В: WScript;
    СИНТАКСИС: WScript.Std[Out|Err].WriteLine( String ), где String - выводимая на экран строка текста;
    НАЗНАЧЕНИЕ: Выводит строку символов на экран;
    ОПИСАНИЕ: Записывает в поток StdOut или StdErr строку string (вместе с символом конца строки)
    ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Нет;
    ПЕРЕНОСИМОСТЬ: Только сценарии CScript;

    ФУНКЦИЯ ECHO
    ОПРЕДЕЛЕНА В: WScript;
    СИНТАКСИС: WScript.Echo String[, String], где String - Выводимая (-ые) строка текста или переменные;
    НАЗНАЧЕНИЕ: Вывод строки текста;
    ОПИСАНИЕ: Функция выводит строки символов, одну или нескольких переменных в поток вывода StdOut или диалоговое окно. При этом производится приведение типов;
    ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Нет;
    ПЕРЕНОСИМОСТЬ: Все сценарии;

    КОНСТАНТА vbCrLf
    ОПРЕДЕЛЕНА В: WScript;
    СИНТАКСИС: vbCrLf [ …]
    НАЗНАЧЕНИЕ: Вставляет в текущую строку Visual Basic Script псевдосимвол "EOL" (<CR>/<LF>) ;
    ПЕРЕНОСИМОСТЬ: Все сценарии, только при выводе строк и переменных;

    Замечание: запись Std[Out|Err] означает "или StdOut, или StdErr", то есть функция перенаправляет вывод или в стандартный поток вывода, или в поток ошибок (смотри таблицу 6.1 в предыдущей лекции).

    Пример 7.8.

    '*****************************************************************
    '* Имя: ex07008.vbs
    '* Язык: VBScript Microsoft Windows XP
    '* Описание: Организация простого диалога с проверкой услови
    '*****************************************************************
    Dim Name, Age, junk
    ' Выводим диалоги
    WScript.StdOut.Write( "Введите Ваше имя: " )
    Name = WScript.StdIn.ReadLine
    WScript.StdOut.Write( "Введите Ваш возраст: " )
    Age = WScript.StdIn.ReadLine
    ' Проверка условий и вывод приветстви
    If Age < 40 Then
    	WScript.StdOut.WriteLine( "Добрый день, Молодой человек!" )
    Else
    	WScript.StdOut.WriteLine( "Добрый день, Папаша!" )
    End if
    WScript.StdOut.WriteLine( "Ваш возраст, "  Name  " - "  Age  " лет" vbCrLf  )
    ' Выход из программы
    Wscript.Echo "Press key Enter to exit..."
    junk = WScript.StdIn.ReadLine()
    ' Конец программы

    7.1.8. Вывод средствами языка Java

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

  • println ;
  • print.
  • Рассмотрим эти функции поподробнее.

    ФУНКЦИЯ PRINTLN
    ОПРЕДЕЛЕНА В: Класс System
    СИНТАКСИС: System.out.println( "Элемент_1"{ + "Элемент_n"} ) ; где "Элемент_1" - "Элемент_n" - Заключённые в кавычки строки, переменные, константы (например, числа) или практически любой объект, определённый в языке Java;
    НАЗНАЧЕНИЕ: Функция выводит один или несколько элементов в стандартный поток вывода;
    ОПИСАНИЕ: Вывод текстовой строки из текстовых (или преобразованные в текстовую форму) переменных, констант и литералов. Переменные разделяются знаками "+", в конце автоматически вставляется символ "EOL" ;
    ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Функция не возвращает значений;
    ПЕРЕНОСИМОСТЬ: Везде;

    ФУНКЦИЯ PRINT
    ОПРЕДЕЛЕНА В: Класс System
    СИНТАКСИС: System.out.print( "Элемент_1"{ + "Элемент_n"} ) ; где "Элемент_1" - "Элемент_n" - Заключённые в кавычки строки, переменные, константы (например, числа) или практически любой объект, определённый в языке Java;
    НАЗНАЧЕНИЕ: Функция выводит один или несколько элементов в стандартный поток вывода;
    ОПИСАНИЕ: Вывод текста или преобразованных в текст объектов, констант и литералов. Переменные выводятся, начиная с текущей позиции курсора, разделяются знаками "+", в конце строка не завершается символом "EOL" (то есть новый вывод будет осуществляться с той же строки);
    ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Функция не возвращает значений;
    ПЕРЕНОСИМОСТЬ: Везде;

    Пример 7.9.

    /* File ex07009.java */
    /* Функция реализует простейший диалог между ЭВМ и человеком с условием */
    /* Данный пример тестировался на компиляторе Sun J2EE SDK 1.6) */
    /* Данный пример требует наличие компилированного класса SavitchIn */
    import java.io.*;
    import java.util.*;
    // Файл ex07009.java
    public class ex07009
    {
    	public static void main( String[] args )
    	{
    /* Определение переменных */
    		int Age;
    		String Name, junk;
    /* Начало диалога (ввод данных пользователя */
    		System.out.print("Введите Ваше имя: ");
    		Name = SavitchIn.readLine();
    		System.out.print( "Введите Ваш возраст: " );
    		Age = SavitchIn.readLineInt();
    /* Проверка условия и вывод диалога */
    		if( Age < 40 )
    			System.out.println( "Добрый день, Молодой человек!" );
    		else
    			System.out.println( "Добрый день, Папаша!" );
    		System.out.println( "Ваш возраст, " + Name + ", - " + Age +" лет." );
    /* Завершение работы программы */
    		System.out.println( "Press key Enter to exit..." );
    		junk = SavitchIn.readLine();
    	}
    }

    7.2. Резюме стандартного буферизированного ввода-вывода

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

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

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

    7.3. Приложение №1

    Функции вывода данных в стандартный поток вывода языка Си.

    ФУНКЦИЯ printf
    ОПРЕДЕЛЕНА В: <stdio.h>
    СИНТАКСИС:
    int printf( format_string[, arguments…] );
    char *format_string;
    НАЗНАЧЕНИЕ: Функция печатает символы и формирует и печатает задаваемые аргументами значения в стандартный поток вывода ( stdout ). Она имеет переменное число параметров;
    ОПИСАНИЕ: Строка описания формата вывода, format_string, состоит из обычных символов, escape и других управляющих последовательностей, а также спецификаций форматов вывода переменных, заданных в списке аргументов, по одному для каждого аргумента;

    Обычные символы и escape последовательности просто копируются в поток stdout в порядке их появления, при этом символ: '\n' преобразуется в последовательность: '\r\n'. Если же за параметром format_string следуют аргументы: arguments, то она должна содержать спецификации форматов, начинающиеся со знака: '%'. Строка описания формата прочитывается слева направо, значения переменных, указанные в строке форматов как спецификации форматов, выводятся последовательно друг за другом. Лишние спецификации игнорируются. Результат не определён, если спецификаций в строке форматов меньше, чем аргументов функции;

    ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Число напечатанных символов.

    ФУНКЦИЯ: puts
    ОПРЕДЕЛЕНА В: <stdio.h>
    СИНТАКСИС:
    int puts( s );
    const char *;
    НАЗНАЧЕНИЕ: Функция выводит строку в поток stdout ;
    ОПИСАНИЕ: Функция puts копирует строку символов с нулевым окончанием '\0' в поток стандартного вывода stdout, причём добавляет в конец символ перехода на новую строку (т.е. заменяет символ '\0' на строку символов "\r\n\0") ;
    ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: При успешном завершении функция puts возвращает ненулевое значение. В противном случае возвращается значение EOF ;
    ПЕРЕНОСИМОСТЬ: Данная функция поддерживается в операционных системах, основанных на UNIX, содержится в стандарте ANSI C.

    ФУНКЦИЯ: putc
    ОПРЕДЕЛЕНА В: <stdio.h>
    СИНТАКСИС:
    int putc( c, stream );
    int c;
    FILE *stream;
    НАЗНАЧЕНИЕ: Функция выводит символ в поток;
    ОПИСАНИЕ: Функция putc представляет собой макрокоманду, которая выводит символ в указанный выходной поток stream ;
    ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: При успешном завершении функция возвращает символ c. При возникновении ошибки функция возвращает значение EOF (конец файла);
    ПЕРЕНОСИМОСТЬ: Функция поддерживается в операционных системах UNIX, стандарте ANSI C, и определена в стандарте Кернигана и Ритчи.

    ФУНКЦИЯ: putchar
    ОПРЕДЕЛЕНА В: <stdio.h>
    СИНТАКСИС:
    int putchar( c );
    int c;
    НАЗНАЧЕНИЕ: Функция выводит символ в поток stdout ;
    ОПИСАНИЕ: putchar - это макрокоманда, определённая как putc( c, stdout) ;
    ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: При успешном завершении функция возвращает выведенный символ c. При ошибке она возвращает EOF ;
    ПЕРЕНОСИМОСТЬ: Функция поддерживается в операционных системах UNIX, стандарте ANSI C, и определена в стандарте Кернигана и Ритчи.

    Страницы:

    7.1. Вывод в стандартный поток вывода

    7.1.1. Вывод средствами языка Си

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

  • форматированный вывод - функция printf ;
  • вывод строки символов - функция puts ;
  • вывод одиночного символа - функция putchar ;
  • вывод одиночного символа в поток - функция putc ;
  • С синтаксисом этих функция можно ознакомиться в приложении №I (7.3) к данной лекции. Автор хочет отметить, что, в отличие от функций чтения консоли, вывод на консоль совершенно безопасен и не приводит к "зависанию" программ и ошибкам системы типа "переполнения буфера". Однако если Вы пишете программу-фильтр, которая будет интенсивно работать с "перенаправлением потоков", необходимо всё-таки использовать функции файлового вывода, указывая в качестве потока вывода поток "stdout".

    Пример 7.1

    /* File ex07001.c */
    /* Пример вывода символов средствами языка Си */
    #include <stdio.h>
    #include <string.h>
    #include <conio.h>
    #ifndef	STR_LENGTH
    #define	STR_LENGTH	5 // Длина строки 3 символа
    #endif
    void main()
    {
    	char str[STR_LENGTH]; // Текстовый буфер
    	char c, *s;	// Временная переменна
    	int icsize;	// Временная переменна
    	memset( str, '\0', STR_LENGTH ); // Обнуляем буфер
    	icsize = STR_LENGTH;
    	puts( "\nВведите строку символов длиной в 2 символа\n" );
    	s = fgets( str, icsize, stdin ); // Читаем не более 2 символов с входного потока
    				      // (вместе с нулевым символом)
    	printf( "\nДлина строки: %2d символов,", strlen(s) ); //Выводим длину строки
    	printf( "\nЗначение строки: %5s.", s ); // Выводим значение строки
    	puts( "\nPress any key to continue...");
    	while( !(c = getch()) ); // Цикл пока не нажата клавиша
    }

    7.1.2. Вывод средствами языка C++

    Консольный потоковый вывод осуществляется при помощи оператора "<<" и функций: cout.put и cout.write. Стандартный поток ввода в языке C++ обозначается как cout (см. таблицу 6.1 к лекции 6).

    Описание функций для потокового ввода средствами языка C++ смотри в приложении №3 (6.6) к лекции 6.

    C помощью оператора "<<" можно осуществить как неформатированный, так и форматированный ввод-вывод. Однако автор советует для вывода, с целью совместимости с выводом с использованием библиотек API, использовать неформатированный вывод в поток с помощью оператора, а данные для него подготовить при помощи функции sprintf (см. пример 7.2.).

    Пример 7.2

    /* File ex07002.cpp */
    /* Файл иллюстрирует ввод-вывод средствами C++*/
    /* Данный пример тестировался в системе программировани
       Borland C/C++ 3.10 */
    #include <iostream.h>
    #include <stdio.h>
    #include <string.h>
    #include <conio.h>
    #ifndef NAME_LENGTH
    #define NAME_LENGTH	81 // Длина строки  80 символов + завершающий символ '\0'
    #endif
    #ifndef AGE_LENGTH
    #define AGE_LENGTH	81 // Длина строки 80 символов + завершающий символ '\0'
    #endif
    #ifndef OUTPUT_STR_LENGTH
    #define OUTPUT_STR_LENGTH	67
    #endif
    void main( void )
    {
    	const char format_in[] = "%3d";
    	const char format_out[] = "Добрый день, %s!\nВаш возраст, %-.10s, - %3d лет"; // Формат вывода
    	char name_length[NAME_LENGTH];
    	char cage[AGE_LENGTH];
    	char soutstr[OUTPUT_STR_LENGTH];
    	char ctemp, c;
    	int temp;
    	int iage;
    	(void) memset( name_length, '\0', NAME_LENGTH ); // Обнуляем строку;
    	(void) memset( soutstr, '\0', OUTPUT_STR_LENGTH );
    	cerr << "Введите своё имя: ";
    	cin >> name_length;
    	cerr << "Введите Ваш возраст: ";
    	cin >> cage;
    	if( !sscanf( cage, format_in, iage ) ) // Если ошибка ввода
    	{
    		cerr << "\nНичего не введено или неправильный формат данных!\n";
    		return;
    	}
    	if( iage < 40 )
    		temp = sprintf( soutstr, format_out, "Молодой человек", name_length, iage );
    	else
    		temp = sprintf( soutstr, format_out, "Папаша", name_length, iage );
    	if( temp  == EOF ) // Если ошибка вывода
    	{
    		cerr << "\nНичего не выведено или неправильный формат данных!\n";
    		return;
    	}
    	cout << soutstr; // Выводим сформированную строку
    	cerr << "\nПрограмма завершена нормально\n";
    	cerr << "\nPress any key to continue...";
    	while( !(c = getch()) ); // Цикл пока не нажата клавиша
    }

    7.1.3. Вывод средствами языка Basic

    Для вывода данных на языке Quick Basic используются операторы PRINT и PRINT USING. Их синтаксис следующий:

    ОПЕРАТОР PRINT
    НАЗНАЧЕНИЕ: Вывод списка числовых и символьных переменных, выражений и литералов на экран дисплея;
    СИНТАКСИС: PRINT [expressionlist] [{; | ,}], где
  • expressionlist - список из одной или более числовых или символьных выражений, выводимых на печать;
  • {; | ,} - разделители, применяемые к выводу следующего выражения и означающие следующее:
  • ; - означает печать сразу после вывода предыдущего выражения;
  • , - означает печать следующего выражения сначала следующей "зоны вывода"
  • <пусто> - означает вывод с новой строки;
  • ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Нет.
    ПРИМЕЧАНИЕ: в Quick Basic зона печати имеет ширину в 14 символов.

    ОПЕРАТОР PRINT USING
    НАЗНАЧЕНИЕ: Форматированный вывод списка числовых и символьных переменных, выражений и литералов на экран дисплея. Формат выводимых выражений определяется строкой формата: formatstring$ ;
    СИНТАКСИС: PRINT USING formatstring$; expressionlist [{; | ,}], где
  • formatstring$ - текстовая строка, содержащая в себе один или более "опций формата". Её формат смотри ниже, в таблице 7.1;
  • expressionlist - список из одной или более числовых или символьных выражений, выводимых на печать;
  • {; | ,} - разделителители, применяемые к выводу следующего выражения и означающие следующее:
  • ; - означает печать сразу после вывода предыдущего выражения;
  • , - означает печать следующего выражения сначала следующей "зоны вывода"
  • ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Нет.
    Опция строки формата Quick Basic для функции PRINT USING.
    Строка форматов Quick Basic для оператора PRINT USING
    Символ Назначение
    Символы формата для числовых выражений
    # Позиция числа
    . Позиция десятичной точки
    , Запятая, помещённая слева от десятичной точки, печатает запятую перед каждой третьей цифрой
    $$ Печатает знак доллара перед числом.
    + Позиция знака числа
    ** Заполняет предшествующие пробелы числа "звёздочками"
    - Помещённый после числа, печатает trailing знак для отрицательных символов.
    ^^^^ Печатает числа в "научном" ("экспоненциальном") формате
    **$$ Комбинация ** and $$.
    Символы, используемые для форматирования строковых выражений
    Печатает всю строку
    \ \ Печатает первые n символов, где n – число пробелов между чёрточками + 2
    ! Печатает только первый символ строки
    Символы, используемые для печати литеральных символов
    _ Печатает следующий символ форматирования как литерал
    Любой символ не из этой таблицы печатается как литерал

    В качестве примера вывода текста средствами Quick Basic смотри пример 6.5 из предыдущей лекции.

    7.1.4. Вывод средствами языка Perl

    Для вывода средствами языка Perl используется функции: die, print, printf и write. Их описание смотри ниже.

    die
    Синтаксис: die СПИСОК
    Описание: Вне тела функции eval выводит значения элементов списка, заданных параметром: СПИСОК, в стандартный файл ошибок STDERR и завершает выполнение сценария Perl с текущим значением специальной переменной $!. Если используется в теле функции eval(), то сообщение об ошибке помещается в переменную: $@, и функция eval завершается неопределённым значением. Такое поведение позволяет использовать функцию: die - для генерирования исключительных ситуаций.

    print
    Синтаксис:
    print ДЕСКРИПТОР СПИСОК
    print СПИСОК;
    print
    Описание: Выводит список строковых данных в файл, связанный с дескриптором: ДЕСКРИПТОР. Если этот параметр опущен, то вывод осуществляется в стандартный файл вывода STDOUT, или текущий файл, установленный функцией select(). Если отсутствует параметр: СПИСОК, то выводится содержимое специальной переменной: $_.

    printf
    Синтаксис:
    printf ДЕСКРИПТОР ФОРМАТ, СПИСОК
    printf ФОРМАТ, СПИСОК
    Описание: Выводит форматированный список строковых данных в файл, связанный с дескриптором: ДЕСКРИПТОР. Если этот параметр опущен, то вывод осуществляется в стандартный файл вывода STDOUT, или текущий файл, установленный функцией select(). Параметр: ФОРМАТ - представляет собой строку, содержащую символы форматирования, полностью совпадающие с символами форматирования системной функции UNIX printf (смотри приложение №2 к лекции 6 данного курса).

    write
    Синтаксис:
    write ДЕСКРИПТОР
    write
    Описание: Осуществляет форматированный вывод в файл, связанный с заданным дескриптором: ДЕСКРИПТОР, в соответствии с определённым форматом. Если параметр: ДЕСКРИПТОР - не задан, то выводит в стандартный файл вывода: STDOUT, - или в файл, выбранной функцией: select().

    Информацию о форматированном выводе данных смотри, например, в [18].

    Пример 7.3.

    #!perl -w
    # File ex07003.pl
    # Данный пример тестировался интерпретатором языка
    # ActiveState Perl 5.8.0.
    #
    # Данная функция запрашивает имя и возраст пользовател
    # и выводит приветствие.
    #
    # Определение строки форматирования:
    $format_out = "Добрый день, %s!\nВаш возраст, %-.10s, - %3d лет\n";
    # Ввод персональных данных
    print "\nВведите своё имя: ";
    $name = <>;
    print "\nВведите Ваш возраст: ";
    $age = <>;
    # Выбор приветстви
    if( $age < 40 )
    {
    	printf $format_out, "Молодой человек", $name, $age;
    }
    else
    {
    	printf $format_out, "Папаша", $name, $age;
    }
    # Завершение работы
    print STDERR "\nPress key Enter to Exit...";
    $junk = <STDIN>;
    # Конец файла

    7.1.5. Вывод средствами языка Python

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

    ФУНКЦИЯ: PRINT
    НАЗНАЧЕНИЕ: Осуществляет неформатированный вывод списка переменных в поток;
    СИНТАКСИС:
    print ДЕСКРИПТОР СПИСОК
    print СПИСОК
    ОПИСАНИЕ: Выводит список строковых данных в файл, связанный с дескриптором: ДЕСКРИПТОР. Если этот параметр опущен, то вывод осуществляется в стандартный файл вывода STDOUT ;

    Примечание: В конец вывода переменной print автоматически вставляется символ новой строки ( "EOL" ). Чтобы этого не происходило, после последнего элемента из списка выводимых объектов необходимо поставить запятую.

    ФУНКЦИЯ: PRINT
    НАЗНАЧЕНИЕ: Осуществляет форматированный вывод списка переменных в поток;
    СИНТАКСИС:
    print ДЕСКРИПТОР, '"строка форматов"' % (СПИСОК)
    print '"строка форматов"' % (СПИСОК)
    ОПИСАНИЕ: Выводит список строковых данных в файл, связанный с дескриптором: ДЕСКРИПТОР. Если этот параметр опущен, то вывод осуществляется в стандартный файл вывода STDOUT. Строка форматов имеет то же описание параметров, как и в функции printf на языке Си (смотри Приложение №2 к лекции 6 данного курса);

    ФУНКЦИЯ: STR
    НАЗНАЧЕНИЕ: Вывод символов в поток;
    СИНТАКСИС: str( object )
    ОПИСАНИЕ: Возвращает строку, содержащую представление object для печати. Функция расставляет или убирает кавычки, то есть выполняет оформление объекта. Основное отличие от функции repr() в том, что данная функция формирует строку для человеческого восприятия, а не для eval().

    ФУНКЦИЯ: REPR
    НАЗНАЧЕНИЕ: Вывод символов в поток;
    СИНТАКСИС: repr( object )
    ОПИСАНИЕ: Возвращает строку, содержащую представление object для печати. Основная задача функции - формирование строки для использования в функции eval().

    В Питоне имеется несколько способов форматированного ввода/вывода. Самый простой из них - оператор print, печатающий переменные и строковые константы, применяя формат по умолчанию. Другой простой способ вывода данных на дисплей - функция str(), которая выводит любую переменную, используя также формат по умолчанию. Есть также функция repr(), которая выводит данные в машинном(неформатированном) виде. Некоторые типы переменных, которые не могут должным образом отформатироваться функцией str(), обрабатываются схоже с repr().

    Пример 7.4.

    # Пример тестировался на интерпретаторе
    # ActiveState Python 2.5
    >>> s = 'Hello, world.'
    >>> str(s)
    'Hello, world.'
    >>> 's' # Такое выражение значит то же, что и repr(s)
    "'Hello, world.'"#Машинный формат
    >>> str(0.1) # Переменная с точкой
    '0.1'
    >>> '0.1' # repr(0.1)
    '0.10000000000000001' # Ошибка округления чисел с точкой
    >>> x = 10 * 3.25
    >>> y = 200 * 200
    >>> s = 'Значение x равно' + `x` + ', а значение y равно ' + `y` + '...'#Использование операции
    ...	#строк для форматировани
    >>> print s
    Значение x равно 32.5, а y равно 40000...
    >>> # Заключение переменных в кавычки работает для всех типов данных
    ... p = [x, y]
    >>> ps = repr(p)
    >>> ps
    '[32.5, 40000]'
    >>> # Окружение строки дополнительными кавычками
    ... hello = 'hello, world\n'
    >>> hellos = `hello`
    >>> print hellos
    'hello, world\n'
    >>> # Можно заключать в кавычки и константные списки
    ... `x, y, ('Linux', 'BSD')`
    "(32.5, 40000, ('Linux', 'BSD'))"

    Для форматированного вывода удобно использовать выравнивание по краю. Для этой цели в Питоне предусмотрены следующие функции модуля string: string.rjust(), string.ljust() и string.center(). Эти функции возвращают выровненную строку по правому и левому краю, а также по центру до определённого количества символов. Они принимают два параметра: саму строку и количество символов, зарезервированных под строку(если строка длиннее, то она выводится как есть, а для удаления лишних символов воспользуйтесь "string.ljust(x, n)[0:n]". На примере это выглядит так:

    Пример 7.5.

    # Пример тестировался на интерпретаторе
    # ActiveState Python 2.5
    >>> import string
    >>> for x in range(1, 11):
    ...	print string.rjust(`x`, 2), string.rjust(`x*x`, 3),
    ...	# В предыдущем операторе print была поставлена в конце запятая, перевода строки нет:
    ...	print string.rjust(`x*x*x`, 4)
    Для этой же цели можно использовать оператор print со строкой формата, аналогичной Си 
      (смотри приложение №2 к лекции 06 данного курса):
    >>> for x in range(1,11):
    ...	print '%2d %3d %4d' % (x, x*x, x*x*x) # %d означает целое число

    Пример 7.6.

    #! %PYTHON%/python
    # -*- coding: cp866 -*-
    #
    # Пример тестировался на интерпретаторе
    # ActiveState Python 2.5
    #
    # File ex07006.pl
    # Данная функция запрашивает имя и возраст пользовател
    # и выводит приветствие.
    #
    def ex07006():
    # Определение строки форматирования:
    	format_out0 = 'Добрый день, %s!'
    	format_out1 = 'Ваш возраст, %-.10s,'
    	format_out2 = ' - %3d лет'
    # Ввод персональных данных
    	name = raw_input( 'Введите своё имя: ' )
    	age = int( raw_input( 'Введите Ваш возраст: ' ) )
    # Выбор приветстви
    	if( age < 40 ):
    		print format_out0 % 'Молодой человек'
    	else:
    		print format_out0 % 'Папаша'
    	print format_out1 % name,
    	print format_out2 % age
    # Завершение работы
    	junk = raw_input( 'Press key Enter to Exit...')
    # Конец файла

    7.1.6. Вывод средствами языка Turbo Prolog

    Для вывода данных в стандартный поток вывода в языке Turbo Prolog используются следующие функции:

    ФУНКЦИЯ: write
    СИНТАКСИС: write( Variable|Constant* ), где Variable - "связанная" переменная любого типа, Constant - константа любого типа. Список выводимых переменных и констант может быть произвольной длины. Элементы списка разделяются запятыми;
    НАЗНАЧЕНИЕ: Выводит данное количество аргументов;
    ОПИСАНИЕ: Функция write записывает данные константы или переменные в текущее окно или на текущее устройство вывода. Функция write может быть связана с произвольным ненулевым числом аргументов. Аргументы в функции write не могут быть свободными переменными.
    ШАБЛОНЫ: (i, i*);
    ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Всегда успех (истина);
    ОШИБКИ: * 2001 Не могу выполнить операцию записи.

    ФУНКЦИЯ: nl
    СИНТАКСИС: nl
    НАЗНАЧЕНИЕ: Переводит вывод текста на экране на новую строку;
    ШАБЛОНЫ: Нет;
    ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Всегда успех;
    ОШИБКИ: Нет;

    ФУНКЦИЯ: writef
    СИНТАКСИС: writef( FormatString, Variable|Constant* ), где
  • FormatString - строковая переменная, указывающая на формат чисел выводимых данных,
  • Variable и Constant - те же аргументы, что и для функции write ;
  • НАЗНАЧЕНИЕ: Выводит список аргументов функций, форматы которых записаны в строке форматов;
    ОПИСАНИЕ: Функция writef выполняет форматированный вывод. Аргументы Арг1 - АргN могут быть константами или переменными, которые относятся к стандартным доменам. Формат строки содержит обычные символы, которые печатаются без модификации, и формат спецификаций формы %-m.pf
    ШАБЛОНЫ: (i, i, i*);
    ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Всегда успех (истина);
    ОШИБКИ: * 1025 Слишком много аргументов в формате строки.

    Назначение символов в формате спецификации смотри в Приложении №2 к лекции 6 данного курса.

    Ниже рассмотрен пример программы на языке Turbo Prolog, реализующей алгоритм из примера 7.2.

    Пример 7.7.

    /* Файл EX07007.PRO */
    /* Пример тестировался в системе программировани
       Borland Turbo Prolog 2.0. */
    /* Данная функция запрашивает имя и возраст пользовател
       и выводит приветствие  */
    domains
    /* Описываем переменные */
    	Age = integer
    	Name = string
    predicates
    	output_age( Age )
    clauses
    /* Определяем правило output_age */
    	output_age( Age ) :- Age < 40, write( "Молодой человек!" ), !.
    	output_age( Age ) :- write( "Папаша!" ).
    goal
    /* Описываем алгоритм работы программы */
    	write( "Введите Ваше имя: " ), readln( Name ),
    	write( "Введите Ваш возраст: " ), readint( Age ),
    	write( "Добрый день, "), output_age( Age ), nl,
    	writef( "Ваш возраст, %s, -- %3d лет", Name, Age ),nl,
    	write( "Press key Enter to exit..." ), readchar( _ ).

    7.1.7. Вывод средствами языка VBScript

    Вывод в стандартный поток вывода и стандартный поток ошибок осуществляется на языке Visual Basic Script только при выполнении макроса в оболочке CScript.

    Для вывода данных в стандартный поток вывода средствами языка VBScript используются следующие функции:

    ФУНКЦИЯ WRITE
    ОПРЕДЕЛЕНА В: WScript;
    СИНТАКСИС: WScript.Std[Out|Err].Write( String ), где String - выводимая на экран строка текста;
    НАЗНАЧЕНИЕ: Выводит строку символов на экран;
    ОПИСАНИЕ: Записывает в поток StdOut или StdErr строку string (без символа конца строки);
    ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Нет;
    ПЕРЕНОСИМОСТЬ: Только сценарии CScript;

    ФУНКЦИЯ WRITEBLANKLINES
    ОПРЕДЕЛЕНА В: WScript;
    СИНТАКСИС: WScript.Std[Out|Err].WriteBlankLines(n), где n - число пропущенных (пустых) строк;
    НАЗНАЧЕНИЕ: Печать пустых строк на экране;
    ОПИСАНИЕ: Записывает в поток StdOut или StdErr заданное параметром n число пустых строк;
    ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Нет;
    ПЕРЕНОСИМОСТЬ: Только сценарии CScript;

    ФУНКЦИЯ WRITELINE
    ОПРЕДЕЛЕНА В: WScript;
    СИНТАКСИС: WScript.Std[Out|Err].WriteLine( String ), где String - выводимая на экран строка текста;
    НАЗНАЧЕНИЕ: Выводит строку символов на экран;
    ОПИСАНИЕ: Записывает в поток StdOut или StdErr строку string (вместе с символом конца строки)
    ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Нет;
    ПЕРЕНОСИМОСТЬ: Только сценарии CScript;

    ФУНКЦИЯ ECHO
    ОПРЕДЕЛЕНА В: WScript;
    СИНТАКСИС: WScript.Echo String[, String], где String - Выводимая (-ые) строка текста или переменные;
    НАЗНАЧЕНИЕ: Вывод строки текста;
    ОПИСАНИЕ: Функция выводит строки символов, одну или нескольких переменных в поток вывода StdOut или диалоговое окно. При этом производится приведение типов;
    ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Нет;
    ПЕРЕНОСИМОСТЬ: Все сценарии;

    КОНСТАНТА vbCrLf
    ОПРЕДЕЛЕНА В: WScript;
    СИНТАКСИС: vbCrLf [ …]
    НАЗНАЧЕНИЕ: Вставляет в текущую строку Visual Basic Script псевдосимвол "EOL" (<CR>/<LF>) ;
    ПЕРЕНОСИМОСТЬ: Все сценарии, только при выводе строк и переменных;

    Замечание: запись Std[Out|Err] означает "или StdOut, или StdErr", то есть функция перенаправляет вывод или в стандартный поток вывода, или в поток ошибок (смотри таблицу 6.1 в предыдущей лекции).

    Пример 7.8.

    '*****************************************************************
    '* Имя: ex07008.vbs
    '* Язык: VBScript Microsoft Windows XP
    '* Описание: Организация простого диалога с проверкой услови
    '*****************************************************************
    Dim Name, Age, junk
    ' Выводим диалоги
    WScript.StdOut.Write( "Введите Ваше имя: " )
    Name = WScript.StdIn.ReadLine
    WScript.StdOut.Write( "Введите Ваш возраст: " )
    Age = WScript.StdIn.ReadLine
    ' Проверка условий и вывод приветстви
    If Age < 40 Then
    	WScript.StdOut.WriteLine( "Добрый день, Молодой человек!" )
    Else
    	WScript.StdOut.WriteLine( "Добрый день, Папаша!" )
    End if
    WScript.StdOut.WriteLine( "Ваш возраст, "  Name  " - "  Age  " лет" vbCrLf  )
    ' Выход из программы
    Wscript.Echo "Press key Enter to exit..."
    junk = WScript.StdIn.ReadLine()
    ' Конец программы

    7.1.8. Вывод средствами языка Java

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

  • println ;
  • print.
  • Рассмотрим эти функции поподробнее.

    ФУНКЦИЯ PRINTLN
    ОПРЕДЕЛЕНА В: Класс System
    СИНТАКСИС: System.out.println( "Элемент_1"{ + "Элемент_n"} ) ; где "Элемент_1" - "Элемент_n" - Заключённые в кавычки строки, переменные, константы (например, числа) или практически любой объект, определённый в языке Java;
    НАЗНАЧЕНИЕ: Функция выводит один или несколько элементов в стандартный поток вывода;
    ОПИСАНИЕ: Вывод текстовой строки из текстовых (или преобразованные в текстовую форму) переменных, констант и литералов. Переменные разделяются знаками "+", в конце автоматически вставляется символ "EOL" ;
    ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Функция не возвращает значений;
    ПЕРЕНОСИМОСТЬ: Везде;

    ФУНКЦИЯ PRINT
    ОПРЕДЕЛЕНА В: Класс System
    СИНТАКСИС: System.out.print( "Элемент_1"{ + "Элемент_n"} ) ; где "Элемент_1" - "Элемент_n" - Заключённые в кавычки строки, переменные, константы (например, числа) или практически любой объект, определённый в языке Java;
    НАЗНАЧЕНИЕ: Функция выводит один или несколько элементов в стандартный поток вывода;
    ОПИСАНИЕ: Вывод текста или преобразованных в текст объектов, констант и литералов. Переменные выводятся, начиная с текущей позиции курсора, разделяются знаками "+", в конце строка не завершается символом "EOL" (то есть новый вывод будет осуществляться с той же строки);
    ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Функция не возвращает значений;
    ПЕРЕНОСИМОСТЬ: Везде;

    Пример 7.9.

    /* File ex07009.java */
    /* Функция реализует простейший диалог между ЭВМ и человеком с условием */
    /* Данный пример тестировался на компиляторе Sun J2EE SDK 1.6) */
    /* Данный пример требует наличие компилированного класса SavitchIn */
    import java.io.*;
    import java.util.*;
    // Файл ex07009.java
    public class ex07009
    {
    	public static void main( String[] args )
    	{
    /* Определение переменных */
    		int Age;
    		String Name, junk;
    /* Начало диалога (ввод данных пользователя */
    		System.out.print("Введите Ваше имя: ");
    		Name = SavitchIn.readLine();
    		System.out.print( "Введите Ваш возраст: " );
    		Age = SavitchIn.readLineInt();
    /* Проверка условия и вывод диалога */
    		if( Age < 40 )
    			System.out.println( "Добрый день, Молодой человек!" );
    		else
    			System.out.println( "Добрый день, Папаша!" );
    		System.out.println( "Ваш возраст, " + Name + ", - " + Age +" лет." );
    /* Завершение работы программы */
    		System.out.println( "Press key Enter to exit..." );
    		junk = SavitchIn.readLine();
    	}
    }

    7.2. Резюме стандартного буферизированного ввода-вывода

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

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

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

    7.3. Приложение №1

    Функции вывода данных в стандартный поток вывода языка Си.

    ФУНКЦИЯ printf
    ОПРЕДЕЛЕНА В: <stdio.h>
    СИНТАКСИС:
    int printf( format_string[, arguments…] );
    char *format_string;
    НАЗНАЧЕНИЕ: Функция печатает символы и формирует и печатает задаваемые аргументами значения в стандартный поток вывода ( stdout ). Она имеет переменное число параметров;
    ОПИСАНИЕ: Строка описания формата вывода, format_string, состоит из обычных символов, escape и других управляющих последовательностей, а также спецификаций форматов вывода переменных, заданных в списке аргументов, по одному для каждого аргумента;

    Обычные символы и escape последовательности просто копируются в поток stdout в порядке их появления, при этом символ: '\n' преобразуется в последовательность: '\r\n'. Если же за параметром format_string следуют аргументы: arguments, то она должна содержать спецификации форматов, начинающиеся со знака: '%'. Строка описания формата прочитывается слева направо, значения переменных, указанные в строке форматов как спецификации форматов, выводятся последовательно друг за другом. Лишние спецификации игнорируются. Результат не определён, если спецификаций в строке форматов меньше, чем аргументов функции;

    ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Число напечатанных символов.

    ФУНКЦИЯ: puts
    ОПРЕДЕЛЕНА В: <stdio.h>
    СИНТАКСИС:
    int puts( s );
    const char *;
    НАЗНАЧЕНИЕ: Функция выводит строку в поток stdout ;
    ОПИСАНИЕ: Функция puts копирует строку символов с нулевым окончанием '\0' в поток стандартного вывода stdout, причём добавляет в конец символ перехода на новую строку (т.е. заменяет символ '\0' на строку символов "\r\n\0") ;
    ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: При успешном завершении функция puts возвращает ненулевое значение. В противном случае возвращается значение EOF ;
    ПЕРЕНОСИМОСТЬ: Данная функция поддерживается в операционных системах, основанных на UNIX, содержится в стандарте ANSI C.

    ФУНКЦИЯ: putc
    ОПРЕДЕЛЕНА В: <stdio.h>
    СИНТАКСИС:
    int putc( c, stream );
    int c;
    FILE *stream;
    НАЗНАЧЕНИЕ: Функция выводит символ в поток;
    ОПИСАНИЕ: Функция putc представляет собой макрокоманду, которая выводит символ в указанный выходной поток stream ;
    ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: При успешном завершении функция возвращает символ c. При возникновении ошибки функция возвращает значение EOF (конец файла);
    ПЕРЕНОСИМОСТЬ: Функция поддерживается в операционных системах UNIX, стандарте ANSI C, и определена в стандарте Кернигана и Ритчи.

    ФУНКЦИЯ: putchar
    ОПРЕДЕЛЕНА В: <stdio.h>
    СИНТАКСИС:
    int putchar( c );
    int c;
    НАЗНАЧЕНИЕ: Функция выводит символ в поток stdout ;
    ОПИСАНИЕ: putchar - это макрокоманда, определённая как putc( c, stdout) ;
    ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: При успешном завершении функция возвращает выведенный символ c. При ошибке она возвращает EOF ;
    ПЕРЕНОСИМОСТЬ: Функция поддерживается в операционных системах UNIX, стандарте ANSI C, и определена в стандарте Кернигана и Ритчи.

    Вернуться к учебному плану