Студопедия

КАТЕГОРИИ:


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

Struct StudInfo




Struct Point

Inline double VLen (double Y, double X)

{

return sqrt(Y * Y + X * X);

}

{

double y, x;

Point()

{

y = x = 0;

}

Point& operator = (Point &Val)

{

if (this!= &Val)

{

y = Val.y;

x = Val.x;

}

return *this;

}

//----------------------------------

Point& operator = (double Val)

{

y = x = Val;

return *this;

}

//----------------------------------

bool operator > (Point &Val)

{

//Сравниваем длин векторов с началом в точке (0;0)

return VLen(y, x) > VLen(Val.y, Val.x);

}

//----------------------------------

bool operator < (Point &Val)

{

//Сравниваем длин векторов с началом в точке (0;0)

return VLen(y, x) < VLen(Val.y, Val.x);

}

//----------------------------------

bool operator >= (Point &Val)

{

//Сравниваем длин векторов с началом в точке (0;0)

return VLen(y, x) >= VLen(Val.y, Val.x);

}

//----------------------------------

bool operator <= (Point &Val)

{

//Сравниваем длин векторов с началом в точке (0;0)

return VLen(y, x) <= VLen(Val.y, Val.x);

}

//----------------------------------

bool operator == (Point &Val)

{

//Сравниваем длин векторов с началом в точке (0;0)

return VLen(y, x) == VLen(Val.y, Val.x);

}

//----------------------------------

bool operator!= (Point &Val)

{

//Сравниваем длин векторов с началом в точке (0;0)

return VLen(y, x)!= VLen(Val.y, Val.x);

}

};

//----------------------------------

main()

{

Point p1, p2;

p1 = 5.5;

p2 = p1;

p2.y -= 2;

if (p1!= p2)

puts("The points have different distances from the point (0;0)");

return 0;

}

Следует отметить, что:

1. Конструктор (Point) в данном примере выполняет начальную инициализацию полей y и x нулями и аргументов не имеет.

2. При перегрузке операторов важно аргумент класса Point (это же касается любого аргумента типа class, struct, union) передавать по ссылке, иначе при выходе из перегруженного оператора произойдет вызов деструктора для переданного в качестве фактического параметра экземпляра класса, что, как правило, приводит к невозможности его дальнейшего использования.

3. Все перегруженные операторы сравнения построены на сравнении расстояний от выбранной точки до начала координат (хотя возможны и другие интерпретации сравнения), что и является их результатом. Тип возвращаемого значения у них, соответственно, bool.

4. При перегрузке оператора присваивания типом возвращаемого значения является ссылка на класс Point. При этом рекомендуется выполнять проверку экземпляра класса, который стоит слева от операции присваивания (ее перегруженный оператор присваивания и вызывается) на совпадение с экземпляром класса, который стоит справа от оператора присваивания (в этом случае нечего присваивать). Для этого происходит проверка на совпадение адреса, который хранится в указателе this (указатель на экземпляр класса, перегруженный оператор которого был вызван) с адресом экземпляра класса, который передан в качестве аргумента.

5. Перегруженный оператор присваивания должен возвращать результат разименования указателя this.

6. Как показано в примере для перегруженного оператора присваивания, тип данных операнда правой части (для бинарных операций) не обязательно должен совпадать с типом данных операнда левой части. Таким образом, в примере описано два разных оператора присваивания: первый - для случая, когда оба операнда имеют тип Point, а второй - когда 1-ый операнд типа Point, а второй - типа double.

7. После перегрузки операторов их использование для переменных типа Point, ничем не отличается от использования аналогичных операторов, например, для арифметических типов данных.

8. Для доступа к полям и методам структуры необходимо указать переменную типа структура, поставить точку и написать имя поля или метода (как показано в примере 1). Если дан указатель на переменную типа структура, то необходимо вместо оператора. использовать оператор -> для доступа к полям и методам структуры.

9. Каждая переменная типа Point в рассмотренном примере будет занимать 8 + 8 = 16 байт.

Задание

 

Написать программу, которая для массива, содержащего информацию о студентах, выведет в виде таблицы неповторяющийся список специальностей (по вертикали) и количество студентов по курсам на каждой специальности (по горизонтали).

Массив, хранящий информацию о студентах, задается следующим образом:

 

typedef char group_type[7];

{

char *Surname, *Name, *Patroname; {Ф. И. О}

group_type group; {учебная группа}

char gender; {пол}

unsigned short int BY; {год рождения}

float AM; {средний балл}

};

 

В функции main необходимо описать переменную:

 

StudInfo *SG;

 

Для описанного типа данных написать:

1. Конструктор, который инициализирует нулями поля (для указателей - NULL).

2. Деструктор, который освобождает память, выделенную под поля Surname, Name, Patroname.

3. Перегруженный оператор присваивания (в случае необходимости). При его написании необходимо для каждого указателя на строку выполнить следующие действия:

- определить сколько памяти необходимо выделить для нового строкового значения, используя функцию strlen;

- освободить память, выделенную под изменяемое поле структуры;

- выделить полученный на первом шаге объем памяти + 1 байт (для символа с кодом 0);

- использовать соответствующую функцию для копирования строкового значения.

4. Необходимые для работы операторы сравнения (если нужно). Критерий сравнения выбрать самостоятельно.

 

Учебная группа задается шестью символами следующим образом:

- 1, 2 – специальность

- 3, 4 – год поступления

- 5, 6 – подгруппа

В начале работы программы выдается запрос на ввод количества студентов, после чего выделяется память под указанное количество элементов массива (при выходе из программы необходимо освободить память, выделенную под этот массив). Выделение и освобождение памяти под массив студентов аналогично выделению и освобождению памяти под массив символов (за исключением типа данных char).

Вся информация вводится с клавиатуры (для ввода информации написать функцию). При этом рекомендуется строковые значения считывать в специально созданный символьный буфер достаточной длины, а потом, выделив необходимое количество памяти (см. описание алгоритма перегруженного оператора присваивания), скопировать это значение в нужное поле структуры.

1. Для получения 100% от числа баллов, отводимых на лабораторную работу, необходимо написать программу, которая при вычислении номера курса будет учитывать год и месяц (вводятся пользователем с клавиатуры после соответствующего запроса), т.к. учебный год не совпадает с календарным. Также необходимо предусмотреть возможность перехода между столетиями, при вычислении номера курса.

2. Для получения 85% от числа баллов, отводимых на лабораторную работу, необходимо написать программу, которая при вычислении номера курса будет учитывать год и месяц (вводятся пользователем с клавиатуры после соответствующего запроса), т.к. учебный год не совпадает с календарным.

3. Для получения 65% от числа баллов, отводимых на лабораторную работу, необходимо написать программу, которая при вычислении номера курса будет учитывать только текущий год (вводится пользователем с клавиатуры после соответствующего запроса).

Вывод таблицы производится на экран с применением форматирования.

При решении задачи необходимо применить процедурно-ориентированное программирование (использовать функции).

 





Поделиться с друзьями:


Дата добавления: 2017-01-14; Просмотров: 328; Нарушение авторских прав?; Мы поможем в написании вашей работы!


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



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




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