• 締切済み

指定した長さのフィボナッチ数列を出力したい(pascal)

例えば「長さ:6」と入力すると6桁のフィボナッチ数列の項だけを出力するプログラムを作ってるのですが、意外なところで躓いてしまいました。どこが変なのか教えてください。 program fib_search (input,output); var i,p,x,y : integer; f : array[0..500] of real; function fib(n:integer):integer; begin if(n>=0)and(n<=1) then fib:=1 else fib:=fib(n-1)+fib(n-2); end;{fib} begin writeln('数列の長さ:'); readln(p); x:=0; y:=0; for i:= 1 to 5*p do begin x:= trunc(fib(i)/(10^p)); y:= trunc(fib(i)/(10^(p-1))); if (x=0) and (y>=1) then begin writeln(fib(i)) end end; end. 例えばp=6として、10の6乗で割った数x=0&10の5乗で割った数y>=1 だと6桁、と考えました。1 to 5*p は、ざっと数列を見たところ(桁数×5)項までにその桁の数字はぎりぎり出尽くしている、と考えたからです。 これをコンパイルするとx、y共に「 Replaced '^' with a '+'」と出て、 x:= trunc(fib(i)/10^p); y:= trunc(fib(i)/10^(p-1)) と分母の()を取ると「 Expected ')'」と出てしまいます。 また、「(fib(i))」としても同様「 Replaced '^' with a '+'」と出てしまうのです。

  • rurur
  • お礼率50% (24/48)

みんなの回答

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

とりあえず、'^' はPascalではポインタで使用する演算子であって 冪の演算子じゃないでしょ。 大矢建正 Pascal 演算子一覧 http://www.ss.u-tokai.ac.jp/~ooya/Program/Kaisetsu/Enzansi.shtml Object Pascal講座 - ポインタとポインタ型 http://merry.whitesnow.jp/SEMIPAS/SECTION7/sec7_1.html

rurur
質問者

お礼

ご指摘ありがとうございました。上記のページでも冪乗の方法が解らなかったのですが、自分なりに調べてなんとか理解できました。

関連するQ&A

  • Pascal  insertの使い方

    プログラミングの授業で 整数(integer)を入力して、金額表示のように3桁ごとにコンマを打って文字列(string)として表示せよ。 という問題が出されました。 やってみた結果が下なんですが、insertがまちがってぃて実行されません。どこが間違ってるか教えてもらえませんか。 program prj7_2(input,output); var st,u,con:string[100]; n,i,x:integer; begin writeln('数を入力してください。'); readln(st); n:=length(st); if n<=3 then writeln(st) else begin i:=1; con:=','; repeat x:=n-3*i; u:=insert(con,st,x); until x:<3; writeln(u); end; end.

  • 最大公約数を再帰で求める(pascal)

    入力した整数値の最大公約数を出力するプログラムを再帰呼び出しの形式で作れ、という課題が出ました。 再帰でない形式は下のように作れたのですが、再帰形式がどうしてもできません。どなたかご教授ください。 function gcd(a,b:integer):integer; {関数部} var tmp:integer; begin if a<b then begin tmp:=b; b:=a; a:=tmp end; repeat tmp:=b; b:=a mod b; a:=tmp until b=0; gcd:=a end; repeat {計算部、i=n=入力した個数、max=入力できる最大数} i:=i+1; n:=n+1; data[i]:=x; writeln('値:'); readln(x); until (x=0) or (i=max); if i>=2 then begin p:=gcd(data[1],data[2]); if i>=3 then begin for i:= 3 to n do begin p:=gcd(p,data[i]) end; writeln('最大公約数:',p) end else begin writeln('最大公約数:',p) end;

  • 除算がなぜかできません(pascal)

    フィボナッチ数列の連続する項の差の比  z(n) = { f(n-1) - f(n-2) } / { f(n) - f(n-1) } 、 これのz(n-1),z(n)の差の絶対値がある定数以下になった時(100項まで)に計算を終了するプログラムを作ったのですが、何度コンパイルしても上の式の除算部でエラーが起きてしまいます。 どこがおかしいのかご教授ください。 program Toi3 (input,output); const dif = 1.0 * exp(-6); var n : integer; result : real; function f(n:integer):integer; begin if(n>=0)and(n<=1) then f:=1 else f:=f(n-1)+f(n-2); end;{f} function z(n:integer):real; begin z := {f(n-1) - f(n-2)}/{f(n)-f(n-1)} end; begin n:=2; while (n=100) or (result<dif) do begin n:=n+1; result:= abs(z(n)-z(n-1)) end; if n=100 then begin result:= abs(z(100)-z(99)); if result<dif then begin writeln('収束した') end else begin writeln( z(100),'収束しなかった') end end else begin writeln('収束した') end end. エラー: 17 z := {f(n-1) - f(n-2)}/{f(n)-f(n-1)} E 18460--------------------------------^--- Replaced '/' with a identifier In function z: w 18270 variable n is never used

  • パスカル→JAVA

    下記のパスカルからJAVAに変えるのですが、わからなくてこまってます。よろしくおねがいします。 { 宣言部 } type ZISU= array[0..99] of real; var n,k :integer; p,VALREAL,VALIMAG: ZISU; { EXTERNAL procedure EVAL ( p:ZISU; n:integer; var VALREAL,VALIMAG:ZISU ); } {$I B:EVAL.SRC} { メ イ ン プ ロ グ ラ ム } begin write(lst,'Input vector'); writeln(lst); read(n); readln; write(lst,' n=',n); writeln(lst); for k:=0 to n-1 do begin read(p[k]); readln; write(lst,p[k]); writeln(lst) end; EVAL(p,n,VALREAL,VALIMAG); writeln(lst); writeln(ist); write(lst,'Output vector [THE DISCRETE FOURIER TRANSFORM]'); writeln(lst); for k:=0 to n-1 do begin write(lst,' ',VALREAL[k],'+(',VALIMAG[k],'*i)'); writeln(lst) end end. 

  • Pascal言語で小町算

    Pascal言語で、『1~9の順に数字を並べ、+、-を補い式を作り、 値が100になる組み合わせをすべて出力するプログラムを作成せよ(例:12 - 3 - 4 + 5 - 6 + 7 + 89 = 100)。』 という課題が出ました。自分なりに組んでみたのですが、 12個あると聞いたのに、4個しか出力されません><; どこが間違っているのかご教授いただけると幸いですっ ------------------------------------------------------- program KomachiZan(output); var i,s:integer; var sign:array[1..9] of integer; var x,n:longint; begin writeln('< 小町算 -Komachi Zan- >'); for i:=1 to 9 do sign[i]:=-1; repeat x:=0; n:=0; s:=1; for i:=1 to 9 do begin if sign[i]=0 then n:=10*n+1 else begin x:=x+s*n; s:=sign[i]; n:=i; end; end; x:=x+s*n; if x=100 then begin for i:=1 to 9 do begin if sign[i]=1 then write(' + ') else if sign[i]=-1 then write(' - '); write(i); end; writeln(' = 100'); end; i:=9; s:=sign[i]+1; while s>1 do begin sign[i]:=-1; i:=i-1; s:=sign[i]+1; end; sign[i]:=s; until sign[1]>=1; end. -------------------------------------------------------

  • クイックソート後の出力(pascal)

    20個の整数データをクイックソートして出力せよ、という課題が出ました。クイックソートまでは出来た(コンパイルできたのでおそらく)のですが、その順に出力する方法がわかりません。どなたかお教えください。 program sort(input,output); const n = 20; type index = 1..n; var A : array[1..n] of integer; i,x,a : integer; p,j,k : index; function PIVOT(i,j : index):integer; var k:index; begin k:=i+1; while (A[i]=A[k]) and (k<=j) do k:=k+1; if k>j then PIVOT:=0 else if A[i]>=A[k] then PIVOT:=i else PIVOT:=k end; procedure SWAP(var x,y:integer); var temp:integer; begin temp:=x; x:=y; y:=temp end; procedure PARTITION(i,j:index; a:integer; var k:index); var l,r:index; begin l:=i; r:=j; while A[l]<a do l:=l+1; while A[r]>=a do r:=r-1; while l<=r do begin SWAP(A[l],A[r]); l:=l+1; r:=r-1; while A[l]<a do l:=l+1; while A[r]>=a do r:=r-1; end; k:=l end; procedure QUICKSORT(i,j:index); var a:integer; p:index; k:index; begin p:=PIVOT(i,j); if p<>0 then begin a:=A[p]; PARTITION(i,j,a,k); QUICKSORT(i,k-1); QUICKSORT(k,j) end end; begin i:=0; i:=1+1; for i:= 1 to n do begin A[i]:=0; end; i:=0; i:=i+1; for i:= 1 to n do begin readln(x); A[i]:=x end; a:=PIVOT(p,j); PARTITION(p,j,A[a],k); QUICKSORT(p,j) end. QUICKSORT(p,j)とend. の間に出力方法を書き込みたいのです。

  • 一月前の日付を求めるプログラム(pascal)

    大学の課題で「一月前の日付を求めるプログラムを作れ。その日が無ければその月の最後の日を示す。」というのが出題されました。12月18日(火)と入力すると11月18日(日)、12月31日(月)なら11月30日(金)となる具合です。 列挙型を用い書いてみたのですが、コンパイルしたら「Type-clash」と出てコンパイルできませんでした。どう改善すべきかアドバイスお願いします。 program calender(input,output); type months=(Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Nov,Oct,Dec); weeks=(Mon,Tue,Wed,Thu,Fri,Sat,Sun); var x,x1,z,z1:char; y,y1,p1,p2,i,r:integer; begin writeln('月:'); readln(x); writeln('日:'); readln(y); writeln('曜日:'); readln(z); if x=Jan then begin x1:=Dec end else begin x1:=pred(x)            {x1=表示する月} end; if y>=29 then if x=Mar then begin y1:=28 end else begin y1:=y             {y1=表示する日} end; case x of May,Jul,Aug,Nov,Dec : p1:=30; Jan,Feb,Apr,Jun,Sep,Oct : p1:=31; Mar : p1:=28 {月の違いによる日数の違い} end; p2:=y-y1;     {日にちの違い} r:=(p1+p2)-trunc((p1+p2)/7)*7; {7で割った余り} for i := 1 to r do z1:=pred(z);          {z1=表示する曜日} writeln(x1,'月',y1,'日',z1,'曜日') end.

  • Pascal言語

    フィボナッチ数列の項は、その直前の連続する二つの項の和である。 f( n ) = f( n - 1 ) + f( n - 2 ) 但し、 f(0) = 0, f(1) = 1 である。   フィボナッチ数列の連続する項の差の比 z = { f( n - 1 ) - f( n - 2 ) }/ { f( n ) - f( n - 1 ) } は、 n が大きくなれば、ある値に収束する。この値の近似値を求める プログラムを書き、その値を示せ。この値は黄金分割比と呼ばれる。 フィボナッチ数列は関数 fibonacci を作って求め、項は配列に表せ。まず 30 項まで求め、黄金分割比の値が収束していく様子を出力して確かめよ。収束判定のために定数 dif = 1.0 e -6 を宣言し、 連続する z の差の絶対値が dif 以下になったとき、収束したとして計算を終了するプログラムを作りなさい。 この問題について質問なんですが コンパイルはできるんだけど、結果がうまく表示されません。 すみませんがわかる方教えてくれませんか? program pe1_2(input,output); const dif = 1.0e-6; var i,m, g : integer; f, z,q : array [0..500] of real; function fibonacci(n: integer):integer; begin if (n >=0) and (n <=1) then fibonacci:=n else fibonacci:=fibonacci(n-1)+fibonacci(n-2); end; { fibonacci } begin f[i]:=fibonacci(i); writeln('30項まで求めます '); for i :=1 to 30 do begin writeln('f(',i:2,')=',f[i]:1); end; write('m='); readln(m); for i:= 3 to m do repeat z[i]:=(f[i-1]-f[i-2])/(f[i]-f[i-1]); until dif >= z[i]-z[i-1]; writeln(z[i]); {writeln('z(',i:3,')=',z[i]:1,','); } end.

  • pascalにおける乱数の組み込み方

    学校の課題で「1≦x≦n、1≦y≦nの範囲の点(x,y)をランダム個数選び、(0,0)から見える点の個数を数えよ」という課題が出ました。 nは自由に設定し、入力する毎に選択する個数をランダムで決めxとyもその個数分選び、それらの中でGCD(x、y)=1となる点の個数を数える問題です。 参考としてランダムを表すプログラム program seed_example(output); var i,x:integer; begin x := seed(wallclock); writeln('乱数の作成:'); for i := 1 to 10 do begin writeln(random(0)); end; end. が与えられました。(上式のxは問題のxと無関係) 今回の問題では、選ぶ個数を「h」とすると 『h := seed(wallclock);(以下略)』と設定しランダム化させxとyは 『for x(or y) := 1 to h do(以下略)』としてh個選ぶ。 このような考え方で合っているのでしょうか? 回答お待ちしております。

  • フィボナッチ数列 c言語

    c言語でフィボナッチ数列を求めるプログラムを再帰関数をつくり作れという問題でしたのように作りました。 windowsでcygwinというものを使ってコンパイルしています #include <stdio.h> int fib(int); main() { int n,i; printf(\"第何項までのフィボナッチ数? n=\"); scanf(\"%d\",&n); fib(0)=0; fib(1)=1; for(i=2;i<=n;i++){ print(\"f(%d)=%d\",n, fib(n));} } エラーは $ gcc fib2.c fib2.c: In function `main\': fib2.c:10: error: invalid lvalue in assignment fib2.c:10: error: invalid lvalue in assignment とでました。 どこかちがいますか?