КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Этап 2. 1 страница
Очевидно, чтобы проверить работу конструкторов необходимо создать объекты класса. Так как разработка программы подразумевает демонстрацию ее многочисленных функций, то имеет смысл сразу разработать меню и тестировать создание объектов в одном из его пунктов. Меню разрабатывается в функции Main. Меню заключено в бесконечный цикл while, выход из которого осуществляется только в том случае, если пользователь выберет пункт меню «Выход», т.е. введет 0. Данный прием позволяет за один сеанс работы с программной протестировать различные ее функции. Можно указать сразу все пункты меню, как это сделано ниже, либо дописывать их по мере разработки программы. Реализация меню осуществляется с помощью конструкции swith-case. Код операторов case может быть заменен так называемыми заглушками, например, выводом на экран соответствующего сообщения, как это сделано в операторе case 2. Данные заглушки будут удалены после разработки соответствующей методов. В ветви case 1 происходит создание трех разных объектов класса с помощью трех различных конструкторов и вывод этих объектов на экран. class Class1 {
static void Main() { bool q = true; while (q) //меню программы { Console.WriteLine("\nВыберите действие:\n"); Console.WriteLine("1 - Тестовое создание объектов класса Студент"); Console.WriteLine("2 - Тестовое использование свойств класса Студент и метода ввода"); Console.WriteLine("3 - Формирование нового списка студентов"); Console.WriteLine("4 - Добавление данных о студенте"); Console.WriteLine("5 - Вывод списка студентов на экран"); Console.WriteLine("6 - Поиск студентов с заданной специальностью"); Console.WriteLine("7 - Поиск студента с заданной фамилией"); Console.WriteLine("8 - Операция ++ и операция преобразования типа (int)"); Console.WriteLine("0 - Выход\n"); try { int d = int.Parse(Console.ReadLine()); switch (d) {
case 0: { q = false; Console.WriteLine("Программа завершила работу."); break; } case 1: { Console.WriteLine("Количество созданных объектов =" + CStudent.n); Console.WriteLine("\Демонстрируется работа трех конструкторов"); CStudent s1 = new CStudent(); s1.output(); CStudent s2 = new CStudent("Иванова"); s2.output(); CStudent s3 = new CStudent("Петрова", "Информатика", gender_type.female, 1); s3.output(); Console.WriteLine("\nКоличество созданных объектов =" + CStudent.n);
break; } case 2: Console.WriteLine("\Демонстрируются свойства класса и метод ввода"); break; case 3: break; case 4: break; case 5: break; case 6: break; case 7: break; case 8: break; default: Console.WriteLine("Ошибка ввода\n"); break; }// switch(n) }//try catch (Exception e) { Console.WriteLine(e.Message); } Console.WriteLine("Для продолжения нажмите Enter"); Console.ReadKey(); }//while
}//Main
}//class Class1 Этап 3. После того как проверена работа конструкторов можно перейти к описанию свойств класса. Добавим в класс CStudent 4 свойства для работы с 4 полями соответственно. Обратите внимание, что в данном примере имена свойств и полей, для доступа к которым они служить отличаются регистром первой буквы. // *****************Cвойство для доступа к полю name******************************* public string Name { get { return name;} set { if (name == "Unknown") { if (value == "") name = "Unknown"; else name = value; } else throw new Exception("Фамилия студента задана и не может быть изменена данным способом"); } } // ***************Cвойство для доступа к полю speciality**************************** public string Speciality { get { return speciality;} set { if (speciality!= value) { if (value == "") speciality = "Unknown"; else speciality = value; } } } // ***************Cвойство для доступа к полю year******************************** public int Year { get {return year_tr; } set { // способ установки свойства if (value >= 1 && value <= 5) { year_tr = value; } else throw new Exception("При изменении курса студента указано недопустимое значение. Значение должно быть интевале [1,5]"); } } // ****************Cвойство для доступа к полю gender**************************** public gender_type Gender { get {return gender; } set { if (Enum.IsDefined(typeof(gender_type),value)) { gender = value; } else gender = gender_type.unknown; } } Все свойства для получения значения (get) поля используют одинаковый код - оператор return имя_поля. Установка значений полей (set) в каждом из свойств реализуется по-разному. Например, фамилию студента разрешается устанавливать только если она равна «Unknown». Если поля фамилия и специальность сделана попытка присвоить пустую строка, то они заполняются строкой «Unknown». Полю year_tr можно присвоить только значение от 1 до 5,.а полю gender только значения типа gender_type. После того как описаны свойства можно их использовать для определения метод ввода полей объекта с клавиатуры. //***Метод класса CStudent ввода полей объекта на экран*** public void input() {
Console.WriteLine("Введите ФИО студента"); Name = Console.ReadLine(); Console.WriteLine("Введите специальность"); Speciality = Console.ReadLine(); Console.WriteLine("Введите пол (1-муж, 2 - жен)"); int g = int.Parse(Console.ReadLine()); switch (g) { case 1: Gender = gender_type.male; break; case 2: Gender = gender_type.female; break; default: Gender = gender_type.unknown; break; } Console.WriteLine("Введите номер курса "); Year = int.Parse(Console.ReadLine()); } Теперь можно заменить заглушку в ветви case 2, например, следующим кодом. case 2: { Console.WriteLine("Для демонстрации свойств класса и метода вывода создайте студента"); CStudent s = new CStudent(); s.input(); Console.WriteLine("Создан студент:"); Console.WriteLine("{0}, {1}, {2}, {3}", s.Name, s.Speciality, s.Gender, s.Year); s.Name = "Иванов"; s.Speciality = "Математика"; s.Year++; s.Gender = gender_type.male; Console.WriteLine("\nДанные студента изменены: "); Console.WriteLine("{0}, {1}, {2}, {3}", s.Name, s.Speciality, s.Gender, s.Year); break; } Вводя различные данные в качестве полей студента можно протестировать различные ветви свойств.
Этап 4. Перейдем непосредственно к разработке основных функций демонстрационной программы, а именно следующих функций. · начальное формирование массива из N£20 объектов класса (ввод с клавиатуры или из заданного массива); · добавления объекта в массив; · вывод элементов массива на экран. Прежде всего в функции Main необходимо создать массив объектов. const int N = 20; //максимально возможное количество студентов static int k = 0; // количество студентов в массиве static CStudent[] students = new CStudent[N];// массив из N студентов
Для заполнения массива целесообразно сначала написать метод добавления его в массив, протестировать его, а затем использовать его в цикле для начального формирования массива. Опишем метод add(); в том же классе, что и метод Main
//***********Метод добавления студента в массив на k-ое место******************** static void add() { if (k < N) { students[k] = new CStudent(); (students[k]).input(); k++; } else Console.WriteLine("\nНевозможно добавить студента. Массив заполнен"); } Соответственно вызов данного метода осуществим в ветви case 4. case 4: { add(); break; }
Ддя тестирования данного метода опишем метод вывода элементов массива на экран. //**********Функция вывода массива на экран************** static void output() {
if (k == 0) Console.WriteLine("Нет студентов в списке"); else for (int i=0; i<k; i++) students[i].output(); } Соответственно вызов данного метода осуществим в ветви case 5. case 5: { output(); break; }
После того, как Вы убедились, что данный метод работает корректно, можно перейти к описанию метода начального формирования массива, у которого две ветви - введение элементов с клавиатуры и формирование массива на основе заданного. //*****************Метод формирования массива студентов************************
static void new_array() { Console.WriteLine("Будуте вводить данные с клавиатуры(y/n)? "); char s = (char)Console.Read(); Console.ReadLine(); if (s == 'y' || s == 'Y') { Console.WriteLine("Введите количество студентов <" + N); int n = int.Parse(Console.ReadLine()); for (int i = 1; i <= n; i++) add(); Console.WriteLine("\nФормирование списка завершено"); } else {
CStudent[] ar = { new CStudent ("Петров", "Информатика", gender_type.male, 1), new CStudent ("Сидоров", "Экономика", gender_type.male, 2), new CStudent ("Уткин", "Математика", gender_type.male, 1), new CStudent("Иванова", "Информатика", gender_type.female, 3), new CStudent ("Антонова", "Информатика", gender_type.female, 1), new CStudent ("Макаров", "Информатика", gender_type.male, 1) }; k = ar.Length; // количество элементов в массиве for (int i = 0; i < k; i++) students[i] = ar[i]; Console.WriteLine("\nСписок студентов сфорирован из заданного массива"); } }
Соответственно вызов данного метода осуществим в ветви case 3. case 3: { if (k == 0) new_array(); else Console.WriteLine("Список уже сформирован, Вы можете только добавить студента"); break; }
Этап 5. После формировании массива можно написать статический метод класса, поиск студента с заданной фамилией в массиве студентов, а также функцию демонстрационной программы: вывод всех студентов с заданной специальностью Сначала определим метод демонстрационной программы static void find(string s) { if (k == 0) Console.WriteLine("Поиск невозможен, т.к. в списке нет студентов"); else { bool f=false; for (int i=0; i<k; i++) if (students[i].Speciality == s) { students[i].output(); f=true;} if (f==false) Console.WriteLine("\nВ списке нет студентов со специальностью "+s); } } Протестируем его в ветви case 6. case 6: { Console.WriteLine("\nВведите название специальности: "); string s = Console.ReadLine(); find(s); break; }
Затем опишем метод класса CStudent // ***********Статический метод класса, возвращающий студента с заданной фамилий n, найденного в массиве ar из k элементов******** public static CStudent find (CStudent [] ar, int k, string n) { if (k== 0) throw new Exception("\nВ списке нет студентов"); for (int i=0; i<k; i++) if (ar[i].Name == n) return ar[i]; throw new Exception ("\nВ списке нет студентов со специальностью "+n); } Тестирование данного метода осуществим в ветви case 7. case 7: { Console.WriteLine("\nВведите фамилию студента, данные о котом Вы хотите найти "); string s = Console.ReadLine(); CStudent.find(students,k, s).output(); break; }
Этап 6. Опишем все остальные методы класса CStudent, а именно операцию ++ и операцию предобразования типа. // *********Переопределенная операция явного приведения типа CStudent к типу int***** public static explicit operator int (CStudent s) { return s.year_tr; } // ******Переопределенная операция ++ - перевод студента на следующий курс********** public static CStudent operator ++ (CStudent s) { s.Year++; return s; }
Протестируем данные операции в ветви case 8. case 8: { Console.WriteLine("Для демонстрации свойств класса и метода вывода создайте студента"); CStudent s = new CStudent(); s.input(); Console.WriteLine("\nСоздан студент:"); s.output(); Console.WriteLine("\nCтудент переведен на следующий курс:"); s++; s.output(); Console.WriteLine("\nКурс студента:"+(int)s); break; } Приведем полный текст программы
namespace ConsoleApplication1 { enum gender_type { male, female, unknown }; class CStudent {
//*********************Поля класса CStudent*************************************** static public int n = 0;
string name; string speciality; gender_type gender; int year_tr;
//************************Конструктор по умолчанию********************************** public CStudent() { name = "Unknown"; speciality = "Unknown"; gender = gender_type.unknown; year_tr = 0; n++; } //******************Конструктор, задающий фамилию студента************************** public CStudent(string n) : this() { if (name!= "") name = n; else name = "Unknown"; } //**********Конструктор, заполняющий все поля класса заданными параметрами********** public CStudent(string name, string speciality, gender_type gender, int year_tr) { if (name!="") this.name = name; else this.name="Unknown"; if (speciality!= "") this.speciality = speciality; else this.speciality = "Unknown"; if (Enum.IsDefined(typeof(gender_type), gender)) this.gender = gender; /*Используется метод IsDefined класса Enum, который возращает истину, если второй парамерт принадлежит перечислению, указанному в качестве первого параметра*/ else throw new Exception("При создании студента пол указан неверно"); if (year_tr >=1 && year_tr <=5) this.year_tr = year_tr; else throw new Exception("При создании студента курс обучения указан неверно. Значение должно быть интевале [1,5]"); n++; }
// *****************Cвойство для доступа к полю name******************************* public string Name { get { return name;} set { if (name == "Unknown") { if (value == "") name = "Unknown"; else name = value; }
} } // ***************Cвойство для доступа к полю speciality**************************** public string Speciality { get { return speciality;} set { if (speciality!= value) { if (value == "") speciality = "Unknown"; else speciality = value; } } } // ***************Cвойство для доступа к полю year******************************** public int Year { get {return year_tr; } set { // способ установки свойства if (value >= 1 && value <= 5) { year_tr = value; } else throw new Exception("При изменении курса студента указано недопустимое значение. Значение должно быть интевале [1,5]"); } } // ****************Cвойство для доступа к полю gender**************************** public gender_type Gender { get {return gender; } set { if (Enum.IsDefined(typeof(gender_type),value)) { gender = value; } else gender = gender_type.unknown; } } //***************Метод класса CStudent вывода полей объекта на экран**************** public void output() { Console.Write("Name= {0} speciality={1}", name.PadRight(10, ' '), speciality.PadRight(20, ' ')); if (gender == gender_type.male) Console.Write("gender= {0}", "муж ".PadRight(10, ' ')); else if (gender == gender_type.female) Console.Write("gender= {0}", "жен ".PadRight(10, ' ')); else Console.Write("gender= {0}", "не указан ".PadRight(10, ' ')); Console.WriteLine("year= {0,2}", year_tr);
} //****************Метод класса CStudent ввода полей объекта на экран**************** // Для заполнения полей используются свойства класса Name, Speciality, Gender, Year; public void input() {
Console.WriteLine("Введите ФИО студента"); Name = Console.ReadLine(); Console.WriteLine("Введите специальность"); Speciality = Console.ReadLine(); Console.WriteLine("Введите пол (1-муж, 2 - жен)"); int g = int.Parse(Console.ReadLine()); switch (g) { case 1: Gender = gender_type.male; break; case 2: Gender = gender_type.female; break; default: Gender = gender_type.unknown; break; } Console.WriteLine("Введите номер курса "); Year = int.Parse(Console.ReadLine());
}
// ***********Статический метод класса, возвращающий студента с заданной фамилий n, найденного в массиве ar из k элементов******** public static CStudent find (CStudent [] ar, int k, string n) { if (k== 0) throw new Exception("\nВ списке нет студентов"); for (int i=0; i<k; i++) if (ar[i].Name == n) return ar[i]; throw new Exception ("\nВ списке нет студентов со специальностью "+n); }
// *********Переопределенная операция явного приведения типа CStudent к типу int***** public static explicit operator int (CStudent s) { return s.year_tr; } // ******Переопределенная операция ++ - перевод студента на следующий курс********** public static CStudent operator ++ (CStudent s) { s.Year++; return s; }
}//class CStudent
class Class1 {
const int N = 20; //максимально возможное количество студентов static int k = 0; // количество студентов в массиве static CStudent[] students = new CStudent[N];// массив из N студентов
//***********Метод добавления студента в массив на k-ое место******************** static void add() { if (k < N) { students[k] = new CStudent(); (students[k]).input(); k++; } else Console.WriteLine("\nНевозможно добавить студента. Массив заполнен"); }
//******************Функция вывода массива на экран*************************** static void output() {
if (k == 0) Console.WriteLine("Нет студентов в списке"); else for (int i=0; i<k; i++) students[i].output(); }
//*****************Метод формирования массива студентов************************
static void new_array() { Console.WriteLine("Будуте вводить данные с клавиатуры(y/n)? "); char s = (char)Console.Read(); Console.ReadLine(); if (s == 'y' || s == 'Y') { Console.WriteLine("Введите количество студентов <" + N); int n = int.Parse(Console.ReadLine()); for (int i = 1; i <= n; i++) add(); Console.WriteLine("\nФормирование списка завершено"); } else {
CStudent[] ar = { new CStudent ("Петров", "Информатика", gender_type.male, 1), new CStudent ("Сидоров", "Экономика", gender_type.male, 2), new CStudent ("Уткин", "Математика", gender_type.male, 1), new CStudent("Иванова", "Информатика", gender_type.female, 3), new CStudent ("Антонова", "Информатика", gender_type.female, 1), new CStudent ("Макаров", "Информатика", gender_type.male, 1) }; k = ar.Length; // количество элементов в массиве for (int i = 0; i < k; i++) students[i] = ar[i]; Console.WriteLine("\nСписок студентов сфорирован из заданного массива"); } }
//****************Метод поиска студентов с заданной специальностью*******************
static void find(string s) { if (k == 0) Console.WriteLine("Поиск невозможне, т.к. в списке нет студентов"); else { bool f=false; for (int i=0; i<k; i++) if (students[i].Speciality == s) { students[i].output(); f=true;} if (f==false) Console.WriteLine("\nВ списке нет студентов со специальностью "+s); } }
static void Main() { bool q = true; while (q) //меню программы { Console.WriteLine("\nВыберите действие:\n"); Console.WriteLine("1 - Тестовое создание объектов класса Студент"); Console.WriteLine("2 - Тестовое использование свойств класса Студент"); Console.WriteLine("3 - Формирование нового списка студентов"); Console.WriteLine("4 - Добавление данных о студенте"); Console.WriteLine("5 - Вывод списка студентов на экран"); Console.WriteLine("6 - Поиск студентов с заданной специальностью"); Console.WriteLine("7 - Поиск студента с заданной фамилией"); Console.WriteLine("8 - Операция ++ и операция преобразования типа (int)"); Console.WriteLine("0 - Выход\n"); try { int d = int.Parse(Console.ReadLine()); switch (d) {
case 0: { q = false; Console.WriteLine("Программа завершила работу."); break; } case 1: { Console.WriteLine("Количество созданных объектов =" + CStudent.n); Console.WriteLine("\nДемонстрируется работа трех конструкторв "); CStudent s1 = new CStudent(); s1.output(); CStudent s2 = new CStudent("Иванова"); s2.output(); CStudent s3 = new CStudent("Петрова", "Информатика", gender_type.female, 1); s3.output(); Console.WriteLine("\nКоличество созданных объектов =" + CStudent.n); break; } case 2: { Console.WriteLine("Для демонстрации свойств класса и метода вывода создайте студента"); CStudent s = new CStudent(); s.input(); Console.WriteLine("Создан студент:"); Console.WriteLine("{0}, {1}, {2}, {3}", s.Name, s.Speciality, s.Gender, s.Year); s.Name = "Иванов"; s.Speciality = "Математика"; s.Year++; s.Gender = gender_type.male; Console.WriteLine("\nДанные студента изменены: "); Console.WriteLine("{0}, {1}, {2}, {3}", s.Name, s.Speciality, s.Gender, s.Year); break; } case 3: { if (k == 0) new_array(); else Console.WriteLine("Список уже сформирован, Вы можете только добавить студента"); break; } case 4: { add(); break; } case 5: { output(); break; } case 6: {
Console.WriteLine("\nВведите название специальности: "); string s = Console.ReadLine(); find(s); break; } case 7: { Console.WriteLine("\nВведите фамилию студента, данные о котом Вы хотите найти "); string s = Console.ReadLine(); CStudent.find(students,k, s).output(); break; } case 8: { Console.WriteLine("Для демонстрации свойств класса и метода вывода создайте студента"); CStudent s = new CStudent(); s.input(); Console.WriteLine("\nСоздан студент:"); s.output(); Console.WriteLine("\nCтудент переведен на следующий курс:"); s++; s.output(); Console.WriteLine("\nКурс студента:"+(int)s); break; }
default: Console.WriteLine("Ошибка ввода\n"); break; }// switch(n) }//try catch (Exception e) { Console.WriteLine(e.Message); } Console.WriteLine("Для продолжения нажмите Enter"); Console.ReadKey(); }//while
}//Main
}//class Class1 }//namespace ConsoleApplication1
Задание 9. Описание классов Каждому студенту рекомендуется решить хотя бы одну из задач 1-12. В каждой задаче необходимо описать класс. В каждом классе должен быть описаны как минимум: · соответствующие поля, · конструкторы (не менее трех), · свойства для получения и изменения значений · метод ввода объекта с клавиатуры · метод вывода объекта на экран · операция преобразования типа. Кроме того в классе должны быть описаны методы и операции, соответствующие варианту задания. Методы класса должны генерировать исключения. Разработать демонстрационную программу, которая должна обеспечивать выбор с помощью меню и выполнение следующих функций: · начальное формирование массива из N£20 объектов класса (ввод с клавиатуры или из заданного массива); · добавления объекта в массив; · вывод массива объектов на экран; · функции, демонстрирующие работу методов и операций, описанных в варианте задания. · дополнительные функции, указанные в варианте задания.
Задания 1. Описать класс РАЦИОНАЛЬНОЕ ЧИСЛО (поля: ЧИСЛИТЕЛЬ, ЗНАМЕНАТЕЛЬ). Операция класса: сложение двух чисел (+) Методы класса: поиск наибольшего числа в массиве рациональных чисел (статический метод), сокращение рационального числа Функция демонстрационной программы: вычисление суммы всех рациональных чисел из заданного массива. 2. Описать класс ИСТОРИЧЕСКОЕ СОБЫТИЕ (поля: ЧИСЛО, МЕСЯЦ, ГОД, СОБЫТИЕ). Операция класса: вычисление интервала в днях, прошедшего между двумя заданными историческими событиями (-); Статический метод класса: поиск наиболее позднего события в массиве событий. Функция демонстрационной программы: поиск в массиве заданного события по его названию. 3. Описать класс ДАТА (поля) ЧИСЛО, МЕСЯЦ, ГОД. Операция класса: вычисление даты, на N дней вперед по заданной (+). Статический метод класса: поиск в массиве дат всех дат заданного года. Функция демонстрационной программы: удаление из массива заданной даты 4. Описать класс ДАТА (поля: ЧИСЛО, МЕСЯЦ, ГОД). Операция класса: увеличение даты на один день (++) Статический метод класса: по году и порядковому номеру дня в году возвращающий соответствующую дату. Дополнительные функции демонстрационной программы: поиск в массиве дат самой поздней. 5. Описать класс АЛГЕБРАИЧЕСКИЙ ПОЛИНОМ (поля: СТЕПЕНЬ, КОЭФФИЦИЕНТЫ). Операция класса: сложение двух заданных полиномов (+). Статический метод класса: вывод на экран полиномов с максимальной степенью из массива полиномов.
Дата добавления: 2014-12-27; Просмотров: 409; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |