Tooprogram.ru

Компьютерный справочник
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Вывод в си шарп

Вывод в си шарп

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

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

Для встраивания отдельных значений в выводимую на консоль строку используются фигурные скобки, в которые заключается встраиваемое значение. Это можем значение переменной ( ) или более сложное выражение (например, операция сложения <4 + 7>). А перед всей строкой ставится знак доллара $.

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

Есть другой способ вывода на консоль сразу нескольких значений:

Этот способ подразумевает, что первый параметр в методе Console.WriteLine представляет выводимую строку («Имя: <0>Возраст: <2>Рост: <1>м»). Все последующие параметры представляют значения, которые могут быть встроенны в эту строку (name, height, age). При этом важен порядок подобных параметров. Например, в данном случае вначале идет name, потом height и потом age. Поэтому у name будет представлять параметр с номером 0 (нумерация начинается с нуля), height имеет номер 1, а age — номер 2. Поэтому в строке «Имя: <0>Возраст: <2>Рост: <1>м» на место плейсхолдеров <0>, <2>, <1>будут вставляться значения соответствующих параметров.

Кроме Console.WriteLine() можно также использовать метод Console.Write() , он работает точно так же за тем исключением, что не осуществляет переход на следующую строку.

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

Кроме вывода информации на консоль мы можем получать информацию с консоли. Для этого предназначен метод Console.ReadLine() . Он позволяет получить введенную строку.

В данном случае все, что вводит пользователь, с помощью метода Console.ReadLine передается в переменную name.

Пример работы программы:

Таким образом мы можем вводить информацию через консоль. Однако минусом этого метода является то, что Console.ReadLine считывает информацию именно в виде строки. Поэтому мы можем по умолчанию присвоить ее только переменной типа string. Как нам быть, если, допустим, мы хотим ввести возраст в переменную типа int или другую информацию в переменные типа double или decimal? По умолчанию платформа .NET предоставляет ряд методов, которые позволяют преобразовать различные значения к типам int, double и т.д. Некоторые из этих методов:

Convert.ToInt32() (преобразует к типу int)

Convert.ToDouble() (преобразует к типу double)

Convert.ToDecimal() (преобразует к типу decimal)

Пример ввода значений:

При вводе важно учитывать текущую операционную систему. В одних культурах разделителем между целой и дробной частью является точка (США, Великобритания. ), в других — запятая (Россия, Германия. ). Например, если текущая ОС — русскоязычная, значит, надо вводить дробные числа с разделителем запятой. Если локализация англоязычная, значит, разделителем целой и дробной части при вводе будет точка.

Организация С#-системы ввода-вывода

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

На самом низком уровне иерархии потоков ввода-вывода находятся потоки, оперирующие байтами. Это объясняется тем, что многие устройства при выполнении операций ввода-вывода ориентированы на байты. Однако для человека привычнее оперировать символами, поэтому разработаны символьные потоки, которые фактически представляют собой оболочки, выполняющие преобразование байтовых потоков в символьные и наоборот. Кроме этого, реализованы потоки для работы с int -, double -, short — значениями, которые также представляют оболочку для байтовых потоков, но работают не с самими значениями, а с их внутренним представлением в виде двоичных кодов.

Центральную часть потоковой С#-системы занимает класс Stream пространства имен System.IO. Класс Stream представляет байтовый поток и является базовым для всех остальных потоковых классов. Из класса Stream выведены такие байтовые классы потоков как:

  1. FileStream — байтовый поток, разработанный для файлового ввода-вывода
  2. BufferedStream — заключает в оболочку байтовый поток и добавляет буферизацию, которая во многих случаях увеличивает производительность программы;
  3. MemoryStream — байтовый поток, который использует память для хранения данных.

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

Подробно мы рассмотрим класс FileStream , классы StreamWriter и StreamReader , представляющие собой оболочки для класса FileStream и позволяющие преобразовывать байтовые потоки в символьные, а также классы BinaryWriter и BinaryReader , представляющие собой оболочки для класса FileStream и позволяющие преобразовывать байтовые потоки в двоичные для работы с int -, double -, short — и т.д. значениями.

Байтовый поток

Чтобы создать байтовый поток, связанный с файлом, создается объект класса FileStream . При этом в классе определено несколько конструкторов. Чаще всего используется конструктор, который открывает поток для чтения и/или записи:

  1. параметр filename определяет имя файла, с которым будет связан поток ввода-вывода данных; при этом filename определяет либо полный путь к файлу, либо имя файла, который находится в папке bin/debug вашего проекта.
  2. параметр mode определяет режим открытия файла, который может принимать одно из возможных значений, определенных перечислением FileMode :
    • FileMode.Append — предназначен для добавления данных в конец файла;
    • FileMode.Create — предназначен для создания нового файла, при этом если существует файл с таким же именем, то он будет предварительно удален;
    • FileMode. CreateNew — предназначен для создания нового файла, при этом файл с таким же именем не должен существовать;
    • FileMоde.Open — предназначен для открытия существующего файла;
    • FileMode.ОpenOrCreate — если файл существует, то открывает его, в противном случае создает новый
    • FileMode.Truncate — открывает существующий файл, но усекает его длину до нуля
Читать еще:  Сетевой адаптер код ошибки 10

Если попытка открыть файл оказалась неуспешной, то генерируется одно из исключений: FileNotFoundException — файл невозможно открыть по причине его отсутствия, IOException — файл невозможно открыть из-за ошибки ввода-вывода, ArgumentNullException — имя файла представляет собой null -значение, ArgumentException — некорректен параметр mode, SecurityException — пользователь не обладает правами доступа, DirectoryNotFoundException — некорректно задан каталог.

Другая версия конструктора позволяет ограничить доступ только чтением или только записью:

  1. параметры filename и mode имеют то же назначение, что и в предыдущей версии конструктора;
  2. параметр how, определяет способ доступа к файлу и может принимать одно из значений, определенных перечислением FileAccess :
  1. FileAccess.Read — только чтение;
  2. FileAccess.Write — только запись;
  3. FileAccess.ReadWrite — и чтение, и запись.

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

Для чтения очередного байта из потока, связанного с физическим файлом, используется метод ReadByte() . После прочтения очередного байта внутренний указатель перемещается на следующий байт файла. Если достигнут конец файла, то метод ReadByte() возвращает значение -1 .

Для побайтовой записи данных в поток используется метод WriteByte() .

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

Рассмотрим пример использования класса FileStream , для копирования одного файла в другой. Но вначале создадим текстовый файл text.txt в папке bin/debug текущего проекта. И внесем в него произвольную информацию, например:

Символьный поток

Чтобы создать символьный поток нужно поместить объект класса Stream (например, FileStream ) «внутрь» объекта класса StreamWriter или объекта класса StreamReader . В этом случае байтовый поток будет автоматически преобразовываться в символьный.

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

где параметр stream определяет имя уже открытого байтового потока.

Например, создать экземпляр класса StreamReader можно следующим образом:

Этот конструктор генерирует исключение типа ArgumentException , если поток stream не открыт для вывода, и исключение типа ArgumentNullException , если он (поток) имеет null-значение.

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

где параметр name определяет имя открываемого файла.

Например, обратиться к данному конструктору можно следующим образом:

И еще один вариант конструктора StreamWriter :

где параметр name определяет имя открываемого файла;

параметр appendFlag может принимать значение true — если нужно добавлять данные в конец файла, или false — если файл необходимо перезаписать.

Теперь для записи данных в поток fileOut можно обратиться к методу WriteLine . Это можно сделать следующим образом:

В данном случае в конец файла t.txt будет дописано слово test .

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

где параметр stream определяет имя уже открытого байтового потока.

Этот конструктор генерирует исключение типа ArgumentException , если поток stream не открыт для ввода.

Например, создать экземпляр класса StreamWriter можно следующим образом:

Как и в случае с классом StreamWriter у класса StreamReader есть и другой вид конструктора, который позволяет открыть файл напрямую:

где параметр name определяет имя открываемого файла.

Обратиться к данному конструктору можно следующим образом:

В C# символы реализуются кодировкой Unicode. Для того, чтобы можно было обрабатывать текстовые файлы, содержащие русские символы, созданные, например, в Блокноте, рекомендуется вызывать следующий вид конструктора StreamReader:

Параметр Encoding.GetEncoding(1251) говорит о том, что будет выполняться преобразование из кода Windows-1251 (одна из модификаций кода ASCII, содержащая русские символы) в Unicode. Encoding.GetEncoding(1251) реализован в пространстве имен System.Text .

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

Рассмотрим пример, в котором данные из одного файла копируются в другой, но уже с использованием классов StreamWriter и StreamReader .

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

лабы по информатике, егэ

лабораторные работы и задачи по программированию и информатике, егэ по информатике

Урок 1. Язык программирования c sharp. Создание проекта в Visual Studio

Алгоритм работы при создании C# sharp-проекта в Visual Studio

  1. Запуск Microsoft Visual Studio.
  2. Пункт меню File -> New -> Project (Файл -> Создать -> Проект).
  3. В открывшемся окне в разделе Installed (Установленные) найти Visual C#.
  4. Справа в разделе Templates (Шаблоны) выбрать Console Application (Консольное приложение).
  5. Указать имя нового «решения» (Solution Name) и имя проекта (Name).
  6. Сохранить проект на локальном диске в легко доступном месте (например, D:Projects).
  7. Можно снять галочку Create folder for solution (Создать каталог для решения), чтобы не множить каталоги без необходимости.

[Название проекта: HelloWorld , имя файла hw.cs ]

    Часть 1:
Читать еще:  Функции в си примеры
  • Создайте новый проект с названием MyFirstProject (алгоритм создания проекта см. выше).
  • В окне Solution Explorer (Обозреватель решений) выполните правый клик на названии проекта … Application и выберите пункт Add ->New Item ->Class (Добавить -> Создать элемент -> Класс С# (cs)). В поле Имя файла введите Hw.cs. Щелкните Добавить
  • В первых строках файла перечислены подключения глобальных пространств имен:

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;

    или вывода значения переменной:

    Чтобы консольное окно не исчезало сразу, добавим паузу:

    Указание: Для указания пола студента необходимо использовать символьный тип данных:

    [Название проекта: Lesson_1Task1 , название файла L1Task1.cs ]

    Результат:

      Для ввода данных в си шарп применяется стандартная функция:

    int n = int.Parse(Console.ReadLine());

    где int означает целочисленный тип переменной;
    int.Parse — метод для преобразования введенной строки в целое число.

    То же самое можно записать в две строки и использовать две переменных: сначала введенное значение сохраняется в первую строковую переменную ( s ), затем это значение преобразуется в целочисленное и сохраняется во вторую переменную целочисленного типа ( n ):

    String s = Console.ReadLine(); int n = int.Parse(s);

    Подробно: Запросить число. Увеличить на единицу. Вывести значение. Выполнить при помощи пользовательской функции с аргументом.

    [Название проекта: Lesson_1Lab2 , название файла L1Lab2.cs ]

    1. Создайте новый проект (консольное приложение, пустой проект) с названием AddOne: File ->New Project ->Visual C# , Console Application.

    Откройте файл Program.cs и добавьте код объявления целочисленной переменной и запросите значение для нее:

    . int n = int.Parse(Console.ReadLine()); .

    . n++; Console.WriteLine(n); Console.ReadKey(); .

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace AddOne

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

    Указание: Для того, чтобы представить результат не целого, а вещественного типа, по крайней мере один из операндов должен быть вещественного типа. По заданию мы имеем целый тип. Поэтому, чтобы все-таки получить результат вещественного типа, нужно в качестве делителя использовать 2.0 (т.е. (a + b) / 2.0 ).

    [Название проекта: Lesson_1Task2 , название файла L1Task2.cs ]

    Результат:

    Лабораторная работа 3. Boolean type
    Выполнить: Задаются три целых числа: A , B и C (они вводятся). Выведите значение true в окно консоли, если двойное неравенство A истинно, и выведите false в противном случае.

    Указание: Не использовать условный оператор ( IF ).

    [Название проекта: Lesson_1Lab3 , название файла L1Lab3.cs ]

    Пример выполнения:

    1. Откройте Visual Studio.
    2. Создайте консольное приложение с именем Lesson_1 Lab 3 : File (Файл) — >New (Создать) — >Project/Solution (Проект) — >Console Application (Консольное приложение).
    3. В окне Solution Explorer (Обозреватель решений) найдите файл Program.cs и переименуйте его в L1Lab3.cs .
    4. Внутри функции Main попросите пользователя ввести три числа:

    . Console.WriteLine(«Введите три числа»); int a = int.Parse(Console.ReadLine()); int b = int.Parse(Console.ReadLine()); int c = int.Parse(Console.ReadLine()); .

    Добавьте код для вывода результата двойного сравнения переменных (если a и b , то результат будет true , а в противном случае — false ):

    . Console.WriteLine(a F5 ).
    Чтобы сделать вывод более красивым, вы можете использовать другой способ (рекомендуемый синтаксис c# ):

    . //Console.WriteLine(a $ . В фигурных скобках есть заполнители, они предназначены для значений переменных.

    Выполнить: Даны четыре числа: x1 , x2 , x3 , x4 . Выведите true , если сумма первых двух чисел ( x1 , x2 ) больше суммы следующих двух чисел ( x3 , x4 ), а в противном случае выведите false .

    Указание: Не использовать условный оператор ( IF ).

    [Название проекта: Lesson_1Task3 , название файла L1Task3.cs ]

    Методы в языке C#

    Терминологические заморочки

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

    С переходом от императивного языка C к объектно-ориентированному языку C++ понятие функции (как подпрограммы) сохранилось, однако каждая функция стала принадлежать какому-либо классу. Отметим что в С++ были добавлены специальные функции – конструкторы и деструкторы.

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

    Разберемся с терминами и понятиями более подробно.

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

    Авторы языка определили, что функции-члены — это члены, которые обеспечивают некоторую функциональность для манипулирования данными класса. Они включают методы, свойства, конструкторы, финализаторы (деструкторы в С++), операции и индексаторы.

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

    Шаблон объявления метода

    [модификаторы] тип_возвращаемого_значения ИмяМетода([параметры])
    <
    // Тело метода
    >
    В C# определение метода состоит из указания модификаторов (static, public и т.п., модификаторы не обязательны), типа возвращаемого значения, имени метода и списка параметров в круглых скобках. Далее в фигурных скобках записывается тело метода.
    Каждый параметр состоит из имени типа параметра и имени, по которому к нему можно обратиться в теле метода.

    Возврат из метода и возврат значения

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

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

    Читать еще:  Неизвестная ошибка smtp error code 1

    В целом, возврат из метода может произойти при двух условиях. Во-первых, когда встречается фигурная скобка, закрывающая тело метода. И во-вторых, когда выполняется оператор return. Имеются две формы оператора return: одна — для методов типа void (возврат из метода), т.е. тех методов, которые не возвращают значения, а другая — для методов, возвращающих конкретные значения.

    Использование параметров

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

    Параметры объявляются в скобках после имени метода. Синтаксис объявления параметров такой же, как и у переменных. А областью действия параметров является тело метода. За исключением особых случаев передачи аргументов методу, параметры действуют так же, как и любые другие переменные.

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

    Если переменная, указанная в списке параметров, относится к типу значений (int, double, bool и т.п.), то вызываемый метод получает копию этой переменной, а это значит, что все изменения в ней, выполненные внутри метода будут утеряны.

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

    Поведение строк также отличается. Дело в том, что строки являются неизменными (изменение значения строки приводит к созданию совершенно новой строки), поэтому строки не демонстрируют поведение, характерное для ссылочных типов. Любые изменения, проведенные в строке внутри метода, не влияют на исходную строку.

    Передача структуры (struct) как параметра через ее имя также произойдет через копирование (помните, структура относится к типу значений).

    Если же для каких-либо типов данных необходима передача по ссылке (она более эффективна при большом объеме данных, который приходится копировать), то перед указанием типа параметра достаточно указать модификатор ref (reference – ссылка, англ.).

    Рассмотрим три примера.

    ПРИМЕР 1. В статье Первая программа на языке Си шарп мы разбирали программу:

    В классе Program объявляется метод Main() (главная функция приложения), при выполнении которого вызываются два метода класса Console: WriteLine() (вывод строки текста) и ReadKey() (чтение символа с клавиатуры).

    Ключевое слово static означает, что данный метод принадлежит классу Program.

    Модификатор void указывает, что метод не возвращает никаких параметров.

    Метод Main() в качестве списка параметров имеет массив строк, метод WriteLine() имеет один параметр – строку, метод ReadKey() параметров не имеет.

    ПРИМЕР 2. Объявление метода в примере Вычисление функции sin(x) выглядит так:

    Параметром (аргументом) функции объявляется переменная x типа double, метод возвращает результат также типа double (последний оператор метода return s;). Метод является статическим. Для вызова метода достаточно написать оператор y=Sin2(x);

    ПРИМЕР 3. Передача параметров по значению, ссылке и через статическую переменную

    Объявим в классе Program структуру West с двумя полями, статическую переменную f и метод vp( ):
    static void vp(int[] b, West u, string t, double d, ref decimal y)
    где b – массив, u – структура, t – строка, d – вещественное число, y – десятичный тип, передается по ссылке (модификатор ref).

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

    Напечатаем эти значения до и после вызова метода vp().

    Результат:

    Обратите внимание, что второй элемент массива a[1], десятичное число x (передаваемое через ссылку — ref) и статическая переменная f изменились, а структура u, строка t и вещественное число d не изменились.

    Отметим, что статическое поле f, объявленное в классе, доступно методам этого класса без механизма передачи параметров.

    Некоторые итоги:

    1) переменные, объявленные внутри метода или в списке его параметров, являются локальными переменными;

    2) при вызове метода параметры из списка в заголовке метода либо копируются в локальные переменные метода, либо передаются по ссылке;

    3) копируются все встроенные типы значений, структуры и (по сути) строки, хотя и они относятся к ссылочным типам;

    4) по ссылке передаются массивы и другие объекты. Если их поля будут изменены внутри вызываемого метода, то эти изменения сохранятся при возврате в вызывающий метод;

    5) передачу параметров по ссылке (без копирования в локальные переменные метода) можно обеспечить, используя модификатор ref. Однако это не имеет смысла для переменных ссылочного типа («масло масленое»);

    6) нет необходимости передавать статические переменные класса через список параметров, в рамках одного класса они имеют смысл глобальных переменных в императивных языках программирования (хотя термин «глобальная переменная» в C# не употребляют);

    7) для доступа к данным-членам и функциям-членам других классов необходимо указать имя класса, поставить точку, указать имя члена класса, например: Math.PI — константа, число пи=3,14158… , Math.Tan(x) — тангенс числа x, заданного в радианах;

    8) доступ к членам других классов зависит от уровня его приватности (public, но не private или protected).

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

    Завершим раздел рассмотрением двух из трех ключевых принципов ООП — наследования и полиморфизма, считаю принцип инкапсуляции (объединение данных и и методов в класс) уже достаточно ясным.

  • Ссылка на основную публикацию
    Adblock
    detector