○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終わり-----------------------------------------------------------
▲トップページ
>
プログラミングの実験