GitHub中Asterank源码python修改成C++(本人python不太会)

GitHub - typpo/asterank: asteroid database, interactive visualizations, and discovery tools

主要目的是在进行多元线性回归的时候将枚举型转换为数值型

python:

#
# The constants used in calculations for the values of asteroids.
#

# General constants
GENERAL_INDEX = {
  'cost_to_orbit': 2200,  # $ / kg
}

# Keys are asteroid spectra type. Values are maps from a material
# to the percent mass of each material.
SPECTRA_INDEX = {
  '?': {},
  'A': {},
  'B': {
    'hydrogen': 0.235,
    'nitrogen': 0.001,
    'ammonia': 0.001,
    'iron': 10,
  },
  'C': {
    # from Keck report at http://www.kiss.caltech.edu/study/asteroid/asteroid_final_report.pdf
    'water': .2,
    'iron': .166,
    'nickel': .014,
    'cobalt': .002,

    # volatiles
    'hydrogen': 0.235,
    'nitrogen': 0.001,
    'ammonia': 0.001,
  },
  'Ch': {
    # from Keck report at http://www.kiss.caltech.edu/study/asteroid/asteroid_final_report.pdf
    'water': .2,
    'iron': .166,
    'nickel': .014,
    'cobalt': .002,

    # volatiles
    'hydrogen': 0.235,
    'nitrogen': 0.001,
    'ammonia': 0.001,
  },
  'Cg': {
    # from Keck report at http://www.kiss.caltech.edu/study/asteroid/asteroid_final_report.pdf
    'water': .2,
    'iron': .166,
    'nickel': .014,
    'cobalt': .002,

    # volatiles
    'hydrogen': 0.235,
    'nitrogen': 0.001,
    'ammonia': 0.001,
  },
  'Cgh': {
    # from Keck report at http://www.kiss.caltech.edu/study/asteroid/asteroid_final_report.pdf
    'water': .2,
    'iron': .166,
    'nickel': .014,
    'cobalt': .002,

    # volatiles
    'hydrogen': 0.235,
    'nitrogen': 0.001,
    'ammonia': 0.001,
  },
  'C type': {
    # from Keck report at http://www.kiss.caltech.edu/study/asteroid/asteroid_final_report.pdf
    'water': .2,
    'iron': .166,
    'nickel': .014,
    'cobalt': .002,

    # volatiles
    'hydrogen': 0.235,
    'nitrogen': 0.001,
    'ammonia': 0.001,
  },
  'Cb': {   # transition object between C and B
    # from Keck report at http://www.kiss.caltech.edu/study/asteroid/asteroid_final_report.pdf
    'water': .1,
    'iron': .083,
    'nickel': .007,
    'cobalt': .001,

    # volatiles
    'hydrogen': 0.235,
    'nitrogen': 0.001,
    'ammonia': 0.001,
  },
  'D': {
    'water': 0.000023,
  },
  'E': {

  },
  'K': {  # cross between S and C
    # from Keck report at http://www.kiss.caltech.edu/study/asteroid/asteroid_final_report.pdf
    'water': .1,
    'iron': .083,
    'nickel': .007,
    'cobalt': .001,

    # volatiles
    'hydrogen': 0.235,
    'nitrogen': 0.001,
    'ammonia': 0.001,
  },
  'L': {
    'magnesium silicate': 1e-30,
    'iron silicate': 0,
    'aluminum': 7
  },
  'Ld': {  # copied from S
    'magnesium silicate': 1e-30,
    'iron silicate': 0,
  },
  'M': {
    'iron': 88,
    'nickel': 10,
    'cobalt': 0.5,
  },
  'O': {
    'nickel-iron': 2.965,
    'platinum': 1.25,
  },
  'P': {  # correspond to CI, CM carbonaceous chondrites
    'water': 12.5,
  },
  'R': {
    'magnesium silicate': 1e-30,
    'iron silicate': 0,
  },
  'S': {
    'magnesium silicate': 1e-30,
    'iron silicate': 0,
  },
  # Sa, Sq, Sr, Sk, and Sl all transition objects (assume half/half)
  'Sa': {
    'magnesium silicate': 5e-31,
    'iron silicate': 0,
  },
  'Sq': {
    'magnesium silicate': 1e-30,
    'iron silicate': 0,
  },
  'Sr': {
    'magnesium silicate': 1e-30,
    'iron silicate': 0,
  },
  'Sk': {
    'magnesium silicate': 1e-30,
    'iron silicate': 0,
  },
  'Sl': {
    'magnesium silicate': 1e-30,
    'iron silicate': 0,
  },
  'S(IV)': {
    'magnesium silicate': 1e-30,
    'iron silicate': 0,
  },
  'Q': {
    'nickel-iron': 13.315,
  },
  'R': {
    'magnesium silicate': 1e-30,
    'iron silicate': 0,
  },
  'T': {
    'iron': 6,
  },
  'U': {

  },
  'V': {
    'magnesium silicate': 1e-30,
    'iron silicate': 0,
  },

  # TODO use density to decide what kind of X the object is?

  'X': {  # TODO these vals only apply to M-type within X
    'iron': 88,
    'nickel': 10,
    'cobalt': 0.5,
  },
  'Xe': {  # TODO these vals only apply to M-type within X
    'iron': 88,
    'nickel': 10,
    'cobalt': 0.5,
  },
  'Xc': {  # TODO these vals only apply to M-type within X
    'iron': 88,
    'nickel': 10,
    'cobalt': 0.5,
    'platinum': 0.005,
  },
  'Xk': {  # TODO these vals only apply to M-type within X
    'iron': 88,
    'nickel': 10,
    'cobalt': 0.5,
  },
  'comet': {
      # no estimates for now, because assumed mass, etc. would be off
  },
}


# Keys are raw materials. Values are maps containing information on
# the value of these materials.
MATERIALS_INDEX = {
  'water': {
    '$_per_kg': 0.01
  },
  'hydrogen': {
    '$_per_kg': 3.65808137,
  },
  'nitrogen': {
    '$_per_kg': 0.074094,
  },
  'ammonia': {
    '$_per_kg': 0.01,
  },
  'oxygen': {
    '$_per_kg': 0.21,
  },
  'iron': {
    '$_per_kg': 2e-7,
  },
  'nickel': {
    '$_per_kg': 0.00002,
  },
  'nickel-iron': {  # value unclear.  averaged.
    '$_per_kg': 1.01e-5,
  },
  'cobalt': {
    '$_per_kg': 0.20,
  },
  'stainless steel': {
    '$_per_kg': 0.20
  },
  'platinum': {
    '$_per_kg': 2
  },
  'magnesium silicate': {
    '$_per_kg': 1e-25,
  },
  'iron silicate': {
    '$_per_kg': 0,
  },
  'aluminum': {
    '$_per_kg': 0.05
  }
}

def valuePerKg(type):
  mat_price_per_kg = 0
  for mat, pct in SPECTRA_INDEX[type].iteritems():
    mat_price_per_kg += MATERIALS_INDEX[mat]['$_per_kg'] * pct / 100
  return mat_price_per_kg

def savedPerKg(type):
  # This is is a dummy calculation used to compare the cost of mining in space
  # to the cost of getting the same materials from earth.
  cto = GENERAL_INDEX['cost_to_orbit']
  ret = 0
  for mat,pct in SPECTRA_INDEX[type].iteritems():
    ret += cto * pct / 100
  return ret - (cto / 3)  # assume it costs 1/3 as much to mine and get off the asteroid

def profitRatio(baseline_dv, dv):
  # Baseline profit is 10%, but it changes based on dv
  return baseline_dv / dv

C++代码:

#include <iostream>
#include <string>
//函数Price_p返回元素的单位价格
float Price_p(std::string str){
     float per_kg=0;
     if(str=="water")
          per_kg=0.01;
     if (str == "hydrogen")
          per_kg = 3.65808137;
     if (str == "nitrogen")
          per_kg = 0.074094;
     if (str == "ammonia")
          per_kg = 0.01;
     if (str == "oxygen")
          per_kg = 0.21;
     if (str == "iron")
          per_kg = 2e-7;
     if (str == "nickel")
          per_kg = 0.00002;
     if (str == "nickel-iron")
          per_kg = 1.01e-5;
     if (str == "ncobalt")
          per_kg = 0.2;
     if (str == "stainless steel")
          per_kg = 0.2;
     if (str == "platinum")
          per_kg = 2;
     if (str == "magnesium silicate")
          per_kg = 1e-25;
     if (str == "iron silicate")
          per_kg = 0;
     if (str == "aluminum")
          per_kg = 0.05;

     return per_kg;
}

float how_Much(std::string str_00){
if(str_00=="B"){
   return Price_p("hydrogen")*0.235+Price_p("nitrogen")*0.001+Price_p("ammonia")*0.001+Price_p("iron")*10;
    }
if (str_00 == "C"){
   return Price_p("water") * 0.2 + Price_p("iron") * 0.166 + Price_p("nickel") * 0.014 + Price_p("cobalt") * 0.002+Price_p("hydrogen") * 0.235
       + Price_p("nitrogen") * 0.001+Price_p("ammonia") * 0.001+Price_p("ammonia") *0.001;
    }
if (str_00== "Ch"){
   return Price_p("water") * 0.2 + Price_p("iron") * 0.166 + Price_p("nickel") * 0.014 + Price_p("cobalt") * 0.002+Price_p("hydrogen") * 0.235
       + Price_p("nitrogen") * 0.001+Price_p("ammonia") * 0.001;
    }
if (str_00== "Cg"){
   return Price_p("water") * 0.2 + Price_p("iron") * 0.166 + Price_p("nickel") * 0.014 + Price_p("cobalt") * 0.002+Price_p("hydrogen") * 0.235
       + Price_p("nitrogen") * 0.001+Price_p("ammonia") * 0.001;
    }
if (str_00== "Cgh"){
   return Price_p("water") * 0.2 + Price_p("iron") * 0.166 + Price_p("nickel") * 0.014 + Price_p("cobalt") * 0.002+Price_p("hydrogen") * 0.235
       + Price_p("nitrogen") * 0.001+Price_p("ammonia") * 0.001;
    }
if (str_00== "C type"){
   return Price_p("water") * 0.2 + Price_p("iron") * 0.166 + Price_p("nickel") * 0.014 + Price_p("cobalt") * 0.002+Price_p("hydrogen") * 0.235
       + Price_p("nitrogen") * 0.001+Price_p("ammonia") * 0.001;
    }
if (str_00 == "Cb"){
     return Price_p("water") * 0.1 + Price_p("iron") * 0.083 + Price_p("nickel") * 0.007 +
             Price_p("cobalt") * 0.001 + Price_p("hydrogen") * 0.235+ Price_p("nitrogen") * 0.001 + Price_p("ammonia") * 0.001;
}
if (str_00 == "D"){
     return Price_p("water") * 0.000023 ;}

if (str_00 == "E"){
return 0;}

if (str_00 == "K"){
     return Price_p("water") * 0.1 + Price_p("iron") * 0.083 + Price_p("nickel") * 0.007 +
             Price_p("cobalt") * 0.001 + Price_p("hydrogen") * 0.235+ Price_p("nitrogen") * 0.001 + Price_p("ammonia") * 0.001;
}
if (str_00 == "L"){
     return Price_p("magnesium silicate") * 1e-30 + Price_p("iron silicate") * 0 + Price_p("aluminum") * 7 ;
}
if (str_00 == "Ld"){
     return Price_p("magnesium silicate") * 1e-30 + Price_p("iron silicate") * 0 ;
}
if (str_00 == "M"){
     return Price_p("iron") * 88 + Price_p("nickel") * 10 + Price_p("cobalt") * 0.5;
}
if (str_00 == "O"){
     return Price_p("nickel-iron") * 2.965 + Price_p("platinum") * 1.25;
}
if (str_00 == "P"){
     return Price_p("water") * 12.5;
}
if (str_00 == "R"){
     return Price_p("magnesium silicate") * 1e-30+Price_p("iron silicate") * 0;
}
if (str_00 == "S"){
     return Price_p("magnesium silicate") * 1e-30+Price_p("iron silicate") * 0;
}
if (str_00 == "Sa"){
     return Price_p("magnesium silicate") * 5e-31+Price_p("iron silicate") * 0;
}

if (str_00 == "Sq"){
     return Price_p("magnesium silicate") * 1e-30+Price_p("iron silicate") * 0;
}
if (str_00 == "Sr"){
     return Price_p("magnesium silicate") * 1e-30+Price_p("iron silicate") * 0;
}
if (str_00 == "Sk"){
     return Price_p("magnesium silicate") * 1e-30+Price_p("iron silicate") * 0;
}
if (str_00 == "Sl"){
return Price_p("magnesium silicate") * 1e-30 + Price_p("iron silicate") * 0;
}
if (str_00 == "S(IV)"){
     return Price_p("magnesium silicate") * 1e-30+Price_p("iron silicate") * 0;
}
if (str_00 == "Q"){
     return Price_p("nickel-iron") * 13.315;
}
if (str_00 == "R"){
     return Price_p("magnesium silicate") * 1e-30+Price_p("iron silicate") * 0;
}
if (str_00 == "T"){
     return Price_p("iron") * 6;
}
if (str_00 == "U"){
     return 0;
}
if (str_00 == "V"){
     return Price_p("magnesium silicate") * 1e-30+Price_p("iron silicate") * 0;
}
if (str_00 == "X"){
     return Price_p("iron") * 88+Price_p("nickel") * 10+Price_p("cobalt") * 0.5;
}
if (str_00 == "Xe"){
     return Price_p("iron") * 88+Price_p("nickel") * 10+Price_p("cobalt") * 0.5;
}
if (str_00 == "Xc"){
     return Price_p("iron") * 88+Price_p("nickel") * 10+Price_p("cobalt") * 0.5+Price_p("platinum") * 0.005;
}
if (str_00 == "Xk"){
     return Price_p("iron") * 88+Price_p("nickel") * 10+Price_p("cobalt") * 0.5;
}

 return 0;
}

int main() {
   std::string str_00="C";
     while(str_00!="00") {
          std::cin>>str_00;
          std::cout<<"The price of Type "+str_00+"is:"<<how_Much(str_00);
     }
    return 0;
}

运行结果:

相当于每千克Q类型的小行星值多少美元 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值