SDUST第6次实验,第7次作业

来源:互联网 发布:室内三维定位算法 编辑:程序博客网 时间:2024/06/10 15:13

new时, [] 和()的区别
不能返回函数的局部变量的引用, 如果真的要返回的话,那就返回值不要返回引用

ProblemA 矩阵的乘法
//一定注意,不能传局部变量的引用,会出问题的,
//返回值就传临时临时变量就可以

#include<iostream>using namespace std;class Matrix{public:    int hang_, lie_;    int num[50][50];    int flag;public:    Matrix():hang_(0), lie_(0), flag(1) {}    friend ostream &operator << (ostream &os, Matrix & A);    friend istream &operator >> (istream &is, Matrix & A);    Matrix operator + (Matrix& m)    {        Matrix mm;        if(hang_ == m.hang_ && lie_ == m.lie_)        {            mm.hang_ = hang_;            mm.lie_ = lie_;            for(int i = 0; i < hang_; i++)            {                for(int j = 0; j < lie_; j++)                    mm.num[i][j] = num[i][j] + m.num[i][j];            }        }        else mm.flag = 0;        return mm;    }    Matrix  operator * (Matrix & A)    {        Matrix B;        if(lie_ != A.hang_){B.flag = 0; return B;}        else{            B.flag = 1;            B.hang_ = hang_;            B.lie_ = A.lie_;            for(int i = 0; i < B.hang_; i++)            {                for(int j = 0; j < B.lie_; j++)                    B.num[i][j] = 0;            }            for(int i = 0; i < hang_; i++)            {                for(int j = 0 ; j < B.lie_; j++)                {                    for(int k = 0; k < lie_; k++)                        B.num[i][j] += (num[i][k] * A.num[k][j]);                }            }            return B;        }    }};ostream & operator << (ostream & os, Matrix & A){    if(A.flag == 1)    {    for(int i = 0; i < A.hang_; i++)    {        for(int j = 0; j < A.lie_; j++)            if( j == 0) os << A.num[i][j];            else os << " " <<A.num[i][j];        os << endl;    }}    else os << "Error" <<endl;    return os;}istream & operator >> (istream &is, Matrix & A){    is >> A.hang_ >> A.lie_;    for(int i = 0; i < A.hang_; i++)    {        for(int j = 0; j < A.lie_; j++)            is >> A.num[i][j];    }    return is;}int main(){    int cases, i;    cin>>cases;    for (i = 0; i < cases; i++)    {        Matrix A, B, C, D;        cin>>A>>B;        C = A + B;        D = A * B;        cout<<"Case "<<i + 1<<":"<<endl;        cout<<C<<endl;        cout<<D;    }    return 0;}

ProblemC:模板类
//形参传引用的时候就传常引用或者形参的临时变量吧,除非要进行改东西。

#include<iostream>#include<cstdio>#include<iomanip>using namespace std;template<class T>class Data{public:    Data():val_(0) {}    Data(T x):val_(x) {}    T getVal() {return val_; }    T  operator +(Data a)    {        return a.getVal() + val_;    }    bool  operator > (Data a)    {        if(val_ >a.getVal()) return true;        else return false;    }    bool  operator < (Data a)    {        if(val_ < a.getVal()) return true;        else return false;    }    friend ostream & operator << (ostream & os, Data &a) // 为什么不能传引用 //   friend ostream & operator << (ostream & os, Data a)    {        os << a.val_;        return os;    }    void setValue(T x)    {        val_ = x;    }//    friend ostream &operator<<(ostream &os, Data s){//        os<<fixed<<setprecision(2)<<s.getVal();//        return os;//     }    private:    T val_;};template< class T>class GetResult{public:    static Data<T> getSum(Data<T> *arr, int num){    T x = 0;    Data<T> sum;    for(int i = 0; i < num; i++)        x += arr[i].getVal();    sum.setValue(x);    return sum;    }    static Data<T> getMax(Data<T> *arr, int num){    T x = 0;    Data<T> maxx;    for(int i = 0; i < num; i++)    {        if(arr[i].getVal() > x)            x = arr[i].getVal();    }    maxx.setValue(x);    return maxx;    }    static Data<T> getMin(Data<T> *arr, int num){        T x = 2147483647;    Data<T> minn;    for(int i = 0; i < num; i++)    {        if(arr[i].getVal() < x)            x = arr[i].getVal();    }    minn.setValue(x);    return minn;    }};int main(){    Data<int> iData[1001];    Data<double> dData[1001];    int cases, num;    char ch;    int u;    double v;    Data<int> a(10), b(20);    Data<double> c(3.14), d(-4.1);    cout<<"a + b = "<<(a + b)<<endl;    cout<<"max(a, b) = "<<(a > b ? a : b)<<endl;    cout<<"min(a, b) = "<<(a < b ? a : b)<<endl;    cout<<"c + d = "<<(c + d)<<endl;    cout<<"max(c, d) = "<<(c > d ? c : d)<<endl;    cout<<"min(c, d) = "<<(c < d ? c : d)<<endl;    cin>>cases;    for (int i = 0; i < cases; i++)    {        cin>>ch;        cin>>num;        for (int j = 0; j < num; j++)        {            if (ch == 'i')            {                cin>>u;                iData[j].setValue(u);            }            else if (ch == 'd')            {                cin>>v;                dData[j].setValue(v);            }        }        if (ch == 'i')        {            cout<<GetResult<int>::getMax(iData, num);            cout<<" "<<GetResult<int>::getMin(iData, num);            cout<<" "<<GetResult<int>::getSum(iData, num)<<endl;        }        else if (ch == 'd')        {            cout<<GetResult<double>::getMax(dData, num);            cout<<" "<<GetResult<double>::getMin(dData, num);            cout<<" "<<GetResult<double>::getSum(dData, num)<<endl;        }    }    return 0;}

ProblemD: 线性表的应用

#include<iostream>using namespace std;class MyList{public:    MyList(int l): len_(l), cur_(0){e = new int(len_ + 1);}    void append(int d){        e[cur_] = d;        cur_++;    }    void insert(int p, int d){        for(int i = cur_; i >= p; i--)            e[i] = e[i - 1];        e[p] = d;        cur_++;    }    void erase(int p){        for(int i = p; i < cur_ - 1; i++)            e[i] = e[i + 1];        cur_--;    }    void set(int p, int d){e[p] = d;}    void show(){        for(int i = 0; i < cur_; i++)        {            if(i != 0)                cout << " ";            cout << e[i];}        cout << endl;    }public:    int *e;    int len_;    int cur_;};int main(){    int cases, len, data, pos;    char op;    cin>>len;    MyList myList(len);    cin>>cases;    for (int i = 0; i < cases; i++)    {        cin>>op;        switch (op)        {        case 'A':            cin>>data;            myList.append(data);            break;        case 'I':            cin>>pos>>data;            myList.insert(pos, data);            break;        case 'E':            cin>>pos;            myList.erase(pos);            break;        case 'S':            cin>>pos>>data;            myList.set(pos, data);        }        myList.show();    }    return 0;}
0 0