C言語-インタプリタminiBASIC |
10. 演算子の追加
条件判定式で比較演算子(=,<>,<,>,<=,>=)が必要になる。例えば、1=1は真であり、1=2は偽である。C言語同様に偽を0と定義すれば、1=2は0という計算結果になる。偽(0)以外は真であるが、ここでは真を1とする。したがって、1=1は1という計算結果になる。
条件判定式
式1 比較演算子 式2
式1と式2を比較演算子にしたがって判定し、真のときは1、偽のときは0の計算結果になる。
= | 等しい |
<> | 等しくない |
< | より大きい |
> | より小さい |
<= | 以下 |
>= | 以上 |
double logic(void) { 式1の計算結果を得る 次のトークン(比較演算子)取得 永久ループ if トークンが < である 次のトークン取得 if トークンが = である 次のトークン取得 式2の計算結果を得る if 式1は式2以上 答えを1に設定 else 答えを0に設定 else if トークンが > である 次のトークン取得 式2の計算結果を得る if 式1は式2と等しくない 答えを1に設定 else 答えを0に設定 else 式2の計算結果を得る if 式1は式2より大きい 答えを1に設定 else 答えを0に設定 else if トークンが > である … … 答えを返す }
[eval2.c] → download eval2.c | |
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 90: 91: 92: 110: 111: 112: 127: 128: 129: 149: 150: 151: 154: |
#include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <string.h> #include "gettoken.h" /* gettoken.c */ /* 関数プロトタイプ宣言 */ double logic(void); /* 論理式 */ double expression(void); /* 式 */ double term(void); /* 項 */ double factor(void); /* 因子 */ double number(void); /* 数値・変数 */ void errorx(char *, char *); /* エラー終了 */> /* グローバル変数 外部参照 */ extern double hensuu[26]; /* 変数用 A - Z */ double logic(void) { double ans; ans = expression(); get_token(); while(1){ if(*token == '<'){ /* <>,<=,< */ get_token(); if(*token == '='){ /* 以下 */ get_token(); if(ans <= expression()) ans = 1; else ans = 0; }else if(*token == '>'){ /* 等しくない */ get_token(); if(ans != expression()) ans = 1; else ans = 0; }else{ /* より小さい */ if(ans < expression()) ans = 1; else ans = 0; } }else if(*token == '>'){ /* >=,> */ get_token(); if(*token == '='){ /* 以上 */ get_token(); if(ans >= expression()) ans = 1; else ans = 0; }else{ /* より大きい */ if(ans > expression()) ans = 1; else ans = 0; } }else if(*token == '='){ /* 等しい */ get_token(); if(ans == expression()) ans = 1; else ans = 0; }else break; } unget_token(token); return(ans); } double expression(void) { <<省 略>> } double term(void) { <<省 略>> } double factor(void) { <<省 略>> } double number(void) { <<省 略>> } void errorx(char *s1, char *s2) { <<省 略>> } |
メインプログラムmbas09.cとサブプログラムmb_cmds5.cの関数expression()をすべてlogic()に変更する。
INPUT "Data1 = ",A INPUT "Data2 = ",B X = A = B PRINT "A = B = "; X X = A <> B PRINT "B <> B = "; X X = A > B PRINT "A > B = "; X X = A >= B PRINT "A >= B = "; X X = A < B PRINT "A < B = "; X X = A <= B PRINT "A <= B = "; X END |
実行結果にmakeの結果を示していないがmakefileのeval.cとeval.objをeval2.c、eval2.objに変更してメイクする。
D:\Data\src>mbas reidai07.mb Data1 = 321 Data2 = 123 A = B = 0.000000 A <> B = 1.000000 A > B = 1.000000 A >= B = 1.000000 A < B = 0.000000 A <= B = 0.000000 終了します |
D:\Data\src>mbas reidai07.mb Data1 = 123 Data2 = 321 A = B = 0.000000 A <> B = 1.000000 A > B = 0.000000 A >= B = 0.000000 A < B = 1.000000 A <= B = 1.000000 終了します |
D:\Data\src>mbas reidai07.mb Data1 = 123 Data2 = 123 A = B = 1.000000 A <> B = 0.000000 A > B = 0.000000 A >= B = 1.000000 A < B = 0.000000 A <= B = 1.000000 終了します |
Copyright © 2001 Hiroshi Masuda |