short int Divider(unsigned short int valOne, unsigned short int valTwo)
{
if (valTwo == 0)
return -1;
else
return valOne / valTwo;
}
6. Напишите программу, которая запрашивает у пользователя два числа и вызывает функцию, записанную при выполнении упражнения 5. Выведите результат или сообщение об ошибке, если функция возвратит значение, равное -1.
#include <iostream.h>
typedef unsigned short int USHORT;
typedef unsigned long int ULONG;
short int Divider(
unsigned short int valone,
unsigned short int valtwo);
int main()
{
USHORT one, two;
short int answer;
cout << "Enter two numbers.n Number one: ";
cin >> one;
cout << "Number two: ";
cin >> two;
answer = Divider(one, two);
if (answer > -1)
cout << "Answer: " << answer;
else
cout << "Error, can't divide by zero!";
return 0;
}
7. Напишите программу, которая запрашивает число и показатель степени. Напишите рекурсивную функцию, которая возводит число в степень путем многократного умножения числа на самое себя, т.е. если число равно 2, а показатель степени равен 4, то эта функция должна возвратить число 16.
#include <iostream.h>
typedef unsigned short USHORT;
typedef unsigned long ULONG;
ULONG GetPower(USHORT n, USHORT power);
int main()
{
USHORT number, power;
ULONG answer;
cout << "Enter a number: ";
cin >> number;
cout << "To what power? ";
cin >> power;
answer = GetPower(number,power);
cout << number << " to the " << power << "th power is " << answer << endl;
return 0;
}
ULONG GetPower(USHORT n, USHORT power)
{
if(power == 1)
return n;
else
return (n * GetPower(n,power-1));
}
День 6
Контрольные вопросы
1. Что представляет собой оператор прямого доступа и для чего он используется?
Оператор точки прямого доступа представляет собой символ точки (.). Он используется для обращения к членам класса.
2. Что резервирует память — объявление или определение?
Память резервируется определениями переменных. Объявления классов не резервируют память.
3. Объявление класса является его интерфейсом или выполнением?
Объявление класса является его интерфейсом, который сообщает клиентам класса, как с ним взаимодействовать. Выполнение класса — это набор функций-членов, сохраняемых обычно в файле с расширением CPP.
4. Какова разница между открытыми (public) и закрытыми (private) данными- членами?
К открытым переменным-членам могут обращаться клиенты класса, а к закрытым могут получить доступ только функции-члены класса.
5. Могут ли функции-члены быть закрытыми?
Да. Как функции-члены, так и переменные-члены могут быть закрытыми.
6. Могут ли переменные-члены быть открытыми?
Хотя переменные-члены могут быть открытыми, но считается хорошей практикой программирования, когда переменные-члены объявляются все же закрытыми, а доступ к этим данным обеспечивается за счет открытых методов доступа.
7. Если объявить два объекта класса Cat, могут ли они иметь различные значения своих переменных-членов itsAge?
Да. Каждый объект класса имеет свои собственные переменные-члены.
8. Ну5кно ли объявления класса завершать точкой с запятой? А определения методов класса?
Объявления класса заканчиваются точкой с запятой после закрывающей фигурной скобки, а определения функций-членов — нет.
9. Как бы выглядел заголовок функции-члена Meow класса Cat, которая не принимает никаких параметров и возвращает значение типа void?
Заголовок функции-члена Meow() класса Cat, которая не принимает параметров и возвращает значение типа void, должен иметь следующий вид:
void Cat::Meow()
10. Какая функция вызывается для выполнения инициализации класса? Для инициализации класса вызывается конструктор.
Упражнения
1. Напишите программу, которая объявляет класс с именем Employee (Служащие) с такими переменными-членами: age (возраст), yearsOfService (стаж работы) и Salary (зарплата).
class Employee
{
int Age;
int YearsOfService;
int Salary;
};
2. Перепишите класс Employee, чтобы сделать данные-члены закрытыми и обеспечить открытые методы доступа для чтения и установки всех данных-членов.
class Employee
{
public:
int GetAge() const;
void SetAge(int age);
int GetYearsOfService() const;
void SetYearsOfService(int years);
int GetSalary() const;
void SetSalary(int salary);
private:
int Age;
int YearsOfService;
int Salary;
};
3. Напишите программу с использованием класса Employee, которая создает два объекта класса Employee; устанавливает данные-члены age, YearsOfService и Salary, а затем выводит их значения.
int main()
{
Employee John;
Employee Sally;
John.SetAge(30);
John.SetYearsOfService(5);
John.SetSalary(50000);
Sally.SetAge(32);
Sally.SetYearsOfService(8);
Sally.SetSalary(40000);
cout << "At AcmeSexist company, John and Sally have the same job.n";
cout << "John is " << John.GetAge() << " years old and he has been with";
cout << "the firm for " << John.GetYearsOfService << " years.n";
cout << "John earns $" << John.GetSalary << " dollars per year.nn";
cout << "Sally, on the other hand is " << Sally.GetAge() << " years old and has";
cout << "been with the company " << Sally.GetYearsOfService;
cout << " years. Yet Sally only makes $" << Sally.GetSalary();
cout << " dollars per year! Something here is unfair.";
return 0;
}
4. На основе программы из упражнения 3 создайте метод класса Employee, который сообщает, сколько тысяч долларов зарабатывает служащий, округляя ответ до 1 000 долларов.
float Employee:GetRoundedThousands() const
{
return (Salary+500) / 1000;
}
5. Измените класс Employee так, чтобы можно было инициализировать данные-члены
age, YearsOfService и Salary в процессе "создания" служащего.
class Employee
{
public:
Employee(int Age, int yearsOfService, int salary);
int GetAge() const;
void SetAge(int Age);
int GetYearsOfService() const;
void SetYearsOfService(int years);
int GetSalary() const;
void SetSalary(int salary);
private:
int Age;
int YearsOfService;
int Salary;
};
6. Жучки: что неправильно в следующем объявлении?
class Square
{
public:
int Side;
}
Объявления классов должны завершаться точкой с запятой.
7. Жучки: что весьма полезное отсутствует в следующем объявлении класса?
class Cat
{
int GetAge() const;
private:
int itsAge;
};
Метод доступа к данным GetAge() является закрытым по умолчанию. Помните: все члены класса считаются закрытыми, если не оговорено иначе.
8. Жучки: какие три ошибки обнаружит компилятор в этом коде?
class TV
{
public:
void SetStation(int Station);
int GetStation() const;
private:
int itsStation;
};
main()
{
TV myTV;
myTV.itsStation = 9;
TV.SetStation(10);
TV myOtherTv(2);
}
Нельзя обращаться к переменной itsStation непосредственно. Это закрытая пере- менная-член.
Нельзя вызывать функцию-член SetStation()npHMO в классе. Метод SetStation() можно вызывать только для объекта.
Нельзя инициализировать переменную-член itsStation, поскольку в программе не определен нужный для этого конструктор.
День 7
Контрольные вопросы
1. Можно ли в цикле for инициализировать сразу несколько переменных-счетчиков?
Можно, для этого в строке инициализации их следует разделить запятыми, например:
for <х = 0. у = 10; х < 100; х++, у++)
2. Почему следует избегать использование оператора goto?
Оператор Goto выполняет переход в любом направлении к любой произвольной
строке программы. Это делает исходный код слишком запутанным, а следовательно, и трудным для понимания и дальнейшего обслуживания.
3. Можно ли с помошью оператора for организовать цикл, тело которого не будет выполняться?
Да. Если условие после инициализации оказывается ложным (FALSE), то тело цикла
for никогда не будет выполняться. Вот пример:
for (lnt х = 100; х < 100; х++)
4. Можно ли организовать цикл while внутри цикла for?
Да. Любой цикл может быть вложен внутрь любого другого цикла.
5. Можно ли организовать цикл, который никогда не завершится? Приведите пример.
Да. Ниже приведены примеры как для цикла for, так и для цикла wtiile:
for(;;)
{
// Этот цикл никогда не заканчивается!
}
whlle(1)
{
// Этот цикл никогда не заканчивается!
}
6. Что происходит при запуске бесконечного цикла?
Программа зависнет и придется перезагрузить компьютер.
Упражнения
1. Каким будет значение переменной х после завершения никла
for (int X = 0; X < 100; х++)?
100
2. Создайте вложенный цикл for, заполняющий нулями массив размером 10x10.
for (int = 0; i< 10; i++)