Курс лекций CS (первый семестр)
.pdfКафедра теоретической механики ИМЭМ ОНУ им. И.И.Мечникова
Использование следующего кода:
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