Студопедия

КАТЕГОРИИ:


Архитектура-(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;

}

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


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;

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; Просмотров: 389; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.334 сек.