Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка_программирование!!!!!!!.doc
Скачиваний:
1
Добавлен:
09.11.2019
Размер:
1.59 Mб
Скачать

Шаблон проекта Windows Forms Application в Visual Studio

Когда понадобится использовать инструменты дизайна Windows Forms в Visual Studio 2008, первый шаг состоит в выборе шаблона проекта Windows Application (Приложение Windows) через пункт меню File=>New Project (Файл=>Новый проект). Чтобы почувствовать себя уверенно с основными инструментами дизайна Windows Forms, создайте новое приложение по имени SimpleVSWinFormsApp (рис. 5.1).

Рисунок 5. 1 – Создание проекта Windows Forms

Поверхность визуального дизайнера

Прежде чем начать строить более интересные приложения Windows, этот пример воссоздаст предыдущий пример, но с использованием инструментов дизайна. Прежде всего, как только вы создадите новый проект Windows Forms, то заметите, что Visual Studio 2008 предоставит поверхность дизайнера, на которую можно перетаскивать и помещать различные элементы управления. Тот же дизайнер служит и для настройки начального размера окна простым изменением размера самой формы с помощью специальных манипуляторов (рисунок 5.2).

Рисунок 5. 2 – Поверхность дизайнера Visual Studio 2008

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

В настоящий момент форма свободна от содержимого, поэтому мы увидим в списке только начальный объект Form, которому присвоено имя по умолчанию Form1, как показано в свойстве (Name) (рис. 5.3).

Рисунок 5.3 – Окно свойств формы

Следующий элемент дизайнера, о котором следует знать— окно Solution Explorer (Проводник решений). Хотя все проекты Visual Studio поддерживают это окно, при построении приложения Windows Forms оно особенно полезно, потому что, во-первых, позволяет быстро изменять имена файлов и связанных классов для любого окна и, во-вторых, просматривать файл, содержащий поддерживаемый дизайнером код (подробнее об этом чуть ниже). Пока просто выполните щелчок правой кнопкой мыши на пиктограмме Forml.cs и выберите в контекстном меню пункт Rename (Переименовать).

Дайте этому начальному окну более подходящее имя MainWindow.cs.

Внутренняя структура начальной формы

Прежде чем мы построим систему меню, давайте посмотрим, что именно среда Visual Studio 2008 создала по умолчанию. Выполните щелчок правой кнопкой мыши на пиктограмме MainWindow.cs в окне Solution Explorer и выберите в контекстном меню пункт View Code (Просмотреть код). Обратите внимание, что форма определена как частичный тип, который позволяет определять один тип в нескольких файлах кода. Также обратите внимание на то, что конструктор формы вызывает метод по имени InitializeComponent() и на тот факт, что ваш тип "является" Form.

namespace SimpleVSWinFormsApp

{

public partial class MainWindow : Form

{

public MainWindow()

{

InitializeComponent();

}

}

}

Как и можно было ожидать, InitializeComponent() определен в отдельном файле, который дополняет определение частичного класса. В соответствии с соглашением об именовании этот файл всегда заканчивается на .Designer.cs, предваренным именем связанного файла С#, который содержит код типа-наследника Form. Используя окно Solution Explorer, откройте файл MainWindow.Designer.сs и изучите следующий код (комментарии убраны для простоты):

partial class MainWindow

{

private System.ComponentModel.IContainer components = null;

protected override void Dispose(bool disposing)

{

if (disposing && (components != null))

{

components.Dispose();

}

base.Dispose(disposing);

}

private void InitializeComponent()

{

this.SuspendLayout();

//

// Form1

//

this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);

this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;

this.ClientSize = new System.Drawing.Size(304, 294);

this.Name = "Form1";

this.Text = "Form1";

this.ResumeLayout(false);

}

}

Переменная-член IContainer и метод Dispose() — это часть инфраструктуры, используемой инструментами дизайна Visual Studio. Однако обратите внимание, что InitializeComponent() присутствует и учитывается. Этот метод не только вызывается конструктором формы во время выполнения, но Visual Studio использует тот же метод во время проектирования для корректной визуализации пользовательского интерфейса в дизайнере форм. Для иллюстрации измените значение, присвоенное свойству Text окна на "My Main Window". После активизации дизайнера вы увидите, что заголовок формы соответствующим образом обновлен.

К тому же, при использовании инструментов визуального дизайна (таких как окно Properties), IDE-среда обновляет InitializeComponent() автоматически. Чтобы проиллюстрировать этот аспект инструментов дизайна Visual Studio, удостоверьтесь, что окно дизайнера форм активно в IDE-среде и найдите свойство Opacity в окне Properties. Измените его значение на 0.8 (80%), что сделает окно полупрозрачным после следующей компиляции и запуска программы. Внеся это изменение, снова взгляните на реализацию InitializeComponent():

private void InitializeComponent()

{

this.SuspendLayout();

//

// MainWindow

//

this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);

this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;

this.ClientSize = new System.Drawing.Size(304, 294);

this.Name = "MainWindow";

this.Opacity = 0.8;

this.Text = "My Main Window";

this.ResumeLayout(false);

}

Откомпилируем проект и запустим. Результат выполнения кода представлен на рисунке 5.4.

Рисунок 5. 4 – Форма со значением прозрачности 80 % запущена над окном Visual Studio

Для всех практических целей при построении приложения Windows Forms в Visual Studio можно (и обычно нужно) игнорировать файлы *.Designer.сs и позволить IDE- среде поддерживать их самостоятельно. Если вы внесете синтаксически (или логически) неверный код в InitializeComponent (), то можете нарушить работу дизайнера. К тому же Visual Studio часто переформатирует этот метод во время проектирования. Поэтому если вы добавите свой код в InitializeComponent(), IDE-среда может удалить его!

В любом случае, просто запомните, что каждое окно приложения Windows Forms формируется с использованием частичных классов.

Внутренняя структура класса Program

Помимо представления кода реализации для начального типа-наследника Form, типы проектов Windows Application также предоставляют статический класс (по имени Program), который определяет входную точку программы— Main():

static class Program

{

/// <summary>

/// The main entry point for the application.

/// </summary>

[STAThread]

static void Main()

{

Application.EnableVisualStyles();

Application.SetCompatibleTextRenderingDefault(false);

Application.Run(new MainWindow());

}

}

Как и ожидалось, метод Main() вызывает Application.Run(), а также выполняет несколько других вызовов на типе Application для установки некоторых базовых опций визуализации. И последнее: обратите внимание, что метод Main() оснащен атрибутом [STAThread]. Это информирует исполняющую систему, что если данный поток создаст любые классические СОМ-объекты (включая унаследованные элементы управления ActiveX) во время своего существования, они будут помещены в область, поддерживаемую СОМ, под названием single-threaded apartment (однопоточные апартаменты).

В основе это гарантирует, что объекты СОМ безопасны в отношении потоков, даже если автор определенного объекта СОМ не позаботился о коде, обеспечивающем это.

Визуальное построение системы меню

Чтобы завершить обзор инструментов визуального дизайнера Windows Forms и перейти к несколько более наглядным примерам, активизируйте окно дизайнера форм, найдите окно панели инструментов (Toolbox) Visual Studio 2008 и отыщите элемент управления MenuStrip внутри узла Menus & Toolbars (Меню и панели инструментов), как показано на рис. 5.5.

Рисунок 5. 5 – Выбор в панели инструментов элемента MenuStrip

Перетащите элемент управления MenuStrip на поверхность дизайнера форм.

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

Щелчок на этой пиктограмме приводит к открытию контекстно-зависимого встроенного редактора, который позволяет выполнить несколько установок свойств за раз (имейте в виду, что многие элементы управления Windows Forms имеют похожие встроенные редакторы). Просто для примера щелкните на опции Insert Standard Items (Вставить стандартные элементы), как показано на рис. 5.6.

Рисунок 5. 6 – Контекстное меню элемента MenuStrip

Результат выполнения действия представлен на рисунке 5.7 (выделен пункт меню «Файл»).

Рисунок 5. 7 – Сгенерированные элементы меню MenuStrip

Как видите, Visual Studio был настолько любезен, что установил для вас целую систему меню.

И, наконец, вернитесь в дизайнер и отмените предыдущую операцию, нажав комбинацию клавиш <Ctrl+Z>. Это вернет к начальному редактору меню и удалит сгенерированный код. В дизайнере меню введите пункт меню File верхнего уровня, а под ним— подменю Exit (рис. 5.8).

Рисунок 5. 8 – Созданные пункты меню File и Exit

Взглянув на InitializeComponent(), вы найдете там код того же рода, что писался вручную в предыдущем примере этой главы. Чтобы завершить упражнение, вернитесь обратно в дизайнер форм и щелкните на кнопке с молнией в окне Properties. Это покажет все события, которые можно обработать для выбранного элемента управления. Выберите меню Exit (с именем exitToolStripMenuItem по умолчанию) и найдите событие Click (рис. 5.9). Здесь можно ввести имя метода, который должен быть вызван при щелчке на элементе, или если сейчас это делать не хочется, просто дважды щелкните на событии, перечисленном в окне Properties. Это позволит IDE-среде выбрать имя обработчика событий за вас (имя следует шаблону ИмяЭлементаУправления_ИмяСобытия()). В любом случае IDE-среда создаст заготовку кода, которую следует заполнить деталями реализации. Например:

private void exitToolStripMenuItem_Click(object sender, EventArgs e)

{

Application.Exit();

}

Рисунок 5. 9 – Создание обработчика события Click для пункта меню

Если интересно, загляните в InitializeComponent(). Как видите, необходимая оснастка события уже учтена и здесь:

this.exitToolStripMenuItem.Click+=new System.EventHandler(this.exitToolStripMenuItem_Click);

Теперь вы наверняка чувствуете себя увереннее при построении приложения Windows Forms в IDE-среде. Хотя здесь есть еще много дополнительных горячих клавиш, редакторов и интегрированных мастеров для генерации кода, приведенной информации более чем достаточно для того, чтобы приступить к работе.

Задание

Для одного из классов, реализованных в лабораторной работе № 2 (согласно варианту) реализовать делегаты и события, заданные вариантом.

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

1) Студент получает оценку. Делегат с параметрами: оценка, предмет по которому поставлена оценка, дата получения оценки.

2) Инженер получает задание. Делегат с параметрами: наименование задания, сроки выполнения, сложность, стоимость работ.

3) Администрация выпускает постановление. Делегат с параметрами: наименование постановления, дата, срок действия, текст постановления.

4) Деталь получает повреждения. Делегат с параметрами: характеристика повреждения, предупреждающее сообщение.

5) На заводе происходит авария. Делегат с параметрами: причина аварии, описание аварии, предупреждения.

6) Выходит новый номер журнала. Делегат с параметрами: дата выхода, заголовок, стоимость.

7) Объявлено об экзамене. Делегат с параметрами: предмет по которому происходит экзамен, кто проводит, сколько студентов на экзамене, дата проведения.

8) В городе появляется новое строение. Делегат с параметрами: дата появления, тип строения.

9) Выпущен новый товар. Делегат с параметрами: наименование товара, для кого предназначается, цена.

10) Счет пополнен. Делегат с параметрами: сколько перечислено на счет, откуда перечислено, дата перечисления.

11) Автомобиль вышел из строя. Делегат с параметрами: причина поломки, дата поломки.

12) Двигатель запущен. Делегат с параметрами: дата запуска, кто запустил, цель запуска.

13) В государстве появляется новый субъект. Делегат с параметрами: дата появления, наименование, тип.

14) Обнаружено новый вид животного. Делегат с параметрами: описание животного, название вида, дата обнаружения.

15) Корабль приходит по месту назначения. Делегат с параметрами: наименование места назначения, дата прибытия, кол-во пассажиров.

Лабораторная работа 6: «Обобщения» (Windows)

Теоретическая часть

Обобщения (generics) были введены в язык C# в версии .NET 2.0. Концептуально они похожи на шаблоны языка С++, но существует принципиальное различие между ними: инстанцирование (конкретизация, настройка) шаблонов выполняется статически, во время компиляции, а инстанцирование обобщений происходит динамически, во время JIT-компиляции.

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

Обобщения определены для CLR и поэтому могут упаковываться в сборки и в таком виде «потребляться» позднее, причем не обязательно на том же языке, на котором написано обобщение (например, обобщенный класс C# может использоваться для создания конкретного класса на языке Visual Basic). В результате становится возможным повторное использование двоичного кода.

Каждый класс, имеющий дело с данными типа object, является кандидатом на обобщенную реализацию.

В некоторых случаях обобщения позволяют избавиться от иерархии классов и исключить необходимость в приведении типов.

В исходном коде обобщенного класса используются объекты обобщенного типа T (например, T x). Может появиться необходимость присвоить таким объектам значение «по умолчанию». Т.к. в языке C# существует два значения «по умолчанию»: число 0 (для типов значений) и константа null (для ссылочных типов), невозможно произвести такое присваивание для x однозначно. Оба присваивания: и x=0, и x=null будут неверными.

Для подобных случаев имеется специальное ключевое слово default, которое используется так:

T x = default(T); // верно!

Если в исходном коде обобщенного класса необходимо вызывать методы из обобщенного типа T, то необходимо быть уверенным, что эти методы определены для типа T. Подобное требование к типу T называется ограничением. Существующие виды ограничений представлены в таблице 6. 1.

Таблица 6. 1 – Существующие виды ограничений на типы при создании обобщений

where T: struct

T должен быть типом значений

where T: class

T должен ссылочным

where T: IA

T должен реализовывать интерфейс IA

where T: A

T должен наследовать от «закрытого» тип А

where T: new()

T должен иметь конструктор по умолчанию

Where T: U

T должен наследовать от «открытого» типа А

Обобщенный класс может реализовывать обобщенный интерфейс или наследовать от обобщенного базового класса:

public class B<T> { }

public class D<T> : B<T>, IEnumerable<T> { }

При этом должно выполняться требование, чтобы и в производном, и в базовых классах использовалось одно и тоже имя для обобщенного типа T, или обобщенный базовый класс должен быть инстанцирован (преобразован к «закрытому» классу):

public class B<T> { }

public class D<T> : B<string>, IEnumerable<T> { }

Если обобщенный класс имеет в своем составе статическое поле, то это поле «дублируется» для каждого закрытого класса, полученного путем инстанцирования обобщенного класса.

Создание специальных обобщенных методов

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

Целью этого примера будет построение метода обмена, который может оперировать любыми возможными типами данных (типами значений и ссылочными), используя единственный параметр типа. В силу природы алгоритма обмена (swap), входные параметры будут передаваться по ссылке (через ключевое слово С# ref). Ниже приведена полная реализация обобщенного метода обмена Swap(), содержащегося внутри класса Program:

static void Swap<T>(ref T a, ref T b)

{

Console.WriteLine("You sent the Swap() method a {0}",

typeof(T));

T temp;

temp = a;

a = b;

b = temp;

}

Обратите внимание, что обобщенный метод определен за счет спецификации параметра типа после имени метода и перед списком параметров. Здесь устанавливается, что метод Swap() может оперировать любыми двумя параметрами типа <Т>. Чтобы немного прояснить картину, будем печатать имя подставляемого типа на консоли, используя операцию С# typeof(). Теперь рассмотрим следующий метод Main(), обменивающий значениями целочисленные и строковые переменные:

static void Main(string[] args)

{

Console.WriteLine("***** Fun with Custom Generic Methods *****\n");

// Swap 2 ints.

int a = 10, b = 90;

Console.WriteLine("Before swap: {0}, {1}", a, b);

Swap<int>(ref a, ref b);

Console.WriteLine("After swap: {0}, {1}", a, b);

Console.WriteLine();

// Swap 2 strings.

string s1 = "Hello", s2 = "There";

Console.WriteLine("Before swap: {0} {1}!", s1, s2);

Swap<string>(ref s1, ref s2);

Console.WriteLine("After swap: {0} {1}!", s1, s2);

Console.WriteLine();

Console.ReadLine();

}

Результат выполнения кода представлен на рисунке 6.1.

Рисунок 6. 1 – Использование обобщенного метода

В языке C# помимо обобщенных классов существуют:

  1. Обобщенные интерфейсы.

  2. Обобщенные методы.

  3. Обобщенные делегаты.

Задание

Реализовать обобщенные классы в соответствии с вариантами.

  1. Реализовать класс, включающий метод, описывающий тип переданной в него переменной.

  2. Реализовать класс, включающий функцию вычисления максимального числа из массива чисел, переданного в параметре. В качестве параметров могут выступать только числа (float, double, int, byte).

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

  4. Создать класс геометрической фигуры. Три класса фигур: круг, квадрат, прямоугольник. Создать класс, включающий массив указанных фигур. Реализовать функцию сортировки элементов массива по возрастанию и убыванию (по их площадям).

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

  6. Реализовать класс, включающий метод, параметрами которого являются два объекта любого типа. Метод склеивает описания полученных переменных. Использовать ToString() при склеивании.

  7. Реализовать класса «Автомобиль», наследовать от него три класса: «MiniVan», «Truck», «Baggi». У класса «Автомобиль» реализовать метод, возвращающий число, определяющее занимаемое им место в гараже (объем). Реализовать класс гараж, способный вмещать объекты данного типа. Задать максимальную вместимость гаража и методы помещения автомобиля в гараж.

  8. Реализовать класс, включающий метод, принимающий в качестве параметров одновременно три переменные различных типов (например: int, double, string) и возвращающий склеенное описание этих объектов (использовать метод ToString()).

  9. Реализовать класс, включающий метод, принимающий две переменных разных типов (например: int, double) и выводящий информацию о том к какому типу относятся данные переменные (проверку выполнять на сходство с int, double, string).

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

Лабораторная работа 7: «Строки» (Windows)

Теоретическая часть

Ссылочный тип string является предопределенным (базовым) типом языка и фактически является обозначением базового класса System.String – мощного универсального класса для хранения и обработки строк, в составе которого определено большое количество различных методов (45 методов, многие из которых имеют несколько перегрузок),

Если нужно выполнять повторяющиеся модификации строки, например, чтобы «склеить» длинную строку из нескольких перед тем, как отобразить ее, или передать другому методу или приложению, то в этом случае класс String будет весьма неэффективным. Для таких случаев больше подходит другой строковый класс – System.Text.StringBuilder, который спроектирован для подобных случаев.

Класс String имеет недостаток, который делает его очень неэффективным при выполнении повторяющихся модификаций заданной строки, т.к. на самом деле String является неизменяемым (immutable) типом данных: однажды инициализированный строковый объект уже не может быть изменен. Методы и операции, модифицирующие содержимое строк, на самом деле создают новые строки, копируя при необходимости содержимое старых.

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

Класс StringBuilder имеет два главных свойства: Length, показывающее фактическую длину строки и Capacity, указывающее максимально допустимую длину строки.

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

В рассмотренных ранее примерах в любой класс включался ToString() для отображения содержимого экземпляров классов. Однако часто возникает потребность отобразить содержимое переменных другим способом — в зависимости от национальных и культурных стандартов. Например, класс System.DateTime может отобразить одну и ту же дату как 10 June 2007, 10 Jun 2007, 6/10/07 (США), 10/6/07 (Великобритания), или 10.06.2007 (Германия).

Аналогично, структура Vector реализует метод Vector.ToString() для отображения вектора в формате (4, 56, 8). Однако существует другой общепринятый способ записи векторов — в форме 4i + 56j + 8k.

Если разрабатываемые классы должны обладать свойством «дружественности» к пользователю, они должны предлагать средства для отображения своих строковых представлений в любом из форматов, которые могут понадобиться пользователю. Исполняющая система .NET определяет стандартный способ достижения этого — интерфейс IFormattable.

Тип System.String

Тип System.String, как и следовало ожидать, предоставляет ряд полезных методов, в том числе методы, способные возвращать информацию о длине символьных данных, отыскивать подстроки в пределах текущей строки, преобразовывать символы из верхнего регистра в нижний и наоборот, и т.д. В табл. 7.1 перечислены некоторые наиболее интересные члены этого типа (разумеется, далеко не все).

Таблица 7. 1 – Члены типа System.String

Член

Описание

Length

Это свойство возвращает информацию о длине текущей строки

Compare()

Этот метод позволяет сравнивать две строки

Contains()

Этот метод позволяет определять, содержит ли строка определенную подстроку

Equals()

Этот метод позволяет проверять, содержат ли два строковых объекта идентичные символьные данные

Format()

Этот метод позволяет форматировать строку с помощью других элементарных типов данных (например, числовых данных или других строк) и обозначений типа {0}

Insert()

Этот метод позволяет вставлять строку внутри определенной строки

PadLeft()

Этот метод используется для дополнения строки символами слева

PadRight()

Этот метод используется для дополнения строки символами справа

Remove()

Позволяет получить копию строки с удаленными символами

Replace()

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

Split()

Этот метод возвращает массив String, содержащий присутствующие в данном экземпляре подстроки, которые отделяются друг от друга элементами из указанного массива Char или String

Trim()

Этот метод позволяет удалять все вхождения указанного ряда символов из начала и конца текущей строки

ToUpper()

Этот метод позволяет создать копию строки в верхнем регистре

ToLower()

Этот метод позволяет создать копию строки в нижнем регистре

Задание

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

Создать методы, выполняющие следующие действия:

  1. Метод принимает две строки (переменная str1 и переменная str2). Метод должен определить заканчивается ли str1 строкой, хранящейся в str2. Также необходимо установить сколько раз str2 входит в str1.

  2. Метод принимает строку (переменная word) и символ (переменная separator). Строка должна состоять из двух частей, разделенных символом, хранящимся в переменной separator Первая часть строки содержит какое-либо слово, вторая число (тип данных – int) (например,separator=«:», word= «число:1»).. Метод должен разделять строку на две части и к числу прибавлять значение 10.

  3. Метод принимает строку (переменная word) и символ (переменная separator). Затем метод удаляет из строки word все вхождения заданного символа separator.

  4. Метод принимает строку. Строка представляет собой набор числовых значений (int и double), разделенных пробелами. Необходимо из данной строки получить два массива: массив int и массив double.

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

  6. Метод принимает массив строковых представлений int (т.е. каждый элемент массива – это число типа int, записанное в строке). Затем метод производит сортировку по возрастанию элементов массива (т.е. необходимо конвертировать каждый элемент из строки в int).

  7. Метод принимает на вход строку, содержащую значения трех типов данных (int, double и bool), разделенных пробелами. Метод должен возвратить сумму только целых чисел.

  8. Метод принимает целое число (переменная StrValue) и массив строк (переменная StrNames). Каждый элемент StrNames содержит запись вида «Какое_либо_имя : число», где – Какое_либо_имя – это какое-либо строковое значение, а число – строковое представление числа, хранящегося в StrValue. Метод ищет в массиве строк StrNames элемент «Какое_либо_имя : число»,, значение «число» которого равно значению StrValue и возвращает «Какое_либо_имя».

  9. Метод принимает целое число (переменная Count), строку (переменная str) и символ (переменная Symbol). Метод должен найти все вхождения символа Sybmol в строке str и заменить его любым другим символом (произвольным) столько раз в строке, сколько указано в Count. Т.е. если задана строка «пример», символ «р» и count=1, то заменяется только первая «р» в строке.

  10. Метод получает в качестве параметра строку и возвращает ту же строку, но перевернутую слева направо. Т. е. «пример», после изменения в методе, будет выглядеть как «ремирп».

Лабораторная работа 8: «Работа с БД с помощью linq» (Windows)

Теоретическая часть

Задание

Создать БД, содержащую таблицы, заданные в варианте. Реализовать windows forms приложение, содержащее следующие элементы интерфейса:

1) Таблицы для отображения записей из таблиц БД;

2) Текстовые поля для ввода информации в таблицы БД;

3) Элементы управления – кнопки для добавления, удаления записей.

Интерфейс должен позволять просматривать записи таблиц, вводить данные в таблицы, изменять записи таблиц, удалять записи из таблиц.

1) Таблицы: группы, студенты. Таблица студенты описывает студентов. Каждый студент принадлежит какой-либо группе.

2) Таблицы: заводы, инженеры. Таблица инженеры описывает инженеров какого либо завода. Каждый инженер принадлежит какому-либо заводу.

3) Таблицы: фирма, сотрудники. Таблица сотрудники описывает сотрудников какой-либо фирмы. Каждый сотрудник принадлежит какой-либо фирме.

4) Таблицы: механизмы, детали. Таблица детали описывает детали какого-либо механизма. Каждая деталь входит в какой-либо механизм.

5) Таблицы: холдинги, фирмы. Таблица фирмы описывает фирмы, входящие в какой-либо холдинг.

6) Таблицы: журналы, читатель. Таблица читатель описывает читателей какого-либо журнала. Каждый читатель читает какой-либо журнал.

7) Таблицы: экзамены, студенты. Таблица студенты описывает студентов какого-либо экзамена. Каждый студент сдает какой-либо экзамен.

8) Таблицы: области, города. Таблица города описывает города какого-либо района. Каждый город относится к какому-либо району.

9) Таблицы: порты, корабли. Таблица корабли описывает корабли, принадлежащие какому-либо порту. Каждый корабль относится к какому-либо порту.

10) Таблицы: гаражные комплексы, автомобили. Таблица автомобили описывает автомобили, располагающиеся в гаражах каких либо гаражных комплексов. Каждый автомобиль имеет гараж в каком-либо гаражном комплексе.

84