русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Концепция типа данных. Определение собственных типов данных.


Дата добавления: 2015-07-09; просмотров: 2999; Нарушение авторских прав


Создание нового класса с различными членами. Пример см. в «Основы программирования на C#» стр.154 ( Проектирование класса Rational). Программирование класса дробей как тип данных.

Концепция типов данных состоит в том, что каждой информации приписывается тип, который описывается:

1) множеством допустимых значений типа,

2) набором операций для этого типа,

3) диапазоном допустимых значений,

4) количеством памяти, необходимой для хранения данного типа.

8. Концепция типа данных. Значащие (размерные) (Value type) и ссылочные (Reference type) типы данных. Упаковка и распаковка (Boxing, Unboxing).

Концепция типов данных состоит в том, что каждой информации приписывается тип, который описывается:

· множеством допустимых значений типа,

· набором операций для этого типа,

· диапазоном допустимых значений,

· количеством памяти, необходимой для хранения данного типа.

Значимые и ссылочные типы данных. Для значимых типов значение переменной (объекта) является неотъемлемой собственностью переменной (точнее, собственностью является память, отводимая значению, а само значение может изменяться). Для ссылочных типов значением служит ссылка на некоторый объект в памяти, расположенный обычно в динамической памяти — "куче". Объект, на который указывает ссылка, может быть разделяемым. Это означает, что несколько ссылочных переменных могут указывать на один и тот же объект и разделять его значения.

К значимым типам относятся: логический, арифметический, структуры, перечисление. Массивы, строки и классы относятся к ссылочным типам.

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



• Цель и источник значимого типа. В этом случае источник и цель имеют собственную память для хранения значений. Значения источника заменяют значения соответствующих полей цели. Источник и цель после этого продолжают жить независимо. У них своя память, хранящая после присваивания одинаковые значения.

• Цель и источник ссылочного типа. В этом случае значениями источника и цели являются ссылки на объекты, хранящиеся в памяти ("куче"). При ссылочном присваивании цель разрывает связь с тем объектом, на который она ссылалась до присваивания, и становится ссылкой на объект, связанный с источником. Результат ссылочного присваивания двоякий. Объект, на который ссылалась цель, теряет одну из своих ссылок и может стать висячим, так что его дальнейшую судьбу определит сборщик мусора. С объектом в памяти, на который ссылался источник, теперь связываются, по меньшей мере, две ссылки, рассматриваемые как различные имена одного объекта. Ссылочное присваивание приводит к созданию псевдонимов — к появлению разных имен у одного объекта. Особо следует учитывать ситуацию, когда цель и/или источник имеет значение void. Если такое значение имеет источник, то в результате присваивания цель получает это значение и более не ссылается ни на какой объект. Если же цель имела значение void, а источник - нет, то в результате присваивания ранее "висячая" цель становится ссылкой на объект, связанный с источником.

• Цель ссылочного типа, источник значимого типа. В этом случае "на лету" значимый тип преобразуется в ссылочный. Двойственность существования значимого и ссылочного типа — переменной и объекта обеспечивается за счет специальных, эффективно реализованных операций, преобразующих переменную значимого типа в объект и обратно. Операция "упаковать" (boxing) выполняется автоматически и неявно в тот момент, когда по контексту требуется объект, а не переменная. При ее выполнении создается настоящий объект, хранящий значение переменной. Можно считать, что происходит упаковка переменной в объект.

• Цель значимого типа, источник ссылочного типа. В этом случае ссылочный тип преобразуется в значимый. Операция "распаковать" (unboxing) выполняет обратную операцию, — она "сдирает" объектную упаковку и извлекает хранимое значение.

Операции "упаковать" и "распаковать" (boxing и unboxing).

Все С#-типы, включая типы значений, выведены из класса object. Следовательно, ссылку типа object можно использовать в качестве ссылки на любой другой тип, включая типы значений. Если ссылку типа object заставляют указывать на значение нессылочного типа, этот процесс называют приведением к объектному типу (boxing). В результате этого процесса значение нессылочного типа должно храниться подобно объекту, или экземпляру класса. Другими словами, "необъектное" значение помещается в объектную оболочку. В любом случае приведение к объектному типу происходит автоматически. Для этого достаточно присвоить значение ссылке на объект класса object. Все остальное доделает С#.

Восстановление значения из "объектного образа" (unboxing) — это по сути процесс извлечения значения из объекта. Это действие выполняется с помощью операции приведения типа, т.е. приведения ссылки на объект класса object к значению желаемого типа. Пример:

int x =10; object obj; obj = x; // "Превращаем" х в объект.

int у = (int)obj; // Обратное "превращение" объекта obj в int-значение.

 

9. Концепция типа данных. Переменные и константы и их реализация в С#.

Переменная — это экземпляр типа. Скалярную переменную можно рассматривать как сущность, обладающую именем, значением и типом. Имя и тип задаются при объявлении переменной и остаются неизменными на все время ее жизни. Значение переменной может меняться в ходе вычислений. Получение начального значения переменной называется ее инициализацией. Попытка использовать неинициализированную переменную приводит к ошибкам, обнаруживаемым еще на этапе компиляции. Объявление переменных:

int x, s; //без инициализации x=10; s=20; //отложенная инициализация

int y =0, u = 77; //обычный способ инициализации

int z= new int(); //допустимая инициализация в объектном стиле

Любой блок определяет область объявления, или область видимости (scope) объектов. Блок начинается открывающей, а завершается закрывающей фигурными скобками. Таким образом, при создании блока создается и новая область видимости, которая определяет, какие объекты видимы для других частей программы. Область видимости также определяет время существования этих объектов. Самыми важными в С# являются области видимости, которые определены классом и методом. Область видимости, определяемая методом, начинается с открывающей фигурной скобки. Но если метод имеет параметры, они также относятся к области видимости метода.

Как правило, переменные, объявленные в некоторой области видимости, невидимы (т.е. недоступны) для кода, который определяется вне этой области видимости. Таким образом, при объявлении переменной внутри области видимости вы локализируете ее и защищаете от неправомочного доступа и/или модификации. Эти правила области видимости обеспечивают основу для инкапсуляции.

int x; // Переменная х известна всему коду в пределах метода Main().

х = 10; if(х = = 10) { // Начало новой области видимости,

int у = 20; // Переменная у известна только этому блоку.

// Здесь известны обе переменные х и у. }

// у = 100; // Переменная у здесь неизвестна. // Переменная х здесь известна.

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

КонстантыC# могут появляться, как обычно, в виде литералов и именованных констант. Вот пример константы, заданной литералом и стоящей в правой части оператора присваивания: y = 7.7f; // константа типа float

Значение константы "7.7f" является одновременно ее именем, оно же позволяет однозначно определить тип константы. Заметьте, иногда, как в данном случае, приходится добавлять к значению специальные символы для точного указания типа. Синтаксис объявления: добавляется модификатор const, инициализация констант обязательна и не может быть отложена.

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

const int SmallSize = 38, LargeSize =58; const int MidSize = (SmallSize + LargeSize)/2;

const double pi = 3.141593;

10. Принцип модульности программ. Глобальные и локальные имена. Область видимости имен. Выбор области видимости.

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

Переменные, которые объявляться на уровне модуля, называются глобальными. Их область действия распространяется, по крайней мере, на весь модуль. В языке C# роль модуля играют классы, пространства имен, проекты, решения. Поля классов могут рассматриваться как глобальные переменные класса. В других видах модуля - пространствах имен, проектах, решениях - нельзя объявлять переменные. В пространствах имен в языке C# разрешено только объявление классов и их частных случаев: структур, интерфейсов, делегатов, перечислений. Поэтому глобальных переменных уровня модуля, в привычном для других языков программирования смысле, в языке C# нет. Классы не могут обмениваться информацией, используя глобальные переменные. Все взаимодействие между ними обеспечивается способами, стандартными для объектного подхода. Между классами могут существовать два типа отношений — клиентские и наследования, а основной способ инициации вычислений — это вызов метода для объекта-цели или вызов обработчика события. Поля класса и аргументы метода позволяют передавать и получать нужную информацию. Устранение глобальных переменных как источника опасных, трудно находимых ошибок существенно повышает надежность создаваемых на языке C# программных продуктов.

Переменные, объявленные на уровне процедуры, называются локальными, — они локализованы в процедуре. На самом деле, ситуация с процедурным блоком в C# не так проста. Процедурный блок имеет сложную структуру; в него могут быть вложены другие блоки, связанные с операторами выбора, цикла и так далее. В каждом таком блоке, в свою очередь, допустимы вложения блоков. В каждом внутреннем блоке допустимы объявления переменных. Переменные, объявленные во внутренних блоках, локализованы именно в этих блоках, их область видимости и время жизни определяются этими блоками. Локальные переменные начинают существовать при достижении вычислений в блоке точки объявления и перестают существовать, когда процесс вычисления завершает выполнение операторов блока.

 

11. Принцип модульности программ. Метод, как отдельный модуль программы. Интерфейсная и скрытая часть метода. Формальные и фактические параметры метода. Примеры применения.

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

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

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

Функция отличается от процедуры двумя особенностями:

• всегда вычисляет некоторое значение, возвращаемое в качестве результата функции;

• вызывается в выражениях.

Процедура C# имеет свои особенности:

• возвращает формальный результат void, указывающий на отсутствие результата;

• вызов процедуры является оператором языка;

• имеет входные и выходные аргументы, причем выходных аргументов может быть достаточно много.

Синтаксически в описании метода различают две части - описание заголовка и описание тела метода: заголовок_метода тело_метода

Рассмотрим синтаксис заголовка метода:

[атрибуты][модификаторы]{void| тип_результата_функции}

имя_метода([список_формальных_аргументов])

void A() {...}; int B(){...); public void C(){...};

Методы A и B являются закрытыми, а метод С - открыт. Методы A и С реализованы процедурами, а метод B - функцией, возвращающей целое значение.

Список формальных аргументов метода может быть пустым, и это довольно типичная ситуация для методов класса. Список может содержать фиксированное число аргументов, разделяемых символом запятой. [ref|out|params]тип_аргумента имя_аргумента

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

Содержательно, все аргументы метода разделяются на три группы: входные (только читаются), выходные и обновляемые (их значения используются в ходе вычислений и обновляются в результате работы метода). Выходные аргументы всегда должны сопровождаться ключевым словом out, обновляемые - ref.

Между списком формальных и списком фактических аргументов должно выполняться определенное соответствие по числу, порядку следования, типу и статусу аргументов. Если в первом списке n формальных аргументов, то фактических аргументов должно быть не меньше n (соответствие по числу). Каждому i-му формальному аргументу (для всех i от 1 до n-1) ставится в соответствие i-й фактический аргумент. Последнему формальному аргументу, при условии, что он объявлен с ключевым словом params, ставятся в соответствие все оставшиеся фактические аргументы (соответствие по порядку). Если формальный аргумент объявлен с ключевым словом ref или out, то фактический аргумент должен сопровождаться таким же ключевым словом в точке вызова (соответствие по статусу).

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

Если формальный аргумент является выходным - объявлен с ключевым словом ref или out, - то соответствующий фактический аргумент не может быть выражением, поскольку используется в левой части оператора присваивания; следовательно, он должен быть именем, которому можно присвоить значение.

 

Унарные и мультипликативные операции. Примеры применений.

Унарные: + - ! (логическое отрицание) ~ (поразрядное отрицание, инвертирует каждый разряд в двоичном представлении операнда типа int, uint, long, ulong) ++х --х (тип)х (преобразование типов).

Мультипликативные (умножения): * / % (остаток от деления)



<== предыдущая лекция | следующая лекция ==>
Public struct Book | Синтаксис объявления унарной операции: тип operator операция (параметр).


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.09 сек.