首页 > 编程语言 >N维整形向量类的c++实现

N维整形向量类的c++实现

时间:2023-04-14 23:11:18浏览次数:38  
标签:return cout int c++ vector operator 整形 向量

题目如下:

N维整型向量类

【问题描述】

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

私有数据成员:

²  向量维数n, int型

²  指针 p,int型

公有函数成员:

  • 无参默认构造函数,在该函数中,将n置0,将p置null;
  • 重载输入输出运算符,输入运算符,先指定向量维数,若输入为非正整数,则提示错误信息,“Error Length!”然后退出程序,若维数输入正确则分配长度为n的动态内存,并用指针p指向该内存,输出运算符依次输出向量各元素即可;
  • 重载向量的加法+、减法-、数乘*(乘数在前,乘数为int型)这三运算符;
  • 重载[]运算,例如,向量a=(1,2,3,4),a[0]的值为1,若下标越界,则输出“Error Index”,然后退出程序;
  • 返回向量维数的函数;
  • 将两个向量的内积运算定义为vector_N的友元函数;

在主函数中定义两个vector_N类对象v1,v2,均不带参数,之后对两个对象进行输入赋值,输入数乘运算的乘数,输入待取元素的下标,对两个向量进行加、减、数乘和内积运算,并将结果输出,输出v1中对应下标对应的元素。加法、减法和内积运算先判断两向量维数是否一致,若一致则输出运算结果,否则输出错误提示信息“Mismatch Length!”

 

提示:1.此类需要用到动态内存的分配,所以在析构函数中应释放空间,并将指针置null,将维数n置0

2.需要显式定义复制构造函数vector_N(vector_N &)

3.需要重载复制运算符 vector_N operator= (vector_N &)

4.退出程序用函数 _exit(0)

5.返回值类型需要为引用的形式,另一方面,在使用时就要考虑不能返回临时变量的引用

 

显然,

这道题私有成员的n,p的建立并不困难,第一个难点就在于n维向量中,n个坐标该如何储存,其实也不难解决,;题目中提示给了整形指针p,因此我们可以用new申请一个大小为n的空间,然后在这些空间中自然就可以储存这些坐标,而有new就要有delete,所以不要忘记在析构函数中使用delete释放空间.第一个难点解决之后,之后运算符中针对n维坐标的运算问题自然就迎刃而解,用for循环对数组中每一个数字进行处理便可以解决.

具体流程:

先创建一个vector_N类,私有成员为整形n,和整形指针p,公有函数建立默认的无参函数,内容是n=0,p=NULL,接下来重载运算符和输入输出符,其中输入符复制输入n,p,输出符则需要输出以(x,y,z)类型的n维坐标,其他函数按照题目构建即可

流程图:

 

 

 

 

 

 

 

 

代码实现:

#include <iostream>
#include<string>
#include <cmath>
using namespace std;
class vector_N
{
private:
int n;
int* p;
public:
vector_N();
vector_N(vector_N &B);
bool check(vector_N B);
int show_N();
friend istream& operator>>(istream& input, vector_N &B);
friend ostream& operator<<(ostream& output, vector_N &B);
friend vector_N neiji(vector_N A, vector_N B);
vector_N operator+(vector_N B);
vector_N operator-(vector_N B);
int operator*(vector_N B);
int operator[](int B);
};

istream& operator>>(istream& input, vector_N &B)
{
cout << "请输入维数" << endl;
input >> B.n;
if (B.n <= 0)
{
cout << "Error Length!" << endl;
exit(0);
}
else
{
B.p = new int[B.n];
cout << "请分别输入各个坐标" << endl;
for (int i = 0; i < B.n; i++)
{
input >> B.p[i];
}
}

}
ostream& operator<<(ostream& output, vector_N &B)
{
for (int i = 0; i < B.n; i++)
{
if (i == 0)
{
output << "(";
}
cout << B.p[i];
if (i != B.n - 1)
{
output << ",";
}
else
{
output << ")" << endl;
}
}
return output;
}
vector_N neiji(vector_N A, vector_N B)
{
if (A.n == B.n)
{
vector_N C(A);
for (int i = 0; i <= A.n; i++)
{
C.p[i] = A.p[i] * B.p[i];
}
return C;
}
else
{
cout << "error" << endl;
}
}
vector_N::vector_N()
{
n = 0;
p = NULL;
}
vector_N::vector_N(vector_N &B)
{
n = B.n;
p = new int[B.n];
for (int i = 0; i < B.n; i++)
{
p[i] = B.p[i];
}
}
bool vector_N::check(vector_N B)
{
if (n == B.n) return true;
else
{
cout << "Mismatch Length!" << endl;
return false;
}
}
int vector_N::show_N()
{
return n;
}
vector_N vector_N::operator + (vector_N B)
{

vector_N A(B);
if (check(B))
{

for (int i = 0; i < n; i++)
{
A.p[i] = p[i] + B.p[i];
}
return A;
}
else
{
exit(0);
}

}
vector_N vector_N::operator - (vector_N B)
{
vector_N A(B);
cout << B;
if (check(B))
{
for (int i = 0; i < n; i++)
{
A.p[i] = p[i] - B.p[i];
}
return A;
}
else
{
exit(0);
}

}
int vector_N:: operator*(vector_N B)
{
if (check(B))
{
int sum = 0;
for (int i = 0; i < n; i++)
{
sum += p[i] * B.p[i];
}
return sum;
}
else
{
exit(0);
}

}
int vector_N:: operator[](int B)
{
if (B>=0)
return p[B];
else
{
cout << "Error Index" << endl;
}
}
int main()
{
vector_N a, b;
cin >> a;
cin.sync();
cin >> b;
cout << "a的维数为:" << a.show_N() << endl;
cout << "b的维数为:" << b.show_N() << endl;
cout << "a的第一位是:" << a[0] << endl;
cout << "b的第一位是:" << b[0] << endl;
cout << "a+b=" << a + b;
cout << "a-b=" << a - b;
cout << "a*b=" << a*b << endl;


}

实验结果:

 

 

发现的问题:

在构造复制函数的时候注意,不要简单地使用n=B.n,p=B.p;

否则就会导致之后运算的过程中对参数运算改变了主参数中的运算数.

 

标签:return,cout,int,c++,vector,operator,整形,向量
From: https://www.cnblogs.com/kua-kua/p/17320222.html

相关文章

  • c++primer15面向对象程序设计
    除了“构造函数”和“析构函数”,父类的所有成员函数,以及数据成员,都会被子类继承!:补充赋值运算符继承问题(链接) 成员函数如果没被声明为虚函数,其解析过程发生在编译时而非运行时。       派生类引用或者指针向基类引用或者指针自动类型转换:参考能够在一个赋值......
  • Paillier半同态加密算法及C++实现
    Paillier半同态加密系统详解及C++实现Paillier半同态加密系统详解及C++实现一、Paillier同态加密算法1.1基本概念1.2算法思路1.3加解密过程密钥生成KeyGeneration加密Encryption解密Decryption二、C++实现2.1实验环境Linux版本编译器版本2.2......
  • c++打卡第五天
    嵌套和递归一、嵌套调用。 1、嵌套调用是指在一个函数中调用另一个函数,也可以在一个类中使用另一个类作为成员变量。 2、实例 ①函数成员调用#include<iostream>usingnamespacestd;intfa2(inta){returna+1;}intfa1(intn){return2*fa2(n);}......
  • c++基本数据结构
    基本数据结构:一.线性表1.顺序结构线性表可以用普通的一维数组存储。你可以让线性表可以完成以下操作(代码实现很简单,这里不再赘述):返回元素个数。判断线性表是否为空。得到位置为p的元素。查找某个元素。插入、删除某个元素:务必谨慎使用,因为它们涉及大量元素的移动。......
  • c/c++快乐算法第一天
    c/c++感受算法乐趣(1)开始时间2023-04-14 18:31:47结束时间2023-04-14 22:06:02前言:经过两天的学习,是不是发现编程也挺简单的。其实不然,学好算法同时也是练习编程的关键一环。接下来每周末我将会带领你感受算法的乐趣。目前题目摘自c语言趣味编程100例清华大学出版社,我会根据编......
  • C++第三章课本例题
    游戏规则是:每个骰子有6面,点数分别为1、2、3、4、5、6。游戏者在程序开始时输入个无符号整数,作为产生随机数的种子。每轮投两次骰子,第一轮如果和数为7或11则为胜,游戏结束;和数为2、3或12则为负,游戏结束;和数为其他值则将此值作为自己的原数,继续第二轮、第三轮……直到某轮的和数等于......
  • C++复习第六天(继承、多态)
    vector.clear()将size设置为0,capacity不变 继承//公共页面classBasePage{public:voidheader(){cout<<"首页、公开课、登录、注册...(公共头部)"<<endl;}voidfooter(){cout<<"帮助中心、交流合作、站内地图...(......
  • C++第四天
    定义一个CPU类,包含等级(Rank)、频率(frequency)、电压(voltage)等属性。其中,rank为枚举类型CPU__Rank,定义为enumCPU_Rank{P1=1,P2,P3,P4,P5,P6,P7},frequency为单位是MHz的整型数,voltage为浮点型的电压值。代码#include<iostream>usingnamespacestd;enumCPU_Rank{P1=1,P2,P3,P......
  • c++练习打卡(7)
    银行存钱银行一年整存零取的利息每月0.0063,某人存了一笔钱,每年年底取1000,五年取完,问他存了多少?流程图:伪代码:源代码:#include<stdio.h>intmain(){ doublemoney=0.0; for(inti=0;i<5;i++){ money=(money+1000.0)/(1+12*0.0063); }printf("%0.2lf",money); return0;} ......
  • C++对象和类
    一、类的声明//global.h--defineforallproject//version0.0#ifndefGLOBAL_H_//防止重定义#defineGLOBAL_H_classGlobal//定义类{public://使用类对象的程序都可以直接访问公有部分/*定义在类声明中的函数称为内联函数,仅声明在......