○C++でBASICライクなプログラムを書いてみる

もちろんWindows、Linux両環境で動きます

■下のプログラム、BASICっぽいでしょ!!でも、これはC++です(笑)
下のほうに記述してあるBASIC.hヘッダを取り込むとC++でこんなプログラムが書けます。
マクロの文字列置換と、クラスで実現しています。
コンパイル時に完全なC++コードに置換されて、コンパイルされますので、 サイズ、実行速度ともにC++です(嘘です。処理が重すぎ)

//ここから*******************************************************

#include "BASIC.h"

START_BASIC

  COMMENT"コメント文はこのように書きます"

  DIM A
  DIM B
  DIM C
  DIM D
  
  SET B ="終"
  SET C ="了"
  SET B=B+C+"!!"
  SET A=0

  INPUT(&D)
  DO
    SET	A=A+1
    PRINT(A)
    IF A>=D THEN
      GOTO label1
    ELSE
      PRINT(A+"から"+D+"まで")
    END_IF
  LOOP
label1:

  PRINT(B)
  END

END_BASIC

//ここまで*********************************************************

//■ここからヘッダファイルに記述
//BASIC.h------------------------------------------------------------------------

#include <stdio.h>
#include <stdlib.h>
#include <string>

//バリアント型の変数を実現するクラス
class VARIANT_{
public :
	std::string str_val;
	double d_val;
	bool flag;//現在の値が文字列形か値型かを示すフラグ true=値型  false=文字列型
	VARIANT_(){
		str_val="";
		d_val=0;
		flag=true;//初期値は値型
	}
	//---------------------------------------
	void operator=(char*obj){
		str_val = obj;
		d_val=atof(obj);//文字を値に変換

		if(d_val==0){
			flag=false;//文字列型に設定
		}else{
			flag=true;//値型に設定
		}
	}

	void operator=(double obj){
		d_val   = obj;
		char buf[128]="";
		sprintf(buf,"%g",obj);//値を文字に変換
		str_val=buf;
		flag=true;//値型に設定
	}

	void operator=(VARIANT_ obj){
		str_val = obj.str_val;
		d_val   = obj.d_val;
		flag=obj.flag;//型情報をコピー
	}

	void operator=(int obj){
		d_val   = (double)obj;
		char buf[128]="";
		sprintf(buf,"%g",(double)obj);//値を文字に変換
		str_val=buf;
		flag=true;//値型に設定
	}
	//---------------------------------------
	VARIANT_ operator+(VARIANT_ obj){
		VARIANT_ pos;
		pos.flag=flag && obj.flag; //型情報をコピー
		//値型の処理
		pos.d_val   = d_val+obj.d_val;
		//文字列型の処理
		pos.str_val = str_val+obj.str_val;
		return pos;
	}

	VARIANT_ operator+(char*obj){
		VARIANT_ pos;
		pos.d_val = d_val+atof(obj);//文字を値に変換
		pos.str_val = str_val+obj;
		pos.flag = false;//文字列型に設定
		return pos;
	}

	VARIANT_ operator+(double obj){
		VARIANT_ pos;
		pos.d_val   = d_val+obj;
		char buf[128]="";
		sprintf(buf,"%g",pos.d_val);//値を文字に変換
		pos.str_val = buf;
		pos.flag = true;//値型に設定
		return pos;
	}

	//---------------------------------------
	VARIANT_ operator-(VARIANT_ obj){
		VARIANT_ pos;
		pos.d_val = d_val-obj.d_val;
		pos.flag = true;//値型に設定
		return pos;
	}
	VARIANT_ operator-(double obj){
		VARIANT_ pos;
		pos.d_val = d_val-obj;
		pos.flag = true;//値型に設定
		return pos;
	}
	//---------------------------------------
	VARIANT_ operator*(VARIANT_ obj){
		VARIANT_ pos;
		pos.d_val =d_val*obj.d_val;
		pos.flag = true;//値型に設定
		return pos;
	}
	VARIANT_ operator*(double obj){
		VARIANT_ pos;
		pos.d_val =d_val*obj;
		pos.flag = true;//値型に設定
		return pos;
	}
	//---------------------------------------
	VARIANT_ operator/(VARIANT_ obj){
		VARIANT_ pos;
		pos.d_val =d_val/obj.d_val;
		pos.flag = true;//値型に設定
		return pos;
	}
	VARIANT_ operator/(double obj){
		VARIANT_ pos;
		pos.d_val =d_val/obj;
		pos.flag = true;//値型に設定
		return pos;
	}
	//---------------------------------------
	bool operator==(VARIANT_ obj){
		if(obj.flag){
			return d_val==obj.d_val;
		}else{
			return str_val==obj.str_val;
		}
	}

	bool operator==(char*obj){
		return str_val==obj;
	}

	bool operator==(double obj){
		return d_val==obj;
	}
	//---------------------------------------
	bool operator<(VARIANT_ obj){
		return d_val<obj.d_val;
	}

	bool operator<(char*obj){
		return false;
	}

	bool operator<(double obj){
		return d_val<obj;
	}
	//---------------------------------------
	bool operator>(VARIANT_ obj){
		return d_val>obj.d_val;
	}

	bool operator>(char*obj){
		return false;
	}

	bool operator>(double obj){
		return d_val>obj;
	}
	//---------------------------------------
	bool operator<=(VARIANT_ obj){
		return d_val<=obj.d_val;
	}

	bool operator<=(char*obj){
		return false;
	}

	bool operator<=(double obj){
		return d_val<=obj;
	}
	//---------------------------------------
	bool operator>=(VARIANT_ obj){
		return d_val>=obj.d_val;
	}

	bool operator>=(char*obj){
		return false;
	}

	bool operator>=(double obj){
		return d_val>=obj;
	}
	//---------------------------------------
};


#define  START_BASIC  int main(int argc, char* argv[]){
#define  END_BASIC    ;getchar();return 0;}
#define  DO           ;for(;;){
#define  LOOP         ;}
#define  END          ;getchar();return 0
#define  IF           ;if(
#define  THEN         ){
#define  ELSE         ;}else{
#define  END_IF       ;}
#define  GOTO         goto
#define  PRINT        ;print_
#define  SET          ;
#define  DIM          ;VARIANT_
#define  INPUT        ;input_
#define  COMMENT      ;rem_pos=



VARIANT_ rem_pos;

void print_(int n){
	printf("%d\n",n);
}

void print_(char*str){
	printf("%s\n",str);
}

void print_(VARIANT_ obj){
	if(obj.flag){
		//値型の出力
		printf("%g\n",obj.d_val);
	}else{
		//文字列型の出力
		printf(obj.str_val.c_str());
		printf("\n");
	}
}

void input_(VARIANT_*obj){
	char buf[1024];
	printf("? ");
	gets(buf);
	*obj = buf;
}

//BASIC.h終わり-----------------------------------------------------------




▲トップページ > プログラミングの実験