Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Конвертер текстового файла http://www.cyberforum.ru/cpp-beginners/thread439174.html
Добрый день!!! Простите за наглость... Помогите пожалуйста написать программу-конвертер текстовых файлов из dos в windows и обратно. С командной строки должно вводится направление /d или /w. Я очень мало в этом понимаю. Заранее спасибо!!!
C++ Проблема с libmms - ошибка при компиляции. Здравствуйте. Уже который день не могу разобраться с упомянутой в заголовке библиотекой, а именно: пишу примерно такой тестовый код #include <iostream> #include <libmms/mms.h> int main() { mms_t *stream; char mms_link="mms://audio.rfn.ru/radiorus/audio/710/90.asf"; stream=mms_connect(0, 0, mms_link, 128); http://www.cyberforum.ru/cpp-beginners/thread439169.html
C++ Привет. Как можна найти с даного примера умножение элементов массива с четными номерами?
#include "stdafx.h" #include <stdlib.h> #include <stdio.h> #include <conio.h> #include <iostream> using namespace std; int main(int argc, _TCHAR* argv)
C++ Начало DEV С++
Здравствуйте, подскажите где ошибка? Задание Даны действительные числа х, у . Если х, у отрицательные то каждое значение заменить его модулем; если отрицательное только одно из них, то оба значения увеличить на 0.5; если оба значения не отрицательные и ни одно из них не принадлежат отрезку , то оба значения уменьшить в 10 раз; в остальных случаях х, у оставить без изменения. Решение ...
C++ Запись текста в файл http://www.cyberforum.ru/cpp-beginners/thread439138.html
Нужно составить прогрумма которая создает файл и записывает в него текст. Программа не записывает в файл текст после пробела, помогите пожалуйста. char name; char text; cout<<"vvedite put' i im9 faila:\n"; cin>>name; ofstream out(name); cout<<"vvedite text:\n"; cin>>text; out<<text; out.close();
C++ allocator std::map Подскажите вопрос, есть тестовое задание: Написать allocator для std::map, располагающий элементы контейнера последовательно в памяти. Подскажите где про это почитать и разъясните по-возможности, что это вообще такое (std::map я вкурсе что это контейнер и как с ним работать) в ступор вводит allocator подробнее

Показать сообщение отдельно
iAndrew5
0 / 0 / 0
Регистрация: 19.04.2014
Сообщений: 7
15.05.2014, 14:00     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++"
Цитата Сообщение от Kins Посмотреть сообщение
Глава 8 Упражнение №9
Кликните здесь для просмотра всего текста
Мне кажется это Неверное решение! Вы сами себя обманули. Доступ к массиву класса arr[LIMIT] свободный из функции класса getin(). Проверка не выполняется. Функцию int& operator[](int n) вообще можно исключить и результат работы программы будет тот же. Ввод и вывод элементов массива должен происходить вне класса, в функции main(), как было в примере arrover3. Автор ведь не просто так это делал в main(). В этом случае проверка индекса необходима и работает.
Мой вариант реализации упражнения :
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <conio.h>
using namespace std;
#include <process.h>      // для функции exit
const int LIMIT = 100;    // размер массива
///////////////////////////////////////////////////////////
class safearray
{
private:
    int arr[LIMIT];
    int low, high;
public:
    safearray() : low(0), high(0)
    {}
    safearray(int n, int m) : low(n), high(m)
    {}
    // обратите внимание, что функция возвращает ссылку!
    int& operator[](int n)
    {
        if (n < low || n >= high)
        {
            cout << "\nОшибочный индекс!"; 
            _getch(); // Не обязательно. Просто чтобы увидеть что произошло.
            exit(1);
        }
        return arr[n];
    }
};
///////////////////////////////////////////////////////////
int main()
{
    setlocale(LC_CTYPE, "russian");
    int low, high, size;
    int realsize;
    cout << "Введите нижнюю границу массива : "; cin >> low;
    cout << "Введите верхнюю границу массива : "; cin >> high;
    safearray sa(low, high);
    realsize = high - low;
    if (realsize > LIMIT)
    {
        cout << "Максимальный размер массива: 100 элементов!!!"; _getch();
        exit(1);
    }
    // задаем значения элементов
    for (int j = low; j < high; j++)
        sa[j] = j * 10;    // используем функцию слева от знака =
 
    // показываем элементы
    for (int j = low; j < high; j++)
    {
        int temp = sa[j];  // используем функцию справа от знака =
        cout << "Элемент " << j << " равен " << temp << endl;
    }
    _getch();
    return 0;
}


Не претендую на истину в 100% инстанции! ))) Вариантов реализации может быть много. Это просто моё видение.
С уважением,
Андрей

Добавлено через 21 час 45 минут
Цитата Сообщение от Kins Посмотреть сообщение
Глава 8 Упражнение №12
Кликните здесь для просмотра всего текста
Кликните здесь для просмотра всего текста
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
Код C++
 
using namespace std;
//////////////////////////////////////////////////////////////////////
class sterling
{
private:
 long ft;
 int sh;
 int pn;
public:
 sterling()
 {ft=0, sh=0, pn=0;}
 sterling(long f, int s, int p):ft(f), sh(s), pn(p)
 {}
 void showster()
 {cout <<"\x9C" <<ft <<"." <<sh <<"." <<pn <<endl;}
 sterling(double FT)//преобразование дабл в стерлинг
 {
 FT/=50;
 ft=(long)FT;
 sh=(int)((FT-ft)*20);
 pn=(int)((((FT-ft)*20)-sh)*12);
 }
 long getFnt()const
 {return ft;}
 int getShg()const
 {return sh;}
 int getPen()const
 {return pn;}
};
//////////////////////////////////////////////////////////////////////
class bMoney
{
private:
 long double money;
public:
 bMoney()
 {money=0.0;}
 bMoney(long double m):money(m)
 {}
 operator long double()//преобразование bMoney в long double
 {return money;}
 void showMoney()
 {cout <<money <<endl;}
 bMoney(sterling ss)//преобразование sterling в bMoney
 {
 long ft=ss.getFnt();
 int sh=ss.getShg();
 int pn=ss.getPen();
 money=((ft*240+sh*12+pn)/240.0)*50;
 }
};
//////////////////////////////////////////////////////////////////
int _tmain(int argc, _TCHAR* argv[])
{
 setlocale(LC_ALL,"");
 sterling s(7,8,5);
 bMoney d(371.042);
 bMoney b=s;
 b.showMoney();//вывод преобразования sterling в bMoney
 sterling st=d;
 st.showster();//вывод преобразования bMoney в sterling
 system("pause");
 return 0;
}
Функция присвоения работает здесь только в явном виде. Т.е. bMoney b=s; можно записать и так bMoney b; а затем присвоить b = s; Это работает, а вот наоборот уже проблема!!! Т.е. sterling st=d; работает, а в неявном виде не работает т.е. запись: sterling st; а затем st = d; не работает!!! А должна. Должна быть возможность присваивать объекты классов bMoney = sterling и наоборот sterling = bMoney при помощи знака "="; Ошибка в том,что Вы пытаетесь использовать конструктор в обоих случаях...А должен быть конструктор с одним параметром и операция преобразования. Смотрите мой вариант.
Кликните здесь для просмотра всего текста
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
77
78
79
80
81
82
83
84
85
86
87
88
#include <iostream>
#include <conio.h>
#include <iomanip>
 
using namespace std;
char dummychar = '.';
const int SIZE = 30;
 
class sterling
{
private:
    long pounds;
    int shilling;
    int penny;
public:
    sterling() : pounds(0), shilling(0), penny(0) {}
    sterling(long pnd, int shlg, int pnc) : pounds(pnd), shilling(shlg), penny(pnc) {}
    
    long getf() const { return pounds;} // Обеспечивает доступ конструктору bmoney с одним параметром к полю pounds класса sterling
    int getsh() const { return shilling;} // Обеспечивает доступ конструктору bmoney с одним параметром к полю shilling класса sterling
    int getp() const { return penny; } // Обеспечивает доступ конструктору bmoney с одним параметром к полю penny класса sterling
    void putSterling() { cout << " GBP " << pounds << dummychar << shilling << dummychar << penny << endl; }
    void getSterling() { cin >> pounds >> dummychar >> shilling >> dummychar >> penny; }
    
};
 
 
class bmoney
{
private:
    long double lmoney;
public:
    bmoney() : lmoney(0) { }             // конструктор
    bmoney(long double m) : lmoney(m) {}
    operator long double() { return lmoney; } //преобразование bMoney в long double
    void display() { cout << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setprecision(3) << "\n" <<"$ "<< lmoney << endl; }
 
    bmoney(sterling st) //конструктор с одним параметром. Преобразование sterling в bmoney
    {
        long pounds = st.getf();
        int shilling = st.getsh();
        int penny = st.getp();
        long double result = 0;
        result = static_cast<long double>(((pounds * 20 + shilling) * 12 + penny)) / 240;
        lmoney = result * 50;
    }
    
    operator sterling() const // Операция преобразования ( bmoney -----> sterling )
    {
        long double decpounds = lmoney;
        decpounds /= 50;
        double decfrac;
        long pounds = static_cast<long>(decpounds);
        decfrac = decpounds - pounds;
        int shilling = static_cast<int> (decfrac * 20);
        int penny = static_cast<int>((decfrac * 20 - shilling) * 12);
        return sterling(pounds, shilling, penny);
    }
    //****************************************************************************************************
    void getlmoney() // Ввод переменной LMONEY
    {
        do{
            cout << "Введите сумму в долларах : ";
            cin >> lmoney;
            if (lmoney > 9999999999999990.00 / 2) cout << " Number is too big !!!Input correct number! " << endl;
        } while (lmoney > 9999999999999990.00 / 2);
    }
    //****************************************************************************************************
};
 
int main()
{
    setlocale(LC_CTYPE, "Russian");
    sterling s1;
    bmoney d1, d2;
    cout << "Введите сумму стерлингов в старой системе (формат 10.10.10) : ";
    s1.getSterling();
    d2.getlmoney();
    d1 = s1; // Конверсия стерлинг в доллар
    cout << "Сумма долларов после конверсии стерлингов: ";
    d1.display(); // 
    sterling s2;
    s2 = d2; // Конверсия доллар в стерлинг*/
    cout << "Сумма стерлингов после конверсии долларов: ";
    s2.putSterling();
    _getch();
    return 0;
}


С Уважением,
Андрей
 
Текущее время: 07:47. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru