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

Курс лекций CS (первый семестр)

.pdf
Скачиваний:
7
Добавлен:
20.05.2015
Размер:
2.69 Mб
Скачать

Кафедра теоретической механики ИМЭМ ОНУ им. И.И.Мечникова

Использование следующего кода:

foreach (int d in dTo10)

{

Console.WriteLine(d);

}

При компиляции выдаст сообщение об ошибке:

Поскольку является недопустимым, так как dTo10 содержит в себе не элементы int, а элементы int[]. Поэтому нам придется проходить не только по самому массиву, но и непосредственно по каждому субмассиву:

foreach (int[] dOfInt in dTo10)

foreach (int d in dOfInt)

{

Console.WriteLine(d);

}

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

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

Пример.

using System;

using System.Collections.Generic;

using System.Text;

101

Кафедра теоретической механики ИМЭМ ОНУ им. И.И.Мечникова

namespace ConsoleApplication1

{

class Program

{

static void Main(string[] args)

{

Console.WriteLine("Введите количество чисел"); int k=Convert.ToInt32(Console.ReadLine()); int [] a=new int [k];

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

{

Console.Write("Введите целое число: "); a[i] = Convert.ToInt32(Console.ReadLine());

}

int[] del = new int[5]; int p=0;

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

{

int kol = 0;

for (int j = 1; j <= a[i]; j++) if (a[i] % j==0) kol++;

del[p++] = kol;

}

int[][] myMas = new int[k][]; for (int i = 0; i < k; i++)

myMas[i] = new int[del[i]]; for(int i=0;i<k;i++)

{

102

Кафедра теоретической механики ИМЭМ ОНУ им. И.И.Мечникова

p = 0;

for (int j = 1; j <= a[i]; j++)

if (a[i] % j==0) myMas[i][p++] = j;

}

foreach (int[] d1 in myMas)

{

foreach (int d2 in d1) Console.Write("{0}\t", d2);

Console.Write("\n");

}

}

}

}

Результат.

103

Кафедра теоретической механики ИМЭМ ОНУ им. И.И.Мечникова

Лекция №16.

Структура.

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

– это структура. Структура – определяемый пользователем тип данных; объявление структуры служит для того, чтобы определить свойства типов данных. После того как Вы определите тип, можно создавать переменные этого типа. Таким образом, создание структуры – процесс, состоящий из двух частей. Сначала Вы описываете структуру, т.е. описываете и маркируете различные типы данных, которые могут содержаться в структуре. Затем можно создавать структурные переменные.

Шаблон структуры: struct имяСтруктуры

{

Список переменных-членов (поля)

};

Список переменных-членов состоит из объявлений вида:

Тип_доступа тип_переменной имя_переменной;

Для того чтобы код, обращающийся к структуре, имел доступ к ее полям, в разделе тип_доступа следует использовать ключевое слово public (общий). Например:

Пример:

struct student

//описание структуры

{

public char[] name;

104

Кафедра теоретической механики ИМЭМ ОНУ им. И.И.Мечникова

public float rost;

public double massa;

}

Каждый элемент списка – это оператор объявления. Здесь можно использовать любой из типов данных С#, включая массивы и другие структуры. Объявление шаблона структуры должно располагать вне функции Main или в разделе пространства имен namespace, или в объявлении класса (class).

Если у Вас есть шаблон, можно создавать переменные этого типа:

student Oleg; // Oleg – структурная переменная типа student;

Учитывая, что Oleg имеет тип student, для обращения к отдельным элементам можно использовать оператор принадлежности (.). Например, Oleg.rost обращается к элементу rost структуры Oleg.

Пример.

using System;

using System.Collections.Generic; using System.Text;

namespace ConsoleApplication1

{

struct student

//описание структуры

{

 

public char[] name;

 

public float rost;

 

public double massa;

 

}

 

class Program

 

{

 

105

Кафедра теоретической механики ИМЭМ ОНУ им. И.И.Мечникова

static void Main(string[] args)

{

student Oleg;

Oleg.name = new char[] {'I','v','a','n','o','v',' ','O','l','e','g'}; Oleg.rost=1.88f;

Oleg.massa=60.78; Console.Write("Cтудент "); foreach (char i in Oleg.name)

Console.Write(i);

Console.WriteLine(" имеет рост {0} и вес {1}", Oleg.rost, Oleg.massa); Console.ReadLine();

}

}

}

Результат.

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

Пример.

using System;

using System.Collections.Generic; using System.Text;

namespace ConsoleApplication1

{

class Program

{

106

Кафедра теоретической механики ИМЭМ ОНУ им. И.И.Мечникова

struct my

{

public int[] mas; public int g; public double s;

}

static void Main(string[] args)

{

my s1; s1.g = 5;

s1.mas = new int[s1.g];

for(int i=0;i<s1.g;i++)

s1.mas[i]=i;

s1.s = 9.0;

my s2 = s1;

for (int i = 0; i < s1.g; i++)

Console.WriteLine(s2.mas[i]);

}

}

}

Результат.

Массивы структур.

Структура student содержит массив (массив name). Можно также создавать массивы, элементы которых будут структурами. Например, чтобы создать массив из 100 структур student, выполните следующее:

107

Кафедра теоретической механики ИМЭМ ОНУ им. И.И.Мечникова

student[] Mexanic=new student[100];

//массив из 100 структур student

Пример.

using System;

using System.Collections.Generic; using System.Text;

namespace ConsoleApplication1

{

struct student

//описание структуры

{

 

public char[] name;

 

public float rost;

 

public double massa;

 

}

 

class Program

 

{

 

static void Main(string[] args)

{

student Oleg;

Oleg.name = new char[] {'I','v','a','n','o','v',' ','O','l','e','g'}; Oleg.rost=1.88f;

Oleg.massa=60.78; Console.Write("Cтудент "); foreach (char i in Oleg.name)

Console.Write(i);

Console.WriteLine(" имеет рост {0} и вес {1}", Oleg.rost, Oleg.massa); student Nata;

108

Кафедра теоретической механики ИМЭМ ОНУ им. И.И.Мечникова

Nata.name = new char[] { 'P', 'e', 't', 'r','o', 'v', 'a', ' ', 'N', 'a', 't', 'a'};

Nata.rost = 1.70f;

Nata.massa = 55.78; Console.Write("Cтудент "); foreach (char i in Nata.name)

Console.Write(i);

Console.WriteLine(" имеет рост {0} и вес {1}", Nata.rost, Nata.massa); Console.WriteLine("");

const int n = 2;

student [] Mexanic=new student[n]{Oleg,Nata}; for (int j = 0; j < n; j++)

{

Console.Write("Cтудент ");

foreach (char i in Mexanic[j].name) Console.Write(i);

Console.WriteLine(" имеет рост {0} и вес {1}", Mexanic[j].rost,

Mexanic[j].massa);

}

Console.ReadLine();

}

}

}

Результат.

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

109

Кафедра теоретической механики ИМЭМ ОНУ им. И.И.Мечникова

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

enum имяТипа{

значение1,

значение2,

значение3,

значение N

}

Затем объявляются переменные этого типа:

имяТипа имяПеременной;

Им присваиваются конкретные значения:

имяПеременной = имяТипа. значение;

Перечислимый тип обладает базовым типом (underlying type), который используется для хранения. Любое из значений, которые этот тип может принимать, будет храниться в памяти как значение базового типа (по умолчанию это тип int). Однако существует возможность задать в качестве базового другой тип, добавив к описанию типа имя его базового типа:

enum имяТипа : базовыйТип

{

значение1,

значение2,

значение3,

110