Pascalの宿題は俺にやらせろ!!Part2at TECH
Pascalの宿題は俺にやらせろ!!Part2 - 暇つぶし2ch250:デフォルトの名無しさん
06/05/04 21:24:02
どうもありがとうございました。そそっかしくてすいません…

251:デフォルトの名無しさん
06/05/11 19:39:47
2個の1次方程式が入力されたとき、その和を 出力するプログラムを作成しなさい。ただし、変数名はアルファベット1文字とし、 その係数値は整数1文字とせよ。

たとえば、2 x - 5 y を1文字ずつ入力(改行で区切る)し、ピリオド '.'が入力 されたならば、次の式、 - 9 y + 2 z を同じように入力する。プログラムはそれら の和、2 x - 14 y + 2 z を出力する。



252:モグラ介
06/05/11 19:49:23
すべてのパスワードを解読するプログラムがあったらすごい・・・
ありえないか。

253:デフォルトの名無しさん
06/05/11 20:03:30
すべてのって言うのが引っかかりますが、
総当りでやればいいんじゃないのか?

254:デフォルトの名無しさん
06/05/11 20:07:22
総当りならどんな難解なパスワードも必ず解析できるね。






何百年とか掛かるかもしれないけど。

255:デフォルトの名無しさん
06/05/11 21:00:59
まともなシステムなら連続で複数回間違えた時点でパスワードが無効になるような対策がなされているから無理

256:デフォルトの名無しさん
06/05/12 00:39:03
しばらくしたら正規のユーザーが管理者に申告して復活するでしょ

257:デフォルトの名無しさん
06/05/12 21:57:42
>>251 の答えまーだ?

258:デフォルトの名無しさん
06/05/13 00:35:23
キーボードからいくつもの「文字」を入力した時、各文字が何回入力されたかを結果として返すプログラムを、入力データの記憶にリスト構造を利用して作れ。なお、入力は1文字ずつ return で区切って入力し、その終了は '.' (ピリオド) で示すものとする。


と、


課題4 - 1を参考にして、2個の1次方程式が入力されたとき、その和を出力するプログラムを作成しなさい。ただし、変数名はアルファベット1文字とし、その係数値は整数1文字とせよ。

たとえば、2 x - 5 y を1文字ずつ入力(改行で区切る)し、ピリオド '.'が入力されたならば、次の式、 - 9 y + 2 z を同じように入力する。プログラムはそれらの和、2 x - 14 y + 2 z を出力する。


2つの問題お願いします。

259:デフォルトの名無しさん
06/05/13 09:29:22
>>251
なんか良く判らんけど 適当に

{構造体の定義}
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;


260:デフォルトの名無しさん
06/05/13 09:31:29
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;

261:デフォルトの名無しさん
06/05/13 09:33:13
なんか、改行が多すぎますが厄介だなあ
で、呼び出し部

var s:string;
begin
root:=nil;
readln(s);
func(s);
end;

素直に、ヒープか配列使った方がいいかもね

262:デフォルトの名無しさん
06/05/13 19:27:11
このコード提出した奴からは、動作説明させるからな

263:デフォルトの名無しさん
06/05/13 22:59:34
偽者はだまれ!自分独り占めにするな!
本物ならここに書き込まず裏で減点しているわ!

264:デフォルトの名無しさん
06/05/13 23:22:26
でも、単にメモリ確保の為にわざわざ再帰してるようなコードは、ちょっと目立つぞ

265:デフォルトの名無しさん
06/05/14 01:01:30
だれかエラトステネス篩について、具体例を交えながら分かりやすく解説してくれませんか?
もう訳が分かりません…

266:ミ,,゚Д゚ミノ ◆A6VzDeLphI
06/05/14 01:24:54
エラトステネスの篩の概念は、次のようになります。
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
と続けていくとチェックされていない所に
〇がつき、素数列が求まるという手法です。

267:ミ,,゚Д゚ミノ ◆A6VzDeLphI
06/05/14 01:29:05
具体例を交えながらわかりやすく解説するほど
労力をかけたくないから、適当に勉強汁

URLリンク(www.google.com)

上記例では、1~13の箱を用意するために
Booleanの配列を定義して
1~13全部をTrueにしてから
4,6,8,10,12の箱をFalseにして、
6,9,12の箱をFalseにして、
という処理をする方法よ。


268:265
06/05/14 13:48:56
どうもありがとうございました。
プログラムで読んだ時、なにがtrueやfalseなのかがよく分からなかったんですが、
やっとなんとかわかりました。ありがとうございました。

269:269
06/05/20 16:27:59
キーボードからいくつもの「文字」を入力した時、 各文字が何回入力されたかを結果として返すプログラムを、 入力データの記憶に2分木を利用して作れ。 なお、入力の終了は '.' (ピリオド) で示すものとし、 結果はアルファベット順に出力するものとする。



program bi( input , output );

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 }

270:269
06/05/20 16:28:56
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.

271:269
06/05/20 16:35:39
キーボードから「整数」を読込み、 入力データを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 }

272:269
06/05/20 16:36:48
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.
としたのですがどちらも出力をどうすればいいか分かりません。出力の他にも変なところがあれば指摘してくれると嬉しいです。

273:デフォルトの名無しさん
06/05/21 18:28:02
とりあえず上はそれだと白丸のところが出力されないはず
   ●
   /\
  ● ●
 /|  |\


○ ○ ●

火曜提出でしょ?
もう少し悩んでみてもいいと思われ。

あと線形リストや二分木の先頭だけdisposeすると、
2番目以降は解放じゃなくて参照不可になるんじゃなかったっけ?

274:273
06/05/21 18:28:57
ウホッ、ずれまくったorz

275:デフォルトの名無しさん
06/05/23 18:55:46
キーボードから「英文」を読込み、空白(スペース)を英単語の 区切りと見做して、英単語辞書を整順リストの形式で作成するプログラム を作りなさい。

なお、入力の終了は '.' (ピリオド) で示すものとし、 同じ英単語が入力される場合は辞書に登録してはいけない。

a. 英文はアルファベット小文字のみの単語、スペース、ピリオドだけで 作られている場合を、まず考えよ。各単語の文字数は20文字以内とせよ。

b. 次に、大文字が含まれる場合には、その文字を小文字に変換するよう に拡張せよ。

c. 最後に、数字、疑問符?、感嘆符!、クオート’、ダブルクオート"、 ハイフン-、コロン:、セミコロン;などの特殊文字が含まれている文 などを処理できれば完全である。

276:デフォルトの名無しさん
06/05/23 18:56:56
英単語辞書の問題において、 整順リストを2分木表現とするプログラムを作成せよ。

ポーランド記法で入力した四則演算式を2分木で表現し、 演算式の係数値を入力したときに、その計算結果を出力する プログラムを作れ。但し、演算式はアルファベット一文字の 変数と四則演算子のみで表現されている。

a.演算式が定数は含まない場合を考えよ。

b.整数の定数を含む場合に拡張せよ。

277:デフォルトの名無しさん
06/05/24 02:38:31
課題丸投げ早すぎw


278:デフォルトの名無しさん
06/05/24 22:20:26
>>277
そんな突っ込みより
答えキボンヌ。

279:デフォルトの名無しさん
06/05/25 20:51:54
電通大C科乙w

280:デフォルトの名無しさん
06/05/25 22:08:22
>>279
去年につづきまたあそこか
馬鹿しかいないのか?

281:デフォルトの名無しさん
06/05/25 22:36:28
馬鹿が教えてるからしょうがない。

282:デフォルトの名無しさん
06/05/25 22:46:23
>>281
言えてる…。

283:デフォルトの名無しさん
06/05/26 02:25:45
>>278
ヒント

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.

2単語入力のみ対応

284:デフォルトの名無しさん
06/05/26 03:29:15
電通大生なんだが・・評判落とすような事はやめてくれ!
少しは考えろよ!!
言っておくが、これくらい普通に出来ないと後々の課題なんて出来ないぞ!
その時はまた写すのか?
お前それでいいのか?

285:デフォルトの名無しさん
06/05/26 03:39:15
>>284

       、--‐冖'⌒ ̄ ̄`ー-、
     /⌒`         三ミヽー-ヘ,_
   __,{ ;;,,             ミミ   i ´Z,
   ゝ   ''〃//,,,      ,,..`ミミ、_ノリ}j; f彡
  _)        〃///, ,;彡'rffッ、ィ彡'ノ从iノ彡
  >';;,,       ノ丿川j !川|;  :.`7ラ公 '>了
 _く彡川f゙ノ'ノノ ノ_ノノノイシノ| }.: '〈八ミ、、;.)
  ヽ.:.:.:.:.:.;=、彡/‐-ニ''_ー<、{_,ノ -一ヾ`~;.;.;)
  く .:.:.:.:.:!ハ.Yイ  ぇ'无テ,`ヽ}}}ィt于 `|ィ"~
   ):.:.:.:.:|.Y }: :!    `二´/' ; |丶ニ  ノノ
    ) :.: ト、リ: :!ヾ:、   丶 ; | ゙  イ:}    逆に考えるんだ
   { .:.: l {: : }  `    ,.__(__,}   /ノ
    ヽ !  `'゙!       ,.,,.`三'゙、,_  /´   「電通大の課題が 2ch ねらーのヒマ潰しになっている」と
    ,/´{  ミ l    /゙,:-…-~、 ) |
  ,r{   \ ミ  \   `' '≡≡' " ノ        考えるんだ
__ノ  ヽ   \  ヽ\    彡  ,イ_
      \   \ ヽ 丶.     ノ!|ヽ`ヽ、
         \   \ヽ `¨¨¨¨´/ |l ト、 `'ー-、__
            \  `'ー-、  // /:.:.}       `'ー、_
          `、\   /⌒ヽ  /!:.:.|
          `、 \ /ヽLf___ハ/  {
              ′ / ! ヽ

286:デフォルトの名無しさん
06/05/26 08:48:45
>>283

b a g i n

287:デフォルトの名無しさん
06/05/26 08:50:54
>>283
ほとんどヒントになってないし。
リスト構造も木構造も実装されてないし。
読み込み部分にしたって、
空白区切りをまったく無視してくれちゃってるし。
まったく、なにやってるんだか。

288:デフォルトの名無しさん
06/05/26 20:00:58
>>287
丸写しするお馬鹿さんには関係ないこと。成績表を見て泣くだけ。

289:デフォルトの名無しさん
06/05/27 10:12:38
URLリンク(up.nm78.com)

290:デフォルトの名無しさん
06/05/28 21:18:58
答えまーだ?

291:デフォルトの名無しさん
06/06/02 02:07:04
やっと落ち着いたか

292:デフォルトの名無しさん
06/06/04 09:06:23

Javaなどの新しい言語がある中で、電通大が未だにPascalを使ってプログラミングの講義をしているのは一種の男気の現れですか?

293:デフォルトの名無しさん
06/06/04 09:31:21
教えるヒトがそれ以外の言語を知らないので仕方がないのです。

294:デフォルトの名無しさん
06/06/04 17:23:42
今まさにPascal習ってる電通大生ですよっと
Pascal習う理由として、
①複数の言語を学んだほうが体系的に(で言葉あってるのか?)文法を理解できる。
②Pascalは教育用言語としてはふさわしい
とか言ってた気がする。

ただ、俺は大学入って初めてプログラミングに触れるようになったため、
教授の考えがきちんと伝わっていないかも知れない。
要は公式見解ではないということ

295:デフォルトの名無しさん
06/06/04 17:24:00
>>293

男気の正反対ですね。

296:デフォルトの名無しさん
06/06/04 17:25:52

今プログラミング教育用として主流になってる言語って何ですかね?

297:デフォルトの名無しさん
06/06/04 19:11:57
授業で使われている数はc/c++とJavaが圧倒的でしょう。

298:デフォルトの名無しさん
06/06/06 08:27:39

Javaはまだいいとして、C/C++って教育用途には向いてるんでしょうかね?

299:デフォルトの名無しさん
06/06/06 10:22:47

Javaが向いてる?ご冗談を

JavaよりC/C++の方が向いてるに決まってるじゃないか


300:デフォルトの名無しさん
06/06/06 18:17:03
C++がプログラミング入門用として最適の言語。










とかのたまうメルマガ鵜呑みにして強引にC++から入った俺が来ましたよ。

301:デフォルトの名無しさん
06/06/08 08:24:55
Cは良いけどC++は教育用としてはどうかとおもう

302:デフォルトの名無しさん
06/06/10 23:49:37
C++の方が明らかにCより使いやすいし。
教育用としても
オブジェクト指向のC++の方がいいに決まってるし。

303:デフォルトの名無しさん
06/06/11 05:55:38

PerlほどじゃないけどC++のオブジェクト指向もひどいぞ

「オブジェクト指向の教育」という観点からは薦められない


304:774RR
06/06/12 19:47:05
本物のプログラマはPascalを使わない。真の漢は黙ってFORTRAN77。

305:デフォルトの名無しさん
06/06/12 20:57:38
来年から電通はCになるらしいけどな
まじで頭おかしいだろあそこ

306:デフォルトの名無しさん
06/06/13 07:31:40
Rubyにすればいいのに

307:デフォルトの名無しさん
06/06/13 17:53:09
HSPにすればいいのに

308:デフォルトの名無しさん
06/06/15 12:12:15
pascalの文法には、変数名とか関数名の非終端記号があるらしんだけど
これはすべて名前(識別子)であって文法を簡単にするものであると。

原始プログラム中のその名前をみただけではどの名前であるか
判別できない。これの解決策はなにですか?

309:デフォルトの名無しさん
06/06/15 13:35:24
俺のESPを試す時がきたようだ。

例えば次のようなソースがあるとします。
if (0 < hoge) then ...
このhogeが変数なのか関数なのかはここから判別する事はできないと思います。
コンパイラはどうやっているんでしょうか?

こんな感じか?

310:デフォルトの名無しさん
06/06/15 18:01:22
ネストしたスコープの話なのかな?

311:デフォルトの名無しさん
06/06/16 00:50:41
pascalは事前に変数も関数も宣言する必要があるので問題無い。


312:デフォルトの名無しさん
06/06/26 15:11:34
モンテカルロ法を用いて1/3を求めよ。
そのときモンテカルロ法を試行する回数を、プログラム実行時に選択できるようにせよ。

313:デフォルトの名無しさん
06/06/26 18:50:02
いやです。

314:デフォルトの名無しさん
06/06/26 19:28:36
やってやらんこともないが

なぜ 1/3 なんだ?


315:デフォルトの名無しさん
06/06/27 14:23:43
パスカルの問題でわからないので教えて下さい。
問1
任意の人数に対してBMI(肥満度を判定する指標)を計算し、その平均値を出力させる。ここで,BMIとは
体重/身長/身長
で定義されるため,体重および身長を人数分だけ標準入力せよ。ここで,人数の最大は10名としてよい。なお,関数あるいは手続きを用いること。

問2
10名分のクラスの学生名前(アルファベット)を配列に保存せよ。また、最後にそれを標準出力せよ。
また、ファイル出力の場合も考えよ。
*stringを使いなさい。

316:デフォルトの名無しさん
06/06/27 14:25:35
パスカルの問題でわからないので教えて下さい。
問1
任意の人数に対してBMI(肥満度を判定する指標)を計算し、その平均値を出力させる。ここで,BMIとは
体重/身長/身長
で定義されるため,体重および身長を人数分だけ標準入力せよ。ここで,人数の最大は10名としてよい。なお,関数あるいは手続きを用いること。

問2
10名分のクラスの学生名前(アルファベット)を配列に保存せよ。また、最後にそれを標準出力せよ。
また、ファイル出力の場合も考えよ。
*stringを使いなさい。


317:デフォルトの名無しさん
06/06/27 23:08:41
このスレまだあったのか

318:デフォルトの名無しさん
06/07/01 08:42:13
リスト構造ってむずい部類?

319:デフォルトの名無しさん
06/07/01 17:20:31
>>318
リストによっては。

単純な線形ならそんなに難しくないけど、双方向になると少し難しくなって、
ツリー構造とかになると結構難しくなって。バランス木くらいになると相当
難しくなる。


320:デフォルトの名無しさん
06/07/02 01:05:23
どうむずかしいの

321:319
06/07/02 10:29:29
>>320
自分で実装してみれば分かる。

322:デフォルトの名無しさん
06/07/03 02:05:51
なんで?

323:デフォルトの名無しさん
06/07/04 01:23:08
Delphiの課題なのですが

乱数を生成して 正方形 と 円(四分円)の面積を比較することにより,
    円周率 π の近似値を求める方法がある。
    以下は,この方法に関する問いである。

(1) 乱数によって定まる点の分布の状況を PaintBox 上に図示せよ。

(2) 円周率 π の近似値を計算せよ。

という問題が出されました
取っ掛かりからわからないという初心者ぶりです
ご教授願えませんでしょうか


324:デフォルトの名無しさん
06/07/04 01:38:04
> 乱数を生成して 正方形 と 円(四分円)の面積を比較することにより,
> 円周率 π の近似値を求める方法がある。

この方法については理解してる?

325:デフォルトの名無しさん
06/07/04 01:42:41
ランダムに点を打ってくんじゃなかったか?

まずアルゴリズムをはっきりさせること。

326:デフォルトの名無しさん
06/07/04 01:49:15
rを半径とすると、
円の面積は Pi*r*r
正方形の面積 r*r
円の公式 x*x + y*y <= r*4

を使うんじゃないの?


327:デフォルトの名無しさん
06/07/04 01:52:04
1辺の長さがRの正方形とそれに内接する四分円とを描画する。
正方形内にランダムに点を打ち、打った点の総数と、
そのうち四分円の中に入った点の数をそれぞれカウントする。
あとはその比率から円周率を近似するくらいはわかるだろう。

328:デフォルトの名無しさん
06/07/04 17:21:07
もんてかるろ法だわな

329:デフォルトの名無しさん
06/07/04 23:09:09
円の公式は x*x + y*y <= r*r
でした。

330:323
06/07/05 00:34:12
ご教授レスありがとうございました。

自宅にDelphiがないのですが(学校にある)、
取り敢えずモンテカルロ法について調べてみました。

結果イメージとしては理解できたのですが
点を打つ方法、点を数える方法がともにわかりませんでした。
(乱数関係から検索したのですが)

何もしてないと言われても仕方ない有様ですが、
どうかその二つの作業の方法だけでも教えていただけませんでしょうか。




331:デフォルトの名無しさん
06/07/05 00:37:35
>>330
URLリンク(www.wikihouse.com)

332:デフォルトの名無しさん
06/07/05 01:37:50
>>330
>>331にほとんど答えが載っているが
せっかく文章練ったので。

URLリンク(sylphys.ddo.jp)

乱数 x, y を別々に発生させ、>>329の式で
4半円(図の白い部分)の中にあるか判定する。

4半円の中に入った点の数・外になった点の数をそれぞれ
変数にもって、判定結果に従ってカウントアップ。
ある程度の数の点を計算したら、点の数の比を計算すれば、面積比が出てくる。

後は、既知の円の面積の公式 4πr^2 からπを求める。

PaintBoxは自分でやってください。

333:デフォルトの名無しさん
06/07/05 07:30:25
自分で考えないと馬鹿になるぉ

334:デフォルトの名無しさん
06/07/05 21:57:17
>既知の円の面積の公式

これがクセモノ

トートロジー


335:デフォルトの名無しさん
06/07/05 22:44:29
円の面積の公式も分からないとはいくらゆとり世代でも酷すぎる

336:デフォルトの名無しさん
06/07/05 23:01:56
>>335
というか、「Piを求めるのにPiを使った円の面積の公式を使う」
というのは問題じゃないのかと>>334は言いたいんだろう。

337:デフォルトの名無しさん
06/07/05 23:05:04
>>329

338:332
06/07/05 23:20:13
いや、式がおかしいです。
モロゆとり世代ですんません

339:デフォルトの名無しさん
06/07/05 23:36:31
4πr^2って球の話なの^^

340:デフォルトの名無しさん
06/07/06 18:01:24
>>339

>>332 のは 1/4 だから
点の数の比を計算するのに
4πr^2 になるってだけの話だと思う


341:323
06/07/06 21:05:51
おかげさまで課題できました。
皆さんお世話になりました。

342:デフォルトの名無しさん
06/07/06 22:07:28
パスカルの問題でわからないのですが、教えてください。

・学籍番号と点をデータとして入力し、これを得点の高い順に並べ替え、
 順位をつけて表示する。

高い順に並べ替えるまではできるのですが、それを点じゃなくて学籍番号
で表示することができません。

343:デフォルトの名無しさん
06/07/06 22:14:41
配列2個用意して、両方並べ替える。
Delphi的に正しいのは record 使う。

344:デフォルトの名無しさん
06/07/06 22:15:12
学籍番号と得点を組にして持って、並べ替えるときに一緒に動かすんだ。

345:デフォルトの名無しさん
06/07/06 22:15:53
ワーォ

346:デフォルトの名無しさん
06/07/06 22:36:50
すいません。よくわかりません。

347:デフォルトの名無しさん
06/07/06 22:37:41
とりあえずコード書いて晒してみれ。

348:デフォルトの名無しさん
06/07/07 17:20:06
これであと学籍番号を一緒に表示したいにですが、どうすればいいですか?
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.

349:デフォルトの名無しさん
06/07/07 19:50:11
ここまで出来ててなんでそれが出来ないんだw

350:デフォルトの名無しさん
06/07/07 20:24:19
分からんままコピペしただけかな?

最後の
for i:=1 to 5 do writeln(stud[i].ten);
に、点数を出力する文を加えればいい。

351:デフォルトの名無しさん
06/07/07 22:12:36
みなさんのおかげで何とかできました。
ありがとうございました。

352:デフォルトの名無しさん
06/07/08 01:52:57
手続きや関数での変数宣言で、varをつけるのとつけないのの違いがよくわからないです。
誰か教えてください。

353:デフォルトの名無しさん
06/07/08 01:56:06
参照渡しと値渡し

354:デフォルトの名無しさん
06/07/10 01:44:09
アホですみませんがこの2つの問題がわかりません
ぜひ教えてください



5教科のテストを行いました。それぞれのテストの点数を入力してもらい、
それぞれの点数と5教科の合計と平均をわかりやすく表示するプログラムを作成しなさい。





プログラムを作成していて、次のような関数"printAns()"が必要となりました。
printAns()は第一引数としてint型を受け、受け取った整数に50をかけて
”答えは○○です”と表示してから、その答えをint型で返します。
このような関数printAns()を製作してください。
メインとなるプログラムは次のものを流用するように。

var
a,b:Integer;

begin
Write(Output,'n ? |');
Read(Input,a);
Writeln(Output,'ここから関数');
b :=Culculate(a);
Writeln(Output,'ここまで関数');
Writeln(Output,'戻り値は ',b);

end.

355:デフォルトの名無しさん
06/07/10 02:30:58
いくらなんでも丸投げ過ぎ

356:デフォルトの名無しさん
06/07/10 02:57:04
解答者がやりたくなるような質問の仕方を研究して来い

話はそれからだ

357:デフォルトの名無しさん
06/07/10 06:41:46
>>354
>>348 を改良すれば作れるよ。

358:デフォルトの名無しさん
06/07/14 01:40:21
課題内容:

新幹線に乗るために阪急電鉄・石橋駅から梅田経由で地下鉄御堂筋線・新大
阪駅まで行きたいとする.新大阪駅に到着したい時刻を入力すると,石橋駅
で何時何分発の列車に乗ればよいかを教えてくれるプログラムを以下の3段
階に分けて作成せよ.ただし,以下の2つの条件を満たすこと.

条件:

(1) 手続きもしくは関数を用いること.
(プログラムを分かりやすくするため)

(2) 少なくとも以下の情報を出力すること.
(ユーザが使いやすいように,出力を工夫すること)

・阪急電鉄・石橋駅の発車時刻
・阪急電鉄・梅田駅への到着時刻
・地下鉄御堂筋線・梅田駅の発車時刻
・地下鉄御堂筋線・新大阪駅への到着時刻



359:デフォルトの名無しさん
06/07/14 01:41:18
段階:

(1) 平日ダイヤのみに対応する.阪急は急行しか利用しない(普通列車な
ど,急行以外の列車は無視する).

(2) 段階 (1) に加えて,阪急の全列車(特急,特急日生エクスプレス,
通勤特急,急行,準急,庄内・曽根通過待ちなしの普通,庄内・曽根
通過待ちありの普通)を利用可能にする.ただし,普通列車が後発の
特急などに追い越される可能性は無視する(追い越される普通列車を
出力してよい).さらに,土曜・休日ダイヤに対応する.

(3) 段階 (2) に加えて,後発の特急などに追い越される普通列車でなく,
後発の特急を出力するようにする

360:デフォルトの名無しさん
06/07/14 01:52:31
358、359の者なんですが、PASCALの課題で下のような時刻表を与えられていてこれ以外にもたくさんあって、
配列に一つ一つ打ち込むにはあまりに多すぎるんで、どうにかファイルを呼び出したいんですが、
教科書のようなものを読んでみていじってみても上手くいきません。
どなたか少しわかりやすく説明していただけたら嬉しいんですが…

361:デフォルトの名無しさん
06/07/14 01:53:44
急行
6 4 22 33 44 51
7 1
829 49 56
9 7 16 27 39 49 59
10 9 19
1558
16 8 18 28 38 48 58
17 7 16 26 36 46 56
18 6 17 26 36 48 57
19 8 17 28 37 48 57
20 8 17 28 38 48 58
21 8 18 28 38 48 58
22 8 18 28 38 48
23 2 14



362:デフォルトの名無しさん
06/07/14 03:55:01
>>318
リストだけに超絶に難しい。

>>360
>>228-232 あたりに載ってる。
実用的な問題ですね。

363:デフォルトの名無しさん
06/07/14 12:47:24
1行ずつスキャンして、ansiナントカで解析していけばよい

364:デフォルトの名無しさん
06/07/14 23:49:29
二分探索法を手続き宣言して使用する場合、
procedureとfunctionのどちらを使えば良いでしょうか?

また、それらに処理に必要なデータを引数として渡すようにする場合、
どういった形式が望ましいのでしょうか?

いろいろ試してみましたが、うまくいかないので…
応えて頂けると幸いです。



365:デフォルトの名無しさん
06/07/15 00:53:39
とりあえずCとかのサンプルコードを移植したら?
それからDelphiスタイルに変えればいいかと。

366:デフォルトの名無しさん
06/07/15 08:25:12
Pascal過疎ってるなぁ。

367:デフォルトの名無しさん
06/07/15 15:01:00
>>364
procedure(手続き)とfunction(関数)は値を返すか返さないか
の違いだけしかないから、値を返したいんだったらfunctionにして
値が要らないんだったらprocedureにすればいいのでは。

処理に必要なデータは渡さなきゃならないけど、どうやって渡す
かは実装する人の自由だから、好きにすればいいと思う。

368:デフォルトの名無しさん
06/07/15 22:06:51
長文で失礼します。

(1) 配列にしまわれたいくつかの整数をデータとして,
棒グラフを作成するプログラムをかけ。
(入力データ x は 0<= x <=100 をみたすとする。)
Hint:
以下の作業を,i=1 から i=n まで,
n 回繰り返す ( for 文や repeat 文を用いる)
作業:
x 方向に位置をずらしながら,
a[i] に応じた高さの細長い長方形を n 個描く

50 未満のデータに対する「棒」は赤色で表示し,
50 以上のデータに対する「棒」は青色で表示するようにせよ。

という課題なのですが



369:デフォルトの名無しさん
06/07/15 22:07:29
var n : integer;
a : array[1..20] of integer;

procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Lines.Add(Edit1.Text);
n := n + 1;
a[n] := StrToInt(Edit1.Text);

Edit1.Clear; Edit1.SetFocus;
end;

procedure TForm1.Button2Click(Sender: TObject);
var i : integer;
begin
with PaintBox1.Canvas do
begin
for i= 1 to n do

//棒グラフ作成?



370:368 369
06/07/15 22:08:25
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
Memo1.Clear;
Edit1.Clear; Edit1.SetFocus;
end;

end.
という状態です。
ここまでに誤りがあるのか、また、肝心の空欄部分はどうすればいいか
教えていただけたら幸いです。



371:デフォルトの名無しさん
06/07/15 22:17:31
垢と阿保はどうすれば出ますか?

372:デフォルトの名無しさん
06/07/15 22:50:27
>>368-370
nは初期化されている? PaintBox1.Canvasはクリアされている?
棒グラフを書く前に座標軸を書かなきゃ。

棒グラフはまず「グラフ用紙に自分出てで書いて」みれば、どう
書けばいいか分かると思う。その書く手順そのままCanvasに
書けばいいだけ。

手で書く時に位置情報(ピクセル単位)を意識しながら書けば
簡単に出来ると思う。

373:364
06/07/16 10:18:47
いくつかのご指摘ありがとうございます。
なんとかがんばってみます。

374:デフォルトの名無しさん
06/07/17 01:53:46
C言語で書かれたプログラムをpascalに変換する何かってないですか?

375:デフォルトの名無しさん
06/07/17 02:53:35
Cを読む事が出来、pascalを書く事が出来る人間の脳と手

376:デフォルトの名無しさん
06/07/17 10:13:21
簡単だから自分で覚えた方がいいよ

Pascalがいかに面倒かってよく分かる

377:デフォルトの名無しさん
06/07/17 11:21:48
すごく間抜けた質問かもしれませんが
pascalのプログラムを家で作成したいのですがどこか置いてるサイトとかありますか?

378:デフォルトの名無しさん
06/07/17 11:32:06
Pascalコンパイラがどこにあるかってこと?


379:デフォルトの名無しさん
06/07/17 11:36:13
URLリンク(www.jp.freepascal.org)

16bit だったような気がするけど


380:デフォルトの名無しさん
06/07/17 11:39:35
純正 pascal にこだわらないなら
Delphi / kylix あたりでいいんじゃない?

381:377
06/07/17 11:53:57
>>379>>380
どうもありがとう。
>>379のはなんか落とせないから>>380のやつみてみます。

382:デフォルトの名無しさん
06/07/17 11:55:10
pascalのコンパイラで有名なのは

1、Delphi 6 URLリンク(www.vector.co.jp)
  登録が必要 URLリンク(www.borland.com)

2、FreePascal
 URLリンク(www.jp.freepascal.org)
 IDEで有名なのはlazarus URLリンク(www.lazarus.freepascal.org)

3、HelloPascal
 URLリンク(members.jcom.home.ne.jp)

4、カベソン
URLリンク(www.tokumaru.org)

5、gpc  GNU Pascal Compiler

383:377
06/07/17 12:22:37
>>382
すごく参考になりました。どうもありがとう。

384:デフォルトの名無しさん
06/07/18 08:53:43
うわーカベソンで今もあったんだ。
なつかしー


385:デフォルトの名無しさん
06/07/18 20:58:22
Pascalとか、わけわかないっすお

386:デフォルトの名無しさん
06/07/18 22:08:05
for文くらいまでしか理解してません、もうダメポorz
誰か助けてください。。。○投げですいませんOTL

(i) 自然数(整数)で表記される「キー」、および、8文字までの文字列で表現される「データ」を、2分木の構造で管理するプログラムであること。
*常に左右のバランスを保つAVL木であること。
(ii) プログラムの実行開始直後に、可能な操作のメニューが表示され、自在に選択でき、1つの操作が実行された後、そのメニューが再表示され、入力待ち状態になること。
(iii) 「キー」「データ」の値を入力することによりデータの登録ができること。
(iv) 二重登録を防止し、その際警告メッセージを出すこと。
(v) 「キー」の値の入力することにより、データの削除ができること。
(vi) 登録されていないデータを削除しようとすると、メニューに戻る前に警告メッセージを出すこと。
(vii) 「キー」の値を入力することにより、そのキーの値をもつデータを参照できること。
(viii) 2分木の構造(頂点間の接続関係)を表示できること。
(ix) 登録されている全データを、キーの小さい順に列挙できること。
(x) 2分木内の各頂点の(木の根からの)深さを表示できること。
---------------------------------------
*はできるとボーナス点

要解説書。手続きの処理内容、変数の説明など
解説書〆7/24
プログラムソース〆7/21
orz

387:デフォルトの名無しさん
06/07/18 22:11:39

Pascalです。。。

388:デフォルトの名無しさん
06/07/18 22:15:41
recordを使う

389:デフォルトの名無しさん
06/07/18 22:21:03
俺もレポートやんないと

390:デフォルトの名無しさん
06/07/22 13:26:54
これpascalにしてください。
URLリンク(ime.st)

391:デフォルトの名無しさん
06/07/23 07:33:13
ime.st のまま貼るなよ

392:デフォルトの名無しさん
06/07/26 12:25:21
Pascalでプログラムの実行実時間を調べるコマンドがわからないのですが、
誰かご存知でしょうか?

393:デフォルトの名無しさん
06/07/26 20:23:22
開始時と終了時に時間を取得して差を求める

394:デフォルトの名無しさん
06/07/31 05:26:56
WindowsならtimeGetTimeがms単位で測定できる。

395:774RR
06/08/31 20:25:00
やっとXcodeでFPC走るようにしたよん。記念にたまにはあげよう。

>394
それが信頼できるかはまた別物。リアルタイム処理を今のビジネス/ホビー用パソコンでやるのは
かなり無理があるよ。

DOSでTurbo Pascal使った方がいいくらい。

396:デフォルトの名無しさん
06/08/31 20:27:43
で?

397:デフォルトの名無しさん
06/09/13 15:24:53
Turbo Delphi で Pascal のコンパイルは出来ますか?

398:デフォルトの名無しさん
06/09/16 00:17:39
できます

399:デフォルトの名無しさん
06/10/06 04:12:13
integerで扱える範囲を越えた数値を代入すると、
誤った値を返したりすることってありますか?
また、そういうことを防ぐ、というかせめて
間違った値が出るということを予測できるといいなあと思うのですが

どういう文献を調べればよいのかも教えていただけると助かります!

400:デフォルトの名無しさん
06/10/06 15:33:01
integerの範囲を超えないように注意することで防げます。

401:デフォルトの名無しさん
06/10/06 15:49:03
ふつうは例外が出ると思う

402:デフォルトの名無しさん
06/10/06 17:51:51
>>400

integerの範囲?

403:デフォルトの名無しさん
06/10/06 23:07:14
low(integer)..high(integer)

404:デフォルトの名無しさん
06/10/08 03:38:29
引数のパラメータにconstを付けるのは、どういう意味(違い)があるのですか。
varなら分かりますが。

405:デフォルトの名無しさん
06/10/08 12:49:14
const も var も参照渡しだが、constは値の変更ができない。

406:デフォルトの名無しさん
06/10/15 21:14:10
すんません
手元にパスカルないんですけど
パスカルにおける論理式が真の時の返り値って
1でしょうか、それともー1でしょうか?


407:デフォルトの名無しさん
06/10/15 21:47:39
実装によりますが-1が多いです。

408:デフォルトの名無しさん
06/10/15 21:51:18
True です。

409:デフォルトの名無しさん
06/10/15 22:26:48
>>407
いやdelphiでもfpcでもord(true)は1だろ。

410:デフォルトの名無しさん
06/10/15 23:30:28
PInteger(@b)^ だと $FFFFFFFF

411:デフォルトの名無しさん
06/10/15 23:42:31
BooleanとIntegerではバイト長が異なるのでそのキャストは無意味

412:デフォルトの名無しさん
06/10/15 23:57:14
PByte(@b)^ だと $FF

413:デフォルトの名無しさん
06/10/16 00:18:18
>>408が正しいと思う。論理式は論理値しか返さないから、true
もしくはfalseしかない。1か-1かで比較すると「型が違います」と
怒られる。

414:デフォルトの名無しさん
06/10/16 00:47:39
Booleanは順序型だよ

415:デフォルトの名無しさん
06/10/16 00:56:54
だから何?

416:デフォルトの名無しさん
06/10/16 01:21:44
全ての順序型は数値とと互換性がある

417:デフォルトの名無しさん
06/10/16 01:24:20
そう。良かったね。

418:デフォルトの名無しさん
06/10/16 01:28:51
>>413
ord使えよ

419:デフォルトの名無しさん
06/10/16 01:33:50
それで?

420:デフォルトの名無しさん
06/10/16 09:04:17
>>406
0以外としか定義されてないよ。だからどっちかは風任せ

421:774RR
06/10/16 18:02:05
言語としては>408が正解だろう。
実装としては>420の言う通り取説嫁としかいいようがない。

fpcだと
boolean - false : 0 / true : 1
bytebool, wordbook, longbool - false : 0 / true : 0以外のなんでも
となっている。

422:デフォルトの名無しさん
06/10/17 00:16:06
ふーん、それが何か?

423:デフォルトの名無しさん
06/10/26 17:14:30
ユーグリッド互除法のプログラムを変更することにより正整数x、yを読み取りux+vy=gcd(x,y)
を満たす整数の組(u,v)を一つ出力するプログラムを作れ。ただし配列は用いない。

わからないのでお願いします!

424:423
06/10/26 17:42:23
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.

こう作ったんですけど、x、yの値が大きくなると正しく動きません。
添削してください。

425:デフォルトの名無しさん
06/11/14 02:20:00
ポインタを使った2つの線形リストにそれぞれアルファベットを入れて、
その2つの共通部分を別の線形リストに入れて出力するプログラム

を書きたいのですが、よくわかりません。
まず、線形リストに文字を入力して、それを出力するだけのプログラムを
書いたのですが、コンパイルはできるものの実行すると無限ループになります。
何がいけないのかご指摘いただけると助かります。

↓↓つづく↓↓

426:デフォルトの名無しさん
06/11/14 02:20:58
program intersection(input,output);

type
pointer = ^celltype;
celltype = record
element : char;
next : pointer;
end;

var
listA,listB,listC : pointer;
x : char;



427:デフォルトの名無しさん
06/11/14 02:22:42
procedure insert(var p : pointer; a : char);

var
q : pointer;

begin
new(q);
q^.element:=a;
q^.next:=p;
p:=q;
end; { insert }

procedure print(p : pointer);

begin
while p<>nil do begin
write(p^.element,' ');
print(p^.next)
end
end; { print }


428:デフォルトの名無しさん
06/11/14 02:24:02
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.



429:デフォルトの名無しさん
06/11/14 02:45:11
>while p<>nil do begin
>write(p^.element,' ');
>print(p^.next)
>end

pが変化してないようだが。while→ifじゃ無いか?


430:デフォルトの名無しさん
06/11/14 02:57:57
>>429
ifにしたらうまくいきました!!
逆順に出力されるけど・・・

共通要素を探す手続きのほうもがんばって作ってみます。
ありがとうございました。

431:デフォルトの名無しさん
06/11/14 22:31:52
で、その共通要素を探す手続きなのですが・・・
これのどこがだめなのかご指摘願います。

procedure search(var p,q,r : pointer);

var
found : boolean;

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 }




432:デフォルトの名無しさん
06/11/14 22:35:54
あと、メインプログラムで

if listA^.element<>'.' then begin
print(listA)
end;

とありますが、このif文て必要ないですよね?
それから、listA,Bについてnewしてないのですが、これって問題あります、よね?
なぜか値が格納されてるみたいなのですけど・・・




433:デフォルトの名無しさん
06/11/15 01:20:23
age

434:デフォルトの名無しさん
06/11/15 13:37:51
リストに要素の重複は無いんだな。

>procedure search(var p,q,r : pointer); 
p,qは呼び出し元の値を変えんな。var取れ。

>if p^.element=q^.element then found:=true 
>else q:=q^.next 
ifが真の時、q:=q^.nextは実行されない(無限ループ)。

>new(r);
不要。

>とありますが、このif文て必要ないですよね? 
無い。

>listA,Bについてnewしてないのですが、これって問題あります、よね?
無い。むしろdispose(listA)しかしてないのが気になる。

435:デフォルトの名無しさん
06/11/21 12:46:41
>>434
大変遅ればせながらありがとうございます。
無限ループはどうすれば回避できるのでしょうか?
それから、なぜlistA,Bをnewしなくてもよいのでしょうか?
質問ばかりですいません

436:デフォルトの名無しさん
06/11/22 01:04:41
>>431
ある文字がリストにあるかどうかを調べる関数を作れば
解りやすくなると思う。


437:デフォルトの名無しさん
06/11/24 22:39:39
実数が格納されている配列があって、その実数を配列の最初から順に
足し合わせていく関数を作りたいのですが、以下の関数だとうまくいきません。
ご教授願います。

function wa(f:hairetu):real;{hairetuは100項ある実数型の配列}

var i:integer;

begin
for i:=1 to 100 do begin
wa:=wa+f[i];
i:=i+1
end
end



438:デフォルトの名無しさん
06/11/24 22:45:05
wa は何?

439:デフォルトの名無しさん
06/11/24 23:25:39
関数の名前です

440:デフォルトの名無しさん
06/11/24 23:33:39
function wa(f: hairetu): Real;
var
i: Integer;
sum: Real;
begin
sum := 0.0;
for i := 1 to 100 do sum := sum + f[i];
result := sum;
end;

こんなのはどうですか。

441:デフォルトの名無しさん
06/11/24 23:37:47
waに直接足し合わせていくのはだめなんですかね?
sumみたいな変数を用意しないとだめなんでしょうか?

442:デフォルトの名無しさん
06/11/25 00:38:40
じゃこれ。

function wa(f: hairetu): Real;
var
i: Integer;
begin
for i := 2 to 100 do f[1] := f[1] + f[i];
wa := f[1];
end;

wa := wa + f[i] とやると、右辺の wa はDelphiでは関数呼び出しと解釈されるから、無理。

443:デフォルトの名無しさん
06/12/03 00:36:41
配列に入れた値をヒープソートで絶対値とった小さい順にするプログラム教えてください。

444:デフォルトの名無しさん
06/12/03 04:23:41
ヒープソート難しいよ。

445:某TA
06/12/04 22:36:21
>>443
Wikipedia逝け
アルゴリズム載ってるから

446:デフォルトの名無しさん
06/12/05 00:08:56
>>445
そんなのもう見ました。

447:デフォルトの名無しさん
06/12/05 03:55:22
私もよく解らないけど、
配列を二分木のように解釈するみたい。
配列の先頭=二分木の根っこで、ここに一番大きい値を持ってくるみたい。

ここまではOK?

URLリンク(www.ics.kagoshima-u.ac.jp)
URLリンク(su10.sgu.ac.jp)

448:デフォルトの名無しさん
06/12/11 01:00:08
実行時に0~9以外のキーを入力した場合、
自動的に消えるようにしたいんだけどどうしたらいいかな?
わかる人いますか?

449:デフォルトの名無しさん
06/12/11 16:18:07
何が消えるようにしたいの?

450:デフォルトの名無しさん
06/12/11 23:30:37
Editへの入力からじゃないかな。
ようは数値入力専用Editを作りたいのかと。
OnKeyDownイベントで、いらないキー入力は Key := 0; で無効に出来る。


451:デフォルトの名無しさん
06/12/13 00:32:15
448 ですけど、質問下手ですいません。
具体的に言うと、

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.

で実行して、間違ってアルファベットとか打つとエラーになるでしょ?
そうじゃなくって「再度入力してくれ」と表示してもう一回って感じに
自動的に持ってきたいんです。
charでどのキーも入力OKにしてから0~9を数値型に変換するのかなと
考えたんだけど、いまいちやり方わかりません

452:デフォルトの名無しさん
06/12/13 00:51:47
function ReadInt: Integer;
var
 S: strting;
begin
 repeat
  WriteLn('数字を入力してください');
  ReadLn(S);
 until TryStrToInt(S, Result);
end;

453:初心者
06/12/16 11:06:08
すみません。学校でパスカルにちょこっとふれただけなのですが、課題がでて、もうどうしてよいか分かりません。
助けてください。
入力されたn個の数を大きい順に並び替えるプログラムを作れ。

お願いします。

454:デフォルトの名無しさん
06/12/16 13:48:36
n個の配列を用意して二重ループで大きい順に入れればいい。

455:デフォルトの名無しさん
06/12/17 04:10:08
こんなんどうだ?

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;

456:デフォルトの名無しさん
06/12/19 01:21:31
GNU PascalをOS X上のXcodeで使ってます。
時間の計算をしたいと思いますが、如何すればいいですか?

457:デフォルトの名無しさん
06/12/19 01:36:32
求むエスパー

458:デフォルトの名無しさん
06/12/19 03:02:53
ミリ秒に変換して計算すれば良いと思う。

459:デフォルトの名無しさん
06/12/20 02:21:31
>>458
回答ありがとうございます。それでは、ミリ秒に変換するには如何すればよいのでしょうか。

460:デフォルトの名無しさん
06/12/20 02:41:03
何がしたいのか具体的に書かないと誰も答えられないよ。

461:デフォルトの名無しさん
06/12/20 17:41:23
1 sec = 1000msec
1 min = 60 sec
1 hour = 60 min

462:光速エスパー世代774RR
06/12/26 17:59:23
バッババババビューンと空を逝くw

463: 【ぴょん吉】 【1736円】
07/01/01 01:08:04
さて、明けたことだし宿題やろ

464:q
07/01/21 20:19:40
[質問]
「上から○(円)が落ちてきて、
ウィンドウの1番下に達したら
その円は止まり、新しい円が
また落ちてくるプログラムを作れ
(ただしfor文を使うこと)。」
という宿題が出たのですが、
よく分かりません。

どなたか分かる方、教えて下さいm(__)m

465:デフォルトの名無しさん
07/01/21 20:33:00
やだ

466:デフォルトの名無しさん
07/01/22 00:04:54
ヒント
Form1.Canvas, Ellipse, Timer, Form1.ClientHeight


467:デフォルトの名無しさん
07/01/22 00:20:44
ここはいつからDelphiスレになったんだ?

468:デフォルトの名無しさん
07/01/22 00:21:29
あぁ、Delphiも対応であったか。失礼。

469:デフォルトの名無しさん
07/01/25 19:06:01
パスカルの入門書でおすすめありませんか?
URLリンク(www.saiensu.co.jp)
これを買おうかな、と今は思っているのですが。

470:デフォルトの名無しさん
07/01/26 03:47:12
やめとけ

471:光速エスパー世代774RR
07/01/26 12:38:49
つーか、今からPascalを勉強しようというのが… 授業かなんかかい?

Pascalの教科書は何冊か使ったけれど、てもとにあるのは森口さん他の
「Pascalプログラミング講義」(共立出版)
だ。これ、ちょっと内容が薄いかな。

思い出してみればボーランドのTurbo Tutorが結構優れた教科書だった。
TP5.5はフリーになってるけど、Turbo Tutorってネットに流れてない?

定番アルゴリズムは奥村さんのアルゴリズム事典で勉強したね。
URLリンク(oku.edu.mie-u.ac.jp)

あれだ、今日びは言語自体より、(一昔前なら)API、(出るちゃん以降は)
コンポーネントの使い方の方が大事だってゆー、つまらないといえばつまらない
世の中になったもんだよ。

472:469
07/01/26 15:20:07
いえ、授業ではなくてただの興味です。
レスありがとうございますm(__)m

473:デフォルトの名無しさん
07/01/27 00:53:01
授業でないなら、その手の教科書本は初心者にはしんどいと思うよ。
興味を持ち続けられないと思う。


474:デフォルトの名無しさん
07/01/27 00:56:26
Delphi言語や、教育目的、古いプログラムの保守は別として、
Pascalもまだまだ現役で使われてるんですか?

475:デフォルトの名無しさん
07/01/27 01:01:17
全く。

476:デフォルトの名無しさん
07/01/28 09:25:11
DelphiってもしかしてObjectPASCALのことですか?

477:光速エスパー世代774RR
07/01/28 15:15:58
>476
その辺は複雑で、ボーランドはBorland Pascal がサポートする言語を
Object Pascal と呼んでいた。Borland Pascalは消滅して、ご存知Delphiが現行なんだが、
これが実装している言語は今では「Delphi言語」と呼ばれているはず。

Delphi言語はプログラミング言語Pascalをオブジェクト指向を用いて
拡張したものだから、Object Pascalの一種であり、最も普及したものだね。
既にPascal言語の de facto standard といっていいと思う。

478:デフォルトの名無しさん
07/01/31 11:03:06
すいません、お初です。
学校課題でπの近似値を求めろ、言われました。マチンの公式使ってやってみようと思ったんですけど、数字を何乗かしたいとおもったっとき、使えるコマンドはあったでしょうか?
たとえば、2のN乗がしたいとき、read(n)で読み込んで、計算させたいということなんですけど。
教えてください。

479:光速エスパー世代774RR
07/01/31 12:33:49
標準的にはないけど、処理系のおまけでついている可能性がある。
なくても自分で書けばおっけー。

480:デフォルトの名無しさん
07/01/31 12:54:08
えーと、どうやれば書けますか?
ちょっと想像がつかないので教えてください。

481:光速エスパー世代774RR
07/01/31 17:29:14
再帰的な定義をそのまま実装(普通は末尾再帰→繰り返しにする)するか、
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;

begin
write('a ^ b, a= , b= '); readln(a, b);
writeln(power(a, round(b)), ' ', RealPower(a, b))
end.


482:デフォルトの名無しさん
07/01/31 18:38:46
ありがとうございました。後はもう少し自分であがいて見ます。


483:デフォルトの名無しさん
07/04/14 09:10:23
落ちてる?

484:デフォルトの名無しさん
07/04/14 18:35:39
GPCのバグを発見してしまったage

整数演算の結果がオペランドのビット巾で丸められちまう。

485:デフォルトの名無しさん
07/04/26 06:38:45
丸められるって?

486:デフォルトの名無しさん
07/06/18 23:59:09
質問です。
大学入ってPascalプログラミングやってるんですが、
『選択ソートのプログラムを作成せよ。
ただし、データ数を最初に入力するように変更すること。
また、データ数は1個から最大10000個まで対応できるようにすること』
とあるのですが、サッパリです。
かなり初心者な質問で申し訳ないのですが、どなたか教えてください

487:デフォルトの名無しさん
07/06/19 00:09:14
>ただし、データ数を最初に入力するように変更すること。

元のソースが無いと変更しようが無い。

488:デフォルトの名無しさん
07/06/19 00:44:47
すみません。元のソースは

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.

です

489:光速エスパー世代774RR
07/06/19 13:02:24
ほれ。FreePascalでテスト済み。

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.

490:デフォルトの名無しさん
07/06/19 14:51:42
ありがとうございます!

491:デフォルトの名無しさん
07/06/19 21:05:37
ローカルのファイルにアクセスするにはどうすればいいですか?


492:デフォルトの名無しさん
07/06/19 22:06:37
>>491
Pascalには標準的な方法がありません。処理系とファイルシステム依存です。

UCSD-Pascal, Pascal/MT, MT+, Turbo/Borland Pascal, FreePascal では
assign手続きを実行しといて、resetなりrewriteなりします。

assign(ファイル変数, ファイル名);
reset(ファイル変数);
...
close(ファイル変数)

GPCだと上のBorland方言に加えて、ISO拡張Pascal標準のbind手続きが使えます。

493:デフォルトの名無しさん
07/06/19 23:26:50
PASCALでCGIは作れますか?

494:486&488
07/06/19 23:34:10
>>datanum : dataindex; (* データ数を貯めとく変数を用意するのが肝な *)
申し訳ないのですが、なぜデータ数を溜めておく変数が必要なのか教えていただけませんか

495:デフォルトの名無しさん
07/06/20 00:17:35
変数に保存しとかなきゃ何回入力を受け入れるべきか解からなくなるじゃn

496:光速エスパー世代774RR
07/06/20 12:43:41
>>493
俺はCP/M世代の棺桶片足なおさんだから、そういう今様なものは
良く知らんのだが、perlやRubyの本をチラリズムしたカンジダと、
httpdとの間でデータをやり取りする規格さえ合ってれば、
文字列操作ができさえすれば良くて、
言語自体はLISPでもCOBOLでもALGOLでもPL/Iでもいいんじゃまいか。
実際、FreePascalでCGI作ってる例があったなあ。

URLリンク(courses.cs.vt.edu)

URLリンク(www.erg.slf.th.schule.de)
に説明があるけど、uncgiユニットてのを使うと便利らしい。

URLリンク(www.is-hanko.co.jp)
も面白い。茨の道へGO!

497:デフォルトの名無しさん
07/06/22 19:52:22
PASCALの問題です

問題1

西暦を入力して、「1989年は平成2年です」というように年号や年を出力するプログラムを作りなさい。
ただし各年号の境目は両方の年号を出力するようにすること。(1988年は昭和64年でも、平成元年でもある)


問題2
下記を表示するプログラムを作れ

(1)
**********
*********
********
*******
******
*****
****
***
**
*

498:デフォルトの名無しさん
07/06/22 19:57:27
(2)
*
**
***
****
*****
******
*******
********
*********

問題3
Nを入力して1からNまでの和を計算するプログラムを作れ。
また1からNまでの奇数の和を計算するプログラムも作れ。


問題1はif文,2・3はfor文を使用します。
一週間ほど足りない頭で粘ってみてもわかりません。
先生は非常勤だから質問する相手もいないので
皆さんの知恵をお貸ししていただけたら幸いですm(__)m

499:デフォルトの名無しさん
07/06/22 20:21:54
ふーん
こういう宿題出るもんなんだな(´・ω・`)

500:デフォルトの名無しさん
07/06/22 22:28:21
Program LotsOfStars(output);
var i : integer;

procedure StarBar(n : integer);
var i : integer;
begin
for i := 1 to n do write('*');
writeln
end;

begin
for i := 10 downto 1 do StarBar(i);
for i := 1 to 10 do StarBar(i)
end.


おまけ
Program SingleStar(output);
var i : integer;
begin
for i := 10 downto 1 do writeln('*' : i);
for i := 1 to 10 do writeln('@' : i)
end.


501:デフォルトの名無しさん
07/06/23 14:01:19
問題3の前半
Program NeverTested(input, output);
var n : integer;
begin
read(n); write((n * (n+1)) div 2)
{ don't trust me ;-p }
end.

502:497,498
07/06/24 16:49:06
>>500-501
大きなヒントを下さってありがとうございます♪
教養科目で卒業が掛かっているのでとても嬉しいです

問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.

何がダメなのかすらわかりません><
助けてください・・・

503:デフォルトの名無しさん
07/06/24 18:28:48
別に何もダメじゃなくね?

504:デフォルトの名無しさん
07/06/24 18:33:10
強いて言えば問いかけの前にreadlnしてるとこ。

505:デフォルトの名無しさん
07/06/24 18:38:36
あ、元号境界の処理と+1してない。

506:デフォルトの名無しさん
07/06/24 19:41:59
>>505
INC(年号)は俺も気づかなかった

507:デフォルトの名無しさん
07/06/24 22:34:49
>502
1989年は平成元年かつ昭和64年ってのを、最初のif文で判定する必要があると思う。

508:デフォルトの名無しさん
07/06/25 23:25:06
なんとなく年号のテーブルがずれてる気がした。

program gengou;
{$APPTYPE CONSOLE}

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

end.


509:デフォルトの名無しさん
07/06/25 23:30:14
一応コンパイラはdelphi使って確認したけどコンパイラ指示除いてBorland拡張は使っていない・・・と思う。


510:デフォルトの名無しさん
07/06/25 23:32:37
例題から察するに、配列はまだ習ってないんじゃないか

511:デフォルトの名無しさん
07/06/25 23:34:46
>>508
>const
>era: array[0..3] of Integer = (1989, 1926, 1912, 1868);
>eraname: array[0..3] of array[0..10] of char = ('平成', '昭和', '明治', '大正');

ここでもうBorland方言でつ。

512:デフォルトの名無しさん
07/06/25 23:37:46
む、そうなるとかなり長いif文の羅列になるな・・・スマンそのコードは俺の性には合わない。

513:デフォルトの名無しさん
07/06/25 23:39:22
な、な、定数配列はBorland方言とな!標準Pascalじゃやっぱり書けん!

514:デフォルトの名無しさん
07/06/25 23:41:54
>>513
大域変数として名前を確保し、変数初期化手続きを書いて、
大域変数はそこでまとめて面倒を見ておく、てのが常道だった。
まーそこまでストリクトに標準Pascalの流儀を守る必要もないんだけどw

あと、文字列型を使っていいのかも不明なんだよな。

515:デフォルトの名無しさん
07/06/25 23:55:10
久しぶりにヴィルトの原書開いてみたらやっぱり載ってなかった。
なるほどK&Rのどちらかだったか、「これじゃ書けねえ・・・」と思った気持ちもわかる。
いや、嫌いじゃないんだよPascal。むしろ好き。
ありがとう僕の友達Pascalに会わせてくれて。

516:デフォルトの名無しさん
07/06/26 00:03:33
>>515
それはラスカルだ

517:デフォルトの名無しさん
07/06/26 00:03:38
>>515
定数配列や変数宣言での初期化は便利だし、可読性も高くなるんだよね。

言語仕様を出来るだけ小さくしようと言うのがヴィルト先生の狙いだったのと、
原始Pascalでは宣言の順序が決まっているから、
定数宣言の中にユーザ定義型の識別子を書けないというのがあったのかな。



518:デフォルトの名無しさん
07/06/26 00:04:48
>>516
歳がバレるぞww

519:デフォルトの名無しさん
07/06/26 00:10:27
いや歌は違うだろうけど最近もやってるよ。
URLリンク(www.nippon-animation.co.jp)

520:デフォルトの名無しさん
07/06/26 04:24:17
テラキモスw

521:光速エスパー世代774RR
07/06/26 12:41:47
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

も手だな。eがソートされていなくても動くし、元年の処理の特殊性が減る。課題とは動作が違うけどね。

522:デフォルトの名無しさん
07/07/01 08:58:27
ファイル型の要素にtreeは使えないの?

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);

rewrite(IntFile,'tel-data');
write(IntFile,r);
end.

こんな感じで

523:デフォルトの名無しさん
07/07/01 21:14:24
使えるけど無意味だよ。

524:デフォルトの名無しさん
07/07/04 00:48:58
大学ではpascalの講義の後lisp, prologと続くのか?最近はjavaとかもやるのか?

525:デフォルトの名無しさん
07/07/04 01:50:44
っていうかpascal教えてる大学ってどういうところ?
情報系だとJavaを最初に教えると思うし。

526:デフォルトの名無しさん
07/07/04 13:46:13
最終的にpascal処理系を作成させる為に最初にpascalやるんじゃなかろうか?

527:デフォルトの名無しさん
07/07/10 21:03:36
↓の問題なのですが、どなたか教えていただけないでしょうか?

『下記のプログラムを参考にして、ファイルからデータを読み、それを整列し、その後、
”入力された値をデータの中から二分探索によって探索する”ことを繰り返すプログラムを作成せよ』


↓↓↓↓↓下記のプログラム↓↓↓↓↓

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;     ↓続きます

528:デフォルトの名無しさん
07/07/10 21:05:07
for i:=1 to numofdata-1 do
begin
j:=i;
for k:=i+1 to numodata 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.

どなたかお願いしますm(_ _)m

529:光速エスパー世代774RR
07/07/11 00:09:35
ちょいと書き直すと、
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.

ここで
tmp:=d[j]; d[j]:=d[i]; d[i]:=tmp
が肝な。その上のfor文で、i<=jで最も小さいd[j]になるようなjを探し出している。
d[i]をそのd[j]と入れ替えれば、d[i]はi以降の最小値になるわけだ。
これをバブルソートって呼ぶことは知っているよな。

530:光速エスパー世代774RR
07/07/11 00:11:20
ついでだからばぶるな挿入な。さて、新しい値を p とする

d[numofdata + 1] := p;
i := 1;
while p < d[i] do i := i + 1;

これで i は p>=d[i]を満たす最小の値になった(もうソートしてあるから)
p がたまたま d の最大値だったら、これ以上処理は必要ない。そうでなければ、
d の i 番目に p をそうぬうする。

for j := numofdata downto succ(i) do d[succ(j)] := d[j];
d[i] := p;

でそうぬう官僚。実は、p がたまたま d の最大値だった場合もこれを走らせていい。
しかし、課題は二分探索であった。あんま奇麗じゃないがfpcで試してはある。

531:光速エスパー世代774RR
07/07/11 00:13:50
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;

これをメインプログラムから binarysearch(調べたい数, 1, numofdata)

と呼ぶ。文字列型が使えると、少し奇麗になる。d[i]を何度も評価しているから、
d[i]の評価にコストがかかる場合はローカルにコピーしとく。

532:光速エスパー世代774RR
07/07/11 12:44:57
>>531は局所変数 i を宣言する行を落としていたな。

でだ、>>530と一緒に考えると、次のような改造をすぐ思いつく。

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

新しい数が現れたらずんずん配列に追加していく改造な。

533:デフォルトの名無しさん
07/07/11 22:10:21
>>527
二分探索って何か分かってる?

534:デフォルトの名無しさん
07/07/11 22:46:19
どんな巨大なデータも2分で探索できる高速アルゴリズムのことです

535:光速エスパー世代774RR
07/07/11 22:56:04
データ数が1でも2分かかったりしてw

536:光速エスパー世代774RR
07/07/12 03:35:40
それはないq

537:光速エスパー世代774RR
07/07/12 22:43:26
俺の偽者がずいぶんいるな。おまいらちゃんと名前修飾しろw

538:デフォルトの名無しさん
07/08/03 15:50:40
初めまして、いきなりで申し訳ないんですが教えてください(_ _)

入力された論理式の充足可能性を判定するプログラムを作成せよ。
論理式は, 充足可能性判定の計算量を考慮し, 最大10変数までにする。
という問題です。
以下は注釈です。
「論理式」とは論理変数 x0,x1,x2,・・・に, 論理演算「¬(否定)」,「∧(論理積)」,「∨(論理和)」を有限回適用したものである。
論理式 F(x1,...,xn) が「充足可能である」とは, F(a1,...,an) = true となる変数割当て (a1,...,an)∈{true, false}n が存在することをいいます。
作成するプログラムには, 以下の機能を付加すること。

1:入力された論理式を,通常の式のように表示する機能
「x1∨x2」, 「¬x0」, 「(x2∨¬x3)∧x1」など

2:論理式が true となる(すべての)変数値割当てを表示する機能

「F = x1∨x2 が true になるのは
x1=true, x2=true のとき
x1=true, x2=false のとき
x1=false, x2=true のとき
よって F は充足可能である」

ちなみに入力方法はキーボードで直接入力です。
例として、
例えば, (x1∧x2)∨x3, x1∧¬x1 などはいずれも論理式です。
例えば, F1 = (x1∧x2)∨x3 とすると, x1 = true, x2 = false, x3 = true のとき F1 = true となるので, 論理式 F1 は充足可能です。 一方, F2 = x1∧¬x1 とすると, どのような x1 に対しても F2 = false となるので, F2 は充足可能ではありません。

お願いします(_ _)

539:光速エスパー世代774RR
07/08/03 21:05:34
めんどいから逆ポで式を書くことにする。
例えば 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;


540:光速エスパー世代774RR
07/08/03 21:07:01
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;



541:光速エスパー世代774RR
07/08/03 21:08:28
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.


542:光速エスパー世代774RR
07/08/03 21:13:10
つうわけで、n個の論理型変数が張る空間を全部舐めて、結果を表示する。
ここでは手抜きでやってるけど、空間なめにはハフマン距離を使うとかっこいい。

実際には全部舐める必要はなくて、最初にtrueが帰った時に終了すればいい。
中置気泡対応は任せた。

543:デフォルトの名無しさん
07/08/04 14:14:45
学校の宿題が

電車をA駅からB駅で乗り換えて、C駅に行きたい。
C駅での到着希望時刻を入力したらA駅での時刻が出力されるプログラムを作れ。

なのですが、行数300越え+時刻表からデータ取り込みなんで質問しようにもどこがおかしいのかいまいち分かりません。
怪しいところを抜粋して書き込むのでアドバイスよろしくお願いします。

544:543
07/08/04 14:28:19

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;


545:543
07/08/04 14:36:38
時刻表の数字の部分をinteger型に直す手続き(procedure Minteger)と、それぞれの時間を
分の単位に直してa[i]の配列に放り込む手続き(procedure Extfile)のつもりです。

時刻表のファイル自体はちゃんと開けています。
時刻表は
08 09 19 29 39 51
09 01 11 21 31 41 51
10 01 11 21 31 41 51
のようにすべて二桁になるようにつくっています。

546:543(2)
07/08/04 14:43:37
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;

547:543(2)
07/08/04 14:59:52
さっきのa[i]の配列の中でmi(到着希望時刻を分単位になおしたもの)より小さいものの中で、一番大きなものを探してAxに代入しています。

hは時刻(時)で14時より早いなら前から、遅いなら後ろから調べるようにしているつもりです。

548:538
07/08/04 15:54:03
>>538です。
答えありがとうございます!
実際の入力は例えば「ab&cdl&」と入力すればいいってことですね(゚∀゚)
出力が(a∧b)∧(c∨d) となる感じですね。

あと、プログラムの解説も書いて提出しなければならないのですが・・・
もしよろしければ、解説をしていただけるとありがたいです。



549:光速エスパー世代774RR
07/08/04 17:24:23
node = record
value : boolean; term : string; next : pnode
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;


550:光速エスパー世代774RR
07/08/04 17:37:26
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;

push, pop類はスタックを実装している。RPNだから単純なスタックマシンで
好きなだけ複雑な式を計算させられる。calcが手抜きパーザで、変数名を見ると
スタックに値を積み、演算子を見ると、opeで演算を行いスタックトップに値を残す。
最後にpopすれば式全体の値になる。
変数空間を舐めるのはSetVarSetで、0から始まる2^変数個の整数を生成して、
得られた整数の各ビットを変数の値に代入している。


551:光速エスパー世代774RR
07/08/04 17:54:07
for i := 1 to powerof(ord(maxvar) - ord('a') + 1) do
はこれでもいいけど、
for i := 0 to pred(powerof(ord(maxvar) - ord('a') + 1)) do
の方が見栄えがいいな。

「変数空間を舐めるのはSetVarSetで、0から始まる2^変数個の整数を生成して、
得られた整数の各ビットを変数の値に代入している。」は
「変数空間を舐めるために、0から始まる2^変数個の整数を生成して、得られた
整数の各ビットをSetVarSetで各変数の値に代入している。」

552:光速エスパー世代774RR
07/08/04 18:15:10
>>543
時刻表ってのは基本的に列車の配列なのな。
列車をどうデータ化するかが問題じゃな。
別線を通ったり、優等列車だったりして特定の駅に停まらないことを表現するのも
忘れてはいけないのな。

駅乙にある時刻までに到着する、
駅乙に到着する前に駅甲に停車する列車のうちで、
駅甲の発車時刻が一番遅いものを見つける。この操作を二回繰り返せばいい。

553:デフォルトの名無しさん
07/08/06 17:29:56
>>548です。ありがとうございます。
実際に実行してみました。
Enter term: の後に a b & c \ | と入力すると
TRUE FALSE FALSE TRUE
FALSE TRUE FALSE TRUE
TRUE TRUE FALSE TRUE
FALSE FALSE TRUE FALSE
TRUE FALSE TRUE FALSE
FALSE TRUE TRUE FALSE
TRUE TRUE TRUE TRUE
FALSE FALSE FALSE TRUE
と表示されました。これは左から a, b, c, [(a and b) or (not c)]
となっているとわかりました。
実はプログラムへの要求事項があって
入力された論理式を,通常の式のように表示する機能
(例えば 入力が「a b |」 ならば 出力で「(a∨b」と表示される)
論理式が true となる(すべての)変数値割当てを表示する機能
の二つの機能、まとめると
「F = a∨b が true になるのは
a=true, b=true のとき
a=true, b=false のとき
a=false, b=true のとき
よって F は充足可能である」
こういうような形で表示しなければならないらしいんです。
こうするにはどうしたらいいのでしょうか?
何度もすみません^^;





554:光速エスパー世代774RR
07/08/07 00:35:55
「普通の式」で書くのは549-550のを久美こんでくれたまへ
もひとつのは、式の評価がtrueな時だけ出力すればいいから簡単。

ただねえ、10変数まで許すんでしょ、変数の値の集合には1024個の
元があって、式(変数1)を真にするのは500個、変数1-10の論理和をとれば
1023個で真になる。そんなのを表示しろというのも、若干野蛮な問題だと
思うなww


555:デフォルトの名無しさん
07/08/07 15:51:13
>>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;



556:デフォルトの名無しさん
07/08/07 15:52:20
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;








557:デフォルトの名無しさん
07/08/07 15:53:13
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.

558:デフォルトの名無しさん
07/08/07 15:54:01
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

Translation completed.
datakozo.c: 関数 `term' 内:
datakozo.c:116: `popt' が宣言されていません (この関数内で最初に利用)
datakozo.c:116: (未宣言の各変数については、それが最初に現われたそれぞれの関数
datakozo.c:116: に対して一度だけ報告されます。)
datakozo.c: 関数 `disp' 内:
datakozo.c:162: `popt' が宣言されていません (この関数内で最初に利用)

となりました。この場合はどうなのでしょうか?
あと、trueのときだけを表示するには下から4行目を換えればいいのかなと思ったのですがどうでしょうか?

559:デフォルトの名無しさん
07/08/23 16:57:39
約分をするプログラムの作り方を教えてください


560:光速エスパー世代774RR
07/08/24 01:34:38
最近はBASIC屋に化けてるww

約分ってのは分母子を最大公約数で割ればいいわけだから、
よーするに最大公約数を求める問題にいきつく。
これは二千年以上前から判っている方法で溶ける。FPCでテスト墨。

Program Euclid;

function GCD(m, n : integer) : integer;
begin
if n = 0 then GCD := m
else if m mod n = 0 then GCD := n
else GCD := GCD(n, m mod n)
end;

begin
writeln(GCD(123, 12))
end.

エウクレイデス先生はとても偉かったし、算法も高効率だが、
このコード自体の効率はわるいよ。


561:デフォルトの名無しさん
07/08/24 16:43:39
有賀と

562:nao
07/08/24 17:03:06
data.txt(100個の英単語がアルファベット順)というファイルに、
新しく単語を入力、またはそのファイルから単語を削除するプログラムを
どなたか作ってください。お願いします。


563:デフォルトの名無しさん
07/08/24 17:24:41
おい!誰ぞ!

パスカルの後継言語ヘクトパスカル作れよ!

564:デフォルトの名無しさん
07/08/24 17:59:51
そこはあえてバールと言おうぜ。

565:光速エスパー世代774RR
07/08/24 21:40:07
どんなに気圧が低くても、愛の風は風力3w

566:デフォルトの名無しさん
07/09/20 18:01:08
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で保存するときの拡張子を教えてください。

567:566
07/09/20 22:50:15
急いでいたので、言葉が足りなかったかもしれません…。
今日から大学での講義がスタートして、教科書もなんにもなく、いきなり出された宿題なので、さっぱり分かんないのです。
C言語でやっていたように、Windowsのメモ帳でプログラムを作って、
【.cpp】ではない何かで保存→コマンドプロンプトで実行
というようにやりたいのですが、いろいろと教えていただきたいです。

568:デフォルトの名無しさん
07/09/20 22:51:10
EX01.pasじゃだめなの?

569:デフォルトの名無しさん
07/09/20 23:06:12
>>567
開発環境、つか、コンパイラは何を使っているんですか?

570:デフォルトの名無しさん
07/09/20 23:07:14
コマンドプロンプトでは、
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ですか?

571:567
07/09/20 23:10:24
>>569
見てみたら、C++ Builderってやつでした。
これじゃPascalは無理か…

572:デフォルトの名無しさん
07/09/20 23:30:40
>>566
そのソースプログラムをFree Pascal Compiler 2.0で
コンパイルしてみたらエラーが出たよ。dirはdivだね。

誤 Q:=D1 dir D2;
正 Q:=D1 div D2;

573:デフォルトの名無しさん
07/09/20 23:38:05
>>571
ぼくはLinuxユーザーですが、
Free PascalにはWindows用のものもあるようですから
Free Pascalをインストールして試してみられてはいかがでしょう?

URLリンク(www.freepascal.org)
このサイトのDownloadというリンクをクリックしてみてください。
Win32, Win64 and WinCEというのがあるはずです。

574:デフォルトの名無しさん
07/09/20 23:42:41
ちなみに、Free Pascalについてはこのページが参考になります。
URLリンク(www.ss.u-tokai.ac.jp)

575:567
07/09/21 00:00:08
>>572
板書の写し間違いですね。ありがとうございます。

>>573
㌧です!今すぐダウンロード&インストールします!

576:567
07/09/21 01:00:56
うおおおおおおおおお!!!!!!!!
できました!!!!!!!!マジ㌧クス!

来週からもよろしくお願いしますwww

577:567
07/09/21 01:14:12
てへ、もういっちょ教えてください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.
だとエラーが出るんですけど、どこが違うのでしょう?

578:567
07/09/21 01:20:25
2行目は
var D1,D2,S,D,P,Q:real;
ですね。でもまだ上手くいかない気が…。

579:567
07/09/21 02:11:32
うお、S:6:2とかにしないと、桁数がおかしなことになるんですね。
解決しました!

580:デフォルトの名無しさん
07/09/30 19:15:06
 

581:デフォルトの名無しさん
07/10/03 00:21:35
一番短いパスカルのプログラムってどんなのですか?
文字数が一番少ないものを作れという課題が出たのですが…


582:デフォルトの名無しさん
07/10/03 00:22:35
ageてしまえ

583:デフォルトの名無しさん
07/10/03 00:28:23
program a;
begin
end.

584:デフォルトの名無しさん
07/10/03 13:45:25
>>583
改行コードをスペースにすれば(環境によっては)1文字分減るかも。

585:デフォルトの名無しさん
07/10/03 17:01:06
短すぎてびっくりしましたw それでもいいんですね。ありがとうございます。
ついでにこれも…。
☆頭書きをBNF記法で表せ。
☆整数「43221」を読み込み、逆順にして、元のデータと共に出力せよ
☆次の余剰を調べよ
14 mod 4
-14 mod 4
14 mod -4
-14 mod -4

586:光速エスパー世代774RR
07/10/03 18:35:48
program a;begin end.

Pascalのセミコロンは区切り子なので、改行もスペースもいらない。

587:デフォルトの名無しさん
07/10/03 19:09:53
>>585
>☆頭書きをBNF記法で表せ。
何の頭書き?

>☆整数「43221」を読み込み、逆順にして、元のデータと共に出力せよ
正数を文字列にしてひっくり返せばいいの?

>☆次の余剰を調べよ
何が分からないの?その式をそのまま実行して出力したんじゃダメなの?

588:デフォルトの名無しさん
07/10/04 00:44:16
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)

と出たのですが、よくわかりません。

589:デフォルトの名無しさん
07/10/04 00:46:47
コンパイラ「raldln なんて関数ねーよ」

590:光速エスパー世代774RR
07/10/04 00:47:49
>>588
>raldln(H)

そらー単純にミスタイプづら。
「raldlnなんつー識別子はないどごるぁ」ってコンパイラが逝ってるじゃん。

591:光速エスパー世代774RR
07/10/04 00:51:47
>>589
うふっ、けこーんね♥
こんど一緒にゐると先生の所にいきませんこと?
ねぇってば、ねぇ、ねぇ

それにしても、どう指を動かすとイク^H^Hこんなtypoするんだろうなw

592:デフォルトの名無しさん
07/10/04 00:54:51
ひゃー、タイプミスはずかし…。
>>585の頭書きなんですけど、

program ●●●(input,output)

の事らしいです。BNFをぐぐってもいまいち理解出来なくて。

593:デフォルトの名無しさん
07/10/04 01:08:58
<頭書き> ::= <名前> "(input,output)"

こんなんでいいのけ??

594:デフォルトの名無しさん
07/10/04 02:03:34
URLリンク(imepita.jp)

とっさに書きました。
これをBNFに書き換えるのを教えてください!!
お願いします!!!!!

595:デフォルトの名無しさん
07/10/04 02:14:44
URLリンク(videointroplayer.web.fc2.com)

596:デフォルトの名無しさん
07/10/04 02:44:32
>>585の2個目

program PR0231(input,output);
var D,X,S:integer;
begin
read(D);
X:=D;S:=0;

S:=10*S+X mod 10;
X:=X div 10;
S:=10*S+X mod 10;
X:=X div 10;
S:=10*S+X mod 10;
X:=X div 10;
S:=10*S+X mod 10;
X:=X div 10;
S:=10*S+X mod 10;

writeln(D,S);
end.

これで出ないのはなぜ、、、。

597:デフォルトの名無しさん
07/10/04 07:05:52
できました!
ありがとうです!!

598:デフォルトの名無しさん
07/10/04 09:03:54
いいよいいよ。どんどん宿題をオープンにしちゃって! 他の人も勉強になるから。

599:デフォルトの名無しさん
07/10/04 09:16:42
バッカス・ナウア記法って、そういや昔『やさしいコンピュータ科学』を読んだときに
Turbo Pascalの概要が解説されているところで使われていたのを思い出した。
<> -> <> こんな感じの<>を使った記述。ちがったっけ?




600:光速エスパー世代774RR
07/10/04 19:18:53
>>596

>S:=10*S+X mod 10;
>X:=X div 10;
>S:=10*S+X mod 10;
>X:=X div 10;
>S:=10*S+X mod 10;
>X:=X div 10;
>S:=10*S+X mod 10;
>X:=X div 10;
>S:=10*S+X mod 10;

次は、「自動化ちうのをしたくて電算機プログラムやってるのに、
なんでオラさはこんな5回も6回もコピペしなきゃなんねえだべ」と思ってみよう。

手抜きとぐうたら根性こそプログラミングの推薬ww


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch