2023.4.16编程一小时打卡

一、问题描述:

线性代数里面我们学习过n维向量,请用类vector_N来封装n整型向量,成员如下;

私有数据成员: 向量维数nint指针 pint

公有函数成员:无参默认构造函数,在该函数中,将n0,将pnull;重载输入输出运算符,输入运算符,先指定向量维数,若输入为非正整数,则提示错误信息,Error Length!”然后退出程序,若维数输入正确则分配长度为n的动态内存,并用指针p指向该内存,输出运算符依次输出向量各元素即可;重载向量的加法+、减法-、数乘*(乘数在前,乘数为int型)这三运算符;重载[]运算,例如向量a=(1,2,3,4)a[0]的值为1,若下标越界,则输出Error Index”,然后退出程序;返回向量维数的函数;将两个向量的内积运算定义为vector_N的友元函数;在主函数中定义两个vector_N类对象v1v2,均不带参数,之后对两个对象进行输入赋值,输入数乘运算的乘数,输入待取元素的下标,对两个向量进行加、减、数乘和内积运算,并将结果输出,输出v1中对应下标对应的元素。加法、减法和内积运算先判断两向量维数是否一致,若一致则输出运算结果,否则输出错误提示信息“Mismatch Length!

二、解题思路:

1、先定义类,定义出成员数据。在定义出所需的成员函数。2、根据成员函数的作用去编写成员函数的作用。3、根据题目问题描述以及输入输出的数据及方式进行主函数的编写。4、调试运行。

三、代码实现:

 

  1 #include<iostream>
  2 #include<string>
  3 using namespace std;
  4 class vector_N
  5 {
  6 private:
  7     int n;
  8     int *p;
  9 public:
 10     vector_N():n(0),p(NULL){}
 11     friend istream & operator>>(istream &put,vector_N &v);
 12     friend ostream & operator<<(ostream &out,vector_N &v);
 13     vector_N operator+(vector_N &v);
 14     vector_N operator-(vector_N &v);
 15     friend vector_N operator*(int s,vector_N &v);
 16     int operator[](int a);
 17     friend int neiji(vector_N a,vector_N b);
 18     int ren(vector_N v)
 19     {
 20         return v.n;
 21     }
 22 };
 23 istream & operator>>(istream &put,vector_N &v)
 24 {
 25     put>>v.n;
 26     if(v.n<=0)
 27     {
 28         cout<<"Error Length!";
 29     }
 30     else
 31     {
 32         v.p=new int[v.n];
 33         for(int i=0;i<v.n;i++)
 34         {
 35             put>>v.p[i];
 36         }
 37     }
 38     return put;
 39 }
 40 ostream & operator<<(ostream &out,vector_N &v)
 41 {
 42     out<<"(";
 43     for(int i=0;i<v.n;i++)
 44     {
 45         out<<v.p[i]<<", ";
 46     }
 47     out<<")";
 48     return out;
 49 }
 50 vector_N vector_N::operator+(vector_N &v)
 51 {
 52     vector_N b;
 53     b.n=v.n;
 54     b.p=new int[v.n];
 55     for(int i=0;i<v.n;i++)
 56     {
 57         b.p[i]=p[i]+v.p[i];
 58     }
 59     return b;
 60 }
 61 vector_N vector_N::operator-(vector_N &v)
 62 {
 63     vector_N b;
 64     b.n=v.n;
 65     b.p=new int[v.n];
 66     for(int i=0;i<v.n;i++)
 67     {
 68         b.p[i]=p[i]-v.p[i];
 69     }
 70     return b;
 71 }
 72 vector_N operator*(int s,vector_N &v)
 73 {
 74     vector_N b;
 75     b.n=v.n;
 76     b.p=new int[v.n];
 77     for(int i=0;i<v.n;i++)
 78     {
 79         b.p[i]=s*v.p[i];
 80     }
 81     return b;
 82 }
 83 int vector_N::operator[](int a)
 84 {
 85     return p[a];
 86 }
 87 int neiji(vector_N a,vector_N b)
 88 {
 89     int sum=0;
 90     for(int i=0;i<a.n;i++)
 91     {
 92         sum+=a.p[i]*b.p[i];
 93     }
 94     return sum;
 95 }
 96 int main()
 97 {    
 98     vector_N v1,v2,v3;
 99     int a,b;
100     cin>>v1>>v2;
101     cin>>a>>b;
102     if(v1.ren(v1)!=v2.ren(v2))
103     {
104         cout<<"Mismatch Length!"<<endl;
105     }
106     else
107     {
108         cout<<v1+v2<<endl<<v1-v2<<endl<<neiji(v1,v2)<<endl;
109     }
110     cout<<a*v1<<endl;
111     if(b>(v1.ren(v1)-1)||b<0)
112     {
113         cout<<"Error Index"<<endl;
114         _exit(0);
115     }
116     else
117     {
118         cout<<v1[b]<<endl;
119     }
120     return 0;
121 }

 

四、总结:

1、输入输出运算符的重载格式:

(1)输入:friend iostream & operator>>(iostream & input,类名 &)(2)输出:friend ostream & operator<<(ostream &output,类名 &)

2、运算符重载需定义为友元函数的情况:

(1)运算符为双目运算符;(2)输入输出运算符;(3)左边的类型不是类(4)具有交换性的运算符

 

posted @ 2023-04-16 21:36  信2211-8李欣垚  阅读(29)  评论(0)    收藏  举报