Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лафоре Р. - Объектно-ориентированное программир...doc
Скачиваний:
154
Добавлен:
01.04.2025
Размер:
41 Мб
Скачать
☆

private:

string title;

float price;

public:

void getdata()

{

cout << "\nВведите заголовок:";cin >> title;

cout << "Введите цену:";cin >> price;

}

void putdata()const

{

cout << "\nЗаголовок:" << title;

cout << "\nЦена:" << price;

}

};

///////////////////////////////////////////////////////////

class sales

{

private:

enum { MONTHS = 3 };

float salesArr[MONTHS];

public:

void getdata();

void putdata()const;

};

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

void sales::getdata()

{

cout << "Введите объем продаж за 3 месяца:\n ";

for(int j = 0; j < MONTHS; j++)

{

cout << " Месяц " << j + 1 << ":";

cin >> salesArr[j];

}

}

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

void sales::putdata()const

{

for(int j = 0; j < MONTHS; j++)

{

cout << "\nПродажи за месяц" << j + 1 << ":";

cout << salesArr[j];

}

}

///////////////////////////////////////////////////////////

class book :private publication, private sales

{

private:

int pages;

public:

void getdata()

{

publication::getdata();

cout << "Введите число страниц:";cin >> pages;

sales::getdata();

}

void putdata()const

{

publication::putdata();

cout << "\nСтраниц:" << pages;

sales::putdata();

}

};

///////////////////////////////////////////////////////////

class tape :private publication, private sales

{

private:

float time;

public:

void getdata()

{

publication::getdata();

cout << "Введите время звучания:";cin >> time;

sales::getdata();

}

void putdata()const

{

publication::putdata();

cout << "\nВремя звучания:" << time;

sales::putdata();

}

};

///////////////////////////////////////////////////////////

int main()

{

book book1; // определить публикации

tape tape1;

book1.getdata(); // получить сведения о публикациях

tape1.getdata();

book1.putdata(); // вывести сведения о публикациях

tape1.putdata();

cout << endl;

return 0;

}

Глава 10 Ответы на вопросы

  1. Правильный ответ: cout << &testvar;

  2. 4 байта.

  3. в.

  4. Правильный ответ: &var, *var, var&, char*

  5. Константа; переменная.

  6. Правильный ответ: float *ptrtofloat.

  7. Имени.

  1. Правильный ответ: *testptr

  2. Указатель на; значение переменной, на которую ссылается указатель.

  3. б, в, г.

  4. Нет. Адрес &intvar должен быть помещен в указатель intptr до первого обращения к переменной.

  5. Любой тип данных.

  6. Оба делают одно и то же.

  7. Правильный ответ: for(int j = 0; j < 77; j++) cout << endl << *(intarr + j);

  8. Потому что имя массива — это его адрес, который нельзя изменять.

  9. Ссылке; указателю.

  10. а, г.

  11. Правильный ответ: void func(char*);

  12. Правильный ответ:

for(int j = 0; j < 80; j++) *s2++=*s1++;

  1. б.

  2. Правильный ответ: char*revstr(char*);

  3. Правильный ответ: char*numptrs[] = {"Один ", "Два ", "Три "};

  4. а, в.

  5. Потерям.

  6. Память, которая больше не используется.

  7. Правильный ответ: p->exclu();

  8. Правильный ответ: objarr[7].exclu();

  9. а, в.

  10. Правильный ответ: float*arr[8];

  11. б.

  12. 0..9 с одного конца; 3..* — с другого.

  13. б.

  14. Ложно.

  15. а.

Решения упражнений

1. Верное решение:

// ex10_1.cpp

// находит среднее чисел, введенных пользователем

#include <iostream>

using namespace std;

int main()

{

float flarr[100]; // массив чисел

char ch; // выбор пользователя

int num = 0; // считает количество

// введенных чисел

do

{

cout << "Введите число:";// получить числа

cin >>*(flarr + num++);// пока не будет ответа 'n'

cout << "Продолжать(y/n)?";

cin >> ch;

}

while(ch != 'n');

float total = 0.0; // сумма начинается с 0

for(int k = 0; k < num; k++) // прибавлять числа к сумме

total += *(flarr + k);

float average = total / num; // поиск и вывод среднего

cout << "Среднее равно " << average << endl;

return 0;

}

2. Верное решение:

// ex10_2.cpp

// метод переводит строки в верхний регистр

#include <iostream>

#include <cstring> // для strcpy() и т.п.

#include <cctype> // для toupper()

using namespace std;

///////////////////////////////////////////////////////////

class String // пользовательский строковый тип

{

private:

char*str; // указатель на строку

public:

String(char*s) // конструктор с 1 аргументом

{

int length = strlen(s); // длина строки из аргумента

str = new char[length + 1];// занять память

strcpy(str, s); // скопировать туда строку

}

~String() // деструктор

{ delete str; }

void display() // вывести String

{ cout << str; }

void upit(); // String в верхний регистр

};

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

void String::upit() // каждый символ в верхний регистр

{

char*ptrch = str; // указатель на эту строку

while(*ptrch) // до пустого символа,

{

*ptrch = toupper(*ptrch); // каждый символ в

// ВЕРХНИЙ РЕГИСТР

ptrch++; // перейти к следующему символу

}

}

///////////////////////////////////////////////////////////

int main()

{

String s1 = "My home is very, very beeg";

cout << "\ns1 ="; // вывести строку

s1.display();

s1.upit(); // в ВЕРХНИЙ РЕГИСТР

cout << "\ns1 ="; // вывести строку

s1.display();

cout << endl;

return 0;

}

3. Верное решение:

// ex10_3.cpp

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

#include <iostream>

#include <cstring> // для strcmp() и т.п.

using namespace std;

const int DAYS = 7; // число указателей на массив

int main()

{

void bsort(char**, int);// прототип

// массив указателей на char

char*arrptrs[DAYS] = {"Воскресенье ", "Понедельник", "Вторник ", "Среда ", "Четверг ", "Пятница ", "Суббота " };

cout << "\nНеупорядоченный:\n ";

for(int j = 0; j < DAYS; j++) // вывести неупорядоченные

// строки

cout << *(arrptrs + j) << endl;

bsort(arrptrs, DAYS); // сортировать строки

cout << "\nУпорядоченная:\n ";

for(j = 0; j < DAYS; j++) // вывести сортированные строки

cout << *(arrptrs + j) << endl;

return 0;

}

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

void bsort(char**pp, int n) // сортировать указатели на строки

{

void order(char**, char**); // прототип

int j, k; // индексы массива

for(j = 0; j < n - 1; j++) // внешний цикл

for(k = j + 1; k < n; k++)// внутренний цикл

order(pp + j, pp + k); // упорядочить содержимое

// указателей

}

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

void order(char**pp1, char**pp2) // сортирует два указателя

{ // если в первом строка больше

if(strcmp(*pp1, *pp2) > 0)// чем во втором

{

char*tempptr =*pp1; // обменять указатели

*pp1 =*pp2;

*pp2 = tempptr;

}

}

4. Верное решение: // ex10_4.cpp

// связный список включает в себя деструктор

#include <iostream>

using namespace std;

///////////////////////////////////////////////////////////

struct link // один элемент списка

{

int data; // элемент данных

link*next; // указатель на следующий элемент

};

///////////////////////////////////////////////////////////

class linklist // список ссылок

{

private:

link*first; // указатель на первый элемент

public:

linklist() // конструктор без аргументов

{ first = NULL; } // первого элемента нет

~linklist(); // деструктор

void additem(int d);// добавить элемент

void display(); // вывести все ссылки

};

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

void linklist::additem(int d) // добавление элемента данных

{

link*newlink = new link; // создать новую ссылку

newlink->data = d; // предоставить ей данные

newlink->next = first; // указывает на следующий элемент

first = newlink; // теперь первый указывает на него

}

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

void linklist::display() // вывод всех ссылок

{

link*current = first;// установить указатель на первый элемент

while(current != NULL) // выход по достижении последнего элемента

{

cout << endl << current->data;// вывести данные

current = current->next; // перейти к следующей ссылке

}

}

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

linklist::~linklist() // деструктор