Ce diaporama a bien été signalé.
Le téléchargement de votre SlideShare est en cours. ×

C# Desktop. Занятие 01.

Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Chargement dans…3
×

Consultez-les par la suite

1 sur 44 Publicité

Plus De Contenu Connexe

Les utilisateurs ont également aimé (20)

Publicité

Similaire à C# Desktop. Занятие 01. (20)

Plus par Igor Shkulipa (20)

Publicité

Plus récents (20)

C# Desktop. Занятие 01.

  1. 1. Темы лекции: Введение. Обзор C#. Практическое задание: Базовые понятия языка C# Тренер: Игорь Шкулипа, к.т.н. Платформа .Net и язык программирования C#. Занятие 1
  2. 2. http://www.slideshare.net/IgorShkulipa 2 Курс «Платформа .Net и язык программирования C#» Курс состоит из трех основных модулей: 1. Базовые понятия ООП и языка программирования С# • Обзор C# • ООП на C# • Перегрузка операций и обработка исключений • Стандартный ввод-вывод • Обобщения • Строки, массивы, коллекции • Делегаты, события, анонимные методы, лямбда-выражения 2. Организация взаимодействия с базами данных и приложениями • Windows Forms • XML • Windows Presentation Foundation • ADO.Net • COM Interop • LINQ 3. Дополнительные темы • Динамические типы • Многопоточность в C# • Модульное тестирование ПО (unit testing) • Паттерны проектирования
  3. 3. http://www.slideshare.net/IgorShkulipa 3 Время и оценка результатов курса Курс состоит из 25 занятий, общей длительностью 100 часов аудиторной работы. Оценка теоретической части: 1. Два промежуточных теста (максимальная оценка - 100 баллов) 2. Результирующий тест (максимальная оценка - 100 баллов) Оценка практической части: 1. Групповой проект (максимальная оценка – 100 баллов) 2. 15 лабораторных работ (максимальная средняя оценка - 100 баллов) Курсовой проект: 1. На протяжении курса студенты выполняют курсовой проект по индивидуальной теме (максимальная оценка - 100 баллов)
  4. 4. http://www.slideshare.net/IgorShkulipa 4 Результирующий рейтинг >= 70% < 70% • TP – средняя оценка за промежуточные тесты (макс. 100) • TR – оценка за результирующий тест (макс. 100) • LR – средняя оценка за выполнение лабораторных работ (макс. 100) • GP – средняя оценка за групповой проект (макс. 100) • CP – оценка за курсовой проект (макс. 100) Результат курса = 0.15*TP + 0.15*TR + 0.2*LR +0.2*GP+ 0.3*CP
  5. 5. http://www.slideshare.net/IgorShkulipa 5 Литература 1. Джеффри Рихтер / CLR via C#. Программирование на платформе Microsoft .NET Framework 4.0 на языке C#: Питер, 2011, 928 с. 1. Троелсен Эндрю / Язык программирования C# 5.0 и платформа .NET 4.5, 6-е изд.: Пер. с англ.: Изд. дом «Вильямс», 2013. - 1312 c. 1. Трей Неш / C# 2010: ускоренный курс для профессионалов: Пер. с англ.: Изд. дом «Вильямс», 2010. - 592 c. 1. http://msdn.microsoft.com/library/vstudio/ 1. Руководство Microsoft по проектированию архитектуры приложений. 2-е издание.
  6. 6. http://www.slideshare.net/IgorShkulipa 6 Объектно-ориентированное программирование ООП – это парадигма программирования, основанная на представлении предметной области в виде взаимосвязанных абстрактных объектов и их реализаций. В ООП вводится понятие Класса – пользовательского типа данных, объединяющего данные и методы их обработки. Объектом называется экземпляр класса. Автомобиль– это класс (тип данных) Автомобиль Bentley Continental GT черного цвета – это объект, или экземпляр класса «Автомобиль»
  7. 7. http://www.slideshare.net/IgorShkulipa 7 Объекты Объекты характеризуются понятиями состояния, поведения и идентичности. Состояние объекта характеризуется перечнем всех свойств данного объекта и текущими значениями каждого из этих свойств. Поведение - это то, как объект действует и реагирует; поведение выражается в терминах состояния объекта и передачи сообщений. Поведение объекта - это его наблюдаемая и проверяемая извне деятельность. Поведение объекта строится из его операций (определенное воздействие одного объекта на другой ). Существует три вида операций • Модификатор - операция, которая изменяет состояние объекта • Селектор - операция, считывающая состояние объекта, но не меняющая состояния • Итератор - операция, позволяющая организовать доступ ко всем частям объекта в строго определенной последовательности Идентичность - это такое свойство объекта или такой набор свойств, который отличает его от всех других объектов.
  8. 8. http://www.slideshare.net/IgorShkulipa 8 Члены и методы класса Члены-данные (поля) (data members) хранят всю необходимую информацию об объекте, формируют его состояние, характеристики и т.п. Изменение состояния объекта или его характеристик связано с изменением данных, которые в нем содержатся. Метод объекта (methods) – программный код, выполненный в виде функции, реагирующий на передачу объекту определенного сообщения. Вызов метода объекта может приводить к изменению его состояния (значение членов-данных), а может и не приводить Класс может содержать один или более методов, позволяющих осуществлять манипуляцию данными объекта
  9. 9. http://www.slideshare.net/IgorShkulipa 9 Свойства Свойство – составляющая часть объекта, доступ к которой осуществляется как к члену объекта, но таковым не является (реализуют принцип инкапсуляции для членов объекта). В некоторых объектно-ориентированных языках программирования (например, в C++) свойства, как элемент языка, отсутствуют. В этом случае в класс добавляют методы, посредством которых осуществляется доступ к необходимым переменным класса.
  10. 10. http://www.slideshare.net/IgorShkulipa 10 Абстракция данных Объекты представляют неполную информацию о реальных сущностях предметной области. Абстракция позволяет оперировать с объектном на уровне, адекватном решаемой задаче. Высокоуровневые обращения к объекту могут обрабатываться с помощью вызова функций и методов низкого уровня. В основе реализации этого принципа лежит использование абстрактных классов интерфейсов.
  11. 11. http://www.slideshare.net/IgorShkulipa 11 Инкапсуляция Инкапсуляция – объединение в одной оболочке данных и методов их обработки, а так же способность объекта скрывать внутреннее устройство своих полей и методов. Согласно данному принципу, класс должен рассматриваться как черный ящик. Внешний пользователь не знает детали реализации объекта и работает с ним только путем предоставленного объектом интерфейса (или открытых методов доступа). Следование данному принципу может уменьшить число связей между классами и упростить их независимую реализацию, модификацию и тестирование.
  12. 12. http://www.slideshare.net/IgorShkulipa 12 Композиция классов Композиция (а так же ассоциация и агрегирование) – механизм для создания нового класса путем объединения нескольких объектов существующих классов в единое целое. При агрегировании между классами действует «отношение принадлежности» • У машины есть кузов, колеса и двигатель • У человека есть голова, руки, ноги и тело • У треугольника есть вершины Вложенные объекты обычно объявляются закрытыми (private) внутри класса-агрегата
  13. 13. http://www.slideshare.net/IgorShkulipa 13 Наследование Наследование – это механизм ООП, позволяющий описать новый класс на основе уже существующего. При наследовании свойства и функциональность родительского класса наследуются новым классом. Класс-наследник имеет доступ к публичным (public) и защищенным (protected) методам и полям класса родительского класса. Класс-наследник может добавлять свои данные и методы, а также переопределять методы базового класса
  14. 14. http://www.slideshare.net/IgorShkulipa 14 Основные термины Родительский или базовый класс (класс-родитель) – класс, выступающий в качестве основы при наследовании. Класс-потомок (дочерний класс, класс-наследник) – класс, образованный в результате наследования от родительского класса. Иерархия наследования – отношения между родительским классом и его потомками. Интерфейс класса – совокупность публичных методов класса, доступная для использования вне класса. В интерфейсной части данные обычно не размещают. Реализация класса – совокупность приватных методов и данных класса
  15. 15. http://www.slideshare.net/IgorShkulipa 15 Виды наследования По типу наследования: • Открытое (public) наследование • Закрытое (private) наследование • Защищенное (protected) наследование По количеству базовых классов: • Одиночное наследование (один базовый класс) • Множественное наследование (два и более базовых классов)
  16. 16. http://www.slideshare.net/IgorShkulipa 16 Полиморфизм Полиморфизм - это свойство, которое позволяет одно и то же имя использовать для решения нескольких схожих, но технически разных задач. Целью полиморфизма является использование одного имени для задания общих для класса действий. Использование полиморфизма достигается при присвоении указателю на базовый класс адреса производного класса с переопределенными методами. Типы-наследники неявно приводимы к базовому классу.
  17. 17. http://www.slideshare.net/IgorShkulipa 17 Microsoft .NET Framework Платформа .NET Framework является надстройкой над операционной системой, в качестве которой может выступать любая версия Windows. На сегодняшний день платформа .NET Framework включает в себя: 1. Компиляторы четырех официальных языков: С#, VB.NET, Managed C++ (управляемый C++) и JScript .NET 2. Объектно-ориентированную среду CLR (Common Language Runtime), совместно используемую этими языками для создания приложений под Windows и для Internet 3. Ряд связанных между собой библиотек классов под общим именем FCL (Framework Class Library)
  18. 18. http://www.slideshare.net/IgorShkulipa 18 Архитектура Microsoft .NET Framework
  19. 19. http://www.slideshare.net/IgorShkulipa 19 C# и CLR Самым важным компонентом платформы .NET Framework является CLR (Common Language Runtime), предоставляющая среду, в которой выполняются программы. Главная ее роль заключается в том, чтобы обнаруживать и загружать типы .NET и производить управление ими в соответствии с полученными командами. CLR включает в себя виртуальную машину, во многих отношениях аналогичную виртуальной машине Java. На верхнем уровне среда активизирует объекты, производит проверку безопасности, размещает объекты в памяти, выполняет их, а также запускает сборщик мусора. Код на языке C# компилируется в, так называемый CIL ( Common Intermediate Language) - стандартизированный промежуточный язык, чем-то похожий на объектно-ориентированный ассемблер. Код на CIL выполняется виртуальной машиной CLR, а результат в виде шестнадцатеричных команд отправляется на выполнение операционной системой.
  20. 20. http://www.slideshare.net/IgorShkulipa 20 JIT-компилятор Среда CLR – это не интерпретатор, как может показаться на первый взгляд. В действительности, CLR компилирует код IL в машинный код, прежде чем выполнить его, то есть осуществляет JIT (Just in Time) компиляцию. Этот процесс может показаться неэффективным, но, на самом деле, это обозначает лишь одноразовое понижение производительности для каждого участка программы. Как только код один раз скомпилирован, CLR сохраняет его и выполняет каждый раз, когда это необходимо. Код, выполняемый CLR называется управляемым кодом (managed code)
  21. 21. http://www.slideshare.net/IgorShkulipa 21 Преимущества управляемого кода • Управляемые приложения могут потреблять меньше памяти. IL-код занимает меньше места в памяти, чем «родной» код, то есть количество памяти у управляемых приложений, обычно, меньше, чем у «родных». • JIT-компиляции подвергается только тот код, который выполняется. IL-код более компактен, чем машинный, по этому сокращение компилируемого кода до минимума сокращает объем памяти приложения. • Код более оптимизирован. Код после JIT-компиляции оптимизируется непосредственно для платформы, на которой он выполняется. • Среда CLR отслеживает частоту вызовов. Если CLR видит, что некоторый код долгое время не вызывался, то она может освободить память, занимаемую им. При следующем обращении, этот код будет перекомпилирован. • Автоматическая сборка мусора. Нет необходимости в ручном управлении памятью и освобождении занятых ресурсов.
  22. 22. http://www.slideshare.net/IgorShkulipa 22 Сборки Сборка (assmebly) – это дискретная единица многократно используемого кода внутри CLR. Сборки похожи на обычные DLL библиотеки или исполняемые EXE файлы. Сборка может состоять из многих модулей, которые объединяет вместе манифест, описывающий содержимое сборки. Сборки могут иметь версии, что позволяет идентифицировать одноименные сборки с разными версиями. Сборки содержат метаданные, описывающие содержащиеся в них типы. Загрузчик сборок с помощью конфигурационных файлов системы, определяет, какую версию сборки необходимо загрузить в данный момент.
  23. 23. http://www.slideshare.net/IgorShkulipa 23 Назначение сборкам имен • Строгое именование. Такая сборка имеет имя, состоящее из четырех частей: краткое имя сборки, номер версии, идентификатор культуры и хеш-маркер. • Частичное именование. Сборка имеет имя, в котором опущены некоторые части строгого имени. GAC (Global Assembly Cache) – некоторое подобие реестра сборок. Регистрация сборки в GAC подобна регистрации приложения в системном реестре. Если сборка зарегистрирована со строгим именованием, то она может быть использована всеми приложениями системы. Сборки с частичным именованием могут использоваться только локальными приложениями, то есть сама сборка должна находиться где-нибудь в каталоге приложения или в подкаталогах.
  24. 24. http://www.slideshare.net/IgorShkulipa 24 Метаданные Метаданные – это расширяемый формат описания содержимого сборок. Можно определять собственные специальные атрибуты, которые легко включаются в метаданные типа. Почти любая сущность программы может иметь присоединенные к ней метаданные, включая классы, методы, параметры, возвращаемые значения и т.д. С помощью метаданных можно исследовать определения типов и присоединенные к ним атрибуты. Метаданные могут сообщить о том, поддерживает некоторый класс определенный метод, прежде чем пытаться взывать его, или порожден ли этот класс от какого-либо другого класса. Процесс просмотра метаданных называется рефлексией. Для этого служат оператор typeof (работает во время компиляции) или метод GetType() (работает во время выполнения), которые возвращают объект типа System.Type.
  25. 25. http://www.slideshare.net/IgorShkulipa 25 Сборщик мусора Сборка мусора представляет собой непрерывный процесс слежения за состоянием памяти. Однако, активную фазу принимает в основном в момент острого недостатка памяти для продолжения работы приложения. Сборщик мусора всегда запускается в отдельном потоке и в момент его активной работы, все остальные потоки приложения приостанавливаются. Сборщик мусора не проходит по всем находящимся в памяти объектам и не изучает их. Вместо этого CLR выполняет проход по определенной группе объектов. В .NET эти группы называются поколениями: • Поколение 0. Новый созданный объект, который еще никогда не помечался как кандидат на удаление; • Поколение 1. Объект, который уже однажды пережил сборку мусора. Сюда обычно попадают объекты, которые были помечены для удаления, но все-таки не удалены из-за того, что места в памяти (куче) было достаточно; • Поколение 2. Объекты, которые пережили более одной очистки памяти сборщиком мусора. Очевидно, что чем выше поколение объекта, то тем дольше он находится в памяти. Более того, вероятность дальнейшего его существования в куче больше, чем у объекта более низкого поколения.
  26. 26. http://www.slideshare.net/IgorShkulipa 26 Язык C# Язык C# был разработан, как основной язык программирования для платформы Microsoft .NET Framework. Разработан в 1998—2001 годах группой инженеров под руководством Андерса Хейлсберга в компании Microsoft. Синтаксис C# основан на языках C++ и Java – в то время, доминирующих языках в разработке программного обеспечения. C# - строго типизированный язык, то есть каждая переменная и экземпляр класса относятся к четко определенному типу.
  27. 27. http://www.slideshare.net/IgorShkulipa 27 Базовые типы данных СТS Тип Имя псевдонима в С# Описание System.Object object Класс , базовый для всех типов (CTS) System.String string Строка System.SByte sbyte 8 -разрядный байт (со знаком) System.Byte byte 8 -разрядный байт (без знака) System.Int16 short 16-разрядное число (со знаком) System.UInt16 ushort 16-разрядное число (без знака) System.Int32 int 32-разрядное число (со знаком) System.UInt32 uint 32-разрядное число (без знака) System.Int64 long 64-разрядное число (со знаком) System.UInt64 ulong 64-разрядное число (без знака) System.Char char 16-разрядный символ (Unicode) System.Single float 32-разрядное число с плавающей точкой, (стандарт IEEE) System.Double double 64-разрядное число с плавающей точкой, (стандарт IEEE) System.Boolean bool Булевское значение (true/false) System.Decimal decimal Данный 128 разрядный тип используется в основном, когда требуется крайне высокая точность (до 28 знака) Встроенные числовые типы являются структурами, и к их свойствам и методам можно получить доступ.
  28. 28. http://www.slideshare.net/IgorShkulipa 28 Выражения
  29. 29. http://www.slideshare.net/IgorShkulipa 29 Выражения
  30. 30. http://www.slideshare.net/IgorShkulipa 30 Типы CLR • Типы значений (value types). Определяются с помощью ключевого слова struct. Экземпляры типов значений – это единственные экземпляры, которые могут располагаться в стеке приложения. В управляемой куче они могут располагаться, если они являются членами ссылочных типов. Во многом аналогичны структурам С++. • Ссылочные типы (reference types). Определяются с помощью ключевого слова class, в стеке приложения находится ссылка на экземпляр. Сами экземпляры располагаются в управляемой куче.
  31. 31. http://www.slideshare.net/IgorShkulipa 31 Типы значений Типы значений являются производными от System.ValueType, являющегося производным от System.Object. Типы, производные от System.ValueType, имеют особое поведение в среде CLR. Переменные типа значения напрямую содержат их значения, что означает, что память встроена в контекст, в котором объявлена переменная. Не существует отдельного размещения кучи или служебных данных сборки мусора для переменных типа значения. Существует две категории типов значений: структура и перечисление. Типы значений являются запечатанными, что означает, например, что нельзя произвести тип от System.Int32, и нельзя определить структуру для наследования от любого пользовательского класса или структуры, поскольку структура может наследовать только от System.ValueType. Однако структура может реализовать один или несколько интерфейсов. Можно выполнить приведение типа структуры в тип интерфейса; это приведет к операции упаковки-преобразования для создания программы-оболочки структуры внутри объекта ссылочного типа в управляемой куче.
  32. 32. http://www.slideshare.net/IgorShkulipa 32 Структуры Ключевое слово struct используется для создания собственных пользовательских типов значений. Обычно структура используется как контейнер для небольшого набора связанных переменных public struct Coords { public int x, y; public Coords(int p1, int p2) { x = p1; y = p2; } }
  33. 33. http://www.slideshare.net/IgorShkulipa 33 Перечисления Другой категорией типов значений является перечисление. Перечисление определяет набор именованных интегральных констант. По умолчанию базовым типом каждого элемента перечисления является int. Можно задать другой целочисленный тип, используя двоеточие. public enum FileMode { CreateNew = 1, Create = 2, Open = 3, OpenOrCreate = 4, Truncate = 5, Append = 6 } enum Days { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday }; enum Months : byte { Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec };
  34. 34. http://www.slideshare.net/IgorShkulipa 34 Ссылочные типы Часто определяются с помощью ключевого слова class. Фактически переменные ссылочных типов подобны переменным типов значений, которые имеют тип и содержат указатель на объект в куче. Все ссылочные типы неявно наследуются от System.Object (object). По соглашению термином «объект» обозначается экземпляр ссылочного типа, а термином «значение» - типа значений. Переменные ссылочного типа инициализируются либо с помощью операции new, либо присваиванием переменной значения совместимого типа. object o1= new object(); object o2= o1; CLR управляет всеми ссылками на объекты в куче, в том числе выполняет сборку мусора, так что нет необходимости в ручном освобождении памяти.
  35. 35. http://www.slideshare.net/IgorShkulipa 35 Инициализация переменных по умолчанию Когда создается объект, система инициализирует его поля, значениями по умолчанию: 1. Поля, относящиеся к типам значений, инициализируются установкой всех битов в 0. 1. Значением по умолчанию для ссылок на объекты является null. 1. Поля логического типа инициализируются значением false.
  36. 36. http://www.slideshare.net/IgorShkulipa 36 Неявно типизированные переменные Объявляя локальную переменную с помощью ключевого слова var, вы просите компилятор зарезервировать некоторый участок памяти для хранения этой переменной. На этапе компиляции у компилятора достаточно информации о типе будущего экземпляра, так как его тип указан явно. var MyList = new List<int>(); MyList.Add(1); MyList.Add(2); MyList.Add(3); foreach(var i in MyList) { Console.WriteLine(i); } (!) Замечание: Неявно типизированные переменные должны быть проинициализированы. var WrongValue; // выдаст ошибку компиляции
  37. 37. http://www.slideshare.net/IgorShkulipa 37 Преобразование типов 1. Присвоение "большему типу" значения "меньшего типа". Безопасное присвоение, гарантирует сохранение значения. int IntValue = 12345678; long LongValue = 1234567890; LongValue=IntValue; 2. Присвоение "меньшему типу" значения "большего типа“ должно быть явным. Потенциально опасное присвоение, грозит потерей информации. int IntValue = 12345678; long LongValue = 1234567890; IntValue = (int) LongValue; 3. Ссылка на DerivedType может быть неявно преобразована к BaseType, если DerivedType унаследован от BaseType. BaseType DT = new DerivedType(); 4. Ссылка на BaseType должна преобразовываться к DerivedType явно. Но такое явно преобразование может сгенерировать InvalidCastException во время выполнения программы, если CLR не сможет выполнить такое преобразование. BaseType BT = new BaseType(); DerivedType DT = new DerivedType(); DT = (DerivedType)BT; // Небезопасно!!!
  38. 38. http://www.slideshare.net/IgorShkulipa 38 Операции as и is Операция is возвращает булевское значение, говорящее о том, можно ли преобразовать данное выражение в указанный тип: long LValue=123; bool IsInt= LValue is int; DerivedClass DC=new DerivedClass(); bool IsBase=DC is BaseClass; Операция as подобна is, но она возвращает ссылку на уже преобразованный объект указанного типа, либо null, если такое преобразование невозможно. BaseClass BC=DC as BaseClass;
  39. 39. http://www.slideshare.net/IgorShkulipa 39 Пространства имен Пространства имен (namespace) предоставляют программистам возможность логичной взаимосвязи классов и других типов. Само понятие namespace скорее является логическим, нежели физическим. namespace NameSpace { public struct Name { // Код структуры ... } } Для использования имен из пространства имен существует директива using. using NameSpace; using System; using System.Collections; using Microsoft.Office.Interop.Excel; Еще одним применением ключевого слова using в C# является назначение псевдонимов классам и пространствам имен: using alias = NameSpace; using alias = System.Collections; ... alias.ArrayList AL = new alias.ArrayList();
  40. 40. http://www.slideshare.net/IgorShkulipa 40 Операторы Синтаксис операторов C# аналогичен синтаксису операторов С++. if-else, while, do-while, for, switch В операторе switch, обязательно должен присутствовать оператор break или другая передача управления. break, continue, goto, return, throw Оператор foreach используется для итерации по коллекции или массиву объектов. string[] strings=new string[5]; ... foreach (string item in strings) { Console.WriteLine(item); }
  41. 41. http://www.slideshare.net/IgorShkulipa 41 Нововведения версий C# C# 2.0 • Поддержка обобщений • Поддержка анонимных методов • Поддержка итераторов • Поддержка частичных типов (partial) C# 3.0 • LINQ • Автореализуемые свойства (get, set) • Расширяющие методы C# 4.0 • Динамические типы (dynamic) • Облегчение взаимодействия с COM • Ключевые слова in и out C# 5.0 • Поддержка выполнения асинхронных функций с помощью двух новых ключевых слов – async и await
  42. 42. http://www.slideshare.net/IgorShkulipa 42 Создание нового проекта
  43. 43. http://www.slideshare.net/IgorShkulipa 43 Hello, World!!! // Используемые пространства имен using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; // Пространство имен приложения namespace HelloWorld { // Основной класс программы class Program { // Статичный метод – точка входа в приложение static void Main(string[] args) { // Вывод в консоль "Hello, World!!!" Console.WriteLine("Hello, World!!!"); // Ожидание нажатия клавиши Console.ReadKey(); } } }
  44. 44. http://www.slideshare.net/IgorShkulipa 44 Лабораторная работа №1. Базовые понятия языка C# Создать консольное приложение на языке C#, которое реализует следующие задания: 1. Вычислить an, а – действительное число. При этом, не пользуясь никакими другими арифметическими операциями, кроме умножения. 2. В числе х, содержащем более двух, знаков зачеркнули его вторую цифру. Когда к образованному при этом числу справа приписали вторую цифру числа х, то получилось число n. По заданному n найти число х (значение n вводится с клавиатуры, n >= 100 ).

×