Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика. Базовый курс. Ч.3. Основы алгоритмизации и про- граммирования в среде Visual C++ 2005.pdf
Скачиваний:
69
Добавлен:
05.02.2023
Размер:
3.81 Mб
Скачать

103

Пользуясь таким структурным типом, составить программу: 14.17. определяющую предшествует ли времяt1 времени t2 (в

пределах суток);

14.18. присваивающую праметру t1 время, на 1 сек большее времени t (учесть смену суток)

В задачах 14.19–14.20 одинаковое начало условия задачи:

Дан список учащихся из 10 записей. Каждая запись имеет поля: фамилия, имя, номер класса (только 8-е и 9-е классы)

14.19. вывести отдельно учеников 9-х классов; 14.20. выяснить, на сколько человек в 8-х классах больше, чем в

9-х

В задачах 14.21–14.25 одинаковое начало условия задачи:

Дан список учащихся из 10 записей. Каждая запись имеет поля: фамилия, имя, номер класса, оценки по трем предметам.

14.21. вывести отдельно отличников для указанного извне класса; 14.22. вывести отдельно двоечников (хотя бы одна двойка) для

указанного извне класса; 14.23. вывести отдельно «хорошистов» (оценки 4 и 5) для ука-

занного извне класса; 14.24. вывести отдельно «троечников» (имеется хотя бы одна

тройка, но нет двоек) для указанного извне класса:

14.25. вывести список всех учеников с указанием среднего балла для каждого.

15.КЛАССЫ

15.1.Понятие класса

Фундаментальное нововведение языка C++ – понятие класс. Если структура объединяет разнородные по типам переменные, то

класс – объединяет переменные и функции, предназначенные для работы с ними. Здесь, пожалуй, впервые мы сталкиваемся с элементами объектно-ориентированного программирования. Можно сказать, что класс – это нового типа объект, который имеет свойства (переменные-члены класса) и методы (функции-члены класса). Определив класс, мы потом можем, как обычно, объявить определенный экземпляр, т.е. описать объект на основе заданного класса.

Объявление класса производится с помощью служебного слова

104

class с указанием имени и перечислением его членов в фигурных скобках. Например,

сlass DayOfYear {public:

void output();// прототип функции-члена int month;

int day; };

Обратите внимание, что при описании указывается только прототип функции, а саму функцию надо затем описать с указанием имени класса и через :: имя самой функции :

void dayOfYear :: output()

 

{cout << “ месяц “ << month;

}

cout << “ день “ << day << endl;

Впрочем, допускается описание

функции-члена тут ,жепри

описании класса.

 

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

Отметим, что члены класса могут бытьоткрытыми (public) и закрытыми (private). При этом закрытые члены могут использоваться только другими элементами класса, а к открытым элементам класса разрешен доступ из программы через объекты соответствующего типа (так же, как к элементам структуры– через точку). При попытке вызвать из программы закрытый элемент класса, компилятор укажет на ошибку. Заметим, что по умолчанию члены класса являются закрытыми (private).

Пример 15.1. Создать программу, которая запрашивает у пользователя сегодняшнее число и дату дня рождения, а затем сообщает: «Поздравляем с днем рождения!», если дата совпадает с днем рождения или просто сообщает«Счастливого дня!», если сегодня не ваш день рождения.

#include <iostream> #include <windows.h> using namespace std;

char* Rus(const char* str); char str_rus[256];

class DayOfYear { public:

void output(); // прототип функции-члена int month;

int day; };

int main()

105

{DayOfYear today, birthday;

cout <<Rus(" Введите текущую дату: \n"); cout << Rus(" ВВЕДИТЕ МЕСЯЦ: ");

cin >> today.month;

cout << Rus(" ВВЕДИТЕ ДЕНЬ МЕСЯЦА: "); cin >> today.day;

cout << Rus(" ВВЕДИТЕ ВАШ ДЕНЬ РОЖДЕНИЯ: \n"); cout << Rus(" ВВЕДИТЕ МЕСЯЦ: ");

cin >> birthday.month;

cout << Rus(" ВВЕДИТЕ ДЕНЬ МЕСЯЦА: "); cin >> birthday.day;

cout << Rus("СЕГОДНЯ "); today.output();

cout << Rus("ВАШ ДЕНЬ РОЖДЕНИЯ "); birthday.output();

if ((today.month = = birthday.month)

&& (today.day == birthday.day) )

cout << Rus(" ПОЗРАВЛЯЕМ С ДНЕМ РОЖДЕНИЯ ! \n"); else cout << Rus("ЖЕЛАЕМ УДАЧНОГО ДНЯ \n");

return 0; }

void DayOfYear :: output()

{

cout << Rus(" МЕСЯЦ ") << month;

}

 

cout << Rus(" ДЕНЬ " )<< day << endl;

char* Rus(const char* str) { AnsiToOem(str, str_rus);

return str_rus; }

15.2. Открытые и закрытые члены класса

Рассмотренный пример реализован с открытыми членами класса. Закрытые члены могут понадобиться, когда мы захотим создать более универсальный класс – такой, чтобы при изменении описания элементов класса, изменения в основной программе не вносились. Например, если мы изменим описание элементаmonth с целого int на строковый char(3) – месяц обозначается тремя буквами – тогда переменная-член month исчезнет и нужно менять, по сути, всю программу. После объявления переменной-члена закрытой, не существует другого способа изменить ее значения (или обратиться к нему), кроме использования одной из предназначенных для этого функ- ций-членов.

Реализуем тот же пример, но с использованием закрытых членов. Пример 15.2. Создать программу, которая запрашивает у поль-

зователя сегодняшнее число, а затем сообщает: «С ДНЕМ

106

РОЖДЕНИЯ, Иоганн Себастьян!», если дата совпадает с днем рождения И.С. Баха или просто сообщает«Желаем удачного дня, Иоганн Себастьян», если сегодня не день рождения И.С. Баха.

// пример с закрытыми членами класса

#include <iostream> #include <windows.h> using namespace std;

char* Rus(const char* str); char str_rus[256];

class DayOfYear

{public:

void input(); void output();

void set(int new_month, int new_day);

int get_month(); //возвращает значение месяца int get_day(); //возвращает день месяца private:

int month; int day;

}; int main()

{ DayOfYear today, bach_birthday;

cout << Rus(" Введите текущую дату: \n"); today.input();

cout << Rus("СЕГОДНЯ "); today.output(); bach_birthday.set(3,21);

cout <<Rus("День рождения И.С. Баха "); bach_birthday.output();

if (today.get_month() == bach_birthday.get_month() && today.get_day() == bach_birthday.get_day() )

cout <<Rus("С ДНЕМ РОЖДЕНИЯ, Иоганн Себастьян ! \n"); else cout<<Rus("Желаем удачного дня, Иоганн Себастьян \n");

return 0;}

void DayOfYear :: input()

{ cout << Rus(" ВВЕДИТЕ МЕСЯЦ: "); cin >> month; cout << Rus(" ВВЕДИТЕ ДЕНЬ МЕСЯЦА: ");

cin >> day;}

void DayOfYear :: output()

 

{

cout << Rus(" МЕСЯЦ ") << month;

}

 

 

cout << Rus(" ДЕНЬ ") << day <<“\n”;

void DayOfYear :: set(int new_month, int new_day)

 

{

month=new_month;

 

 

day=new_day;}

 

int DayOfYear ::get_month()

107

{return month; }

int DayOfYear ::get_day()

{return day; }

char* Rus(const char* str)

{AnsiToOem(str, str_rus); return str_rus;

}

При запуске программы и вводе месяца и дня рожден И.С. Баха получим (рис. 8.35):

Рис. 8.35. Результат работы программы примера 15.2

Рассмотрим пример с использованием указателей.

Пример 15.3. Создать программу для расчета суммы двух чисел.

#include <iostream> #include <windows.h> using namespace std;

char* Rus(const char* str); char str_rus[256];

class Sum { private:

int x,y,s; public:

void getx(int x1){x=x1;} void gety(int y1){y=y1;} void summa(); };

int main()

{ Sum z,*b=&z; int x2,y2;

cout <<Rus("\n Введи 1-е слагаемое:"); cin >>x2;

cout <<Rus("\n Введи 2-е слагаемое:"); cin >>y2;

z.getx(x2);

z.gety(y2);