Pascal の初心者用の ..
562:デフォルトの名無しさん
03/07/11 21:34
>561
取り敢えず「手塚治虫」で検索しとけ。
563:デフォルトの名無しさん
03/07/12 23:44
>>561
カードゲームなら実際のカードを使って一人遊びすれば必要な構造が見えてくるぞ。
564:デフォルトの名無しさん
03/07/13 00:06
一人遊び? ハァハァ
565:名無し@沢村
03/07/13 00:08
>>562
取りあえずじゃねーんだよ!!
おまいはタンスとかあってなっとらんぞ!!!
URLリンク(jbbs.shitaraba.com)
566:デフォルトの名無しさん
03/07/13 00:11
A U T H O R D A T A
本田 守さん
--------------------------------------------------------------------------------
名前
本田 守/ほんだ まもる
ハンドル
Mr.あねさん
ホームページ
URLリンク(www2.neweb.ne.jp)
URLリンク(hp.vector.co.jp)
MESSAGE
プログラムの勉強をはじめて1年とちょっとになります。まだまだ高度なものを作るには程遠いですが、先だっては某社のプログラミングコンテストに入賞させていただきました。
--------------------------------------------------------------------------------
S O F T W A R E
--------------------------------------------------------------------------------
Windows95/98/Me/アミューズメント
●KIKU おど〜る
音楽CDをかけるとキャラクターが踊ります
567:デフォルトの名無しさん
03/07/13 03:20
集合型にシフト演算子があったらなぁ
568:デフォルトの名無しさん
03/07/13 05:41
それは集合なのか?
569:デフォルトの名無しさん
03/07/13 12:46
ビットの集合です
570:ななしへたぐらま ◆XcB18Bks.Y
03/07/13 14:37
>>562
あの漫画の題名はトランプのそれとは無関係だそうです.
…じゃなくて,どうしてプログラミングを教えている学校の先生は
生徒の理解度を無視してこういう課題を出すのか理解に苦しみます.
とりあえず>561はじゃんけんゲームは作れますか?
571:561
03/07/14 00:38
>570
もちろん作れません
何かヒントでもいいんでおねがいします。
572:デフォルトの名無しさん
03/07/14 08:12
>>571
ゲームのルールをよく吟味して場にある有形、無形のものを列挙してみんさい
573:デフォルトの名無しさん
03/07/14 09:00
カードをとってくる関数と
勝敗を判定する関数と
手に持ったカードを表示する関数と
入力を受け付けてカードをとるか終了するか決める関数を書けばいい。
574:デフォルトの名無しさん
03/07/14 11:30
データ構造決めなきゃ片手落ち
575:デフォルトの名無しさん
03/07/14 13:50
綺麗なお姉さんのパイパンおま○こ生写真を発見!
URLリンク(plaza16.mbn.or.jp)
これはタマラン…(´Д`;)ハァハァ
576:561
03/07/14 14:05
>>573
関数が使っている教科書にあまり載ってないんで
何かいいサイトあったら教えてください
577:ななしへたぐらま ◆XcB18Bks.Y
03/07/14 14:46
>>571
簡単なゲームプログラムを解説したサイトか入門書を見つけてみて.
やりたい処理をプログラムというカタチにするというのは一番基本的な能力であり,
一つや二つのヒントで解決する問題ではありません.
でもこれさえクリアすればプログラミングは半分マスターしたようなものです.
578:デフォルトの名無しさん
03/07/14 16:06
ルール見たけど結構複雑。ま、そこまで要求してないのかもしれんが。
「無限デック使ってます」って言えばカードの残り考えなくてもすむかも。
(ハートのAが10枚出てきても知らんふり。)
579:山崎 渉
03/07/15 09:45
__∧_∧_
|( ^^ )| <寝るぽ(^^)
|\⌒⌒⌒\
\ |⌒⌒⌒~| 山崎渉
~ ̄ ̄ ̄ ̄
580:デフォルトの名無しさん
03/07/23 20:52
良スレ保守
581:デフォルトの名無しさん
03/07/24 18:19
Pascalの集合型と混同してるのかな。このプログラムは集合型は関係ないよ。
582:デフォルトの名無しさん
03/07/25 01:14
どのプログラム?
583:デフォルトの名無しさん
03/07/27 17:35
URLリンク(grape.astron.s.u-tokyo.ac.jp)
ここの練習1なんですが、どのように回答するのがスマートなんでしょうか。
学生番号用のソート手続きをもうひとつ加えて場合分けするのはあまりよくないような気がするんですが、
他に思い浮かばないんです。
584:デフォルトの名無しさん
03/07/27 21:04
比較用関数を複数作って関数ポインタで切り替えて使う。
585:デフォルトの名無しさん
03/07/27 21:06
ソート用の手続きをつくる。
引数は点数でソートするか学生番号でソートするかを示す。
「student_record」と「ソートの引数」を引数にとる関数をつくる。
返り値は点数か、学生番号。
この関数をつかってソートをつくる。
あんまり効率よくなさそうだけど。
586:デフォルトの名無しさん
03/07/27 21:45
function CompareTensu(var S1, S2: student_record): Boolean;
function CompareBango(var S1, S2: student_record): Boolean;
って比較する関数を適当に作って。
var
Compare: function(var S1, S2: student_record): Boolean;
begin
if 点数でやるなら then
Compare:=CompareTensu
else
Compare:=CompareBango;
あとはCompareで比較してソートで良いと思うよ。
end;
587:デフォルトの名無しさん
03/07/27 22:45
iアプリ作りたいんですけどどーしてよいか・・
作成講座ページ紹介してください。
あと質問なんですが、これだけでも作れますか?ブロック崩し(505対応版)
win98(HSPダウンロード済み)
588:デフォルトの名無しさん
03/07/27 22:51
iアプリはi-mode Javaでしょ。
HSPじゃ無理。
DoCoMo Net - 製品・サービス - i-mode - iアプリコンテンツの作成について
URLリンク(www.nttdocomo.co.jp)
589:583
03/07/27 23:14
なるほど。ありがとうございます。
>>585と>>586の手法は同じではないですよね。
かなり参考になりました。
ですが、585さんの
>ソート用の手続きをつくる。
>引数は点数でソートするか学生番号でソートするかを示す。
これを具体的にどうしたらよいのかぜんぜんわからないんです・・・
例題だと、
if student[i].score < student[j].score then begin
で点数で比較してますよね。
これを点数だけではなく番号でも比較できるにするためにはどうしたらいいのでしょうか。
590:デフォルトの名無しさん
03/07/27 23:29
procedure sort(x: ...);
...
if hoge(student[i], x) < hoge(student[j], x) then begin
って書いて、hogeも書く。
591:デフォルトの名無しさん
03/07/27 23:40
>>589
比較部分を関数にするだけだって
function CompareTensu(var S1, S2: student_record): Boolean;
begin
CompareTensu:=(S1.score < S2.score);
end;
function CompareBango(var S1, S2: student_record): Boolean;
begin
CompareBango:=(S1.id < S2.id);
end;
で>>586のようにCompareTensuとCompareBangoのどっちか使いたい方をCompare変数に入れる。
どっちの比較方法を使うかはコマンドラインオプションで切り替えたりすると良い。
例えば
Compare:=CompareTensu;
for I:=1 to ParamCount do
begin
if ParamStr(I)='/b' then
begin
Compare:=CompareBango;
Break;
end;
end;
でコマンドラインに/bを付ければCompareが番号で比較、付けなければ点数で比較になる。
あとは
if Compare(student[i], student[j]) thenに変えて終わり。
Delphiで動作確認済み
592:デフォルトの名無しさん
03/07/27 23:55
if (x = Tensu and student[i].score < student[j].score) or
(x = Bango and student[i].id < student[j].id) then begin
ってベタに書いてもいいし。
条件式を関数にまとめて
if x = Tensu then Result := student[i].score < student[j].score
else if x = Bango then Result := student[i].id < student[j].id
else Result := false;
とか。(case文忘れてしまったよ)
593:デフォルトの名無しさん
03/07/28 00:35
なるほどなるほど。
かなりよくわかりました!
ここは本当にすごい人が来るんですね。
驚きました。
594:デフォルトの名無しさん
03/07/28 00:47
すごくはないよ。基本的なことだし。
動的な関数を作りたいなと思って
Pascalの上で実現してしまったとかならすごいと思うけど。
595:デフォルトの名無しさん
03/07/30 12:17
Lazarusの落とし方知ってるひといますか?
596:デフォルトの名無しさん
03/07/30 14:39
「ハノイの塔」とやらの問題解決プログラムを教えて下さい。
本気で何がなにやら・・・。
597:デフォルトの名無しさん
03/07/31 10:50
procedure Hanoi(n: interger; from, to, via: hoge);
begin
if n = 1 then
.... from から to へ一枚写す
else begin
hanoi(n-1, from, via, to);
hanoi(1, from, to, via);
hanoi(n-1, via, to, from);
end
end;
598:596
03/07/31 21:32
どうもありがとうございます。
なんだかエラーが沢山出るんですけど、貼り付けるだけじゃ駄目なのでしょうか。。。
厨ですみません。
599:デフォルトの名無しさん
03/07/31 22:51
hogeと
.... from から to へ一枚写す
のところをきちんとかかないとダメ。
hogeを文字列にして
移動を表示するようにするとか。
writeln(from + 'から' + to + 'へ移動');
Pascalの細かいところ忘れたんで正しいかどうか解らないけど。
再帰するにはforwardとか要るような気もするな。
600:山崎 渉
03/08/02 02:15
(^^)
601:山崎 渉
03/08/15 16:21
(⌒V⌒)
│ ^ ^ │<これからも僕を応援して下さいね(^^)。
⊂| |つ
(_)(_) 山崎パン
602:デフォルトの名無しさん
03/08/18 22:47
たまにはageて質問を。
標準的なpascalで、basicでいう
cls;
locate(10,10);
print "OK?";
みたいなのは出来ますか?
603:デフォルトの名無しさん
03/08/18 23:26
page(output);10個のwriteln(output);10個のwrite(output,' ');
っていうのは後戻りできない上に上書きしてしまうから無理だな。
cursesみたいに1画面分の2次元配列を取ろうかともおもたけど、画面の大きさを取る方法はJIS-PASCALにはない。
処理系依存の機能を仮定しないと無理っぽい。
604:デフォルトの名無しさん
03/08/19 00:00
無理ですか。
あ、そっか。画面の大きさが分からないから、
1ページ分書き直してスクロールアップ
するのも無理だ。うーむ。
605:デフォルトの名無しさん
03/08/19 08:47
プログラムパラメタに画面の大きさを渡してもらえばいいんだった。
program curses(input, output, ScreenWidth, ScreenHeight);
var
ScreenWidth: integer;
ScreenHeight: integer;
Screen: packed array[1..256, 1..256] of char; {こんだけあったら大抵間に合うでしょ}
procedure cls;
procedure locate(x: integer; y: integer);
procedure print(packed array[u..v] of char);
procedure reprint;
ってどう?
606:デフォルトの名無しさん
03/08/19 12:55
そういう手もあるか。
でも、画面の大きさを取得するのに、処理系毎の
工夫が必要。つーか、無理な場合もありそうな予感。
それよりも、独自に拡張して、cls, locateなどを
処理系毎に作るのが良いような気がしてきた。
・・・でも、それやってると、キリがないし、
実力の範囲を超えそうです。
607:デフォルトの名無しさん
03/08/19 21:10
画面制御ライブラリを1つだけ用意する。
実体は各処理系に移植されたC言語のcursesライブラリを呼び出すだけ。
外部ライブラリの実装方法に規格上、規定はないのでやりたい放題。
cursesが移植されていない処理系はライブラリの仕様を公開してユーザーに任す。
というのは駄目?
608:デフォルトの名無しさん
03/08/22 00:10
標準的なPascalの文字変数ってstring[255]ですよね?
で、var s:string[255]; という状態で、
1行ずつreadln(f,s); で読んでいくとして。
もしも1行の長さが255バイト以上だったら、
どうなるんでしょう。
アホな質問ですみません。
609:デフォルトの名無しさん
03/08/23 00:26
後ろの方がカットされます。
610:デフォルトの名無しさん
03/08/23 05:32
1行が255バイト以上の行を含むテキストファイルの読み込みは、
どうしたら良いのでしょう?
611:デフォルトの名無しさん
03/08/23 05:53
DelphiでもFreePascalでも、大抵は長い文字列を持ってるんじゃないかな…。
無いならChar単位で読むとか。
612:デフォルトの名無しさん
03/08/23 09:49
初心者質問ですいません。
Dev-pascalはどうやってアンインストールするのでしょうか?
リードミーに載ってないんですが・・・。
613:デフォルトの名無しさん
03/08/23 10:28
>>610
var
f: text;
s: string[255];
begin
while not eoln(f) do
read(f, s);
readln(f);
end
614:610
03/08/23 22:26
>>611
Delphiの無限とも言える長さの文字列は、
便利で良いですねぇ。しかも、CommaTextで
自動的にCSVを切り分けてくれるし。(日本語対応で)
でも、今はちょっと長い文字列は無理みたい。
というか、やりたいのはCSVの読み込みなんですけど、
ひょっとしたら1行を一度に読み込むんじゃなくて、
1文字ずつ分析して、項目を切り分けながら
読み込む方が良いのかな?
ひょっとして、アルゴリズムって、公開されてる?
615: ◆R/rLuLKeEI
03/08/27 02:02
>>614
>ひょっとして、アルゴリズムって、公開されてる?
理論的には有限オートマトン、正規表現、字句解析、構文解析などを検索すれば、いいんじゃないかな。
CSV形式をうまく構文(文法)に書き下す事が出来れば、ある程度形式的にプログラムに落す方法があるよ。
616:デフォルトの名無しさん
03/08/27 02:10
>>614
C#のでよければ。なんとなくは分かると思うよ。
URLリンク(onigiri.s3.xrea.com:8080)
617: ◆R/rLuLKeEI
03/08/27 02:44
>>616
そだね、CSVごときに有限オートマトンとか大袈裟だったな。
で、これは日本語対応?
618:デフォルトの名無しさん
03/08/27 03:15
C#に日本語非対応なコードなど無い。
619:デフォルトの名無しさん
03/08/27 04:41
無知の知ったか。
620:デフォルトの名無しさん
03/08/27 09:04
>>602
ANSIエスケープシーケンスを使う
621:610
03/08/27 10:13
>>620
おおっ!忘れていたが、何か画期的なアイデアに思える。(w
と、思ったが、調べてみたらこう書いてあった。
>どの文字列をエスケープシークエンスとして解釈するかは
>ソフトウェアによって千差万別であり、統一された規格の
>ようなものが存在するわけではない。
(T^T)
>>615,616
ありがとうございます。それをきっかけに調べてみます。
622: ◆R/rLuLKeEI
03/08/29 00:54
>どの文字列をエスケープシークエンスとして解釈するかは
>ソフトウェアによって千差万別であり、統一された規格の
>ようなものが存在するわけではない。
なのに、「ANSI【アメリカ規格協会】」を冠しているのが不思議。
623:620
03/08/29 07:37
「ANSIエスケープシーケンス」は>>602へのコメントだよ。
0x1b(ESC)で始まる文字列をコンソールに送ることで
画面、コンソールの位置、文字の色等を制御するもの。
624:デフォルトの名無しさん
03/08/29 07:39
>>623
s/コンソールの位置/カーソルの位置/
625:610
03/08/29 10:52
一応、CSVを切り分けられるコードは書けた。
C#の>616のコードは読めなかったので、
適当に考えてやってみた。だけど、""→"に
するのとか、漢字コードのチェックとか
やってないし、変なCSVを回避するのも
できないし、拡張性が無いコードになって
しまっている。
626:デフォルトの名無しさん
03/08/29 12:26
Delphiのコンパイラ使おうぜ。
627:デフォルトの名無しさん
03/08/29 19:24
>>622
ANSIエスケープシーケンスも知らないコテハンか。
時代だな。
628: ◆R/rLuLKeEI
03/08/30 03:46
>>627
>ANSIエスケープシーケンスも知らないコテハンか。
>時代だな。
時代ですね。
ANSIエスケープシーケンスは全く知らないわけでもない。
しかし、ここ何年も直接記述したことがないので、すっかり忘れてた。
>>602
Cマガジン1992/5, p.36, Table7(古っ!)によると、全画面消去のESC[2Jとカーソル位置指定のESC[m;nHは当時のどのPCでも共通のようだ。
MINIX本第2版図3-36やhtermでもこの二つは共通でした。
しかし、psterm-fast端末のカーソル位置指定は0x4m;n;などと全然違っていたりする(linuxのtermcapより)。
と、慌てて調べても後の祭。
629:610
03/08/30 07:35
Cのソースを見ながら、CSV切り分け書いてるんだけど。
Cだとbreak,continueとかで、loopを跳んだり、
文をキャンセルするので、全然参考にならん。
630:デフォルトの名無しさん
03/08/30 14:09
同じように書けば良いじゃん。
631:610
03/08/30 16:21
無理じゃん。
break, continueが使えるか使えないかで、全然変わるよ。
とりあえず、フラグを追加して、似たような動作を確保。
""→"にするのも出来たし、"なし文字列のスペースを
取り除くのも出来た。変なCSVでなければ、概ね基準通り
切り分けられるようになった。
632:デフォルトの名無しさん
03/08/30 16:40
>>631
えっ…
ひょっとして、DelphiやFreePascalにあるSystem.Breakは、独自拡張!?
633:610
03/08/30 17:13
>>632
知らなかったのか低能(ワラ
634: ◆R/rLuLKeEI
03/08/30 18:31
>>631
>無理じゃん。
>break, continueが使えるか使えないかで、全然変わるよ。
break文、continue文はラベル無しgoto文といわれるように、これらは等価なラベル有りgoto文に変換可能です。
>>632
DelphiやFreePascalのBreak、Continueが手続きであることの方が吃驚!
知らなかった私も低脳かえ?
635:610
03/08/30 20:04
>633は別人だが。
>>634
もちろん、goto文を使うことも考えたけど、
なんか邪道っぽくない?
ちなみに、うちのはTHINK Pascal。
636: ◆R/rLuLKeEI
03/08/30 22:06
>>635
PASCALで大域ジャンプ以外にgotoを使うのは邪道っぽい。
ちなみに、うちのはGNU Pascal。
ただし、JIS-PASCAL(X3008-1990)の範囲内で考えている。
637:610
03/08/30 22:25
macの場合、NewHandleやNewPointerでメモリーを
確保した場合、メモリー確保に失敗したら
OSErrで分かるんだけど。
標準pascalのnewでメモリー確保に失敗したら
どうなるの?というか、その判別方法は?
638: ◆R/rLuLKeEI
03/08/30 23:06
>>637
>標準pascalのnewでメモリー確保に失敗したら
>どうなるの?というか、その判別方法は?
JIS-PASCAL(X3008-1990)には何の記述もない。
必ず成功するかのようにも読める。
というわけで、その判別方法はない。
1.2 規定外事項
(1) 特定のデータ処理システム又は処理系が処理できるプログラム及び
データの大きさ又は複雑さの限界並びにそれらの限界を超えた場合の措置。
639:デフォルトの名無しさん
03/09/01 02:23
>635
・continue はループの先頭に戻る
・breakはループを脱出
でいいの?
だったらTHINK Pascalでは
・ループ(for,while,repeat)の先頭に戻る → cycle
・ループ脱出 → leave
だけど。
他に関数・手続きからの脱出 → exit(関数/手続き名)
というのもある。入れ子になった関数/手続きから一気に抜ける事も出来る。
640: ◆R/rLuLKeEI
03/09/01 04:25
・continue はループの最後に飛びます(C++第2版リファレンスマニュアルr.6.6.2)
641:610
03/09/01 13:34
>>639
ほんとだ・・・あった・・・。サンクス
標準Pascalの本を見ながらやってたので、気づかなかった。
THINK Pacal入門の後ろの方に、ちらっと載ってた。
あとこれでCとの違いといえば、case文の挙動が
ちょっと違う事くらいか。
642:デフォルトの名無しさん
03/09/12 12:33
例えば、'tarou'と入力させて、
tarouという名前の変数か、
tarouという添え字の配列を作って、
tarou[rika]:=100;
とか代入するには、どうすればいい?
643:デフォルトの名無しさん
03/09/12 13:11
できません。
644:デフォルトの名無しさん
03/09/12 16:25
じゃあ、tensuuは固定の名前で、
name:='tarou';
kamoku:='rika'
tensuu[name,kamoku]:=100;
kamoku:='eigo'
tensuu[name,kamoku]:=90;
とかは?
645:デフォルトの名無しさん
03/09/12 16:47
連想配列かあ。純粋なPascalじゃ無理かもね。
拡張構文使っていいならやりようはあるけど。
646:デフォルトの名無しさん
03/09/12 19:06
そうそう。連想配列。無理か・・・。
似たようなことは出来ない?
つまり、プログラム自体は一定で、
データの構造次第で変数を増やしたり
減らしたり、参照したり、したい。
いっそ、独自のスクリプト言語を
Pascalで作る方法を考えた方がいいか・・・。
647:デフォルトの名無しさん
03/09/12 21:07
連想配列そのものじゃなくても
type Tensuu = record Name, Kamoku: string; Tensuu: Integer end; の配列かリンクリストでいいのでは?
SetTensuu(list, name, kamoku, 90); みたいに使えるアクセサ関数を用意しとけば不便ってこともないでしょ。
Delphiなら、配列プロパティとかカスタムバリアントで構文上連想配列作れるけど
648:デフォルトの名無しさん
03/09/13 01:42
ここは「Pascal の初心者」なので、Delphi 等の拡張 Pascal は外すべきでは?
で、純正 PASCAL には「連想配列」はありません。
配列の引数として許されるのは列挙可能な型のみです。列挙不可能な数学的実数を表現している実数型も使用できません。
だいたい、純正 Pascal には文字列型すらないんだし....
連想配列を実現するコードを自分で書くことになります。
それを使って
647 さんの
>Delphiなら、配列プロパティとかカスタムバリアントで構文上連想配列作れるけど
ってことを実現することができるでしょう。
649:デフォルトの名無しさん
03/09/13 08:59
Delphiで言うところの動的配列も、標準では無いですよね?
var hairetu: array [0..maxNum] of integer;
の maxNumが変数であるのは許されないもんね。
まあ、この程度ならリストで代用できるから良いけど。
BasicでいうDIM文が懐かしい・・・。
>>648
>連想配列を実現するコードを自分で書くことになります。
どこかに、転がってないでしょうか。
"pascal 連想配列"でググッても、rubyやPHPが出てくる。
それと、連想配列って英語ではなんて言うの?
650:デフォルトの名無しさん
03/09/13 09:45
あそしえーしょんあれい。
651:デフォルトの名無しさん
03/09/13 14:52
久しぶりにTHINK Pascalのマニュアルを引っぱり出したが。
associtation arrayは載ってない。当然か・・・。
探していたら、こんなのを見つけた。
PASCAL ファンのための CGI プラットフォーム 「Reims」
URLリンク(member.nifty.ne.jp)
こいつの言語仕様を参考に、associationやlongstringが
標準のPascalでも使えるようなルーチンを作るか。
・・・って、自分にできるか?(^^;
もっと偉い人が作った奴、どっかに落ちてないかなぁ。
652:デフォルトの名無しさん
03/09/14 11:18
PNL Librariesに、連想配列のコードがあった。
だけど、これはMacの、しかもコードウォーリアー用みたい。
少し書き換えればTHINK Pascalでもいけるみたいだけど。
スレ違いになりそうです。失礼しました。
653:デフォルトの名無しさん
03/09/16 03:26
THINK Pascal / Mac でやっているの?
連想配列って、やってることはデータベース検索なんだから、
type
Item = record key : string; val : integer end;
Items = array[1.1000] of Item;
みたいにして
for Ind = 1 to 1000 do Items[Ind].Key = SearchKey then
のように一致したキーを探すことになる。
毎回、全数検査すると遅くなるからハッシュを使うとか、速度向上の手法はいくらでもあるけど、本質は検索だ
654:652
03/09/16 20:04
まだソースをざっと見ている段階ですけど、
結構高度なことをやっている様子。
追加、削除、検索など、一通りのルーチンは
揃っているみたい。使い方を解析せねば。
655:レイホウ@6歳
03/09/24 22:35
処理速度を犠牲にしてもいいなら
for($i = 0; $i < @mob; $i++){
next if ($mob[$i] eq ""); ←何も無かったら次いく
$mobname[$i] = $stuff[2] if ($stuff[1] eq $mob[$i]);
last if ($stuff[1] eq $mob[$i]); ←見つかったら終了
}
これと同じ事をすればいい(↑はperlだけどな)
perlとしては↑間違ってる
えいめ〜ん
656:デフォルトの名無しさん
03/10/14 04:20
3つの整数を読み込み、最小値と最大値を出力するプログラムを作りなさい。
657:デフォルトの名無しさん
03/10/14 09:28
>656
宿題?
658:デフォルトの名無しさん
03/10/14 09:32
最初に
整数を三つ読み込む。
次に
最小値を見つける。そして出力。
最後に
最大値を見つけ、それを出力。
簡単でしょ
659:デフォルトの名無しさん
03/10/14 12:29
こういうのをわざと、ObjectPascal使ってやったりしてな。
660:デフォルトの名無しさん
03/10/14 17:02
あ、そろそろ後期の授業が始まったわけか。
661:でたらめ
03/10/14 18:27
program test3;
var
a, b, c, max, min: integer;
begin
read(a);
max := a;
min := a;
read(b);
if b > max then
max := b;
if b < min then
min := b;
read(c);
if c > max then
max := c;
if c < min then
min := c;
writeln('max', max);
writeln('min', min);
end.
662:デフォルトの名無しさん
03/10/16 01:29
program maxandmin; (* IF無しバージョン *)
var
a, b, c, max, min : integer;
function sgn(si : integer) : integer;
begin
if si < 0 then sgn := -1 else if si = 0 then sgn := 0 else if si > 0 then sgn := 1;
end;
begin
read(a); read(b); read(c);
case sgn(a - b) of
-1, 0 : case sgn(b - c) of
-1, 0 : begin min := a; max := c; end;
1 : case sgn(a - c) of
- 1, 0 : begin min := a; max := b; end;
1 : begin min := c; max := b; end;
end;
end;
1 : case sgn(b - c) of
-1, 0 : case sgn(a - c) of
-1, 0 : begin min := b; max := c; end;
1 : begin min := b; max := a; end;
end;
1 : begin min := c; max := a; end;
end;
end;
writeln('max=', max);
writeln('min=', min);
end.
663:662
03/10/16 01:30
あ、sgn に if文を使っているんだっけ。
664:でたらめ
03/10/16 21:41
function sgn (si: integer): integer;
begin
case si of
0:
si := 0;
otherwise
begin
sgn := si div abs(si);
end;
end;
end;
665:でたらめ
03/10/16 21:42
あ。begin, end 一個余分だ。
function sgn (si: integer): integer;
begin
case si of
0:
si := 0;
otherwise
sgn := si div abs(si);
end;
end;
666:でたらめ
03/10/17 10:56
program MaxMinX; (* ObjectPascal ver. *)
type
MMXtype = object
vmax, vmin: integer;
procedure init;
procedure setValue (val: integer);
function max: integer;
function min: integer;
end;
procedure MMXtype.init;
begin
vmax := -32768;vmin := 32767;
end;
procedure MMXtype.setValue (val: integer);
begin
if val > vmax then vmax := val;
if val < vmin then vmin := val;
end;
function MMXtype.max: integer;
begin max := vmax; end;
function MMXtype.min: integer;
begin min := vmin; end;
var MMX: MMXtype;a, i: integer;
begin
new(MMX);
MMX.init;
for i := 1 to 3 do
begin read(a); MMX.setValue(a); end;
writeln('max=', MMX.max);
writeln('min=', MMX.min);
end.
667:662
03/10/17 18:42
program test(input, output); (* 今度こそIF無しバージョン *)
Type TChoice = function(a, b : integer) : integer;
var
Func : array[boolean] of TChoice;
a, b, c : integer;
function First(a, b : integer) : integer;
begin First := a; end;
function Second(a, b : integer) : integer;
begin Second := b; end;
function fmax(a, b : integer) : integer;
begin fmax := Func[a >= b](a,b); end;
function fmin(a, b : integer) : integer;
begin fmin := Func[a <= b](a,b); end;
begin
Func[false] := Second; Func[true] := First;
read(a); read(b); read(c);
writeln('min=', fmin(fmin(a, b), c));
writeln('max=', fmax(fmax(a, b), c));
end.
668:でたらめ
03/10/17 19:08
>>667
発想がすごい!
けど、うちの環境(THINK Pascal)だと、
2行目が通らないっす・・・
669:622
03/10/17 20:32
>>668
あ、関数型(手続き型の方が分かりが良いかな)って
標準Pascal仕様じゃなかったんですね。ちなみにDelphi
では通りました。
670:でたらめ
03/10/18 03:13
program MMX;
var
a, b, c: integer;
begin
read(a); read(b); read(c);
writeln('max=', ((((a + b) + abs(a - b)) div 2 + c) + abs(((a + b) + abs(a - b)) div 2 - c)) div 2);
writeln('min=', ((((a + b) - abs(a - b)) div 2 + c) - abs(((a + b) - abs(a - b)) div 2 - c)) div 2);
end.
671:デフォルトの名無しさん
03/10/18 17:14
>>656
読み込んでソートして一番上と一番下を見る
672:662
03/10/21 18:45
>>670
あ、なるほど。2変数のやつをもう一度繰り返せば3変数
に対応出来ますね。私は「一度に3変数に対応出来ない
か」と考えていました。
673:でたらめ
03/10/22 00:22
>>672
でもこれって、>667の
>writeln('min=', fmin(fmin(a, b), c));
>writeln('max=', fmax(fmax(a, b), c));
の派生みたいな物ですよ。
ただ、公式にあてはめただけです。
674:でたらめ
03/10/22 00:25
他にも、
const
maxint = 32767;
minint = -32768;
var
index: array[minint..maxint] of boolean;
を使う方法も考えたけど、
メモリーが足りない(?)とかで
配列が確保できずに断念したっス。
675:662
03/10/25 15:23
>>673
2変数での公式と>>667のやつを組み合わせることを
思いつかなかったんです。思いついてさえいたら、先
に書いていたのに...
676:デフォルトの名無しさん
03/10/31 01:49
質問いいですか?
一クラス分の身長を実数型で入力し、最高と最低を求めるプログラムを作成せよ。
さらに示された入力データでトレース表を書きなさい。
(A)最初に人数を入力し、人数分の処理をする場合(for)
(B)身長に0が入力されたら、終了する場合(while)
実行結果例
人数 制御変数 身長 最高 最低
6 1 178
2 165 165.0
3 197 197.0
4 168
5 175
6 183
こんな問題です。
特に、入力された人数分を変数に入れる方法と、トレース表に出力する方法が分かりません。
677:デフォルトの名無しさん
03/10/31 03:33
>>676
小学校の宿題か?
678:662
03/10/31 05:22
>>676
配列とか知っているか?
それとなんでその問題で「実数型」にする必要があるんだ?
実数型だと比較が難しいぞ。
679:デフォルトの名無しさん
03/10/31 08:01
>>678
問題が実数型で入力せよとなっているので・・・。
配列はあやふやです・・・。
680:でたらめ
03/10/31 08:40
3つの最大・最小の次は、この課題ですか。ふふーん
じゃあ、どうしよっかなー
681:でたらめ
03/10/31 08:44
(A)みたいなのは、BasicだとDIM文とかで
配列を宣言すれば無駄がないけど、Pascal
はできないもんね。
(B)も(A)もそうだけど、人数の最大が決まっ
てるか決まってないかで、全然変わるけど。
その辺は、どうなんだろうね?
682:デフォルトの名無しさん
03/10/31 11:46
がんばって考えてみたけどエラーが出ます。どこを改良すればいいですか?
var i,n,max,min :integer;
sin:array[1..100] of integer;
begin
write('人数は?');
readln(n);
for i:=1 to n do
begin
writeln(i,'人目の身長を入力してください');
readln(sin[i]);
end;
max:=sin[1];
min:=sin[1];
for i:=2 to n do
begin
IF sin[i]>max then max:=sin[i];
IF sin[i]<min then min:=sin[i];
end;
writeln('人数 制御変数 身長 最高 最低 ');
writeln(n);
for i:=1 to n do
begin
write(' ',i,' ', sin[i] );
IF sin[i]:=max then
write(' ',sin[i]);
IF sin[i]:=min then
write(' ',sin[i]);
end;
end.
683:でたらめ
03/10/31 17:01
>>682
ほとんどできてるじゃん。
>IF sin[i]:=max then
>write(' ',sin[i]);
>IF sin[i]:=min then
>write(' ',sin[i]);
ここ、「:=」じゃなくて「=」だ。
それと、この次に、
writeln;
の1行を入れる必要がある。
684:662
03/10/31 18:34
>>682
実数型を使っていないけど、いいのか?
それとトレース表の人数のあとに改行が入っているけど
それも問題無し?
685:でたらめ
03/10/31 19:10
>>684
そやな、ごもっとも。(w
でも、例とは違ってもええんちゃう?
それ言い始めると、「最低」の数字の
表示位置がずれてる気がするけど。
686:でたらめ
03/10/31 21:16
ところで。私も詳しく知らないんだが。
実数型って比較が難しいの?
687:662
03/11/01 09:12
>>685
おお、表示位置のずれは気づかなかった。という
ことで、そこも直す必要があるぞ。>>682
>>686
10進と2進の変換誤差(浮動小数点の場合)と計
算誤差があるから、等号比較だと偽になる場合
が考えられる。あと、有効桁数の問題も気にとめ
ておく必要が出る場合もあるし。
まあ、今回みたいに変数に入れた物を代入する
場合なんかは等号比較が出来る場合が多いけ
ど、代入を計算と見なした場合は一度倍精度に
してから単精度に戻すなどの処理が入って値が
変わる可能性があることを頭に入れておいた方
が破綻しづらくなります。
と言うことで私は整数型で実装出来るものは整数
型で実装するようにしています。
688:でたらめ
03/11/01 10:59
>>687
そうか。誤差か。普段そこまでシビアな計算って
したことないんで、気にしなかった。
うちも整数型がほとんどです。
今回の場合、まさか身長で小数点以下2桁以上が
必要になることはないので。入力した数値を
×10して整数型で保存・計算。表示の時に
÷10して実数型(例だと下一桁)っぽく
表示するのではあかんのやろか。
この処理、逆に面倒?誤差が大きくなる?
689:662
03/11/01 11:44
>>688
私もその方が良いと思ったので「実数型にする必要があ
るんだ?」と聞いたんだけど... でも「問題が実数型で入力
せよ」という事らしいから、実数型にする必要があるみた
いですね。
それとも「入力が実数型」を受け付けると言うことだけで
良いのなら内部は整数で扱う方がプログラム的には楽
ですね。
計算することを考えるのなら、小数点以下2桁くらい取っ
ておいた方が安全かも。
690:でたらめ
03/11/01 13:19
実数型で入力し・・・そうか!!やっぱり
入力さえ実数型なら、ええんちゃう?
処理まで実数型とは書いてないもんな。
>>682
考えることは同じやね。うちも最初は小数点以下
2桁と思ったけど、例が下1桁だったので、表示
するときの手間を考えて下1桁って書いてた。
そんなわけで。>682は、課題完了だな。
691:682
03/11/01 23:35
レス有難うございます!!
あとですね、>>676のwhile文のほうがあって身長に0を入力した場合に入力が終わるプログラムなんだけど、
そうすると出力のときに身長に0が出てしまうんですよ。どうすればいいですか?
692:でたらめ
03/11/02 00:30
>>691
forとwhileの基本的な違いではないか。
それを考えるのが課題のポイントじゃ。
693:でたらめ
03/11/02 11:26
for 1〜2回
入力 1〜2回繰り返し
戻る
repeat
入力 1〜2回繰り返し、3回目に0を入力
0以外は戻る
最後の入力は無効
で、ええんちゃうか。
そうすると問題は、のっけから0を入力された
場合のエラーセーフだけど。ま、やってみそ。
694:デフォルトの名無しさん
03/11/02 23:35
if文は使ったらいけないのヵ
begin
一つ目を入力;
while i>0 do begin
出力;
入力;
end;
end.
たぶん不合格。
ん?0を「入力した」場合に「入力が」終わる?
695:でたらめ
03/11/03 00:44
あ。すまぬ。>693は何か勘違いして書いてるかもしれん。
そか。repeatはuntilで、whileは違うか。
ま、気にするな。(w
696:でたらめ
03/11/03 00:51
罪滅ぼしに、ちょっとヒントを。
var next:boolean;
...
next:=true;
while next do
begin
入力
if a=0 then next:=false;
その他のチェック
end;
697:デフォルトの名無しさん
03/11/03 01:44
なんだその変なコード。
698:でたらめ
03/11/03 02:31
>>697
まあ、でたらめっちゅー事で。気にするな。
よかったら、すばらしいサンプルを提示して
やってくだされ。
699:デフォルトの名無しさん
03/11/03 17:26
>>696
while true do で if 〜then break すればいいんじゃ?
700:でたらめ
03/11/03 18:13
>>699
前にも似たような話があったけど、
標準Pascalではbreakが使えないのよん。
701:でたらめ
03/11/03 18:13
と、思って>700を書いたが。私の勘違い?
702:デフォルトの名無しさん
03/11/03 19:01
1周目を必ず通すならrepeat使いなよ。
703:でたらめ
03/11/03 19:11
>>702
>676
704:デフォルトの名無しさん
03/11/03 20:04
ちょっくら問題作った奴に山嵐決めてくる。
705:662
03/11/03 23:08
ほんとだ、これは問題を作ったやつがバカ。
repeat - until を使った方が素直に組めるのに。
どうしてもwhileでやらなきゃならないのなら、入力
関数でも作って以下のようにするか...
function 身長入力関数(var 身長) : boolean;
begin 入力処理 end;
while 身長入力関数(身長) do
身長追加処理;
>>701
その通り、breakは無いです。元が教育用言語
だから、抜け道は作らないような構文になって
いるんですよね(caseのelse、otherwiseも無い)。
706:でたらめ
03/11/03 23:15
>>705
「課題」なんだから仕方ないよ。
Cだと、入力しつつ比較が出来るから、
関数を作る必要はないんだよね?確か。
breakが無いのはまだいいけど、
caseのotherwiseも標準にはないの?
これないと辛い。つーか、無理。
THINK Pascalはある。
707:662
03/11/04 00:21
>>706
いや、課題だからこそ変な制約を付けることなく作ら
せるのがよい。まあ、一定の方向に仕向けるためだ
ろうけど、それでプログラミング嫌いになったら教育
の価値無し。
otherwise(Delphiではelse)は無い。と言うかcase
を使う時点で出てくる要素は判っているはずだから、
全て列挙しろと言うことでしょう。otherwiseに入れら
れた処理を「あとで分類し直す」なんて事になったら
結構大変だというのは想像が付きそうだけど。
708:676
03/11/04 12:17
こんな強引な感じになりましたが一応例どおり動きました。
Program en9a(input,output);
var i,n :integer;
max,min :real;
sin:array[1..100] of integer;
begin
write('人数は?');
readln(n);
for i:=1 to n do
begin
writeln(i,'人目の身長を入力してください');
readln(sin[i]);
end;
max:=sin[1];
min:=sin[1];
writeln('人数 制御変数 身長 最高 最低 ');
writeln(n);
709:676
03/11/04 12:18
i:=1;
repeat
IF sin[i]>max then max:=sin[i];
IF sin[i]<min then min:=sin[i];
write(' ',i,' ', sin[i]);
IF sin[i]=max then write(' ',max:3:1);
IF sin[i]=min then write(' ',min:3:1);
writeln;
i:=i+1;
until i<>1;
for i:=2 to n do
begin
IF sin[i]>max then max:=sin[i];
IF sin[i]<min then min:=sin[i];
write(' ',i,' ', sin[i]);
IF sin[i]=max then write(' ',max:3:1);
IF sin[i]=min then write(' ',min:3:1);
writeln;
end;
end.
710:676 Bのほう
03/11/04 12:19
Program en9b(input,output);
var i,n :integer;
max,min :real;
sin:array[1..100] of integer;
begin
n:=1;
i:=1;
writeln(i,'人目の身長を入力してください');
readln(sin[i]);
while sin[i]<>0 do
begin
i:=i+1;
writeln(i,'人目の身長を入力してください');
readln(sin[i]);
n:=n+1;
end;
max:=sin[1];
min:=sin[1];
writeln('人数 制御変数 身長 最高 最低 ');
writeln(n-1);
711:676 Bのほう2
03/11/04 12:20
i:=1;
repeat
IF sin[i]>max then max:=sin[i];
IF sin[i]<min then min:=sin[i];
write(' ',i,' ', sin[i]);
IF sin[i]=max then write(' ',max:3:1);
IF sin[i]=min then write(' ',min:3:1);
writeln;
i:=i+1;
until i<>1;
for i:=2 to n-1 do
begin
IF sin[i]>max then max:=sin[i];
IF sin[i]<min then min:=sin[i];
write(' ',i,' ', sin[i]);
IF sin[i]=max then write(' ',max:3:1);
IF sin[i]=min then write(' ',min:3:1);
writeln;
end;
end.
712:でたらめ
03/11/04 13:11
あのー、sinの宣言を見ていると、
整数型なんですけど・・・
小数入力しても、小数点以下が
切られてない?
(試してないので分からんけど)
713:デフォルトの名無しさん
03/11/04 13:35
sinってのは正弦みたいでやだな。
714:デフォルトの名無しさん
03/11/04 17:40
右シフトさせるプログラムがどーしても
出来ない・・・・
715:デフォルトの名無しさん
03/11/04 18:13
表示位置のずれはまだ直っていないようだが... あと
ちゃんとコンパイルして実行して動くかどうか確認し
て(もしくは不明点が見つかって)からアップしてくれ。
おまえのソースを全てチェックするほど暇じゃないん
だ。そっちのソースを直すより自分で全て書いた方
が早そうだし。
>>714
環境(対象コンパイラ、機種、OS等)の必要情報が
判らないとコメント付けようがないぞ。
716:デフォルトの名無しさん
03/11/05 00:46
>>715
例どうりに動いたと書いてあるよ。
717:デフォルトの名無しさん
03/11/05 09:21
>>715
フリーパスカル CPAD win2K
718:デフォルトの名無しさん
03/11/05 18:37
>>716
とても例どうりに動くとは思えんが、本人がそう言っている
のならそれでいいや。
>>717
確かFreePascalはTurboPascalの構文が使えるんじゃな
かったでしたっけ?それならshrで行けます。下記参考。ち
なみに左シフトはshl。
var
a, b : byte;
begin
a := 8;
b := a shr 1; (* シフトしたいビット数 *)
writeln(a, ' ', b);
end.
719:デフォルトの名無しさん
03/11/05 20:02
>>718
なんか配列使えって
言われちゃったので配列で無理やり作ってみた。
program sifuto(input,uotput);
type
suuji = array[1..10] of char;
var
a : suuji;
x,y,n : integer;
begin
begin
write('10文字入力');
readln(a);
end;
write('いくつずらす?');
readln(x);
for y:= 11-x to 10 do
write(a[y]);
for n:=1 to 10-x do
write(a[n]);
writeln()
end.
720:デフォルトの名無しさん
03/11/05 20:11
今日配列使って作ったもう一個のヤツ
program sinnsuu(input,output);
type
suuji = array[1..4] of integer;
var
a : suuji;
c, ans : integer;
d : integer;
begin
Write('Decimal : ');
Read(d);
c := 0;
while d <> 0 do
begin
c := c + 1;
ans := d mod 2;
d := d div 2;
a[c]:=ans
end;
for c:= 4 downto 1 do
write(a[c]);
writeln()
end.
配列メンドイ
なんか中途半端に理解した。
721:デフォルトの名無しさん
03/11/05 20:20
>>720
0〜15の10進数しか変換できない。
722:718
03/11/05 22:26
>>719
俺、配列使えなんて一言も言ってないんだけど。
何か良く分かんない(理解出来ないやり取りの)
所に来てしまったようなので、落ち着くまでしばら
く黙っていることにする。
723:でたらめ
03/11/05 22:53
学校の課題なんでないかい?
配列使え、っていう。
724:718
03/11/05 23:51
>>723
課題は課題で良いんだけど、「他の人に分かって
もらう書き方」ってのがあると思うんだ。特にこうい
う場では。それと「自分で出来るだけ努力する」っ
てのも大事だし。
それをしないでソース垂れ流し(それもちょっと?の)
されるんで、もう私には理解不能。だからこの件
(と思われるもの)には黙ることにしました。
725:でたらめ
03/11/06 01:21
ところで。右シフトって何?
2で割ればいいんじゃないの?
726:デフォルトの名無しさん
03/11/06 21:54
>>725
マイナスの値を右シフトと2で割ることをしてみれば、
違いが分かると思う。それと、算術計算とビット操作
はやっぱり別の話だから。
727:でたらめ
03/11/06 23:03
マイナスか。それは考えなかった。
でも、ビット操作なんてアセンブラでも使わない
限り必要ないんじゃないかと思うけど。
Cならいざしらず、Pacalでは意味ないよねぇ。
課題じゃしょうがないけど。
728:デフォルトの名無しさん
03/11/06 23:16
>>727
だってグラフィックフォーマットとか通信プロトコルなんかで
「ビットで状態を表す」物って結構多いから、ビット操作がで
きないと辛い場合って結構あるよん。
そういう時までアセンブラを持ち出すのはちょっと大仰だと
思う。高級言語でサクサク組めた方が何倍もカンタン。
729:でたらめ
03/11/07 00:00
>>728
そうか。なるほど。
ビット操作はマックならtoolboxにあるので、
THINK Pascalでもコマンド一発。
730:デフォルトの名無しさん
03/11/11 16:54
a<>b<>c みたいなことをやらせるには どうしたらいいのでしょう… 配列を使った課題がT-T
731:デフォルトの名無しさん
03/11/11 19:50
a <> b and a <> c
732:デフォルトの名無しさん
03/11/11 19:59
>>730
a=cでもええのか?
>>731
b=cの可能性はあるな
そういう意味じゃない?
733:デフォルトの名無しさん
03/11/11 20:04
a <> b and a <> c and b <> c
等しくはならんが気休めにどうぞ。
734:デフォルトの名無しさん
03/11/11 22:03
andの方が優先度高い罠
735:デフォルトの名無しさん
03/11/12 02:04
そもそも、>730の課題は何がさせたいのだ?
aとbとcがいずれも異なる値であることを
確認すればいいの?
にしては、配列を使うって・・・意味不明。
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5391日前に更新/272 KB
担当:undef