const n = 0; var i: integer; CTab: array [1..n] of string; s: string; begin write('繰り返し回数を決めて下さい'); readln(n);
for i := 1 to n do //n回繰り返す。nが10なら10回 begin readln(CTab[i]); // i の値は1回目のループ時は1、10回目なら10 write('終了しますか? [Y]'); readln(s); //とりあえずsに入れる if s = 'y' then break; //sの中身が'y'ならループから脱出 end;
const n = 0; var i,min,max:integer; CTab: array [1..n] of string; s: string;
{一時停止用変数} x:string;
begin max:=0; min:=i; write('繰り返し回数を決めて下さい'); readln(n); for i := 1 to n do begin readln(CTab[i]); write('終了しますか?する場合は【y】と入力して下さい'); readln(s); if s = 'y' then break; end;
begin max:=0; min:=i; write('繰り返し回数を決めて下さい'); readln(n); for i := 1 to n do begin readln(CTab[i]); write('終了しますか?する場合は【y】と入力して下さい'); readln(s); if s = 'y' then break; end; begin if(max<i) then max:=i else if(min>i) then min:=i; end; writeln('最大値=',max,'最小値=',min,');
>>57 var STab: array[0..19]of integer; i, m, iValue, index: integer; begin for i:=Low(STab) to High(STab) do Readln(STab[i]); // 入力受け付け for i:=Low(STab) to High(STab) do Write(Stab[i],#9); //要素表示 Writeln; for i:=Low(STab) to High(STab) do //ソート begin iValue:= STab[i]; index:= i;
for m:=i+1 to High(STab) do if STab[m] < iValue then begin iValue:= STab[m]; index:= m; end;
STab[index]:= STab[i]; STab[i]:= iValue; end;
for i:=Low(STab) to High(STab) do Write(Stab[i],#9); //要素表示 Writeln;
>>129 こんなもんで、どうでしょう? program prg00(Output); var N: Integer; e: array [2..17] of Real; f: array [1..17] of Integer; sumM,sumH,sum: Real; procedure Print; var I: Integer; begin for I := 2 to 17 do Write(Output, f[I]:2); Writeln(Output, sumM) end; begin sumM := 0.0; f[1] := 1; for N := 2 to 17 do begin e[N] := Sqrt(N); sumM := sumM + e[N]; f[N] := 0 end;
sumH := sumM / 2; N := 2; while N >= 2 do begin if f[N] = 0 then begin f[N] := 1; sum := sum + e[N]; if sum >= sumH then begin if sum < sumM then begin sumM := sum; Print end end else if N < 17 then N := N + 1 end else つづく
厳密に標準Pascalに従おうとすると、英字が連続しているとは かぎらないので、ちょいむずかしい。表を使って program Locase(input,output); const MaxChar = 255; var C : Char; I : Integer; table : array [Char] of Char; High, Low : packed array [1..26] of Char; begin High := 'ABCDEFGHIJLMNOPQRSTUVWXYZ'; Low := 'abcdefghijlmnopqrstuvwxyz'; for C := Chr(0) to Chr(MaxChar) do table[C] := C; for I := 1 to 26 do table[High[I]] := Low[I]; while not Eof do begin if Eoln then begin Readln; Writeln end else begin Read(C); Write(table[C]) end end end. のようにする。ただし 1. Charが8ビットでない場合はMaxCharを適当に直すこと。 2. 入力が改行で終わっていない場合はおかしくなるかもしれない。 3. DelphiではHigh/Lowの型をstringにしないとエラーになる。
program ex(input,output); type name_p=^person; person=record name:string[20]; test:integer; ptr:name_p end; var start,refer:name_p; datn:string[20]; dat:integer;
>>170 う、そんなに簡単な問題だとはおもわなかった。 var s, p: name_p; としておいて
p^.name := newdatn; p^.test := newdat; if newdat < start^.test then begin p^.ptr := start; start := p end else begin s := start; while s^.ptr^.test < newdat do s := s^.ptr; p^.ptr := s^.ptr; s^.ptr := p end
学生の身長を表すデータ型を、学籍番号を表す整数型の欄noと、 身長を表す実数型の欄heightをもつ次のレコード型で定義する。 type student = record no : integer; height : real end; 2人の学生のデータ(student型のa,b)を引数とする、以下の2つの関数および手続きを作成せよ。 (1)身長の高い方の学生の学籍番号noを返す関数higherno(a,b:student):integer (2)身長の高い方の学生のデータをcに返す手続きhigher(a,b:student; var c:student) ただし、2人の身長が等しい場合は一つめの引数となった学生のデータ ((1)ならば学籍番号。(2)ならばstudent型のデータ)を返すこととする。
program eightqueen(input, output); const queen = 8; type q = 1..queen; var board : array [q] of q; num : integer; procedure answer; var i, j : q; begin writeln; num := num + 1; writeln(num); for i := 1 to queen do begin for j := 1 to queen do if board[i] = j then write('Q') else write('.'); writeln; end; end; function check: boolean; var i, j : q; begin check := true; for i := 1 to queen do for j := 1 to queen do if (i <> j) and ((i-j = board[i] - board[j]) or (i-j = board[j] - board[i]) or (board[i] = board[j])) then check := false; end; procedure loop(n : q); var i : q; begin for i := 1 to queen do begin board[n] := i; if n <> queen then loop(n+1) else if check then answer; end; end; begin num := 0; loop(1); end.
途中でチェック版 program eightqueen(input, output); const queen = 8; type q = 1..queen; var b : array [q] of q; num : integer; procedure answer; var i, j : q; begin writeln; num := num + 1; writeln(num); for i := 1 to queen do begin for j := 1 to queen do if b[i] = j then write(' Q ') else write(' . '); writeln; end; end; function check(n: q): boolean; var i: q; begin check := true; for i := 1 to n-1 do if (abs(i-n) = abs(b[i]-b[n])) or (b[i] = b[n]) then check := false; end; procedure loop(n: q); var i : q; begin for i := 1 to queen do begin b[n] := i; if check(n) then if n <> queen then loop(n+1) else answer; end; end; begin num := 0; loop(1); end.
対称解ありだけど、8の倍数にならないな・・・。 program knight(input, output);const SIZE = 5; type D = 1..SIZE; M = 0..SIZE*SIZE; var board : array [D, D] of M; num : Integer; procedure init; var i, j : D; begin num := 0; for i := 1 to SIZE do for j := 1 to SIZE do board[i,j] := 0; end; procedure answer; var i, j : D; begin writeln; num := num + 1; writeln(num); for i := 1 to SIZE do begin for j := 1 to SIZE do write(board[i,j]:3); writeln; end; end; procedure move(x, y : D; n : M); forward; procedure next(x, y : D; n : M); begin move(x+2, y+1, n); move(x+2, y-1, n); move(x+1, y+2, n); move(x+1, y-2, n); move(x-1, y+2, n); move(x-1, y-2, n); move(x-2, y+1, n); move(x-2, y-1, n); end; procedure move; begin if (x in [1..SIZE]) and (y in [1..SIZE]) then if board[x,y] = 0 then begin board[x,y] := n; if (n = SIZE*SIZE) then answer else next(x, y, n+1); board[x,y] := 0; end; end; begin init; move(1,1,1); end.
const n:=5; var x0,y0,i,j:integer;dx,dy:array[1..8] of integer;board:array[1..n,1..n] of integer; procedure tour(turn,x,y:integer); var i,j,k,no:integer; begin no:=0;k:=0; if (x>0)and(x<=n)and(y>0)and(y<=n)and(board[x,y]=0) then begin board[x,y]:=turn;no:=no+1;k:=k+1;x:=x+dx[k];y:=y+dy[k]; if turn=(n*n) then tour(turn+1,x,y) else begin board[x,y]:=0;tour(turn+1,x,y) end end else if turn=(n*n) then begin writeln('No.',no); for i:=1 to n do begin for j:=1 to n do write(board[i,j]:3);writeln end end; end; begin dx[1]:=2;…dx[8]:=2;dy[1]:=1;…dy[8]:=-1; for i:=1 to n do for j:=1 to n do board[i,j]:=0; x0:=1;y0:=1;tour(i,x0,y0) end.
procedure radixsort; const R = 10; var radix : array [0..N-1] of 0..R-1; temp : array [0..N-1] of integer; i, j, k, x, max: integer; begin max := 1; for i := 0 to N-1 do while A[i] > max do max := max * R;
x := 1; while x <= max do begin for i := 0 to N-1 do radix[i] := (A[i] div x) mod R;
i := 0; for j := 0 to R-1 do for k := 0 to N-1 do if radix[k] = j then begin temp[i] := A[k]; i := i + 1; end;
for i := 0 to N-1 do A[i] := temp[i]; x := x * R; end; end;
begin a[1,1]:=2;a[1,2]:=2;a[1,3]:=1;a[1,4]:=1; a[2,1]:=2;a[2,2]:=4;a[2,3]:=4;a[2,4]:=5; a[3,1]:=4;a[3,2]:=10;a[3,3]:=14;a[3,4]:=18; a[4,1]:=6;a[4,2]:=10;a[4,3]:=15;a[4,4]:=20; p[1]:=1;p[2]:=2;p[3]:=3;p[4]:=4; lup_decom(a,p,sz); for i:=1 to sz do begin for j:=1 to sz do if p[i]:=j then write(1,' ') else write(0,' '); writeln(); end; writeln();
for i: =1 to sz do begin for j:=1 to sz do write(a[p[j],j:5,' '); writeln() end; wrteln() end.
type num = record n : integer; next : ^num; end; list = ^num; procedure print(p : list); begin if p <> nil then begin print(p^.next); write(p^.n:8); end; end; procedure hoge(m, n : integer; p : list); var tmp : num; begin if n = 0 then begin print(p); writeln; end else if m <> 0 then begin tmp.n := m; tmp.next := p; hoge(m-1, n-1, &tmp); hoge(m-1, n, p); end; end;
procedure omaemona(m,n: Integer; a: itteyoshi = []); var i: Integer; begin if n > 0 then for i := m downto n do omaemona(i-1,n-1,a+[i]); else begin i := 1; while a <> [] do begin if i in a then begin Write(i,' '); Exclude(a,i); end; Inc(i); end; Writeln(''); end; end;
>>261 program rpo(input,output); type tree = ^node; node = record op: Char; L,R: tree end; var root: tree; procedure ReadChar(var c: Char); begin c := ' '; while not Eoln and (c = ' ') do Read(c) end; procedure ReadTree(var t: Tree); begin New(t); ReadChar(t^.op); if t^.op in ['+', '-', '/', '*'] then begin ReadTree(t^.L); ReadTree(t^.R) end end; function Calc(t: Tree): Integer; var n: Integer; begin if t^.op = '+' then Calc := Calc(t^.L) + Calc(t^.R) else if t^.op = '-' then Calc := Calc(t^.L) - Calc(t^.R) else if t^.op = '*' then Calc := Calc(t^.L) * Calc(t^.R) else if t^.op = '/' then Calc := Calc(t^.L) div Calc(t^.R) else begin Write(t^.op, ': '); Readln(n); Calc := n end end; begin ReadTree(root); Writeln(Calc(root)) end.
program a(input,output,intfile1,intfile2,intfile3); var intfile1,intfile2,intfile3 : file of integer; a,b,c : integer;
procedure mkfile1; begin rewrite(intfile1,'file1'); writeln('file1の作成 整数を小さい順に入力。(0を入力で終了)'); readln(a); while a<>0 do begin write(intfile1,a); readln(a) end end; { mkfile1 }
procedure mkfile2; begin rewrite(intfile2,'file2'); writeln('file2の作成 整数を小さい順に入力。(0を入力で終了)'); readln(b); while b<>0 do begin write(intfile2,b); readln(b) end end; { mkfile2 }
procedure showfile3; { file3確認用 } begin writeln('file3の出力。'); reset(intfile3,'file3'); while not eof(intfile3) do begin read(intfile3,c); writeln(c) end end; { showfile3 }
repeat if a<b then begin write(intfile3,a); read(intfile1,a) end else begin if a>b then begin write(intfile3,b); read(intfile2,b) end else begin write(intfile3,a); read(intfile1,a); read(intfile2,b) end end until eof(intfile1) or eof(intfile2);
if eof(intfile1) then repeat write(intfile3,b); read(intfile2,b) until eof(intfile2); if eof(intfile2) then repeat write(intfile3,a); read(intfile1,a) until eof(intfile1);
program sort(input,output); type characters = array [1..50] of char; var d: array [1..10000] of characters; i,j,k,n: integer; tmp: characters; begin {データ入力} read(n); for i:=1 to n do readln (d[i]);
{ソート}
for i:=1 to n do begin j:=i; for k:=i+1 to n-1 do if d[j]>d[k] then j:=k; tmp:=d[j]; d[j]:=d[i]; d[i]:=tmp; end;
program sort(input,output); const n = 10000; m = 8; type characters = array[1..8] of char; var d : array [1..n] of characters;{No} g : array [1..n] of integer;{Score} num,i,j,k,tmp1,r,q : integer; tmp2 : characters;
begin {input} readln(num); for i:=1 to num do begin read(d[i]); readln(g[i]); end;
for i:=1 to num do begin {sort} j:=i; for k:=i+1 to num do if g[j]<g[k] then j:=k; tmp1:=g[j]; tmp2:=d[j]; g[j]:=g[i]; d[j]:=d[i]; g[i]:=tmp1; d[i]:=tmp2; end; {output} for i:=1 to num do writeln(i,' ',d[i],' ',g[i]) end.
var i, ii, n : integer; StudentNum, order : integer; results : array [1..MaxStudentNumPlus1] of result; begin { 学生数StudentNumを読み込む。適当な値でなければ終了 } { resultsを読み込む。} { resultsを成績の降順に順序付けする } results[succ(StudentNum)].Score = -1; (* sentinel *) order := 1; i := 1; while i <= StudentNum do begin ii := i; n := results[ii].Score; repeat ii := succ(ii) until results[ii].Score < n; { orderを出力 } { results[i]からresults[pred(ii)]までの内容を出力 } order := order + (ii - i); i := ii end end.
procedure MatrixProduct(A, B : matrix; var C : matrix; var avail : boolean); (* A×Bを計算し、Cに出力する。演算不能であればavailにfalseを返す *) var i : indexC; j : indexR; k : integer; sum : real; begin avail := (A.nc = B.nr); if avail then with C do begin nc := B.nc; nr := A.nr; for i := 1 to nc do for j := 1 to nr do begin sum := 0; for k := 1 to A.nc do sum := sum + A.data[k, j] * B.data[i, k]; data[i, j] := sum end end end;
program match(input,output); const m=3; type syuu = array [1..m,1..m] of integer; var S : syuu; i,j,n : integer; k,key : integer; begin {Sの中身を入力} for i:=1 to m do begin for j:=1 to m do begin read(k); S[i,j]:=k; end; end; {ある数nを入力} writeln; read(n); for i:=1 to m do begin for j:=1 to m do if n=S[i,j] then key:=1; end; if key=1 then begin {なにかすること。} end; end.
手持ちの処理系(Virtual Pascal for OS/2)で関数引数を記述する方法を 忘れたので例によってテストできないw 取説どこにしまったっけ…
function NumberOf(function criterion(n1 : integer) : boolean); var nn : integer; begin nn := 0; for i := 1 to n do nn := nn + ord(criterion(A[i])); NumberOf := nn end;
function isodd(n : integer) : boolean; begin isodd := odd(n) end; function iseven(n : integer) : boolean; begin iseven := not odd(n) end;
procedure Quicksort(L, R: integer; function order(n1, n2 : integer) : boolean); (* 奥村先生の本というかalgo_pas.lzhのCHAP07.PRGから改変 *) var I, J, X, T: integer; begin X := A[(L + R) div 2]; I := L - 1; J := R + 1; repeat repeat I := I + 1 until order(X, A[I]); repeat J := J - 1 until order(A[J], X); T := A[I]; A[I] := A[J]; A[J] := T (* 最後の交換は余計である *) until I >= J; A[J] := A[I]; A[I] := T; (* 最後の交換を元に戻す *) if L < I - 1 then Quicksort(L, I - 1, order); if J + 1 < R then Quicksort(J + 1, R, order) end;
function NotLessThan(n1, n2 : integer) : boolean; begin NotLessThan := n1 <= n2 end; function NotGreaterThan(n1, n2 : integer) : boolean; begin NotGreaterThan := n1 >= n2 end;
昇順にソートするときはQuicksort(1, n, NotLessThan)、 降順ならQuicksort(1, n, NotGreaterThan)を呼ぶ。
procedure permutation(var target,original :string); {originalの並び替えた順列をすべて見つけ、それらをtargetの右端に連結する} var i:integer ; target1,original1:string; begin if length(original)=0 then begin writeln(target); end {originalに文字がないならtargetを出力}
while i <= length(original) do {それ以外は各々のiに対して} begin {originalのi番目の文字をtargetの右端に写し} target1:=target+original[i]; {再帰の呼び出しを行う} original1:=copy(original,1,i-1)+copy(original,i+1,length(original)-i); permutation(target1,original); i:=i+1; end;
end;
end;
begin {メイン開始} writeln('input a string of characters'); readln(permstring); blank:= ' '; writeln('the set of permutations:'); permutation(blank,permstring); {あらゆる順列を見つける} writeln('done'); end.
Write(Output, 'Input minutes = '); Readln(Input, n); Write(Output, 'Parking time => ', n div 60, ':', n mod 60, ' =>'); if n < 60 then Writeln(Output, '\ 0') else if n < 180 then Writeln(Output, '\150') else Writeln(Output, '\300');
文字'0'から'9'までが、この順で、しかも途中に他の文字がなく充填されて いると仮定する。 const MaxDigitPlus1 = 9; (* 桁数+1 *) type str = packed array [1..MaxDigitPlus1] of char; var zero : integer;
function StrToInt(s : str) : integer; var i, ii : integer; begin i := 1; ii := 0; s[MaxDigitPlus1] := ' '; (* sentinel *) while s[i] in ['0'..'9'] do begin ii := ii * 10 + ord(s[i]) - zero; i := succ(i) end; StrToInt := ii end;
begin zero := ord('0'); writeln(StrToInt('123') ....
procedure sort(var t : table); var i,j,w : integer; label m; begin for i := 2 to n do begin w := t[i]; j := i; repeat if t[j-1] > w then begin t[j] := t[j-1]; j := j - 1; end else goto m; until (J=1) ; m: t[j] := w; end; end;
procedure sortRec(var t : table; min, max : integer); var i,j,pivot,w : integer; begin if min < max then begin pivot := t[max]; i := min; j := max - 1; while t[i] < pivot do i := i + 1; while (i < j) and (t[j] > pivot) do j := j - 1; while i < j do begin w := t[i]; t[i] := t[j]; t[j] := w; while t[i] < pivot do i := i + 1; while (i < j) and (t[j] > pivot) do j := j - 1; while (i < j) and (t[i] = pivot) and (t[j] = pivot) do begin i := i + 1; j := j - 1; end; end; w := t[i]; t[i] := pivot; t[max] := w; sortRec(t,min,i-1); sortRec(t,i+1,max); end; end;
procedure sortRec(var t : table; min, max : integer); var i,j,pivot,w : integer; begin if min < max then begin pivot := t[min]; i := min+1; j := max ; while t[i] <= pivot do i := i + 1; while (i < j) and (t[j] >= pivot) do j := j - 1; while i < j do begin w := t[i]; t[i] := t[j]; t[j] := w; while t[i] <= pivot do i := i + 1; while (i < j) and (t[j] >= pivot) do j := j - 1; while (i < j) and (t[i] = pivot) and (t[j] = pivot) do begin i := i + 1; j := j - 1; end; end; w := t[j]; t[j] := pivot; t[min] := w; sortRec(t,min,i); sortRec(t,j,max); end; end;
program computation (input,output); const n=100; type string=string[n]; var letter:string; a,i,max,min,result:integer; begin writeln('数式を入力してください。'); readln(letter); i:=0; while letter[i]<>')' do begin i:=i+1; end; max:=i; i:=0; while letter[i]<>'(' do begin i:=i+1; end; min:=i;
i:=min+1; while i<=max-1 do begin if letter[i]='+' then result:=ord(letter[i-1])+ord(letter[i+1])-48*2 else i:=i+1; end;
出納帳のプログラムの未完成のものです。これを完成させれば良いそうです。 program kadai(input,output); type slip=record end; table=array[1..10] fo slip; var data : table; count : integer; query : char; ……;
begin readln(query) while query <> `e` do begin case query of `a`:nyuryoku(data,count); `b`:hyoji(data,count); `c`:kensaku(data,day); `d`:sort(data); end; readln(query) end; end.
ちなみに入力の部分だけはできたのですが… type date = record year:integer; month:1..12; day:1..31; end; item = record head:packed array[1..16] of char; price:integer; dating:date; end; var syuusi:packed array[1..1000] of item; i,n,x,y:integer; g:char; begin x:=0; i:=0; writeln('何項目入力するか入力して下さい'); readln(n); for i:= 1 to n do begin with syuusi[i] do begin writeln(i,'項目目'); writeln('項目名を入力して下さい'); readln(head); writeln('収入、支出を入力して下さい 支出の場合はマイナスをつけて下さい'); readln(price); writeln('年を入力して下さい'); with dating do readln(year); writeln('月を入力して下さい'); with dating do readln(month); writeln('日を入力して下さい'); with dating do readln(day); end;end;
>>413 charでやってみたのですが、途中で止まってしまいます・・・ program calc(input, output); var menu : char; japyen : integer; exyen : real; begin writeln('This program converts Japanese yen into the currency of other countries. '); writeln; writeln('******************************'); writeln('d == US Doller'); writeln('p == British Pounds'); writeln('g == Chinese Yuan'); writeln('e == Euro'); writeln('r == Russian Ruble'); writeln('******************************'); write('Exchange to : '); readln(menu); write('Enter the amount of money in Japanese Yen : ? '); readln(japyen);
case menuasc of d : begin exyen:=japyen / 118.94; writeln('USD = ',exyen:2:2); writeln; writeln('End of Job.'); end; end; end.
program test (input,output); const n=100; type string=string[n]; table=array[0..100]of integer; var letter:string; a,i,x,k,l,z,fin,finalans:integer; result,ans:table; t:boolean;
(*掛け算開始*) procedure multiply(i,fin:integer;t:boolean;var letter:string;var x:integer;var result:table); begin repeat repeat i:=i+1; until (letter[i]='*'); if i>=100 then t:=false; if t=true then begin result[x]:=(ord(letter[i-1])-48)*(ord(letter[i+1])-48); letter[i-1]:='0'; letter[i]:='0'; letter[i+1]:='0' end;
(*掛け算が続いていた場合*) repeat i:=i+2; if letter[i]='+' then t:=false; if letter[i]=')' then t:=false; if t=true then begin if letter[i]='*' then begin result[x]:=result[x]*(ord(letter[i+1])-48); end; end; until t=false; x:=x+1; until i>=fin; end;
(*足し算開始*) procedure addition(i,fin:integer;t:boolean;var letter:string;var x:integer;var result:table); begin repeat repeat i:=i+1; until (letter[i]='+'); if i>=100 then t:=false; if t=true then begin result[x]:=(ord(letter[i-1])-48)+(ord(letter[i+1])-48); writeln('r[', x, ']: ', result[x]); x:=x+1; letter[i-1]:='0'; letter[i]:='0'; letter[i+1]:='0'; end until i>=fin; end;
(*合計開始*) procedure resultadd(x:integer;var result:table;var l:integer;var ans:table); var k:integer; begin k:=1; for k:=1 to x-1 do begin ans[l]:=ans[l]+result[k]; writeln('r',result[k]); end; for k:=1 to x-1 do begin result[k]:=0; end; writeln('ANS:',ans[l]); l:=l+1; end;
(*括弧の中の計算*) procedure priority(i,x:integer; t:boolean;var result:table;var letter:string;var ans:table); var eol,sol:integer; begin repeat i:=i+1; until letter[i]=')'; if i>=100 then t:=false; if t=true then begin eol:=i; repeat i:=i-1; until letter[i]='('; sol:=i; letter[sol]:='0'; letter[eol]:='0'; multiply(i,eol,t,letter,x,result); addition(i,eol,t,letter,x,result); resultadd(x,result,l,ans); i:=sol; if letter[i-1]='*' then begin ans[l-1]:=ans[l-1]*(ord(letter[i-2])-48); sol:=i-2; end; priority(i,x,t,result,letter,ans); end; end;
(*最終合計*) procedure finalanswer(l:integer;ans:table;var finalans:integer); var i:integer; begin writeln('L:',l); for i:=1 to (l-1) do begin finalans:=finalans+ans[i]; writeln('ANS:',ans[i]); end; writeln; writeln; write('この式の答えは「'); write(finalans); writeln('」である'); end;
(*掛け算が続いていた場合*) repeat if letter[i+2]<>'*' then t:=false; if letter[i+2]='*' then begin i:=i+2; result[x]:=result[x]*(ord(letter[i+1])-48); end; until t=false; x:=x+1; until i>=fin; end;
function Factor: Integer; begin if C in ['0'..'9'] then begin Factor := Ord(C)-Ord('0'); ReadChar; end else if C = '(' then begin ReadChar; Factor := Expression; if C=')' then ReadChar else writeln('括弧が閉じられてないよ'); end else begin writeln('不正な入力: ',C); Factor := 0; end; end;
program test (input,output); const n=100; type string=string[n]; table1=array[0..100]of integer; table2=array[0..100]of char; var tmp:string; i,k,fin,eol:integer; num:table1; let:table2; t:boolean; (*空白を飛ばす*) procedure closetmp(n:integer;t:boolean; var tmp:string); var a,emps,empe:integer; begin a:=0; repeat repeat a:=a+1; until tmp[a]=' '; if a>=n then t:=false;
if t=true then begin emps:=a; repeat a:=a+1; until tmp[a]<>' '; end;
begin repeat if tmp[i] in ['0'..'9'] then begin let[i]:='0'; num[i]:=ord(tmp[i])-48; end else begin let[i]:=tmp[i]; num[i]:=0; end; i:=i+1; until i>=(n+1);
(*文字列を詰める*) procedure closelines(n:integer;var num:table1;var let:table2); var i,k:integer; begin i:=0; repeat i:=i+1; if (ord(let[i])-48)=num[i] then begin k:=i; repeat let[k]:=let[k+1]; num[k]:=num[k+1]; k:=k+1; until k>=n; i:=0; end; until i>=n; end; (*掛け算開始*) procedure multiply(t:boolean;i,fin:integer;var num:table1;var let:table2;var eol:integer); var k:integer; begin k:=i; repeat repeat k:=k+1; until (let[k]='*');
if k>=fin then t:=false; if t=true then begin num[k-1]:=num[k-1]*num[k+1]; let[k-1]:='0'; let[k]:='0'; let[k+1]:='0'; num[k+1]:=0; num[k]:=0; closelines(n,num,let); k:=i; eol:=eol-2; end; until k>=fin; end; (*足し算開始*) procedure addition(t:boolean;i,fin:integer;var num:table1;var let:table2;var eol:integer); var k:integer; begin k:=i; repeat repeat k:=k+1; until (let[k]='+');
if k>=fin then t:=false; if t=true then begin num[k-1]:=num[k-1]+num[k+1]; let[k-1]:='0'; let[k]:='0'; let[k+1]:='0'; num[k+1]:=0; num[k]:=0; closelines(n,num,let); eol:=eol-2; k:=i; end; until k>=fin; end; (*括弧の中の計算*) procedure priority(n:integer; t:boolean;var num:table1;var let:table2); var i,eol,sol:integer; begin i:=0; repeat i:=i+1; until let[i]=')';
if i>=n then t:=false; if t=true then begin eol:=i; repeat i:=i-1; until let[i]='('; sol:=i; multiply(t,sol,eol,num,let,eol); addition(t,sol,eol,num,let,eol); let[sol]:='0'; let[eol]:='0'; closelines(n,num,let); end; end; (*最終合計*) procedure finalanswer(num:table1); var i:integer; begin
procedure sort(n: integer); var ループ制御用の変数i,jを宣言する; その他、作業用の変数を宣言する; begin for i:=n-1 downto 1 do begin for j:=1 to i do begin もし A[j]>A[j+1]ならば A[j]とA[j+1]の内容を交換する end end end;
begin {入力部} ソートすべき要素の個数を読み込み、それをnとする; n個の数を読み込み、順に配列Aへ格納する; {ソート部} sort(n); {配列A[1..n]をソートする} {出力部} 配列A[1..n]の内容を書き出す end.
クイックソートのアルゴリズム(例) program QuickSort(input,output); var ソート対象となる数列を格納するinteger型配列Aを宣言する; 要素数を表す変数nを宣言する; その他、ループ制御用の変数を宣言する;
procedure sort(low,high : integer);{A[low..high]をソートする手続き} var 分割の基準を表す変数bを宣言する; 探索の注目位置を表す変数i,jを宣言する; その他、作業用の変数を宣言する; begin if low < high then {low = highならば要素が1つだけなのでソートする必要なし。} begin i:=low; {探索の初期位置を設定} j:=high; b:=A[low]; {分割の基準を設定}
repeat while A[i] < b do {左側から探索してA[i]>= bとなる要素をみつける} i:=i+1; while A[i] > b do {右側から探索してA[j]<= bとなる要素をみつける} j:=j-1; if i<=j then begin A[i]とA[j]の内容を交換する; i:=i+1; {探索の注目位置を進める} j:=j-1 end until i>j; {右からの探索と左からの探索がすれ違うまで探索する} sort(low, j); {左側の部分数列をソートする} sort(i, high) {右側の部分数列をソートする} end end;
>>474 function ToUpper(str: string): string; begin result:= UpperCase(str); end;
function ToUpper1stOnly(str: string): string; var tmp: string; begin str:=LowerCase(str); tmp:=str[1]; tmp:=UpperCase(tmp); str[1]:=tmp[1]; result:=str; end;
function ToLower(str: string): string; begin result:= LowerCase(str); end;
function First(const Source: PChar): PChar; begin Result:= AnsiStrUpper(Source); end;
function Second(const Source: PChar; var Dest: PChar; const Size: Integer): PChar; var C: Array[0..9] of Char; begin lstrcpy(C, Source); AnsiStrLower(C); if (C[0] in ['a'..'z']) then C[0]:= Chr(Ord(C[0]) - $20); Result:= lstrcpyn(Dest, C, Size); end;
function Third(const Source: PChar): PChar; begin Result:= AnsiStrLower(Source); end;
これで検索した文字数がわかるから 次にmeiboの全員を検索する for i:=1 to 30 do begin それから その検索名の一文字目と検索する対象の一文字目があってるかを調べて あってたらAにでも+1してあってなかったらスルー そうすれば全部あってる場合 検索の名前の数=対象の調べた文字 になるからそうなったやつを全部表示すれば対象の文字に例えば調べた文字が woだとしても word world の二つが引っかかるようになる 俺の提出したやつはそういうやり方だから全部は言えないなw
既にあるプログラムの指定箇所を改造して提出しなければなりません。 現状では、人数と名前のリストを入力すると、入力した名前が出力され また、更に名前を入力すると、その名前のリスト中のインデックスを出力します。  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ このプログラムの下線の部分を、アルファベット順で適切な位置に挿入するように修正したいのです。 ただし、予め入力されている名前のリストは、既にアルファベット順に並んでいて良いものとします。 例)a、b、e、と並んでいて d を入力すると b と e の間に挿入される。
procedure addlist(var Prevdata,Newdata : pointertimerecord); begin new(Newdata); Newdata^.next:=Prevdata^.next; Prevdata^.next:=Newdata; { enter data of record } write('Adding data -- Enter the name : ? '); readln(Newdata^.name); if Prevdata^.guard=false then begin Newdata^.guard:=false; end else begin Newdata^.guard:=true; Prevdata^.guard:=false; end; { if } end; { addlist }
begin new(head); last:=head; { enter data of record } write('Enter number of record : ? '); readln(count); for n:=1 to count do begin { enter data of record } write('No.',n:2,'--Enter the name : ? '); readln(last^.name); last^.guard:=false; { make next datum } new(last^.next); last:=last^.next; last^.guard:=true; end; { for } writeln;
{ addlist } last:=head; {----------------------------------------------------} write('Enter the position number of a new datum to be inserted (>=2) : ? '); readln(DataNO); if DataNO > (count+1) then begin DataNO:=count+1; end; for n:=1 to (DataNO-2) do begin last:=last^.next; end; { for i } prev:=last; addlist(prev,last); if DataNO<2 then begin head^.next:=last^.next; last^.next:=head; head:=last; end; { if } {----------------------------------------------------} { print record } last:=head; printdata(last); writeln('End of Job.'); end.
>514 function compare(p,q:pointertimerecord):boolean;var i:integer; function c:integer;begin c := Ord(p^.name[i])-Ord(q^.name[i]);end; begin i:=1;while(i<=20)and(c=0)do i:=i+1;compare:=c>0;end;
addlist(head,last);if compare(head, head^.next) then begin prev:=head^.next;head^.next:=prev^.next;prev^.next:=head;head:=prev; end else prev:=head;last:=prev^.next;while(not last^.next^.guard)and compare(last,last^.next) do begin prev^.next:=last^.next;prev:=prev^.next; last^.next:=prev^.next;prev^.next:=last;end;
(例) 基本データ (テキストデー タとした場合の例) 10-05 Shinomori r 3 10-22 Shinomori p 1 10-22 Mendori c 4 10-20 Shinomori r 1 added
支払いデータ(pay00510.txt) Octobar parttime job payment. r 620 per hour p 750 per hour i 900 per hour c 820 per hour --------------------------------------------- Mendori c 820 * 4 = 3280
total = 3280 --------------------------------------------- Shinomori r 620 * 4 = 2480 p 750 * 1 = 750
total = 3230 --------------------------------------------- End of payment data. (6) 上の機能(2〜5)をメニューで選んで自由な 順で、使えるようにプログラムを改造せよ。
(1):recordsample.pを参考に書き換えよう (2):これも同じくrecordsample.pの書き換え (3):for 2で入力した人数+1 to 追加する人数+2で入力した数 do あとは(2)と同様 (4):textwrite.pとtextread.pを良く見ながらやってみよう (5):俺も分からん。ここだけ誰か教えてください
program bout(input,output,J1JIIl);typellIlIJ=record lIlJJI:string(20);I11JI1:^llIlIJ;l1l1l1 : boolean;end; varJ1JIIl:text;ll1ll1:string(20);IlIlIJ,IJIlJJ:integer; IIlJ11: ^llIlIJ;beginnew(IIlJ11);ll1ll1:='NullPointer'; writeln('Nmber');readln(IJIlJJ);rewrite(J1JIIl,ll1ll1+'.txt'); for IlIlIJ:=1 to IJIlJJ do beginIIlJ11^.l1l1l1:=false; writeln('Name');readln(IIlJ11^.lIlJJI);writeln(J1JIIl,ll1ll1); new(IIlJ11^.I11JI1);IIlJ11:=IIlJ11^.I11JI1;IIlJ11^.l1l1l1:=true; end;end.
定義 type elementtype = real; pointertype = ^celltype; celltype = record element : elementtype; next : pointertype end; var header,q : pointertype; y : real;
絶対値に関して昇順に並ぶように線形リストにデータを挿入する
q := header; while ( ( q^.next <> nil ) and ( abs( y ) >= abs( q^.next^.element ) ) ) do q := q^.next; insert( y, q );
program evalExpr(input,output); const OP_ADD='+'; OP_SUB='-': OP_MULT='*'; OP_DIV='/'; type tree = ^treeCell; treeCell = record data : integer; op : (OP_ADD,OP_SUB,OP_MULT,OP_DIV); lefy,right : tree end
var t : tree; a : array of char b : integer; function calc(root: tree):integer; var x,y : integer; begin if root^.left=nil and root^.right=nil then calc:=root^.data else begin x:=calc(root^.left); y:=calc(root^.right); if root^.op=OP_ADD then calc:=x+y else if root^.op=OP_SUB then calc:=x-y else if root^.op=OP_MULT then calc:=x*y else calc:=x div y end end;
begin if (root^.left = nil) and (root^.right = nil) then calc := root^.data else begin lhs := calc(root^.left); rhs := calc(root^.right); if root^.op = OP_ADD then calc := lhs + rhs else if root^.op = OP_SUB then calc := lhs - rhs else if root^.op = OP_MULT then calc := lhs * rhs else if root^.op = OP_DIV then calc := lhs div rhs else begin writeln('Unexpected function. [', root^.op, ']'); end; end; end;
function maketree(a : string; p : integer) : tree;
var t, s : tree; b : integer; c : char; d : integer;
begin t := nil; d := 0;
for b := p to length(a) do begin c := a[b]; if((ord(c) >= ord('0')) and (ord(c) <= ord('9'))) then d := ord(c) - ord('0') + d * 10 else if((c = OP_ADD) or (c = OP_SUB) or (c = OP_MULT) or (c = OP_DIV)) then begin t := growth(c, d, t, maketree(a, b + 1)); d := 0; break; end else if((c = OP_SPC) or (c = OP_TAB)) then { skip } else begin writeln('Illegal function. [', c, ']'); break; end; end;
var Amount, Lot: Integer; S: string; begin Amount := 1000;
repeat Lot := Random(100); if Lot < 3 then Amount := Amount + 500 else if Lot < 10 then Amount := Amount + 300 else Amount := Amount - 100; WriteLn('所持金: ', Amount);
if Amount >= 2000 then begin WriteLn('凄い幸運の持ち主です'); Break; end else if Amount <= 0 then begin WriteLn('残念ながら所持金が無くなりました'); Break; end;
procedure move(var head : ptr); var p,q : ptr; begin if head<>nil then begin p:=head^.next; q:=head; while p<>nil do begin if p^.word=str then begin q^.next:=p^.next; p^.next:=head; head:=p; p:=q^.next; end else begin q:=p; p:=p^.next; end end end end;
習い始めの初心者ですみません ベクトルa=(a1,a2,a3,a4,a5)b=(b1,b2,b3,b4,b5) の内積a・bを求めよなんですが program sum(input,output); var a, b : array [1..5] of integer; var i,ip,j : integer; begin writeln('ベクトルa=?'); for i := 1 to 5 do read(a[i]) ; writeln('ベクトルb=?'); for j := 1 to 5 do read(b[j]) ; ip := 0; for i := 1 to 5 do for j := 1 to 5 do begin ip := ip + a[i] * b[j]; end; writeln('内積a・b =', ip:8:3 ); readln end. (35) pc dai.p dai.p: 6 for i := 1 to 5 do read(a[i]) ; e 18450----------^--- Deleted illegal character 7 writeln('ベクトルb=?'); e 18450-------------^--- Deleted illegal character すみませんどこが間違っているか教えてもらえませんか? 初心者で本当にすみません
まぁ書きたいのはこんなかんじだろ program twochpascal(input,output);type list=record name :packed array[1..20] of char; next:^list; judge:boolean; end;ptr = ^list; var meibohead,meibolast:ptr; p,i:integer; procedure deleteRecord(var head:ptr); var c:packed array[1..20] of char; i,k:integer; last:ptr; judge:boolean; count:integer; begincount:=0; writeln('入力された文字列を削除します');writeln('文字列を入力してください'); readln(c); for i:=1 to 20 dobegin if ((ord(c[i]) >= ord('A')) and (ord(c[i]) <= ord('Z')) or (ord(c[i]) >= ord('a')) and (ord(c[i]) <= ord('z'))) then begin count:=count+1; end; end;for i:=1 to count do begin if head^.name[i] = c[i] thenbegin k:=k+1; end; if k=count then begin judge:=true; end;if judge=true then begin last:=last^.next;head:=last; end; end; end; begin new(meibohead); meibolast:=meibohead; writeln('何人読み込みますか?'); readln(p); for i:=1 to p do begin meibolast^.judge:=false; writeln('登録する名前の入力'); readln(meibolast^.name); new(meibolast^.next); meibolast:=meibolast^.next; meibolast^.judge:=true; end; meibolast:=meibohead; deleteRecord(meibohead); meibolast:=meibohead; while not meibolast^.judge=true do begin writeln(meibolast^.name); meibolast:=meibolast^.next; end; end. つくりかけだが途中で嫌になった ポインターを使ってデータ(名前)を先に入力して次に削除したい文字列を入力して それを名前の中から一致すればその名前の一覧から一致した名前を削除したいのだろうとおもって 作っててた 例 aaa abc abb bac cccとかあったとしたら削除したい文字列abとすると aaa bac ccc だけをレコードに残す
>>883 今さらながら、smallest〜プログラムの一部 var x:integer; begin frompeg:=positionsmallest; x:=n mod 2; if x=1 then begin positionsmallest:=positionsmallest - 1; if positionsmallest < 1 then begin positionsmallest:=positionsmallest + 3 end; end; if x=0 then begin positionsmallest:=positionsmallest + 1; if positionsmallest > 3 then begin positionsmallest:=positionsmallest - 3; end; end; topeg:=positionsmallest; こんな感じであってますか? Pascalが出来る人チェックしてくれませんか?? あと、出来れば >>883 のPutDisksOnPeg1とPrintArrayの綺麗な?上手く見える??記述方法ってありませんか?
function swap(var n : array of integer; p, q : integer) : boolean; var t : integer; begin t := n[p]; n[p] := n[q]; n[q] := t; swap := true; end; function perm(var n : array of integer; s : integer) : boolean; var i, j, k : integer; begin i := s - 1; j := s - 1; while (i > 0) and (n[i - 1] >= n[i]) do begin i := i - 1; end; if i <= 0 then begin perm := false; end else begin k := i; while i < j do begin swap(n, i, j); i := i + 1; j := j - 1; end; i := k; while n[i] <= n[k - 1] do begin i := i + 1; end; swap(n, k - 1, i); perm := true; end; end; var n : array [0..9] of integer; i : integer; begin for i := 0 to 9 do begin n[i] := i + 1; end; repeat for i := 0 to 9 do begin write(n[i], ' '); end; writeln(''); until not perm(n, 10); end.