ルギア君の戯言

雑多な記事。

電卓

GW 中に親にたのんで HP の関数電卓を買ってもらいました。


hp 35s 関数電卓 日本語マニュアル付属 HP35S-J

hp 35s 関数電卓 日本語マニュアル付属 HP35S-J


楽しいw (遊ぶな


RPN だし。


C言語のバイブルとよばれる本*1

プログラミング言語C 第2版 ANSI規格準拠

プログラミング言語C 第2版 ANSI規格準拠


にも簡単な 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つ。
多少バグがあるけど、許して。

+, -, *, /
加減乗除
^
累乗
s
サイン
c
コサイン
t
タンジェント
r
平方根
C
クリア
q
終了

負値を入力する場合は、先頭に半角スペースを入れると入力できます。

*1:僕が見たのは ANSI が採用する前のものなので、K&R 記法である。削除された可能性は低いが、載っていない可能性はある。