Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

4431

.pdf
Скачиваний:
4
Добавлен:
08.01.2021
Размер:
1.01 Mб
Скачать

21

Количество операторов в начальных и в дополнительных дейст-

виях может быть любым. Любая часть в заголовке (или даже все части) могут отсутствовать:

for( ; ; ) { операторы тела цикла }

Но точки с запятыми обязательно должны быть!

Задача 3. Снова вернёмся к рассмотренному выше примеру, но реализуем его с помощью оператора for: найти сумму квадратов первых n натуральных чисел.

Возможный текст программы:

using System; namespace Prim_for

{

class Program

{

public static void Main(string[] args)

{

int i, n, s; do

{

Console.WriteLine("Задайте n>0:"); n = int.Parse(Console.ReadLine());

}

while(n < 1);

for(i = 1, s = 0; i <=n; i++) s += i * i;

Console.WriteLine("s={0}", s); Console.Write("Press any key to continue . . . "); Console.ReadKey(true);

}

}

}

Цикл for позволяет работать более комфортно, записывать исходный текст в более естественной и компактной форме.

Цикл foreach-in

Это новый вид цикла, которого не было в языках C/C++. Он появился только в языке C#. Дословный перевод: «для каждого в…».

Формальная запись этого цикла следующая:

foreach(Тип Переменная in Коллекция)

{

// тело цикла

}

где Тип тип данных; Переменная имя переменной; in ключевое слово; Коллекция имя коллекции. Можно считать, что коллекция это некоторый набор данных, имеющих общее имя.

22

Оператор цикла foreach-in повторяет тело цикла для каждого элемента массива или коллекции объектов, реализующих интерфейс

System.Collections.IEnumerable. В теле цикла можно производить любые действия над объектом коллекции, кроме изменения самой коллекции, т.е. удаления или добавления ее элементов.

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

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

При работе с циклом foreach-in имеется целый ряд ограничений:

1.Невозможно использовать без коллекций, например, решить рассмотренную выше задачу: «Найти сумму квадратов первых n натуральных чисел» с помощью оператора foreach-in не получится;

2.Элементы коллекции доступны только по чтению, т.е. их можно распечатывать, суммировать и так далее, но их нельзя изменять в цикле foreach-in;

3.Нельзя пройти только часть коллекции, например: от начала коллекции и до её середины, или идти с шагом, отличным от 1.

Вобщем случае цикл foreach-in можно рассматривать как частный случай цикла for.

Задача 4. Распечатать значения элементов массива. Массив задан при его инициализации.

Возможный текст программы:

using System; namespace Prim_foreach

{

class Program

{

public static void Main(string[] args)

{

// Описание и инициализация массива вещественных чисел double [] x = {12.5, -4, 0, 2.1};

Console.WriteLine("Массив:"); foreach(double t in x)

Console.WriteLine("{0}",t);

Console.Write("Press any key to continue . . . ");

Console.ReadKey(true);

}

}

}

23

Ниже приведён пример поиска элемента в коллекции с использованием различных операторов цикла:

bool FindFor (List<string> collection, string findElement)

{

for (int i = 0; i < collection.Count; i++)

{

if (collection[i] == findElement) return true;

}

return false;

}

bool FindWhile (List<string> collection, string findElement)

{

int i = 0;

while (i < collection.Count)

{

if (collection[i] == findElement) return true;

i++;

}

return false;

}

bool FindDoWhile (List<string> collection, string findElement)

{

if (collection.Count > 0)

{

int I = 0; do

{

if (collection[i] == findElement) return true;

i++;

}

while (i < collection.Count);

};

return false;

}

bool FindForeachIn (List<string> collection, string findElement)

{

foreach (string element in collection)

{

if (element == findElement) return true;

}

return false;

}

Вопросы для самопроверки

1.Приведите примеры условных операторов.

2.Какие выражения можно использовать в операторе switch?

24

3.Что означает метка default в операторе switch?

4.Какие виды циклов существуют в языке C#?

5.С какими данными может быть использован цикл foreach-in?

Практические задания

1.Реализовать программу, выполняющую поиск минимального элемента

вмассиве целых чисел.

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

Лабораторная работа №5. Изучение средств потокового ввода-вы- вода в языке C# (4 часа)

Краткие теоретические сведения

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

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

Потоки включают три основные операции:

чтение перенос информации из потока в структуру данных, такую как массив байтов;

запись перенос данных в поток из источника данных;

поиск определение и изменение текущей позиции внутри потока.

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

Свойства CanRead, CanWrite и CanSeek потока определяют операции, поддерживаемые потоком.

Ниже перечислены некоторые часто используемые классы потока:

FileStream для чтения и записи в файл.

IsolatedStorageFileStream для чтения и записи в файл в изолированном хранилище.

MemoryStream для чтения и записи в память в качестве резервного хранилища.

BufferedStream для повышения быстродействия операций чтения и записи.

NetworkStream для чтения и записи на сетевые сокеты.

25

PipeStream для чтения и записи в анонимные и именованные каналы.

CryptoStream для связи потоков данных с криптографическими

преобразованиями.

Класс Stream является абстрактным базовым классом для всех потоковых классов в языке С#. Для работы с файлами понадобится также класс FileStream (файловый поток).

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

static void Main(string[] args)

{

FileStream file = new FileStream("d:\\test.txt", FileMode.Open,

FileAccess.Read); //открывает файл только для чтения

}

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

StreamReader/StreamWriter – обеспечивают чтение/запись данных в текстовом формате;

BinaryReader/BinaryWriter – обеспечивают чтение/запись данных в бинарном формате;

XmlTextReader/XmlTextWriter – обеспечивают чтение/запись дан-

ных в формате XML.

Пример записи текстового файла с помощью класса StreamWriter:

StreamWriter sw = new StreamWriter("new.txt"); sw.WriteLine("Hello, World!");

sw.Close();

Пример построчного чтения текстового файла с помощью класса

StreamReader:

using (FileStream fs = new FileStream("new.txt", FileMode.Open, FileAccess.Read))

{

StreamReader streamReader = new StreamReader(fs); string str = "";

while (!streamReader.EndOfStream)

{

str += streamReader.ReadLine();

}

streamReader.Close();

fs.Close();

}

26

Сериализация – это процесс сохранения (записи) объектов в файл. Десериализация – это обратный процесс, обеспечивающий загрузку объекта из файла.

Бинарная сериализация – это процесс сохранения объекта в файле в виде последовательности битов. Для использования бинарной сериализации необходимы следующие пространства имен:

System.Runtime.Serialization.Formatters.Binary;

System.Runtime.Serialization.

Пусть задан класс Person:

[Serializable] public class Person

{

private string _name; private int _age;

public string Name

{

get { return _name; } set { _name = value; }

}

public int Age

{

get { return _age; } set { _age = value; }

}

public Person() { }

public Person(int age, string name)

{

_age = age;

_name = name;

}

}

Пример использования бинарной сериализации для объекта класса

Person:

Person person = new Person(20, "Ivanov Ivan");

using (FileStream stream = new FileStream("example.bin", FileMode.Create))

{

BinaryFormatter bf = new BinaryFormatter(); bf.Serialize(stream, person); stream.Close();

};

Пример бинарной десериализации для объекта класса Person:

27

using (FileStream stream = new FileStream("example.bin", FileMode.Open))

{

BinaryFormatter bf = new BinaryFormatter(); Person person =(Person)bf.Deserialize(stream); stream.Close();

};

XML-сериализация – это процесс сохранения объекта в виде структуры XML. Для использования XML-сериализации необходимо пространство имен

System.Xml.Serialization.

Пример XML-сериализации для объекта класса Person:

Person person = new Person(20, "Ivanov Ivan");

XmlWriter writer = XmlWriter.Create("example.xml"); XmlSerializer serializer = new XmlSerializer(typeof(Person)); serializer.Serialize(writer,person);

writer.Close();

Пример XML-десериализации для объекта класса Person:

XmlReader reader = XmlReader.Create("example.xml"); XmlSerializer serializer = new XmlSerializer(typeof(Person)); Person person = (Person)serializer.Deserialize(reader); reader.Close();

Вопросы для самопроверки

1.Какие классы и методы применяются для создания и удаления файлов в языке C#?

2.Как организованы операции чтения и записи текстовых файлов в языке

C#?

3.Что такое сериализация?

4.Что такое десериализация?

Практические задания

1.Осуществить запись информации о студенте в xml-файл и чтение информации о студенте из xml-файла.

2.Осуществить запись информации о студенте в бинарный файл и чтение информации о студенте из бинарного файла.

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

4.Скопировать все файлы, содержащиеся в папке, в новую папку.

28

Лабораторная работа №6. Изучение структурных типов данных в языке C# (6 часов)

Краткие теоретические сведения

Классы и структуры являются двумя основными конструкциями системы общих типов CTS (Common Type System) в платформе .NET Framework. Каждая из них, по сути, является структурой данных, объединяющей набор данных и поведение в некоторую логическую единицу. Данные и поведение являются членами класса или структуры, и в них включены методы, свойства, события и т.д.

Структурный тип данных ( определяемый ключевым словом struct ) пришел в язык С# из C++. В языке C++ классы и структуры очень схожи. Классы и структуры в языке С# также очень схожи, но у них другие отличия, чем в C++. В языке С# все методы и поля, а также свойства и события по умолчанию закрыты и в классах, и в структурах. Однако классы это ссылочные типы (reference type), а структуры это типы значения (value type).

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

Имеется ряд отличий структуры от класса, а именно:

Структура – это тип-значение, поэтому структуры копируются при присваивании. Как следствие любые изменения, сделанные в копии, не влияют на данные в исходной структуре.

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

Структура не может объявлять используемый по умолчанию конструктор.

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

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

Пример объявления и использования структуры:

public struct Point

{

public int x, y;

public Point(int p1, int p2)

{

x = p1; y = p2;

}

}

public class StructExample

29

{

static void Main()

{

Point p1 = new Point(5, 5); Point p2;

p2.x = 5; p2.y = 10;

Console.WriteLine(string.Format("P1:({0}, {1})", p1.x, p1.y));

Console.WriteLine(string.Format("P2:({0}, {1})", p2.x, p2.y));

Console.ReadLine();

}

}

Перечисления

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

ных: byte, sbyte, short, ushort, int, uint, long, ulong. По умол-

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

Ниже представлен фрагмент программы, осуществляющий вывод значений элементов перечисления:

public class EnumExample

{

enum Days : byte

{

Mon = 1, Tue, Wed, Thu, Fri = 50, Sat, Sun

}

static void Main()

{

byte d = (byte)Days.Mon;

Console.WriteLine("Mon = {0}", d); // Mon = 1 byte d = (byte)Days.Tue; Console.WriteLine("Tue = {0}", d); // Tue = 2 byte d = (byte)Days.Wed;

Console.WriteLine("Wed = {0}", d); // Wed = 3 byte d = (byte)Days.Thu;

Console.WriteLine("Thu = {0}", d); // Thu = 4 byte d = (byte)Days.Fri;

Console.WriteLine("Fri = {0}", d); // Fri = 50 byte d = (byte)Days.Sat; Console.WriteLine("Sat = {0}", d); // Sat = 51 byte d = (byte)Days.Sun; Console.WriteLine("Sun = {0}", d); // Sun = 52

30

Console.ReadLine();

}

}

Массивы

Массивы в языке C# являются динамическими и относятся к ссылочным типам данных. Нумерация элементов массива начинается с 0.

Пример объявления массивов:

//Объявление одномерного массива и его заполнение данными,

//вводимыми с клавиатуры

int[] A = new int[5];

for (int i = 0; i < 5; i++)

A[i] = int.Parse(Console.ReadLine());

//Объявление массива с явной инициализацией int[] B = new int[5] { 1, 2, 3, 4, 5 }; int[] C = { 1, 2, 3 };

//Объявление массива с размерностью,

//задаваемой пользователем

Console.WriteLine("Введите число элементов массива D"); int size = int.Parse(Console.ReadLine());

int[] D = new int[size];

//Объявление матрицы (двухмерного массива) int[,] E = new int[3, 5];

//Объявление массива из массивов с разной размерностью int[][] F = new int[3][];

for (int i = 0; i < 3; i++) F[i] = new int[i + 1];

Вопросы для самопроверки

1.Что такое структура? Приведите несколько примеров структуры.

2.Чем структуры отличаются от классов?

3.Что такое перечисление? Приведите примеры нескольких перечисле-

ний.

4.Какие типы данных могут использоваться для значений элементов перечисления?

5.Какое значение принимает по умолчанию первый элемент в перечисле-

нии?

6.Каким образом элементу перечисления можно задать значение, отличное от принимаемого по умолчанию?

7.Какой индекс имеет первый элемент массива?

8.Приведите примеры объявления массивов: а) одномерного; б) матрицы; в) массива, элементами которого являются массивы.

9.Как создать массив с размерностью, задаваемой пользователем?

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]