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

Перегрузка сложения - C++

Восстановить пароль Регистрация
 
Valli1
4 / 4 / 0
Регистрация: 14.09.2012
Сообщений: 64
26.02.2013, 22:14     Перегрузка сложения #1
C++
1
2
3
4
5
6
7
8
9
10
11
12
Stonewt Stonewt::operator +(Stonewt &st){
Stonewt st1;
st1.stone=st.stone+stone;
st1.pds_left=st.pds_left+pds_left;
cout<<st1.pds_left<<endl;
if(st1.pds_left>lbs_per_stn){
int x=int(st1.pds_left)/lbs_per_stn;
st1.stone+=x;
st1.pds_left=st1.pds_left-x*lbs_per_stn;
st1.pds_left=int(st1.pds_left)%lbs_per_stn+st1.pds_left-int(st1.pds_left);}
st1.pounds=st.pounds+pounds;
return st1;}
Все работает за исключением "критических точек" если pds_left==lbs_per_stn то почему то выполняется оператор if(st1.pds_left>lbs_per_stn) ????Равенство непосредственно перед if проверял. И если к lbs_per_stn + 1, то в if не заходит.
Подскажите пожалуйста почему так.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
26.02.2013, 22:16
  #2

Не по теме:

чертногусломитвэтомкоде

Valli1
4 / 4 / 0
Регистрация: 14.09.2012
Сообщений: 64
26.02.2013, 22:55  [ТС]     Перегрузка сложения #3
Цитата Сообщение от Jupiter Посмотреть сообщение

Не по теме:

чертногусломитвэтомкоде

А, что вам не понятно?
Есть 2 единицы стоуны и фунты. в 1м стоуне 14 фунтов. pds_left это число от 0 до 14, когда pds_left=14, то происходит преобразование в 1 стоун. Напр. 1 стоун 14 фунтов==2 стоуна и 0 фунтов.pds_left нужен для отражения значений таких как напр. 3 стоуна 13.9 фунтов.

Добавлено через 7 минут
Случайно не так подписал надо pds_left,исправил.

Добавлено через 15 минут
C++
1
2
3
4
5
6
7
8
9
10
11
Stonewt Stonewt::operator +(Stonewt &st){
Stonewt st1;
st1.stone=st.stone+stone;//Суммирование стоунов
st1.pds_left=st.pds_left+pds_left;//Суммирование фунтов которых не хватило для получения стоуна
if(st1.pds_left>lbs_per_stn){//Цикл переводящий округлившиеся(до 14(стоун)) фунты в стоуны.
int x=int(st1.pds_left)/lbs_per_stn;
st1.stone+=x;
st1.pds_left=st1.pds_left-x*lbs_per_stn;
st1.pds_left=int(st1.pds_left)%lbs_per_stn+st1.pds_left-int(st1.pds_left);}
st1.pounds=st.pounds+pounds;//Сложение фунтов
return st1;}
Добавлено через 6 минут
C++
1
2
3
if(st1.pds_left>lbs_per_stn){
st1.pds_left=st1.pds_left-lbs_per_stn;
st1.stone++;}
Можно этот if и так сделать, но вопрос от этого не меняется.
anoise
2 / 2 / 0
Регистрация: 11.02.2013
Сообщений: 8
26.02.2013, 23:28     Перегрузка сложения #4
Написал проверочную программку... если pds_left == lbs_per_stn (в данном случае оба 14), то у меня if не выполняется... или я что то не так понял.
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
#include <iostream>
 
using std::cout;
using std::endl;
using std::cin;
 
class Stonewt{
 
 
 
private:
    double stone;
    double pds_left;
    int lbs_per_stn;
    double pounds;
 
public:
    Stonewt operator +(Stonewt &st);
    
    Stonewt(double st = 0, double pd = 0, int lb = 14, double p = 0 ): stone(st), pds_left(pd), lbs_per_stn(lb), pounds(p)
    {
        cout << "Constructor!" << endl;
    }
 
 
};
 
Stonewt Stonewt::operator +(Stonewt &st)
 
{
    Stonewt st1;
    
    st1.stone=st.stone+stone;
    st1.pds_left=st.pds_left+pds_left;
    
    cout<<st1.pds_left<<endl;
    
    if(st1.pds_left > lbs_per_stn)
    {
        int x=int(st1.pds_left)/lbs_per_stn;
        st1.stone+=x;
        st1.pds_left=st1.pds_left-x*lbs_per_stn;
        st1.pds_left=int(st1.pds_left)%lbs_per_stn+st1.pds_left-int(st1.pds_left);
    }
        st1.pounds=st.pounds+pounds;
    
        return st1;
}
 
 
int main()
{
    Stonewt stA(4,14,14,6);
    Stonewt stB(1,0,14,4);
    Stonewt stC;
    
    stC = stA + stB;
    system("pause");
 
    return 0;
 
}
Valli1
4 / 4 / 0
Регистрация: 14.09.2012
Сообщений: 64
27.02.2013, 21:36  [ТС]     Перегрузка сложения #5
Вы там все перетасовали. Попробуйте вот-так. Все работает, можете передрать прямо отсюда.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
using namespace std;
class Stonewt{private:
enum {lbs_per_stn=14}; int stone; double pds_left; double pounds;char mode;
public:
Stonewt (double lbs,char ch='p');//констр. в фунтах
Stonewt();
 ~Stonewt();
operator int()const;
operator double()const;
Stonewt operator +(Stonewt &st);
friend ostream & operator << (ostream & os,Stonewt & st);
};
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
#include "Stownet.h"
#include <iostream>
using namespace std;
 
Stonewt::Stonewt(double lbs,char ch){
mode=ch;
if(mode=='s'){
stone=int(lbs);
pds_left=0;
pounds=lbs*lbs_per_stn;}
else if(mode=='p'){
stone=int(lbs)/lbs_per_stn; 
pds_left=int(lbs)%lbs_per_stn+lbs-int(lbs);
pounds=lbs;}
else {
stone=pds_left=pounds=0;mode='p';}}
Stonewt::Stonewt(){stone=pds_left=pounds=0.0;mode='p';}
Stonewt::~Stonewt(){}
Stonewt::operator int()const
{return int(pounds+0.5);}
Stonewt::operator double()const{return pounds;}
Stonewt Stonewt::operator +(Stonewt &st){
Stonewt st1;
st1.stone=st.stone+stone;
st1.pds_left=st.pds_left+pds_left;
if(st1.pds_left>lbs_per_stn){
st1.pds_left=st1.pds_left-lbs_per_stn;
st1.stone++;}
st1.pounds=st.pounds+pounds;
return st1;}
ostream & operator<<(ostream & os,Stonewt & st){
{
os<<"stone:"<<st.stone<<" and "<<st.pds_left<<" pounds: "<<st.pounds<<endl;}
return os;}
C++
1
2
3
4
5
6
7
8
9
10
#include "Stownet.h"
#include <iostream>
using namespace std;
 
int main(){
Stonewt stw(0.5,'p');//И измените на 0.4
Stonewt stw1(13.6,'p');
Stonewt stw2=stw+stw1;
cout<<stw2;
system("pause");}
Добавлено через 21 час 30 минут
[QUOTE=anoise;4186132]Написал проверочную программку... если pds_left == lbs_per_stn (в данном случае оба 14), то у меня if не выполняется... или я что то не так понял.
У меня выполняется. Не выполняется при int(pds_left).Сравниваются 2 разных типа, сравнивает у меня не корректно, почему?
Yandex
Объявления
27.02.2013, 21:36     Перегрузка сложения
Ответ Создать тему
Опции темы

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