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

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值