Главная страница
Навигация по странице:

  • Экземпляры классов

  • Члены класса

  • Вложенные классы

  • Статический класс

  • Распределенные информационные системы. Практическая_1_АндроновичТА_672301. Практическая работа 1 по теме Разработка консольного приложения на С#, позволяющего работать с файлами и стандартными потоками вводавывода по предмету Распределенные информационные системы ч. 2


    Скачать 179.97 Kb.
    НазваниеПрактическая работа 1 по теме Разработка консольного приложения на С#, позволяющего работать с файлами и стандартными потоками вводавывода по предмету Распределенные информационные системы ч. 2
    АнкорРаспределенные информационные системы
    Дата18.12.2019
    Размер179.97 Kb.
    Формат файлаdocx
    Имя файлаПрактическая_1_АндроновичТА_672301.docx
    ТипПрактическая работа
    #100916
    страница1 из 3
      1   2   3

    Министерство образования Республики Беларусь

    Учреждение образования

    «Белорусский государственный университет

    информатики и радиоэлектроники»
    Факультет инженерно–экономический

    Кафедра экономической информатики

    ПРАКТИЧЕСКАЯ работа № 1

    по теме

    «Разработка консольного приложения на С#, позволяющего работать с файлами и стандартными потоками ввода/вывода»

    по предмету

    «Распределенные информационные системы ч.2»

    Вариант №1

    Выполнил:

    студент группы 672301

    Андронович Т.А.

    Проверил:

    старший преподаватель

    Унучек Е.Н.

    Минск 2019

    Тема



    Темой данной работы являются основы языка C#, а также работа со стандартными средствами для работы с файлами, стандартными потоками ввода-вывода.
    Цель
    Приобретение знаний по заданной теме, а также создание консольного приложения для работы с файлами и потоками ввода-вывода.

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



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

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

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

    • Инкапсулированные сигнатуры методов, именуемые делегатами, которые позволяют реализовать безопасные уведомления о событиях.

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

    • Атрибуты, предоставляющие декларативные метаданные о типах во время выполнения.

    • Внутристрочные комментарии для XML-документации.

    • LINQ для создания запросов к различным источникам данных.

    Программы C# выполняются на платформе .NET Framework, которая интегрирована в Windows и содержит виртуальную общеязыковую среду выполнения и унифицированный набор библиотек классов. Среда CLR корпорации Майкрософт представляет собой коммерческую реализацию международного стандарта Common Language Infrastructure (CLI), который служит основой для создания сред выполнения и разработки, позволяющих совместно использовать разные языки и библиотеки.

    При выполнении программы C# среда CLR загружает сборку и выполняет различные действия в зависимости от сведений, сохраненных в манифесте. Если выполняются все требования безопасности, среда CLR выполняет JIT-компиляцию из кода на языке IL в инструкции машинного языка. 

    Функциональные возможности существующего класса можно расширить путем создания нового класса, производного от существующего. Производный класс наследует все свойства базового класса, и можно добавлять или переопределять методы и свойства в зависимости от необходимости. В языке C# как наследование, так и реализация интерфейса определяются оператором :, аналогичным extends и implements в Java. Базовый класс должен всегда занимать крайнее левое положение в объявлении класса. Как и язык Java, C# не поддерживает множественное наследование. Это значит, что классы не могут наследовать от нескольких классов. Также, как и Java, С# поддерживает полиморфизм (это способность объекта использовать методы производного класса, который не существует на момент создания базового).

    Классы являются основным типом в языке C#. Класс представляет собой структуру данных, которая объединяет в себе значения (поля) и действия (методы и другие функции-члены). Класс предоставляет определение для динамически создаваемых экземпляров класса, которые также именуются объектами
    public class Point

    {

    public int x, y;

    public Point(int x, int y)

    {

    this.x = x;

    this.y = y;

    }

    }


    Новые классы создаются с помощью объявлений классов. Вот простой пример объявления класса с именем Point

    Экземпляры классов создаются с помощью оператора new, который выделяет память для нового экземпляра, вызывает конструктор для инициализации этого экземпляра и возвращает ссылку на экземпляр. Следующие инструкции создают два объекта Point и сохраняют ссылки на них в две переменные:

    Point p1 = new Point(0, 0);Point p2 = new Point(10, 20);

    Занимаемая объектом память автоматически освобождается, когда объект становится недоступен.

    Члены класса могут быть статическими членами или членами экземпляра.Статические члены принадлежат классу в целом, а члены экземпляра принадлежат конкретным объектам (экземплярам классов).

    Ниже перечислены виды членов, которые могут содержаться в классе: Константы, Поля, Методы, Свойства, Индексаторы, События, Операторы, Конструкторы, Методы завершения, Типы

    Вложенные классы определяются внутри области определения другого класса. Классы, определенные внутри контекста пространства имен или вне пространства имен, но не внутри контекста другого класса, называются не вложенными. Вложенные классы обладают некоторыми специальными возможностями, которые удобны, когда нужен вспомогательный класс, работающий внутри содержащего его класса.
    public class A {

    public class В { }

    }

    public class EntryPoint { static void Main() {

    А.В b = new A.B () ;}

    }


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

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

    Практическая часть



    Задание
    Разработать консольное приложение на языке C#, которое предоставляет следующие операции:

    -просмотр;

    - добавление.

    Информация должна храниться в файле в виде объектов пользовательского типа. Предусмотреть использование коллекций, свойств (properties), не менее 2-х интерфейсов.

    Вариант: 1 (учёт посетителей поликлиники).
    Листинг кода
    Program.cs

    using ClinicManager.Interfaces;

    using ClinicManager.Models;

    using ClinicManager.Services;

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

    using System.Threading.Tasks;
    namespace ClinicManager

    {

    class Program

    {

    static void Main(string[] args)

    {

    var fileService = new FileService();

    var doctorService = new DoctorService(fileService);

    var visitorService = new VisitorService(fileService, doctorService);
    Console.WriteLine("Добро пожаловать!");

    Console.WriteLine("Нажмите любую кнопку, чтобы продолжить..");

    Console.Read();
    while (true)

    {

    Console.Clear();
    Console.WriteLine("1. Перейкти к списку докторов.");

    Console.WriteLine("2. Перейкти к списку посетителей.");

    Console.WriteLine("0. Close program.");
    if (int.TryParse(Console.ReadLine(), out int firstAction))

    {

    if (firstAction == 0)

    break;

    else if (firstAction == 1)

    {

    NextState(doctorService);

    }

    else if (firstAction == 2)

    {

    NextState(visitorService);

    }

    else

    continue;

    }
    }
    Console.Read();
    // Сохраняем данные в файл

    FileService.SaveData();

    }
    private static bool NextState<T>(ICRUDService<T> cRUDService)

    where T : class

    {

    while (true)

    {

    Console.WriteLine("1. Показать всех.");

    Console.WriteLine("2. Показать по Id.");

    Console.WriteLine("3. Создать новый.");

    Console.WriteLine("4. Удалить.");

    Console.WriteLine("0. Отмена.");

    if (int.TryParse(Console.ReadLine(), out int result))

    {

    switch (result)

    {

    case 1: cRUDService.ReadAll(); break;

    case 2:

    {

    Console.WriteLine("Введите корректный идентификатор:");

    var guid = Guid.Parse(Console.ReadLine());

    cRUDService.Read(guid);

    }; break;

    case 3: cRUDService.Create(null); break;

    case 4:

    {

    Console.WriteLine("Введите корректный идентификатор:");

    var guid = Guid.Parse(Console.ReadLine());

    cRUDService.Delete(guid);

    }; break;

    case 0: return true;

    default: return false;

    }
    }

    }

    }

    }

    }

    TableParser.cs

    using System;

    using System.Collections.Generic;

    using System.Diagnostics;

    using System.Linq;

    using System.Text;

    using System.Threading.Tasks;
    namespace ClinicManager

    {

    public static class TableParser

    {

    public static string ToStringTable<T>(

    this IEnumerable<T> values,

    string[] columnHeaders,

    params Func<T, object>[] valueSelectors)

    {

    return ToStringTable(values.ToArray(), columnHeaders, valueSelectors);

    }
    public static string ToStringTable<T>(

    this T[] values,

    string[] columnHeaders,

    params Func<T, object>[] valueSelectors)

    {

    Debug.Assert(columnHeaders.Length == valueSelectors.Length);
    var arrValues = new string[values.Length + 1, valueSelectors.Length];
    // Fill headers

    for (int colIndex = 0; colIndex < arrValues.GetLength(1); colIndex++)

    {

    arrValues[0, colIndex] = columnHeaders[colIndex];

    }
    // Fill table rows

    for (int rowIndex = 1; rowIndex < arrValues.GetLength(0); rowIndex++)

    {

    for (int colIndex = 0; colIndex < arrValues.GetLength(1); colIndex++)

    {

    arrValues[rowIndex, colIndex] = valueSelectors[colIndex]?

    .Invoke(values[rowIndex - 1])?.ToString();

    }

    }
    return ToStringTable(arrValues);

    }
    public static string ToStringTable(this string[,] arrValues)

    {

    int[] maxColumnsWidth = GetMaxColumnsWidth(arrValues);

    var headerSpliter = new string('-', maxColumnsWidth.Sum(i => i + 3) - 1);
    var sb = new StringBuilder();

    for (int rowIndex = 0; rowIndex < arrValues.GetLength(0); rowIndex++)

    {

    for (int colIndex = 0; colIndex < arrValues.GetLength(1); colIndex++)

    {

    // Print cell

    string cell = arrValues[rowIndex, colIndex];

    cell = cell?.PadRight(maxColumnsWidth[colIndex]) ?? string.Empty.PadRight(maxColumnsWidth[colIndex]);

    sb.Append(" | ");

    sb.Append(cell);

    }
    // Print end of line

    sb.Append(" | ");

    sb.AppendLine();
    // Print splitter

    if (rowIndex == 0)

    {

    sb.AppendFormat(" |{0}| ", headerSpliter);

    sb.AppendLine();

    }

    }
    return sb.ToString();

    }
    private static int[] GetMaxColumnsWidth(string[,] arrValues)

    {

    var maxColumnsWidth = new int[arrValues.GetLength(1)];

    for (int colIndex = 0; colIndex < arrValues.GetLength(1); colIndex++)

    {

    for (int rowIndex = 0; rowIndex < arrValues.GetLength(0); rowIndex++)

    {

    int newLength = arrValues[rowIndex, colIndex]?.Length ?? default(int);

    int oldLength = maxColumnsWidth[colIndex];
    if (newLength > oldLength)

    {

    maxColumnsWidth[colIndex] = newLength;

    }

    }

    }
    return maxColumnsWidth;

    }

    }

    }

    CRUDService.cs

    using ClinicManager.Interfaces;

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

    using System.Threading.Tasks;
    namespace ClinicManager.Services

    {

    public abstract class CRUDService<T>

    where T : class, IGuid

    {

    private readonly FileService fileService;

    public CRUDService(FileService fileService)

    {

    this.fileService = fileService;

    }

    public virtual void Create(T obj)

    {

    var objects = (List<T>)fileService.GetMany(typeof(T));

    objects.Add(obj);
    Console.WriteLine("Объект успешно создан.");

    }
    public virtual void Update(Guid guid, T obj)

    {

    throw new NotImplementedException("Метод не реализован!");

    }
    public virtual T Read(Guid guid)

    {

    var objects = (List<T>)fileService.GetMany(typeof(T));
    return objects.FirstOrDefault(x => x.Guid == guid);

    }
    public virtual List<T> ReadAll()

    {

    return (List<T>)fileService.GetMany(typeof(T));

    }
    public virtual void Delete(Guid guid)

    {

    var objects = (List<T>)fileService.GetMany(typeof(T));

    objects.RemoveAll(x => x.Guid == guid);

    }

    }

    }


      1   2   3


    написать администратору сайта