请用C++编写一个算法,完成矢量的加法与成法运算,运算规则如下:

请用C++编写一个算法,完成矢量的加法与成法运算,运算规则如下:,第1张

#include <cstdlib>

#include <iostream>

#include <string>

#include <sstream>

#include <vector>

#include <stack>

using namespace std

bool isOp(string& op){

if(op==("+")||op==("-")||op==("*")||op==("/")||op==("(")||op==(")")) return true

else return false

}

int pri(string& op){

if(op==("+")||op==("-")||op==("(")) return 1

else if(op==("*")||op==("/")) return 2

else return 0

}

string twoResult(string& op,string& a,string& b){

double x=atof(b.c_str()),y=atof(a.c_str()),z=0

string result

stringstream ss

if(op==("+")) z=x+y

else if(op==("-")) z=x-y

else if(op==("*")) z=x*y

else if(op==("/")) z=x/y

else z=0

ss<<zss>>result

return result

}

vector<string> read(string input){

vector<string> exp

const string op="+-*/()"

static const basic_string <string>::size_type npos=-1

for(int i=0,pos=0i<input.length()i++){

if(op.find(input[i])!=npos){

if(op.find(input[pos])==npos){

exp.push_back(input.substr(pos,i-pos))

}

exp.push_back(input.substr(i,1))

pos=i+1

continue

}

if(i==input.length()-1 && op.find(input[i])==npos){

exp.push_back(input.substr(pos))

}

}

return exp

}

vector<string> toRight(vector<string>& exp){

stack<string> as

vector<string> right

string op

int pos=0

while(true){

if(isOp(exp.at(pos))){

if(as.empty()||(exp.at(pos))==("(")){

as.push(exp.at(pos))

}

else{

if((exp.at(pos))==(")")){

if((as.top())!=("(")){

op=as.top()as.pop()

right.push_back(op)

}

}

else{

if(pri(exp.at(pos))<=pri(as.top())&&(!as.empty())){

op=as.top()as.pop()

if(op!=("(")) right.push_back(op)

}

as.push(exp.at(pos))

}

}

}

else right.push_back(exp.at(pos))

pos++

if(pos>=exp.size()) break

}

while(!as.empty()){

op=as.top()as.pop()

right.push_back(op)

}

return right

}

double getResult(vector<string>& right){

stack<string> temp

string op1,op2

vector<string>::iterator v_it

for(v_it=right.begin()v_it!=right.end()v_it++){

if(isOp(*v_it)){

op1=temp.top()temp.pop()

op2=temp.top()temp.pop()

temp.push(twoResult(*v_it,op1,op2))

}

else temp.push(*v_it)

}

return atof(temp.top().c_str())

}

void main(){

string input

for(){

cout<<"输入表达式或输入Q退出:"

cin>>input

if(input==("q")) break

else{

vector<string> exp=read(input)

cout<<input<<"="<<getResult(toRight(exp))<<endl

}

}

}

1.矢量标量

标量是指仅有大小的量,如0,1,2……自然数。而矢量是指既有大小又有方向的量,通常用字母加箭头表示,如下图

2.矢量的运算

加减运算遵循平行四边形(三角形)法则

乘法运算有两种

1.向量点乘

2.向量叉乘


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11055390.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-13
下一篇 2023-05-13

发表评论

登录后才能评论

评论列表(0条)

保存