さー、今日から裏教室が始まるよー。ここではおもろいテクニックをいろいろ教えてくけん、みんな積極的に身につけんさいな。
実は俺、FORTRAN がめさめさ好きなんよ。それん比べてC++のダサいこと。耐えられんわ。ゆーことで、今回はそういう同志のためんおもろいマクロの活用法を教えたるけんねー。
ほな、今回の要点な。
では、いってみよー!
先ずは変数の型。FORTRAN じゃ、INTEGER*4 やとか、REAL*8 やとか、サイズがよー分かってええよな? C++はここがあかんのよな。(注:これは本音です。VC++では __int32 とかがあって、やっぱりM$の方もそう感じてたんでしょうね)
ほな、変えような。引数は参照渡しやけん、引数用のは別に作るな。(typedef でなく #define してるあたりがまずい)
#define INTEGER4 int #define PINTEGER4 int& #define INTEGER2 short #define PINTEGER2 short& #define INTEGER1 char #define PINTEGER1 char& #define REAL4 float #define PREAL4 float& #define REAL8 double #define PREAL8 double& #define CHARACTER char #define PCHARACTER char* #define LOGICAL1 bool #define PLOGICAL1 bool& #define LOGICAL4 int #define PLOGICAL4 int& #define FALSE false #define TRUE true
で、次は関数。戻り値付きの関数は、戻り値の型、FUNCTION 、名前、引数と書いてくんやけど、実は引数の型は書かんのよ。文法上それは真似できんけん、FUNCTION を定義しとくだけにしとこな。そして、戻り値なしの関数は、SUBROUTINE 、名前、引数と書いてくんよ。そして、呼ぶときには CALL を前につけるんよ。やけん、こう定義しとけばええね。
#define FUNCTION #define SUBROUTINE void #define CALL //(FUNCTION や CALL は書かなくてもコンパイルできる。問題あり)
そして戻り値なんやけど、FORTRAN では関数名に代入する感じになるんよ。けどそれは無理やけん、値は RETURN で直接返すようにしような。
#define RETURN return
そして、メインの関数だけは PROGRAM で始めるんや。そして、STOP で終わる。こんな感じやな。
#define PROGRAM(n) void main(){ //(void main なところがさらに素人っぽい)
#define STOP return //(RETURN と書いてもエラーが出ない。問題あり)
で、次は { } カッコ。これは状況によって変わるけん、いろいろ定義しとく必要がある。そして、関数の初めのカッコは FORTRAN では対応するもんがないんよ。やけん、これは BEGIN で代用しよな。他にも同時に IF とかも定義しとこな。
#define BEGIN {
#define END }
#define IF if
#define GT >
#define GE >=
#define LT <
#define LE <=
#define EQ ==
#define NE !=
#define AND &&
#define OR ||
#define NOT !
#define THEN { //(BEGIN と書いてもエラーが出ない。問題あり)
#define ENDIF } //(END や ENDDO と書いてもエラーが出ない。問題あり)
#define ELSE else
#define BELSE } else { // ブロック IF 文用の ELSE
#define DO(V, F, E) for(V = (F); V <= (E); V++)
#define SDO(V, F, E, S) for(V = (F); V <= (E); V += (S)) // 増分付き DO
#define ENDDO } //(END や ENDIF と書いてもエラーが出ない。問題あり)
#define GOTO goto
#define CONTINUE ;
#define MOD(A, B) ((A) % (B))
あとは READ 文と WRITE 文。こればっかりはいろいろやるのは無理やけん、こんな感じにしとくわ。(クラスを作り、コンマ演算子をオーバーロードすればそれなりになりますが、そんな技術があるのならこんなことはしないでしょうね(笑))
#define READ cin #define WRITE cout #define ENDL endl
あとはこいつらをヘッダファイル FORTRAN.H に入れといて、インクルードするようにしとけばええな。主なヘッダファイルもこん中でインクルードしとけば、他にいろいろインクルードせんですむな。(これは別に問題ないです)
#include <iostream.h> #include <fstream.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <memory.h> #include <ctype.h> #include <math.h>
これで大体 FORTRAN っぽくできるようになったね。ほな、1つプログラムをこさえてみよか。
| プログラム | 実行結果 |
|---|---|
// Test1.f.cpp
#include "FORTRAN.H"
LOGICAL1 FUNCTION INPUT(PINTEGER4 A, PINTEGER4 B);
SUBROUTINE DISPRES(PINTEGER4 A, PINTEGER4 B);
PROGRAM(TEST1)
INTEGER4 A, B;
LOOP:
IF (NOT INPUT(A, B)) GOTO ENDFUNC;
CALL DISPRES(A, B);
GOTO LOOP;
ENDFUNC:
STOP;
END
LOGICAL1 FUNCTION INPUT(PINTEGER4 A, PINTEGER4 B)
BEGIN
LOGICAL1 INPUTR;
INPUTR = FALSE;
WRITE << "2つの数字を入れてね" << ENDL;
READ >> A >> B;
IF (A LE 0 OR B LE 0) RETURN INPUTR;
INPUTR = TRUE;
RETURN INPUTR;
END
SUBROUTINE DISPRES(PINTEGER4 A, PINTEGER4 B)
BEGIN
WRITE << "和:" << A + B << ENDL
<< "差:" << A - B << ENDL
<< "積:" << A * B << ENDL
<< "商:" << A / B << ENDL
<< "余:" << MOD(A, B) << ENDL;
RETURN;
END |
2つの数字を入れてね 9 4 和:13 差:5 積:36 商:2 余:1 2つの数字を入れてね 500 93 和:593 差:407 積:46500 商:5 余:35 2つの数字を入れてね 2 9 和:11 差:-7 積:18 商:0 余:2 2つの数字を入れてね 0 0 |
とても美しいよね。(セミコロンがあったり、ちょっと文法違ったりと、とても中途半端。自動字下げも効かないし、色も付かない)
こんなんなら、FORTRAN 好きの俺も満足できるプログラムが組めるってもんよ。(なら、FORTRAN を使えばいいだけの話)
さぁ、FORTRAN が好きでC++にはなじめないという人は真似してみん? PASCAL が好き、COBOL が好きゆう人も、似たようにすればきっと満足できると思うよ。(そんなことしてたら、いつまでたってもC++が使えるようになりません)
ほな、そういうわけで要点な。
じゃ、次回も期待してな。
Last update was done on 2000.8.29
この講座の著作権はロベールが保有しています