Курсовая по программированию. разработка программного обеспечения на языке высокого уровня c#
Скачать 1.38 Mb.
|
7 НаследованиеЦель: Изучить методы наследования классов. Теоретические сведения Наследование (inheritance) является одним из ключевых моментов ООП. Благодаря наследованию один класс может унаследовать функциональность другого класса. Пусть у нас есть следующий класс Person, который описывает отдельного человека: class Person { private string _name; public string Name { get { return _name; } set { _name = value; } } public void Display() { Console.WriteLine(Name); } } Но вдруг нам потребовался класс, описывающий сотрудника предприятия - класс Employee. Поскольку этот класс будет реализовывать тот же функционал, что и класс Person, так как сотрудник - это также и человек, то было бы рационально сделать класс Employee производным (или наследником, или подклассом) от класса Person, который, в свою очередь, называется базовым классом или родителем (или суперклассом): class Employee : Person { } После двоеточия мы указываем базовый класс для данного класса. Для класса Employee базовым является Person, и поэтому класс Employee наследует все те же свойства, методы, поля, которые есть в классе Person. Единственное, что не передается при наследовании, это конструкторы базового класса. Таким образом, наследование реализует отношение is-a (является), объект класса Employee также является объектом класса Person: static void Main(string[] args) { Person p = new Person { Name = "Tom"}; p.Display(); p = new Employee { Name = "Sam" }; p.Display(); Console.Read(); } И поскольку объект Employee является также и объектом Person, то мы можем так определить переменную: Person p = new Employee(). По умолчанию все классы наследуются от базового класса Object, даже если мы явным образом не устанавливаем наследование. Поэтому выше определенные классы Person и Employee кроме своих собственных методов, также будут иметь и методы класса Object: ToString(), Equals(), GetHashCode() и GetType(). Все классы по умолчанию могут наследоваться. Однако здесь есть ряд ограничений: Не поддерживается множественное наследование, класс может наследоваться только от одного класса. При создании производного класса надо учитывать тип доступа к базовому классу - тип доступа к производному классу должен быть таким же, как и у базового класса, или более строгим. То есть, если базовый класс у нас имеет тип доступа internal, то производный класс может иметь тип доступа internal или private, но не public. Однако следует также учитывать, что если базовый и производный класс находятся в разных сборках (проектах), то в этом случае производый класс может наследовать только от класса, который имеет модификатор public. Если класс объявлен с модификатором sealed, то от этого класса нельзя наследовать и создавать производные классы. Например, следующий класс не допускает создание наследников: sealed class Admin { } Нельзя унаследовать класс от статического класса.. Задание Разработать класс, являющийся наследником указанного класса. Добавить в него указанные поля, необходимые свойства и конструкторы. Написать программу с демонстрацией создания объектов этого класса с использованием разных конструкторов. Разработать класс PayedCount, являющийся наследником класса Count, добавив следующие поля: datePayed (дата оплаты), who (кто оплатил). Решение Листинг (исходный код программы) namespace Laborat7 { public class Count { private uint сountNumber; private DateTime date; private double value; private uint count; public Count() { сountNumber = 0; date = DateTime.ParseExact("01.01.1900", "dd.MM.yyyy", System.Globalization.CultureInfo.InvariantCulture); value = 0.00; count = 0; } public Count(uint сountNumber, DateTime date, double value, uint count) { this.сountNumber = сountNumber; this.date = date; this.value = value; this.count = count; } public Count(Count obj) : this(obj.сountNumber, obj.date, obj.value, obj.count) { } public override string ToString() { return String.Format("Номер счет-фактуры: {0}" + Environment.NewLine + "Дата выписки счет-фактуры: {1: dd.MM.yyyy}" + Environment.NewLine + "Cумма к уплате: {2} " + Environment.NewLine + "Количество товара: {3} " + Environment.NewLine + "Cредняя стоимость товара в счёте: {4:0.00}", сountNumber, date, value, count, GetAverage()); } public double GetAverage() { if (count == 0) return 0; else return (value / count); } public static bool operator >(Count a, Count b) { return a.date < b.date; } public static bool operator <(Count a, Count b) { return a.date > b.date; } } public class PayedCount : Count { private DateTime DatePayed { get; set; } private string Who { get; set; } public PayedCount(DateTime datePayed, string who, uint сountNumber, DateTime date, double value, uint count) : base(сountNumber, date, value, count) { DatePayed = datePayed; Who = who; } public override string ToString() { return base.ToString() + String.Format( Environment.NewLine + "Дата оплаты счета-фактуры: {0: dd.MM.yyyy}" + Environment.NewLine + "Плательщик: {1}", DatePayed, Who); } } class Program { static void Main(string[] args) { Count[] Counts = new Count[2]; for (int i = 0; i < Counts.Length; i++) { uint result; DateTime date_result; double value_result; Console.Write("Введите номер счет-фактуры: "); while (!uint.TryParse(Console.ReadLine(), out result)) { Console.WriteLine("Неверный номер счет-фактуры... "); Console.Write("\nВведите номер счет-фактуры: "); } uint сountNumber = result; Console.Write("Введите дата выписки счет-фактуры: "); while (!DateTime.TryParse(Console.ReadLine(), out date_result)) { Console.WriteLine("Неверная дата выписки счет-фактуры... "); Console.Write("\nВведите дату выписки счет-фактуры: "); } DateTime date = date_result; Console.Write("Введите сумму к уплате: "); while (!double.TryParse(Console.ReadLine(), out value_result)) { Console.WriteLine("Неверная сумма к уплате... "); Console.Write("\nВведите сумму к уплате: "); } double value = value_result; Console.Write("Введите количество товара: "); while (!uint.TryParse(Console.ReadLine(), out result)) { Console.WriteLine("Неверное количество товара... "); Console.Write("\nВведите количество товара: "); } uint count = result; Counts[i] = new Count(сountNumber, date, value, count); } Console.WriteLine(); PrintCounts(Counts); Console.WriteLine(); PayedCount[] PayedCounts = new PayedCount[2]; for (int i = 0; i < PayedCounts.Length; i++) { uint result; DateTime date_result; double value_result; Console.Write("Введите номер счет-фактуры: "); while (!uint.TryParse(Console.ReadLine(), out result)) { Console.WriteLine("Неверный номер счет-фактуры... "); Console.Write("\nВведите номер счет-фактуры: "); } uint сountNumber = result; Console.Write("Введите дата выписки счет-фактуры: "); while (!DateTime.TryParse(Console.ReadLine(), out date_result)) { Console.WriteLine("Неверная дата выписки счет-фактуры... "); Console.Write("\nВведите дату выписки счет-фактуры: "); } DateTime date = date_result; Console.Write("Введите сумму к уплате: "); while (!double.TryParse(Console.ReadLine(), out value_result)) { Console.WriteLine("Неверная сумма к уплате... "); Console.Write("\nВведите сумму к уплате: "); } double value = value_result; Console.Write("Введите количество товара: "); while (!uint.TryParse(Console.ReadLine(), out result)) { Console.WriteLine("Неверное количество товара... "); Console.Write("\nВведите количество товара: "); } uint count = result; Console.Write("Введите дата оплаты счет-фактуры: "); while (!DateTime.TryParse(Console.ReadLine(), out date_result)) { Console.WriteLine("Неверная дата оплаты счет-фактуры... "); Console.Write("\nВведите дату оплаты счет-фактуры: "); } DateTime datePayed = date_result; Console.Write("Введите фамилию плательщика: "); var who = Console.ReadLine(); PayedCounts[i] = new PayedCount(datePayed, who, сountNumber, date, value, count); } Console.WriteLine(); PrintPayedCount(PayedCounts); } private static void PrintCounts(Count[] Counts) { Console.WriteLine("Список счетов-фактур:"); foreach (Count с in Counts) { Console.WriteLine("------------------------------------------"); Console.WriteLine("{0}", с); } } private static void PrintPayedCount(PayedCount[] PayedCount) { Console.WriteLine("Список оплаченных счетов-фактур:"); foreach (PayedCount pc in PayedCount) { Console.WriteLine("------------------------------------------"); Console.WriteLine("{0}", pc); } Console.ReadKey(); } } } Результат работы программы Результат работы программы приведен на рис. 18. Рисунок 18 — Результат работы программы 8 Элементы библиотеки Windows Forms.Цель: Изучить основные классы библиотеки Windows Forms, их свойства, методы и события. Теоретические сведения Windows Forms — интерфейс программирования приложений (API), отвечающий за графический интерфейс пользователя и являющийся частью Microsoft .NET Framework. Данный интерфейс упрощает доступ к элементам интерфейса Microsoft Windows за счет создания обёртки для существующего Win32 API в управляемом коде. Причём управляемый код — классы, реализующие API для Windows Forms, не зависят от языка разработки. То есть программист одинаково может использовать Windows Forms как при написании ПО на C#, С++, так и на VB.Net, J# и др. С одной стороны, Windows Forms рассматривается как замена более старой и сложной библиотеке MFC, изначально написанной на языке C++. С другой стороны, WF не предлагает парадигму, сравнимую с MVC. Для исправления этой ситуации и реализации данной функциональности в WF существуют сторонние библиотеки. Одной из наиболее используемых подобных библиотек является User Interface Process Application Block, выпущенная специальной группой Microsoft, занимающейся примерами и рекомендациями, для бесплатного скачивания. Эта библиотека также содержит исходный код и обучающие примеры для ускорения обучения. Внутри .NET Framework, Windows Forms реализуется в рамках пространства имён System.Windows.Forms. Задание Вычислить и вывести на экран значения функции из задания 2 «Разветвляющиеся алгоритмы» в интервале от xнач да xкон с шагом dx. Для задания всех необходимых параметров использовать элементы TextBox, для вывода значений функции — элемент DataGridView. Пример формы, содержащей данные элементы, приведён на рис. 19. Рисунок 19 — Пример формы для вывода значений функции. Решение Листинг (исходный код программы) namespace Lab8 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void textBoxA_Click(object sender, EventArgs e) { (sender as TextBox).Clear(); } private void buttonCalc_Click(object sender, EventArgs e) { double a = 0, b = 0 , c = 0, x1 = -1, x2 = 1, dx = 0.1, F = 0; try { x1 = Convert.ToDouble(textBoxStart.Text); } catch { MessageBox.Show("Неверное вещественное значение Xнач", "Ошибка ввода начальных данных", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); return; } try { x2 = Convert.ToDouble(textBoxEnd.Text); } catch { MessageBox.Show("Неверное вещественное значение Xкон", "Ошибка ввода начальных данных", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); return; } try { dx = Convert.ToDouble(textBoxStep.Text); } catch { MessageBox.Show("Неверное вещественное значение dx", "Ошибка ввода начальных данных", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); return; } try { a = Convert.ToDouble(textBoxA.Text); } catch { MessageBox.Show("Неверное вещественное значение A", "Ошибка ввода начальных данных", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); return; } try { b = Convert.ToDouble(textBoxB.Text); } catch { MessageBox.Show("Неверное вещественное значение B", "Ошибка ввода начальных данных", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); return; } try { c = Convert.ToDouble(textBoxC.Text); } catch { MessageBox.Show("Неверное вещественное значение C", "Ошибка ввода начальных данных", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); return; } dataGridView1.Rows.Clear(); for (double x = x1; x <= x2; x += dx) { F = 0; if ((x < 1) && ((b - c) != 0)) F = a * x * x + b; else if ((x > 1) && ((b + x) == 0)) F = (x - a) / x; else if (c != 0) F = x / c; dataGridView1.Rows.Add(x.ToString(), F.ToString()); } } } }} Результат работы программы Результат работы программы приведен на рис. 20. Рисунок 20 — Результат работы программы ЗаключениеВ данной курсовой работе был разработан набор программ с использованием MS Visual Studio 2010. Выполнение курсовой работы было разделено на два этапа: - теоретический анализ поставленных задач, включающий в себя постановку задачи, выделение основных классов, выделение основных действия и алгоритмов их реализации, определение математического аппарата, необходимого при решении задачи; - программная реализация задач средствами Visual C#, включающая в себя реализацию основных классов, реализацию основных действий, реализацию классов диалоговых форм. Итогом курсовой работы можно считать закрепление знаний в области создания алгоритмов, навыков программирования на языке C# и создании приложений для операционных системы компании Microsoft. Список использованных источниковХейлсберг А. Язык программирования C#. — СПб: Питер, 2012. Троелсен, Эндрю Язык программирования C# 5.0 и платформа .NET 4.5 / Эндрю Троелсен. - М.: Вильямс, 2015. Бишоп, Дж. C# в кратком изложении / Дж. Бишоп, Н. Хорспул. - М.: Бином. Лаборатория знаний, 2013. Вагнер, Билл С# Эффективное программирование / Билл Вагнер. - М.: ЛОРИ, 2013 |