BASIC言語の問題(初心者)

このQ&Aのポイント
  • BASIC言語の仕組みは読めても、組み立てが出来ない問題について
  • 二分法とニュートン・ラプソン法による2の平方根の計算方法について紹介
  • パソコンの知識がない文系学生がBASIC言語の問題に困っている
回答を見る
  • ベストアンサー

BASIC言語の問題(初心者)

こんばんは(>_<) 学校からの課題で非常に困っています!!!! BASIC言語の仕組みは読めても、どうしても組み立てが出来ないのです。。。 *1* 2の平方根を出力しなさい(二分法による平方根の計算) ただしδ=0.0001とする *2* 2の平方根を出力しなさい(ニュートン・ラプソン法による平方根の計算) ただしδ=0.0001とする ヒントとして、それぞれのアルゴリズム(?)があるので紹介します(>_<) *1*(xの平方根を精度δで求める) a←0 b←x while b-a < δ do c←(a+b)/2 if C*C > x then b←c else a←c endif done return a *2*(xの平方根を精度δで求める) y←x while │x-y*y│ < 2yδ do y←(y*y+x)/2y done return y 自分は文系で、パソコンの知識まったくないので、 どうかお助け下さいo(;△;)o涙

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

  • ベストアンサー
  • A88No8
  • ベストアンサー率52% (834/1602)
回答No.4

こんにちは  *1* のプログラム a の値が根に収束していくことに間違いないですが、うまく動かないとは「どんなこと」が?  なお、146行の最後の PRINT 文の末尾にある「;」は、余計ですね(^^;

beru415
質問者

補足

あああ(>_<) ホント質問の仕方が下手すぎてごめんなさいm(_ _)m(涙) 先程画像を質問に添付したのですが、プログラムの実行画面において、同じものが表示されるようにしなくちゃいけないんです(>_<) ただ、先程自分が書いたプログラムだと、PRINT文は表示されるものの、数値の値は全く表示されませんorz 何が間違いなのか自分でもわからず、徹夜で考えても出来ず、もうお手上げ状態です(ToT)

その他の回答 (5)

  • A88No8
  • ベストアンサー率52% (834/1602)
回答No.6

こんにちは #5の補足です。  ISO で規格化された Full BASIC言語の解説が参考URLにあります。  その中に「演算結果の正確さ」という項があって一節を引用します。 >Full BASICには数値演算の実行結果の正確さに関する規定があります。この規定は四則演算ばかりでなく,べき乗演算やSQR関数などの組込み関数にも適用されます。その規定のおかげで,べき乗演算やSQR関数の予期せぬ誤差を心配する必要がなくなります。 >次のプログラムは100以下のピタゴラス数をすべて求めるものですが,Full BASICでは正しいプログラムです。しかし,規格外のBASICでは正しい結果が得られることを保証することができません。実際,昔のN88-BASICでは正しくない結果が得られます。

参考URL:
http://hp.vector.co.jp/authors/VA008683/MS2Full.htm
  • A88No8
  • ベストアンサー率52% (834/1602)
回答No.5

こんにちは >先程画像を質問に添付したのですが、プログラムの実行画面において、同じものが表示されるようにしなくちゃいけないんです(>_<)  一つ確認です。 添付された印刷物は、オリジナルのNEC PC-9800シリーズに組み込まれたN88-BASICかN88-BASIC(86)での実行結果ですか?  N88互換BASIC for Windowsは、N88-BASIC命令互換であって、浮動小数点計算精度まで踏み込んだシステム互換の保証は無いと思いますよ。 それは、N88互換BASIC for Windowsがマイクロソフト社製の Visual BASIC 5.0で開発されていることから判ります。  下記の(1)~(3)は、すべてマイクロソフト社の製品ですが、(1)はバグもあり(有名なところではPRINT文のバグ)(2)~(3)で改善されていったはずです。 (1)N88-BASICやF-BASICなどの8ビットPC時代 (2)Quick BASIC 16~32ビットPCのMS-DOS時代 (3)Visual BASIC Windows時代  つまり、印刷物の記載よりもN88互換BASIC for Windowsの方が正しい結果を出している可能性が高いということです。  電卓使って筆算で検証してみては?(^^;

  • A88No8
  • ベストアンサー率52% (834/1602)
回答No.3

こんにちは  #2です。  #2の訂正と例文を追加します。 ■変数 (1)事前に宣言しなければ、単精度。 (2)スコープ(有効範囲)は、広域変数として扱う。 (3)数字が前に英字が後にある場合は、変数名ではなく式(乗算)とする   【例】 2y は、2*y と解釈する。 (4)定数は大文字、変数は小文字で定義する(但し大文字と小文字は区別されない)。 ■← (1)右辺の式を左辺の変数に代入。   【例】LET DELTA = 0.0001' 定数 δ   【例】LET a = 0 : b = 0 : c = 0' 変数の初期化   【例】LET c = (a + b) / 2 ■while [条件] do~done (1)条件が真の間~に書かれた命令をループ(繰り返す)する ステートメント。   【例】WHILE (b - a) < DELTA        [処理]      WEND ■if [条件式] then [処理1] else [処理2] endif (1)条件式が真ならば[処理1]を実行し、偽ならば[処理2]を実行する   【例】IF (c * c) > x THEN LET b = c ELSE LET a = c ■return [変数] (1)変数の値を表示してプログラムを終了する。   【例】PRINT y      END ■|[式]| (1)式の値の絶対値を取る   【例】ABS(x - y * y) ■* / (1)四則演算のうちかけ算、わり算を表わす乗法演算子。 ■+ - (1)四則演算のうち足し算、引き算を表わす加法演算子。 ■> < (1)大なり、小なりの比較を表わす関係演算子。

beru415
質問者

補足

丁寧なご回答、ほんと感謝です!!! ありがとうございます!!!!(>_<)(>_<)(>_<) おかげさまで、*2*の問題は 100 REM NEWTON 110 INPUT X 120 Y=X 123 KAISU=0 125 DELTA=0.000001 126 PRINT" 回数   Y    Y^2  │X-Y^2│" 127 PRINT"--------------------------------------" 130 WHILE (ABS(X-(Y^2)))/(2*Y) > DELTA 131 PRINT USING "####";KAISU; 132 PRINT USING " #.######";Y; 133 PRINT USING " #.######";(Y^2); 134 PRINT USING " #.######";(ABS(X-(Y^2))) 140 Y=((Y^2)+X)/(2*Y) 145 KAISU=KAISU+1 150 WEND 160 PRINT"--------------------------------------" 170 END というプログラムに「2」を代入させて、成功しました!!! ただ、*1*は同様にして以下のようにつくったのですが、 100 REM 二分法 110 INPUT X 120 A=0 123 B=X 124 C=0 125 DELTA=0.0001 127 KAISU=0 130 PRINT "回数  A    B   区間の幅    C   C^2" 131 PRINT "---------------------------------------------------" 140 WHILE (B-A) > DELTA 141 PRINT USING"####";KAISU; 142 PRINT USING" #.######";A; 143 PRINT USING" #.######";B; 144 PRINT USING" #.######";(B-A); 145 PRINT USING" #.######";C; 146 PRINT USING" #.######";(C^2); 150 C=(A+B)/2 160 IF (C^2)>X THEN LET B=C ELSE LET A=C 165 KAISU=KAISU+1 170 WEND 180 PRINT"----------------------------------------------------" 190 END 上手く実行画面に出てくれませんorz 学校でも先生は詳しい説明をせず、同クラスに出ている方々も理解できずに苦労してる感じです。。

  • A88No8
  • ベストアンサー率52% (834/1602)
回答No.2

こんにちは  #1です。 補足します。 >ちなみにソフトはN88互換BASIC for Windowsを使っています(>_<)  「N88互換」!  今時、厳しいローカルBASIC言語を使われるんですね(--;  この言語だと使った変数のすべてを何処で使うべきか、間違いなく使ったかという管理とか、IF文が書きにくい、繰り返し制御に使えるステートメントが少ないとか、自由に自前の手続きや関数が書きにくいとか制約が多いです。  該当ソフトのヘルプには、質問者のおっしゃる「組み立て」に関わる体系的な情報が全くないので、学校で教えて貰ってないですか?  それと課題のヒントの意味的ルールがよくわかりませんので、ここで仮定します。 これで大丈夫ですか? ■変数 (1)事前に宣言しなければ、単精度。 (2)スコープ(有効範囲)は、大域変数として扱う。 (3)数字が前に英字が後にある場合は、変数名ではなく式(乗算)である ■← (1)右辺の式を左辺の変数に代入。 ■while [条件] do~done (1)条件が真の間~に書かれた命令をループ(繰り返す)する ステートメント。 ■return [変数] (1)変数の値を表示してプログラムを終了する。 ■|[式]| (1)式の値の絶対値を取る ■+ - * / (1)四則演算を表わす単項演算子。 ■>< (1)大なり、小なりを表わす単項演算子。  それと、ここのルールでは作業の代わりや宿題などの課題の回答を直接教えてはならないというルールがあるようです。 回答者はそれを守って回答しなくてはならないの(^^;  だから回答しやすいように「疑問」をぶつけてください。

  • A88No8
  • ベストアンサー率52% (834/1602)
回答No.1

こんにちは  質問者さんのBASICの処理系は具体的に何ですか?  また、解法手順がそこまで判っているなら、現在の言語はステートメントの構文にそんなに違いはないのでとりあえずチャレンジして見ましょうよ。  課題は、整数の平方根を関数形式で求めるプログラム作ってメインプログラムから呼び出すのですね?  こんな雰囲気でしょうか.. *1* 2の平方根を出力しなさい(二分法による平方根の計算) ただしδ=0.0001とする FUNCTION RootDiv(x as integer) as double REM *1*(xの平方根を精度δで求める)  const SIGMA = 0.0001  dim a as double  dim b as double  dim c as double  a←0  b←x  while b-a < δ do   c←(a+b)/2   if C*C > x then b←c else a←c endif  done  REM return a  let RootDiv = a END FUNCTION *2* 2の平方根を出力しなさい(ニュートン・ラプソン法による平方根の計算) ただしδ=0.0001とする FUNCTION RootNtRpsn(x as integer) as double REM*2*(xの平方根を精度δで求める)  const SIGMA = 0.0001  dim y as double  y←x  while │x-y*y│ < 2yδ do   y←(y*y+x)/2y  done  REM return y  let RootNtRpsn = y END FUNCTION

beru415
質問者

補足

回答ありがとうございます(>_<") そして、学校で使ってる言語はBASICで、 100 REM~ 110 PRINT~ みたいな形でした(>_<) 説明不足でごめんなさい!!(*ノ-;*) ちなみにソフトはN88互換BASIC for Windowsを使っています(>_<)

関連するQ&A

  • C言語の関数に関する質問ですが

    C言語の初心者です。よろしくお願いいたします。 授業でこのような演習が出ました。 演習:実数x を入力したときの最大値を求めるプログラムを作れ. 実数x を入力すると,x; -x; x2; xの絶対値の平方根 の中で一番大きい値を答える プログラムを作れ(ファイル名はmax.c とする). 表示は以下のようにする. Input x: -0.5 【Enter】 Answer is 0.707107. #include<stdio.h> #include<math.h> double max(double a, double b){ if( a > b) return a; else return b; } int main(void) { double x,y; printf(\"Input x: \"); scanf(\"%lf\",&x); y = max (x,-x); y = max (y,x*x); y = max (y,sqrt(fabs(x))); printf(\"Answer is %f.\\n\",y); } このように書けばうまく実行できますが、関数の中に関数を使えないでしょうか。うまく言えないですが、たとえば、以下のように書いてみましたが、うまく実行できません。どう直したらいいでしょうか、お忙しい中教えていただけたらうれしいです。 #include <stdio.h> #include <math.h> int max(double a,double b) { if (a<b) return b; else return a;} int main(void) { double x,result; printf(\"Input x:\"); scanf(\"%lf\",&x); result=max(max(x,-x),max(pow(x,2),sqrt(fabs(x)))); printf(\"%.2f\",result); return 0; } よろしくお願いいたします!!

  • わからない問題が多数あるので、教えてください

    わからない問題が多数あるので、教えてください 平方根 -1分の2-√6=√6-2 なんで符号が逆になるんでしょうか? 2分の√15-3 - 2分の√15+√5 =-2分の1 と答えに書いてあるのですが 途中式はあっているのですが、最後どうやったら-2分の1になるかわかりません x=2分の√5+√3.y=2分の√5-√3のとき次の値を求めよ x分のy+y分のx どうやって分数を分数にあてはめるんですか? x^3+y^3 これなんか、もうお手上げです 4分の(a+1)^2-a 途中で2aとなるのになぜ-2aなのでしょうか? 後、学校で二重根号なんて習ってないのですが 入試とかテストとかに出ますかね? 因数分解 a^2b+b^2c-a^2c-b^3s x^2-3xy+2y^2-x+3y-2 a^2b^2-a^2-b^2-4ab+1 a^2(b-c)+b^2(c-a)+c^2(a-b) (x^2+x-12)(x^2+x-2)+16 x^4+3x^2+4 共通因数を見つけるのが下手なのですがどうすればいいでしょうか? 尚、基本の形は解けるので、こういう長いのだけ解けない感じです 転校のために勉強をしているのですが 具体的に1年と2年でどの分野が出ますか? そこを中心に勉強したいので参考に教えてください

  • グラフの問題についてですが

    y=x^2 と y=x+6 の交点をA,C y=x^2 と y=x の交点をBと置いたとき A(-2,4) , B(1,1) , C(3,9) となるグラフで 点Aを通り、△ABCの面積を二等分する直線の式がわかりません。 三平方の定理を使わない解き方でお願いします。

  • 問題がとけません

    以下の問題が解けません。 わかる方、教えていただけないでしょうか? ・キーボードから3整数を読み込み,小さい順に出力せよ。 ヒント------------------------------------------------- キーボードから読み込む変数をa,b,c,出力する変数をx,y,z(x<y<z)とするとよい かもしれない。 プログラムの構造は次のようになる。 #include <stdio.h> int main() { int a,b,c,x,y,z; scanf("%d%d%d",&a,&b,&c); ...//ここが本体 printf("%d %d %d\n",x,y,z); return 0; } もちろん,目的が達成されるなら,上の例のようにならなくても良い。 

  • 値の渡し方?(初心者)

    以前質問したプログラムについて、新たに質問です。 メインプログラムと、関数プログラムを組みました。 関数の中では、print文を使うと計算は正しく行われていて、結果が正しいことが分かりました。 でうが、メイン文の出力では、どこにも出てこない変な値が出てきてしまいます。 値の渡し方がおかしいのでしょうか? 誰か、アドバイスをお願いします。 ***以下プログラムです。*** #include <stdio.h> #include <math.h> double gamma(double x) { double c[9],y,a,r,b,s,z; int i; a=1.; r=1.; c[1]=5.771916e-01; c[2]=9.882058e-01; c[3]=8.970569e-01; c[4]=9.182068e-01; c[5]=7.567040e-01; c[6]=4.821993e-01; c[7]=1.935278e-01; c[8]=3.586834e-02; printf("0 %f\n",x); while(1){ if(x>2.){ x=x-1.; a=a*x; printf("1 %f %f\n",x,a); } else if(x<1.){ a=a/x; x=x+1.; printf("2 %f %f\n",x,a); } else{ break; } } x=x-1.; for(i=1;i<9;i++){ b=(double)(i); s=(c[i]*((double)(pow(-1.,b)))*((double)(pow(x,b)))); printf("3 %d %f\n",i,c[i]); r=r+s; } y=a*r; printf("4 %lf\n",y); return y; } main() { double x,y; printf("数字を入力してください。"); scanf("%lf",&x); printf("メインプログラム x= %lf \n",x); y=gamma(x); printf("x= %f y= %f\n",x,y); }

  • 点と楕円の距離

    平面上に原点Oを中心とする楕円C:x^2/a^2+y^2/b^2=1と、楕円の外部にある点A(α,β)が与えられているとき、CとAの距離はいくらになるか?という問題です。どう考えたってただの条件付極値問題で、簡単なはずだと思ったのですが、とんでもない方程式が出てきます。計算機にやらせてみても目がくらむような式になります。これってそんなに難しい問題なのでしょうか?何か簡単に解く方法はありませんか? それから計算機にやらせてみた結果をみると平方根しか入っていません。ということは作図も可能に思いますが、簡便な作図法は知られているのでしょうか?

  • 作成したbシェルを実行すると無限ループになってしまいます

    テストの為のデータをファイルに出力したいんですが無限ループになります。 #!/bin/sh i=1001 x=1 y=1 while [ $x -le 100 ]; do printf "$i,1019,001,3989,01" while [ $y -le 100 ]; do printf "01,00987,0,0,11,高橋," y='expr $y + 1' done i='expr $i + 1' x='expr $x + 1' y=1 done > test.csv カンマで区切った最初のデータを100個、 次のデータを100個ファイルに入れたいんですが、 実行すると無限ループになります。

  • 数学(ベクトル)の問題

    http://okwave.jp/qa/q8011470.html より、 L^2=(x2+sv2x-x1+tv1x)^2+(y2+sv2y-y1+tv1y)^2+(z2+sv2z-z1+tv1z)^2 (簡単のため) L^2=(x2+s*a2-x1+t*a1)^2+(y2+s*b2-y1+t*b1)^2+(z2+s*c2-z1+t*c1)^2 (各方向ベクトルをa,b,cと変えました。) について、 「まず、右辺の括弧を展開して、s の二次式として 平方完成しましょう。 そのとき、t も係数の一部と考えます。 すると、定数項が t の二次式になるので、 今度はそれを t の式として平方完成します。」 という回答が来たのですが、現在、展開すら出来ない状態です。 また、この後の計算もよく分からないです。 申し訳ありませんが、 至急、回答お願いします。

  • C言語教えてください。

    (1)二次方程式y=a*x*x+b*x+cについて、a=1.0,b=2.0,c=3.0として、x=1.1,2.2,3.3,4.4のときのyをもとめる計算を行い、式と係数値とxと対応するyの値を表示するプログラムを作成せよ。 (2)xを与えて、xの2乗、3乗を計算し、xと対応する結果を表示するプログラムを作成せよ。なお、x=3,5,7,9とする。

  • C言語の実数型の足し算

    C言語初心者です。関数の勉強していて、実数型計算に出くわしました。 #include <stdio.h> float add(float a, float b) { return a+b; } int main(void) { float x=10.5,y=20.3; printf("%f %f\n",x,y); printf("%f\n",add(x,y)); return 0; } としたら、 10.500000 20.299999 30.799999 という結果になりました。今のところint型でずーっと勉強していたので、20.3の20.299999表記が怪しく感じられ、結果も同様に怪しく感じられます。どうして、10.5+20.3=30.8とすっっきり表示してくれないのでしょうか。