プログラムでフロッピーにデータを書き込む方法とX線回折データを1/5に縮減する方法

このQ&Aのポイント
  • Tiny Basicを使用してフロッピーにデータを書き込むプログラムの作り方を教えてください。
  • X線回折データのファイルを1/5に縮減するプログラムを作成したいですが、うまくいきません。どうすれば良いでしょうか。
  • X線回折データのファイルを新しいファイルに縮減する方法を教えてください。
回答を見る
  • ベストアンサー

Tiny Basic。。。。

今、やってるプログラムで躓いてしまっているのでどうか助けてください>< 今、ファイルの書き込みのプログラムでフロッピーディスクに書き込みをするプログラムをつくってて。。 前につくったのはフロッピーにjyoho01.txtのファイルを書き込むっていうのを作って 'Example-F2. 'データファイルの書き込み Cls Print "フロッピディスクにデータを書き込みます。" Print "FDを挿入して下さい。" Print "準備ができたら、";chr$(&h22);"y";chr$(&h22);"と入力してください。" ans$="" While not (ans$="y" or ans$="Y") ans$=inkey$ Wend Open "A:\jyoho01.txt" for output as #1 For i=1 to 10 Print #1,i Next i Close print "書き込みが終了しました。" End っていうのを作ったんです。これはちゃんとできたんです。 つまづいてるのが フロッピーディスク内にあるX線回折結果のデータファイル(xrd01.csv)のデータ数を1/5に縮減して、新しいファイル(xrd02.csv)を作成するプログラムを作成せよ。 っていうのなんです。 とりあえず、このX線回折結果っていうのがエクセルで 15  133.333 15.02  170 15.04  170 15.06  143.333 15.08  146.667 15.1  170 15.12  173.333 15.14  200 15.16  156.667 15.18  190 15.2  180 っていうデータがあって80までの値があるんです。 先生から聞いたところ5分の一にしろというのは15と15.1の間の数値を飛ばして15 15.1といったふうにファイルの書き込みを指示すれば14行くらいで出来るって言われて自分でやってみたんですが。。 'Example-F2. 'データファイルの書き込み Cls Print "フロッピディスクにデータを書き込みます。" Print "FDを挿入して下さい。" Print "準備ができたら、";chr$(&h22);"y";chr$(&h22);"と入力してください。" ans$="" While not (ans$="y" or ans$="Y") ans$=inkey$ Wend Open "A:\xrd02.csv" for output as #1 For i=15 to 80 step 0.1 Print #1,i Next i Close print "書き込みが終了しました。" End で実行したところ左の15 15.1っていうのはできるんですが右の値を出すことができません。 どうやったらいいんでしょう。。 長くてすみません(泣

質問者が選んだベストアンサー

  • ベストアンサー
noname#62235
noname#62235
回答No.2

#1です。 うーん、5回に1回書き出すようにするだけですよ? カウンターを用意して、最初0をセットします。 ループ中では、カウンターを5で割った余りが0のときだけ書き出しを行います。 ループ1回ごとにカウンタを1増やします。 こんなプログラムどこかにありませんか? Open "xrd01.csv" for input as #1 Open "xrd02.csv" for output as #2 Count = [空欄1] While not eof(1) Input #1, Line$ If ((Count [空欄2] 5) = 0) Then Print #2, Line$ Count = [空欄3] + 1 Wend 空欄1・空欄2・空欄3に正しい文を入れたらプログラムになるはずです。 (ヒント) 空欄1 数値が入ります 空欄2 演算子が入ります 空欄3 変数が入ります

famituu
質問者

お礼

うーん。。。 こういうの苦手で(・・;) 本当にわかんないんです。。 ここまでヒントだしてもらってるのに本当に申し訳ないです。。 空欄1とかは僕の頭じゃ0,iとかしか思い浮かばないんです(泣

その他の回答 (3)

noname#62235
noname#62235
回答No.4

ある程度当たりがついたなら、実際に当てはめてみて動かしてみたら答えがわかりますよ。 [空欄2]はmodで正解ですが、a mod bのaとbにあたるものはすでに書いてありますよ。 [空欄3]の答えは教科書には載っていません。#2で私が書いたプログラム野中で使われている数値変数です。ひとつしかありませんので絶対わかります。 何でも聞いてばかりでは成長しませんよ。少しは試行錯誤してみてください。

famituu
質問者

お礼

できました!!! 本当にありがとうございました!!

noname#62235
noname#62235
回答No.3

[空欄1] 0 または 1のどちらかが正解です。 [空欄2] 剰余(あまり)を計算する演算子です。教科書を調べてください。 [空欄3] このプログラムに登場する唯一の数値変数です。Cで始まります。

famituu
質問者

お礼

0か1なのはどうにかなると思います。 あまりのやつは a mod b が乗ってましたがここではなにをaになにをbにおくんですか? 数値変数は教科書には載ってませんでした。。

noname#62235
noname#62235
回答No.1

うーん、設問は「フロッピーディスク内にあるX線回折結果のデータファイル(xrd01.csv)のデータ数を1/5に縮減して、新しいファイル(xrd02.csv)を作成するプログラムを作成せよ。」 なんですよね。 だったら、まずxrd01.csvを読み込みモードでオープンして、読み込んでこないとダメですよ。 今のプログラムって、読み込まずに一方的に目盛り出力してるだけですよね? プログラム書いてしまうと勉強にならないので、ヒントだけ。 まず、xrd01.csvをオープンして、そのままxrd02.csvに書き出すプログラムはこんな感じになります。 Open "xrd01.csv" for input as #1 Open "xrd02.csv" for output as #2 While not eof(1) Input #1, Line$ Print #2, Line$ Wend わかりますよね? これを、5行飛ばしでやったらいいんです。 そしたら「データ数を1/5に縮減」する結果になりますから。

famituu
質問者

お礼

うーん。。。。 難しいです(泣 あ、あとデーターを五分の一にしたらグラフにするんで 15 133.33 15.1 133.55 みたいにならないとグラフができないんです。。。

関連するQ&A

  • Tiny Basic 日本語

    Tiny Basic for Windows v1.21を利用しているものです。 入力した日本語を後ろから表示したいです。あいうと入力したら、ういあと出力したいです。 以下が実行したプログラムです。 10 INPUT "お名前は?: ", U$ 20 PRINT "こんにちは "; U$ ;" さん" 25 REM 30 INPUT "丸がいくつ欲しいですか?: "; N 35 S$ = "" 40 FOR I = 1 TO N 50' S$ = S$ + "○" print "○" 55 NEXT I 60 'PRINT S$ 65 REM 70 INPUT "もう一度やりますか(Y/N)? "; A$ 80 IF LEN(A$) = 0 THEN GOTO 70 90 A$ = LEFT$(A$, 1) 100 IF (A$ = "Y") OR (A$ = "y") THEN GOTO 30 110 PRINT "さようなら " 111 INPUT "挨拶はなん回: "; N2 120 FOR I = 1 TO N2 130 PRINT RIGHT$(U$,6); "さん "; 140 NEXT I 150 PRINT 160 PRINT "さようなら " 170 END 行番号130の処理では、アルファベットを後ろから表示できました。ひらがなや漢字はそうなりません。 御指摘お願いします。

  • N88 basicプログラムの質問(ノルム計算)1

    N88 basicプログラムにおいて鉱物のノルム計算ができるようにしたいのですが、プログラムを打ち込んだのですが、うまく動きません。どなたかわかる方がいればご教授頂きたく願います。 かなり長くなりますが、ぜひともお願い致します。 下記、打ち込んだプログラムとなります。 長いので、質問を分けて入力します。 10 ' 20 '***** normative calculation program for clay minerals ***** by T,Igarashi,1983 30 ' 40 OPTION BASE 1 50 CONSOLE 0,25,0,1 60 WIDTH 40,25 70 ' 80 ' 90 DIM A$(22),DMY$(22),AA$(22),B1$(31),M$(8),L$(8) 100 DIM A(8,22),A1(22),A2(22),B(31),B0(8,31),C9(31),TOTAL(2,8) 110 GOSUB *INIT.1 120 ON ERROR GOTO 5000 130 GOSUB *ENTER 140 FOR QQ=1 TO NN 150 GOSUB *INIT.2 160 IF KORF=1 THEN GOSUB *FILE ELSE GOSUB *KEYBOARD 170 GOSUB *STORE 180 GOSUB *CALC 190 GOSUB *OUTPUT 200 NEXT QQ 210 GOSUB *PRINTOUT 220 GOTO 130 230 ' 240 ' 250 ' 260 *INIT.1 270 RESTORE 290 280 FOR I=1 TO 22 : READ AA$(I) : READ A2(I) : NEXT 290 DATA SIO2,60.085,TiO2,79.899,Al2O3,101.961,Fe2O3,159.692,FeO,71.846,MnO,70.937,MgO,40.304,CaO,56.079,Na2O,61.979,K2O,94.195 300 DATA P2O5,141.943,Cl,35.453,SO3,80.57,S,32.6,Cr2O3,151.989,ZrO2,123.218,F,18.99,CO2,44.9,H2O+,18,H2O-,1,Ig.LOSS,1,Others,1 310 RESTORE 330 320 FOR I=1 TO 31 : READ B1$(I) : NEXT 330 DATA Q,C,ad,mi,ab,an,ka,se,ch,gi,mo,pp,dp,al,Z,hl,th,cc,mg,sd,li,mt,he,cm,pr,il,ru,ap,fr,en,ot 340 C9(1)=A2(1) : C9(2)=A2(3) : C9(3)=A2(1)+A2(3) : C9(4)=A2(10)+A2(3)+A2(1)*6 : C9(5)=A2(9)+A2(3)+A2(1)*6 : C9(6)=A2(8)+A2(3)+A2(1)*2 : C9(7)=A2(3)+A2(1)*2+A2(19)*2 350 C9(8)=A2(10)+A2(3)*3+A2(1)*6+A2(19)*2 : C9(9)=A2(7)*5+A2(3)+A2(1)*3+A2(19)*4 : C9(10)=A2(3)+A2(19)*3 : C9(11)=A2(9)*33+A2(3)+A2(7)+A2(1)*4+A2(19)*4 : C9(12)=A2(3)+A2(1)*4+A2(19) 360 C9(13)=A2(3)+A2(19) : C9(14)=A2(10)+A2(3)*3+A2(13)*4+A2(19)*6 : C9(15)=A2(1)+A2(16) : C9(16)=(A2(9)-16)/2+A2(12) : C9(17)=A2(9)+A2(13) : C9(18)=A2(8)+A2(18) : C9(19)=A2(7)+A2(18) : C9(20)=A2(5)+A2(18) 370 C9(21)=A2(4)+A2(19) : C9(22)=A2(4)+A2(5) : C9(23)=A2(4) : C9(24)=A2(5)+A2(15) : C9(25)=A2(5)-16+A2(14)*2 : C9(26)=A2(2)+A2(5) : C9(27)=A2(2) : C9(28)=A2(8)*10+A2(11)*3+A2(19) 380 C9(29)=A2(8)-A2(17)*2 : C9(30)=A2(1)+A2(7) : C9(31)=1 : DD=0 390 FOR I=1 TO 31 : B(I)=0 : NEXT 400 RETURN 410 ' 420 ' 430 ' 440 *ENTER 450 C=0 : KORF=0 : SCREEN 3,3 : CLS 3 : SCREEN 3,0 : LINE(0,0)-(639,199),6,BF : COLOR 2 460 LOCATE 0,5 : PRINT "How many samples (Max 8 samples)";: INPUT NN 470 IF NN>8 THEN CLS 1 : GOTO 460 480 IF NN=0 THEN GOTO *PROEND 490 COLOR 2 : LOCATE 0,8 : PRINT "Input data from Keyboard or File or End : K/F/E" 500 Y$=INKEY$ 510 IF Y$="" THEN 490 520 IF Y$="e" OR Y$="E" THEN GOTO *PROEND 530 IF Y$="k" OR Y$="K" THEN KORF=0 : RETURN 540 IF Y$<>"f" AND Y$<>"F" THEN 490 550 KORF=1 560 RETURN 570 ' 580 ' 590 ' 600 *INIT.2 610 CLS 1 620 FOR I=1 TO 22 : A(QQ,I)=0 : NEXT I 630 FOR I=1 TO 31 : B(I)=0 : B0(QQ,I)=0 : NEXT I 640 RETURN 650 ' 660 ' 670 ' 680 *FILE 690 OPEN "data.1" AS #1 700 FIELD #1,40 AS MINERAL$,40 AS L1$ 710 FOR I=1 TO 22 : FIELD #1,(I-1)*4+80 AS DMY$(I),4 AS A$(I) : NEXT 720 MAX=LOF(1) : IF MAX=0 THEN RETURN 440 730 LOCATE 1,2 : PRINT MAX;"records are filing." 740 IF DD=1 THEN 800 750 LOCATE 2,5 : PRINT "You need list (Y/N)?": Y$=INKEY$ 760 IF Y$"" THEN 750 770 IF Y$="N" OR Y$="n" OR Y$="ミ" THEN 800 780 IF Y$="Y" OR Y$="y" OR Y$="ン" THEN GOSUB *NAME.LIST : GOTO 800 790 GOTO 750 800 LOCATE 2,10 : INPUT "Record No.";N 810 IF N>MAX THEN CLS 1 : GOTO 730 820 GET #1,N 830 M$=MINERAL$ : L$=L1$ 840 FOR I=1 TO 11 : A(QQ,I)=CVS(A$(I)) : A(QQ,I+11)=CVS(A$(I+11)) : NEXT 850 CLOSE #1 : DD=1 860 LOCATE 2,15 : PRINT "Correct data : Y/N"; : Y$=INKEY$ 870 IF Y$="" THEN 860 880 IF Y$="Y" OR Y$="y" THEN C=1 : GOTO 1120 890 IF Y$="N" OR Y$="n" THEN RETURN 180 900 GOTO 860 910 ' 920 ' 930 ' 940 *NAME.LIST 950 LPRINT 960 LPRINT CHR$(27) ; "V0960" ;CHR$(&H8) 970 LPRINT "Sample Name" ; TAB(40); "Locality" 980 LPRINT CHR$(27);"V0960";CHR$(&H8) 990 FOR II=1 TO MAX 1000 GET #1, II 1010 M$=MINERAL$ : L$=L1$ 1020 LPRINT M$; TAB(40); L$ 1030 NEXT 1040 LPRINT CHR$(27) ; "V0960";CHR$(&H8) 1050 LPRINT CHR$(12) 1060 RETURN 1070 ' 1080 ' 1090 ' 1100 *KEYBOARD 1110 M$="" : L$="" : FOR I=1 TO 22 : A(QQ,I)=0 : NEXT I

  • VBへの変換の仕方 RS232C送信データとチェックサム

    以下のプログラムをVBに変換する仕方を教えてください。 サンプルプログラム 1110 CHKSUM=0 1120 FOR i=1 to LEN(A$)      'A$は送信データ 1130 CHKSUM=CHKSUM+ASC(MID$(A$,i,1) 1140 NEXT i 1150 C$=CHR$((CHKSUM+13) MOD 256) 1160 PRINT #1,A$;CHR$(13);C$; 私のVBプログラムは1110行から1150行まではそのままで CHKSUM=0 FOR i=1 TO LEN(A$) CHKSUM=CHKSUM+ASC(MID$(A$,i,1) NEXT i C$=CHR$((CHKSUM+13) MOD 256) としました。 送信部分を MSComm1.Output =A$ & CHR$(&H13) & C$ としてみましたが 1160行にあるセミコロン ";" はCHR$(&h3B) として送る必要があるのでしょうか? MSComm1.Output =A$ & CHR$(&h3B) & CHR$(&h13) ・・・・・・ また、データとしてA$="I 02"のチェックサムは "リ" となりますが正しいのでしょうか? 以上ご教示ください。

  • Tiny Basicのプログラムで。。

    次の5人の学生の成績の個人別の平均点と、科目別の平均点をそれぞれ求め、表示するプログラムを作成せよ。Print Using 文を使うと、きれいな表形式の出力が可能です。 学籍番号 英語 数学 情報 平均   1   70 60 80 2 50 60 50 3 70 90 100 4 90 100 50 5 40 70 80 という問題があって。。自分なりにやってみたんですが。。 Dim a(5,5) For i=1 to 5 For j=1 to 5 Read a(i,j) print a(i,j); Next j print Next i Data "学生番号","英語","数学","情報","平均" Data 1,70,60,80,70 Data 2,50,60,50,53 Data 3,70,90,100,87 Data 4,90,100,50,80 Data 5,40,70,80,63 Data "平均",64,76,72,71 End っていうふうにつくってみたんですがうまくいかなくて。。 みなさん、助けてください><

  • 書き出し処理速度について

    バイナリデータを読み込み、数値データに変換、テキストファイルにタブ区切りで書き出すプログラムをvba/excelにて作成中ですが、書き出し処理速度の遅さに困惑しております。数値データに変換した配列はDATA(256,120000)としており、書き出しデータ数は約3,000,000個あります。その書き出しプログラムを下記のように記述したのですが、とんでもなく処理速度がおそいのです。   Open "c:\test.txt" For Output As #2 For i = 1 To 120000 For j = 1 To 256 Print #2, DATA(j, i); Chr(9);     Next j  Print #2, Chr(10); Next i Close #2 対処方法をご存知でしたら、ご教授願います。

  • N88互換BASICで変換したが使えません。その3

    400 LOCATE 0, 0 :PRINT DATE$; 410 LOCATE 25, 0 :PRINT TR$(TR.NO); 420 LOCATE 70, 0 :PRINT TIME$; 430 TM$=" " 440 WHILE TM$<>"00" AND TM$<>"30" 450 LOCATE 70, 0 :PRINT TIME$; 460 MID$(TM$,1,2)=MID$(TIME$,7,2) 470 XXX!=FRE(0) ' 480 WEND 490 LOCATE 0, 0 :PRINT DATE$; 500 LOCATE 25, 0 :PRINT TR$(TR.NO); 510 LOCATE 70, 0 :PRINT TIME$; 520 GOSUB *DISK.OUT 530 GOTO *TIME.30 540 ' 550 'Writting data to floppy 560 *DISK.OUT 570 PRINT:TR.NO=1 580 ON TR.NO GOSUB *TR.1,*TR.2 590 XXX!=FRE(0) ' 600 RETURN 610 ' 620 ' 630 *TR.1 640 KO.J=0 :PV$="" 650 CLS 660 LOCATE 0, 2 :PRINT "***Getting data***" 670 OPEN "COM:E8N" AS #1 680 PRINT #1,"TS0" 690 PRINT #1,CHR$(&H1B)+"T" 700 PRINT #1,"FM0,01,30" 710 LINE INPUT #1,DM$ 720 WHILE MID$(DM$,2,1)<>"E" :LINE INPUT #1,DM$ :WEND 730 PRINT #1,"FM0,01,30" 740 LINE INPUT #1,DM$

  • sprintf 初歩的な質問

    お世話になっております。 最近独学でC言語の勉強を始めたのですが型の違う値の代入に関して わからないことがあり質問します。 ■やりたいこと■ char型dataの値を2で割った余りを char型ansの[0]から順番に格納してく。 (2の補数を取るためにこのような処理を 考えています(10進を24ビット2進へ変換したい)) ■コード■ #include<stdio.h> #include<stdlib.h> #include<string.h> #include<windows.h> int main(){ char data[256]="9"; int y; int i; char ans[25]; char* p_ans = ans; y=atoi(data); for(i=0;i<24;i++){ sprintf(ans[i], "%d",y%2); //←エラー y = y/2; } } ■質問■ 上記ソースの中のエラー部分をどのように記述していいのか わかりませんでした。初心者的な発想でポインタを使う方法はと思い sprintf(*(p_ans+i),"%d",y%2); というような記述も試してみましたが駄目でした。 この部分をどのように書いたらいいか詳しい方、教えていただけると 助かります。以上、よろしくお願いします。

  • 配列について

    以下の配列についての問題でわからないことがあるので、教えてください。 /* x と y の積を求める。 */ #include <stdio.h> int main(void) { int x[2][3] = {{1,2,3}, {4, 5, 6}}; int y[3][2] = {{1, 5}, {5, 3}, {8, 1}}; int ans[2][2] = {0}; int i, j, k, temp; for(i = 0; i < 2; i++) { for (k = 0; k < 2; k++) { temp = 0; for(j = 0; j < 3; j++) { temp += x[i][j] * y[j][k]; } ans[i][k] = temp; } } for(i = 0; i < 2; i++) { for(j = 0; j < 2; j++) { printf("%4d",ans[i][j]); } putchar('\n'); } return(0); } 以下の部分について詳しく説明してもらえないでしょうか? int ans[2][2] = {0};  int i, j, k, temp; for(i = 0; i < 2; i++) { for (k = 0; k < 2; k++) { temp = 0; for(j = 0; j < 3; j++) { temp += x[i][j] * y[j][k]; } ans[i][k] = temp; } }

  • N88互換BASICで変換したが使えません。その2

    140 DEF FNF4$(X$) =MID$(X$,1,2)+":"+MID$(X$,3,2)+":"+MID$(X$,5,2) 150 DEF FNF5!(X$,X) =VAL(MID$(X$,X)) 160 CLS 170 LOCATE 20,10 :PRINT "3)How many sensors will you use?" 180 LOCATE 20+40,10 :PRINT " " 190 LOCATE 20+40,10 :LINE INPUT KO.TR$ 200 KO.TR=VAL(KO.TR$) 210 IF KO.TR<1 OR KO.TR>30 THEN BEEP :GOTO 180 220 LOCATE 25,10 :PRINT "Ready to send data?" 230 LINE INPUT AA$ 240 IF AA$<>"" AND AA$<>"Y" AND AA$<>"y" THEN *END. 250 *MAIN.START 260 CLS 270 LOCATE 25,10 :PRINT "****Start*****" 280 LOCATE 70, 0 :PRINT TIME$; 290 ' 300 'Writting data to floppy 310 *DISK.SET 320 FFF$="B:"+FNF1$(DATE$,TIME$) 330 OPEN FFF$ FOR OUTPUT AS #1 340 PRINT #1,Q$+DATE$+Q$+R$+Q$+STR$(KO.TR)+Q$+R$ 'DATE$,SENSORS 350 CLOSE 360 ' 370 'Sampling data every 30 seconds 380 *TIME.30 390 CONSOLE 0,25

  • フロッピーディスクのデータの消去

    フロッピーディスクでCSVデータをもらいました。 用が済んだので、このデータを削除しようとしたら 「○○(ファイル名)を削除できません。このディスクは書き込み禁止になっています。書き込み禁止を解除するか、別のディスクを使ってください。」 とメッセージが出ます。 この書き込み禁止を解除するにはどうすればいいのでしょうか? 宜しくお願いします。