Лабораторные работы по курсу С#


Лабораторные работы по курсу С#.
Модуль 1.
Упражнение 1.
Создайте новое консольное приложение. В консольном приложении откройте AssemblyInfo.cs. Измените в нём свойства AssemblyTitle, AssemblyCompany и AssemblyProduct. Откомпилируйте программу. Посмотрите свойства полученного исполняемого файла в программе «Проводник».
Нажмите кнопку «Пуск» -> Все программы -> Visual Studio 2015 -> Visual Studio Tools и запустите Developer Command Prompt. Перейдите в каталог проекта выполнив команду:
cd «полное имя каталога»
Откомпилируйте программу:
csc /t:exe *.cs
Запуспите программу из командной строки.
Для генерации файла с документацией выполните команду:
csc /t:exe /doc:text.xml *.cs
Откройте и посмотрите сгенерированный файл.
Модуль 2.
Упражнение 1.
Создайте новое консольное приложение. Откройте файл проекта с исходным кодом. После открывающей фигурной скобки пространства имён создайте перечисление с именем Figures. Добавьте в это перечисление несколько именованных констант, например, Romb, Circle, Rect и т.д.
Ниже создайте структуру с именем Fdata. Поместите в структуру следующие данные:
public int x0,y0; // координаты центра тяжести
public int color;// цвет фигуры
public Figures type;// тип фигуры
В методе Main() создайте и инициализируйте структурную переменную типа Fdata:
// вариант 1
Fdata fd;
fd.x0=1; fd.y0=1;
fd.color=0x2727FF;
fd.type=Figures.Romb;
// или вариант 2
Fdata fd=new Fdata() { x0=1, y0=1, color=0x2727FF, type=Figures.Romb };
Добавьте код для вывода всех полей структурной переменной на экран. Запустите программу.
Модуль 3.
Упражнение 1.
Создайте новое консольное приложение. Откройте файл проекта с исходным кодом. Добавьте в класс новый статический метод с именем «ffactorial». Метод должен возвращать тип long и иметь один входной параметр «int n». В теле метода объявите переменную «res» с типом «long». Реализуйте цикл по «i» от 1 до «n», а в теле цикла вычисляйте результат по формуле «res *= i». В конце метода верните значение переменной «res».
Добавьте в класс новый статический метод «rfactorial». Метод должен возвращать тип long и иметь один входной параметр «int n». В теле метода добавьте оператор:
return n<1 ? 1 : n*rfactorial(n-1);
В методе Main() вызовите оба созданных метода и распечатайте результат. Запустите программу.
Упражнение 2.
Откройте приложение Geometry из каталога mod2. Откройте класс Program и создайте в нём новый статический метод «area», который возвращает «double» и получает на вход один параметр «Fdata fd».
Объявите в теле этого метода переменную «res» с типом «double» и нулевым начальным значением. Ниже добавьте оператор «switch» по типу геометрической фигуры. Для каждого типа фигуры из перечисления Figures реализуйте вычисление площади. Верните результат.
В методе Main() снимите комментарии и запустите программу.
Модуль 4.
Упражнение 1.
Создайте новое консольное приложение. Откройте свойства проекта и на вкладке Debug в разделе Command line arguments задайте несколько целых чисел разделённых пробелами. Откройте метод Main(). Используя цикл для коллекций распечатайте на экране все входные параметры передаваемые в метод Main() при запуске приложения.
Используя метод int.Parse() преобразуйте параметры командной строки в числа, сложите их и распечатайте полученную сумму. Запустите программу из Visual Studio. Запустите программу из командной строки - cmd.exe. Что будет если кроме чисел вводить символы? Перепишите цикл так, чтобы он складывал только числа, а символьные данные пропускал. Подсказка: используйте метод int.TryParse().
Упражнение 2(дополнительное).
Напишите метод возвращающий двоичное представление заданного целого числа.
Создайте новое консольное приложение. Откройте класс Program и создайте в нём новый статический метод «IntToBinary», который получает целочисленный параметр «num» и возвращает строку.
в этом методе создайте строковую переменную. Подсказка, использовать класс StringBuilder.
реализуйте цикл для анализа всех битов 4-х байтной переменной
в цикле проверяйте состояние самого младшего бита в переменной «num»(для проверки можно выполнить следующую битовую операцию: num&1 ) и если
там окажется true, то к строковой переменной добавьте «1», если false – «0».
выполните сдвиг переменной «num» на одну позицию вправо
при значениях счётчика цикла равным 7, 15 и 23 добавьте к строковой переменной пробел
после окончания цикла верните полученную строку.
- Вызовите метод «IntToBinary» из «Main» и распечатайте результат.
Модуль 5.
Упражнение 1.
Откройте приложение “Geometry” из модуля 5. Добавьте новый класс “Circle”. Добавьте данные для задания размеров и внешнего вида фигуры. Продумайте инициализацию данного объекта. Реализуйте методы “Area”, ”Move” и ”PrintInfo”. Создайте, инициализируйте и распечатайте одну из фигур типа «Circle» в коде.
Добавьте только что созданный объект в массив «data». Ниже в методе «Print» реализуйте цикл для коллекций. В цикле распечатайте информацию о каждом объекте вызвав для него метод «PrintInfo». Подсказка: используйте явное преобразование типов, например, к типу (Rect). Запустите программу. Почему произошла ошибка? Исправьте код, если это необходимо задайте вопрос преподавателю:).
Модуль 6.
Упражнение 1.
Откройте приложение “Geometry” из модуля 6. Добавьте в проект новый класс “Shape”. Наследуйте от него во всех классах геометрических фигур. Перенесите в класс “Shape” общие для всех геометрических фигур данные. Сделайте их «protected». Удалите эти данные в наследниках. Перенесите в класс “Shape” метод Move(). Добавьте в класс “Shape” метод Area() и реализуйте его. Добавьте в класс “Shape” метод PrintInfo(). Поместите в этот метод печать всех данных, которые являются общими для всех геометрических фигур. Вызовите эту реализацию метода «PrintInfo» в наследниках.
Какие методы можно сделать полиморфными? Сделайте это. Добавьте в класс“Shape” конструктор с одним параметром типа «Fdata». Инициализируйте данные члены класса этим параметром. В классах наследниках, в их конструкторах реализуйте вызов конструктора базового класса “Shape” с одним параметром и удалите инициализацию поля «Fdata». Проверьте работу программы.
Сделайте класс “Shape” абстрактным. Какие из методов можно сделать абстрактными? Сделайте это. Откройте метод Main() и измените тип массива «data» с Object на Shape. Раелизуйте метод Print(). Совет: используйте вызовы полиморфных методов. Запустите программу.
Модуль 7.
Упражнение 1.
Создайте новое консольное приложение. Откройте класс Program. В методе Main() напишите код, который вернёт список методов любого класса, например, String или StringBuilder.
Проверьте, что класс Type реализует паттерн «Одиночка».
Выполните преобразование из целого типа данных в логический тип.
Создайте в классе Program деструктор и проверь, что он вызывается при завершении приложения.
Модуль 8.
Упражнение 1.
Создайте новое консольное приложение. Откройте класс Program и создайте в нём новый статический метод для вычисления значения факториала с проверкой на переполнение и с обработкой ошибок. Возьмите за основу следующий код:
public static bool factorial (int n, out long fac)
{
fac = 1;
for (int i = 1; i <= n; ++i)
{
fac *= i;
}
return true;
}
Добавьте в этот код проверку на переполнение и код обработки возникающего исключения. Измените код метода «factorial» так, чтобы в случае возникновения исключения он возвращал false. Поместите вызов метода «factorial» в Main() и запустите программу.
Упражнение 2(дополнительное).
Добавьте в класс Program новый статический метод, который будет точно вычислять факториал от любых положительных целых чисел. Подсказка: обратите внимание на класс BigInteger.
Модуль 9.
Упражнение 1.
Откройте проект Lab9 из Mod9. Обратите внимание, что в методе Main() цикл foreach не работает, т.к. наш класс Books не реализует интерфейс IEnumerable. Откройте класс Books. Добавьте и реализуйте в этом классе интерфейс IEnumerable. Совет: используйте встроенные возможности Visual Studio по генерации кода. В теле метода GetEnumerator() верните существующий перечислитель массива:
return books.GetEnumerator();
запустите программу. А что делать если надо вывести список книг, упорядоченный по автору?
Вариант 1 (создаём перечислитель сами).
Добавьте в класс Books следующий метод;
public IEnumerable GetByAuthor( )
{
return new EnumAuthor(books);
}
Добавьте в проект новый класс:
public class EnumAuthor. : IEnumerable, IEnumerator { }
Сгенерируйте реализацию этих интерфейсов для класса EnumAuthor. Поместите в этот класс следующие члены класса:
int i = -1;
Book [ ] data;
internal EnumAuthor (Book [ ] books) { }
В тело конструктора поместите код, который будет создавать копию массива и будет сортировать его по авторам:
data = (Book [ ]) books.Clone( );
Array.Sort(data, Book.ByAuthor( ));
Удалите оператор «throw new …..» во всех сгенерированных Visual Studio методах. Поместите курсор в тело метода Reset(). Метод Reset() должен возвращать состояние перечислителя в исходное состояние, т.е. счётчику надо присвоить значение -1:
i= -1;
Поместите курсор в метод Current() и верните текущий элемент:
return data[i];
Метод GetEnumerator() должен возвращать сам объект перечислителя, т.е. объект, который реализует интерфейс IEnumerator:
return this;
Метод MoveNext() переходит на следующий объект. Если объект с таким индексом существует, то метод возвращает true, а если нет – false:
i++;
if (i< data.Length) return true;
else return false;
Откройте метод Main(). Раскомментируйте соответствующие строки кода и запустите программу.
Вариант 2 (используем оператор yield для создания перечислителя).
Откройте класс Books и добавьте в него следующий метод:
public IEnumerable GetReverseEnum( ) { }
В теле этого метода определите обратный порядок возврата элементов из массива книг:
for(int i=books.Length-1; i>=0; - -i )
yield return books[i];
Откройте метод Main(). Раскомментируйте соответствующие строки кода и запустите программу.
Самостоятельно реализуйте вывод списка книг отсортированных по цене.
Модуль 10.
Упражнение 1.
Откройте консольное приложение Lab10 из Mod10. Добавьте код, в метод Main, необходимый для сериализации объекта Books в XML формате. Запустите программу и убедитесь в наличие сохранённых данных объекта Books.
Выполните десериализацию.
Модуль 11.
Упражнение 1.
Откройте консольное приложение Lab11 из Mod11. Запустите программу.В чём проблема?
Откройте класс Book. Реализуйте в нём стандартный интерфейс IComparable. Данная реализация сравнения книг и станет вариантом сортировки по умолчанию. Если в этом методе мы вернём разность цены двух сравниваемых книг, то при сортировке книги будут упорядочены по цене.
А если надо реализовать несколько вариантов сортировки, то как быть? В этом случае мы должны в отдельном классе реализовать стандартный интерфейс IComparer. И делаем этих классов столько, сколько надо вариантов сортировки.
В классе «Book» создайте вложенный класс «SortByAuthor». Реализуйте в нём интерфейс IComparer. В теле метода удалите оператор «throw new ….» и переименуйте входные параметры метода в «x» и «y». Добавьте в метод следующий код:
int res=0;
Book b1 = (Book) x;
Book b2 = (Book) y;
Присвойте переменной «res» результат сравнения авторов книг. Проверьте «res» на равенство нулю, и если значение ноль, то тогда присвойте «res» разность цен книг. Верните значение переменной «res» из этого метода.
Добавьте к класс «Book» открытый статический метод ByAuthor(). Входных параметров у метода нет, а тип возвращаемого значения IComparer. В теле метода создайте и верните объект класс «SortByAuthor».
Откройте метод Main() и в вызове метода Sort() добавьте параметр, который и задаст алгоритм сравнения сортируемых элементов:
books.Sort( Book.ByAuthor( ) );
Запустите программу.
Модуль 12.
Упражнение 1.
Откройте консольное приложение Geometry из Mod12. Перегрузите операцию == в базовом классе Shape. Почему приложение не компилируется? Исправьте ошибку. Что ещё надо реализовать в этом классе? Сделайте это. Сравните свой код с ответом. Обсудите код в группе.
Модуль 13.
Упражнение 1.
Откройте приложение Lab13 из Mod13.
Запустите его. Введите целое число и нажмите кнопку «Вычислить факториал». Пользовательский интерфейс блокируется. Почему?
Найдите в программе обработчик для кнопки и перепишите его так, чтобы метод «Solve» вызывался асинхронно. Запустите программу. Обсудите код в группе.
Модуль 14.
Упражнение 1.Откройте приложение Lab14 из Mod14.
Запустите его. Введите целое число и нажмите кнопку «Вычислить факториал». Пользовательский интерфейс блокируется. Почему?
Найдите в программе обработчик для кнопки и перепишите его так, чтобы метод «Solve» вызывался асинхронно, с использованием паттерна async-await. Запустите программу. Лучше?

Приложенные файлы

  • docx 15851679
    Размер файла: 27 kB Загрузок: 14

Добавить комментарий