24/03/26 17:38:31.01 e/0sucGI.net
例として、nameとage属性をもったデータ構造を読み取るプログラムを書いてみましょう。
r = 0;
name = 0;
age = 1;
while(cell) {
print("name: " + sheet[r][name] + ", age: " + sheet[r][age]);
cell = sheet[r++][name];
}
このように、EOPでは構造体やクラスのような難解な機能を使わずとも、配列とループだけでデータ構造を操作することができます。
特筆すべきことは、EOPではデータ構造は使用時に自由に変更できます。もし、上のデータ構造に新たな属性sexが必要であれば、単に追加すればよいのです。
MALE = 1;
FEMALE = 2;
sex = 2;
sheet[0][sex] = MALE;
sheet[1][sex] = FEMALE;
3:デフォルトの名無しさん
24/03/26 19:22:17.08 e/0sucGI.net
EOPでは関数は使いません。別の処理に移動したい場合は、単にジャンプ先のセルの座標を指定すればよいのです。
以下は、すごろくを1マスずつ巡回し、BONUSマスならば2つ進め、PENALTYマスならば2つ戻り、巡回したマスをカウントするプログラムです。一度発動したボーナス/ペナルティは二回目からは無効になります。
r = 0;
c = 0;
cnt = 0
while(cell) {
cnt++;
if(cell == "BONUS") {
cell = "VISITED";
c += 2;
} else if(cell == "PENALTY") {
cell = "VISITED";
c -= 2;
} else {
c += 1;
}
cell = sheet[r][c];
}
4:デフォルトの名無しさん
24/03/26 19:23:43.98 e/0sucGI.net
べつの処理をした後、元の場所に戻ってきたい場合はどうすればいいでしょうか?スタックを使えば簡単にできます。
以下は、データの合計値を求めるプログラムです。ただし、現在のセルが配列の場合は、その配列の合計値を求めます。データは0列目が数値または配列宣言、配列宣言がされた時は1列目がジャンプ先の行番号、2列目が列番号です。
r = 0; data = 0; data_r = 1; data_c = 2;
stack = 0; stack_r = 3; stack_c = 4;
sum = 0;
while(cell) {
if (cell == "ARRAY") {
stack++;
sheet[stack][stack_r] = r;
sheet[stack][stack_c] = data;
tmp_r = r;
r = sheet[tmp_r][data_r];
data = sheet[tmp_r][data_c];
data_r = data + 1;
data_c = data + 2;
cell = sheet[r][data];
} else {
sum += cell;
cell = sheet[r++][data];
}
if (!cell) {
if (stack) {
r = sheet[stack][stack_r];
data = sheet[stack][stack_c];
data_r = data + 1;
data_c = data + 2;
stack--;
}
}
}
5:デフォルトの名無しさん
24/03/26 19:26:58.02 e/0sucGI.net
訂正:
r++やc++と書いてあるところ
すべて++r, ++cです
6:デフォルトの名無しさん
24/03/26 19:59:23.04 e/0sucGI.net
EOPでは、シートを用いてデータ構造をシンプルかつ柔軟に扱えるだけではなく、シートは手続きを表現することもできます
以下のプログラムは、4つのコマンド
ADD
を持ちます
ADDを呼ぶと、引数の数が合計値に加算されます
PRINTを呼ぶと、現在の合計値が表示されます
r = 0;
sum = 0;
while(cell) {
if (cell == "ADD") {
sum += sheet[r][cmd + 1];
}
if (cell =="PRINT") {
print(sheet[r][cmd + 1]);
}
cell = sheet[++r][cmd];
}
7:デフォルトの名無しさん
24/03/27 05:40:00.84 Ln/fAIz6.net
言語何使ってんのコレ
8:デフォルトの名無しさん
24/03/27 14:53:16.09 8k2YrkW2.net
なんかオライリーみたいな導入
9:デフォルトの名無しさん
24/03/29 14:55:32.56 hQjfrr6D.net
ID:e/0sucGI
こいつろくにプログラミングしたことないんだろうなぁ
10:デフォルトの名無しさん
24/03/29 16:33:00.75 4yVHOK9w.net
ネタスレにマジレス
11:デフォルトの名無しさん
24/03/30 19:46:50.28 lpdJhGw+.net
あれだけ連投してるのにネタスレでごまかすのは無理でしょ
まぁ足りない頭を絞って書いたものを正論で潰されるのは可哀相っちゃ可哀相だけど…
12:デフォルトの名無しさん
24/03/30 22:25:41.35 2vvOizF3.net
うわぁ……
13:デフォルトの名無しさん
24/03/31 05:30:13.50 mCr6Yy4A.net
>>1があれ以降書き込んでないのがお察し
どんな反応求めてたんだろう
14:デフォルトの名無しさん
24/03/31 10:58:19.19 bHunl/8X.net
>>11が心配
「連投してるからネタスレでない」というロジックが意味不明だし
「正論」とやらがどこに書かれているのかもわからない
15:デフォルトの名無しさん
24/03/31 11:12:10.16 AFDVA+e4.net
一次元の配列指向プログラミングならセルの参照は1個のパラメータだけで済むからより効率的
16:デフォルトの名無しさん
24/04/02 15:32:40.58 CQMIJaVM.net
1次元配列ならジャンプ先のアドレスの指定は変数1個で済む
17:デフォルトの名無しさん
24/04/02 15:41:03.62 x3qRw97u.net
多次元配列だって計算すれば同じだよ
変数一つで実現できる
逆に一次元配列を多次元配列とみなして使う方法だってあるんだし
18:デフォルトの名無しさん
24/04/02 19:06:12.99 5dwwFNXN.net
C言語なら、ポインタ型変数1個だけ使えばいいな
19:デフォルトの名無しさん
24/04/02 19:09:22.44 7yjlHQas.net
>>18
ポインタ理解できてないだろ
20:デフォルトの名無しさん
24/04/02 19:10:55.75 5dwwFNXN.net
>>19
?
21:デフォルトの名無しさん
24/04/02 19:18:03.35 JgXYUviJ.net
>>20
ポインタ型変数一つじゃ実現不可って話
22:デフォルトの名無しさん
24/04/02 19:22:08.05 kERS+9TD.net
・配列の先頭アドレスを指すポインタ
・行数,列数を表す符号なし整数
・↑をまとめた構造体
23:デフォルトの名無しさん
24/04/02 19:38:20.00 JgXYUviJ.net
それをポインタ型変数1個って言うか?
24:デフォルトの名無しさん
24/04/02 19:51:06.70 oY83wibz.net
>>21
なぜ?
25:デフォルトの名無しさん
24/04/02 19:55:08.71 vNvRaytj.net
ネタスレで、そのネタを下回る知能のやつがああだこうだ言っているという地獄
26:デフォルトの名無しさん
24/04/02 19:57:07.31 GZPLkX8A.net
ポインタ1個と即値だけでいけるがな
27:デフォルトの名無しさん
24/04/02 20:11:35.84 abcHw/BD.net
スタックポインタはいるだろ
28:デフォルトの名無しさん
24/04/02 20:20:15.30 rNuJc/A1.net
スタックは要るな
29:デフォルトの名無しさん
24/04/02 20:22:17.68 rNuJc/A1.net
いや、いらんわ
戻り先のアドレスは紙にでも書いときゃいい
30:デフォルトの名無しさん
24/04/02 20:33:07.24 edguWIiV.net
以外に伸びたなとおもったら違う方向か
31:デフォルトの名無しさん
24/04/03 11:24:36.72 07nBP01A.net
エクセルでプログラムとかメンテナンス性が最悪だからおすすめしない
32:デフォルトの名無しさん
24/04/04 03:34:46.18 GlxXdEjq.net
ぬるぽ
33:デフォルトの名無しさん
24/04/04 03:48:45.01 2O67KOQT.net
データの読み書きは
while(cell = *p++) {
// do something
}
データ構造を扱いたい時は
1つのオブジェクトがいくつのフィールドを持つか決めておき
while(cell = *(p + size)) {
// do something
}
のようにする
途中で構造を変えたくなった時のために、
sizeは3つか4つ余分に確保しておくのがベストプラクティス
データ構造を入れ子にする場合や、サブルーチンを使う場合は、スタックを使う
C言語とか忘れた
34:デフォルトの名無しさん
24/04/04 11:19:31.47 AaDBa930.net
つまんねーC言語モドキじゃなくて
Excel4マクロみたいに独自性を出していこうよ