1 / 35

ЛЕКЦИЯ 2 4

Структуры. ЛЕКЦИЯ 2 4. Встроенные и пользовательские типы. Встроенные типы: целые – sbyte , short, int , long, byte, ushort , uint , ulong , decimal; вещественные – float , double ; логический – bool ; символьный – char ; строковый – string ; массивы – их много.

rad
Download Presentation

ЛЕКЦИЯ 2 4

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Структуры ЛЕКЦИЯ 24

  2. Встроенные и пользовательские типы Встроенные типы: целые – sbyte, short, int, long, byte, ushort, uint, ulong, decimal; вещественные – float, double; логический – bool; символьный – char; строковый – string; массивы – их много. Пользовательские типы: структуры; классы; перечислители. Впервые структуры были замечены в языке COBOL (COmmon Business Oriented Language) в 1959 году.

  3. Cobol – язык для бухгалтеров COBOL = COmmon Business-Oriented Language На фото: разработчики языка Cobol у шуточного обелиска, присланного в их адрес в качестве намека на безнадежно медленную работу, способную похоронить саму идею. Справа внизу – Грейс Хоппер

  4. Пример программы на Коболе (начало) 1010 IDENTIFICATION DIVISION. 1020 PROGRAM-ID “EXAMPLE”. 1030 ENVIROMENT DIVISION. 1040 INPUT-OUTPUT SECTION. 1050 FILE-CONTROL. 1060 SELECT CD ASSIGN TO “SYS010” UNIT-RECORD 2540R. 1070 SELECT TT ASSIGN TO “SYS009” UTILITY 2400. 1080 DATA DIVISION. 1090 FILE SECTION. 1100 FD CD DATA RECORD IS C 1110 LABEL RECORDS ARE OMITTED. 1120 01 C. 1130 02 C1 PICTURE 9(4). 1140 02 C2 PICTURE 9. 1150 02 C3 PICTURE X(70). ... Файл из структур C1 C2 C3 C1 C2 C3 C1 C2 C3

  5. Array vsStruct Сходство И массив, и структура являются составными значениями. Различие Массив состоит из однотипных элементов. Структура состоит из разнотипных элементов. Массив – ссылочный тип. Структура – значимый тип. У массива один конструктор. У структуры может быть много конструкторов. У структуры могут быть не только поля, но и методы.

  6. Title Authors Year Пример структуры structBook { publicstring Title; publicstring Authors; publicint Year; } Поля – это переменные, объявленные внутри структуры. Объявление структуры является управляемой областью видимости (блок, метод – неуправляемые области видимости).

  7. Равноправие типов Пользовательский тип имеет те же права, что и встроенные типы, т.е. можно объявлять переменные и массивы этого типа static void Main(string[] args) { // Две книги. Bookb1, b2; // Масивиз 100 книг. Book[] books = new Book[100]; } b1 b2 null null 0 null null 0 Полям книги можно присваивать значения и считывать эти значения. b1.Authors = "Эвклид"; b1.Title = "Начала"; b1.Year = -300; Console.WriteLine("Название:{0} Автор(ы):{1} Годиздания:{2}", b1.Title, b1.Authors, b1.Year);

  8. Присваивание структур Book b2 = b1; b1 Title Начала Authors Year Эвклид b2 Title Authors Year

  9. Методы структуры У структур могут быть не только поля, но и методы – функции, объявленные внутри структуры. Методы имеют прямой доступ к полям и к другим методам. structBook { publicstring Title; publicstring Authors; publicint Year; publicstringToString() { returnstring.Format( "Название:{0} Автор(ы):{1} Год издания:{2}", Title, Authors, Year); } } Console.WriteLine(b1.ToString());

  10. Упражнение В поле Authors находятся имена авторов, разделенные запятыми. Объявить метод string GetAuthor(int n), который возвращает имя n-го по счету автора. Счет авторов начинается с 0. Если n < 0или n > числа авторов, метод должен вернуть пустую строку. publicstringGetAuthor(int n) { string[] ss = Authors.Split(','); if ( n < 0 || n >= ss.Length) return""; returnss[n].Trim(); }

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

  12. Конструкторы структуры Конструктор типа – функция, которая создает экземпляр заданного типа. Конструктор структуры – это метод, имеющий особый синтаксис. structBook { publicstring Title; publicstring Authors; publicint Year; public Book(string title, string authors, int year) { Title = title; Authors = authors; Year = year; } } Book b1 = new Book("Эвклид", "Начала", -300);

  13. Конструктор по умолчанию Book b1 = new Book(); Book b1; Конструктор по умолчанию нельзя объявить явно.

  14. Конструктор копирования structBook { publicstring Title; publicstring[] Authors; publicint Year; } Book b2 = b1; Book b2 = new Book(b1); b1 b1 Title Title { И.Ильф, Е.Петров } Authors Authors Year Year { И.Ильф, Е.Петров } b2 b2 Title Title { И.Ильф, Е.Петров } Authors Authors Year Year

  15. Самостоятельно structPoint { publicdouble X; publicdouble Y; } • В структуре Point объявите следующие методы: • doubleDistance() – определяет расстояние от данной точки до начала координат. • doubleDistanceTo(Pointother) – определяет расстояние до другой точки. • voidMoveTo(doublex, doubley) – перемещает точку в заданное место плоскости. • stringToString() – преобразует точку в строку символов. • PointMirrorX() – возвращает другую точку, симметричную данной относительно Ox.

  16. Параметры методов Выходные - out Ссылочные - ref Массивные -params По умолчанию - = 0

  17. Классы ЛЕКЦИЯ 25

  18. Идея OOП Первоначальная идея состоит в том, чтобы рассматривать программу не как работу одного исполнителя, а как совместную деятельность нескольких исполнителей. Каждый исполнитель имеет собственную систему команд, для координации усилий исполнители посылают друг другу сообщения.

  19. Объявление класса – описание исполнителя Поля сохраняют текущее состояние. Открытые методы – сообщения, которые он способен принимать. Вызовы методов – отправка сообщений. classTurtle { int x, y; char dir; // n, s, w, o public Turtle() { x = y = 0; dir = 's'; } publicvoid Step(){} • publicvoid Turn(char d) { } } • classProgram • { • staticvoid Main(string[] args) • { • Turtle t = newTurtle(); • t.Step(10); • t.Turn('e'); • t.Step(10); • } • }

  20. Уровни доступа • Доступ к членам класса: • public – виден в программе, которая использует класс или его экземпляры • private – виден только из методов этого же класса • … • Доступ к классам и структурам: • public – виден из других программ • internal – виден только в этой программе

  21. Статические поля Класс – это образец, по которому создаются экземпляры класса – объекты. Некоторые поля класса не появляются в объектах и присутствуют только в объявлении класса. Такие поля называются статическими. publicstaticclassMath { publicconstdouble E = 2.71828; publicconstdouble PI = 3.14159; ... } const = static const

  22. Статические методы Методы, объявленные в классе, имеют доступ ко всем полям класса. Исключение составляют статические методы. Им доступны только статические поля и статические методы. publicstaticclassMath { publicconstdouble E = 2.71828; publicconstdouble PI = 3.14159; publicstaticdecimal Abs(decimal value) {…} ... }

  23. Ссылка this Прежде чем обратиться к полю или вызвать метод, нужно создать объект. Чтобы сослаться на этот объект в коде метода, служит ссылка this, которая им передается в скрытом параметре. Поэтому за пределами методов ссылка this не работает. В статические методы ссылка this не передается. classTurtle { int x, y; char dir; // n, s, w, o public Turtle() { x = y = 0; dir = 's'; } }

  24. Пространства имен Все классы объявляются внутри пространства имен. Например, namespace ConsoleApplication1{ class Turtle { } } Пространство имен задает область видимости. ConsoleApplication1.Turtle Полным именем класса считается имя пространства + имя класса. Полные имена используют, когда нет директивы using или когда надо избежать конфликта имен в программе.

  25. Конструкторы Конструкторы – конструируют.

  26. using System; namespace ConsoleApplication1 { classTurtle { constchar STAR = '*'; int x, y; char dir; // n, s, w, o public Turtle() { x = y = 0; dir = 's'; } publicvoid Step() { PrintStep(); if (dir == 's') y++; if (dir == 'n') y--; if (dir == 'e') x++; if (dir == 'w') x--; } publicvoid Turn(char d) { dir = d; } publicvoid Step(int n) { for (inti = 0; i < n; i++) Step(); } privatevoidPrintStep() { Console.CursorLeft = x; Console.CursorTop = y; Console.Write(STAR); } } classProgram { staticvoid Main(string[] args) { Turtle t = newTurtle(); t.Step(10); t.Turn('e'); t.Step(10); t.Turn('n'); t.Step(10); t.Turn('w'); t.Step(10); } } } Пример класса

  27. Самостоятельно • Добавьте в класс Turtle закрытое поле – символ, при помощи которого производится рисование, и открытый метод, изменяющий этот символ. • Дайте черепашке возможность ползать не оставляя следа. • Добавьте возможность ползания черепашки не только по вертикали и горизонтали, но и по диагоналям. • Добавьте в класс TurtleGraphics метод, который заставляет черепашку рисовать цифры 1 и 0.

  28. Коллекции и связанные списки ЛЕКЦИЯ 26

  29. Коллекция Коллекция – безразмерный массив. publicclassIntCollection { int[] m; publicint Count; public Rubber(int n) {} publicvoid Add(int value) {} publicint Item(intidx) {} } 2 3 2 3 4 7 2 3 4 7 2 3 4 7 8 3 4 9 2 3 4 7 8 3 4 9

  30. D C B A 0 Связанный список Подобно массивам связанные списки представляют собой упорядоченную последовательность элементов данных. Но если массив занимает непрерывный участок памяти, элементы списка могут располагаться в памяти где угодно. classItem { publicstring Info; publicItem Next; public Item(string info, Item next) { Info = info; Next = next; } }

  31. Класс List classList { // Голова списка Item head; // Добавить элемент в начало списка. publicvoid Add(string s) { head = newItem(s, head); } // Удалить начальный элемент списка. publicvoid Delete() { if (head != null) head = head.Next; } // Распечатать список. publicvoid Print() { for (Itemi = head; i != null; i = i.Next) Console.WriteLine(i.Info); } }

  32. Временная сложность операций

  33. D C B A 0 Рекурсивная реализация списка список ::= null список ::= голова + хвост classRList { publicstring Head; publicRList Tail; publicRList(string h, RList t) { Head = h; Tail = t; } publicvoid Add(string h) publicvoid Delete() publicvoidAddToBack(string h) publicvoidRemoveLast() publicvoid Print() } classRList { publicstring Head; publicRList Tail; publicRList(string h, RList t) { Head = h; Tail = t; } publicvoid Add(string h) { Tail = newRList(Head, Tail); Head = h; } publicvoid Delete() { Head = Tail.Head; Tail = Tail.Tail; } publicvoidAddToBack(string h) { if (Tail == null) Tail = newRList(h, null); else Tail.AddToBack(h); } publicvoidRemoveLast() { if (Tail != null) { if (Tail.Tail == null) Tail = null; else Tail.RemoveLast(); } } publicvoid Print() { Console.Write(Head + " "); if (Tail != null) Tail.Print(); else Console.WriteLine(); } }

  34. D C B A 0 Абстрактный список Не следует смешивать идею списка и ее реализацию. Идея состоит в том, что каждый элемент списка содержит адрес следующего за ним. Можно реализовать список в виде массива структур, в котором каждая структура содержит индекс следующей структуры. 0 1 2 3 4 5 6 struct Item { public string Info; public int Next; } class List { Item[] m; ... }

  35. Самостоятельно • 1.Добавьте в класс List методы для: • вставки нового элемента после заданного; • удаления элемента, стоящего после заданного; • подсчета элементов списка; • поиска в списке; • вставки нового элемента перед заданным; • удаления заданного элемента. • 2. Добавьте в класс RList методы для: • присоединениядругогосписка; • обращения списка (изменения порядка следования элементов данных на противоположный).

More Related