您的位置:首页 > 其它

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

2017-04-25 13:43 190 查看
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
d6dd
;
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  sdust