Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПЯВУ.doc
Скачиваний:
0
Добавлен:
19.09.2019
Размер:
250.88 Кб
Скачать

1. Охарактеризовать основные этапы решения задач на ЭВМ

В процессе разработки программ с использованием структурного подхода можно выделять следующие этапы: 1.постановка задачи – определение требований к программному продукту; 2. анализ – осуществление формальной постановки задачи и определение методов ее решения;3. проектирование – разработка структуры программного продукта, выбор структур для хранения данных, построение и оценка алгоритмов подпрограмм и определение особенностей взаимодействия программы с вычислительной средой (другими программами, операционной системой и техническими средствами); 4. реализация – составление программы на выбранном языке программирования, ее тестирование и отладка. 5.модификация – выпуск новых версий программного продукта.

  1. Привести общую характеристику процесса обеспечения качества программного средства.

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

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

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

  • нет никакой необходимости и, может быть, даже вредно добиваться более высокого уровня присутствия в ПС какого-либо примитива качества, чем тот, который определен в спецификации качества ПС.

  1. Охарактеризовать составляющие процесса обеспечения легкости применения программного средства

Легкость применения, в значительной степени, определяется составом и качеством пользовательской документации, а также некоторыми свойствами, реализуемыми программным путем.

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

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

4. Охарактеризовать составляющие процесса обеспечение эффективности программного средства.

Эффективность ПС обеспечивается принятием подходящих решений на разных этапах его разработки, начиная с разработки его архитектуры. Особенно сильно на эффективность ПС (особенно по памяти) влияет выбор структуры и представления данных. Но и выбор алгоритмов, используемых в тех или иных программных модулях, а также особенности их реализации (включая выбор языка программирования) может существенно повлиять на эффективность ПС. При этом постоянно приходится разрешать противоречие между временнόй эффективностью и эффективностью по памяти (ресурсам). Поэтому весьма важно, чтобы в спецификации качества были явно указаны приоритеты или количественное соотношение между показателями этих примитивов качества. Следует также иметь в виду, что разные программные модули по-разному влияют на эффективность ПС в целом: одни модули могут сильно влиять на временнэю эффективность и практически не влиять на эффективность по памяти, а другие могутсущественно влиять на общий расход памяти, не оказывая заметного влияния на время работы ПС. Более того, это влияние (прежде всего, в отношении временнуй эффективности) заранее (до окончания реализации ПС) далеко не всегда можно правильно оценить.

С учетом сказанного, рекомендуется придерживаться следующих принципов для обеспечения эффективности ПС [12.3, 12.4]:

  • сначала нужно разработать надежное ПС, а потом уж заниматься доведением его эффективности до требуемого уровня в соответствии с его спецификацией качества;

  • для повышения эффективности ПС, прежде всего, нужно использовать оптимизирующий компилятор - это может обеспечить требуемую эффективность;

  • если эффективность ПС не удовлетворяет спецификации его качества, то найдите самые критические модули с точки зрения требуемой эффективности ПС; эти модули и попытайтесь оптимизировать в первую очередь путем их ручной переделки;

  • не следует заниматься оптимизацией модуля, если этого не требуется для достижения требуемой эффективности ПС.

5. Охарактеризовать составляющие процесса обеспечение сопровождаемости программного средства

Обеспечение сопровождаемости ПС сводится к обеспечению изучаемости ПС и к обеспечению его модифицируемости.

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

При окончательном оформлении текста программного модуля целесообразно придерживаться следующих рекомендаций, определяющих практически оправданный стиль программирования [12.3, 12.4]:

  • используйте в тексте модуля комментарии, проясняющие и объясняющие особенности принимаемых решений; по-возможности, включайте комментарии (хотя бы в краткой форме) на самой ранней стадии разработки текста модуля;

  • используйте осмысленные (мнемонические) и устойчиво различимые имена (оптимальная длина имени - 4-12 литер, цифры - в конце), не используйте сходные имена и ключевые слова;

  • соблюдайте осторожность в использовании констант (уникальная константа должна иметь единственное вхождение в текст модуля: при ее объявлении или, в крайнем случае, при инициализации переменной в качестве константы);

  • не бойтесь использовать необязательные скобки - они обходятся дешевле, чем ошибки;

  • размещайте не больше одного оператора в строке; для прояснения структуры модуля используйте дополнительные пробелы (отступы) в начале каждой строки; этим обеспечивается удобочитаемость текста модуля;

  • избегайте трюков, т.е. таких приемов программирования, когда создаются фрагменты модуля, основной эффект которых не очевиден или скрыт (завуалирован), например, побочные эффекты функций.

6. Охарактеризовать составляющие процесса обеспечение мобильности.

Проблема мобильности возникает из-за того, что быстрое развитие компьютерной техники и аппаратных средств делает жизненный цикл многих больших программных средств (программных систем) намного продолжительнее периода “морально” оправданного существования компьютеров и аппаратуры, для которых первоначально создавались эти программные средства. Поэтому обеспечение критерия мобильности для таких ПС является весьма важной задачей.

Мобильность ПС определяется такими примитивами качества ПС как независимость от устройствавтономностьструктурированность и модульность.

Если бы ПС обладало такими примитивами качества, как независимость от устройств и автономность, и его программы были бы представлены на машинно-независимом языке программирования, то перенос ПС в другую среду обеспечивался бы перетрансляцией (перекомпиляцией) его программ в этой среде. Однако трудно представить реальное ПС, обладающее таким качеством. Тем не менее, таким качеством могут обладать отдельные части программ ПС и даже весьма значительные. А это уже явный намек на то, каким путем следует добиваться мобильности ПС.

Если ПС зависит от устройств (аппаратуры), то в спецификации качества должна быть описана эта компьютерно-аппаратная среда (будем ее называть аппаратной платформой [12.6]). Избавится от этой зависимости можно за счет такого примитива качества ПС как автономность. Как правило, ПС строится в рамках некоторой операционной системы (ОС), которая может спрятать специфику аппаратной платформы и, тем самым, сделать ПС независимым от устройств. Но тогда ПС не будет обладать свойством автономности. В этом случае в спецификации качества должна быть описана эта программная среда, над которой строится ПС (будем эту среду называтьоперационной платформой [12.6]). Таким образом, мобильность ПС будет непосредственно связано с мобильностью используемой ОС: перенос ПС на другую аппаратную платформу осуществляется автоматически, если будет осуществлен перенос на эту платформу используемой ОС. Но обеспечение мобильности ОС является самостоятельной и довольно трудной задачей.

Таким образом, для обеспечения мобильности ПС нужно решить две задачи:

  • выделение по возможности наибольшей части программ ПС, обладающей свойствами независимости от устройств и автономности (другими словами, независимой отаппаратно-операционной платформы);

  • обеспечение сопровождаемости для остальных частей программ ПС.

7. Дать понятие жизненного цикла (ЖЦ) программного обеспечения. Характеристика этапов ЖЦ

Программы любого вида характеризуются жизненным циклом, состоящим из отдельных этапов:

a) маркетинг рынка программных средств, спецификация требований к программному продукту;

b) проектирование структуры программного продукта;

c) программирование (создание программного кода), тестирование, автономная и комплексная отладка программ;

d) документирование программного продукта, подготовка эксплуатационной и технологической документации;

e) выход на рынок программных средств, распространение программного продукта;

f) эксплуатация программного продукта пользователями;

g) сопровождение программного продукта;

h) снятие программного продукта с продажи, отказ от сопровождения.

8. Описать стандарты жизненного цикла.

Стандарт ГОСТ 34.601-90 предусматривает следующие стадии и этапы создания автоматизированной системы:

  1. Формирование требований к АС

  2. Разработка концепции АС

  3. Техническое задание

  4. Эскизный проект

  5. Технический проект

  6. Рабочая документация

  7. Ввод в действие

  8. Сопровождение АС.

Стандарт ISO/IEC 12207:1995 «Information Technology — Software Life Cycle Processes» является основным нормативным документом, регламентирующим состав процессов жизненного цикла ПО. Он определяет структуру жизненного цикла, содержащую процессыдействия и задачи, которые должны быть выполнены во время создания ПО.

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

9. Модель зрелости возможностей CMM (Capability Maturity Model) [12,13] предлагает унифицированный подход к оценке возможностей организации выполнять задачи различного уровня. Для этого определяются 3 уровня элементов: уровни зрелости организации (maturity levels), ключевые области процесса (key process areas) и ключевые практики (key practices). Чаще всего под моделью CMM имеют в виду модель уровней зрелости. В настоящий момент CMM считается устаревающей и сменяется моделью CMMI (см. ниже).

10. Охарактеризовать модели жизненного цикла ПО

. Водопадная модель жизненного цикла (англ. waterfall model) была предложена в 1970 г. Уинстоном Ройсом. Она предусматривает последовательное выполнение всех этапов проекта в строго фиксированном порядке. Переход на следующий этап означает полное завершение работ на предыдущем этапе. Требования, определенные на стадии формирования требований, строго документируются в виде технического задания и фиксируются на все время разработки проекта. Каждая стадия завершается выпуском полного комплекта документации, достаточной для того, чтобы разработка могла быть продолжена другой командой разработчиков.

Альтернативой последовательной модели является так называемая модель итеративной и инкрементальной разработки (англ. iterative and incremental development, IID), получившей также от Т. Гилба в 70-е гг. название эволюционной модели. Также эту модель называют итеративной моделью и инкрементальной моделью[4].

Модель IID предполагает разбиение жизненного цикла проекта на последовательность итераций, каждая из которых напоминает «мини-проект», включая все процессы разработки в применении к созданию меньших фрагментов функциональности, по сравнению с проектом в целом. Цель каждой итерации — получение работающей версии программной системы, включающей функциональность, определённую интегрированным содержанием всех предыдущих и текущей итерации. Результат финальной итерации содержит всю требуемую функциональность продукта. Таким образом, с завершением каждой итерации продукт получает приращение — инкремент — к его возможностям, которые, следовательно, развиваются эволюционно. Итеративность, инкрементальность и эволюционность в данном случае есть выражение одного и то же смысла разными словами со слегка разных точек зрения[3].

Спиральная модель (англ. spiral model) была разработана в середине 1980-х годов Барри Боэмом. Она основана на классическом цикле Деминга PDCA (plan-do-check-act). При использовании этой модели ПО создается в несколько итераций (витков спирали) методом прототипирования.

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

11. Дать понятие алгоритма, описать свойства алгоритмов

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

Основными свойствами алгоритмов являются:1. Универсальность (массовость) - применимость алгоритма к различным наборам исходных данных.2. Дискретность - процесс решения задачи по алгоритму разбит на отдельные действия.3. Однозначность - правила и порядок выполнения действий алгоритма имеют единственное толкование.4. Конечность - каждое из действий и весь алгоритм в целом обязательно завершаются.5. Результативность - по завершении выполнения алгоритма обязательно получается конечный результат.6. Выполнимость - результата алгоритма достигается за конечное число шагов.

14. Описать структуру проекта Delphi.

. Файл проекта представляет собой программу, написанную на языке Object Pascal и предназначенную для обработки компилятором. Эта программа автоматически создается Delphi и содержит лишь несколько строк. Чтобы увидеть их, запустите Delphi и щелкните по опции Project | View Source главного меню [ В предыдущих версиях Delphi для просмотра кода проекта используйте опцию View | project Source. ]. Delphi покажет окно кода с закладкой Project1, содержащее такой текст: 

program Projecti; uses Forms, Unit1 in 'Unit1.pas' {fmExample}; {$R *.RES} begin Application.Initialize; Application.CreateForm(TfmExample, fmExample); Application.Run; end.

15. Dialogs – содержит стандартные диалоговые элементы Windows (окна открытия, сохранения файлов, окна выбора шрифта, принтера и т.п.)

16. Свойства компонента так же, как и свойства формы, можно изменить при помощи Object Inspector. Для того чтобы свойства требуемого компонента были выведены в окне Object Inspector, нужно выделить этот компонент (щелкнуть мышью на его изображении). 1. Enabled – определяет, активен ли компонент. 2. Height – высота. 3. Hint – всплывающая подсказка. 4. Left – положение компонента относительно левого края формы. 5. Name – имя компонента. 6. Top – отступ от верха формы. 7. Visible – определяет видимость компонента. 8. Width – ширина. 9. Caption – Отображаемый текст

17. Дать описание стандартных компонентов на странице STANDARD

18. На страницу Additional помещены дополнительные компоненты, без некоторых из которых сегодня трудно представить программу для Windows: кнопки с дополнительными свойствами, таблицы, компоненты для размещения изображений и многие другие, представленные в таблице:

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

22. COM

Технология создавалась фирмой Microsoft как средство взаимодействия приложений (в том числе составных частей операционной системы) Windows, функционирующих на одном компьютере, с последующим развитием для использования в пределах локальной сети. Главная задача на момент создания - обеспечение технологии Object Linking and Embedding (OLE 1.0). Характерно, что обмен данными между приложениями (Dynamic Data Exchange, DDE) первоначально строился не по COM-технологии, а с использованием механизма сообщений (messages). Развитие технологии идет по мере добавления новых возможностей. Как универсальная технология взаимодействия приложений COM начал использоваться с OLE 2.0 (1991). Концепция технологии неразрывно связана с ее реализацией. Появление новых возможностей - это просто появление новых библиотек, функций API и утилит Windows. "Общий знаменатель технологии" - двоичная структура объекта, хотя в настоящий момент существует язык описания структуры объекта - Interface definition Language (IDL).

CORBA

Технология создавалась консорциумом OMG как универсальная технология создания распределенных систем в гетерогенных средах. Первая спецификация CORBA появилась в 1991 г. Новые возможности официально считаются добавленными в CORBA в момент утверждения соответствующей спецификации. Как правило, в разработке спецификации участвуют крупнейшие специалисты в данной области. Разработка реализации - задача конкретной фирмы. Обычно от утверждения спецификации до появления высококачественной реализации проходит довольно много времени - иногда несколько лет. "Общий знаменатель" технологии - объявления на языке IDL, который является "сердцем" CORBA с момента ее появления. (Существуют три различных языка описаний с одним и тем же названием - OSF IDL, Microsoft IDL и OMG IDL).

25. Составные типы данных определяют упорядоченную совокупность скалярных переменных и характеризуются типом своих компонентов. К структурированным типам данных в Turbo Pascal относят: тип-массив (array), тип-множество (set), тип-запись (record), файловый тип (file), объектный тип (object), строковый тип (string);

27. Выражения представляют собой конструкцию языка, которая содержит данные, операции и имеется строгий порядок выполнения операций. В общем случае, в состав выражения входят: операнды; знаки операций; скобки.

Простые операторы Для выполнения каких-либо действий в программе на языке Object Pascal применяются операторы. Операторы - это команды компилятору языка на выполнение определенных действий. Как мы уже отмечали ранее, все операторы делятся на простые и структурированные. Напомним, что простые операторы не влияют на ход выполнения программы, т. е. сохраняют линейность выполнения команд программы. Кроме рассмотренных ранее арифметических логических и строковых операторов, к числу простых операторов относятся: оператор присваивания; пустой оператор;  составной оператор; оператор доступа.

30. Структурная обработка исключительных ситуаций - это система, позволяющая программисту при возникновении ошибки (исключительной ситуации) связаться с кодом программы, подготовленным для обработки такой ошибки. Это выполняется с помощью языковых конструкций, которые как бы "охраняют" фрагмент кода программы и определяют обработчики ошибок, которые будут вызываться, если что-то пойдет не так в "охраняемом" участке кода. В данном случае понятие исключительной ситуации относится к языку и не нужно его путать с системными исключительными ситуациями (hardware exceptions), такими как General Protection Fault. Эти исключительные ситуации обычно используют прерывания и особые состояния "железа" для обработки критичной системной ошибки; исключительные ситуации в Delphi же независимы от "железа", не используют прерываний и используются для обработки ошибочных состояний, с которыми подпрограмма не готова иметь дело. Системные исключительные ситуации, конечно, могут быть перехвачены и преобразованы в языковые исключительные ситуации, но это только одно из применений языковых исключительных ситуаций.

  1. Описать структуру платформы .Net

Структура .NET Framework показана на рис. 1, из которого видно, что эта среда представляет собой дополнительный операционный слой, разделяющий приложения пользователя и базовые сервисы Windows. Таким образом, .NET Framework - это фактически новая платформа разработки и исполнения прикладных программ.

.NET Framework состоит из двух главных компонентов: библиотеки базовых классов и CLR (Common Language Runtime - общая для языков среда исполнения NET-приложений), которые соответственно предназначены для решения следующих задач:

  • унификации библиотек функций для всех приложений, независимо от используемого языка программирования;

  • повышения управляемости приложений с точки зрения безопасности и эффективного использования ресурсов.

  1. Дать характеристику классов объектно-ориентированной среды, пример описания класса в .NET

3. Целочисленные типы данных C#

Количество бит

Со знаком

Без знака

8

sbyte

byte

16

short

ushort

32

int

uint

64

long

ulong

Кроме того, в С# поддерживаются два типа данных с плавающей точкой, float и double, соответствующие стандарту ANSI/IEEE 754-1985 — IEEE Standard for Binary Floating-Point Arithmetic (стандарт IEEE двоичной арифметики с плавающей точкой). Количество бит, используемое порядком и мантиссой типов float и double, таково:

Количество бит, используемое типами данных С# с плавающей точкой

Тип С#

Порядок

Мантисса

Всего бит

float

8

24

32

double

11

53

64

  1. Операции преобразования типов в языке программирования C#.

Если в операции присваивании используются совместимые типы данных, то тип переменной, находящейся справа от оператора, автоматически преобразуется в тип переменной, находящейся слева от него. Следовательно, в предыдущем примере тип переменной i преобразуется в тип float, а затем значение переменной i присваивается переменной f. Но поскольку C# является языком со строгим контролем типов, то не все его типы данных являются совместимыми, и следовательно, не все типы преобразований разрешены. Например, типы данных bool и int несовместимы.

При присваивании одного типа данных переменной другого типа автоматическое преобразование типа происходит, если два типа данных совместимы; конечный тип (слева) больше исходного типа (справа).

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

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

(target-type) expression

Конечный тип (target-type) указывает, к какому типу должно быть приведено выражение. Так, если необходимо преобразовать выражение x/y к типу int, следует написать:

double x, y; // ... (int) (x/y)

В этом примере приведение типа преобразует результат вычисления выражения к типу int, хотя переменные x и y имеют тип double. Круглые скобки, в которые заключено выражение x/y, являются обязательными. В противном случае приведение к типу int будет применено только для переменной x, а не для значения результата деления. Здесь применяется операция приведения типа, поскольку автоматическое преобразование данных типа double в тип int не может быть выполнено.

Когда в результате приведения типа происходит сужающее преобразование, информация может быть утеряна.

  1. Операторы ветвления в языке программирования C#, пример программного кода.

Для того чтобы программы на С# были более гибкими, используются операторы перехода (операторы ветвления). В С# есть два типа ветвления программы: безусловный переход и условный.  Кроме ветвлений, в С# также предусмотрены возможности циклической обработки данных, которые определяются ключевыми словами: for, while, do, in и foreach. Эти операторы обсудим в последующих уроках. Пока рассмотрим несколько способов условного и безусловного перехода. 

Безусловные переходы

Безусловный переход осуществляется двумя способами.  Первый способ — это вызов функций. Когда компилятор находит в основном тексте программы имя функции, то происходит приостановка выполнения текущего кода программы и осуществляется переход к найденной функции. Когда функция выполнится и завершит свою работу, то произойдет возврат в основной код программы, на ту инструкцию, которая следует за именем функции. Следующий пример иллюстрирует безусловный переход с использованием функции: 

using System;  class Functions  {      static void Main()      {          Console.WriteLine("Метод Main. Вызываем метод Jump...");          Jump();          Console.WriteLine("Возврат в метод Main.");      }      static void Jump()      {          Console.WriteLine("Работает метод Jump!");      }  } 

Условные переходы

Условный переход можно реализовать в программе с помощью ключевых слов языка: if, else или switch. Такой переход возможен только при условии, если он является истинным.  if...else оператор  if...else — это оператор ветвления, работа которого определяется условием. Условие оператора анализируется инструкцией if. Если условие верно (true), то выполняется блок инструкций программы, описанных после условия.  if ( expression ) statement 1  [else statement2 ]  Такой вид этого оператора вы можете найти в документации по С#. Он показывает, что работа условного оператора определяется булевым выражением (выражение, которое имеет значение true или false) в круглых скобках. Если значение этого выражения истинно, то выполняется блок инструкций statement1. Если же выражение ложно, произойдет выполнение блока инструкций statement2. Необходимо заметить, что вторая часть оператора (else statement2) может не указываться. Если инструкций в блоках statement1 или statement2 больше одной, то блок обязательно нужно брать в фигурные скобки. 

  1. Оператор выбора в языке программирования C#, пример программного кода.

Еще одной простой конструкцией выбора действия по условию, реализованной в языке программирования c# (csharp), кроме if, является оператор switch(оператор выбора).

Оператор выбора (switch) дает возможность обработать поток выполнения программы, основываясь на заданный набор вариантов.

Приведу синтаксис оператора выбора на языке программирования си шарп (си диез):

switch (выражение-селектор)

{

case значение1: действие1; break;

case значение2: действие2; break;

default:действие; break;

}

Допустимыми типами селектора являются – целочисленный, символьный, строковый и перечисления.

Ветвь default выполняется в случае, если ни одно из значений не совпало с селектором.

  1. Операторы цикла в языке программирования C#, пример программного кода

Пример цикла for:

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

{

Console.Write("Введите слово: ");

string s = Console.ReadLine();

if (s == "end")  { break; }

Console.WriteLine("Вы ввели: " + s); 

}

Цикл while выполняет оператор или блок операторов, пока определенное выражение не примет значение false.

n = 0;

while (n < 6)

{

Console.WriteLine("Значение n = {0}", n);

n++;

}

Цикл do .. while выполнит блок операторов как минимум один раз, а затем повторит выполнение цикла до тех пор, пока условное выражение не возвратит значение false.

n = 12;

do {

Console.WriteLine("Значение n = {0}", n);

n++;

} while (n < 6);

В данном примере тело цикла выполнится - но только один раз.

Цикл foreach позволяет производить итерацию по каждому объекту в контейнерном классе, поддерживающем интерфейс IEnumerable. К контейнерным классам относятся массивы, классы коллекций (System.Collection) и определенные пользователем классы коллекций. 

Пример цикла foreach:

int[] Ints = { 1, 2, 3 };

foreach (int temp in Ints)

{

Console.WriteLine(temp);

}

7. Операторы передачи управления:

Оператор goto позволяет передать управление строке программы, отмеченной меткой.

goto myLabel;

Console.WriteLine("Эта строка не будет выполнена");

myLabel:

Console.WriteLine("Выполнение будет продолжено от сюда");

Нельзя передать управление в блок кода, например в цикл for, нельзя передать управление за пределы класса и нельзя выйти из блока finaly.

Оператор break можно использовать для выхода из цикла for, foreach, while, do..while.

Оператор continue прерывает только текущую итерацию, т.е. выполнение будет продолжено со следующей итерации цикла, а не выйдет из цикла.

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

try

{

a = Convert.ToDouble(A.Text);

b = Convert.ToDouble(B.Text);

C.Text = Convert.ToString(a + b);

}

catch

{

MessageBox.Show("Проверьте ввод чисел");

}

9. Дать характеристику индексаторам, операциям и деструкторам классов в языке

Индексатор.

При написании приложений часто возникает необходимость создавать объекты, представляющие коллекцию других объектов (они не обязательно явно хранят в себе все эти объекты, но предоставляют доступ к ним). В языках вроде C или Java для этого использовались специальные функции (методы) вроде GetItem( int index ). Конечно, это возможный подход, но часто, когда нужно часто обращаться к элементам коллекции, неудобно каждый раз писать громоздкие конструкции.

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

Для того, чтобы объявить в классе индексатор, нужно использовать следующий синтаксис:

тип this [список_параметров]

Где тип - тип возвращаемого значения (тип элемента коллекции), а список параметров - типы и имена параметров, используемых для идентификации элемента коллекции.

Индексатор может иметь любые модификаторы, кроме static, а к параметрам нельзя применять модификаторы out и ref.

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

public object this [int index]

{

get

{

return GetItem(index);

}

set

{

SetItem(index, value);

}

}

Деструкторы

Деструктор - это метод, который вызывается при уничтожении объекта. Так как в .NET CLR используется сборщик мусора, нельзя явно удалить определенный экземпляр. Удаление происходит когда никакой код уже не может воспользоваться этим экземпляром. Деструкторы определяются как методы с именем, совпадающим с именем класса, предваренным знаком ~ (тильда):

public class A

{

~A

{

Console.WriteLine("I'm being descructed");

}

}

public class Application

{

public static void Main()

{

A a = new A();

a = null;

}

}

Программа выведет "I'm being destructed"

  1. Описать общую структуру программы на С#

Логическая организация кода помогает лучше в нем ориентироваться, делает код более понятным и облегчает его повторное использование. C# отражает иерархию пространств имен, принятую в .NET. Все классы могут быть распределены по пространствам имен, которые образуют иерархическую структуру. Например, пространство имен System включает в себя пространства имен Collections, Data и другие, а Data включает в себя SqlClient, OleDbClient, SqlTypes. Полные имена последних - System.Data.SqlClient, System.Data.OleDbClient, System.Data.SqlTypes. Видно, что в полных именах пропичываетася весь "путь" к namespace от корня, при этом уровни разделяются точкой.

Удобно все классы проекта разделить в иерархическую структуру, более того, все проекты, которые вы выполняются, могут иметь общую иерархию, начинающуюся с имени вашей компании. Например в компании с именем HT Electronics, которая выполняет работу над проектами с именами Web Admin и Processor Manager, классы, относящиеся к этим проектам могут быть расположены в пространствах имен com.HTElectronics.WebAdmin и com.HTElectronics.ProcessorManager. Также может быть общая библиотека классов в пространстве имен com.HTElectronics.Common.

Создание модели классов выходит за рамки данной публикации - созданию хорошей архитектуры посвящены целые книги, которые мы вам очень рекомендуем прочитать. В первую очередь это R. Gamma et al. "Design Patterns. Elements Of Reuseable Object-Oriented Software" и J. Larman "Applying UML and Design Patterns". Обе книги переведены на русский язык.

Последнее, о чем следует напомнить здесь - это о методе Main - точке входа в программу. Мы уже описывали этот метод, так что здесь мы просто напомним о том, что нужно решить, где у вас будет начинаться выполение программы.

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

namespace WindowsFormsApplication1

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

private void calc_Click(object sender, EventArgs e)

{

}

}

}

  1. Описать массивы в языке программирования C#

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

Массивами в С# можно пользоваться практически так же, как и в других языках программирования. Тем не менее у них имеется одна особенность: они реализованы в виде объектов.

Для тoго чтобы воспользоваться массивом в программе, требуется двухэтапная процедура, поскольку в С# массивы реализованы в виде объектов. Во-первых, необходимо объявить переменную, которая может обращаться к массиву. И во-вторых, нужно создать экземпляр массива, используя оператор new.

Int64[,] sp = new Int64[2, 50];

9. Описать тип данных «Запись» в языке программирования C#. Примеры описания и

апись – это структурированный тип данных, состоящий из конечного числа компонент, называемых полями. Компоненты записи могут разного типа. Компонента (поле) – переменная некоторого типа. Описание

struct <имя типа>

{

   тип_поля1 поле1;

   тип_поля2 поле2;

}

 

<имя типа> a = new <имя типа>();

10. Дать характеристику Множества в языке программирования C#.

Коллекция, содержащаяся только отличающиеся элементы, называется множеством (set). В составе .NET 4 имеются два множества — HashSet<T> и SortedSet<T>. Оба они реализуют интерфейс ISet<T>. Класс HashSet<T> содержит неупорядоченный список различающихся элементов, а в SortedSet<T> элементы упорядочены.

Интерфейс ISet<T> предоставляет методы для создания объединения нескольких множеств, пересечения множеств и определения, является ли одно множество надмножеством или подмножеством другого.

Ниже перечислены наиболее употребительные конструкторы, определенные в классе HashSet<T>:

public HashSet ()

public HashSet(IEnumerable<T> collection)

public HashSet(IEqualityCompare comparer)

public HashSet(IEnumerable<T> collection, IEqualityCompare comparer)

using System;

using System.Collections.Generic;

namespace ConsoleApplication1

{

class Program

{

static void Main()

{

// Создадим два множества

SortedSet ss = new SortedSet();

SortedSet ss1 = new SortedSet();

ss.Add('A');

ss.Add('B');

ss.Add('C');

ss.Add('Z');

ShowColl(ss, "Первая коллекция: ");

ss1.Add('X');

ss1.Add('Y');

ss1.Add('Z');

ShowColl(ss1, "Вторая коллекция");

ss.SymmetricExceptWith(ss1);

ShowColl(ss,"Исключили разноименность двух множеств: ");

ss.UnionWith(ss1);

ShowColl(ss, "Объединение множеств: ");

ss.ExceptWith(ss1);

ShowColl(ss, "Вычитание множеств");

Console.ReadLine();

}

static void ShowColl(SortedSet ss, string s)

{

Console.WriteLine(s);

foreach (char ch in ss)

Console.Write(ch + " ");

Console.WriteLine("\n");

}

}

}

11. Описать работу с файлами в языке программирования C#. Дать понятие

 этом посте будут рассмотрены основные операции над файлами. Примечание. Все необходимые классы находятся в пространстве имен System.IO.

Создание файла.

Для этого воспользуемся классом FileInfo из пространства имен System.IO. В конструктор передаем имя будущего файла. Создание файла производится вызовом метода Create().

FileInfo fi = new FileInfo("new.txt");

fi.Create();

Удаление файла.

Все аналогично предыдущему примеру. Для удаления файла используем метод Delete().

FileInfo fi = new FileInfo("new.txt");

fi.Delete();

Запись в файл.

Для записи (а в последующем и для чтения) в файл мы будем использовать символьные потоки позволяющие оперировать непосредственно с символами Unicode.

StreamWriter sw = new StreamWriter("name.txt");

sw.WriteLine("блаблабла");

sw.Close();

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

StreamWriter sw;

FileInfo fi = new FileInfo("name.txt");

sw = fi.AppendText();

sw.WriteLine("blablabla");

sw.Close();

Чтение из файла.

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

StreamReader streamReader = new StreamReader("name.txt");

string str = "";

 

while (!streamReader.EndOfStream)

{

str += streamReader.ReadLine();

}

Ещё один вариант, для разнообразия

StreamReader streamReader = new StreamReader("name.txt");

string str = "", str_temp="";

 

while ((str_temp = streamReader.ReadLine()) != null)

{

str += str_temp;

}

12 Описать организацию операции ввода – вывода в файл в языке программирования

  • Необходимо включить System.IO пространство имен, как показано ниже:

  • using System.IO;

  • Объявления winDir переменной, как показано ниже:

  • string winDir=System.Environment.GetEnvironmentVariable("windir");

  • В addListItem функция объявлена следующим образом:

  • private void addListItem(string value)

  • {

  • this.listBox1.Items.Add(value);

  • }