鍍金池/ 問答/C  C++/ 在main函數(shù)中的對象是這個值,進入調(diào)用成員函數(shù)值就改變了怎么回事?

在main函數(shù)中的對象是這個值,進入調(diào)用成員函數(shù)值就改變了怎么回事?

原來這樣的->
clipboard.png

然后我F10進入getDeltime函數(shù),t1和t2值改變了->

clipboard.png

#include <iostream>
#include <map>
#include <algorithm>
#include <string>
#include <vector>
#include <sstream>
#include <iomanip>

using namespace std;
stringstream ss;
int N;
vector<int> vrate(24);
double fee=0;



class Time
{
public:
    int a,b,c,d;
    Time(){}
    Time(Time& t)
    {
        a=t.a;
        b=t.b;
        c=t.c;
        d=t.d;
    }
    friend istream& operator>>(istream& is,Time &t)
    {
        string str;
        cin>>str;
        str.push_back(':');
        int i=0;
        string s1(&str[0],&str[2]);
        string s2(&str[3],&str[5]);
        string s3(&str[6],&str[8]);
        string s4(&str[9],&str[11]);
        ss<<s1;ss>>t.a;ss.clear();
        ss<<s2;ss>>t.b;ss.clear();
        ss<<s3;ss>>t.c;ss.clear();
        ss<<s4;ss>>t.d;ss.clear();

        return is;

    }
    void submin(int delMin)
    {
        if(d>delMin)
            d-=delMin;
        else
            subhour(1);
    }
    void subhour(int delHour)
    {
        if(c>delHour)
            c-=delHour;
        else
            b--;
    }
    void plusmin(int delMin)
    {
        if(delMin+d<60)
            d+=delMin;
        else
            plushour(1);

    }
    void plushour(int delHour)
    {
        if(delHour+c<24)
            c+=delHour;
        else
            b++;
    }
    bool operator<(const Time& t) const
    {
        if(a<t.a)
            return true;
        else if(a==t.a&&b<t.b)
            return true;
        else if(a==t.a&&b==t.b&&c<t.c)
            return true;
        else if(a==t.a&&b==t.b&&c==t.c&&d<t.d)
            return true;

        return false;
    }
    /*Time operator=(Time &t)
    {
        a=t.a;
        b=t.b;
        c=t.c;
        d=t.d;
    }*/
    friend ostream& operator<<(ostream& os,Time &t)
    {
        os<<setw(2)<<setfill('0')<<t.b<<":";
        os<<setw(2)<<setfill('0')<<t.c<<":";
        os<<setw(2)<<setfill('0')<<t.d;
        return os;
    }
    

};
class ARecord
{
public:
    string name;
    Time time;
    string mark;

    //ARecord(string na,Time be,Time ed,string ma):name(na),begin(be),end(ed),mark(ma){}

    ARecord(){}
    bool operator<(const ARecord &re) const
    {
        string name1=name,name2=re.name;
        if(name1<name2)
            return true;
        else if(name1==name2&&time<re.time)
            return true;

        return false;

    }

    friend ostream& operator<<(ostream& os,ARecord &t)
    {
        cout<<endl;
        os<<t.name<<" "<<t.time<<" "<<t.mark<<endl;
        return os;
    }
};

class FeeTime
{
public:
    Time t1,t2;
    FeeTime(Time &tt1,Time &tt2):t1(tt1),t2(tt2){}
    int getDelTime()   //獲得時間差,t的a,b,c,d表示 月,天,時,分
    {
        return t2.b*60*24+t2.c*60+t2.d-(t1.b*60*24+t1.c*60+t1.d);
    }
    double getFee()
    {
        double fee=0;
        int m_del_head=60-t1.d;
        fee+=m_del_head*vrate[t1.c];  //
        t1.submin(m_del_head);

        int m_del_tail=t2.d;
        fee+=m_del_tail*vrate[t2.c];//
        t2.submin(m_del_tail);

        int h_del=0,d_del=0;

        if(t1.c>t2.c)//
        {
            h_del=t1.c-t2.c;
            for(int i=t1.c;i!=t2.c;i++)
                fee+=vrate[i];
        }
        else
        {
            h_del+=24-t2.c;
            t2.b--;
            for(int i=t1.c;i!=24;i++)
                fee+=vrate[i];
        }

        d_del-=t2.a;
        fee+=d_del*355;  //
        return fee;

    }
};


int main()
{
    vector<int> vrate(24);
    int i=0;
    while(i<24)
    {
        cin>>vrate[i++];
    }


    cin>>N;
    i=0;
    vector<ARecord> db(N);
    string name;
    while(i<N)
    {
        cin>>name;
        db[i].name=name;
        cin>>db[i].time>>db[i].mark;
        i++;
    }

    int month=db[0].time.a;
    double fee=0;
    sort(db.begin(),db.end(),less<ARecord>());

    
    map<string, int> name_num;
    int j = 0;
    for (int i = 0; i < db.size(); i++)
    {
        auto iter = name_num.find(db[i].name);
        if (iter == name_num.end())
        {
            name_num.insert(pair<string, int>(db[i].name, 1));
        }
        else
            name_num[db[i].name]++;
    }
    name_num.begin()->second--;

    double totalamount=0;
    for(int i=1;i<db.size();)
    {
        int j=name_num[db[i].name];
        while(j>0&&i<db.size())
        {
            if(db[i-1].mark=="on-line"&&db[i].mark=="off-line")
            {
                FeeTime ft(db[i-1].time,db[i].time);
                cout<<db[i-1].name<<" ";
                cout<<setw(2)<<setfill('0')<<month<<endl;
                cout<<db[i-1].time<<" "<<db[i].time<<" ";
                cout<<ft.getDelTime()<<" "<<ft.getFee();
                cout<<endl;
                totalamount+=ft.getDelTime();
                i+=2;
                j-=2;

            }
            else{i++;j--;}
        }
        cout<<"Total amount:$"<<totalamount<<endl;
    }

    
    system("pause");
    return 0;
}

測試數(shù)據(jù)為->

10 10 10 10 10 10 20 20 20 15 15 15 15 15 15 15 20 30 20 15 15 10 10 10
10
CYLL 01:01:06:01 on-line
CYLL 01:28:16:05 off-line
CYJJ 01:01:07:00 off-line
CYLL 01:01:08:03 off-line
CYJJ 01:01:05:59 on-line
aaa 01:01:01:03 on-line
aaa 01:02:00:01 on-line
CYLL 01:28:15:41 on-line
aaa 01:05:02:24 on-line
aaa 01:04:23:59 off-line
回答
編輯回答
念舊

FeeTime的getFee改變了t2的值,同一行的cout里面,求值順序是未定義的。

2017年4月8日 08:36