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;
36 名前:774RR mailto:sage [2006/01/18(水) 17:39:59 ]
これが都筑。部分反鋳型、習合型、再帰予備出といろいろ浸かってる。番兵定石もね。 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;
44 名前:43 mailto:sage [2006/01/19(木) 23:18:36 ]
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; ;
45 名前:43 mailto:sage [2006/01/19(木) 23:20:58 ]
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;
46 名前:43 mailto:sage [2006/01/19(木) 23:22:37 ]
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;
47 名前:43 mailto:sage [2006/01/19(木) 23:23:38 ]
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;
48 名前:43 mailto:sage [2006/01/19(木) 23:24:24 ]
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 でマイナスの場合はエラーを出すようになってるからそこをマイナスでもいけるようにすればいい
その場合charだと一文字しか入らないから-1とかだと2文字を入れることになる
このプログラムの場合2桁の数字をいれてもエラーがでるな
50 名前:43 mailto:sage [2006/01/20(金) 23:29:26 ]
すいません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;
51 名前:43 mailto:sage [2006/01/20(金) 23:32:23 ]
46も訂正しました。これなら2桁以上扱えるはずです。 マイナスは '-'ではいけないのでしょうか? 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 := constant { その因子は<定数>として評価.} 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の間違い。 そこも直せ。話はそれからだ
73 名前:ささ ◆6KVcpBNXy. [2006/01/27(金) 09:55:45 ]
教科書のプログラミングをそのまま書いたのですが… 三科目のデータを入力する言葉?がわかりません。
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;
74 名前:ささ ◆6KVcpBNXy. [2006/01/27(金) 09:56:33 ]
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.
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 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 { gcd };
88 名前:86 [2006/01/28(土) 23:23:29 ]
87のつづき
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.
89 名前:774RR mailto:sage [2006/01/28(土) 23:23:43 ]
Program fibonacci(input,output); var i,n : integer;
function fibonacci(n : integer):integer; begin if n>=3 then fibonacci:=fibonacci(n-1)+fibonacci(n-2) else fibonacci:=1 end; { fibonacci }
begin writeln('数列の長さを入力してください'); readln(n); for i:=1 to n do write(fibonacci(i):3,', '); writeln end.
function gcd(a, b: integer): integer; begin if b = 0 then gcd := a else gcd := gcd(b, a mod b) end;
92 名前:86 [2006/01/28(土) 23:54:02 ]
program gcd(input, output);
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 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.