Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.69/978: Рейтинг темы: голосов - 978, средняя оценка - 4.69
16 / 17 / 0
Регистрация: 01.02.2012
Сообщений: 182
1

Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++"

01.02.2012, 17:47. Показов 191456. Ответов 322
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Хотя я и начинающий с++-шник. Хочу помочь другим людям. Здесь я буду выкладывать всё что мне удалось решить. В моих решениях будет много хедеров, делал я это в Dev C++. Ос Win 7 64 bit.

Начнём со второй главы:
Упражнение 1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream> 
 
using namespace std;
 
int main()
{
   setlocale(0,"Rus");
   float gallons, cufeet;
 
   cout << "Введите количество галоннов: \n";
   cin >> gallons;
   cufeet = gallons / 7.481;
   cout << "Еквивалент в футах = " << cufeet << endl;
    
   return 0;
}

Упражнение 2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream> 
#include <iomanip>
 
using namespace std;
 
int main()
{
   setlocale(0,"Rus");
   
    cout << 1990 << setw(8) << 135 << endl
           << 1991 << setw(8) << 7290 << endl 
           << 1992 << setw(8) << 11300 << endl
           << 1993 << setw(8) << 16200 << endl;
  
   return 0;
}

Упражнение 3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream> 
 
using namespace std;
 
int main() 
{
    setlocale(0,"Rus");
    int var = 10;
 
    cout << var << endl;      
    var *= 2;                 
    cout << var-- << endl;    
    cout << var << endl;      
    return 0;
}

Упражнение 4
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream> 
 
using namespace std;
 
int main() 
{
    setlocale(0,"Rus");
    cout<<"\nУ лукоморья дуб срубили\nКота на мясо порубили \nА по неведанным дорожкам\nШагали черти в босоножках\n"; 
    return 0;
}

Упражнение 5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream> 
#include <ctype.h>
 
using namespace std;
 
int main() 
{
    setlocale(0,"Rus");
    char ch;
    cin >> ch;
    cout << islower(ch);  // При вводе строчной буквы будет 2 при прописной 0. Но есть нюанс, поддерживаються только англ буквы 
    return 0;
}


Упражнение 6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream> 
 
using namespace std;
 
int main() 
{
    setlocale(0,"Rus");
 
    float a,b,c,d,f;
    cout << "Введите кол-во доларов"<<endl;
    cin >> f;
    b=f/1.487;
    c=f/0.172;
    a=f/0.584;
    d=f/0.00955;
    cout << f <<"доларов = "<< b<<" фунтов стерлинга"<<endl;
    cout << f <<"доларов = "<< c<<" франков"<<endl;
    cout << f <<"доларов = "<< a<<" немецких марок"<<endl;
    cout << f <<"доларов = "<< d<<" японских йен"<<endl;
    return 0;
}

Упражнение 7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream> 
#include <iomanip>
 
using namespace std;
 
int main() 
{
    setlocale(0,"Rus");
    double f,c;
    cout << "Введите количество градусов по Цельсию"<<endl;
    cin >> c;
    f=c*1.8+32;
    cout <<setprecision(3)<< f << " градусов по Фаренгейту "<< endl; // Регуляция кол-во символов после запятой
    return 0;
}

Упражнение 8
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream> 
#include <iomanip>
 
using namespace std;
 
int main() 
{
    setlocale(0,"Rus");
    long pop1=2425785, pop2=47, pop3=9761;       
 
    cout << setfill('.') <<setw(8) << "LOCATION" << setw(12) // Обратите внимание на одинарные кавычки
           << "POPULATION" << endl
           <<setw(8) << "Portcity" << setw(12) << pop1 << endl
           << setw(8) << "Hightown" << setw(12) << pop2 << endl
           << setw(8) << "Lowville" << setw(12) << pop3 << endl;
    return 0;
}

Упражнение 9

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream> 
 
using namespace std;
 
int main() 
{
    setlocale(0,"Rus");
    char dummychar;
    double a,b,c,d,e,f;
    cout << "Введите а и b"<< endl;
    cin >>a>>dummychar>>b;
    cout << "Введите c и d"<<endl;
    cin >>c>>dummychar>>d;
    cout <<(b*c)+(d*a)<<dummychar<<(b*d)<<endl;
 
    return 0;
}

Упражнение 10 (Намучился с этой задачей)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream> 
 
using namespace std;
 
int main() 
{
    setlocale(0,"Rus");
    float a,b,c,f;
    cout << "Введите количество фунтов"<<endl;
    cin >> a;
    cout << "Введите количество шиллингов"<<endl;
    cin >> b;
    cout << "Введите количество пенсов"<<endl;
    cin >> c;
    f = a+(b+c/12)/20;
    cout << "Количество фунтов = " << f << endl;
    return 0;
}

Упражнение 11
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream> 
#include <iomanip>
 
using namespace std;
 
int main() 
{
     setlocale(0,"Rus");
     cout << setiosflags(ios::left) <<setw(15) << "Фамилия"<< setw(15)<< "Имя"<<setw(15) << "Адресс"<<setw(15)<< "Город"<<endl
            <<setw(15)<< "Иванов"<<setw(15)<<"Петя"<<setw(15)<<"Кленовая 16"<<setw(10)<<"Москва"<<endl
            <<setw(15)<< "Иванов"<<setw(15)<<"Петя"<<setw(15)<<"Кленовая 16"<<setw(10)<<"Москва"<<endl
            <<setw(15)<< "Иванов"<<setw(15)<<"Петя"<<setw(15)<<"Кленовая 16"<<setw(10)<<"Москва"<<endl;
    return 0;
}

Упражнение 12 (это самая геморная программа на разработку которой ушло больше дня)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream> 
 
using namespace std;
 
int main() 
{
setlocale(0,"Rus");
float a,b,z;
int c,k;
cout << "Введите кол-во футов " << endl;
cin >> a;
c = static_cast<int>(a);
b = a - c;
b *= 20;
k = static_cast<int>(b);
z = b - k;
z = z*12;
z = static_cast<int>(z);
k = static_cast<int>(k);
cout << c <<"."<< k <<"."<< z << endl;
return 0;
}
Это конец второй главы, третюю сделаю позже если будет нужна
 Комментарий модератора 
Пост обновлен по просьбе ТС
13
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.02.2012, 17:47
Ответы с готовыми решениями:

Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++"
Мне надо решение упражнений из книги Р. Лафоре &quot;Объектно-ориентированное программирование в С++&quot;....

Ищу ответы на задания из книги Лафоре Р. "Объектно-ориентированное программирование в С++" 4 издание.
Дошел до 10 главы, из каждой главы делал все 12 заданий, хочу проверить правильно ли я их делал. И...

Роберт Лафоре, "Объектно-ориентированное программирование на C++"
Здравствуйте, хотелось бы узнать мнение по поводу этой книги: стоит ли читать, или поискать другую?

Объектно-ориентированный анализ, Объектно-ориентированное проектирование, Объектно-ориентированное программирование
Моё задание: Система Авиакомпания. Авиакомпания имеет список рейсов. Диспетчер формирует летную...

322
261 / 111 / 53
Регистрация: 22.01.2017
Сообщений: 448
13.12.2018, 12:20 301
Author24 — интернет-сервис помощи студентам
Achill, видимо он хотел добиться этого:
C++
1
2
3
4
else {
    strcpy(str, s);
    String(str);
}
Как я уже сказал, все зависит от компилятора.
Если задача была инициализировать базовый класс, то ошибка, я в начале не обратил должного внимания.
Цитата Сообщение от Achill Посмотреть сообщение
И мое условия правильное как и задумывал автор поставить в конце нуль-терминатор.
Условие заключается в том что когда массив дойдет до конца то оно будет верным и добавится в конец ноль в этом заключается смысл условия
С этим все равно не согласен, можете вывод чего-либо вставить в условие, это сравнение не выполнится.

Добавлено через 23 минуты
Только заметил про условие, лучше тогда так:
C++
1
2
3
4
int j;
for(j = 0; j < SZ - 1; j++)
    str[j] = s[j];
str[j] = '\0';
Я вот подумал может это осознанно допущенные ошибки, может дальше автор пояснит...
А если нет, в печку книгу с таким количеством опечаток
0
0 / 0 / 0
Регистрация: 26.04.2017
Сообщений: 37
13.12.2018, 12:45 302
Нет нет это задания и первые три упражнения имеют решение в конце книги, при чем в англ версии тоже самое с теми же ошибками.

C++
1
2
3
4
int j;
for(j = 0; j < SZ - 1; j++)
    str[j] = s[j];
str[j] = '\0';
Изначально так и делал но это выдает ошибку
"error: 'j' was not declared in this scope"
По этому и создал с условием отдельным просто не правильно написал, а предполагал то именно сравнить с последним индексом.

C++
1
2
3
4
else {
    strcpy(str, s);
    String(str);
}
Вот так вот вроде бы работает как надо!
Теперь мне надо понять что значит "String(str);" ??? тут создается временный объект который получает str и что дальше куда? или это конструктор который получает str?(это же не возможно) или создается объект str? (и дальше с ним что?)

Добавлено через 12 минут
Хотя нет
C++
1
2
3
4
else {
    strcpy(str, s);
    String(str);
}
это работает только иза strcpy(str, s);

А String(str); тут лишнее получается, или зачем оно ? и у автора оно зачем? что это такое?
0
261 / 111 / 53
Регистрация: 22.01.2017
Сообщений: 448
13.12.2018, 13:17 303
Цитата Сообщение от Achill Посмотреть сообщение
А String(str); тут лишнее получается, или зачем оно ? и у автора оно зачем? что это такое?
Ошибка, раз никакого посыла не было. Условия else там и не должно быть:
C++
1
2
3
4
5
6
7
8
9
Pstring::Pstring(char s[]) : String(s)
{
    if(strlen(s) > SZ - 1){
        int j;
        for(j = 0; j < SZ - 1; j++)
            str[j] = s[j];
        str[j] = '\0';
    }
}
0
Nishen
13.12.2018, 13:23
  #304

Не по теме:

Кто читает Лафоре в 2018 году? Книга устарела морально.

0
0 / 0 / 0
Регистрация: 26.04.2017
Сообщений: 37
13.12.2018, 13:35 305
Условие else обязательно, если инициализировать в списке инициализации конструктора-наследника то строка в любом случае будет отправлена в базовый класс в данном случае в его конструктор и выйдет за пределы массива чего быть не должно.
Строка должна копироваться полностью если она в пределах массива это в случае с else.
А если превышает массив то должно копироваться только та часть которая входит в пределы массива, это в классе наследнике в цикле for
И так не сработает, я это выше уже написал.
C++
1
2
3
for(j = 0; j < SZ - 1; j++)
            str[j] = s[j];
        str[j] = '\0';
Потому что в последней строке, "j" находится вне области видимости цикла for.
0
261 / 111 / 53
Регистрация: 22.01.2017
Сообщений: 448
13.12.2018, 14:10 306
Achill, лучше это условие в конструкторе String прописать:
C++
1
2
3
4
5
6
7
8
9
10
11
String(char s[]) { if(strlen(s) < SZ) strcpy(str, s); }
 
Pstring::Pstring(char s[]) : String(s)
{
    if(strlen(s) > SZ - 1){
        int j; // Вне цикла
        for(j = 0; j < SZ - 1; j++)
            str[j] = s[j];
        str[j] = '\0';
    }
}
Добавлено через 10 минут

Добавлено через 4 минуты
И самое смешное то что здесь наследование и не нужно )
0
0 / 0 / 0
Регистрация: 26.04.2017
Сообщений: 37
13.12.2018, 14:19 307
Спасибо, ну можно и так, но там объясняется принцип ООП в книге такой что нужно использовать базовый класс без особых изменений только лишь спецификаторы доступа менять.
И в базовом классе в конструкторе уже есть "strcpy(str, s);" только проверки не было, по этому там по заданию и надо создать класс наследник в котором будет реализована проверка на предел массива, без изменений базового класса(только спецификаторы доступа менять).
0
261 / 111 / 53
Регистрация: 22.01.2017
Сообщений: 448
13.12.2018, 14:44 308
Понятно. Тогда получается что базовый класс плохо реализован. Я лично запутался и тупанул несколько раз...
0
0 / 0 / 0
Регистрация: 26.04.2017
Сообщений: 37
13.12.2018, 14:50 309
Ну базовый класс специально так реализован в раннем упражнении, а в этом упражнении надо это исправить таким образом. В задании об этом и упоминается что в базовом классе нет проверки на выход за пределы массива.
0
0 / 0 / 0
Регистрация: 26.04.2017
Сообщений: 37
17.12.2018, 15:35 310
Интересует задание 8 главы 9
мне не совсем понятно что предлагает сделать автор
"Для получения лучшего результата используйте в этих функциях возврат по ссылке, чтобы они могли быть использованы с левой стороны знака "равно" дли изменения части существующей строки."
Вариант решения который здесь существует на 3 странице не компилируется с ошибкой "error: invalid initialization of non-const reference of type 'Pstring2&' from an rvalue of type 'Pstring2'|"
,а так же я нашел обсуждение этой задачи здесь
Метод класса слева от знака равно
этот вариант тоже не компилируется(с такой же ошибкой), а то что там предложили ниже " return *(str+n);" это работает НО по книге на данном этапе указатели и их разыменование еще не изучались по этому скорее всего это задание надо решить как-то по другому?
[attach]
"В некоторых компьютерных языках есть операции, с помощью которых можно выделить часть строки и присвоить ее другой строке. Используя наследование, добавьте такую возможность в класс Pstring из упражнения 2. В новом производном классе Pstring2 разместите три новых функции left(), mid() и right().
s2.left(s1, n);
s2.mid(s1, s, n);
s3.right(s1, n);
Вы можете использовать цикл for для копирования символ за символом подходящих частей строки s1 во временный объект класса Pstring2, который затем их возвратит. Для получения лучшего результата используйте в этих функциях возврат по ссылке, чтобы они могли быть использованы с левой стороны знака "равно" дли изменения части существующей строки."[/attach]
0
0 / 0 / 0
Регистрация: 22.05.2016
Сообщений: 14
07.05.2019, 19:52 311
Доброго времени суток!
Решая упражнение 12.7 наткнулся на ошибку
error LNK2001: неразрешенный внешний символ ""private: static class std::basic_fstream<char,struct std::char_traits<char> > Name::namestream" (?namestream@Name@@0V?$basic_fstream@DU?$char_traits@D@std@@@std@@A)"

Может кто подсказать что не так?
Вот код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>
#include <windows.h>
 
using namespace std;
 
class Name
{
    string name;
    unsigned long number;
    static fstream namestream;
 
public:
 
    static void openStream()
    {  namestream.open("text.txt", ios::trunc | ios::in | ios::out); }
    
    void getName()
    {
        char ch(0);
        do
        {
            cout << "Введите имя и фамилию работника: ";
            getline(cin,name);
            cout << "Введите номер работника: ";
            cin >> number;
            namestream << name << "\n" << number << "\n";
            cout << "Продолжить ввод? [y]es/[n]o " << endl;
            cin >> ch;
            cin.clear(); //если был не правильный ввод, очищаем поток, делая его вновь работоспособным
            cin.sync(); //очистка всех непрочитанных символов из cin
        } while (ch != 'n');
    }
    
    void putName()
    {
        namestream.seekg(0);
        while (getline(namestream,name))
        {
            cout << name << "\t";
            namestream >> number;
            cout << number << endl;
            namestream.ignore(1); //игнорируем символ переноса строки после номера
        }
        namestream.close();
    }
 
    void putName(int pos)
    {
        Name temp;
 
        for (int i = 0; i < pos; i++)
        { namestream >> temp.name >> temp.number; }
 
        cout << "Позиция " << pos << ": " << temp.name << "\t" << temp.number << endl;
    }
 
};
 
int main(int argc, char* argv[])
{
    setlocale(LC_ALL, "RUS");
 
    Name* name = new Name;
 
    name->openStream();
 
    name->getName();
    name->putName();
    name->putName(2);
 
    system("pause");
    return 0;
}
0
6107 / 3461 / 1406
Регистрация: 07.02.2019
Сообщений: 8,794
07.05.2019, 19:55 312
после описания класса инициализация нужна
C++
1
fstream Name::namestream;
0
0 / 0 / 0
Регистрация: 22.05.2016
Сообщений: 14
08.05.2019, 05:21 313
Премного благодарен!
0
0 / 0 / 0
Регистрация: 22.02.2015
Сообщений: 9
20.06.2019, 01:06 314
А разве это задание не нужно выполнять с массивом char[SIZE] ?, я так и не смог решить эту задачу с массивом char[SIZE]
пришлось продолжить, и оставить на время решение этих задач, они в 7 и 8 главе встречаются вроде.
со string уже решал но с char[SIZE] увы так и не смог.
0
368 / 179 / 56
Регистрация: 13.05.2020
Сообщений: 331
05.11.2020, 12:11 315
Может пригодится кому.

Глава 15 упражнение 12 (или 11)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iterator>
#include <fstream>
#include <iostream>
#include <Windows.h>
using namespace std;
//////////////////////////////////////////////////
int main ()
{
    setlocale(LC_ALL, "Russian");
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    
    char imyavh[30], imyavih[30];
    int ch;
    
    cout << "\nИмя файла для считывания: ";
    cin >> imyavh;
    cin.ignore(10, '\n');
    cout << "\nИмя файла для записи: ";
    cin >> imyavih;
    cin.ignore(10, '\n');
    
    ifstream infile(imyavh);
    
    istream_iterator<int> citer(infile);
    
    ofstream outfile(imyavih, ios::trunc);
    
    ostream_iterator<int> ositer(outfile,  " ");
    
//  istream_iterator<int> end_of_stream;
    
    while (!infile.eof())       //или написать сравнение (citer != end_of_stream)
    {
        ch = *citer;
        *ositer = ch;
        citer++;
        ositer++;   
    }
    
    cout << endl;
    system("pause");
    return 0;
}
0
1352 / 851 / 365
Регистрация: 26.02.2015
Сообщений: 3,799
06.11.2020, 00:10 316
Цитата Сообщение от Tanya2007 Посмотреть сообщение
Может пригодится кому.
Читать Лафоре в 2020 году - очень нерекомендуемо.
0
0 / 0 / 0
Регистрация: 25.07.2020
Сообщений: 36
20.01.2021, 01:35 317
Цитата Сообщение от Nishen Посмотреть сообщение
Читать Лафоре в 2020 году - очень нерекомендуемо.
Почему? База языка там изложена неплохо и почти весь код рабочий и сегодня.
И что тогда читать?
0
18842 / 9841 / 2409
Регистрация: 30.01.2014
Сообщений: 17,284
20.01.2021, 08:05 318
Цитата Сообщение от realalexandro Посмотреть сообщение
И что тогда читать?
Лучше всего Липпман "Язык программирования C++. Базовый курс".

Добавлено через 3 минуты
Цитата Сообщение от realalexandro Посмотреть сообщение
База языка там изложена неплохо
База языка там изложена отвратительно, и вы просто напросто испортите себе восприятие базовых языковых концепций.
Написано там может быть и неплохо стилистически, но с фактологической точки зрения книга плохая.
1
0 / 0 / 0
Регистрация: 25.07.2020
Сообщений: 36
20.01.2021, 09:46 319
Цитата Сообщение от DrOffset Посмотреть сообщение
Лучше всего Липпман "Язык программирования C++. Базовый курс".
Благодарю! А что вы думаете насчёт "Стивен Прата - Язык программирования C++"? Тоже старовата, конечно...
0
DrOffset
20.01.2021, 09:52     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++"
  #320

Не по теме:

Цитата Сообщение от realalexandro Посмотреть сообщение
А что вы думаете насчёт "Стивен Прата - Язык программирования C++"?
В основном дело не в старости, а в корректности.
Стивен Прата - достойный вариант, если Липпман по каким-либо причинам не подошел.

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.01.2021, 09:52

Ошибки в книги Р.Лафоре "Объектно-Ориентирование программирование в C++"
Добрый день всем присутствующим. Хотелось бы обсудить книгу Robert Lafore Object-Oriented...

Ориентированное программирование в С++ Р. Лафоре
Доброго времени суток форумчане! Хочу вот закинуть себе книгу &quot;Объектно-ориентированное...

Объектно-ориентированное программирование
Составить описание класса прямоугольников со сторонами, параллельными осям координат. Предусмотреть...

Объектно-ориентированное программирование
Друзья, прошу помощи, накопил кучу долгов по учёбе, совершенно нет времени разобраться с задачами,...

Объектно -ориентированное программирование
описать классы используя наследование Пар (масса, удельная теплота парообразования, количество...

Объектно-ориентированное программирование
Добрый вечер, помогите пожалуйста написать программу) Класс прямая(y=ax+b),члены класса...

Объектно-ориентированное программирование
Составить программу для игры в шахматы. Каждая уникальная шахматная фигура выступает в качестве...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
320
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru