新しく発言する EXIT インデックスへ
フルBASICでファイルのデータを配列に...

  フルBASICでファイルのデータを配列に入れる ウダー 2005/09/20 20:17:30 
  上のプログラムは「HAIRETSUは配列名ではあ... 青木太一 2005/09/21 07:04:17 
   └お答えありがとうございます。一応やって見... ウダー 2005/09/21 17:20:48 
    └ん?一行にカンマ区切りで数値があるのでな... 青木太一 2005/09/22 02:33:51 
     └やって見たけど何かおかしい。 ウダー 2005/09/22 15:03:08 
      └abc.txtの内容をそのままこの掲示板に貼り付... 青木太一 2005/09/22 15:21:24 
       └abc.txtの内容は ウダー 2005/09/22 19:10:41 
        └不思議だなー。たしかにhairetsu$(i)でうま... 青木太一 2005/09/23 01:03:31 
         └コードの結果 ウダー 2005/09/23 11:57:08 
          ├Windowsで作成したテキストファイルですか。... 白石 和夫 2005/09/23 13:23:58 
          │└補足 白石 和夫 2005/09/23 13:38:45 
          │ └ノートパードです。ちゃんと13と10は連... ウダー 2005/09/23 14:44:51 
          │  └できました。ちゃんと数字として読めました... ウダー 2005/09/23 15:06:10 
          └--ここから-- 青木太一 2005/09/26 06:42:55 

  フルBASICでファイルのデータを配列に入れる ウダー 2005/09/20 20:17:30  ツリーへ

フルBASICでファイルのデータを配列に入れる 返事を書く
ウダー 2005/09/20 20:17:30
フルBASICでファイルのデータを配列に入れる方法を教えてください。

let f$= "abc.txt"
open #1 : name f$
do
mat input #1, if missing then exit do : hairetsu

print hairetsu(a)
LET a=a+1
loop

ように書いてみたけど動かないです。教えてください。お願いします。

  上のプログラムは「HAIRETSUは配列名ではあ... 青木太一 2005/09/21 07:04:17  ツリーへ

Re: フルBASICでファイルのデータを配列に入れる 返事を書く
青木太一 2005/09/21 07:04:17
上のプログラムは「HAIRETSUは配列名ではありません」
というエラーダイアログが出ると思いますが、
これはdim文でhairetsuを配列であると宣言していないからです。

またa=a+1をdo loopごとに行っているのが気になります。上のプログラムの動作は

abc.txtの
1行目の1つめの数値
2行目の2つめの数値
3行目の3つめの数値
...
i行目のi個めの数値
を表示

というようなものですが、
おそらくやりたいことは

1行目の全数値
2行目の全数値
3行目の全数値
...
i行目の全数値
を表示

ではないでしょうか?
一応、そのように書き換えてみました。


let f$= "abc.txt"
open #1 : name f$
LET n=5 ! abc.txtのなかで、一行あたりに書かれているカンマ区切りの数値の個数
dim hairetsu(1 to n)
do
mat input #1, if missing then exit do : hairetsu

for i=1 to n
print hairetsu(i);
next i
print
loop
END

お役にたてたら幸いです。

   └お答えありがとうございます。一応やって見... ウダー 2005/09/21 17:20:48  ツリーへ

Re: 上のプログラムは「HAIRETSUは配列名ではあ... 返事を書く
ウダー 2005/09/21 17:20:48
お答えありがとうございます。一応やって見たけどエラーが出ました。まー、とりあえずやりたいことを説明します。

abc.txtファイルにこのようにデータがあります。

10
20
30

…   (何桁でもかまいません)

これを配列に入れたいです。例えば

hairetsu(1)=10
hairetsu(2)=20
hairetsu(3)=30

.....

どのようにすればいいでしょうか。教えてくださった方法でやると
 
”EXTYPE8013 データが余分”

というエラーが出ます。

どうも

mat input #1, if missing then exit do : hairetsu 文はあやしいみたいです。

教えてください。返事をまってます。

PS:私留学生で日本語がおかしかったらきいてくださいね。

    └ん?一行にカンマ区切りで数値があるのでな... 青木太一 2005/09/22 02:33:51  ツリーへ

Re: お答えありがとうございます。一応やって見... 返事を書く
青木太一 2005/09/22 02:33:51
ん?一行にカンマ区切りで数値があるのでなく、一行あたりには数値は一つなのですか?

だとしたら
「何桁でもかまいません」じゃなくて「何行でもかまいません」ですよね?

また、「mat input」ではなく「input」を使うのが自然です。

(ただ、そうだとすると”EXTYPE8013 データが余分”が出るのは変なんですが...まあ一応それは無視して)

また、abc.txt内のデータは全角じゃなくて半角じゃないといけないと思います。
10
20
30
ではなくて
10
20
30
です。

さて、このようなとき、ファイルが何行あるのかわからないと配列の大きさを決められません。
十進BASICの配列は大きさを大きくできないので、
1.あらかじめ対応できる最大の行数を決めてしまう。
2.一度ファイルを全走査して何行あるのかをカウントし、
 そこでdim文で配列をその行数だけ宣言し、
 再度ファイルを走査しながら今度は配列に読み込む

の二つの方法があると思いますが、とりあえずプログラムがシンプルな1の方法で書いてみました。

let f$= "w:\abc.txt" !数値が各行に一つづつ書かれたファイル
open #1 : name f$
LET n=1000 ! abc.txtのとりうる最大の行数
dim hairetsu(1 to n)

!配列にデータ読み込み
for i=1 to n
input #1, if missing then exit for : hairetsu(i)
next i


LET nn=i-1 !forループを抜けたときのi-1が有効な行数

!配列に入れたデータの表示
for i=1 to nn
print "hairetsu(";i;")=";
print hairetsu(i)
next i
END

いかがでしょう?

     └やって見たけど何かおかしい。 ウダー 2005/09/22 15:03:08  ツリーへ

Re: ん?一行にカンマ区切りで数値があるのでな... 返事を書く
ウダー 2005/09/22 15:03:08
やって見たけど何かおかしい。
エラーは
”読み込もうしたデータは数値定数でなかった”というエラ−なんです。
どうすればいいでしょうか。

      └abc.txtの内容をそのままこの掲示板に貼り付... 青木太一 2005/09/22 15:21:24  ツリーへ

Re: やって見たけど何かおかしい。 返事を書く
青木太一 2005/09/22 15:21:24
abc.txtの内容をそのままこの掲示板に貼り付けてみてください。そうでないと原因がわかりません。

おそらく先に書いたとおりデータを全角じゃなくて半角にしなくてはいけないのを、修正していないのではないでしょうか。
---
10
20
30
---
ではなくて
---
10
20
30
---
にしなくてはいけません。

または、そもそも数字ではない文字がabc.txtに入っているとか。

       └abc.txtの内容は ウダー 2005/09/22 19:10:41  ツリーへ

Re: abc.txtの内容をそのままこの掲示板に貼り付... 返事を書く
ウダー 2005/09/22 19:10:41
abc.txtの内容は

10
20
30

です。しかしhairetsu(i)はhairetsu$(i)といれたら結果が出ました。ファイルのなかのデータはやはり文字列として扱っているかな。
意見があれば言ってください。

        └不思議だなー。たしかにhairetsu$(i)でうま... 青木太一 2005/09/23 01:03:31  ツリーへ

Re: abc.txtの内容は 返事を書く
青木太一 2005/09/23 01:03:31
不思議だなー。たしかにhairetsu$(i)でうまくいくなら文字列として扱われているみたいですね。
私はhairetsu(i)でうまくいっているのに...
先頭の行が10で、最後の行が30なんですよね。
数値のある行の前に空行(改行だけされている)があったり、
数値がある最後行のあとに空行があると、その場合でも
”読み込もうしたデータは数値定数でなかった”
がでます。

ためしに文字列配列を使った、以下のコードの実行結果を
そのまま掲示板に貼り付けてください。

print "--ここから--"
let f$= "abc.txt" !数値が各行に一つづつ書かれたファイル
open #1 : name f$
LET n=1000 ! abc.txtのとりうる最大の行数
dim hairetsu$(1 to n)

!配列にデータ読み込み
for i=1 to n
input #1, if missing then exit for : hairetsu$(i)
next i

LET nn=i-1 !forループを抜けたときのi-1が有効な行数

!配列に入れたデータの表示
for i=1 to nn
print "hairetsu$(";i;")=""";
print hairetsu$(i);""""
next i
print "--ここまで--"
END

         └コードの結果 ウダー 2005/09/23 11:57:08  ツリーへ

Re: 不思議だなー。たしかにhairetsu$(i)でうま... 返事を書く
ウダー 2005/09/23 11:57:08
コードの結果

--ここから--
hairetsu$( 1 )="10"
hairetsu$( 2 )="20"
hairetsu$( 3 )="30"
--ここまで--

なのです。

しかし実際の問題はウェブレットの問題です。データをファイルから読み込み処理する問題です。配列は文字列として扱った場合またべつの問題をでてきます。

以下のコードをみてください。

option base 0 ! 配列は0から始まる
dim a(20)
dim c(20)


LET b=1000
LET n=2 ! abc.txtファイルに10,20,30,40 nの二乗データが4つある
let f$= "abc.txt" !数値が各行に一つづつ書かれたファイル
open #1 : name f$



dim S$(0 to b)
!配列にデータ読み込み
for cc=0 to b
input #1, if missing then exit for : S$(cc)
next cc


print "Original data"
for aa=0 to cc-1
print s$(aa); !ファイルから読んだデータを表示
next aa


print " "
print "Step Function"



LET i=1
LET j=2
LET M=2^n

for l=1 to n

print "スイープ第 ";
print l

LET M=M/2

for k=0 to M-1
LET a(k)=(val(S$(j*k)) +val(S$(j*k+i)))/2 !二つつのデータを取って平均とる
LET c(k)=(val(S$(j*k))-val(S$(j*k+i)))/2 !二つつのデータを取って変化とる
LET val(S$(j*k))=a(k) !計算した平均を入れ替える
LET val(S$(j*k+i))=c(k) !計算した変化を入れ替える




print a(k); !平均をプリント
print " ";

next k


print " " !隙間をあく
print " "
print " "

LET i=j
LET j=2*j

next l



END

ここで  LET val(S$(j*k))=a(k) と LET val(S$(j*k+i))=c(k)という文があやしいみたいです。
ファイルから数値として読めればいいけどそじゃないからこまっています。
何か意見がないですか。

          ├Windowsで作成したテキストファイルですか。... 白石 和夫 2005/09/23 13:23:58  ツリーへ

Re: コードの結果 返事を書く
白石 和夫 2005/09/23 13:23:58
Windowsで作成したテキストファイルですか。
行末がWindows標準のものでないと,数値データは正しく読めません。

次のプログラムを実行してみてください。

LET F$="abc.txt"
OPEN #1:NAME F$
DO
CHARACTER INPUT #1,IF MISSING THEN EXIT DO :s$
PRINT ORD(s$)
LOOP
CLOSE #1
END

実行結果は
49
48
13
10
50
48
13
10
51
48
13
10
となるはずですが,13と10が上のように連続して現れない場合は,Windowsのテキストファイルではありません。


          │└補足 白石 和夫 2005/09/23 13:38:45  ツリーへ

Re: Windowsで作成したテキストファイルですか。... 返事を書く
白石 和夫 2005/09/23 13:38:45
補足
数字の文字コードはその数字が表す数に48を加えたもの,
CRは13
LFは10
空白は32です。
これら以外の数,特に,13と10の連続以外に0から31までの範囲の数が現れたら異常です。

          │ └ノートパードです。ちゃんと13と10は連... ウダー 2005/09/23 14:44:51  ツリーへ

Re: 補足 返事を書く
ウダー 2005/09/23 14:44:51
ノートパードです。ちゃんと13と10は連続にプリントされます。テキストファイルの文字を数値として扱う方法はないんですか。あればたすかります。

          │  └できました。ちゃんと数字として読めました... ウダー 2005/09/23 15:06:10  ツリーへ

Re: ノートパードです。ちゃんと13と10は連... 返事を書く
ウダー 2005/09/23 15:06:10
できました。ちゃんと数字として読めました。私の間違いだと思います。ありがとうございました。

          └--ここから-- 青木太一 2005/09/26 06:42:55  ツリーへ

Re: コードの結果 返事を書く
青木太一 2005/09/26 06:42:55
--ここから--
hairetsu$( 1 )="10"
hairetsu$( 2 )="20"
hairetsu$( 3 )="30"
--ここまで--

のように表示されたのなら、文字列でなく数値としても読めるはずだと思うんだけどな...不思議だ。

なにはおもあれ、解決したみたいですから、おめでとうございます。


インデックスへ EXIT
新規発言を反映させるにはブラウザの更新ボタンを押してください。