Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие СS_Шульга.doc
Скачиваний:
48
Добавлен:
12.02.2015
Размер:
703.49 Кб
Скачать

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());

}

Теперь можно заменить заглушку в ветви case2, например, следующим кодом.

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;

}

Приведем полный текст программы

using System;

namespace ConsoleApplication1

{

enum gender_type { male, female, unknown };

class CStudent

{

//*********************Поля класса CStudent***************************************

static public int n = 0;

string name;

string speciality;

gender_type gender;