Опубликован: 15.09.2010 | Доступ: свободный | Студентов: 4806 / 630 | Оценка: 3.97 / 3.80 | Длительность: 14:45:00
Лекция 4:

Простейший ввод-вывод. Управляющие операторы

< Лекция 3 || Лекция 4: 1234 || Лекция 5 >
Аннотация: Основные возможности консольного ввода-вывода (класс Console) и управляющие операторы языка (ветвления, циклы, передача управления).

Консольный ввод-вывод

Презентацию к данной лекции Вы можете скачать здесь.

Любая программа при вводе исходных данных и выводе результатов взаимодействует с внешними устройствами. Совокупность стандартных устройств ввода и вывода, то есть клавиатуры и экрана, называется консолью. В языке C# нет операторов ввода и вывода. Вместо них для обмена с внешними устройствами применяются стандартные объекты. Для работы с консолью в C# применяется класс Console, определенный в пространстве имен System. Методы этого класса Write и WriteLine уже использовались в листинге 3.1. Поговорим о них подробнее, для чего внесем некоторые изменения в этот листинг. Результаты этих изменений представлены в листинге 4.1.

using System;
namespace ConsoleApplication1
{    class Class1
    {    static void Main()
        {
            int     i = 3;
            double  y = 4.12;
            decimal d = 600m;
            string  s = "Вася";

            Console.WriteLine( "i = " + i );                   // 1
            Console.WriteLine( "s = " + s );                   // 2
            Console.WriteLine( "y = {0} \nd = {1}", y, d );    // 3
       }
    }
}
Листинг 4.1. Методы вывода

Результат работы программы:

i = 3
s = Вася
y = 4,12
d = 600

До сих пор мы использовали метод WriteLine для вывода значений переменных и литералов различных встроенных типов. Это возможно благодаря тому, что в классе Console существует несколько вариантов методов с именами Write и WriteLine, предназначенных для вывода значений различных типов.

Методы с одинаковыми именами, но разными параметрами называются перегруженными. Компилятор определяет, какой из методов вызван, по типу передаваемых в него величин. Методы вывода в классе Console перегружены для всех встроенных типов данных, кроме того, предусмотрены варианты форматного вывода.

Листинг 4.1 содержит два наиболее употребляемых варианта вызова методов вывода. Если метод WriteLine вызван с одним параметром, он может быть любого встроенного типа. В строке, помеченной комментариями "1" и "2", нам требуется вывести в каждой строке не одну, а две величины, поэтому прежде чем передавать их для вывода, их требуется "склеить" в одну строку с помощью операции +.

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

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

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

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

  1. Символы, представляющие собой число, вводятся с клавиатуры в строковую переменную.
  2. Выполняется преобразование из строки в переменную соответствующего типа.

Преобразование можно выполнить либо с помощью специального класса Convert, определенного в пространстве имен System, либо с помощью метода Parse, имеющегося в каждом стандартном арифметическом классе. В листинге 4.2 используются оба способа.

using System;
namespace ConsoleApplication1
{    class Class1
    {    static void Main()
        {
            Console.WriteLine( "Введите строку" );
            string s = Console.ReadLine();                  // 1
            Console.WriteLine( "s = " + s );
            
            Console.WriteLine( "Введите символ" );
            char c = (char)Console.Read();                  // 2
            Console.ReadLine();                             // 3
            Console.WriteLine( "c = " + c );
        
            string buf;        // строка – буфер для ввода чисел

            Console.WriteLine( "Введите целое число" );
            buf = Console.ReadLine();
            int i = Convert.ToInt32( buf );                 // 4
            Console.WriteLine( i );

            Console.WriteLine( "Введите вещественное число" );
            buf = Console.ReadLine();
            double x = Convert.ToDouble( buf );             // 5
            Console.WriteLine( x );

            Console.WriteLine( "Введите вещественное число" );
            buf = Console.ReadLine();
            double y = double.Parse( buf );                 // 6
            Console.WriteLine( y );

            Console.WriteLine( "Введите вещественное число" );
            buf = Console.ReadLine();
            decimal z = decimal.Parse( buf );               // 7
            Console.WriteLine( z );
        }
    }
}
Листинг 4.2. Ввод с консоли

Ввод строки выполняется в операторе 1. Длина строки не ограничена, ввод выполняется до символа перевода строки.

Ввод символа выполняется с помощью метода Read, который считывает один символ из входного потока (оператор 2). Метод возвращает значение типа int, представляющее собой код символа, или –1, если символов во входном потоке нет (например, пользователь нажал клавишу Enter ). Поскольку нам требуется не int, а char, а неявного преобразования от int к char не существует, приходится применить операцию явного преобразования типа.

Оператор 3 считывает остаток строки и никуда его не передает. Это необходимо потому, что ввод данных выполняется через буфер — специальную область оперативной памяти. Фактически данные сначала заносятся в буфер, а затем считываются оттуда процедурами ввода. Занесение в буфер выполняется по нажатию клавиши Enter вместе с ее кодом. Метод Read, в отличие от ReadLine, не очищает буфер, поэтому следующий после него ввод будет выполняться с того места, на котором закончился предыдущий.

В операторах 4 и 5 используются методы класса Convert, в операторах 6 и 7 — методы Parse классов Double и Decimal библиотеки .NET, которые используются здесь через имена типов С# double и decimal.

Внимание

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

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

Ввод-вывод в файлы

Часто бывает удобно заранее подготовить исходные данные в текстовом файле и считывать их в программе. Вывод из программы тоже бывает полезно выполнить не на экран, а в текстовый файл. Работа с файлами подробно рассматривается позже, а сейчас приведем лишь образцы для использования в программах. В листинге 4.3 приведена версия программы из листинга 4.1, выполняющая вывод не на экран, а в текстовый файл с именем output.txt. Файл создается в том же каталоге, что и исполняемый файл программы, по умолчанию — ...\ConsoleApplication1\bin\Debug.

using System;
using System.IO;                                                     // 1
namespace ConsoleApplication1
{    class Class1
    {    static void Main()
        {
            StreamWriter f = new StreamWriter( "output.txt" );       // 2
            int     i = 3;
            double  y = 4.12;
            decimal d = 600m;
            string  s = "Вася";

            f.WriteLine( "i = " + i );                               // 3
            f.WriteLine( "s = " + s );                               // 4
            f.WriteLine( "y = {0} \nd = {1}", y, d );                // 5

            f.Close();                                               // 6
        }
    }
}
Листинг 4.3. Вывод в текстовый файл

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

  1. Подключить пространство имен, в котором описываются стандартные классы для работы с файлами (оператор 1).
  2. Объявить файловую переменную и связать ее с файлом на диске (оператор 2).
  3. Выполнить операции ввода-вывода (операторы 3–5).
  4. Закрыть файл (оператор 6).

Ввод данных из файла выполняется аналогично. В листинге 4.4 приведена программа, аналогичная листингу 4.2, но ввод выполняется из файла с именем input.txt, расположенного в каталоге D:\C#. Текстовый файл можно создать с помощью любого текстового редактора, удобно использовать Visual Studio.NET.

using System;
using System.IO;
namespace ConsoleApplication1
{    class Class1
    {    static void Main()
        {
            StreamReader f = new StreamReader( "d:\\C#\\input.txt" );
            string s = f.ReadLine();
            Console.WriteLine( "s = " + s );
            
            char  c = (char)f.Read();
            f.ReadLine();
            Console.WriteLine( "c = " + c );
        
            string buf;
            buf = f.ReadLine();
            int i = Convert.ToInt32( buf );
            Console.WriteLine( i );

            buf = f.ReadLine();
            double x = Convert.ToDouble( buf );
            Console.WriteLine( x );

            buf = f.ReadLine();
            double y = double.Parse( buf );
            Console.WriteLine( y );

            buf = f.ReadLine();
            decimal z = decimal.Parse( buf );
            Console.WriteLine( z );
            f.Close();
        }
    }
}
Листинг 4.4. Ввод из текстового файла

Математические функции — класс Math

Самая простая программа, которую можно себе представить (не считая "Hello, World!"), состоит из ввода исходных данных, вычислений по каким-то формулам и вывода результата. В выражениях, из которых состоят формулы, часто используются математические функции, например, синус или возведение в степень. Они реализованы в классе Math, определенном в пространстве имен System. Описание методов и полей класса приведено в таблице 4.1.

Таблица 4.1. Основные поля и статические методы класса Math
Имя Описание Результат Пояснения
Abs Модуль Перегружен | x | записывается как Abs(x)
Acos Арккосинус double Acos(double x)
Asin Арксинус double Asin(double x)
Atan Арктангенс double Atan2(double x, double y) — угол, тангенс которого есть результат деления y на x
BigMul Произведение long BigMul(int x, int y)
Ceiling Округление до большего целого double Ceiling(double х)
Cos Косинус double Сos(double x)
Cosh Гиперболический косинус double Cosh(double x)
DivRem Деление и остаток Перегружен DivRem(x, y, rem)
E База натурального логарифма (число е) double 2,71828182845905
Exp Экспонента double e x записывается как Exp(x)
Floor Округление до меньшего целого double Floor(double х)
IEEERemainder Остаток от деления double IEEERemainder(double x, double y)
Log Натуральный логарифм double loge x записывается как Log(x)
Log10 Десятичный логарифм double log10 x записывается как Log10(x)
Max Максимум из двух чисел Перегружен Max(x, y)
Min Минимум из двух чисел Перегружен Min(x, y)
PI Значение числа \pi double 3,14159265358979
Pow Возведение в степень double xy записывается как Pow(x, y)
Round Округление Перегружен Round(3.1) даст в результате 3 Round (3.8) даст в результате 4
Sign Знак числа int Аргументы перегружены
Sin Синус double Sin(double x)
Sinh Гиперболический синус double Sinh(double x)
Sqrt Квадратный корень double \surd x записывается как Sqrt(x)
Tan Тангенс double Tan(double x)
Tanh Гиперболический тангенс double Tanh(double x)

В листинге 4.5 приведен пример применения методов класса Math.

using System;
namespace ConsoleApplication1
{    class Class1
    {    static void Main()
        {
            Console.Write( "Введите х: " );
            double x = double.Parse( Console.ReadLine() );
            Console.Write( "Введите y: " );
            double y = double.Parse( Console.ReadLine() );
            Console.WriteLine( "Максимум из х и y : " + Math.Max(x, y) );
            double z = Math.Pow(Math.Sin(x), 2) +  Math.Pow(Math.Sin(y), 2);
            Console.WriteLine( "Сумма квадратов синусов х и y : " + z ); 
        }
    }
}
Листинг 4.5. Применение методов класса Math

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

< Лекция 3 || Лекция 4: 1234 || Лекция 5 >
Данил Кондратюк
Данил Кондратюк
Россия, г.Новосибирск