GW 中に親にたのんで HP の関数電卓を買ってもらいました。
hp 35s 関数電卓 日本語マニュアル付属 HP35S-J
- 出版社/メーカー: ヒューレット・パッカード
- 発売日: 2007/07/10
- メディア: オフィス用品
- 購入: 3人 クリック: 39回
- この商品を含むブログ (10件) を見る
楽しいw (遊ぶな
RPN だし。
- 作者: B.W.カーニハン,D.M.リッチー,石田晴久
- 出版社/メーカー: 共立出版
- 発売日: 1989/06/15
- メディア: 単行本
- 購入: 24人 クリック: 623回
- この商品を含むブログ (206件) を見る
にも簡単な RPN 電卓の作成がある。
軽く僕なりに作ってみた。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> double stack[4]; char c[2], ss[80], dum[80]; char *v = "xyzt"; int i; int main() { c[1] = '\0'; printf("RPN Calculator Example.\n"); while(1) { for(i = 0; i < 4; i++) { printf("%c = %f\n", v[i], stack[i]); } printf(">"); c[0] = getchar(); ss[1] = getchar(); switch(c[0]) { case '+': stack[0] = stack[1] + stack[0]; stack[1] = stack[2]; stack[2] = stack[3]; stack[3] = 0.0; break; case '-': stack[0] = stack[1] - stack[0]; stack[1] = stack[2]; stack[2] = stack[3]; stack[3] = 0.0; break; case '*': stack[0] = stack[1] * stack[0]; stack[1] = stack[2]; stack[2] = stack[3]; stack[3] = 0.0; break; case '/': if (stack[0] == 0.0) { printf("Divide by 0.\n"); continue; } stack[0] = stack[1] / stack[0]; stack[1] = stack[2]; stack[2] = stack[3]; stack[3] = 0.0; break; case '^': stack[0] = pow(stack[1], stack[0]); stack[1] = stack[2]; stack[2] = stack[3]; stack[3] = 0.0; break; case 'r': stack[0] = sqrt(stack[0]); break; case 's': stack[0] = sin(stack[0]); break; case 'c': stack[0] = cos(stack[0]); break; case 't': stack[0] = tan(stack[0]); break; case 'C': for(i = 0; i < 4; i++) { stack[i] = 0.0; } break; case 'q': exit(0); break; default: ss[0] = c[0]; if(ss[1] != '\n') { for(i = 2; (ss[i] = getchar(), ss[i] != '\n') && i < 80; i++) ; } else { i = 0; } ss[i+1] = '\0'; stack[3] = stack[2]; stack[2] = stack[1]; stack[1] = stack[0]; stack[0] = atof(ss); break; } } }
35s と同じくレジスタ(プログラム中では stack)4つ。
多少バグがあるけど、許して。
負値を入力する場合は、先頭に半角スペースを入れると入力できます。