[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 11/30 08:14 / Filesize : 280 KB / Number-of Response : 889
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Pascalの宿題は俺にやらせろ!!Part2



1 名前:デフォルトの名無しさん mailto:sage [2006/01/12(木) 00:45:25 ]
教育用(?)プログラムPascalの宿題をやって頂くスレ

■丸投げOK
■全く分かってない阿呆も放置しないで優しく対応
■他言語はよそ逝け( ゚Д゚)ゴルァ
■DelphiもTurbo Pascalも完全対応

【本家】

www.borland.co.jp/delphi/

【前スレ】

pc8.2ch.net/test/read.cgi/tech/1089719714

【関連スレ】

くだすれDelphi(超初心者用)その15
pc5.2ch.net/test/read.cgi/tech/1087823906/l50

Pascal の初心者用の質問・相談所
pc5.2ch.net/test/read.cgi/tech/1009903617/l50

【Delphi初心者】今から始めるDelphi Part01
pc5.2ch.net/test/read.cgi/tech/1062422335/l50


82 名前:75 mailto:sage [2006/01/28(土) 16:10:47 ]
>>78
わかんないんならムリに Format を使う必要ないだろう
ただ単に文字列の体裁を整えているだけなので、これは IntToStr 等に置き換えられる。

writeln(IntToStr(i+1)+'人目の合計点は'+IntToStr(Sum1)+'点'); 

>>81
n人目なら i じゃなくて n だけどな
小数点以下を必要としないときは3で割る部分を

var
  heikin: Integer;  //整数型で充分
begin
  heikin := Sum1 div 3;

などとする。こうすると整数の割り算になるから小数点以下は捨てられる。
こういう総論的なことは教科書が手元にあるんだったら載ってるはずだから確認してみれ
つか試験とか大丈夫なのか?

83 名前:ささ ◆6KVcpBNXy. [2006/01/28(土) 16:38:49 ]
>>82返答ありがとうございます。できました!
大学秋試験は大丈夫ですよ〜ノートとかきっちりとってますので。。。
ありがとうございました。

84 名前:デフォルトの名無しさん mailto:sage [2006/01/28(土) 16:45:56 ]
>>82
> writeln(IntToStr(i+1)+'人目の合計点は'+IntToStr(Sum1)+'点');
何故
  writeln(i+1, '人目の合計点は', Sum1, '点');
と書かないの?

85 名前:75 mailto:sage [2006/01/28(土) 16:48:45 ]
>>84
えーだってこっちのほうが分かりいいと思って
引数の数が不定のFormatがわかんないっていうし

86 名前:デフォルトの名無しさん [2006/01/28(土) 23:15:49 ]
「フィボナッチ数列を生成するプログラムを、再帰呼び出しを使って作成したい。数列の長さを入力させ、その長さの結果を出力するように、プログラムしなさい。
フィボナッチ数列は、1 , 1 , 2 , 3 , 5 , 8 , 13 , 21 , … のような数列である。」
という問題です。
私は以下のようなプログラムを作りました。いちおう実行できるのですが、もっと簡潔な美しいプログラムが書けるのでしたら教えてくださると助かります。
よろしくお願いします。

program fibonacci(input,output);

var i,n : integer;

function fibonacci(n : integer):integer;

begin
if n>=3 then
begin
fibonacci:=fibonacci(n-1)+fibonacci(n-2)
end
else
begin
fibonacci:=1
end
end; { fibonacci }

begin
writeln('数列の長さを入力してください');
readln(n);
for i:=1 to n do
begin
write(fibonacci(i):3,', ')
end;
writeln;
end.

87 名前:86 [2006/01/28(土) 23:22:30 ]
連続ですいません。こちらもよろしくお願いします。
「2個の整数値の最大公約数を計算するアルゴリズムを使って、n個の整数値を入力し、それらの最大公約数を出力するプログラムを
再帰呼び出しの形式で作れ。ただし、入力は最大10個までとし、値を0読み込む前までの正の整数を入力値とする。」
という問題です。
再帰呼び出しを使わないプログラムは以下のように書けたのですが、これをどう変換すればいいのかがわからなくて、、、orz

program gcd(input,output);

var p,q,n : integer;

function gcd(a,b: integer ):integer;

var tmp : integer ;

begin
if a < b then
begin
tmp := b ;
b := a;
a := tmp;
end;
repeat
tmp := b;
b := a mod b ;
a := tmp ;
until b = 0 ;
gcd := a;
end { 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.

複文を変えた程度で、ほとんどいじる所がない。
誰でも同じように書ける言語つーのがPascalつーかhぃると先生の流儀。

90 名前:774RR mailto:sage [2006/01/28(土) 23:26:27 ]
>87
AとBとCとのGCDは
(AとBとのGCD)とCとのGCD、って発想かと。
末尾再帰になりそうだから、ループに展開するのが普通じゃないかな。
(書いてみてないのでぼそっと)



91 名前:デフォルトの名無しさん mailto:sage [2006/01/28(土) 23:35:25 ]
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.

93 名前:86 [2006/01/28(土) 23:55:01 ]
(上のつづき)としたら、実行結果が

1番目の値を入力
10
1番目の値を入力
20
1番目の値を入力
30
1番目の値を入力
40
1番目の値を入力
50
1番目の値を入力
60
1番目の値を入力
70
1番目の値を入力
80
1番目の値を入力
0
最大公約数は 80

・・・orz


94 名前:デフォルトの名無しさん mailto:age [2006/01/29(日) 05:29:24 ]
64の図形をウィンドウの端まで行くと、入射角=反射角で跳ね返る
っていうのを繰り返すように組むことってできますか?
例えばボタン1で図形が現われて、ボタン2で上記の動きを始めるみたいな・・・

95 名前:デフォルトの名無しさん [2006/01/29(日) 15:36:24 ]
3桁の整数を入力し、その英語読みを出力するようなプログラム
ってどう書くんですかまったくわかりませんorz

96 名前:デフォルトの名無しさん mailto:sage [2006/01/29(日) 21:49:13 ]
>>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.

97 名前:デフォルトの名無しさん mailto:sage [2006/01/29(日) 22:08:46 ]
>>95
とりあえず作ってみた。

www.uploda.org/uporg299109.lzh.html
pass:pascal

98 名前:デフォルトの名無しさん mailto:sage [2006/01/29(日) 22:25:09 ]
>>97
自己レス。

 TOneToNine = 0..9; ←型名と範囲がずれているけど、細かいことは気にしてはいけない
 TTwoTo99 = 0..99; ←型名と範囲がずれているのは、直すのを忘れたから

・DelphiとFreePascalでコンパイルできると思う。
・できたプログラムを実行すると、プログラムと同じディレクトリにある
 "hoeee.txt"を上書きしてしまう。ソースを読めばわかるだろうけど、一応注意ってことで。

99 名前:デフォルトの名無しさん [2006/01/29(日) 22:49:15 ]
>>95, >>96
ありがとうございます!!(感涙)
>>87のほうも是非お願いします!!

100 名前:デフォルトの名無しさん mailto:sage [2006/01/29(日) 22:53:06 ]
100



101 名前:デフォルトの名無しさん mailto:sage [2006/01/29(日) 23:03:23 ]
>>99
program g(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
answer:=gcd(answer,x);
i:=i+1
end;
until (i>10) or (x=0);
writeln('最大公約数は',answer:3);
readln;
end.


102 名前:デフォルトの名無しさん [2006/01/30(月) 00:26:02 ]
>>101
禿しくサンクスです!!
ありがたく拝見させていただいて学習します。

103 名前:デフォルトの名無しさん mailto:sage [2006/01/30(月) 20:38:06 ]
お、こんなとこで同級生ハケーン。
ガンガレ。

104 名前:デフォルトの名無しさん mailto:sage [2006/01/31(火) 14:08:43 ]
>PASCALの宿題は俺にやらせろ!!
やらせはせんよ!

105 名前:デフォルトの名無しさん [2006/02/05(日) 02:10:49 ]
入力された値を大きい順に並べて出力するプログラムのつもりで作りました。
0で入力停止のはずなのに止まらないし、なんか変な結果が出ます。
どこに問題があるのでしょうか??

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 }





106 名前:デフォルトの名無しさん [2006/02/05(日) 02:11:20 ]
105つづき

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.

107 名前:デフォルトの名無しさん mailto:sage [2006/02/05(日) 03:08:37 ]
>>105
procedure swap(var a, b: integer); (* var で書き換え可能にする *)
var
 tmp : integer;
begin
(* readln(a,b); これは必要ない *)
 if a<b then
  :
  :

108 名前:デフォルトの名無しさん mailto:sage [2006/02/05(日) 12:10:58 ]
5次元のベクトル A と B のデータを読み込み、それらの和ベクトル C とそれらの内積の値 D を求めて出力するプログラムを作れ。
ベクトルの要素のデータ型は、整数、実数のどちらかに統一しなさい。データはキーボードから読み込むものとする。また、 writeln を用いて、データの型、入力のさせ方をメッセージの形で記述せよ。


これお願いします。
なんか俺プログラミングの教材読んでもとりあえず理解できたけど問題出されると解けないんですが、これってもうそっち方面の考える力がないんですかねえ。
他の理系科目は普通にこなせるんですが、離散もできないし。
数こなせば出来るようになんの?

109 名前:デフォルトの名無しさん mailto:sage [2006/02/05(日) 18:36:30 ]
ベクトルと内積というのがよくわからん・・・
数学的問題は基本的に苦手だが
とりあえず5次元だから
Data:array[1..n][1..n][1..n][1..n][1..n] of real;
型ってことか・・・?(笑)
AとB読み込んでA+BをCに入れて内積の計算 |a|*|b|*cosθ をDに入れて出力するだけなら
Data:array[1..4] of real;
でいいと思う

writeln('Aの入力');
readln(Data[1]);
writen('Bの入力');
readln(Data[2]):
Data[3]:=Data[1]+Data[2];
Data[4]:=ABS(Data[1])*ABS(Data[2])*COS(θ);
writeln('和ベクトル',Data[3]);
writeln('内積の値',Data[4]);

みたいな感じかな・・?
数学得意じゃないのでいまいちわからんからあとはがんばれ


110 名前:デフォルトの名無しさん mailto:sage [2006/02/05(日) 20:19:47 ]
>>108
とりあえず作ってみた。
www.uploda.org/uporg304927.lzh.html

・入力のエラーチェックはしていない。
・ FiveVector1→A
 FiveVector2→B
 FiveVectorSum→C
 hoeee→D
という対応になってるんで、必要ならテキスト置換でも使って変換してくだちい。



111 名前:デフォルトの名無しさん mailto:sage [2006/02/05(日) 20:21:21 ]
111

112 名前:105 mailto:.. [2006/02/05(日) 21:19:38 ]
>>107
ありがとうございます。ご指摘の通り直したら動きました。
ところで
procedure swap(var a, b: integer); (* var で書き換え可能にする *)
とありますが、varをつけるとプログラム本文のところで別の文字を使って使える
ということですか?
なんか実引数とか仮引数とかがわかってないことを見せつける質問ですいませんorz

113 名前:デフォルトの名無しさん [2006/02/06(月) 02:31:16 ]
ハローパスカル始めることにしたから、よろしく。

114 名前:デフォルトの名無しさん mailto:sage [2006/02/06(月) 18:53:02 ]
>>112
program none(output);
var a,b:integer;
procedure add(var a,b:integer);
begin
a := a + 1;
b := a + 2;
end;

begin
a:=2;
b:=3;
add(a,b);
writeln(a,b:2);
end.

ってしたら最終的にaが3で、bが5になってる。
procedure add(a,b:integer);
だったらadd(a,b)が実行されても値は変化しない。つまりaが2で、bが3。

115 名前:デフォルトの名無しさん mailto:sage [2006/02/06(月) 19:09:04 ]
それにしても暇だ。
大学一年生にもできそうでちょっと難しいような宿題が投下されないだろうか。

116 名前:774RR mailto:sage [2006/02/06(月) 19:31:50 ]
>115
じゃあCASLのアセンブラと仮装機械w

117 名前:デフォルトの名無しさん mailto:sage [2006/02/06(月) 19:50:04 ]
d
最初見たとき言葉遣いとhoeeeにうけましたw

118 名前:115 mailto:sage [2006/02/06(月) 22:56:00 ]
>>116
調子こいてました(><

でも単純に機械語に翻訳するだけならなんとかなるのだろうか。
そこからプログラムを動かすってのが明らかに不可能です
本当にありがとうございました。

119 名前:デフォルトの名無しさん mailto:sage [2006/02/07(火) 02:24:54 ]
みんなのところもポインタで逆ポーランドの電卓つくるのがゴールかな?


120 名前:デフォルトの名無しさん [2006/02/07(火) 05:03:24 ]
>>119
は?バカ?



121 名前:デフォルトの名無しさん mailto:sage [2006/02/07(火) 05:33:32 ]
>>119
え?このスレってそんなレベル?

122 名前:デフォルトの名無しさん mailto:sage [2006/02/07(火) 08:50:04 ]
逆ポーランドってなんだ?

123 名前:デフォルトの名無しさん mailto:sage [2006/02/07(火) 09:51:23 ]
あっはっはっはw

124 名前:774RR mailto:sage [2006/02/07(火) 12:16:18 ]
逆ポーランドなつかすいな。
HPの電卓もかっこよかたな。

1 ENTER 2 + 3 * 4 - ....

125 名前:デフォルトの名無しさん [2006/02/07(火) 13:29:25 ]
ポインタをつかって逆ポーランドの電卓をつくってください。
識者の方どうかおねがいします(><)

126 名前:デフォルトの名無しさん mailto:sage [2006/02/07(火) 17:59:15 ]
電卓って?標準入力で入力していいのか?

127 名前:774RR mailto:sage [2006/02/07(火) 18:34:57 ]
手抜きで標準入力、文字列から数への変換も手抜きだ。
TP互換環境なら走るだろう。その壱

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;


128 名前:774RR mailto:sage [2006/02/07(火) 18:36:15 ]
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;

procedure calc(opr : char);
var r1, r2 : real;
begin
pop(r2);
pop(r1);
case opr of
'+' : r2 := r1 + r2;
'-' : r2 := r1 - r2;
'*' : r2 := r1 * r2;
'/' : r2 := r1 / r2
end;
push(r2)
end;


129 名前:774RR mailto:sage [2006/02/07(火) 18:38:30 ]
procedure disp;
begin
if stack<>nil then writeln('>>', stack^.data)
else writeln('Stack underrun.')
end;

procedure initstack;
begin
new(stack);
stack^.data := 0;
stack^.next := nil
end;

procedure allclear;
var s : pstack;
begin
while stack<>nil do begin
s := stack.next;
dispose(stack);
stack := s
end;
initstack
end;


130 名前:774RR mailto:sage [2006/02/07(火) 18:39:31 ]
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.




131 名前:774RR mailto:sage [2006/02/07(火) 18:43:26 ]
1
2
+
3
4
+
*
...
って感じに入力していくと逆ポな計算機になるよ。
スタックを線形リストで表現してるのが一応演習課題に則ってる。

本当なら、文字列→数の変換もスタックを使うんだが、めんどい。
そこまですると、電卓の+/-キー(符号反転キー)が二項演算子の-キーと
分かれている理由がよく理解できる。


132 名前:デフォルトの名無しさん mailto:sage [2006/02/07(火) 18:44:36 ]
procedure allclear;
var s : pstack;
begin
while stack<>nil do begin
s := stack.next;
dispose(stack);
stack := s
end;
initstack
end;


s := stack.next;
じゃなくて

s := stack^.next;
じゃない?

133 名前:774RR mailto:sage [2006/02/07(火) 18:45:30 ]
いけねえ、最初のconstは見なかった事にしてくれ。
前回投稿した消し残りだw

134 名前:774RR mailto:sage [2006/02/07(火) 18:47:19 ]
>132
その通りだけど、何でコンパイルできたんだろうw
拡張構文なのかコンパイラのバグかww

135 名前:デフォルトの名無しさん mailto:sage [2006/02/07(火) 22:56:20 ]
めちゃくちゃ初心者なのですが・・・。
問題聞いてもらってもよろしいでしょうか?

136 名前:135 mailto:sage [2006/02/07(火) 23:04:50 ]
一応問題を書かせて頂きます。

1 一方向リストの中のp番目とNEXT(p)番目の位置の要素を交換するプログラムを
手続きを用いて書け。
関数NEXTの定義:リストLで位置pの直後の位置を返す関数
とありますが、NEXTという関数はPascalに標準であるのでしょうか?
私の使っているCPad for free pascalだとないと言われるのですが・・。

137 名前:デフォルトの名無しさん mailto:sage [2006/02/07(火) 23:53:23 ]
無いんじゃない?

138 名前:デフォルトの名無しさん mailto:sage [2006/02/07(火) 23:57:04 ]
>>137 ですよね・・。
ということは、自分でNEXT関数を自分で定義しろということですか?

139 名前:デフォルトの名無しさん mailto:sage [2006/02/08(水) 00:02:10 ]
いや、俺もそんな詳しくないけど聞いたことはないよね。
一方向リストってどういう構造なん?
ポインタで繋いでるなら別段難しいことはないと思うんだけど。

140 名前:デフォルトの名無しさん mailto:sage [2006/02/08(水) 00:05:31 ]
>>139
ポインタを使ったリスト構造のことだと思います。



141 名前:デフォルトの名無しさん mailto:sage [2006/02/08(水) 00:16:52 ]
type
list = ^listcell
listcell = record
e : element;
point : listCell;
end;

var
p : list;

みたいな感じに定義してlistcell型の要素が繋がってるんなら、たとえばp^.pointが
pの要素の次の位置を指しているんじゃないの?
なんだかいまいち俺には分からないんだ。
問題を全部書いてくれれば分かるかもしれない。
あれで全部?

142 名前:デフォルトの名無しさん [2006/02/08(水) 00:24:02 ]
双方向じゃないやつだな<一方向

143 名前:デフォルトの名無しさん mailto:sage [2006/02/08(水) 00:27:39 ]
えっと、あれで全部です・・・。
e:elementってelementってどういう変数か知りませんが、要素って
名前とかじゃだめですかね?

type
list=^listcell
listcell=record
name:string[10];
id:integer;
pointer:list
end;

var init,current:list;
datname,datid:string[10];

こんな感じでもいいかな?

144 名前:デフォルトの名無しさん mailto:sage [2006/02/08(水) 00:28:28 ]
>>142
じゃあ、ポインタとはまた違うものだってことでしょうか?
まったく習っていないのでわかりません。

145 名前:デフォルトの名無しさん mailto:sage [2006/02/08(水) 00:29:32 ]
type
list=^listcell
listcell=record
name:string[10];
id:integer;
pointer:list
end;

var init,current:list;
datname:string[10];
datid:integer;

に訂正

146 名前:141 mailto:sage [2006/02/08(水) 00:40:57 ]
そっから

new(init);
new(current);
init^pointer := current;

みたいな感じで繋げていくんだよな?
そのあと値を入れていったとする。

>1 一方向リストの中のp番目とNEXT(p)番目の位置の要素を交換するプログラムを
>手続きを用いて書け。
>関数NEXTの定義:リストLで位置pの直後の位置を返す関数

ってことだけど、例えばp=1番目の直後の位置ってのはこの例でいくと
init^.pointerが指してるもののことじゃないの?
あと交換するだけなら要素の内容をレコード型変数かなにかに一旦格納して
入れ替えればいいんじゃないかと思うんだけど、どのあたりを俺は勘違いしているのか。

147 名前:デフォルトの名無しさん mailto:sage [2006/02/08(水) 00:48:50 ]
>>146
> そっから
> new(init);
> new(current);
> init^pointer := current;
> みたいな感じで繋げていくんだよな?
> そのあと値を入れていったとする。
この部分はわかります。

next関数に関してですが、p=1の場合と最後の時、それから途中の場合で
場合わけしなければいけないと思うのですが、
入れ替える位置というのが名前とか、idだとできると思うんですがこの問題の場合
p番目といわれるとわかりません・・・。


148 名前:デフォルトの名無しさん mailto:sage [2006/02/08(水) 00:51:39 ]
あ、while current^.pointer <> nil do begin
でまわしてるときに、
n:=n+1していけばいいのかな?

149 名前:141 mailto:sage [2006/02/08(水) 00:59:43 ]
n := n + 1;
でいいだろうね。
それとnext関数を最初と最後で場合わけしないといけないってことだけど、
最初と最後になにも入ってないダミーセルを配置しておけば例外処理を
行わなくてもできるんじゃない?
つまり実際に値を格納しておくものよりも二つぶん多めにnewしとく。

150 名前:デフォルトの名無しさん mailto:sage [2006/02/08(水) 01:19:17 ]
>>149
ダミーセルをつくるのはたぶんだめっていわれます。



151 名前:デフォルトの名無しさん mailto:sage [2006/02/08(水) 01:57:34 ]
とりあえず、リストの作成と書き出しをやってみましたが、終了条件を'end'にしているのに
endで終わらない・・・。

var init,current:list;
datname:string[10];
datid:integer;

begin
new(init);
current:=init;
write('名前を入力してください'); readln(datname);
write('IDを入力してください'); readln(datid);
while datname <> 'end' do begin
current^.name:=datname;
current^.id:=datid;
new(current^.pointer);
current:=current^.pointer;
write('名前を入力してください: '); readln(datname);
write('IDを入力してください: '); readln(datid);
end;
current^.pointer:=nil;
{リストの書き出し}
current:=init;
while current^.pointer <> nil do begin
write(current^.name,' ',current^.id);
current:=current^.pointer
end;
writeln
end.

152 名前:デフォルトの名無しさん mailto:sage [2006/02/08(水) 02:11:37 ]
なんかいろいろセミコロンが抜けてるように見えるんだけど

153 名前:デフォルトの名無しさん mailto:sage [2006/02/08(水) 02:12:25 ]
直りました。


var init,current:list;
datname:string[20];
datid:integer;

begin
new(init);
current:=init;
write('名前を入力してください: '); readln(datname);
current^.name:=datname;
while datname <> 'end' do begin
write('IDを入力してください: '); readln(datid);
current^.id:=datid;
new(current^.pointer);
current:=current^.pointer;
write('名前を入力してください: '); readln(datname);
current^.name:=datname
end;
current^.pointer:=nil;
{リストの書き出し}
current:=init;
while current^.pointer <> nil do begin
write(current^.name,' ',current^.id,' ');
current:=current^.pointer
end;
writeln
end.

154 名前:デフォルトの名無しさん mailto:sage [2006/02/08(水) 02:14:15 ]
問題はここからですね。入れ替える位置pを入力して、p番目の要素とp番目の次の
要素を入れ替えなさい。

155 名前:デフォルトの名無しさん mailto:sage [2006/02/08(水) 12:31:22 ]
できない・・・。currentの前を指すpreviousを用意して
currentとpreviousのpointerを入れ替えればできるか思ったのですが
無限ループになってしまいます。
削除と挿入ならできるのに・・。

156 名前:774RR mailto:sage [2006/02/08(水) 12:32:36 ]
この手の課題でリストの頭と尻尾にダミーをいれておいて、
必ず3個以上の要素が存在するようにするのは
極普通のプログラミングテクニックで、やらないほうが変だと思うが…

「次」を示すフィールドがnextだとするね。
p-1番目の要素を見つける所から始める。
これはwhile文で頭から律儀に数えるしかない。

その上で、

ppred ← p-1番目の要素を指すポインタ
pp:=ppred^.next ← p番目の要素を指すポインタ
psucc:=pp^.next ← p+1番目の要素を指すポインタ

をまずやっとく。

pwork := psucc^.next;
ppred^.next := psucc;
psucc^.next := pp;
pp^.next := pwork;

これでppred->psucc->pp->元のpsuccの次って順序になった。
psucc, pp, ppred, pworkは全部局所変数でおけ。

>146
record型のデータの部分がでかい場合、コピするのにマシンサイクルを
使い過ぎる。簡単に張り替えられるのがリストの利点よん。

157 名前:デフォルトの名無しさん mailto:sage [2006/02/08(水) 19:46:04 ]
ありがとうございます。
currentとpreviousとtempのほかにもうひとつ必要だったのですか。
そうすると、メインプログラムも変えないとだめってことでしょうか?

158 名前:デフォルトの名無しさん mailto:sage [2006/02/08(水) 19:54:31 ]
メイン変えなくてもできますね。とりあえず、できました。次を示すフィールドをpointerとして
ppred・・previous
pp・・current
psucc・・next
pwork・・tempになってます。

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;

159 名前:774RR mailto:sage [2006/02/08(水) 20:44:27 ]
手続きを仕えってなら、こんなのはどうだ?
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;


160 名前:774RR mailto:sage [2006/02/08(水) 20:45:13 ]
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;




161 名前:774RR mailto:sage [2006/02/08(水) 20:45:49 ]
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;

procedure initlist;
begin
new(top);
new(tail);
top^.next := tail;
tail^.next := nil
end;



162 名前:774RR mailto:sage [2006/02/08(水) 20:46:44 ]
procedure disposelist;
var p : plist;
begin
p := top;
while top<>nil do begin
p := top^.next;
dispose(top);
top := p
end
end;


163 名前:774RR mailto:sage [2006/02/08(水) 20:47:23 ]
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.


164 名前:デフォルトの名無しさん mailto:sage [2006/02/08(水) 20:53:39 ]
読まずにすまそ。壱から書く方がらくなんで…
粘着もすまそでつ。
最近もの書きばっかやっているんで
たまにプログラムを書かないと脳が腐る ●rz

165 名前:774RR mailto:sage [2006/02/08(水) 20:54:35 ]
↑いけねえハン忘れた orz
ともかく帰依まつ

166 名前:デフォルトの名無しさん mailto:sage [2006/02/08(水) 20:57:01 ]
ありがとうございます。
この問題はもう解けました。
次の問題は、カーソルによるリスト構造の実現で、INSERT、DELETE,配列SPACEの全
セルを使用可能スペースリストにつなぐinitializeの手続きにエラーチェックを加え、メインプログラム
にて確認しなさい。という問題なのですが、これからそれぞれの手続きを書きますのでよろしく
お願いします。
参考:ttp://www.elect.chuo-u.ac.jp/automount/tsuki/Tsuki-lab/tsuki/Chap-2/2.4.pdf
これはC?で書いてあります。

167 名前:デフォルトの名無しさん mailto:sage [2006/02/08(水) 21:01:46 ]
まず、基本的な型宣言から
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;


168 名前:デフォルトの名無しさん mailto:sage [2006/02/08(水) 21:11:53 ]
手続き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}

169 名前:デフォルトの名無しさん mailto:sage [2006/02/09(木) 16:05:59 ]
誰か識者の方、166-168の問題解いてもらえませんか?
よろしくお願いします。

170 名前:デフォルトの名無しさん mailto:sage [2006/02/10(金) 12:46:42 ]
与えられた自然数 n(n>=3) に対し、正n角形とその対角線を表示するプログラムを作れ。
ただし、Readlnでnの値を読み込んでから作図するようにせよ。

TopPascalのこのような課題が出ました。
どうか皆様の力をお貸しください。



171 名前:デフォルトの名無しさん [2006/02/16(木) 09:43:19 ]
170に答えてください。お願いします。

172 名前:デフォルトの名無しさん [2006/02/16(木) 10:08:26 ]
>>171
お前は1週間何やってたんだと小一時間説教してやる。

173 名前:デフォルトの名無しさん mailto:sage [2006/02/16(木) 11:18:23 ]
そろそろ説教も終わった頃かね
TopPascalもコマンドラインで描画の方法も知らんけど、
Delphi で n 角形の各頂点の位置なら

procedure GetApex(ApexCount: Integer;// 頂点の数
 Radius: Integer;                              // 外接円の半径
 Center: TPoint;                              // 外接円の中心
 var Apexes: array of TPoint);            // 結果
var
 i: Integer;
 CurAngle: Double;
begin
 // 初期値
 CurAngle   := 0;

 for i := 0 to ApexCount - 1 do
 begin
  Apexes[i].X := Center.X + Trunc(Radius * Cos(CurAngle));
  Apexes[i].Y := Center.Y + Trunc(Radius * Sin(CurAngle));
  CurAngle    := CurAngle + 2 * PI / ApexCount;
 end;
end;

てけとーに真似してやってみれ

174 名前:デフォルトの名無しさん [2006/02/16(木) 20:41:13 ]
ありがたいのですが、Delpiってのはわからないんで…。
できればどなたかコピペしてランすればできるのを提供していただけないでしょうか?

175 名前:デフォルトの名無しさん [2006/02/16(木) 21:26:19 ]
プギャ━━━m9。゚゚(゚^Д^≡^Д^゚)゚゚。9m━━━━!!!!

176 名前:デフォルトの名無しさん mailto:sage [2006/02/17(金) 00:14:19 ]
デルピ

177 名前:デフォルトの名無しさん mailto:sage [2006/02/17(金) 02:40:34 ]
もうデルピーは居ないんだよ・・・

178 名前:デフォルトの名無しさん mailto:sage [2006/02/17(金) 05:12:41 ]
次はデルピーって言うのか出るのが楽しみだ(ノ´∀`*)

179 名前:デフォルトの名無しさん [2006/02/20(月) 01:59:19 ]
「■全く分かってない阿呆も放置しないで優しく対応」という
ことに甘えまして、宜しくお願いいたします。

文字列型(あくまで)で、00〜ffに対し、
最終integer型で0〜255に変換したいのですが・・。
たとえば、

var
a:string;
b:integer;
begin
a:='2f';




write(b);
end.

ここでのCRT出力を
「47」
としたい訳です。
どのような手法で可能でしょうか?ご教示下さい。

180 名前:デフォルトの名無しさん mailto:sage [2006/02/20(月) 08:45:30 ]
0-fの文字を0-15の整数に変換する関数hogeを書く。
hogeを使って一文字づつ変換して16倍するループを書く。



181 名前:デフォルトの名無しさん [2006/02/20(月) 19:40:25 ]
>>180
有り難うございます、一寸やってみます。

182 名前:デフォルトの名無しさん mailto:sage [2006/02/22(水) 01:09:37 ]
こんなのどうですか。

function HexToInt(const S: string): Integer;
const
 Table: array['0'..'F'] of Integer =
  (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1,
  -1, 10, 11, 12, 13, 14, 15);
var
 I: Integer;
begin
 Result := 0;
 for I := 1 to Length(S) do
  Result := Result shl 4 + Table[UpCase(S[I])];
end;






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<280KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef