procedure a(p,x,count:integer;z:bb;m:usee); var i,l:integer;judge:boolean; begin count:=count+1;judge:=true; for i:=1 to x do begin if m[i]=false then begin judge:=false; end;end; if judge=false then begin for i:=1 to x do begin if m[i]=false then begin z[count]:=i; if count=x then begin for l:=1 to x do write(z[l]); end; m[i]:=true; a(i,x,count,z,m); m[i]:=false; end;end;end; if count=x then writeln; end;
テスト墨。MaxNplus1はMaxNより1大きい数ね。TP懸かってるから、 標準Pにしてちょ。 Program Enjoy2chtest; const MaxNplus1 = 5; MaxN = 4; type range = 1..MaxNplus1; range0 = 0..MaxNplus1; using = set of range; var data : array[range] of range0; use : using;
procedure initialise; var i : range; begin use := []; for i := 1 to MaxNplus1 do data[i] := 0 end;
procedure display; var i : range; begin for i := 1 to MaxN do write(data[i] : 4); writeln end;
これが都筑。部分反鋳型、習合型、再帰予備出といろいろ浸かってる。番兵定石もね。 procedure add(idx : range0); var ii : range0; begin if idx = MaxNplus1 then display else begin while data[idx] < MaxNplus1 do begin ii := data[idx]; repeat ii := succ(ii) until not (ii in use); data[idx] := ii; if ii < MaxNplus1 then begin use := use + [ii]; add(succ(idx)); use := use - [ii] end end; data[idx] := 0 end end;
すいません電卓のプログラミングの宿題が出ました 負数も扱えるようにしたいのですがどこに追加したらよろしいのでしょうか 下に与えられたものをすべて書きます program calc(input, output); var NULLTOKEN: char; {文字がないことを表す文字コード} CurrentToken: char; {現在処理中の字句} result: integer; {値を評価した結果} error: Boolean; {エラーが生じたことを示す論理型変数}
procedure GetToken; {字句があれば1字句読みこむ手続き} var ch: char; begin if eoln(input) then CurrentToken := NULLTOKEN else begin read(ch); if ((ord('0') <= ord(ch)) and (ord(ch) <= ord('9'))) or (ch = '+') or (ch = '-') or (ch = '*') or (ch = '/') or (ch = '(') or (ch = ')') then {読み込んだchが字句ならば,} CurrentToken := ch {CurrentTokenにいれる.} else begin {そうでなければ, エラー.} error := TRUE; writeln('Not a token.') end end end;
program calc(input, output); var NULLTOKEN: char; {文字がないことを表す文字コード} CurrentToken: char; {現在処理中の字句} result: integer; {値を評価した結果} error: Boolean; {エラーが生じたことを示す論理型変数}
procedure GetToken; {字句があれば1字句読みこむ手続き} var ch: char; begin if eoln(input) then CurrentToken := NULLTOKEN else begin read(ch); if ((ord('0') <= ord(ch)) and (ord(ch) <= ord('9'))) or (ch = '+') or (ch = '-') or (ch = '*') or (ch = '/') or (ch = '(') or (ch = ')') then {読み込んだchが字句ならば,} CurrentToken := ch {CurrentTokenにいれる.} else begin {そうでなければ, エラー.} error := TRUE; writeln('Not a token.') end end end; ;
function expr: integer; {<式>を評価する関数} var value: integer; function term: integer; {<項>を評価する関数} var value: integer; function factor: integer; {<因子>を評価する関数} var value: integer; function digit: integer; {<数字>を評価する関数} begin if (ord('0') <= ord(CurrentToken)) and (ord(CurrentToken) <= ord('9')) then {CurrentTokenが<数字>ならば,} begin {その<数字>の順序数 - `0'の順序数} digit := ord(CurrentToken) - ord('0'); GetToken {を, その数字の評価値とする.} end else {そうでなければ, エラー.} begin error := TRUE; writeln('Error at digit.') end end;
begin {factor} if CurrentToken = '(' then { <因子> が ( で始まるならば, } begin GetToken; factor := expr; {それ以降を <式>として評価し,} if CurrentToken = ')' then {その後に ) があることを確認する.} GetToken else { )がなければ, エラー.} begin error := TRUE; writeln('Error at factor.') end end else { <因子> が ( で始まらないならば,} factor := digit { その因子は<数字>として評価.} end; begin {term} value := factor; { <項> のはじめにあるはずの<因子>を評価する.} while (CurrentToken = '*') or (CurrentToken = '/') do {その後, <乗除演算子>が} case CurrentToken of {あるかぎり,<乗除演算子><因子>の繰り返し} '*': begin {として評価する.} GetToken; value := value * factor end; '/': begin GetToken; value := value div factor end end; term := value end;
begin {expr} value := term; { <式> のはじめにあるはずの<項>を評価する.} while (CurrentToken = '+') or (CurrentToken = '-') do {その後, <加減演算子>が } case CurrentToken of {あるかぎり, <加減演算子><項>の繰り返し} '+': begin {として評価する.} GetToken; value := value + term end; '-': begin GetToken; value := value - term end end; expr := value end;
begin {main} {初期化} {定数} NULLTOKEN := chr(0); {字句がないことを表す文字コード.} {大域変数} error := FALSE; CurrentToken := NULLTOKEN; {評価} GetToken; {最初の字句があれば, 読み込む.} if CurrentToken = NULLTOKEN then writeln('Nothing input.') else begin result := expr; {字句の列を <式> として評価する.} if not error then {エラーが起きていなければ結果を表示する.} writeln(result) else writeln('Error occured.') end end.
とりあえず GetTokenの if ((ord('0') <= ord(ch)) and (ord(ch) <= ord('9'))) or (ch = '+') or (ch = '-') or (ch = '*') or (ch = '/') or (ch = '(') or (ch = ')') then でマイナスの場合はエラーを出すようになってるからそこをマイナスでもいけるようにすればいい
すいません45のところ間違ってました。訂正します。 function expr: integer; {<式>を評価する関数} var value: integer; function term: integer; {<項>を評価する関数} var value: integer; function factor: integer; {<因子>を評価する関数} var value: integer; function constant:integer; var value:integer; function digit: integer; {<数字>を評価する関数} begin{digit} if (ord('0') <= ord(CurrentToken)) and (ord(CurrentToken) <= ord('9')) then {CurrentTokenが<数字>ならば,} begin {その<数字>の順序数 - `0'の順序数} digit := ord(CurrentToken) - ord('0'); GetToken {を, その数字の評価値とする.} end else {そうでなければ, エラー.} begin error := TRUE; writeln('Error at digit.') end end; begin{consstant} value:=digit; while (ord('0') <= ord(CurrentToken)) and (ord(CurrentToken) <= ord('9')) do begin value:=value*10+digit; end; constant:=value; end;
function constant:integer; var value:integer; minus: boolean;
function digit: integer; begin{digit} … end; begin minus := CurrentToken='-'; if minus then GetToken; value:=digit; while (ord('0') <= ord(CurrentToken)) and (ord(CurrentToken) <= ord('9')) do value:=value*10+digit; if minus then constant := -value else constant := value; end;
procedure TForm1.Button1Click(Sender: TObject); const max=50; procedure line(x1,y1,x2,y2:integer); begin canvas.MoveTo(x1,y1);canvas.lineTo(x2,y2) end; procedure dia(x0,y0,r,n:integer) var xs,ys:integer;{始点} xe,ye:integer;{終点} i,j:integer; {ループ変数} t:real; {角度} begin t:=2*pi/n; for i:=1 to n-1 do begin xs := x0 + round(r*cos(t*i)); ys := y0 + round(r*sin(t*i)); for j:=i+1 to n do begin xe := x0 + round(r*cos(t+j)); ye := y0 + round(r*sin(t+j)); line(xs,ys,xe,ye) end end end; begin dia(300,20,70,11) end;
Score :array[0..1000] of integer; begin writeln('入力得点の平均と偏差値を計算します'); writeln('入力後、負の数を入力すると…終了します。'); kazu :=0; repeat write('点数は?'); readln(data); if data >= 0 then begin kazu := kazu + 1; score[kazu] := data end; until data < 0; goukei := 0; for i := 1 to kazu do goukei := goukei + score[i];heikin :=goukei / kazu; goukei :=0; for i := 1 to kazu do goukei := goukei + Sqr(score[i]);hensa := sqrt(goukei /kazu - sqr(heikin)); writeln('点数 偏差値'); for i := 1 to kazu do writeln(score[i]:4, 50 +10 * (score[i]-heikin)/ hensa:10:1); writeln(' 平 均 =',heikin:5:1); writeln('標準偏差=',hensa:5:1); readln; end. ・・・こ、このプログラミングは・・・!!!直すとこ多すぎて説明めんどい・・・!!!!!! とりあえず、for文でもif文でもuntilでもいいんだけど、for 〜 do とかのあとが2行以上になる場合は必ずbegin をつけろ。あと、3科目データが入力されてない。最後のreadlnもwritelnの間違い。 そこも直せ。話はそれからだ
var Score :array[0..1000] of integer; i, kazu, data : integer; goukei, heikin, hensa : real; begin writeln('入力得点の平均と偏差値を計算します'); writeln('入力後、負の数を入力すると…終了します。'); kazu :=0; repeat write('点数は?'); readln(data); if data >= 0 then begin kazu := kazu + 1; score[kazu] := data end until data < 0; goukei := 0; for i := 1 to kazu do goukei := goukei + score[i]; heikin :=goukei / kazu;
const kyouka = 3; Kazu = 10; kyoukaNames: Array[0..(kyouka-1)] of String = ('国語', '理科', '数学'); var ScoreArray: Array[0..(Kazu-1), 0..(kyouka-1)] of Integer; i, j, Sum1: Integer; Sum2: Extended; begin writeln('入力得点の合計と教科ごとの平均を計算します');
for i := 0 to (Kazu-1) do begin writeln(Format('%d人目の得点を入力してください', [i+1])); readln(ScoreArray[i, 0], ScoreArray[i, 1], ScoreArray[i, 2]); Sum1 := ScoreArray[i, 0]+ScoreArray[i, 1]+ScoreArray[i, 2]; writeln(Format('%d人目の合計点は%d', [i+1, Sum1])); end;
for j := 0 to (kyouka-1) do begin Sum2 := 0; writeln(KyoukaNames[j]+'の平均は'); for i := 0 to (Kazu-1) do Sum2 := Sum2+ScoreArray[i, j]; Sum2 := Sum2 / Kazu; writeln(Format('%.4f点です', [Sum2])); end;
begin n:=1; repeat writeln('整数値を入力してください。(',n:2,'回目)'); readln(q); if (q > 0 ) then begin if ( n = 1 ) then p:=q else p:=gcd(p,q); n:=n+1; end; until ( n > 10 ) or ( q = 0 ); writeln('最大公約数は',p,'です。') ; end.
begin if b=0 then gcd:=a else gcd:=gcd(b,a mod b) end; { gcd }
begin i:=1; repeat writeln(i:2,'番目の値を入力'); readln(x); if x>0 then begin if i=1 then answer:=x else begin answer:=gcd(answer,x); i:=i+1 end; end; until (i>10) or (x=0); writeln('最大公約数は',answer:3); end.
>>95 超適当だけど program f(input, output); var v: Integer; procedure writeOne(d: Integer); begin case d of 0: begin end; 1: write('one'); 2: write('two'); 3: write('three'); 4: write('four'); 5: write('five'); 6: write('six'); 7: write('seven'); 8: write('eight'); 9: write('nine'); 10: write('ten'); 11: write('eleven'); 12: write('twelve'); 13: write('thirteen'); 14: write('fourteen'); 15: write('fifteen'); 16: write('sixteen'); 17: write('seventeen'); 18: write('eighteen'); 19: write('nineteen'); end; end; begin readln(v); if v=0 then write('zero'); if v>=100 then begin writeOne(v div 100); write(' hundred '); v := v mod 100; end; if v>=20 then begin case v div 10 of 2: write('twenty '); 3: write('thirty '); 4: write('forty '); 5: write('fifty '); 6: write('sixty '); 7: write('seventy '); 8: write('eighty '); 9: write('ninety '); end; v := v mod 10; end; writeOne(v); writeln; end.
var i,x,answer : integer; function gcd(a,b : integer):integer; begin if b=0 then gcd:=a else gcd:=gcd(b,a mod b) end; { gcd }
begin i:=1; repeat writeln(i:2,'番目の値を入力'); readln(x); if x>0 then begin if i=1 then answer:=x else answer:=gcd(answer,x); i:=i+1 end; until (i>10) or (x=0); writeln('最大公約数は',answer:3); readln; end.
program k(input,output); var count,x,i : integer; data : array[1..100]of integer; procedure swap(a,b : integer); var tmp : integer; begin readln(a,b); if a<b then begin tmp:=a; a:=b; b:=tmp end; end; { swap }
begin count:=0; readln(x); while x<>0 do begin count:=count+1; data[count]:=x; for i:=(count-1) downto 1 do begin swap(data[i],data[i+1]) end; readln(x); end; for i:=1 to count do begin writeln(data[i]) end; end.
5次元のベクトル A と B のデータを読み込み、それらの和ベクトル C とそれらの内積の値 D を求めて出力するプログラムを作れ。 ベクトルの要素のデータ型は、整数、実数のどちらかに統一しなさい。データはキーボードから読み込むものとする。また、 writeln を用いて、データの型、入力のさせ方をメッセージの形で記述せよ。
Program Enjoy2chCalc; const MaxNplus1 = 5; MaxN = 4; type pstack = ^stackitem; stackitem = record data : real; next : pstack end; var stack : pstack; s : string; r : real; i : longint; toend : boolean;
procedure push(r : real); var s : pstack; begin new(s); s^.data := r; s^.next := stack; stack := s end;
procedure pop(var r : real); var s : pstack; begin if stack <> nil then begin s := stack; r := s^.data; stack := s^.next; dispose(s) end else writeln('Stack underrun.') end;
begin initstack; toend := false; repeat disp; write('ENTER Number, +-*/, q-quit, c-clear, a-AC : '); readln(s); if (length(s) = 1) and (s[1] in ['+','-','*','/','q','c','a']) then case s[1] of '+','-','*','/' : calc(s[1]); 'c' : pop(r); 'a' : allclear; 'q' : toend := true end else begin val(s, r, i); push(r) end until toend; allclear; dispose(stack) end.
procedure change; var p,n:integer; previous,temp,next:list; begin n:=1; write('入れ替える位置を指定しなさい'); readln(p); current:=init; while current^.pointer <> nil do begin previous:=current; current:=current^.pointer; next:=current^.pointer; n:=n+1; if n=p then begin temp:=next^.pointer; previous^.pointer:=next; next^.pointer:=current; current^.pointer:=temp end; end; current:=init; while current^.pointer <> nil do begin write(current^.name,' ',current^.id,' '); current:=current^.pointer end; writeln end;
手続きを仕えってなら、こんなのはどうだ? Program Enjoy2chList; type plist = ^listitem; listitem = record data : string; next : plist end; var top, tail : plist; s : string; toend : boolean;
procedure addtolist(s : string); var p : plist; begin new(p); p^.data := s; p^.next := top^.next; top^.next := p end;
procedure exchange(pprev : plist); var pnext, ptemp : plist; begin if pprev<>nil then begin ptemp := pprev^.next; pnext := ptemp^.next; if pnext <> tail then begin ptemp^.next := pnext^.next; pnext^.next := ptemp; pprev^.next := pnext end else writeln('The item is at the tail of the list...') end end;
function findprev(key : string) : plist; var p : plist; begin tail^.data := key; p := top; while p^.next^.data <> key do p := p^.next; if p^.next <> tail then findprev := p else begin writeln(key, ' is not found ... Orz'); findprev := nil end end;
procedure disp; var p : plist; i : integer; begin p := top^.next; i := 0; while p<>tail do begin i := succ(i); writeln(i, ' ', p^.data); p := p^.next end end;
begin initlist; toend := false; repeat write('ENTER Any word to add or NULL to quit: '); readln(s); if s='' then toend := true else begin addtolist(s); disp end until toend; toend := false; repeat write('ENTER Any word to exchange or NULL to quit: '); readln(s); if s='' then toend := true else begin exchange(findprev(s)); disp end until toend; disposelist end.
まず、基本的な型宣言から var SPACE:array[1..maxlegth] of record element:elementtype; next:integer end
elementtypeって何?って感じです・・・。
次にセルを移動するmove関数 function move(var p,q:integer):boolean; var temp:integer; begin if p=0 then begin writeln('セルがない'); return(false) {retuenってなに?} end else begin temp:=q; q:=p; p:=SPACE[q].next:=temp; retuen(true) end end;
手続きINSERT procedure INSERT(x:elementtype;p:position;var L:LIST); begin if p=0 then begin{最初の位置に挿入} if move(available,L) then SPACE[L].element:=x end else{最初以外の位置に挿入} if move(available,SPACE[p].next)then {xのセルをSPACE[p].nextがさしている} SPACE[SPACE[p].next].element:=x end;{INSERT}
次に手続きDELETE procedure DELETE(p:position;var L:LIST); begin if p=0 then move(L,available) else move(SPACE[p].next,available) end;{DELETE}
最後に手続きinitialize procedure initialize; var i:integer; begin for i:=mazsize-1 downto 1 do SPACE[i].next:=i+1; available:=1; SPACE[maxsize].next:=0 end;{inisialize}
Program Toi2; type time = record day, hour, minute, second : integer end; var t1, t2, t3 : time;
procedure add60(a, b : integer; var c : integer; var carry : boolean); (* a + b must be less than 120 *) begin c := a + b; carry := (c >= 60); c := c mod 60 end;
begin (* データを読む1 -> t1 *)(* データを読む2 -> t2 *) add60(t1.second, t2.second, t3.second, cry); add60(t1.minute, t2.minute + ord(cry), t3.minute, cry); with t3 do begin hour := t1.hour + t2.hour + ord(cry); if hour >= 24 then begin day := 1; hour := hour -24 end else day := 0 end; (* 表示 *) end.
var i,n: integer; f,z: array [0..1000] of integer;
function fibonacci(n : integer):integer;
begin case n of 3..1000 : fibonacci:=fibonacci(n-1)+fibonacci(n-2); 1,2 : fibonacci:=1; 0 : fibonacci:=0 end; { case } end;
begin write('n='); readln(n); for i:=0 to n do begin f[i]:=fibonacci(i); z[i]:=(f[n-1]-f[n-2])div(f[n]-f[n-1]); writeln('f(',i:2,')=',f[i]:1,', '); writeln(); writeln('z(',i:2,')=',z[i]:1,', '); end; end.
var i,n: integer; f,z: array [0..1000] of integer;
function fibonacci(n : integer):integer;
begin case n of 3..1000 : fibonacci:=fibonacci(n-1)+fibonacci(n-2); 1,2 : fibonacci:=1; 0 : fibonacci:=0 end; { case } end;
begin write('n='); readln(n); for i:=0 to n do begin f[i]:=fibonacci(i); z[i]:=(f[n-1]-f[n-2])div(f[n]-f[n-1]); writeln('f(',i:2,')=',f[i]:1,', '); writeln(); writeln('z(',i:2,')=',z[i]:1,', '); end; end.
フィボナッチを以下のように書き換えたのですが、確かに走るし100項でもすぐ出るんですが、マイナスの値がでてくるんです。なぜでしょうか? program kadai14_2(input,output); var m,k : integer; function fibonacci(n : integer):integer; function fib(i,old,new : integer):integer; begin if i=n then fib:=new else fib:=fib(i+1,new,old+new) end; { fib }
begin if n<=1 then fibonacci:=n else fibonacci:=fib(1,0,1) end; { fibonacci }
begin writeln('数列の長さを入力してください'); readln(m); for k:=1 to m do begin write(fibonacci(k):1); write(',') end; writeln; end.
文字列+整数型の加算の例 function AddN(s:string;N:Integer):string; var i,M:Integer; var r:string; procedure afunc; begin M:=((N mod 10)+10) mod 10; r:=Char( ord('0') +M)+r; N:=N-M; N:=N div 10; end; begin r:=''; for i := length(s) downto 1 do begin N:=N+StrToInt(s[i]); afunc; end; while N<>0 do begin M:=((N mod 10)+10) mod 10; afunc; end; Result:=r; end; 文字列同士は、ループが3つ必要
function AddAB(a,b:string):string; var i,j,N,M:Integer; var r:string; procedure afunc; begin M:=((N mod 10)+10) mod 10; r:=Char( ord('0') +M)+r; N:=N-M; N:=N div 10; end; begin r:=''; j:=length(b); N:=0; for i := length(a) downto 1 do begin N:=N+StrToInt(a[i]); if j>=1 then N:=N+StrToInt(b[j]); afunc; dec(j); end; for i := j downto 1 do begin N:=N+StrToInt(b[i]); afunc; end; while N<>0 do begin M:=((N mod 10)+10) mod 10; afunc; end; Result:=r; end;
function fibonacci(n : string):string; function fib(i,old,new : string):string; begin if i=n then fib:=new else fib:=fib(AddN(i,1),new,AddAB(old,new)) end; { fib }
begin if (length(n)<2) and(StrToInt(n)<=1) then fibonacci:=n else fibonacci:=fib('1','0','1') end; { fibonacci }
begin for k := 1 to 100 do writeLn(k:5,':', fibonacci(IntToStr(k))) ;
program kadai21(input , output , opfile); type Kojindate = record name : packed array [1..10] of char; tel : packed array [1..15] of char; end; var opfile : file of Kojindate; a : Kojindate; begin repeat rewrite( opfile , 'intdate' ); writeln('名前:'); readln( a.name ); writeln('電話番号'); readln( a.tel); write(opfile , a); until a.name = 'end'; reset ( opfile , 'intdate' ); while not eof(opfile) do begin repeat read( opfile , a ); writeln( '名前:',a.name , '電話番号:' , a.tel); until a.name = 'end' end end.
>>227 procedure search; var name : packed array [1..10] of char; c : boolean; begin Readln(name); while name <> 'end' do begin Reset(opfile); c := true; while not eof(opfile) do begin Read(opfile, a); if a.name = name then begin Writeln(a.tel); c := false; end; end; Close(opfile); if c then Writeln('該当者なし'); Readln(name); end; end; { search }
>>228 program test1(input); var o,e : file of integer; i:integer;begin Assign(o,'oddsequence');Rewrite(o); Read(i);while i <> 0 do begin Write(o,i); Read(i); end; Assign(e,'evensequence');Rewrite(e); Read(i);while i <> 0 do begin Write(e,i); Read(i); end; Close(o);Close(e);end.
program test2(output); var o,e,s : file of integer; i,j:integer;begin Assign(o,'oddsequence');Reset(o); Assign(e,'evensequence');Reset(e); Assign(s,'sequence');Rewrite(s);i := 0; j := 0; while not (eof(o) and eof(e) and (i = 0) and (j = 0)) do begin if not eof(o) and (i = 0) then Read(o,i); if not eof(e) and (j = 0) then Read(e,j); if (i <> 0) and (i < j) then begin Write(s,i); i := 0; end else if j <> 0 then begin Write(s,j); j := 0; end; end; Reset(s); while not eof(s) do begin Read(s,i);Write(i);Write(' '); end;Close(o);Close(e);Close(s);end.
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.
program pe1_2(input,output); const dif = 1.0e-6; var i : integer; f,z : array [1..30] 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 writeln('30項まで求めます'); for i :=1 to 30 do begin f[i]:=fibonacci(i); writeln('f(',i:2,')=',f[i]:1); end;
for i:= 3 to 30 do begin z[i]:=(f[i-1]-f[i-2])/(f[i]-f[i-1]); writeln('z(',i:2,')=',z[i]); if (i > 3) and (dif >= abs(z[i]-z[i-1])) then break; end; end.
function fibonacci(n: real):real; begin if (n >=0) and (n <=1) then fibonacci:=1 else fibonacci:=fibonacci(n-1)+fibonacci(n-2); end; { fibonacci }
begin writeln('30項まで求めます'); for i :=1 to 30 do begin f[i]:=fibonacci(i); writeln('f(',i:2,')=',f[i]:10:0); end;
for i:= 3 to 30 do begin z[i]:=(f[i-1]-f[i-2])/(f[i]-f[i-1]); writeln('z(',i:2,')=',z[i]); if (i > 3) and (dif >= abs(z[i]-z[i-1])) then break; end; end.
{構造体の定義} type TData=record c:char;a:Integer;next:Pointer;end; type PData=^TData; var root:PData;
{リストの印刷} procedure writes; var p:PData; begin p:=root; while p<>nil do begin if p^.a>0 then write('+'); write(p^.a,p^.c); p:=p^.next; end; writeln; end;
procedure func(s:string); var w:TData; var p:PData; var sgn:-1..1; var num:string; begin sgn:=1; w.next:=nil; num:=''; while s<>'' do begin w.c:=s[1]; delete(s,1,1); case w.c of '+': begin sgn:= 1;num:=''; end; '-': begin sgn:=-1;num:=''; end; '0'..'9': begin num:=num+w.c; end; 'a'..'z','A'..'Z': begin if num<>'' then w.a:=sgn*StrToInt(num) else w.a:=sgn; p:=root; while p<>nil do begin if p^.c=w.c then begin p^.a:=p^.a+w.a; break; end; p:=p^.next; end; if p=nil then begin w.next:=root; root:=@w; func(s); exit; end; end; '.': writes; end; end; writes; readln(s); if s<>'' then func(s); {続けて処理するなら} end;
エラトステネスの篩の概念は、次のようになります。 1 2 3 4 5 6 7 8 9 10 11 12 13 ... このような数値列を用意して まず最初の2は素数としてチェックして 2の倍数は素数じゃないから、フラグを立てます。 1 2 3 4 5 6 7 8 9 10 11 12 13 ... O X X X X X 次に素数の可能性のある3は素数としてチェックして、 3の倍数はやはり素数じゃないから、フラグを立てます 1 2 3 4 5 6 7 8 9 10 11 12 13 ... O X X X X X O X X X 4にはすでに×がついているので、素数ではなく 次に素数だと思われる5は素数としてチェック。 5の倍数は素数ではないフラグを立てて… 1 2 3 4 5 6 7 8 9 10 11 12 13 ... O X X X X X O X X X O X と続けていくとチェックされていない所に 〇がつき、素数列が求まるという手法です。
type tree = ^node; node = record moji : char; kaisu : integer; left , right : tree; end;
var p , head : tree; a : char;
procedure append(var t : tree; x : char );
begin if t = nil then begin new( t ); t^.moji := x; t^.kaisu := 1; t^.left := nil; t^.right := nil end else if t^.moji = x then t^.kaisu := t^.kaisu + 1 else if ord( t^.moji ) > ord( x ) then append( t^.left , x ) else append( t^.right , x ) end; { append }
procedure printl(t : tree ); begin if t <> nil then begin writeln( t^.moji , t^.kaisu ); printl( t^.left ); end end; { printl } procedure printr(t : tree ); begin if t <> nil then begin writeln( t^.moji , t^.kaisu ); printr( t^.right ); end end; { printr } begin new( head ); new( p ); head := nil; p := head; repeat write( '文字: '); readln( a ); append( p , a ) until a = '.'; printl( head ); write( p^.moji , p^.kaisu ); printr( head ); dispose( head ); dispose( p ) end.
キーボードから「整数」を読込み、 入力データを2分探索木に書込め。 書き込んだ結果を出力せよ。 なお、整数は正または負のデータとし、入力の終了は '0' (ゼロ) で 示すものとする。同じ値が入力されることはないものとせよ。 を program kadai5no2( input , output ); type tree = ^node; node = record kazu : integer; left , right : tree; end; var p , root : tree; a : integer; procedure data(var t : tree; x : integer ); begin if t = nil then begin new( t ); t^.kazu := x; t^.left := nil; t^.right := nil end else if t^.kazu > x then data( t^.left , x ) else data( t^.right , x ) end; { data } procedure printl(t : tree ); begin if t <> nil then begin if t^.right <> nil then begin write( t^.right ); printl( t^.right ) end else begin write( t^.kazu ); printl( t^.left ) end end end; { print }
begin new( root ); new( p ); root := nil; p := root; repeat write( ' 数: '); readln( a ); data( p , a); until a = 0; printl( p ); dispose( p ); dispose( root ) end. としたのですがどちらも出力をどうすればいいか分かりません。出力の他にも変なところがあれば指摘してくれると嬉しいです。
program database( input , output ); type a = ^b ; b = record c : packed array [1..20] of char ; d : a ; var e, f : packed array [1..20] of char ; bagin readln(e); readln(f); if e < f then begin writeln( e , f ); end else begin writeln( f , e ); end; end.
これであと学籍番号を一緒に表示したいにですが、どうすればいいですか? SysUtils; type rec=record name:String; ten:integer; end;var stud:array[1..5]of rec; i,j,w:integer;
begin { TODO -oUser -cConsole Main : この下にコードを記述してください } for i:=1 to 5 do begin write('no.',i,' 学籍番号:'); readln(stud[i].name); write('no.',i,' 点数:'); readln(stud[i].ten) end;
for i:=1 to 5-1 do for j:= i+1 to 5 do if stud[j].ten>stud[i].ten then begin w:=stud[i].ten; stud[i].ten:=stud[j].ten; stud[j].ten:=w end;
writeln; for i:=1 to 5 do writeln(stud[i].ten); writeln; readln; end.
(1) 配列にしまわれたいくつかの整数をデータとして, 棒グラフを作成するプログラムをかけ。 (入力データ x は 0<= x <=100 をみたすとする。) Hint: 以下の作業を,i=1 から i=n まで, n 回繰り返す ( for 文や repeat 文を用いる) 作業: x 方向に位置をずらしながら, a[i] に応じた高さの細長い長方形を n 個描く
program gcd(input, output); var x0, y0, x, y, w, a1, b1, a, b, q1, u, v : integer; begin readln(x0, y0); if (x0 > 0) and (y0 > 0) then begin x := x0; y := y0; a := 1; b := 0; while x <> 0 do begin w := y mod x; y := x; x :=w; q1 := y0 div x0; a1 := b - q1 * a; b := a; a := a1 end; u := b; v := ( y - u * x0 ) div y0; writeln('gcd(', x0:1, ', ', y0:1, ') = ', y:1); writeln('(u,v)=(', u:1, ',', v:1, ')') end end.
begin readln(x); while x<>'.' do begin insert(listA,x); readln(x) end; if listA^.element<>'.' then begin print(listA) end; writeln(); dispose(listA) end.
begin while p<>nil do begin found:=false; while q<>nil do begin if p^.element=q^.element then found:=true else q:=q^.next end; if found then begin new(r); insert(r,p^.element) end; p:=p^.next end end; { search }
program Keisan(input,output); var a,b,wa:integer; begin a:=30; writeln('数字を入力してください'); readln(b); wa:=a+b; writeln('a=',a,' b=',b); writeln('a+b=',wa) end.
function FindMax(A: array of Integer; Start: Integer): Integer; var Max, I: Integer; begin Max := Start; for I := Start + 1 to High(A) do if A[I] > A[Max] then Max := I; FindMax := Max; end;
procedure Swap(var A, B: Integer); var Temp: Integer; begin Temp := A; A := B; B := Temp; end;
procedure Sort(var A: array of Integer); var I: Integer; begin for I := 0 to High(A) do Swap(A[I], A[FindMax(A, I)]); end;
再帰的な定義をそのまま実装(普通は末尾再帰→繰り返しにする)するか、 a ^ bのbが実数の場合は標準函数(だったよね)としてlnとexpがあることを利用すると、ln(a^b) = ln(a) * bだから a^b = exp(ln(a) * b)
冪乗の演算子/函数がないのに対数、指数関数があるというのがWirth先生。 以下FPCでテスト墨
Program PowerTest; var a, b : real;
function power(a : real; b : integer) : real; begin if b > 0 then power := a * power(a, pred(b)) else if b = 0 then power := 1 else power := 1 / power(a, -b) end;
function RealPower(a, b : real) : real; begin RealPower := exp(ln(a) * b) end;
program sort(input,putput); const numofdata=893; var d: array [1..numofdata] of integer; i,j,k: integer; tmp: integer; begin for i:=1 to numofdata do begin read(d[i]); end;
for i:=1 to numofdata-1 do begin j:=i; for k:=i+1 to numofdata do begin if d[j]>d[k] then j:=k; end; tmp:=d[j]; d[j]:=d[i]; d[i]:=tmp; end;
for i:=1 to numofdata do begin writeln(d[i]) end end.
Program sort(input, output); (* putputってぉぃw *) const numofdata = 893; (* 嗤いどころかこれ。これを10000に汁 *) type dataindex = 1..numofdata; var d: array [dataindex] of integer; datanum : dataindex; (* データ数を貯めとく変数を用意するのが肝な *) i, j, k: integer; tmp: integer; begin write('n (max ', numofdata, ')= '); readln(datanum); for i := 1 to datanum do read(d[i]); (* begin endブロックいらね *) for i := 1 to pred(datanum) do begin j := i; for k := succ(i) to datanum do if d[j] > d[k] then j := k; tmp := d[j]; d[j] := d[i]; d[i] := tmp (* セミコロンいらね *) end; for i := 1 to datanum do writeln(d[i]); writeln('...so modified and tested by 2channelers ;-)') (* このまま提出するなよ *) end.
問1を自分なりにやってみたのですが、 program gengou(input,output); var a:integer; begin readln(a); writeln('西暦',a,'年の元号は?'); if a>1988 then writeln('平成',a-1988,'年です') else if a>1926 then writeln('昭和',a-1926,'年です') else if a>1910 then writeln('大正',a-1910,'年です') else if a>1867 then writeln('明治',a-1867,'年です') else writeln('江戸時代です') end.
var a, i: integer; const era: array[0..3] of Integer = (1989, 1926, 1912, 1868); eraname: array[0..3] of array[0..10] of char = ('平成', '昭和', '明治', '大正'); begin readln(a); writeln('西暦', a, '年の元号は:'); for i := 0 to 3 do if a >= era[i] then begin writeln(eraname[i], a - era[i] + 1, '年'); if a = era[i] then writeln(eraname[i + 1], a - era[i + 1] + 1, '年'); break end
break文もBorland方言だな。標準Pならgoto文で抜け出すことになるね(こういう時のためにgotoを残してあるんで)。 era回りだけど、record型を使う方が原則的で美しいよな。それと、効率は少し落ちるけど、 eraname = packed array [1..10] of char; era = record beginyear, endyear : integer; name ; eraname end; eraarray = array[1..4] of era;
とやってあげて、eをeraarray型の変数として、 for i := 1 to 4 do with e[i] do begin if (a >= beginyear) and (a <= endyear) then begin j := a - beginyear; if j = 0 then write(name, '元年 ') else write(name, succ(j), '年 ') end end; writeln
program test (input,output,IntFile); type tree=^node; node=record name:char; tel:integer; left,right:tree; end; var IntFile:file of tree; r:tree; begin reset(IntFile,'tel-data'); read(IntFile,r);
program sort(input,output); var d:array [1..10000] of integer; numofdata:integer; i,j,k:integer; tmp:integer; begin read(numofdata) for i:=1 to numofdata do begin read(d[i]); end; ↓続きます
ちょいと書き直すと、 Program sort(input,output); var d:array [1..10000] of integer; numofdata:integer; i,j,k:integer; tmp:integer; begin read(numofdata); for i:=1 to numofdata do read(d[i]); (* begin end いらね *) for i:=1 to numofdata-1 do begin j:=i; for k:=i+1 to numofdata do if d[j]>d[k] then j:=k; (* begin end いらね *) tmp:=d[j]; d[j]:=d[i]; d[i]:=tmp end;
for i:=1 to numofdata do writeln(d[i]) (* begin end いらね *) end.
procedure binarysearch(p : データの型; mini, maxi : integer); begin i := (mini + maxi) div 2; (* mini と maxi の間の数ならなんでも *) if p = d[i] then writeln('Found at ', i) else if maxi = mini then begin write('Not found. Must be inserted '); if p > d[i] then write('after ') else write('before '); writeln(i, ' th number.') end else if p > d[i] then binarysearch(p, succ(i), maxi) else binarysearch(p, mini, pred(i)) end;
procedure insert(p ; データの型; i : integer); var j : integer; begin numofdata ;= succ(numofdata); for j := numofdata downto succ(i) do d[j] := d[pred(j)]; (* >>530は間違いだ orz *) d[i] := p end;
これは p を d の i 番目にそうぬうする手続な。>>531の真ん中へんでこれを呼ぶ。 if maxi = mini then begin i := i + ord(p > d[i]); writeln('Not found, then instert it as ', i, ' th number.'); insert(p, i) end
めんどいから逆ポで式を書くことにする。 例えば a b & c ¥ | ならば (a and b) or (not c) な。変数の個数は maxvar で与える。 Program Viva2chan; const maxvar = 'c'; type pnode= ^node; node = record value : boolean; next : pnode end; var stack : pnode; variables : array ['a'..maxvar] of boolean; i : integer; s : string; c : char;
procedure push(v : boolean); var nd : pnode; begin new(nd); nd^.value := v; nd^.next := stack; stack := nd end;
function pop : boolean; var v : boolean; nd : pnode; begin nd := stack; v := nd^.value; stack := nd^.next; pop := v; dispose(nd) end;
procedure ope(operation : char); var operand : boolean; begin if operation in ['&', '|', '#'] then operand := pop; with stack^ do case operation of '&' : value := value and operand; '|' : value := value or operand; '#' : value := value xor operand; '¥' : value := not value end end;
function calc(source : string) : boolean; var i : integer; c : char; begin for i := 1 to length(source) do begin c := source[i]; if c in ['a'..maxvar] then push(variables[c]) else if c in ['&', '|', '#', '¥'] then ope(c) end; calc := pop end;
procedure SetVarSet(n : integer); var c : char; begin for c := 'a' to maxvar do begin variables[c] := odd(n); n := n div 2 end end;
function powerof(n : integer) : integer; begin if n > 0 then powerof := powerof(pred(n)) * 2 else powerof := 1 end;
begin stack := nil; write('Enter term :'); readln(s); for i := 1 to powerof(ord(maxvar) - ord('a') + 1) do begin SetVarSet(i); for c := 'a' to maxvar do write(variables[c], ' '); writeln(calc(s)) end end.
procedure Minteger( var int: integer); begin repeat read(f, c) until c in['1','2','3','4','5','6','7','8','9','0']; if c in['1','2','3','4','5','6','7','8','9','0'] then int := ord(c) - ord('0'); end
procedure Extfile(var a:data; i :count); var x,y,z: integer; begin i := 0; while not eof(f) do begin { ファイル末尾でない限り } Minteger(int); x := int; Minteger(int); y := int; x := (10*x)+y; while not eoln(f) do begin i := i + 1; Minteger(int); y := int; Minteger(int); z := int; a[i] := (x*60) + (y*10) + z + 6; end; readln(f); { 改行文字を読み飛ばす } end; n := i; writeln(output); end;
procedure ArriveSin(var Ax:integer); var x,y,z,mi: integer; k: count; begin if (d = 1) then begin reset(f, 'HolyUmeda'); writeln('Holyを読み込み増した。') end else begin reset(f, 'WeekUmeda'); { ファイルを開く } writeln('Weekを読み込み増した。') end;
Extfile(a, i);
if (h < 14) then begin k := 1; while a[k] <= mi do k := k+1; Ax := a[k-1]; end else begin k := n; while a[k] > mi do k := k-1; writeln('a[',k,'] = ',a[k]); Ax := a[k]; end; close(f) end;
procedure term(operation : char); var operand, tempterm : string; begin if operation in ['&', '|', '#'] then operand := popt; with stack^ do begin case operation of '&' : tempterm := term + ' and ' + operand; '|' : tempterm := term + ' or ' + operand; '#' : tempterm := term + ' xor ' + operand; '¥' : tempterm := 'not ' + term end; term := '(' + tempterm +')' end end;
function disp(source : string) : string; var i : integer; c : char; begin for i := 1 to length(source) do begin c := source[i]; if c in ['a'..maxvar] then pusht(c) else if c in ['&', '|', '#', '¥'] then term(c) end; disp := popt end;
>>553です。ありがとうございます。 教えていただいたプログラムに549ー550を加えてみました。 Program Viva2chan; const maxvar = 'c'; type pnode= ^node; node = record value : boolean; term : string; next : pnode end; var stack : pnode; variables : array ['a'..maxvar] of boolean; i : integer; s : string; c : char;
procedure push(v : boolean); var nd : pnode; begin new(nd); nd^.value := v; nd^.next := stack; stack := nd end;
function pop : boolean; var v : boolean; nd : pnode; begin nd := stack; v := nd^.value; stack := nd^.next; pop := v; dispose(nd) end;
procedure ope(operation : char); var operand : boolean; begin if operation in ['&', '|'] then operand := pop; with stack^ do case operation of '&' : value := value and operand; '|' : value := value or operand; '\' : value := not value end end;
function disp(source : string) : string; var i : integer; c : char; begin for i := 1 to length(source) do begin c := source[i]; if c in ['a'..maxvar] then pusht(c) else if c in ['&', '|', '#', '\'] then term(c) end; disp := popt end;
function powerof(n : integer) : integer; begin if n > 0 then powerof := powerof(pred(n)) * 2 else powerof := 1 end;
begin stack := nil; write('Enter term :'); readln(s); for i := 1 to powerof(ord(maxvar) - ord('a') + 1) do begin SetVarSet(i); for c := 'a' to maxvar do write(variables[c], ' '); writeln(calc(s)) end end.
5ー7行目を549のように書き換えました。 60ー83行目に549ー550を追加しました。 コンパイルすると push, pop, ope, calc, SetVarSet, term "datakozo.p", line 62: Warning: Symbol 'POPT' is not defined [221] "datakozo.p", line 62: Warning: Mixing non-strings with strings [170] , disp "datakozo.p", line 80: Warning: Symbol 'PUSHT' is not defined [221] "datakozo.p", line 83: Warning: Symbol 'POPT' is not defined [221] "datakozo.p", line 83: Warning: Mixing non-strings with strings [170] , powerof, Viva2chan
program EX01(input,output); var D1,D2,S,D,P,Q:integer; begin read(D1,D2); S:=D1+D2;D:=D1-D2;P:=D1*D2;Q:=D1 dir D2; writeln(D1,D2); writeln(S,D,P,Q); end. 整数の四則演算なのですが、Windowsで保存するときの拡張子を教えてください。
コマンドプロンプトでは、 C:\Documents and Settings\user>cd My Documents C:\Documents and Settings\user\My Documents>bcc32 EX01.pas C:\Documents and Settings\user\My Documents>EX01.exe って感じでおkですか?
てへ、もういっちょ教えてくださいw さっきのを、整数じゃなくて実数にするのですが、 program PR01(input,output); real D1,D2,S,D,P,Q:integer; begin read(D1,D2); S:=D1+D2;D:=D1-D2;P:=D1*D2;Q:=D1/D2; writeln(D1,D2); writeln(S,D,P,Q); end. だとエラーが出るんですけど、どこが違うのでしょう?
program PR0203(input,output); var W,L,H,V,S:integer; begin readln(W,L);raldln(H);writeln(W,L,H); V:=W*L*H;S:=2*(W*(L+H)+L*H); writeln(V,S); end.
これでエラーが出るのは何故なんでしょう?
PR0203.pas(4,21) Error: Identifier not found "raldln" PR0203.pas(4,24) Error: Illegal expression PR0203.pas(4,25) Warning: Variable "H" does not seem to be initialized PR0203.pas(8) Fatal: There were 2 errors compiling module, stopping Fatal: Compilation aborted Error: C:\FPC\2.2.0\bin\i386-Win32\ppc386.exe returned an error exitcode (normal if you did not specify a source file to be compiled)
program PR0331(input,output); var D1,D2:real; var T1,T2,T3,T4,R1,R2,R3,R4:integer; begin read(D1,D2); T1:=trunc(D1);T2:=trunc(D2);T3:=trunc(-D1);T4:=trunc(-D2); R1:=round(D1);R2:=round(D2);R3:=round(-D1);R4:=round(-D2); writeln('trunc(',D1:2:1,')=',T1:2,'trunc(',D2:2:1,')=',T2:2,'trunc(',-D1:2:1,')=',T3:2,'trunc(',-D2:2:1,')=',T4:2); writeln('round(',D1:2:1,')=',R1:2,'round(',D2:2:1,')=',R2:2,'round(',-D1:2:1,')=',R3:2,'round(',-D2:2:1,')=',R4:2); end.
writeln('Data Entered : ', D1, D2); writeln('Trunc''s of them are ', trunc(D1), ' and ', trunc(D2), ' respectivly.'); writeln('Trunc''s of negated them are ', trunc(-D1), ' and ', trunc(-D2), ' respectivly.'); writeln('Round''s of them are ', round(D1), ' and ', round(D2), ' respectivly.'); writeln('Round''s of negated them are ', round(-D1), ' and ', round(-D2), ' respectivly.'); writeln('Thus, both functions are (different from / same for) each other in case of (you must fill this parenthesis ).')
program PR0311(input,output); ver D1,D2:integer; ver O1,O2,E1,E2:Boolean; begin read(D1,D2); O1:=odd(D1);D2:=odd(D2); E1:=even(D1);E2:=even(D2); writeln(' odd(',D1,')=',O1);writeln(' odd(',D2,')=',O2); writeln('even(',D1,')=',E1);writeln('even(',D2,')=',E2); end.
program PR0311(input,output); ver D1,D2:integer; begin read(D1,D2); writeln(' odd(',D1,')=',odd(D1));writeln(' odd(',D2,')=',odd(D2)); writeln('even(',D1,')=',even(D1));writeln('even(',D2,')=',even(D2)); end.
エラーメッセージ Free Pascal Compiler version 2.2.0 [2007/09/09] for i386 Copyright (c) 1993-2007 by Florian Klaempfl Target OS: Win32 for i386 Compiling PR0311.pas Fatal: Syntax error, "BEGIN" expected but "identifier VER" found Fatal: Compilation aborted Error: C:\FPC\2.2.0\bin\i386-Win32\ppc386.exe returned an error exitcode (normal if you did not specify a source file to be compiled)
Program Viva2chan(output); type courses = (programming, algebra, circuit, english, electromagnetics); coursset = set of courses; var studentA, studentB, studentC : coursset;
procedure DispSet(s : coursset); begin if programming in s then write('Programming'); if algebra in s then write('Algebra'); if circuit in s then write('Circuit'); if english in s then write('English'); if electromagnetics in s then write('Electromagnetics'); writeln end;
function factrial(i:integer): real; begin if n=1 then begin factrial := 1; end else begin factrial := i*factrial(i-1); end; begin write('Enter n : '); readln(n); For i:=1 to n do begin ANS:=1+(1/factrial); end; end;
function factrial(i:integer): real; begin if n=1 then begin factrial := 1; end else begin factrial := i*factrial(i-1); end; begin write('Enter n : '); readln(n); For i:=1 to n do begin ANS:=ANS+(1/factorical(i)); end; end; begin
function factorial(i:integer) : real; begin if i = 1 then factorial := 1 else factorial := i * factorial(i - 1) end; begin write('Enter n : '); readln(n); For i := 1 to n do ANS := ANS + (1. / factorial(i)); writeln('N = ', n, ' ANS = ', ANS:8:6); readln; end.
const USD = 118.94; GBP = 186.53; CNY = 13.93; EUR = 129.60; RUB = 3.73; var c : char; j, k : real; begin repeat writeln('********************'); writeln('d--USDOLLAR'); writeln('P--British Pound'); writeln('y--Chinese Yuan(gen)'); writeln('e--Euro'); writeln('r--Russian Rouble'); writeln('*****************'); write('Exchange to : '); readln(c); until (c = 'd') or (c = 'P') or (c = 'y') or (c = 'e') or (c = 'r'); write('Enter the amout of money in JPY : '); readln(j); case c of 'd' : begin k := j / USD; writeln('USD = $', k : 8 : 2) end; 'P' : begin k := j / GBP; writeln('GBP = ', k : 8 : 2, ' pound') end;
>>668 program prog1(input, output); var i,j,k : integer; a:array[1..9] of array[1..9] of array[1..9] of integer; begin for i := 1 to 9 do for j :=1 to 9 do for k :=1 to 9 do a[i,j,k]:=i*j*k;
for i := 1 to 9 do begin writeln('i=',i); for j := 1 to 9 do begin for k :=1 to 9 do write(a[i,j,k]:6); writeln(); end end end.
>>671 program prog1(input, output); var x,c: real; function f(x,c : real) :real; begin f := x*x-c; end;
function fd(x : real) :real; begin fd := 2*x; end; begin writeln('xの平行根の近似値を求めます'); write('x : '); read(c); x := c; while abs(f(x,c)) >0.0001do begin writeln(x,' ',f(x,c)); x := x-f(x,c)/fd(x); end; writeln(c,'の平行根の近似値は',x); end.
program prog1(input, output); var kame, turu, goukei, asi, tasi,sa: integer; begin write('鶴と亀の数は?'); readln(goukei); write('足の数は?'); readln(asi); tasi :=2*goukei; writeln('全部鶴だと仮定すると足の数は',tasi); sa := asi-tasi; writeln('実際の足の本数との差は', sa); writeln('鶴の代わりに亀が一匹入ると2本足が増える'); kame := trunc(sa/2); writeln('だから亀の数は', sa, '÷2=',kame); turu := goukei-kame; writeln('鶴の数は',turu); end.
program ensyu9(input,output); var i,data,answer : integer; begin randomize; answer := random(5); if data = answer then for i:=1 to 5 do begin readln(data); if data > answer then writeln('大きい') else if data < answer then writeln('小さい') else if data = answer then writeln('当たり') end; end.
>>680 >>681がWhileなら俺はrepeat〜untilで行こうかな。 program ensyu9(input,output); var i,data,answer : integer; begin randomize; answer := random(5); i:=1; repeat readln(data); if data > answer then writeln('大きい') else if data < answer then writeln('小さい') else if data = answer then writeln('当たり'); i:=i+1; until (i>5) or (data = answer) end.
program kadai06(input,output); uses wincrt; const kijun=170; var n,n1,n2:integer; a1,a2,a,x,s1,s2:real; begin n1:=0; n2:=0; a1:=0; a2:=0; read(x); while x>=0 do begin if x>=kijun then begin s1:=a1*n1; n1:=n1+1; a1:=(s1+x)/n1; end else begin s2:=(a2*n2); n2:=n2+1; a2:=(s2+x)/n2; end;
>>704 program prog1(input, output); var n,a,b : integer; begin write('初項a : '); read(a); write('公差b : '); read(b); for n := 1 to 20 do writeLn(n:3, (a+b*(n-1)):10); end.
ダイアを描くプログラムですが、これを壁に当たれば入射角=反射角で跳ね返るように動かすことはできませんか? procedure TForm1.Button1Click(Sender: TObject); const max=50; procedure line(x1,y1,x2,y2:integer); begin canvas.MoveTo(x1,y1);canvas.lineTo(x2,y2) end; procedure dia(x0,y0,r,n:integer); var xs,ys:integer;{始点} xe,ye:integer;{終点} i,j:integer; {ループ変数} t:real; {角度} begin t:=2*pi/n; for i:=1 to n-1 do begin xs := x0 + round(r*cos(t*i)); ys := y0 + round(r*sin(t*i)); for j:=i+1 to n do begin xe := x0 + round(r*cos(t*j)); ye := y0 + round(r*sin(t*j)); line(xs,ys,xe,ye) end end end; begin dia(100,400,70,11) end;
DelphiのVCLを使えるの? なら procedure PaintAngle(Canvas:TCanvas;x0,y0,r0,deg:Integer); var w:Extended; i:Integer; pt:array [0..2] of TPoint; begin w:=PI/180.0*deg; for i:=0 to 3-1 do begin pt[i].x:=round(x0+r0*sin(w)); pt[i].y:=round(y0+r0*cos(w)); w:=w+2*PI/3; end; Canvas.Polygon(pt); end; //試験コード var x0:Integer=200; y0:Integer=200; r0:Integer=100; deg:Integer=0; ///////////// タイマーを貼り付けてダブルクリック procedure TForm1.Timer1Timer(Sender: TObject); begin Invalidate; deg:=deg+10; end; ///////////// フォームのOnPaintに procedure TForm1.FormPaint(Sender: TObject); begin PaintAngle(Canvas,x0,y0,r0,deg); end;
カエサル暗号とは、各文字をアルファベット順で3つ後の文字に置き換える暗号方式である。 カエサル暗号を拡張し、標準入力から入力された数字だけ平文の文字をずらす暗号化を実現せよ。 平文(暗号化前の文章)が書かれたファイルを入力とし暗号化されたものを出力ファイルに書き出すプログラムを作成せよ。 (例) 6が入力された場合 I am a pen. →O gs g vkt.
関数f(x0)=0、a 以上 x0 未満の値 x について f(x)<0 x0 より大きく b 以下の値 x について f(x)>0 の時、 f(a) と f(b) を通る直線と x 軸との交点を求め、その値を c としたとき f(c)<0 であれば c を新たな a とし、f(c)>0 であれば c を新たな b とする この操作を回数繰り返しいずれかの値を x0 とする。
関数f(x0)=0、a 以上 x。 未満の値 x について f(x)<0 x。 より大きく b 以下の値 x について f(x)>0 の時、 f(a) と f(b) を通る直線と x 軸との交点を求め、その値を c としたとき f(c)<0 であれば c を新たな a とし、f(c)>0 であれば c を新たな b とする この操作を数回繰り返しいずれかの値を x。 とする。
//2点を通る直線とX軸の交点Yを求める function xCross(ax,ay,bx,by:Double):Double; var a,b:Double; begin a := (ay*bx - by*ax)/(bx-ax); b := ay - a*ax; Result:=-b/a; end; //問題中のf(x)式、初期値をx0とする。 function f(x,x0:Double):Double; begin Result:= x*x - x0*x0; end; //今回の問題を解くメインループ function test(x,a,b:Double):Double; var x0,c,fa,fb:Double; begin x0:=0; while ((a<x) and (x<x0) and (f(x,x0)<0)) or ((x0<x) and (x<b) and (f(x,x0)>0)) do begin c := xCross(a,f(a,x0),b,f(b,x0)); if f(c,x0)<0 then a:=c else if f(c,x0)>0 then b:=c; x0:=c; end; Result:=x0; end;
>>784 これ、ニュートン法と呼ばれる平方根を求めるアルゴリズムですね 問題が非常に不鮮明で最初の一文が無いと到底理解できない設問です。 ハッキリ言って悪題ですね。 きわめてシンプルにするとこんな感じになります。 function fSqrt(x:Double):Double; var s,last:Double; begin Result:=0; if x<=0 then exit; if x>1 then s:=x else s:=1; repeat last := s; s := (x/s+s) * 0.5; until s<last; Result:=last; end; 原理は簡単なので「平方根、ニュートン法」で調べてください。 ターミナルはwindowsのネットワーク越しにコンパイルを行う通信クライアントだと思われます。 もしかしたら、コンパイラはPascalじゃなくCかもしれません。 使用言語やコンパイル自体が分からない場合は友達と相談してください。 でわでわ。
emacsでプログラム書いてるのですが、 error: invalid operands to `+' error: incompatible type for argument 2 of `ace' error: routine declaration error: result of function `check' not assigned ↑のエラーの消し方がわからないのです 教えていただけないでしょうか
「U」 procedure divide( var A: intarray; var b1, e1, b2, e2: integer ); var x, y, temp: integer; begin x := b1; y := e2; while x < y do begin if A[x] > A[x+1] then begin temp := A[x]; A[x] := A[x+1]; A[x+1] := temp; x := x + 1; end else begin temp := A[y]; A[y] := A[x+1]; A[x+1] := temp; y := y - 1; end; end; e1 := x - 1; b2 := y + 1; end;
>>811-812をそのまま使って program aaa(input, output); const n=10 ; type intarray= array[1..n] of integer ; var A : intarray; begin Aにデータ入力 quicksort(A,1,n); データ出力 end. でいいんじゃないかな
program test(input, output); const m=3;n=10; type index=1..m; var a : array[index,index] of real; x ,y : array[index] of real; i,k,h : index ; s :real ;
{ y =Ax の計算を10回} for h:= 1to n do begin { y =Ax の計算1回分} for i := 1 to m do begin s := 0; for k:=1 to m do begin s := s + a[i,k] * x[k] ; end; y[i] := s ; end; x:=y ; end; {n秒後にA,B,Cにいる確率、順に} for i := 1 to m do writeln(x[i]); end.
課題で1〜nの総和計算の発展形の1〜n^2の総和計算を求める、というものがありました。 1〜nの挿話計算が var i,sum,n:integer; begin write('n='); readln(n); sum := 0; for i:=1 to n do sum := sum +i; writeln('Sum(1〜n)=',sum) end; となるのはわかったんですが、これをn^2にするときは、 上のプログラムのnをsqr(n)に変えるだけでできますか?
822です。引き続け申し訳ないですが、 6つの4,89,6,2,23,21という数字を小さいものから並び替えるプログラム procedure sort; const N = 6; const d: array[1 .. N] of integer = (4,89,6,2,23,21); var i, j, w: integer; sd: array[1 .. N] of integer; begin for i := 1 to N do sd[i] := d[i]; for i := 1 to N do for j := 1 to N - i do if sd[j] > sd[j+1] then begin w := sd [j]; sd[j] := sd[j+1]; sd[j+1] := w end; writeln('Sorted date :'); for i := 1 to N do write('sd[',i:3,'] '); writeln; for i := 1 to N do write(sd[i]:7,' ');writeln; readln end; を改良して、6つの数字のうち初めのM個だけを並び替えるという プログラムのつくりかたがわかりません。 どなたか教えていただけたら幸いです。
(* Standard ML *) fun permutation [] = [[]] | permutation list = let fun revolve [] = [[]] | revolve l = let fun shift 0 _ = [] | shift n (x::xs) = (x::xs) :: (shift (n-1) (xs@[x])) in shift (length l) l end fun permutation' [] = [[]] | permutation' (x::xs) = map (fn y => x::y) (permutation xs) in foldr (op @) [] (map permutation' (revolve list)) end;
(* 実行結果 *) - permutation [1,2,3]; val it = [[1,2,3],[1,3,2],[2,3,1],[2,1,3],[3,1,2],[3,2,1]] : int list list - permutation [1,2,3,4]; val it = [[1,2,3,4],[1,2,4,3],[1,3,4,2],[1,3,2,4],[1,4,2,3],[1,4,3,2],[2,3,4,1], [2,3,1,4],[2,4,1,3],[2,4,3,1],[2,1,3,4],[2,1,4,3],...] : int list list -
program prog1(input, output); var i,n : integer; p : array[1..10] of integer ;
procedure perm(i,n:integer); var j,t :integer; begin if i<n+1 then begin for j:=i to n do begin t:=p[i] ; p[i]:=p[j] ; p[j]:=t ; perm(i+1,n); t:=p[i] ; p[i]:=p[j] ; p[j]:=t ; end; end else begin for j :=1 to n do write(p[ j ],' '); writeln(''); end; end;
begin write('n='); read(n); for i := 1 to n do p[i]:=i; perm(1,n); end.
program prog1(input, output); const pi=3.1415926535; var i:integer; s,c,t:real; begin writeln('deg','sin':8,'cos':10,'tan':10); for i := 0 to 360 do begin s := sin(i*2*pi/360); c := cos(i*2*pi/360); if (i mod 15) = 0 then begin if (i mod 180 = 90) or (c= 0) then writeln(i:3,s:10:5,c:10:5,'-------':10) else writeln(i:3,s:10:5,c:10:5,s/c:10:5) ; end; end; end.
program prog1(input, output); var i ,x1,x2,x3,y1,m1,d1,y2,m2,d2: integer;
function calcd(y,m,d:integer):integer; var i,leapday,years,days,mdays:integer; begin years := y-1; days := d; days := days + years * 365; days := days + trunc (years/4) - trunc (years/100) + trunc (years/400); if ( (y mod 4 =0) and (y mod 100 <>0) and (y mod 400 =0) ) then leapday := 1 else leapday := 0; for i:=1 to m - 1 do begin case i of 1,3,5,7,8,10,12 : mdays := 31; 4,6,9,11 : mdays := 30; 2 : mdays := 28 + leapday ; end; days := days + mdays; end; calcd:=days; end;
begin writeln('next birthday'); write('year=');readln(y1); write('month=');readln(m1); write('day=');readln(d1); writeln('today'); write('year=');readln(y2); write('month=');readln(m2); write('day=');readln(d2); x1:=calcd(y1,m1,d1); x2:=calcd(y2,m2,d2); x3:=x1-x2; write('tanjobi made ',x3,' nichi'); end.
program Mat(input,output,ExtFile); const COL = 4; ROW = 4;
type Matrix = packed array [1..COL,1..ROW] of integer; MatrixFile = file of Matrix;
var ExtFile : MatrixFile; i : 1..COL; j : 1..ROW; InputMatrix : Matrix;
begin rewrite( ExtFile, 'ExtFile' ); for i := 1 to COL do begin for j := 1 to ROW do begin write( '[', i, ',', j, ']?:' ); readln( InputMatrix[i,j] ) end end; write( ExtFile, InputMatrix ) end.
>>875 動作確認なんてしてないから間違ってたらすまん 改行大杉って怒られたんでつめて書く type TMatrix3x3 = array[0..2][0..2]of Double; function det3x3(Mat:TMatrix3x3):Double; var i,j:Integer; hoge:Extended; begin Result:=0; //Plus for i:=0 to 2 do begin hoge:=1;
for j:=0 to 2 do hoge:=hoge*Mat[j][(i+j)mod 3];
Result:=Result+hoge;
end; //Minus for i:=0 to 2 do begin hoge:=1; for j:=0 to 2 do
program test(output); const N = 10; type ZeroToN = 0..N; OneToN = 1..N; OneToNPlusOne = 1..N+1; CountArr = array [1..N+1] of ZeroToN; var count : CountArr; i, x : integer; EndFlag : boolean;
procedure Increment( var count : CountArr; a : OneToNPlusOne ); begin if ( count[a] <> N-1 ) then begin count[a] := count[a] + 1 end else begin count[a] := 0; Increment( count, a+1 ) end end;
>>937 C言語 /* (defun p (n) (do ((x 2 (1+ x)) (y n)) ((= y 1)) (do ((z x)) ((/= 0 (mod y z))) (print z) (setf y (/ y z)) ) ) ) */ void p(int n) { int x, y, z; for(x=2, y=n; y != 1; x++) { for(z=x; y % z == 0; ) { printf("*%d", z); y = y / z; } } } int main() { int n; scanf("%d", &n); printf("1"); p(n); }