역삼각함수란 삼각함수의 역함수를 의미하고,

역쌍곡선함수란 쌍곡선함수의 역함수를 의미한다.

수학에서 sin 함수의 역함수는 arcsin 으로 표기되는데,

Scala 언어에서는 scala.math.asin(Double) 메소드로 구현되어 있다.

/*
 * Filename: testArcSine.scala
 *
 * Execute: scala -deprecation testArcSine.scala
 *
 *  Or
 *
 * Compile: scalac -d. -deprecation testArcSine.scala
 * Execute: scala -classpath . -deprecation testArcSine
 *
 * Date: 2013. 1. 1.
 * Copyright (c) pkim _AT_ scripts.pe.kr
 */

import java.io._

object testArcSine {
        def sin(x: Double) : Double = {
            var y = scala.math.sin(x)
            return y
        }

        def asin(x: Double) : Double = {
            var y = scala.math.asin(x)
            return y
        }

        def acos(x: Double) : Double = {
            var y = scala.math.acos(x)
            return y
        }

        def sinh(x: Double) : Double = {
            var y = scala.math.sinh(x)
            return y
        }

        def cosh(x: Double) : Double = {
            var y = scala.math.cosh(x)
            return y
        }

        def asinh(x: Double) : Double = {
            var y = scala.math.log(x + scala.math.sqrt(x*x + 1))
            return y
        }

        def acosh(x: Double) : Double = {
            var y = scala.math.log(x + scala.math.sqrt(x*x - 1))
            return y
        }

        def main(args: Array[String]) {
            var x = -0.9
            var y = asin(x)
            printf("y = asin(%.1g) = %.9f\n", x,  y)
            printf("sin(y) = sin(%.9f) = %.1g\n",  y, sin(y))
            printf("\n")

            x = 1.1
            var u = acosh(x)
            printf("u = acosh(%3.2g) = %.10f\n", x,  u)

            var v = asinh(x)
            printf("v = asinh(%3.2g) = %.10f\n", x,  v)

            printf("cosh(u) = cosh(%.10f) = %3.2g\n", u,  cosh(u))
            printf("sinh(v) = sinh(%.10f) = %3.2g\n", v,  sinh(v))
        }
}

/*
Output:
y = asin(-0.9) = -1.119769515
sin(y) = sin(-1.119769515) = -0.9

u = acosh(1.1) = 0.4435682544
v = asinh(1.1) = 0.9503469298
cosh(u) = cosh(0.4435682544) = 1.1
sinh(v) = sinh(0.9503469298) = 1.1
*/

 

 

 

Posted by Scripter
,

역삼각함수란 삼각함수의 역함수를 의미하고,

역쌍곡선함수란 쌍곡선함수의 역함수를 의미한다.

수학에서 sin 함수의 역함수는 arcsin 으로 표기되는데,

Go 언어에서는 math.Asin() 함수로 구현되어 있다.

/*
 * Filename: testArcSine.go
 *
 * Execute: go run testArcSine.go
 *
 *  Or
 *
 * Compile: go build testArcSine.go
 * Execute: testArcSine
 *
 * Date: 2013. 1. 1.
 * Copyright (c) pkim _AT_ scripts.pe.kr
 */
 
package main

import (
    "fmt"
    "math"
)

func asinh(x float64) float64 {
    y := math.Log(x + math.Sqrt(x*x + 1))
    return y
}

func acosh(x float64) float64 {
    y := math.Log(x + math.Sqrt(x*x - 1))
    return y
}

func main() {
 
    x := -0.9
    y := math.Asin(x)
    fmt.Printf("y = asin(%g) = %.9f\n", x, y)
    fmt.Printf("sin(y) = sin(%.9f) = %g\n", y, math.Sin(y))
    fmt.Printf("\n")

    x = 1.1
    u := acosh(x)
    fmt.Printf("u = acosh(%g) = %.10f\n", x, u)
 
    v := asinh(x)
    fmt.Printf("v = asinh(%g) = %.10f\n", x, v)
 
    fmt.Printf("cosh(u) = cosh(%.10f) = %g\n", u, math.Cosh(u))
    fmt.Printf("sinh(v) = sinh(%.10f) = %g\n", v, math.Sinh(v))
}

/*
Output:
y = asin(-0.9) = -1.119769515
sin(y) = sin(-1.119769515) = -0.9

u = acosh(1.1) = 0.4435682544
v = asinh(1.1) = 0.9503469298
cosh(u) = cosh(0.4435682544) = 1.1
sinh(v) = sinh(0.9503469298) = 1.1
*/

 

 

 

Posted by Scripter
,

역삼각함수란 삼각함수의 역함수를 의미하고,

역쌍곡선함수란 쌍곡선함수의 역함수를 의미한다.

수학에서 sin 함수의 역함수는 arcsin 으로 표기되는데,

Lua 언어에서는 math.asin() 함수로 구현되어 있다.

 

-- Filename: testArcSine.lua
--
-- Execute: lua testArcSine.lua
--
-- Date: 2013. 1. 1.
-- Copyright (c) pkim _AT_ scripts.pe.kr

function sin(x)
    local y = math.sin(x)
    return y
end

function asin(x)
    local y = math.asin(x)
    return y
end

function sinh(x)
    local y = math.sinh(x)
    return y
end

function cosh(x)
    local y = math.cosh(x)
    return y
end

function asinh(x)
    local y = math.log(x + math.sqrt(x*x + 1))
    return y
end

function acosh(x)
    local y = math.log(x + math.sqrt(x*x - 1))
    return y
end


x = -0.9
y = asin(x)
print(string.format("y = asin(%g) = %.9f", x, y))
print(string.format("sin(y) = sin(%.9f) = %g", y, sin(y)))
print()

x = 1.1
u = acosh(x)
print(string.format("u = acosh(%g) = %.10f" , x, u))

v = asinh(x)
print(string.format("v = asinh(%g) = %.10f", x, v))

print(string.format("cosh(u) = cosh(%.10f) = %g", u, cosh(u)))
print(string.format("sinh(v) = sinh(%.10f) = %g", v, sinh(v)))

--[[
y = asin(-0.9) = -1.119769515
sin(y) = sin(-1.119769515) = -0.9

u = acosh(1.1) = 0.4435682544
v = asinh(1.1) = 0.9503469298
cosh(u) = cosh(0.4435682544) = 1.1
sinh(v) = sinh(0.9503469298) = 1.1
--]]

 

 

Posted by Scripter
,

역삼각함수란 삼각함수의 역함수를 의미하고,

역쌍곡선함수란 쌍곡선함수의 역함수를 의미한다.

수학에서 sin 함수의 역함수는 arcsin 으로 표기되는데,

 C 언어나 C++ 언어에서는 asin 함수로 구현되어 있다.

아래의 소스는 Visual C++ 또는 gcc 로 컴파일되는 소스이다. 실행 결과는 같다.

/*
 * Filename: testArcSine.c
 *
 * Compile: cl testArcSine.c
 * Execute: testArcSine
 *
 *  Or
 *
 * Cpmpile: gcc -o testArcSine testArcSine.c
 * Execute: ./testArcSine
 *
 * Date: 2013. 1. 1.
 * Copyright (c) pkim _AT_ scripts.pe.kr
 */

#include <stdio.h>
#include <math.h>

double asinh(double x) {
    double y = log(x + sqrt(x*x + 1));
    return y;
}

double acosh(double x) {
    double y = log(x + sqrt(x*x - 1));
    return y;
}

int main() {

    double u, v;
    double x = -0.9;
    double y = asin(x);

    printf("y = asin(%g) = %.9f\n", x,  y);
    printf("sin(y) = sin(%.9f) = %g\n", y, sin(y));
    printf("\n");

    x = 1.1;
    u = acosh(x);
    printf("u = acosh(%g) = %.10f\n", x,  u);

    v = asinh(x);
    printf("v = asinh(%g) = %.10f\n", x, v);

    printf("cosh(u) = cosh(%.10f) = %g\n", u, cosh(u));
    printf("sinh(v) = sinh(%.10f) = %g\n", v, sinh(v));

    return 0;
}

/*
Output:
y = asin(-0.9) = -1.119769515
sin(y) = sin(-1.119769515) = -0.9

u = acosh(1.1) = 0.4435682544
v = asinh(1.1) = 0.9503469298
cosh(u) = cosh(0.4435682544) = 1.1
sinh(v) = sinh(0.9503469298) = 1.1
*/

 

 

 

Posted by Scripter
,

역삼각함수란 삼각함수의 역함수를 의미하고,

역쌍곡선함수란 쌍곡선함수의 역함수를 의미한다.

수학에서 sin 함수의 역함수는 arcsin 으로 표기되는데,

Ruby 언어에서는 Math::asin() 함수로 구현되어 있다.

 

다음 소스는 Ruby, JRuby 중 어느 것으로 실행해도 같은 결과를 얻는다.

 

# -*- encoding: utf-8 -*-

# Filename: testArcSine.rb
#
# Execute: ruby testArcSine.rb
#
#  Or
#
# Execute: jruby testArcSine.rb
#
# Date: 2013. 1. 1.
# Copyright (c) pkim _AT_ scripts.pe.kr

def sin(x)
    y = Math::sin(x)
    return y
end

def asin(x)
    y = Math::asin(x)
    return y
end

def sinh(x)
    y = Math::sinh(x)
    return y
end

def cosh(x)
    y = Math::cosh(x)
    return y
end

def asinh(x)
    y = Math::log(x + Math::sqrt(x*x + 1))
    return y
end

def acosh(x)
    y = Math::log(x + Math::sqrt(x*x - 1))
    return y
end


x = -0.9
y = asin(x)
print "y = asin(%.1g) = %.9f\n" % [x,  y]
print "sin(y) = sin(%.9f) = %.1g\n" % [y, sin(y)]
print "\n"

x = 1.1
u = acosh(x)
print "u = acosh(%3.2g) = %.10f\n" % [x,  u]

v = asinh(x)
print "v = asinh(%3.2g) = %.10f\n" % [x,  v]

print "cosh(u) = cosh(%.10f) = %3.2g\n" % [u,  cosh(u)]
print "sinh(v) = sinh(%.10f) = %3.2g\n" % [v,  sinh(v)]

=begin
Output:
y = asin(-0.9) = -1.119769515
sin(y) = sin(-1.119769515) = -0.9

u = acosh(1.1) = 0.4435682544
v = asinh(1.1) = 0.9503469298
cosh(u) = cosh(0.4435682544) = 1.1
sinh(v) = sinh(0.9503469298) = 1.1
=end

 

 

Posted by Scripter
,

역삼각함수란 삼각함수의 역함수를 의미하고,

역쌍곡선함수란 쌍곡선함수의 역함수를 의미한다.

수학에서 sin 함수의 역함수는 arcsin 으로 표기되는데,

Python 언어에서는 math.asin() 함수로 구현되어 있다.

이를 사용하기 위해서는 구문

import math

이 필요하다.

 

다음 소스는 Python, Jython, IronPython 중 어느 것으로 실행해도 같은 결과를 얻는다.

특히 IronPython 으로는 옵션 /target:exe 를 사용하여 컴파일하면 실행파일 testArcSine.exe 및 testArcSine.dll 파일을 얻는다, dll 파일이 있어야 exe 파일이 실행된다.

 

# -*- encoding: utf-8 -*-

# Filename: testArcSine.py
#
# Execute: python testArcSine.py
#
#  Or
#
# Execute: jython testArcSine.py
#
#  Or
#
# Execute: ipy testArcSine.py
#
#  Or
#
# Compile: ipy %IRONPYTHON_HOME%\Tools\Scripts\pyc.py /target:exe /main:testArcSine.py
# Execute: testArcSine
#
# Date: 2013. 1. 1.
# Copyright (c) pkim _AT_ scripts.pe.kr

import math

def sin(x):
            y = math.sin(x)
            return y

def asin(x):
            y = math.asin(x)
            return y

def sinh(x):
            y = math.sinh(x)
            return y

def cosh(x):
            y = math.cosh(x)
            return y

def asinh(x):
            y = math.log(x + math.sqrt(x*x + 1))
            return y

def acosh(x):
            y = math.log(x + math.sqrt(x*x - 1))
            return y


if __name__ == "__main__":
            x = -0.9
            y = asin(x)
            print "y = asin(%.1g) = %.9f" % (x,  y)
            print "sin(y) = sin(%.9f) = %.1g" % (y, sin(y))
            print

            x = 1.1
            u = acosh(x)
            print "u = acosh(%3.2g) = %.10f" % (x,  u)

            v = asinh(x)
            print "v = asinh(%3.2g) = %.10f" % (x,  v)

            print "cosh(u) = cosh(%.10f) = %3.2g" % (u,  cosh(u))
            print "sinh(v) = sinh(%.10f) = %3.2g" % (v,  sinh(v))

"""
Output:
y = asin(-0.9) = -1.119769515
sin(y) = sin(-1.119769515) = -0.9

u = acosh(1.1) = 0.4435682544
v = asinh(1.1) = 0.9503469298
cosh(u) = cosh(0.4435682544) = 1.1
sinh(v) = sinh(0.9503469298) = 1.1
"""

 

 

 

Posted by Scripter
,

역삼각함수란 삼각함수의 역함수를 의미하고,

역쌍곡선함수란 쌍곡선함수의 역함수를 의미한다.

수학에서 sin 함수의 역함수는 arcsin 으로 표기되는데,

Java 언어에서는 java.lang.Math.asin(double) 메소드로 구현되어 있다.

 

/*
 * Filename: TestArcSine.java
 *
 * Compile: javac -d . TestArcSine.java
 * Execute: java TestArcSine
 *
 * Date: 2013. 1. 1.
 * Copyright (c) pkim _AT_ scripts.pe.kr
 */

public class TestArcSine {
        public static double sin(double x)  {
            double y = Math.sin(x);
            return y;
        }

        public static double asin(double x) {
            double y = Math.asin(x);
            return y;
        }

        public static double sinh(double x) {
            double y = Math.sinh(x);
            return y;
        }

        public static double cosh(double x) {
            double y = Math.cosh(x);
            return y;
        }

        public static double asinh(double x)
        {
            double y = Math.log(x + Math.sqrt(x*x + 1));
            return y;
        }

        public static double acosh(double x)
        {
            double y = Math.log(x + Math.sqrt(x*x - 1));
            return y;
        }

        public static void main(String[] args)
        {
            double x = -0.9;
            double y = asin(x);
            System.out.printf("y = asin(%.1g) = %.9f\n", x,  y);
            System.out.printf("sin(y) = sin(%.9f) = %.1g\n",  y, sin(y));
            System.out.printf("\n");

            x = 1.1;
            double u = acosh(x);
            System.out.printf("u = acosh(%3.2g) = %.10f\n", x,  u);

            double v = asinh(x);
            System.out.printf("v = asinh(%3.2g) = %.10f\n", x,  v);

            System.out.printf("cosh(u) = cosh(%.10f) = %3.2g\n", u,  cosh(u));
            System.out.printf("sinh(v) = sinh(%.10f) = %3.2g\n", v,  sinh(v));
        }
}

/*
Output:
y = asin(-0.9) = -1.119769515
sin(y) = sin(-1.119769515) = -0.9

u = acosh(1.1) = 0.4435682544
v = asinh(1.1) = 0.9503469298
cosh(u) = cosh(0.4435682544) = 1.1
sinh(v) = sinh(0.9503469298) = 1.1
*/

 

 

Posted by Scripter
,

역삼각함수란 삼각함수의 역함수를 의미하고,

역쌍곡선함수란 쌍곡선함수의 역함수를 의미한다.

수학에서 sin 함수의 역함수는 arcsin 으로 표기되는데,

C# 언어에서는 Math.Asin 함수로 구현되어 있다.

아래의 소스는 Visual C# 으로 컴파일되는 소스이다.

/*
 * Filename: testArcSine.cs
 *
 * Compile: csc testArcSine.cs /reference:System.Numerics.dll
 * Execute: testArcSine
 *
 * Date: 2013. 1. 1.
 * Copyright (c) pkim _AT_ scripts.pe.kr
 */

using System;
using System.Numerics;

namespace ExperimentConsole
{
    class Program
    {
        public static double sin(double x)
        {
            double y = Math.Sin(x);
            return y;
        }

        public static double asin(double x)
        {
            double y = Math.Asin(x);
            return y;
        }

        public static double sinh(double x)
        {
            double y = Math.Sinh(x);
            return y;
        }

        public static double cosh(double x)
        {
            double y = Math.Cosh(x);
            return y;
        }

        public static double asinh(double x)
        {
            double y = Math.Log(x + Math.Sqrt(x*x + 1));
            return y;
        }

        public static double acosh(double x)
        {
            double y = Math.Log(x + Math.Sqrt(x*x - 1));
            return y;
        }

        public static void Main(string[] args)
        {
            double x = -0.9;
            double y = asin(x);
            Console.WriteLine("y = asin({0}) = {1:F9}", x,  y);
            Console.WriteLine("sin(y) = sin({0:F9}) = {1}",  y, sin(y));
            Console.WriteLine();

            x = 1.1;
            double u = acosh(x);
            Console.WriteLine("u = acosh({0}) = {1:F10}", x,  u);

            double v = asinh(x);
            Console.WriteLine("v = asinh({0}) = {1:F10}", x,  v);

            Console.WriteLine("cosh(u) = cosh({0:F10}) = {1}", u,  cosh(u));
            Console.WriteLine("sinh(v) = sinh({0:F10}) = {1}", v,  sinh(v));
        }
    }
}

/*
Output:
y = asin(-0.9) = -1.119769515
sin(y) = sin(-1.119769515) = -0.9

u = acosh(1.1) = 0.4435682544
v = asinh(1.1) = 0.9503469298
cosh(u) = cosh(0.4435682544) = 1.1
sinh(v) = sinh(0.9503469298) = 1.1
*/

 

 

Posted by Scripter
,

역삼각함수란 삼각함수의 역함수를 의미하고,

역쌍곡선함수란 쌍곡선함수의 역함수를 의미한다.

수학에서 sin 함수의 역함수는 arcsin 으로 표기되는데,

 C 언어나 C++ 언어에서는 asin 함수로 구현되어 있다.

아래의 소스는 Visual C++ 또는 g++ 로 컴파일되는 소스이다. 실행 결과는 같다.

 

/*
 * Filename: testArcSine.cpp
 *
 * Compile: cl /EHsc testArcSine.cpp
 * Execute: testArcSine
 *
 * Or
 *
 * Cpmpile: g++ -o testArcSine testArcSine.cpp
 * Execute: ./testArcSine
 *
 * Date: 2013. 1. 1.
 * Copyright (c) pkim _AT_ scripts.pe.kr
 */
 
#include <iostream>
#include <cmath>

double asinh(double x) {
    double y = log(x + sqrt(x*x + 1));
    return y;
}

double acosh(double x) {
    double y = log(x + sqrt(x*x - 1));
    return y;
}

int main() {
 
 std::cout.precision(10);
 
 double x = -0.9;
 double y = asin(x);
 std::cout << "y = asin(" << x << ") = " << y << std::endl;
 std::cout << "sin(y) = sin(" << y << ") = " << sin(y) << std::endl;
  std::cout << std::endl;
 
 x = 1.1;
 double u = acosh(x);
 std::cout << "u = acosh(" << x << ") = " << u << std::endl;
 
 double v = asinh(x);
 std::cout << "v = asinh(" << x << ") = " << v << std::endl;
 
 std::cout << "cosh(u) = cosh(" << u << ") = " << cosh(u) << std::endl;
 std::cout << "sinh(v) = sinh(" << v << ") = " << sinh(v) << std::endl;
 
    return 0;
}

/*
Output:
y = asin(-0.9) = -1.119769515
sin(y) = sin(-1.119769515) = -0.9

u = acosh(1.1) = 0.4435682544
v = asinh(1.1) = 0.9503469298
cosh(u) = cosh(0.4435682544) = 1.1
sinh(v) = sinh(0.9503469298) = 1.1
*/

 

 

Posted by Scripter
,

이전에는 MinGW 의 gcc 버전이 낮아서 gmp, mpfr 을 사용하는데 핸디캡이 있었지만, 지금은 MinGW 의 gcc  버전이 4.6.x 대로 높아져서 꽤 쓸만한 개발도구가 되었다.

그래서 MinGW 의 설치 방법과 gmp, mpfr 라이브러리를 사용하는 방법을 남겨 둔다.

MinGW 는 Minimalist GNU for Windows 를 줄인 굴이라고 보면 이애하기가 쉬울 것이다.

 

* 윈도우 환경에  MinGW 및 MSYS 설치하기


무료로 쓰는 GNU C/C++ 컴파일러를 사용하기 위해서, 윈도우에 cygwin을 설치하는 일은 다소 무겁다는 생각이 든다. 이럴 때는 MinGW와 MSYS를 설치하면 간단한 C/C++ 개발 환경이 구축된다.

MinGW는 윈도우용 GCC Compiler Toolchain이고,
MSYS(Minal SYStem)로 윈도우에서 리눅스 쉘(Linux Shell)과 Binutils 환경을 제공한다.


  1.  최신 MinGW GUI 인스틀러 다운로드

         - MinGW와 MYS의 설치는 GUI 인스톨러를 사용하면 설치 과정이 간단하다.

 

     < GUI 인스톨러를 실행한 첫 화면 >

 

     < 설치 과정 중에 모든 설치 옵션을 체크한다. >

 

     < 설치 과정 중에 MSYS 옵션도 체크해야 한다. >

 

 

 2. MinGW 의 설치 확인

명령프롬프트> set PATH=c:\MinGW\bin;%PATH%

명령프롬프트> gcc -v

Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=c:/mingw/bin/../libexec/gcc/mingw32/4.6.2/lto-wrapper.exe
Target: mingw32
Configured with: ../gcc-4.6.2/configure --enable-languages=c,c++,ada,fortran,obj
c,obj-c++ --disable-sjlj-exceptions --with-dwarf2 --enable-shared --enable-libgo
mp --disable-win32-registry --enable-libstdcxx-debug --enable-version-specific-r
untime-libs --build=mingw32 --prefix=/mingw
Thread model: win32
gcc version 4.6.2 (GCC)


 

 3. MSYS 환경 없이 MinGW 의 gcc, g++ 사용하기

         명령프롬프트> set PATH=c:\MinGW\bin;%PATH%

         명령프롬프트> g++ -o rpnSTL rpnSTL.cpp

         명령프롬프트> rpnSTL

 

 4. MSYS 환경  하레 MinGW 의 gcc, g++ 사용하기

         명령프롬프트> set PATH=c:\MinGW\bin;c:\MinGW\msys\1.0\bin;%PATH%

         명령프롬프트> msysmnt

         명령프롬프트> bash

         $  g++ -o rpnSTL rpnSTL.cpp
 
         $  ./rpnSTL



[ STL을 이용하는 C++ 예제 소스:  rpnSTL.cpp ]

   (참고: GCC 4.6.2 용으로 수정됨, atof() 대신 ::strtod() 사용하는 것으로 수정함.)

// stl/rpnSTL.cpp -- RPN (Reverse Polish Notation) Calculator
//
//  Modified by PH Kim, 2012-12-31
//
//  Which are different from the original source rpn.cpp ?
//
//      1. double instead of int
//      2. negative value possible
//      3. support the power operator ^
//      4. support for gcc 4.6.2
//      5. etc
//
//  Compile:
//      [Borland C++ 5.5.1]  bcc32 rpnSTL.cpp
//        [Visual C++ 2008]  cl /EHsc rpnSTL.cpp
//                [GNU C++]  g++ -o rpnSTL rpnSTL.cpp
//
//  Execute:  rpnSTL
//            ./rpnSTL
//
// Original from:
//    http://www.fredosaurus.com/notes-cpp/examples/rpn/rpn.html
// ---------------------------------------------------------
// stl/rpn.cpp -- RPN (Reverse Polish Notation) Calculator
// Fred Swartz 2001-12-05, 2002-09-27
// ---------------------------------------------------------

#include <iostream>
#include <vector>
#include <string>
#include <cmath>
#include <stdexcept>
#include <cstdlib>    // required for ::strtod()
using namespace std;
//--- prototypes
double pop(vector<double>& stk);
void printVector(vector<double>& stk);
void clearVector(vector<double>& stk);
void printUsage();

//============================================================= main
int main() {
    vector<double> opndStack; // vector used as operand stack
    string token;          // to read number or operator
    cout << "RPN Calculator" << endl;
    printUsage();
    while (cin >> token) {
        if (isdigit(token[0]) || (token.length() > 1 && (token[0] == '-' || token[0] == '+') && isdigit(token[1]))) { // if first is digit, it's number.
             // opndStack.push_back(atof(token.c_str())); // convert, push
             // Note that atof(str) has been changed to ::strtod(str, 0)
             opndStack.push_back(::strtod(token.c_str(), 0)); // convert, push
            printVector(opndStack);

        } else { // If it's not a number, assume it's an operator
            double left, right;  //  used by some operators as temps
            switch (token[0]) {  // assume operators are one char
              case '+': opndStack.push_back(pop(opndStack) + pop(opndStack));
                        break;
              case '-': right = pop(opndStack); // get right operand
                        left  = pop(opndStack); // get left operand
                        opndStack.push_back(left - right);
                        break;
              case '*': opndStack.push_back(pop(opndStack) * pop(opndStack));
                        break;
              case '/': right = pop(opndStack); // get right operand
                        left  = pop(opndStack); // get left operand
                        opndStack.push_back(left / right);
                        break;
              case '^': right = pop(opndStack); // get right operand
                        left  = pop(opndStack); // get left operand
                        opndStack.push_back(pow(left, right));
                        break;
              case '=':
              case 'p':
                        break;
              case 'c':
                        clearVector(opndStack);
                        break;
              case 'q':
              case 'x':
                        cout << "Quit" << endl;
                        exit(0);
                        break;
              case 'h':
                        printUsage();
                        break;
              default:  throw domain_error("Undefined operator");
            }
            printVector(opndStack);
            if (!opndStack.empty())
                cout << "    (" << token[0] << ") Top value: " << opndStack.back() << endl;
        }
    }
    return 0;
}//end main

//============================================================== pop
   // This utility function checks stack for underflow
   // and pops (removes and returns) last element.
double pop(vector<double>& stk) {
    if (stk.empty()) {
        throw underflow_error("Stack underflow.");
    }
    double result = stk.back();
    stk.pop_back();
    return result;
}//end pop

double peek(vector<double>& stk) {
    if (stk.empty()) {
        throw underflow_error("Stack underflow.");
    }
    return stk.back();
}//end pop

void printVector(vector<double>& stk) {
    int n = stk.size();
    cout << "[";
    for (int i = 0; i < n; i++) {
       cout << stk[i];
       if (i < n - 1)
           cout <<", ";
    }
    cout << "]" << endl;
}//end printVector

void clearVector(vector<double>& stk) {
    while (!stk.empty()) {
       stk.erase(stk.begin());
       // stk.pop_back();
    }
}//end clearVector
void printUsage() {
    cout << "  +,-,*,/,^: opr,  =,p: show top,  c: clear stack,  q,x: quit,  h: help" << endl;
}//end printVector

/*
// stl/rpn.cpp -- RPN (Reverse Polish Notation) Calculator
// Fred Swartz 2001-12-05, 2002-09-27
#include <iostream>
#include <vector>
#include <string>
#include <stdexcept>
using namespace std;
int pop(vector<int>& stk);  //--- prototype to pop stack
//============================================================= main
int main() {
    vector<int> opndStack; // vector used as operand stack
    string token;          // to read number or operator
    while (cin >> token) {
        if (isdigit(token[0])) { // if first is digit, it's number.
            opndStack.push_back(atoi(token.c_str())); // convert, push

        } else { // If it's not a number, assume it's an operator
            int left, right;  //  used by some operators as temps
            switch (token[0]) {  // assume operators are one char
              case '+': opndStack.push_back(pop(opndStack) + pop(opndStack));
                        break;
              case '-': right = pop(opndStack); // get right operand
                        left  = pop(opndStack); // get left operand
                        opndStack.push_back(left - right);
                        break;
              case '*': opndStack.push_back(pop(opndStack) * pop(opndStack));
                        break;
              case '/': right = pop(opndStack); // get right operand
                        left  = pop(opndStack); // get left operand
                        opndStack.push_back(left / right);
                        break;
              default:  throw domain_error("Undefined operator");
            }
            cout << "Result: " << opndStack.back() << endl;
        }
    }
    return 0;
}//end main
//============================================================== pop
   // This utility function checks stack for underflow
   // and pops (removes and returns) last element.
int pop(vector<int>& stk) {
    if (stk.empty()) {
        throw underflow_error("Stack underflow.");
    }
    int result = stk.back();
    stk.pop_back();
    return result;
}//end pop
*/



Posted by Scripter
,