1 :
デフォルトの名無しさん :
02/01/02 01:46
3 :
デフォルトの名無しさん :02/01/02 01:55
「Cをやったけど難しいので、やっぱりPascalからぼちぼちやるぅ」というのが いまいちわかりません。 Pascalは厨房用の言語なんですか?
5 :
デフォルトの名無しさん :02/01/02 02:04
>>3 C は高級言語と言いながら、実際はかなりハードウエアに近い中級言語です。
メモリー管理とか、ポインターとか、ややこしいことがいろいろあります。
Pascal はもともと教育用として設計されているので、変なことはコンパイラーがエラーとして検出します。
Cは、プログラマーが全知全能であるという仮定で設計されているので、よく知らない人が変なコードを書くとすぐに暴走します。
Pascalが教育用でかんたんって認識は現在だと当てはまらないでしょ。 ANSI Cは型チェック厳しいし。
>Cは、プログラマーが全知全能であるという仮定で設計されているので、 >よく知らない人が変なコードを書くとすぐに暴走します。 とか言っている人はPascalでもヤヴァイと思いますが?
8 :
デフォルトの名無しさん :02/01/02 02:19
例えばCでは、配列の境界を越えて、値を代入したりすることが平気でできます。 コンパイラーも、なんも文句も言いません。 Pascal では、決してこのようなことはさせません。
ねがったり 最近Delphi触り始めたんすけど、ObjectPascal? なるものが さっぱりでカナーリ気持ちわるひ 何か初心者本とか読むと 「文法を覚えなくてもアプリを作れるのがdelのいい所」 とか書いてるし。。。。。 もうね、
ちゅかbrcc32じゃダメなん? パスカールたん、、、(´д`;)
>>8 >例えばCでは、配列の境界を越えて、値を代入したりすることが平気でできます。
>コンパイラーも、なんも文句も言いません。
purifyくらい買えよ
12 :
デフォルトの名無しさん :02/01/02 02:26
13 :
デフォルトの名無しさん :02/01/02 02:28
それでは、最初の授業です。 program hello(output); (←セミコロン) begin writeln('Hello world !!'); (←セミコロン) end. (←ピリオド) これで、画面に、「Hello world !!」と出力することができます。
14 :
デフォルトの名無しさん :02/01/02 02:28
>>8 そういう機能ってTurboPascalでもあったけど、あれってPascal標準の
機能だったのかなぁ?
Cは「中級言語」ってよく言われるけど、C++とPascalだったら、
各種データ構造を扱えるC++の方が「高級」だよな。
15 :
デフォルトの名無しさん :02/01/02 02:29
Cは低水準言語です。
↑ こう言うツールの話しだす馬鹿が絶対現れるんだよね (^^;;
19 :
デフォルトの名無しさん :02/01/02 02:52
>>10 brcc32.exe はリソースコンパイラだけど・・・。
pascalがcに比べて教育用(入門用)に良い理由は 1、配列とポインタと文字列がしっかり区別されている 2、begin / end により比較やループネストをしすぎると行が長くなり 結果、自然に構造化するクセが身につく・・・場合がある 3、制御文が不親切=少なく、機能が貧弱 である為 表記方法に 自由度が少なくなり、結果、同じアルゴリズムなら似たコードと なり他人(教師が)読みやすい・・・・場合がある 4、宣言について厳格(関数の引数も同じでなければならない等)であり、 他の特性とあわせて、自由度が少ない = コーデングは自然に統一さ れる = 他人のコードでも読みやすく、Cのように コーデング規則の ようなのを別に作る必要がない 反面、Modura2/TurboPascal/Delphiでない素のpascalには分割コンパイル 出来ないという玩具レベルと言われる欠点がある。
とりあえず、円周率を求めるプログラムを書いてくれ
pascalは処理系を作る教育に良い、とされている、らしい。
>22 begin writeln(PI); end.
25 :
アライグマPasacal :02/01/02 20:54
ここでDev-Pascalをダウンロードすべし。
http://www.bloodshed.net/devpascal.html FreePascal(知っているよね)を内蔵した高度なIDEがFreeで手に入る。
ただしWin32環境専用。エディタはそのままでは日本語が文字化けするが
オプションでフォントを設定すれば問題ない(Terminalの14Pointがおすすめ)
Win2000あたりを使っているなら本家FreePascalをダウンロードするより。こちら
のほうがインストールが簡単で使えるエディタがあるのでいいかも。
ただしマニュアルが貧弱、FreePasalはTurboPasca完全互換&DelphiPascal一部互換
なので本家よりマニュアルをダウンロードして研究すべし。
英語が苦手な人はこちらのサイトで日本語訳が進行中。サイトを丸ごとコピーする
ツールなどを利用してダウンロードすべし。
http://home.interlink.or.jp/~ipfr_cat/index.html
26 :
アライグマPascal :02/01/02 21:00
現在、標準Pascalを使用して実用的なツールを開発している人は すくなく、また標準PascalひいてはTurboPascalを解説する書籍は ほとんど入手困難になりつつあるので、上記サイトの日本語訳は ありがたい。 非常にコンパクトなコンソールアプリが作れます。ぜひ試してみて ください。
28 :
デフォルトの名無しさん :02/01/02 22:06
Pascalといえば、Unitの循環参照エラーが未だによくわからない。 UnitAとUnitBがともに両者を参照する場合、 Uses節は、両者ともにimplemenntationのUses節を利用するとエラーを回避できると あるけど何故そうなるのか詳しい参照のルールを知りたいものです。
・相手にusesされていたらusesし返すことはできない。 ・interface部でusesしたらusesしたことになる。 ・implementation部でusesしてもusesしたことにならない。 と考えると分からない?
30 :
デフォルトの名無しさん :02/01/02 22:33
>>25 これもコンポーネントぽとりぺたりはサポートしてないのね(T_T)。残念。
それこそがdelphiの(唯一の(ぉ))アドバンテージなのにぃ。
難しいとは思うけど、del自体のコンポの仕掛は
体系だてて作られているわけだから、その体系をなぞれば
互換または類似のフリーソフトも作成可能と思われ。
最適化とかのマジックが必要な個所じゃないし。
…それとも 2way 特許のせいで、作れないの?
31 :
デフォルトの名無しさん :02/01/02 22:44
>>30 コンポーネントぽとりぺたりは”コードジェネレーター”でもいいはず
つまりもっといいものはできるはず
大体コンポーネントぽとりぺたりと言ってもそのあとはコードは
せこせこ書くわけだし
delphiの肝はDCC32のみ
delphiはコンパイル速度が速いしWWWのライブラリーは最強では?
あとWINAPIで組めば20kbyteで相当できる。
ところでdev-pascalダウンロードしてみたんだけど
サンプルがビルドできん....
なんかリソースエラーとかが出る。ぎょえっ。
ちなみにdelphiとかCとか入れてないマシンなんだけど
cygwinがいるのかなぁ?
32 :
アライグマPascal :02/01/02 22:46
>30
確かにマウスでGUIをつくれないけど、単純なWindow形式ソフトの
ひな形は作ってくれる。すごくシンプルだからコードガリガリ主義者
にはもってこいのはず。Pascal学習(構造化からOOPまで)に
もってこいと思うけどね。
>
http://www.vpascal.com/ かつて有償だったOS/2で有望視されていたDelphiPacal一部互換の
Pascalコンパイラ(フリーでゲット!!)
OS/2、Win32用があります。エディタが使えなかったので、
「1」のリンク先のCpadシリーズで、FreePascal用の利用してみるとよい。
33 :
アライグマPascal :02/01/02 22:52
>31 cygwinはいりません。必要なものはすべて圧縮ファイルに入っています。
34 :
デフォルトの名無しさん :02/01/02 22:53
delphi?っていうかPASCALってさ 変数の宣言文が分離してるよね、 コンパイラ側から見たらやっぱりどこでも宣言よりはいいんじゃないかなぁ。 あとこのことはインラインアセンブラとリンクさせやすいよね、 つまりアセンブリ言語にはCよりもPASCALのほうが近い begin endは{}でもいいと思うけれどもね、 レコード型とかクラス型がCだと->なのが.というのがよいと思う
Delphi/Kylixのフリーが出た以上 FreePascalやTP互換言語の役目は終わってる。 コンソールアプリ限定であってもDelphiやるのが良いと思う。 # なるべく人的リソースをBorlandに集めたいってのが本音なんだけどね。
36 :
アライグマPascal :02/01/02 23:13
>35 DelphiはVCLのもつ力を利用する処理系です。 VCLを利用しないならばDelphiを使う意味がほとんどありません。 言語学習が目的であったりとか、使用するマシンが非力であるとか。 コンソールアプリで十分な業務が遂行できるのなら、これらFreeコンパイラ は大変価値があると思います。 手になじむツールは人それぞれで、どれがベストなのかいろいろ試して みるのも良い勉強になるとおもっています。
{}よりもPythonちっくなほうが好きだなあ。 よく擬似コードでPascalちっくで、ブロックはインデントのみって あるじゃん。ああいう感じ。
38 :
アライグマPascal :02/01/02 23:47
{}はコメントだって。
>>34 >あとこのことはインラインアセンブラとリンクさせやすいよね、
>つまりアセンブリ言語にはCよりもPASCALのほうが近い
これはないだろ(^^
TPのinline を思い出して言ってるんじゃないか?
インラインアセンブラは「リンク」とは言わないだろ。 Cだってインラインアセンブラはあるだろ。 インラインアセンブラがあってもアセンブリ言語に近いとは言わないだろ。 と、3つほど突っ込みドコロを挙げてみる也
Win32APIのPASCAL呼び出し規約の話だったり
44 :
デフォルトの名無しさん :02/01/03 22:15
言語の学習にもってこいなのは、人にもよるが、ゲームのショートプログラム だとおもう。昔のベーマガやI/Oに載っていたBASICプログラムの移植を試みたいと 思っている。
45 :
デフォルトの名無しさん :02/01/04 12:44
今年からDelphiをはじめようと思い、やはり言語からと考えて
FreePascalを頂戴したんですけど、Pascalの解説サイトや本って少ないですね (T-T
丁度SDKをはじめた頃に一緒にC++を勉強したので、同じようになると思ったんだけどなぁ・・・
今はここを読んで統合環境からこちょちょしてます
http://homepage2.nifty.com/okamotoy/objpas/ 大学の生協とかに行けばいい本有るかな ^^
PASCALなんて今更やりたいと思わない。 Cが難しいって言うけど、一体何と比べて難しいの? ANSI Cの基礎の基礎で挫折するような奴は どんな言語やっても結局中途半端で終わると思うが・・・
47 :
デフォルトの名無しさん :02/01/04 12:52
c->pascalで引っかかりやすいのは、型を一度typedefしてからじゃないと 使えない場合があること、例えば int** i; は type pint = ^Integer; var i: ^pint; としなくてはいけない。
>>46 でもDelphiしたいなら必要じゃ無いですか?
僕の場合Cも++も理解したとは言い難いですけど ^^;;;
なんか36がmisleadしてるようだけど Delphiはコンソールアプリの開発をフルサポートしてるよ。 デバッガや文法の日本語のオンラインヘルプもあるし。 # 但しPascalとObject Pascalとの切り分けは一切ないけど。 >大学の生協とかに行けばいい本有るかな ^^ 大学の図書館に腐るほどあるでしょ。 いまどきあまり借りる人もいないだろうから入手は楽かも。 お勧めの良書は知らないけど、経験的にはずれも少なかったような。
>>48 まあ、Dephiが使いたいからって人はわかるんだけどね。
1は、
>「Cをやったけど難しいので、やっぱりPascalからぼちぼちやるぅ」という人向け。
って言ってるだろ。
それがちょっと理解できない。
Cが難しいからPASCALをやってみても、PASCALにもCとは違った意味で難しい点があるんだから
まずは我慢してCを続けるのが本筋。
なるほど、皆さん有難う。
>>50 は
>>1 に対する突っ込みだったんですね
それは同感です、どんな言語でも何処かで引っ掛かるのは同じですよね
良く分からないけど、今の学生さんって初めがJavaだったりするんだろうか ^^;
>>49 有難う。
近所の大学に潜入してみます ^^;;
#include <stdio.h>
int main(void)
{
FILE *fp;
fp = fopen("mona.txt","w");
if(fp == NULL){
printf("ファイルを開けねーぞ、ゴルア!\n");
return 1;
}else{
printf("思いの丈をブチマいちゃる!\n");
}
fputs("
>>1 \n",fp);
fputs("Pascalなんて糞言語。",fp);
fputs("逝ってよし!\n",fp);
fclose(fp);
return 0;
}
>45 いや、あの、Delphi6パーソナル素直にやればいいと思うよ インストールしてDemosのサンプルアプリ順に触ればいいじゃない
>>47 Turboなら i : ^type;で直接指定できたような記憶があるんですが。
>54 いや i:^^type; の事を言ってるんだと思うよ
56 :
デフォルトの名無しさん :02/01/04 15:00
delphi ならproがいいよ ソースがついてるから 追いかけたいユニットプロジェクトに追加しておけば トレースでどこまででも追いかけていける。 STL標準になったC++よりずっと理解し易いよ
57 :
デフォルトの名無しさん :02/01/04 15:16
岩波講座 ソフトウェア科学 アルゴリズムとデータ構造 石畑 清 に、 type list = ↑cell; cell = record element : datatype; next : list; end; の↑ってどーいう意味?
delphi pro personalなんてのがあればだけどね pascalコンパイラごときに何万も払えないよ。
59 :
デフォルトの名無しさん :02/01/04 15:23
>>57 ポインタ。
TurboPascalではこう書いてた。
type list = ^cell;
PC−8001用のパスカルコンパイラは、よいものだた。 160x100のモノクロの画像2枚を切りかえるだけなのに、当時厨房だたおれは、家に帰ってから(以下略)
61 :
アライグマPascal :02/01/04 21:32
>49 >>なんか36がmisleadしてるようだけど >>Delphiはコンソールアプリの開発をフルサポートしてるよ。 >>デバッガや文法の日本語のオンラインヘルプもあるし。 misleadの意味がわからないけど、スレッドの流れをおかしな方向へ 持っていっているという意味でしょうか? 自覚していないけど、もしそうならごめんなさい。 Delphiではコンソールアプリが開発できないと言ったということでしょうか? もしそれなら、私はそんなことは言っていません。 36で言いたかったことは、高度なGUIが必要としないなら、なにもDelphiを 使わなくても別のコンパイラで目的が達成することもできるということです。 486マシンであるとかRAMが8メガしかないといった化石パソコンでも、 言語学習マシンとして再利用することができるということです。
62 :
アライグマPascal :02/01/04 21:51
気分を害したらごめんなさい。 >50 >>>「Cをやったけど難しいので、やっぱりPascalからぼちぼちやるぅ」という人向け。 >って言ってるだろ。 >それがちょっと理解できない。 >Cが難しいからPASCALをやってみても、PASCALにもCとは違った意味で難しい点があるんだから >まずは我慢してCを続けるのが本筋。 「1」は、書いてある通りの思惑でスレッドを立てたのだから、それを そのまま受け止めてスレッドを展開すべきだと思う。 スレッド設定の理由そのものから批評すると、後のスレッドはどう展開 していくのか分からなくなると思います。 <この後、Cの学習についてスレッドを伸ばすわけにはいかないでしょうし> <学習する姿勢や心構えを論じるスレッドではなさそうですし・・・> Delphi云々を書かれている人が多数おられますが、「1」は >ちなみにDelphiは >「モナーの *やさしい* Delphi質問スレ」 というように別スレッドを参照して誘導しているので、それに 従うべきだと思います。
>>61 >>35 はコンソールアプリしか書かないとしても、Delphi/Kylixがいいよ
って言ってるのに
>>36 でコンソールアプリで十分ならFreeコンパイラは価値がある
(つまりコンソールアプリにはDelphiは向かないと読める)って言ってるのがmisleadなんでないの?
俺に言わせると、昔の文法を覚えて、簡単な例題をやってみるくらいじゃ、「言語学習」としてはサミシイ。
65 :
アライグマPascal :02/01/04 22:41
>
>>36 でコンソールアプリで十分ならFreeコンパイラは価値がある
>> (つまりコンソールアプリにはDelphiは向かないと読める)って言ってるのがmisleadなんでないの?
う〜ん。コンソールアプリにはDelphiは向かないというのなら、そのように書きますけど。
BBSではどうしても舌足らずな表現になりやすいので「裏読み」されやすい
表現は避けるようにしていたつもりですが・・・。
(仮に裏読みしてもそんな解釈になるのかしら???)
>俺に言わせると、昔の文法を覚えて、簡単な例題をやってみるくらいじゃ、「言語学習」としてはサミシイ。
最初は簡単な例題かもしれないけど、いずれCで蓄積されたアルゴリズム集の
Pascal移植に手を出すかもしれないじゃないですか(爆
63じゃないが、
>>36 はそう読んでも不思議はないと思う。
つーか、実際そういう印象を受けた。
Win95環境でもDCC32単独で使えば楽勝でしょう
>>61
さらに言えば、Dcc32のコンパイル速度は爆速 コンパイルはFreePascalの半分以下で終わり 出来上がるサイズもずっと小さかったと思うよ
コンソールアプリとDOSアプリを混同しているに1Byte.
FreePascalはマルチプラットフォームであることを忘れているに、1Penis
Pascal入門程度ならどのコンパイラ使ったって portableなコードしか書けないような...
Dev-Pascalの独自仕様かもしれないけど、ディレクトリ(フォルダ)名が 全角文字だとコンパイルエラーがでるみたい。みなさん気をつけて。
73 :
デフォルトの名無しさん :02/01/06 22:23
74 :
デフォルトの名無しさん :02/01/07 02:55
アマゾンでPASCALの良本一生懸命探したけど、あんまりないね。 Turbo PASCALとDelphiはいっぱいあるのだけど。 基本文法を解説してある入門書がほしいんだよな。
75 :
デフォルトの名無しさん :02/01/07 06:51
漏れも探してます。 標準関数(手続き)が載ったリファレンスが欲しい Delphi買ったので一通り変数型とかプリミティブなアルゴリズムなんかを コンソールでやろうと思うんだけど、関数が分からんからどうにも勝手が悪いです 近所の本屋さんには超初歩本しか無かったし 全部ShowMessageとInputBoxでやるのは悲しすぎる Del使いさんはどんな風にステップアプしましたか いきなりイベントごりごり書いたんだろうか
>>75 >Del使いさんはどんな風にステップアプしましたか
>>76 途中で送信してしまった。
で、漏れはTurbo Pascal 3.0当時に標準Pascal的なconsole baseの書き方を覚えた。
file型変数をAssignしてReset/Rewriteして云々、
表示はwriteln、入力はreadln...てな感じだよな。
今のDelphiでもconsole applicationにすれば使えるよね。
おお〜 考えてるのはそんな感じです
>>77 何かDCC32でIntToStrとかすると「ハァ??」って言われて鬱なんです
Turbo時代の本を探して買えば良いんですね
しかしネットはPascal本の情報少なすぎるです
リファレンスみたいなの買えば当たり外れ無いのかなー
>78 Delphi6ならヘルプ->ObjectPascal言語ガイド->標準ルーチンと入出力 を読めばよろしい IntToStrはSysUtilsユニットの関数であり、これらはVCLリファレンスにあります uses SysUtils; してる?
ObjectPascalってKeyword多いなー OOダカラカ・・ Cの方がシンプルじゃん (ー_ー
>80 そりゃそうでしょう。 pascalとcならpascalがシンプル DelphiとCならCがシンプル DelphiとC++ならDelphiがシンプル
>>81 >pascalとcならpascalがシンプル
どっちもどっちなんじゃ?
この二つじゃ。
>82 制御文や演算子の数ではpascalがシンプルだし 文字列や配列の扱いは マシンから見たらcがシンプルだけど人から見たらpascalがシンプル
>>83 制御構造だと
Pascal場合
if
case
for
while
repeat..until
Cの場合
if
for
switch
while
do..while
同じようなもんでしょ。
演算子はCの場合、配列とかポインタ関連もすべて演算子の
カテゴリに入ってるから仕様書をみると数が多いように見えるけど
実際に使用すると、Pascalに比べてとくに複雑と感じないし。
シンプルが簡素な意味だとしたら Cのfor文は簡素じゃないでしょ? while文にしてもpascalは論理型しか書けないけど cは数じゃない? コンパイラ側から見たら 全部が数ってのはシンプルかもしれないけど 型が区別されてる方が人間から見たらシンプルだと思うんだけどなあ それと cのreturn は文だけど pascalのexitは手続きで予約語じゃないとか まあ似たようなもんだけどさ
>>85 たとえばPascalのforだったら、私は使いはじめのころはどうして
順序型しかつかえないのか、どうしてグローバル変数は使えないのか、
疑問に思いましたし、
ずいぶん慣れてからも to と downto の使い分けで、ケアレスミスを
してました。
PascalとCがどちらがシンプルかってのは、まあ主観の問題ですね。
実際に問題、大差ないと思います。
87 :
デフォルトの名無しさん :02/01/07 23:01
だれか簡潔に説明してください。 FreePascalのマニュアルみていたら「Graphユニット」があって線を引いたり 円を描いたりできるみたいです。これってTurboPascalから引き継がれたユニット だと思う。 問題は「Graphユニットの初期化」ってやつ。 基礎的なことが分かりません。なぜ、このユニットだけは初期化という作業が 必要なのですか?またサンプルコードをみても「何でこんな常套句が必要なのか わからない」といったコードがあります。そもそも初期化って何???? それから「グラフポートをOpenしたらCloseせよ」って何? 文字色を変えたりするのは「Crtユニット」を使うわけで、そちらはサンプルを 見てもだいたい意味が分かるのですが・・・。
1. そういうものだ。気にするな。 2. 昔はハードウェア毎に異なる(デバイス)ドライバを,アプリケーション毎に読み込んでいたから。 DOS はグラフィックボードの管理はしないのだ。 3. 古いアーキテクチャで作られた物が,現代の人にとって易しいとは限らない。 古けりゃ簡単,ってことなら古文/漢文で苦しむ人はいないよな。
ハード屋さんとかマシン語の得意な人にはCの方がやさしいし BASICから入った人には文字列でつまずかないだけでもPascalの方がやさしい ・・・と思う
Graphユニットのサンプルをコピペしてdev-Pascalにてコンパイルしました。 エラーがでます。integerで宣言されるinitGraphで使用する変数を、shortintで 宣言するとエラーが消えてサンプルアプリができました。あとは少しずつ 手続きや関数を書き足して調べてみます。
91 :
デフォルトの名無しさん :02/01/10 01:00
FreePascalってのは起動時コンソールプログラムしか作れないのですか?
>>83 TurboPascal系はレジスタ渡しで関数呼べるのでPascalのほうがマシンよりでは?
>>87 なんでファイルをいちいちOpenしたりCloseしたりしなくてはならないのですか?
なんでFindFirstしたらFindCloseしないといけないのとか。
なんでAllocしたらFreeしないといけないのとか。
と似たようなものですな(w
>91 Windowプログラムもつくれますよ。
94 :
デフォルトの名無しさん :02/01/10 09:13
おい!
>>2 と
>>4 !!
貴様ら!!!!逝ってよしです。
ていうか、ム板にそんなもの貼ってうれしいんですか。
95 :
デフォルトの名無しさん :02/01/19 03:15
96 :
デフォルトの名無しさん :02/01/19 03:26
ところで今のDelphiのObjectPascalと、 Turbo Pascal 5.5 との互換性がどれぐらいあるのか、 誰か説明できる人いないかな?
97 :
デフォルトの名無しさん :02/01/19 03:27
ダウンロードしたけど、インストールの途中で先に進めません(死
>>96 Object PascalはTPのほぼスーパーセット。
ライブラリは除く。
>94 何これ?
100 :
デフォルトの名無しさん :02/01/19 17:06
インストールの途中で先に進めなくなるけど、シカトして、TPフォルダの中のEXEを実行したら、ちゃんとインストールされてました! コンパイル&実行までできました! あとはTurbo Pascalの本買ってこよ。 Pascal そのものの本はあんまりないけど、Turbo Pascal の本はいっぱいあるし。
>>93 そうなんですか。実行ファイルにcigwinがいるとかいわなそうだし
テンプレートそろえてエディターがRADのものがあれば
FreePascalのほうがdelphiよりよさそうですね、
要は一般的なサンプルが少なくて古典的なものばかりだということなんでしょうか
GUIアプリでGLUTあたりをかますものであれば大体なんでもできそう
エディターがRAD ってのがなんか無理めな話しのような・・・ Delphiは 実行時型情報と DLL にコンパイルして設計時にも動作するコンポーネントという概念 それをサポートするツールが組み合わさってRADになってるんだから
いったい何をどう評価すればFreePascal>>>Delphiになるんだ??
104 :
アライグマPascal :02/01/19 23:13
>101 くどいけど、Win32環境でのプログラミングならDev-Pascalを使った方が、 素のFreePascalを使うよりFreePascal&統合開発環境である関係上多少使いやすい とおもいます。 GUIのためにGTKをつかうひな形が用意されているのですが、GTKをまったく 知らないので私は使いこなせない状況です。
FreePascalってなんて読んでる?俺はフリッパー
106 :
デフォルトの名無しさん :02/01/22 00:52
Turbo Pascal の本はなんでめちゃめちゃ高いのが多いんだ。
>>105 俺はフリパ。
同じく、FreeBSDはフリビ、
でもFreeDOSはそのままフリードス。
108 :
デフォルトの名無しさん :02/01/31 20:00
アマゾンでTurbo Pascal の本を探した。 みんな7か6対応の本ばっかりで、5対応の本があんまりない。 漏れがダウンロードしたのは5だから、できれば5の本がいい。 それとも、7と5であんまり変わってないなら、7の本を買おうと思うが、そのへんどうなんでしょう。
オーム社「TURBO Pascal プログラミング」間野浩太郎監修、内田智史著 \3,600 は4までが対象だけど、これでは古すぎるかな
110 :
デフォルトの名無しさん :02/01/31 21:05
5.5からオブジェクト指向を搭載、って書いてあるので、たぶん、4と5.5はだいぶ違うと予想されるのですよ。 5.5と7の違いがよくわからん。
今調べたら、 「TURBO PASCAL 5.5 OOP GUIDE」BORLAND刊」 というのを見つけた。そうだ。ボーランドの本を使えばいいのだ。 まだ売ってるのかわからんが。
>>108 オブジェクト指向を使わないのなら、TP4-7は大して変わらないと思われ。
113 :
デフォルトの名無しさん :02/01/31 21:57
古本屋いけ。
115 :
デフォルトの名無しさん :02/01/31 23:45
パスカルの本買いたいけど、なんであんないバカ高いんだろ。 言語がフリーでも意味ないじゃん。 『Oh! Pascal!/Book and Pc/DOS Disk』 Doug Cooper (著); ペーパーバック 通常4〜14日以内に発送 価格: ¥9,093 『Turbo Pascal』 Elliot B. Koffman (著); ペーパーバック 通常4〜14日以内に発送 価格: ¥9,600 手数料: +¥960 『Using Turbo Pascal 6.0 - 7.0』 Julien Hennefeld (著); ペーパーバック 通常4〜14日以内に発送 価格: ¥10,260 手数料: +¥1,026 『Turbo Pascal』 Samuel L. Marateck (著); ペーパーバック 通常4〜14日以内に発送 価格: ¥14,467 『Turbo Pascal, an Introduction to the Art and Science of Programming (The Benjamin/Cummings Series in Structured Programming)』 Walter J. Savitch (著); ペーパーバック 通常4〜14日以内に発送 価格: ¥8,933 手数料: +¥894
>パスカルの本買いたいけど、なんであんないバカ高いんだろ。 これだけ読んで、 高いといっても5000から6000円程度だろ とレスを付けようとして続きをみてびっくり。 それぞれ1000ページくらいの大作なのだろう。
>>115 無理にメリケンの本を買おうとするから高いのであって
ニポーンの本で我慢(?)すればそこまで高くはないよ
じゃなくて、洋古書は売れないと高くなるの。 どの本も大昔の書籍だってこと、わかっているのかな? なぜ Delphi ではなく TurboPascal を求める?
119 :
デフォルトの名無しさん :02/02/02 00:00
だってDelphiなんて、GUIだとか余計なことがイパーイついてて本質が見えないじゃないか。
だからといって古いソフトを持ち出さなくても... 弘法筆を選ばず。本質が見える人は GUI がついていても道を見失うことはない。 初心者であれば手軽に手に入る,最新の道具で入門をしなされ。
TurboPascalの入門というかPascalをテーマにしたHPを作りたいのですがいいですか?
ようするに Delphiでも新規作成で その他->コンソールアプリケーションを選べば VCLによらない素のpascalで遊べます コンソールが不要な SDK方式でのGUI を作りたければ、 コンソールアプリを選んだ後 {$APPTYPE CONSOLE} を自分で削除すればいいのです
TP5.5は、統合環境がWin9xのDOSプロンプトでは動かないよね。 つまりデバッガを使いたければDOSモードへ行かねばならない。 これからPascalを始めようとする人には、あまり向いていないと思うよ。
>>122 作るのは貴方の勝手です。ご自由に・・・
126 :
デフォルトの名無しさん :02/02/04 08:00
>87 ふむふむ、確かにFreePascalでもGraphユニットやCtrユニットが用意されているね。 Turboとの互換を考慮してとおもうけど。 GraphDeviceあたりの型を、エラーを参考にShortInt型に書き換えるだけで、きちんと グラフィックが描ける。英語版のTP5.5をゲットしてDosプロンプトで動かすより、 こちらの方が簡単みたい。 >122 私もTPやFPをネタにコツコツとHPを作ってみようと思っています。
>>124 ガセ。正しく環境を作れば動く。
DPMI 関連の資料をよく読んで。
128 :
デフォルトの名無しさん :02/02/04 12:21
C:>US C:>TP : : C:>JP C:>EXIT
129 :
デフォルトの名無しさん :02/02/04 12:56
>128 USモードじゃ日本語つかえんぞゴラァ!
え?TP5.5 って、US のミュージアムから落とした物のこと? じゃしょうがない。US モードにするしかないだろ。
131 :
ふむふむ(納得) :02/02/04 13:48
英語版のTP5.5でも日本語はつかえるけど、GraphやCrtユニットは日本語対応じゃ ないので、日本語文字列はWriteLnなどの手続きでコンソール上に出力することしかできない。
>>127 今まで知らなかった。ご指摘ありがとう。
DOSプロンプトのプロパティで「必要に応じてMS-DOSモードを実行」を外したら動いた。
>>131 DirectVideo := False;
とすれば、Crtユニットによるテキスト出力がBIOS経由になるから、
DOS/V BIOSのおかげで、Writelnで日本語文字が出力できるようになるよ。
GraphユニットのOutTextでの日本語出力は、無理そうだね。
昔のPascalなんてコンパイル速度が速いだけしか取り柄が無いよ
Delphi6パーソナルを使った pascalのスタート教室 1) FILE-> 新規作成->その他->コンソールアプリケーションを選びます すると program Project1; {$APPTYPE CONSOLE} uses SysUtils; begin { TODO -oUser -cConsole Main : この下にコードを記述してください } end. とソースが表示されます program Project1; uses SysUtils; はボーランドによる拡張ですから取り去ってかまいません {$APPTYPE CONSOLE} も取り去ってかまいませんが、代わりにコンパイルオプションでコンソール アプリである事を指示する必要があります 結局、最初に書くアプリは これでいいでしょう {$APPTYPE CONSOLE} begin writeln('こんにちは'); readln; end. この2行を入力した後、F9 を押せば実行出来ます
135 :
ふむふむ(納得) :02/02/04 21:49
>132 ふむふむ、自分はまだGraphユニットとCrtユニットを完全に理解していなかった ようです。サンプルコードを希望します。 自分はPC-9800シリーズ用のTP6プロフェッショナル版をもっていますが、 引っ越しのどさくさでソフトはあれど、マニュアルをすべて無くしてしまったのです。 TP6のマニュアルに書かれていたクラスの概念はとても分かりやすかっただけに、 すご〜〜〜〜く、残念です。 だれかGraphユニットとCrtユニットの詳しい解説をサンプルを使って説明して くれませんか!!
さて、
>>134 の方法で作成した場合、ソースは dprの拡張子となっています。
Delphi IDEを使わない方法を説明します。
まず メモ帳でも好きなエディタでも、 ファイル名.pas としてファイルを作成し
begin
writeln('こんにちは');
end.
と3行入力し、保存して下さい。
コマンドラインから
DCC32 -CC ファイル名.pas として改行すれば
ファイル名.exeが作成されます
uses を使わない場合に使えるのは system unit の関数だけです uses SysUtils ;が 追加された状態では、abort; Ansi/Unicode文字列処理や時間などの関数が追加されます
コンソールアプリであっても、グラフィック画面を扱いたくなります Windowsの場合、コンソールにグラフィックを表示する事は出来ません。 そこで、別窓を出してグラフィックを出すか あるいは、BMPファイルを作成して後でビュアーで見るという方法が簡単です Delphiのフォーム機能をグラフィック画面としてコンソールアプリから使う方法を説明します
まずは、IDEからコンソールアプリを作成した直後 新規作成でフォームを作成して下さい そして以下のように入力して実行してみて下さい program Project1; {$APPTYPE CONSOLE} uses SysUtils, Forms,//<----この行を追加 Unit1 in 'Unit1.pas' {Form1}; begin Form1:= TForm1.Create(nil); //<<--この行以下を追加 Form1.Show; Form1.Canvas.Ellipse(20,20,100,100);//円の描画 Form1.Caption:= 'こんにちは'; readln; end. 実行すると、コンソールと同時にタイトルがこんにちは となった フォームが表示された筈です このフォームはクリックに応答しませんし、他の窓に隠れると再表示もされません が、とりあえずこれで遊ぶには十分に便利な筈です
>>135 >TP6のマニュアルに書かれていたクラスの概念はとても分かりやすかっただけに、
おお、同意。なんか執筆者のすごい熱意が感じられる文章だった。
Crtユニットを使って日本語を出力する例。
TP5.5、Win95のDOSプロンプトにて確認しました。JPモードで実行して下さい。
program test;
uses Crt;
begin
DirectVideo := False;
GotoXY(30,10);
TextColor(Red);
Write('こんにちは');
end.
2バイト目が'のコード番号と一致するような日本語文字を文字列中に入れる場合には注意。
コンパイラがその'を文字列の終わりと認識するのを防ぐため、'を一つ追加してやる必要がある。
141 :
デフォルトの名無しさん :02/02/04 22:43
ターボパスカルって、いまC#作ってる人と同じ人が作ったの?
あらいぐまパスカルとかパトラッシュ思い出すんだけど。
さて、
>>139 の方法はあまりにも無理やりで作法としてよくありません。
そこで、コンソールアプリからBMPファイルを作成して表示させる方法を説明します
まず、新規作成でコンソールアプリを新しく作った後
uses
windows, //WindowsのAPIを使います
ShellApi, //ShellExecuteを使う為に
Graphics, //TBitMapを使う為に
SysUtils;
var bmp:TBitmap;
begin
bmp:=TBitmap.Create;
with bmp do try
Width :=100;
Height:=100;
PixelFormat:= pf1bit;
Canvas.Ellipse(1,1,100,100);//円を描く
Canvas.TextOut(5,5,'こんにちは');
SaveToFile('temp.bmp');
finally free;end;
ShellExecute(0,'Open','temp.bmp',nil,nil,SW_SHOW);
end.
として実行してみて下さい
このコードはコンソールを使用していませんから、コンソールアプリである必要もありませんから
{$APPTYPE CONSOLE} も取り去って大丈夫です
>>139 の方法がなぜ良くないかをまず説明します
Windowsでは複数の窓があるように見せていますが、実際の表示デバイスはせいぜい1つです
他の窓に隠された部分が また表示されるのは、アプリケーションが努力しなければなりません
その為の仕掛けをメッセージループと呼びます
窓はメッセージを受信する仕掛けをもち、再描画しろというメッセージにしたがって画面を自分で
描くわけです。
また、キーボードが押された、マウスが押されたもメッセージにより処理されます。
Delphiでは application.ProcessMessages; で明示的にそのメッセージループを呼び出す事も
出来ます。コンソールアプリでapplication.ProcessMessages;を定期的に呼び出せば、作成した
フォームはマウスを受け付ける事が出来るようになります。が、それをしても
>>139 のように描画
処理をベタに書いたのでは 他の窓に隠れると2度と表示出来ない事にかわりはありません。
この部分をイベント駆動にしなければならないのです。
それがフォームにある OnPaintイベントです。
>>143 のコードを説明しょうと思いましたが、
Delphi6のIDE上で F1を押せば知りたい情報は殆ど出て来る筈です
bmp.PixelFormat:= pf1bit; はモノクロビットマップを作るという意味になります
その他の多色形式はヘルプを見て下さい
ShellExecuteは 作成した temp.bmpをそのパソコンに設定された方法で
開くためのAPIです
円以外のグラフィック描画命令は TCanvas でヘルプを見て下さい
線の色の設定や線の太さは Canvas.Pen で設定します
面の 〜 は Canvas.Brush で行います
文字の〜は Canvas.Fontで行います
なんかものすごく丁寧に説明されてる方がおられるようですが、 ひょっとして穂積○平さん?
147 :
ふむふむ(納得) :02/02/05 07:56
>140 サンキュー 今、FreePascalでGraphユニットを使って日本語をなんとかグラフィックと 混在表示できないか検証中です。やっぱ、outTextでは文字化けしますね。 (Win2000のコンソール画面で検証)
人のやる事にああだこうだは言いたくないけど、今更DOSアプリの研究してどうすんの? それはもうコンソールアプリじゃないよ そこらへんやりこむにはインラインアセンブラ使うしかなくなるしさあ pascalの勉強ならDelphi6パーソナルで始めたらいいじゃない
>>148 禿同。
コンソールアプリでもない機種依存アプリでしかない。Windows が動かないほど
古いマシンでの話ならともかく Win の DOS-BOX で動かそうとしているようだから
意図がわからない。
本質的なプログラムをしたいなら、Graph がどうこうとか言ってる場合じゃないとおもうが。
150 :
ふむふむ(納得) :02/02/05 12:15
>148 >149 私も含めてTPやFPを使っている人は、これで飯を食っているわけじゃないとおもいますけどね。 ただ、知的好奇心を満たすため、また昔を懐かしみたいがために、前記のツールでコツコツとコードを書いて 遊んでいるとおもいます。 >148 私はアセンブリ言語はサパーリわかりませんので、インラインアセンブラは未体験ですけど、 使いこなせたらおもしろそうですね。 >148 我が家には486・33MHzマシンもペン150MHzマシンもあります。再利用を考え中です。 FPですが、LinuxやDOS、OS/2、旧バージョンはアミーガでも稼働できるそうなので、 ツールになれたらそれらのOSでも楽しめそうです。(私はOS/2も持っています) 個人的にはBeOS(瀕死状態ですが)、今後発表される予定のFreeBeOSにFPが移植されたら 有り難いのですが・・・・。
昔の書籍のリストを実行させたいのなら、意味がある。
棘の道だなと思うけど、それが好きなんだと言われたらしょうがない話しだからもう言わない ワンダーウイッチ開発をTPで出来るように環境を整えるとかの方向なら面白いとは思うんだけど・・・
>>150 486の33Mを生かしたいなら kylixやればいいのに
486では開発出来ないだろうけど、作った実行ファイルは実行出来るだろうに
>>142 ♪神サマありがと〜お、ボクにともだちをくれ〜て〜〜〜。
♪パスカルに〜あわせてくれて、パスカルに〜あわせてくれて
♪パスカルに〜あわせてくれて、パスカ〜ルにあわせてく〜れ〜〜て〜〜
2ch だしぃ... どれが誰だかわからないけど >119 :デフォルトの名無しさん :02/02/02 00:00 >だってDelphiなんて、GUIだとか余計なことがイパーイついてて本質が見えないじゃないか。 ってのがあるから、「Graph/CRT でごそごそやるくらいなら Delphi つかったら?」 といっているの。いまどき SVGA どまりのグラフィクスでもないでしょ?
156 :
ふむふむ(納得) :02/02/05 13:49
>154 ♪ごめんね素直じゃなくって。夢の中なら言える。 ♪思考回路はショート寸前。あなたに会いたいよ。 「美少女戦士セーラー・パスカル」 ヘジに替わってデバッグよ! >153 kylixはFreeBSDでは動かないのではないかと思います。 私はlinuxよりFreeBSD派です。(ごめんなさい) それより486でlinuxやFreeBSDを使うということはXはあきらめろ ということになりそうです。
で、結局、何をしたいのか?
>>157 Delphi以外でPascalの勉強だろ?
159 :
ふむふむ(納得) :02/02/05 21:19
ちがうってば DelphiでもTPでもFPでも、とにかく手持ちの処理系を使った Pascalの学習さ。
Graph ユニットや CRT ユニットの使い方を学ぶのが Pascal の学習か?と聞いているんだよ。
それは一つの手段でしょ. なんでそんなに突っかかるのか小一時間(略
Pascalは、処理系を作るのが学習です。
163 :
デフォルトの名無しさん :02/02/06 08:06
>140 win2000のコンソール画面(JPモード)では文字化けします。 対策はやっぱり、旧Winと文字コードの取り扱いがちがうから無理でしょうか?
⊂(□ー□⊂⌒`つ≡≡≡≡≡≡<ヒロシ(164)ゲト!!!
165 :
アライグマPascal :02/02/15 12:00
今、PascalプログラミングのHPを作っています。 昔のTurboPascalを思い出す懐かしいやつです。 今年の8月頃Openの予定です。
なんかフリーのSRPG作成ツール無い? (SRC以外で) ガチャポン戦士3作りたくなった
pascal板かここ・・・ すいません、逝ってきます。
168 :
デフォルトの名無しさん :02/02/15 15:07
「PASCAL でガチャポン戦士をつくるうっっ!!」 この壮大な計画を遂行するため、424は立ち上がった、、、 歴史は動き始めた、、、
ツールが見つかりません。 逝ってきます。
170 :
アライグマPascal :02/02/18 10:01
今ちょこちょこっとHPをつくっています。実はOpenしたのですが、まだ コンテンツが激貧なのでURLは秘密です。古いPascalの簡単なサンプルを 公開・保存する場にしたいと思っています。
確か、フランスのボーランドサイトから、仏語版のTP7がダウンできるはず(FREE) NECRT.TPU という、CRT互換unitをダウンすれば、日本語だって出力可能 おいらは統合環境は使わないから、これで問題なし
>>170 楽しみにしているぞゴルァ。
>>171 フランスのBorlandからわけのわからないメールが届くようになるという
諸刃の剣。
173 :
アライグマPascal :02/02/19 08:18
たいへん。Dev-PascalのURLが使えなくなりました。移動したのか? それともなくなったのか?
復活したもようですね。
>>145 「ヘルプを見て下さい」ばかりだと、このスレ意味なしだと思いません?
コンソールアプリにこだわりながら、なおかつ、TCanvas を論じている
こと自体に無理があるのでは?
176 :
アライグマPascal :02/02/23 23:38
本家からFreePascalをダウンロードして、エディタはCPadあたりを 利用して以下のソースをコンパイル。 program test; uses Graph; var GraphDriver:smallint; begin GraphDriver := Detect; InitGraph(GraphDriver,30012,''); SetColor(4); circle(300,200,100); readln(); CloseGraph; end. 画面に赤い円が表示されたら成功。(懐かしいでしょ)
赤い玉が出てくるの?
178 :
デフォルトの名無しさん :02/02/23 23:58
>>5 いまさらなつっこみで悪いんだが・・・
absolute変数があったり、
「Mem[****] := ****」とか「Port[**] := **」なんてことができたり
inline手続きがあったりするので
PascalはCよりもっと危険なのでは?
Cじゃメモリの番地を直接指定して書き込みするなんてことはできない
ポインタを介して間接的なやりかたでやらねばならないぶん、
Pascalよりも安全性はほんの少し高いとも言えないか?
Delphiはともかく、DOS時代のTurbo Pascalなんて、
ハードウェアを直接いじるような目的で使われることが多かったし、
実際、procedureの中身はアセンブラソースをasmとendで括っただけなんていう
ほとんど高級アセンブラ的なPascalの使い方をしてるソフトが
数多くまかり通ってたものだが
>178 >PascalはCよりもっと危険なのでは? なんでやねん。 危険なのは(言語を問わず)ハードを直接操作することでしょ。 高級なことやりたいんなら危険専用の命令である inline/absolute/asm使わなければそれで十分安全性を確保できる。 それに対してCは高級・低級ともにポインタ使わざるを得ないから 高級な目的で書かれたコードですら安全とはいいかねる。
178 の理屈だと XXX 言語はインラインアセンブラがあるから、特権命令も記述できるので 一行でハングアップするコードがかける。危険! ということもできそうだが、さすがにこれには同意しまい?
181 :
アライグマPascal :02/02/24 06:25
したらばBBSでもおねがいしましたが、みなさん、昔のBASICゲームプログラムの ソースをもっていませんか?ベーマガに載っていた、1画面プログラムみたいなものです。 音やスプライト機能はできないと思いますが、なんとかPascalで書き直してみたいと 思っています。ここにソースをアップしてみんなで考えたら、勉強のネタとして おもしろいと思います。
1 COLOR15,1,1:SCREEN5,1,0:R=RND(-14):FOR I=0TO212:P=PEEK(I+800):PSET(P,I),IMOD3+2 :NEXT:FORI=0TO7:VPOKE30721+I,255:VPOKE30 736+I,24:NEXT:OPEN"GRP:"AS1:SOUND6,18 2 DEFFNS=RND(1)*175+25:DEFFNR=(INT(RND(1 )*10)-5)/10:C=FNR:D=FNR:G=FNS:H=FNS:Y=99 3 LINE(E,200)-(E+20,212),1,BF:FORI=2TO4: COLOR=(I,0,I*2-2,I*2-1):CIRCLE(G-I,H-I), (6-I)*2,I:PAINT(G-I,H-I),I:NEXT:LINE(G,2 00)-(G+20,212),5,BF:SOUND7,183:X=120:E=G 4 S=STICK(0):A=(S>5ANDV>-8)-(S>1ANDS<5AN DV<8):B=((S=8ORS=1ORS=2)ANDW>-8)-(S>3AND S<7ANDW<8):V=V+A+C:W=W+B+D:X=X-V:Y=Y-W 5 VDP(24)=(Y+149)MOD255:PUTSPRITE0,(X,Y) ,10,0:PUTSPRITE2,(X,Y+B*9),ABS(B)*9,2 6 PUTSPRITE1,(X+A*14,Y+8),ABS(A)*9,1:IFP OINT(X+8,Y+18)=5THENN=N+1:BEEP:GOTO2 7 SOUND8,-(S>0)*13-(S/2=S\2)*2:IFX>4ANDX <238ANDY>-10ANDY<194THEN4ELSEFORI=0TO50 8 D=RND(1)*31:SOUND6,D:SOUND8,15:VDP(24) =ABS((Y+D\3+144)MOD256):NEXT:Y=Y+(Y<0)*Y 9 PSET(80,99):PRINT#1,"GAME OVER";N+1 10 SOUND8,0:FORI=0TO255STEP.5:Y=Y+I:Y=Y+ (Y>255)*Y:VDP(24)=Y:NEXT:POKE-869,1:RUN
183 :
アライグマPascal :02/02/26 21:55
どうもありがとうございます、しかし・・・。 peek、poke、sound、vdpなど、移植が難しいコマンドが目白押しですね。 参考にさせていただきます。
184 :
デフォルトの名無しさん :02/02/26 23:08
peek pokeは全然難しくない むしろBASICより簡単だ。メモリ配列に代入するだけで済む Mem[$****] := hoge hoge := Mem[$****] スプライトは無理だけど重ね合わせ処理で代用できるでしょ
>むしろBASICより簡単だ。メモリ配列に代入するだけで済む その副作用は一切無視?
186 :
デフォルトの名無しさん :02/02/26 23:50
>>185 BASICのプログラムをPascalで書き直すって言ってるんだから
元と同等のことをやればよいだけだろ
BASICと同様の単純なシステム上の話じゃないのか?
WindowsだのUNIXだのの上ではもちろんそんな乱暴なことは許されないけど、
単純なシステム上ならそういう乱暴な方法でしかゲームは書けないよ
>182のBASICが動くパソコン用のPascalコンパイラなんてまずないだろ。 ハードが変わったらpeek,poke(Mem)の移植性なんて皆無。 大体MemってTP専用じゃなかったか?
188 :
デフォルトの名無しさん :02/02/27 00:22
そうかbasicで組むときpeek使うと移植性が低くなるのか でもBASICなんてもともと移植性なんか関係無いし。
>>182 MSX-BASICか・・・どこから引っ張り出してきたのやら。
って優花、ベーマガのサイトに行けばダウソ出来るじゃん。
190 :
デフォルトの名無しさん :02/02/27 00:36
BASICが主流だった当時はそういう乱暴な方法でしかゲームは作れなかったんだから仕方ない TPだってMS-DOSがグラフィックやサウンドの機能をサポートしてなかったから やっぱりMem配列とかの乱暴な手段は必須だった
191 :
がうがう ◆gu5gIE4w :02/02/28 20:46
初めまして。このたび、HP200LXを手に入れたんですが、これと 同時にBorland C++ Suite を何故か、購入しちゃって、これにBP7が 入ってまして、pascalをやりたくなったんですが 1.HP200LXぐらいのスペックだとPASCALって厳しいですか? 2.CGAですが、付属のCGA.BGIでは、遅いと思われます? 3.Cと比べてどれくらいの実行速度なんでしょうか? 今から始めるので、何も分からなくて恥ずかしいのですがよかったら 上記のことを教えてくださいまし 勉強をかねて、上から線が降りてきてそれをよけるような簡単なものと 三角関数を使ったRPN電卓を作りたいなと思います。 このスレッドが消えませんように……
>>191 1. 2. は知らんけど
>3.Cと比べてどれくらいの実行速度なんでしょうか?
一般論としては引数を全部スタックに積むCより
3つまで(だったかな)ならCPUのレジスタを直接使うPASCALの方が
より高速になりうる・・・と聞いたけど
2 CGA ってのは、アクセラレータも何もない時代だから、CPU パワーが そのまま描画性能につながる。はず BGI とかも、速度向上のがんばりようが無いので、速いか遅いかという議論には ならないな。描画空間の抽象化、という利点はあるけど。 実際には、ハードウェアのウェイトがいっぱいかかっているので、ある程度から 先は頭打ち。(HP200LX だと改造/改良されているかもしれないが)
194 :
アライグマPascal :02/02/28 21:25
>191 HP200LX!!!!!!!!!!!!!!!!! のどから足が、鼻からちんちんが(失礼)飛び出すぐらい 欲しかった・・・。あいにくお金がなくて血が出るくらい 下唇をかみしめて泣きながら家に走って帰ったのを昨日の ように思い出します。<とても40歳が書く文章ではありませんな。 LSI-C試食版が動いているのをみたことがあります。それと TP6(PC98版、もちろん専用ライブラリは使わない)が動いているの もみたことがありますが、実行速度は変わらなかった気がします。
195 :
がうがう ◆AGuK1Awo :02/02/28 22:20
>>192 質問にお答えしていただきありがとうございます!!感謝です
3つまでCPUのレジスタを直接扱うというようなPASCALプログラミングって
どういう感じなのでしょうか?
(#^_^#)話分からなくて…… 逆に言えば、この手法でくむように工夫すれば
いいってことですよね?
196 :
がうがう ◆AGuK1Awo :02/02/28 22:21
>>193 質問に答えていただきましてどうもです(^-^) 感謝いたします
ふむ…… すべてはCPU次第なので、遅いから遅いのだということですね?
これは、Cに限らないと言うことでしょうか?
pascalそのものが早いのか、遅いのか知らないのでこういった質問になったんです
あるファイルを名前を変えてコピーするという程度なら早いとは思うんですが。
186マシンではきついのかなあ?
HP200LXだとライトスリープというのがありまして、コンパイルするのが遅い
MSCだと途中でシャットオフになってしまうこともあるそうです。
もちろんライトスリープですから電源を入れれば何事もなく続きを始めるんですが。
そのライトスリープをさせないアプリもちゃんと存在します。
描画空間の抽象化とは何でしょうか? お教えくださると幸いです。
無学ですいません
197 :
がうがう ◆AGuK1Awo :02/02/28 22:22
>>194 あははは(^-^) 今じゃヤフオクで3万程度で手に入りますよ。倍速8M程度を。
自分も少しずつ、ボーナスの度に買ってます。
最終的には15個欲しい……
自分の場合はRPN電卓の部分も大きいというのがあるんですけどね(^-^)
質問答えてくださいましてどうもです。LSI-Cとそんなに実行速度は変わらない
ですか! うれしいお話ですね。がんばろうと思えます!
>>195 PASCALコンパイラが勝手にやってくれるから気にする必要はないよ
引数が3つ(?)までの関数や手続きではそのようにコンパイルされるということ
199 :
がうがう ◆AGuK1Awo :02/03/02 12:21
>>198 そうですか(笑) だとしたらPASCALコンパイラ(Borlandのやつですね)
は、優れているということですね。
PASCALで作られた有名な作品ってご存じですか?
自分は、「WTERM」ぐらいでしょうか?
皆さんも教えてくださると幸いです
200 :
アライグマPascal :02/03/02 12:36
ゲームだったら,三大古典RPGの一つ「ウィザードリィ」ですね。
>>200 そういうこと言うと、厨房どもがわらわら集まってくるので禁止
202 :
がうがう ◆AGuK1Awo :02/03/02 17:42
>>200 あ、そうか…… APPLEでPASCALでしたね
しかも独自IP(最初に起動するときに読む奴 IPじゃなかったでしょうか
それともSIP?)で動くんですよね
IBM/PC版は、そのエミュで動くと聞きます。
エミュの上にIPがあってその上でAPPLEのPASCALで書かれたWIZ
が動くとか。
203 :
がうがう ◆AGuK1Awo :02/03/02 17:42
204 :
デフォルトの名無しさん :02/03/02 18:02
パソコン版D&D(RPG)はTurboPascalだったらしい。 ファミコンに移植した人から聞いた。
205 :
アライグマPascal :02/03/02 23:28
MS-DOSの最初のバージョンあたりはPascalだったはず。 すぐに全面的にCで書き直されたけど・・。
Pascal最初にやるとCの構文が汚く見えるね。
207 :
がうがう ◆AGuK1Awo :02/03/03 01:05
昔BASICマガジンというのがあって、たくさんのソースが載っていて
大変勉強にもなったそうですね。
あるいは、MSXFANとかの投稿雑誌があって、MSXBASICでも
勉強になったとか……
ネットでPASCALのソースを探しているんですがなかなか(-.-;)
ゲームに参考になる画像描写(CGA)で参考になるのがないですかね?
とりあえず 植木屋 さんのウェブサイトにて CGAの参考を
ttp://plaza10.mbn.or.jp/~uekiya/hp200lx/japanese/cga.html 人のソースが一番勉強になるんだけれどもなあ 初心者には(^O^;;
208 :
がうがう ◆AGuK1Awo :02/03/03 01:06
>>204 お!あの D&Dもですか やったことはないんですが
名前だけは伺っています
そのソース見てみたいなあ
209 :
がうがう ◆AGuK1Awo :02/03/03 01:08
>>205 え! うっそぉでしょ?
本当にぃ! それしか言葉が出てこないぐらいびっくりしました
う
すげぇなあ。 1.0位の頃でしょうかね?
210 :
がうがう ◆AGuK1Awo :02/03/03 01:12
先ほどの植木屋さんところのCソースをプリントアウトして 眺めているんですが、何をどうしてどうするのかが(^O^;; あるテクニックが何のために必要か、それをどう有効に使うか 以前のCで何が書かれているのかさえも読めない(^O^;; Cの入門書を買ってきて一行ずつ解析していけば読めるかなあ? どこかにCGAでPASCALゲームソース公開されてませんか? 探しているんですが見つからない(^O^;;
211 :
デフォルトの名無しさん :02/03/03 06:41
212 :
デフォルトの名無しさん :02/03/03 06:49
>211 すまぬ。自爆。画面モードと間違えた。(^^;
213 :
デフォルトの名無しさん :02/03/03 21:04
>211 あと、SWAGもな >Pascalerの心得
217 :
がうがう ◆AGuK1Awo :02/03/05 15:14
>>211 知りませんでした(^O^;; 似非パスカラー決定?(-.-;)
教えてくださって有り難うございます
翻訳にかけると妙な日本語で(笑)
218 :
がうがう ◆AGuK1Awo :02/03/05 15:16
おっと 変なところで書きこんじまった(-.-;) 少しずつ読んでいこうと思います
219 :
がうがう ◆AGuK1Awo :02/03/05 17:58
SWAGのサイトに行ってみようとしたんですが めちゃくちゃ重くないですか? ここ
220 :
デフォルトの名無しさん :02/03/05 18:14
正に今日pascal始めたばかりなのですが、いきなり詰まってます。 procedure A() … A();B();C(); … procedure B() … A();B();C(); … procedure C() … A();B();C(); … てな再帰を作りたかったんですけど、free pascalでコンパイルしたら Error: Identifier not found B〜 などと怒られてしまいました。 pascalではCの様なプロトタイプ宣言は出来ないんですか? それと、var a,b integerと宣言して a:=b/2としたら Hint: use DIV instead to get an integer result Error: Incompatible types: got "S80REAL" expected "LONGINT" と怒られてしまいました。 型変換はどうするのでしょう?
forward
223 :
デフォルトの名無しさん :02/03/08 05:01
>221 FreePascalにも型変換の概念はあるけど、それ以前の問題として Pascalでは整数型除算では「/」ではなく「div」を使わないと 文句を言われます。
>>221 Hint: use DIV instead to get an integer result
↑これをちゃんと読みましょう
>>221 実数は整数型変数に代入できない。
Round関数またはTrunc関数を使って整数に変換する。
だけど今のケースは
>>223 の言う通りdivを使うべきだ。
221は222が >pascalではCの様なプロトタイプ宣言は出来ないんですか? にちゃんと答えてくれていることに気が付いているのだろうか?
227 :
アライグマPascal :02/03/09 21:24
>226 さりげない一言「forward」に私は愛を感じました。 たぶん受け止めていただけたと思います。
気づいてなさそうだからヤボな説明をしておこう Pascalには「プロトタイプ宣言」は無い しかし、「プロトタイプ宣言」とは言わないがそれと同じものはある それがforward宣言だ
229 :
アライグマPascal :02/03/10 17:50
パスカルの文献が少ないので「サウンド・プレス」さんのところで 翻訳中のFreePascalの関連部分を読むことをおすすめします。URLはずっと 上のほうに書き込んでおります。(以下はその文章の抜粋です) 8.5 フォーワード宣言関数 forward手続きを使うことで実装のない関数を定義できます。関数の実際の 実装はモジュール内であとに続けなければなりません。関数はforward宣言後、 すでに実装されているかのように使われます。次はフォーワード宣言の例です。 program testforward; procedure First (n:longint); forward; profedure Second; begin WriteLn('In second.Calling first...'); First(1); end; procedure First(n:longint); begin WriteLn('Frist received:',n); end; begin Second; end.
230 :
アライグマPascal :02/03/10 17:53
ぐは、 profedure× procedure○
231 :
アライグマPascal :02/03/16 18:03
どなたか教えてください。 あるPascalの書籍に (1) round(2.5*(5.5-8.9)) (2) (16.4 -10.8)/2.0 >= 1.3+6E-1 という演算の問題があったのですが、書籍の解答は (1) -8 (2) true でした。 FreePascalでは書籍の解答道理の値を返しますが、スレの上の方にあった HelloPascalという処理系では -9とFalse を返します。 どちらの処理系の演算が正しいのでしょうか?またどんなルールで演算を しているのでしょうか?
>>231 そんな、処理系依存の重箱の隅をつつく問題を出す書籍など、捨てろ。
233 :
アライグマPascal :02/03/16 21:13
ISO-PASCALを解説した本ですが、今まで演習問題は気にもとめなかったのです。 (1)はround(-8.5)と書き直すことができますよね。roundは小数点下を四捨五入 するから答えは-9になるのが当たり前と思っているのですが、違うのでしょうか。 こんな簡単な演算でも処理系依存で値が変わるのは大問題だと思うのですが、 処理系依存とはどういうことでしょうか?
-9.5 は -10 + 0.5 -9 + (-0.5) のどちらを正解にしたい? 銀行家丸め以前の問題。
235 :
アライグマPascal :02/03/16 21:26
>234 上はそれぞれを丸めると-10+1=-9 下はそれぞれを丸めると-9+(-1)=-10になるということでしょうか? でもround(2.5*(5.5-8.9))の場合、括弧内から計算していくと round(2.5*(-3.4))になり、別々に丸めても round(3*(-3))=-9にはなりませんか? どんなルールが働いているのでしょうか????????
大体、C や PASCAL が定義されたころって、ライブラリの重要性が 今ほど高くなかったのだよ。というかライブラリは処理系の外に 存在するものだった。 ISO 7185 / JIS X3008 のどこにも Round 関数の仕様の話はない。 よって、処理系依存問題。
>>235 そんな難しい話ではなく、
-9.5 を -10 にする根拠は? -9 にする根拠は?って話。
どちらも誤差は 0.5
あ゛ お題は -8.5 か。 ウツダシノウ
239 :
アライグマPascal :02/03/16 21:39
う〜ん round(X) 実数式Xの小数点以下を四捨五入した整数値を返す。 とあるなら、その値は唯一一つしかあり得ないはずですよね。 別の解釈が入り込む余地は無いと思うのですが、 こんな単純明快な話なのにどうして処理系依存なんてことが あるのだろう。
240 :
アライグマPascal :02/03/16 21:44
(2)の問題は 1.3+6E-1 の部分の(-1)の解釈が、単に整数値の-1と解釈するのか 前のEとの絡みで、10のマイナス1乗と解釈するのかの違いだと思うの ですが、どうでしょうか?
3. 負の数の丸めを明確に規定する物はない。 -8.5 に話を戻すと、-1 * 8.5 に置き換えてから 8.5 を「四捨五入」。最近偶数値である8に丸められた後 -1 * 8 と評価されるとすると、答えは「-8」 -8.5 を字面で「四捨五入」すると、「五入」扱いになる。 これを0方向に丸めると、答えは「-8」 これを無限大方向に丸めると、答えは「-9」 さて。.5 は境目の数なので、少し前後も出してみよう。 -8.0 -> -8.0 // これは異論あるまい。 -8.4 -> -8 の方が近いんだから -8 だろう。 -8.5 -> さぁ。どうする? -8.6 -> -9 だよな。 -9.0 -> -9.0 // これも簡単。
243 :
アライグマPascal :02/03/16 21:59
>241 お恥ずかしい話ですが初めてこの話を知りました。 ということはHelloPascalは「JIS丸め」を採用していない、 演算によっては誤差が大きくなりやすいということですね。 関連のURLを含めて作者に連絡してみようと思います。
実数型か少し多めの桁を使用して表示の際に四捨五入すれば 実用上は問題ないんだけどね 厳密にしようとすると気になるかも
なお、div / mod 「演算子」の負数に対する振る舞いは規格書に明記されています。 まぁ普通はそこまで気にしない/気にしてもしょうがないので「処理系依存」の振る舞い とひとくくりにしてしまいますが。
その前の問題として 数値の持ち方の問題があるんじゃない? 2進で表現すると 5.5 101.1と 誤差無くもてるけど、8.9=1000.1110011001100110011 と誤差無く持てない
>>246 銀行家丸めはコンピューターが無い頃からの技法だよ。
248 :
デフォルトの名無しさん :02/03/22 21:52
最近までBASICで遊んでましたが、今日アマゾンからUsing turbo pascal 6.0-7.0 third edition が届いたのでまたPascalで遊んでみたいと思います。
何でわざわざ古い物を選ぶんだろう。 昔の物だからといって、機能が少ないからといって、優しいとは限らないんだよ?
250 :
デフォルトの名無しさん :02/03/22 22:24
>>249 じゃーキミも三平方の定理使うのやめなよ。
まあまあ。他人が何しようといいじゃないの。 遊ぶんだったら、趣向は人それぞれ。 おれも宿題スレみて生DOSアプリを作ってみたくなったよ。
例の「答えが書籍と違う」という話ですが、作者にメールで 報告したところバグらしいとのことでバグフィックスをする とのことでした。
253 :
デフォルトの名無しさん :02/03/28 22:22
なぜend.の直前の行には;が不要なのか。
>>253 ;は文と文を分離するためのものだからです。
255 :
デフォルトの名無しさん :02/03/28 22:59
>>254 よく理解できました。ありがとうございました。
256 :
丁稚Pascal :02/03/29 05:58
現在情報学科の一年(四月から二年)で、まだ言語はPascalしか知りません。 今はまずPascalをある程度できるようになりたいので、 このスレでいろいろ課題を出してもらえるとうれしいのですが・・・。
アメリカの大学だと Java から入るんだけどね...
そうなんですか。 何の言語から入るかは意見のあるところとは思いますが 色々と手を出すよりもまずは一つのものを―― と考えているので、よろしくお願いします。
手持ちの書籍からの抜粋でよろしければ・・・・・ 「正の整数aとb(a>=b)の最大公約数(GCM)を求めるプログラムを書け。 aまたはbがゼロ以下の場合は適当にエラーメッセージを出力せよ。」 解法のヒント(ユークリッドの互除法をつかう) まず大(a)を小(b)で割った余りrを求める。 次にaをbに、bを余りrに置き換える。 これをr=0となるまで繰り返す。最後の被除数がGCMとなる。
「明解PASCAL・国際規格(ISO)準拠」 伊東正安/金谷範一=共著 サイエンス社 定価(本体2111円+税) 上の本からの出題です。この本は個人的におすすめです。
さっそくチャレンジしてみます。
program GCM(input,output); var a,b,c,r:integer; begin writeln('自然数を二つ入力しる!'); readln(a,b); while (a<0) or (b<0) do begin writeln('自然数っつただろうが(゚Д゚)ゴルァ!!'); readln(a,b); end; if a<b then begin c:=b; b:=a; a:=c; end; repeat r:=a mod b; a:=b; b:=r; until r=0; writeln('最小公約数=',a); end.
こんな感じになりました。 これくらいで一時間か・・・ちと情けない。 直したほうが良い箇所とかありますか?
>>263 折角だから GCMを求める関数を作って
メインではそれを呼ぶように変更してはどう?
それから最小公約数は1だよ
最大公約数・最小公倍数でWeb検索してみたら
>>264 >それから最小公約数は1だよ
そうでした、恥ずかしい・・・。
関数つかってやってみますね。
program GCM(input,output); var a,b,c:integer; function a_gcm(x,y:integer):integer; var r:integer; begin repeat r:=x mod y; x:=y; y:=r; until r=0; a_gcm:=x; end; begin writeln('自然数を二つ入力しる!'); readln(a,b); while (a<0) or (b<0) do begin writeln('自然数っつただろうが(゚Д゚)ゴルァ!!'); readln(a,b); end; if a<b then begin c:=b; b:=a; a:=c; end; writeln('最大公約数=',a_gcm(a,b)); end.
訂正してみました。いちいちソース貼ってると長くなるなぁ。
>>266 大小の比較交換も a_gcmに入れないと使う時に不便だよ
program GCM(input,output); var a,b:integer; function a_gcm(x,y:integer):integer; //一組の自然数の最大公約数を求める var r,z:integer; begin if a<b then begin z:=y; y:=x; x:=z; end; repeat r:=x mod y; x:=y; y:=r; until r=0; a_gcm:=x; end; begin writeln('自然数を二つ入力しる!'); readln(a,b); while (a<0) or (b<0) do begin writeln('自然数っつただろうが(゚Д゚)ゴルァ!!やりなおし!!'); readln(a,b); end; writeln('最大公約数=',a_gcm(a,b)); end.
>>268 なるほど。再度訂正してみました。
大学だと課題として提出して終わりなんで、その場限りのコードになりがち。
気をつけねば。
× if a<b then begin z:=y; y:=x; x:=z; end;
テストコードを書く習慣をつけないといけないよ 最初に予め計算した結果と何個か比較させるようにするといい if a_gcm(555,9875)!=5 then writeln('NG');
除算を使わない GCD function gcd_1(m,n:Integer):Integer; begin gcd_1:=0; if m=0 then exit; if n=0 then exit; while m<>n do begin while m>n do m:=m-n ; while n>m do n:=n-m ; end; gcd_1:=m; end;
書籍に載っていた模範解答です。 program gcm(input,output); var a,b,r : integer; begin writeln('Enter a:'); readln(a); writeln('Enter b:'); readln(b); if (a>0) and (b>0) then begin repeat r:=a mod b ; a:=b ; b:=r ; until r=0; writeln('gcm = ',a) end else writeln('ERROR: a and b must be positive.') end.
>>271 やってしまった・・・。
>>272 なるほど、次からはテストコード入れるようにします。
>>273 参考になります。
>>274 自分の
r:=x mod y;
x:=y;
y:=r;
よりも、
r:=a mod b ; a:=b ; b:=r ;
のように一行に書いてしまった方がいいんですかね?
これは好み?
まったくの好みです。 私は全て一行一文主義です。
277 :
デフォルトの名無しさん :02/03/29 20:49
>>277 サンクス
平易な英文だから
「英語はちょっと・・・」という人もトライしてみるといいね
この辺の経緯を知らなかったDelphiユーザーなら
ますます好きになること請け合いだよ
279 :
丁稚Pascal :02/03/31 03:31
>>276 ありがとうございます。
今まで一行一文だったし、読み易い(自分としては)ので
これからも一行一文でいきます
280 :
デフォルトの名無しさん :02/03/31 22:22
Pascal って String 型あるんだ。 Cよりラクチンでいいな。
281 :
デフォルトの名無しさん :02/03/31 23:11
ord ってなんの略なんだろう? ord('R') で82 になるやつ。
282 :
デフォルトの名無しさん :02/04/01 00:30
order, ordinalなどの「序数」の事でしょう。
確かにCやBASICしか知らなかった人がPASCAL(Delphi) のテキスト読んだときに集合とか順序型、部分範囲型 とか書かれていると「ハァ?」なんだろうなあって思う。(w
>>280 文字列に関してはCが馬鹿すぎるよね
よくあんな言語で業務用アプリを作るもんだと思ってたもの
C++は文字列用のクラスがあるからまだましだけど・・・
>>283 (゚Д゚)ハァ?
って思ったよ、最初は。でも便利だね。
286 :
デフォルトの名無しさん :02/04/01 11:08
集合型、列挙型、部分範囲型、この3つの関係を 理解できたら本当に便利だよね。
Cでは文字列を扱いた場合どうしてるんですか? 配列で定義してるの?レベルが低くてすいません(^-^; やっぱ他の言語も少しは勉強していかないとだめかな・・・
Cの場合、ポインタと配列の区別がpascalに比べるとはるかに曖昧です char *p が文字列ポインタ(var p:PChar;)相当 (type PChar=Char^;)なんだけど p="ABCD"; と文字列を代入してるかのように表現出来ます。 というかします そして文字列"ABCD"は5文字の文字配列と等価です。 文字の最後は必ず #0 です。 これは Cでは'\x00' と書きますが こういう表現方法をAsciiZとか呼びます DelphiではこのAsciiZ方式と親和性が高くなるよういろいろな工夫がされています
289 :
デフォルトの名無しさん :02/04/02 22:51
for letter := 'A' to 'Z' do
290 :
デフォルトの名無しさん :02/04/02 22:52
>>289 は無視してくだされい。
for letter := 'A' to 'Z' do
write (letter)
こういう書き方がOKと聞いてはじめはびっくりした。
しかし、よく考えてみると、文字コードが入っているだけなので、納得した。
291 :
デフォルトの名無しさん :02/04/02 23:20
>>288 何か変。
>p="ABCD"; と文字列を代入してるかのように表現出来ます。
> というかします
これは初期化のときだけ。
初期化のときに「char* p = "abcd"」とすると、文字列の長さの分(此処では5)だけの領域を「確保」し、この場合なら"abcd\0"で初期化をします。
代入のときには出来ません。
代入をしたいときは、標準ライブラリその他の関数を使うとか、一文字ずつ操作するとか(配列と同じです)。
(C++ならstd::strungという文字列クラスが標準で存在します)
> 文字の最後は必ず #0 です。 これは Cでは'\x00' と書きます
'\0'とかくのが普通。
'\x00'はコードが0になる文字で、'\0'は文字列の終わりにくる特殊な文字。
「結果的には」同じだけど(ASCIIの場合?)。
>>291 補足。
「初期化」というのは、宣言のときの代入です(違うけど)。
Cでは変数を「型名 変数;」として宣言しますが、
「型名 変数 = 初期値;」とすることで、変数の定義と同時にその値を設定することも出来ます。
'\x__'は、xのあとに16進数の値を入れて、コードを直接指定します。
>>291-292 char* p = "abcd"
はポインタだから配列とは違うぞ。と。
確保されるのはcharへのポインタとabcd\0だぞ。と。
char p[] = "abcd"
とは違うぞ。と。
(下はp="efgh"とかはできないが上はできる)
295 :
デフォルトの名無しさん :02/04/03 12:24
じゃあ、データ構造の問題。 文字列を格納する片方向リスト構造を構築し、 任意の個数のデータを入力させ、最後に、その一覧を 通常ソート(頭文字がA→Zとなるように)及び 逆ソート(終端文字がA→Zとなるように)で出力せよ。
298 :
デフォルトの名無しさん :02/04/04 20:58
もうすこし単純な問題なら… そうさねえ どの程度の問題を要求しているのか分からないけど、 「指定したファイルを、バイナリ形式で( 16バイト分を1行として、16進数で)表示せよ」 とか。 バイナリエディタみたいに。 00000 00 32 FF 55 23 56 F3 4F 93 F2 00 34 1A B3 34 CD 00001 ... 00002 ... ... と言う風に表示。 でもって、それをテキストファイルに出力。
299 :
デフォルトの名無しさん :02/04/06 00:37
なんか、本読めば読むほど、Cとそっくりということがわかってきて、だんだん新鮮味がなくなってきた。 そろそろJavaに移るか。
>>299 CとPascalはいとこ同士みたいなもんだからね〜
思想的には正反対の部分もあるけど
おっと、300ゲトー、ズサ
301 :
デフォルトの名無しさん :02/04/06 01:00
ただ、ソースがキレイなのは気にいった。 Cだとぐじゃぐじゃして何がなんだか、書いた本人しかわからんことも多い。 Perlよりはましだが。 Pascalはどうかいてもキレイになるようなしくみがあるんだろうな。 なんでCに負けたんだ?
>>299 みためなら、Javaも大して変わらんと思うがナー
本当に違った世界を味わいたいなら、LISPなどお勧めしておきたい。
つーか、一度はやっておくといいよ。
304 :
デフォルトの名無しさん :02/04/08 22:22
Schemeは一応やったんですけど、exeが作れないので飽きました。
∧,,∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ミ,,゚Д゚彡 < 何がやれるのか自体がわからなかったので U つ \飽きました。 @ミ ミ  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ∪''∪ 言語とは難しいですね。
306 :
デフォルトの名無しさん :02/04/08 22:50
でもPascalの本、またちまちま読んでる。 アマゾンでJavaの本、注文したけど、届くまで1ヶ月かかるから。 それまでの間、Pascal の勉強するつもり。 もし時間がそれでも余ったら、VBとDelphiの勉強する。 本は買ってあるから。
307 :
デフォルトの名無しさん :02/04/18 22:57
おい、お前ら。 pascalの中で、UNIXコマンド使う方法教えてください。
UNIX版で聞いてきます。
309 :
デフォルトの名無しさん :02/04/19 12:11
test
保守sage
312 :
デフォルトの名無しさん :02/05/22 12:13
age
313 :
デフォルトの名無しさん :02/05/30 14:02
age
314 :
デフォルトの名無しさん :02/06/01 05:47
age
寒いスレだな
316 :
デフォルトの名無しさん :02/06/01 06:49
例題が豊富な解説書のお勧めはないでしょうか? delphiは扱ったことがないので純粋なpascalの本を探しています。
Pascalに限らないけど純粋なPascalの本となると昔の物が多いので とりあえず図書館で探してみてはいかがでしょう。 答えになってないですけど。
318 :
困ったさん :02/06/18 21:39
Pascalで多項式を2次式で割るプログラムを書けといわれたんですけど、 どうもうまくかけません。誰か教えてください。
319 :
困ったさん :02/06/18 23:38
age
const Jisu = 5; // 次数(これは5次の場合) var tako: array[0..Jisu]of Real; // 多項式 niji: array[0..2]of Real; // 二次式 ans: array[0..Jisu-2]of Real; // 答え for i := Jisu-2 downto 0 do begin ans[i] := tako[i+2] / niji[2]; for j := 2 downto 0 do tako[i+j] := tako[i+j] - ans[i]*niji[j]; end; これで、ans に商となる多項式、 tako に剰余となる1次式が入るかな。 ゼロ除算とかのエラーは考えてないので、その辺よろしく。
322 :
困ったさん :02/06/19 04:09
とても参考になりました。ありがとうございます。
323 :
デフォルトの名無しさん :02/06/23 11:29
Double を Integer に入れたいんですけど、どうすればいいですか?
どのようにキャストすればいいんですか?
326 :
デフォルトの名無しさん :02/06/23 11:37
windowsで使えるpascal→C言語コンバータはないですか?
328 :
デフォルトの名無しさん :02/06/24 18:33
330 :
デフォルトの名無しさん :02/06/28 18:02
Code worrierでpascalコンパイルする必要がでてきました。 使ってるひと居ませんか? Code worrierは既にpascalの対応が終了していて、 本家(あめりか?)で最終pluginがでてるみたいなんですけど、 これって日本語版の最新Code worrierで動くのでしょうか? OSはMac9です。 よろしくおねがいします。
331 :
デフォルトの名無しさん :02/06/28 20:25
>330 使えたよ。 ただしVer.7までだけどね。 それとCarbonは駄目っぽ。
332 :
デフォルトの名無しさん :02/06/28 20:28
図書館でPASCALの本を探したら開架は全滅だった。 仕方ないから書庫から持ってきてもらった。 もう需要が無いんだね。 まだ出てから10年も経っていない本だって……
333 :
デフォルトの名無しさん :02/06/28 20:52
Code worrierといえば、PocketStudioとか言う、DelphiライクなPalmの 開発環境があるみたいだね。 開発環境じゃなくて、Palmで動くPascalの処理系があるとうれしいかも。 Pascalの勉強用に。 でも、グラフィティでソースコード入力するのもちょっと面倒か。(w
>331 日本語版は最新が7みたいだからこれで逝けるわけですね。 Carbonはとりあえず必要ないです。 ありがとー
335 :
デフォルトの名無しさん :02/07/01 11:46
>334 ビルドする時にBuild Allを選択すればCARBONも使えるようになります。(人に指摘されるまで気付かなかった)
フォローさんくすです。 で、CW7日本語版アカデミックをゲトして Pascal Pluginつっこんだら、とりあえず処理はできてる模様。 だけど、目的のコードはbuild出来ない罠。 実はNIH-ImageをソースからMakeしてるんだけど、 type mismach SFPutFile(〜) とか、いろいろとおこられるよヽ(`Д´)ノウワァァン!!
337 :
デフォルトの名無しさん :02/07/02 03:10
>>330 1.62ならCWP2でMakeしたのを持ってる。たしかあれからファイルマネージャあたりは
激変したから、大変じゃない?
でも褌EDITがウプデートされるくらいだからな...
でも真の目的はNIHimage(改)のbuildなのですよ。 とりあえず手始めにそのままのをやってみようかと。 そのまま使うだけなら配布されてますしね。 (´-`).。oO(古いCWをとりよせたほうが早いのかなぁ)
>>338 古いヘッダならADCのサイトにあるような。あ、けど合うのをさがすのがたいへんだね。
入ってる(新しい)ヘッダをみながら、エラーが出る個所を無理矢理それっぽく直したら、
なんとかNIH-image(1.62)がmakeできたよ。一見ちゃんと動いてるみたいだけど、どうだろう。
PascalもCWもはじめてなんだけど、それ以前にMacの初心者なのが辛いトコロ。
AppleEventを効かすと刺さるんだけど、これって切っちゃっていいものなんだろうか…
ところで、
>>1 にGUI不可って書いてあることに今気づいたよ。
スレ違いスマソ。
親切な方、誘導きぼんぬ。
341 :
デフォルトの名無しさん :02/07/13 08:17
age。 DAT落ちは阻止じゃ。
342 :
デフォルトの名無しさん :02/07/16 22:46
このスレでFreePascalの話題出てますか? え? ここ何処の板? 過去ログ読め? ショボーン
344 :
デフォルトの名無しさん :02/07/20 00:29
生きろ!
345 :
デフォルトの名無しさん :02/07/30 20:46
PASCAL CENTRALにはFREEのPASCALコンパイラも置いてあるぞ!
AGE
347 :
デフォルトの名無しさん :02/08/18 03:00
Pascalが Philips’ Automatical Sequence Calcurator の略だったなんて初めて知ったよ
>>347 ジャンプしながらファイアボールを撃つと、
フルスクリーンに関らずシステムメニューが出てしまう…
このキー配列どうにかならないものか…
>>349 ソースファイルあるんだから、変更できそうだけどな。
生憎TPがないや。本家に行ってDLしてこようかな。
351 :
デフォルトの名無しさん :02/08/24 16:14
ObjectPascalの日本語で読める本って何か良いのある? このスレでリンクしてある「Object Pascal/Delphi(Kylix) プログラミング入門」 はDelphiでの使用に限定しているようなので汎用的なものを……
>>351 Object Pasca lは Turbo Pascal/Delphi でしか使っていないのだから、汎用的と言っても意味ないと思う。
標準 Pascal ならあるけど、文字列型も分割コンパイルもない「教育言語」だから、今更覚える必要も無いとも思われ。
353 :
デフォルトの名無しさん :02/09/04 18:40
CodeWarriorでもObjectPascalは使えます。 ボーランドがLinux用に出してるもう一つの製品でも使えるよ。
354 :
デフォルトの名無しさん :02/09/04 19:21
>>353-354 あ、Kylix はそうでしたね。失念しておりました。
CodeWarrior と Freepascal は知りませんでした。私は最近の動向をよく分かっていない
ようです(というか、Delphi で事足りているから、追いかける気がしないだけ)。
あと、標準化の中には「ISO Pascal」ってのもあったと言うことを思い出しました。Borland
はこの規格の裁定に入っていないから、気にもしていないけど。
それはそうと、「Object Pascal というのは紛らわしいから?Delphi Language に変える」
という話もあるようだけど、Kylix もあるとしたら、なおさら紛らわしいような気もするんだけ
ど...
356 :
デフォルトの名無しさん :02/09/07 19:05
誰かMetrowerksの Pascal Language Reference Pascal Library Reference Error Reference を持っている人居ない? ObjectPascalを使ってみようと思ってCodeWarriorCDを探してみたのですが見つからないのです。 Pascal Compilers Ref.pdfによるとCodeWarriorPro5のDocumentationフォルダの中にあるはずなんだけど、 いくら探してみ見つからないんです。 Sherlock2で検索かけてもPascal Compilers Ref.pdf以外は見つからなくて……。 Pro7にはPascalのDocumentなんて元から入っていないし……
357 :
デフォルトの名無しさん :02/09/10 21:26
Metrowerksに問い合わせたらメール添付で送ってくれました。 原文の方しかないらしく、送って来たのは英語……。 しかも200頁超や300頁超でした。 はぁ、頑張って訳すか。
358 :
アライグマPascal :02/09/19 08:16
仕事が忙しくてネタがないのですが、(HPまだ作れていません) すみませんageます。
359 :
デフォルトの名無しさん :02/09/20 21:49
レコード型の可変部がイマイチ良く分からん。 Var r : record case byte of 0 : ( i : Longint ); 1,9: ( a : extended); (1) : ( b :array[0..9] of byte ); end; とかくとき、 iやa,bなどは変数ということは分かるのだけれどその前に書く0や1,9がなんなのか良く分からない。
Pascalは知らんが、Cでいう共用体(union)ってやつだな。 番号はどの構造をとるかっていう構造識別番号みたいな奴で、byte型なわけだ。 無名だから使ってないみたいだけど、定義の時は必ず適当に決めなきゃならんのかも?
Var r : record case TAG: byte of 0 : ( i : Longint ); 1,9: ( a : extended); (1) : ( b :array[0..9] of byte ); end; のように、タグフィールドを入れられるのですが、これは省略可能なのです。 この場合、TAGが0ならaとbにアクセスするとエラーになるPascal実装もあった…かな? (DelphiだとTAGは単なるメンバ以上の意味を持ちませんが)
362 :
デフォルトの名無しさん :02/09/22 11:48
なるほど共用体か。(Cも少しやっていたので分かる) それで先頭のアドレスをそろえているのか。 持っているPASCAL入門の本は可変部の説明がなおざりだったんで何の事か良く分からなかったよ。
363 :
デフォルトの名無しさん :02/09/22 21:56
function(関数)とprocedure(手続き)の違いは返り値の有無と考えても問題ない?
問題ないです。
365 :
デフォルトの名無しさん :02/09/23 07:29
そいえばたまにわざわざダミーの返り値を使ってなんでもかんでもfunctionにしてるソースを見ることがあるな。 C出身者が書くとそうなりがちなのかも。
366 :
デフォルトの名無しさん :02/09/23 07:57
>>365 Cにはvoidがある。
そんなソースを書くのはDQNだけ。
367 :
デフォルトの名無しさん :02/09/23 11:32
単にprocedure(手続き)を宣言するのが面倒臭かったのでは?
>>367 > 単にprocedure(手続き)を宣言するのが面倒臭かったのでは?
意味わからん。function の方が面倒と思うが...。
まさか・・・これを・・・? if A then B else C A && B || C
コンポーネントパスカルをダウンロードしたけど、なにげによさげ でも英語できないから難しい。だれか邦訳してくれ言語リファレンス。
372 :
デフォルトの名無しさん :02/10/05 15:00
大分下がって来たので揚げ
373 :
デフォルトの名無しさん :02/10/24 23:37
そろそろ保守
Pascalの参考書探してる人は図書館いってみ。 TPとか、Pascalのがタマーにあったりしてうれしい。 あとは、大学に忍び込んで生協にあったりなかったり。
375 :
デフォルトの名無しさん :02/10/26 16:03
{$ }で囲まれている部分は何をする為に付けられるもの? 確か{ }で囲まれた部分はコメント部分で、コンパイル時には無視される部分だと記憶しているのだけれど。 {$I PascalOverrides.p}や{$unused ( inCallRef, inUserData ) }などのようにコメントにしては不自然な気がしてならない。 他にも {$IFC UNDEFINED __TRANSLATION__} {$I Translation.p} {$ENDC} なんて記述がある。
コンパイラに対する命令
378 :
デフォルトの名無しさん :02/10/26 17:54
コマンドラインで指定するコンパイルオプションと同じ。 しかし、コマンドラインでオプションを指定するとそのソース全部に一括してそのオプションが適用されてしまう。 コンパイラ指令としてソース中に記述すれば部分的な適用もできるし、IFなどの制御構造を使った複雑な指定もできる。 例えば、コマンドラインで「 -$O+ 」と指定すると、それはそのプログラム全体が最適化オプションが適用されてしまうが、 ソース中に「 {$O+} 」と書いて指定すれば手続き一つだけについて最適化オプションを適用することもできる。
>376-378 コンパイラ疑似命令かぁ。 どうりでPASCAL入門の何所にも書かれていないわけだ。
古本屋いけ。
381 :
デフォルトの名無しさん :02/11/03 17:27
四個の変数 a,b,c,dの最小値を求める IF文だけを用いたプログラムと 中間状態を用いたプログラムを書いてくれませんか?
FUNCTION GetMinimum(a, b, c, d: Integer): Integer; BEGIN IF a < b THEN IF a < c THEN IF a < d THEN GetMinimum := a ELSE GetMinimum := d ELSE IF c < d THEN GetMinimum := c ELSE GetMinimum := d ELSE IF b < c THEN IF b < d THEN GetMinimum := b ELSE GetMinimum := d ELSE IF c < d THEN GetMinimum := c ELSE GetMinimum := d END;
FUNCTION GetMinimum2(a, b, c, d: Integer): Integer; BEGIN IF a < b THEN b := a; IF c < d THEN d := c; IF a < d THEN GetMinimum := a ELSE GetMinimum := d END;
保守
386 :
デフォルトの名無しさん :02/11/13 17:38
age
387 :
デフォルトの名無しさん :02/11/24 21:46
function intersection(S1,S2:list):list; var s,p:list; begin interlist(S);p:=S1↑.next; while p≠nil do begin if search(p↑.item,S2)≠nil then insert(S,p↑.item); p:=p↑.next; end intersection:=S end と言うプログラムが本に載ってたんだけど、これってどういう手順で共通集合を出してるかわかんないです。 分かる人いたら、解説キボンヌ
>>387 こりは Pascal 言語の形を借りたアルゴリズムの説明コードだから、説明してくれと
言われても、このコードを読んで。としかいえないような。
集合 (a,c,d,f) と (b,c,f,g) の共通部分を取得するときに、人間ならどうやるか。
ってことをそのまま実装しているだけだぞ。
>>388 begin以下がどのような手順によってS1,S2の共通部分を取得してるかわからないんス。
p:=S1↑.nextってとこはpにS1のどの値を代入?
まずS1の先頭の要素をpに入れる。 pが指す値(item)と同じ値のがリストS2に在るかどうか調べる(search) もしなければ最後まで行ってしまうのでnilになる。 あったら、その値をSにくっつける。 以下、S1の末尾に行くまで繰り返す。 こんなところかな。
>>390 解説サンクスベリーマッチョです
S1の先頭の要素をpに入れてから、ループになりますよね?
ループの条件はpが空集合でないときで、ってやっていって、S1はいつ先頭の要素から、先頭の次の要素に変わってるのかが分からないです。
392 :
デフォルトの名無しさん :02/11/24 23:07
データは線型リスト構造だよ。
線型リストの1個の要素はこんな形式 【[データ本体][次の要素へのポインタ]】 これが一次元に繋がってるのが線型リスト。 [先頭をさすポインタ] ↓ →【[データ1][要素2へのポインタ]】 ↓ ←←←←←←←←←←←←← ↓ →【[データ2][要素3へのポインタ]】 ↓ ←←←←....←←←←← ↓ →【[データn][nil〔終端〕]】 知ってたらスマソ。
その教科書のどこかにある list 型構造体の定義を見直してみてくれ。
>>391 >ループの条件はpが空集合でないときで
じゃなくて、pが指す先が存在するかどうかってこと。
392さんの図で指すものがなくなったらend
Pascalの集合型と混同してるのかな。このプログラムは集合型は関係ないよ。
ポインタ型の変数は
>>393 の
【[データ本体][次の要素へのポインタ]】
みたいな構造体を指し示すタイプの変数だ。
もっと詳しくいえば、その構造体の存在するメモリ上のアドレスを保持している。
このタイプの変数は、その変数の後ろに「↑」をつけることによって
そのレコードの内容にアクセスできる。
※コーディング時には「↑」は「^」を使う。
ポインタ p が例えば2番目のレコードのアドレスを保持しているなら
p^.item と書くことによって
2番目のレコードの item フィールドを参照しているのと同じ結果になる。
(整数が入っているなら writeln(p^.item); などと書ける。)
p にはポインタ型の価を代入できる。
p := (3番目の要素のアドレス)
みたいに代入すれば、今度は
p^.item で3番目の要素の item フィールドを参照できる。
【[データ本体][次の要素へのポインタ]】
この構造体の[次の要素へのポインタ]というフィールドも、またポインタ型だ。
この値で p の値を更新すれば
p := p^.next;
p を使って次のレコードを参照できる。
こんなふうに使っていくのが線型リスト。(本読んだ方がいいと思うけど)
398 :
デフォルトの名無しさん :02/11/25 18:53
どうしてPascalのポインタは↑なのにTurbo Pascalのポインタは^なんですか?
単に、キーボードと印刷の都合と思ふ
Turbo Pascalの^と標準Pascalの↑はどちらが一般的なんですか?
同じ文字なんだけど、キーボード上に↑は無いので^を使ってるし、 印刷して^は見にくいので↑になっていると思ふ Pascalが生まれた頃は2バイト文字なんて一般的じゃ無かった筈だし
普通のPascalの↑は、かな変換でのを使用していいってことですよね?
アフ?
404 :
デフォルトの名無しさん :02/11/25 21:23
皆さん解説蟻が鯛です。 とても分かりやすくて感謝してます。 function intersection(S1,S2:list):list; var s,p:list; begin interlist(S);p:=S1↑.next; while p≠nil do begin if search(p↑.item,S2)≠nil then insert(S,p↑.item); p:=p↑.next; end intersection:=S end において、pの必要性がわかりません。 p:=S1↑.next;の部分を消して、以下pをS1としても駄目なんでしょうか?
406 :
デフォルトの名無しさん :02/11/26 00:01
S1, S2は引数にvarが指定されていないので、変更不能だと思いますが、それはさておき、 線形リストはリスト全体を保持しておくために先頭のレコードを指すポインタが必ず必要です。 この値を変更して途中のレコードを指すようにしてしまうと それ以前のレコードを参照する手段が完全に失われてしまいます。 S1 これなら全て参照可能 ↓ 【データ|next】→【データ|next】→【データ|next】→【データ|nil=終端】 S1を変更した場合 S1 ↓ 【データ|next】→【データ|next】→【データ|next】→【データ|nil=終端】 ↑ このレコードが参照不能になる disposeしない限りレコードはメモリ上に残っていますから 参照不能なメモリブロックがメモリ上に残るという まずい事態になります。(メモリリーク?) 線形リストの処理は 先頭を示すポインタはそのままに、 別なポインタ変数を用意して その値を変更して順次リストをたどっていきます。 で、405のような処理を書いた場合は 一度きりなら動くかも知れないが 以降、このリストを参照することができなくなる、というのが結論かな。
線形リストはレコードの追加、削除ができますが その場合でも常に全体を参照できる様、 例えば先頭にレコードを追加する場合は 変更後の先頭のレコードをさすようにポインタを変更します。 先頭のレコードを削除する場合は 次のレコードをさすようにポインタの値を変更します。 ところでプログラム中の4行目のp:=S1↑.next; は もしかしたら p := S1 ではないのかと。 S1の一番はじめのレコードが無視されているような気がします。
409 :
デフォルトの名無しさん :02/11/26 00:38
>>408 つまり、pはS1の値を保持するためにあると言うことかな?
>もしかしたら p := S1 ではないのかと。
確かにそんな気がします。
S1の先頭にダミーセルがあることにしてるのかなあ?
Pの役割はイメージ的には配列の要素を参照する時のインデックスみたいなものかと。 for i:=1 to 10 do if a[i] <= then xxxx; のiがP、aがS1とか。(かなり違うが) 価を自在に変えながらリスト中のレコードを次々と指し示していく役割をするポインタ(P)と 全体を保持しておくために常に先頭を指すポインタ(S1)は 役割が違うと考えた方がいいかも。(追加、削除を伴わない処理の場合)
恐らくばりばり既出ネタで恐縮なんですが、 今私は数学系の学部に在籍しておりまして、研究上アルゴリズムや素因数分解 等をコンピュータ上で行わなければならない必要性が出てきました。 時間の関係上、手っ取り早くそのような計算が自在にできるようになりたいのですが、 当方、残念ながらコンピュータはネットする程度でプログラムやC言語、UNIX等の知識は 限りなく0に近いです。。何からはじめればよろしいでしょうか。御指導願います。
スンマソ、スレ違いでした。。。
>>410 さんが言っているように、
pはいわゆるイテレータというやつで、
S1はリストの先頭を保持するという役割があるので
たとえS1でpを代用できてもするべきじゃないです。
414 :
デフォルトの名無しさん :02/11/27 21:52
Error: Incompatible type for arg no. 2: Got SHORTSTRING, expected LONGINT どなたかこのエラーメッセージのわかる方いらっしゃいますか?
引数の2個目はLONGINTが来るはずなのにSHORTSTRINGだよボケが
416 :
デフォルトの名無しさん :02/12/03 23:46
落ち阻止。
417 :
デフォルトの名無しさん :02/12/07 17:08
リスト構造をもつ、ポインタ(pointer)型の変数を使用してデータ入力後絶対値に関して昇順に並べ替えたいのですがどうしてもうまくいきません。どうプログラムを書いたらいいでしょうか?
419 :
デフォルトの名無しさん :02/12/07 17:18
簡単に言うとポインタを使って昇順の連結リストをつくりたいのですが。
420 :
デフォルトの名無しさん :02/12/07 17:51
>419 中身を比較したのちポインタを書き換える。それだけ…… 基本情報処理の本のリストに関する部分を読めば直に分かる。
>>419 対象をポインタで持っているのなら、ヒープソートなんかで木構造を一時作って、
それを再度リスト構造に戻すのが良いかも。
汎用的に作るのなら、ソート関数は作り込まず、外部のソート関数を呼び出すよ
うにすればよいし。
コンソールアプリケーションである値を入力したら窓を閉じるにはどうしたらいいですか?
コンソールアプリケーションに窓なぞない。
>>423 窓って言うか…何て言ったらいいんだろう?
Delphiでコンソールアプリケーションを作って実行したらコマンドプロンプトが起動するじゃないですか。
それを閉じたいのですが無理なんでしょうか?
exit(return)
>>425 exit(return)だったら実行できませんでしたがちょっと削ってexitにしたら閉じることができました。
ありがとうございました。
>>462 ごめん、(return) はなんとなくノリで。
DOS 窓の終了と同じ雰囲気で。
428 :
デフォルトの名無しさん :02/12/09 00:28
>424 DelphiはDelphi板で聞くのが良いよ。
>>425-426 Exitは関数や手続きを抜けるだけじゃない?
もちろんprogram .. begin .. end のレベルで実行すればプログラム自体を
抜けるけど。
どこでも即座に終了させたかったらHaltを使うべし。
>>429 ご指摘ありがとう。しばらくDelphi使ってないのでかなり忘れてました。
431 :
デフォルトの名無しさん :02/12/31 17:01
逆ポーランド記法をスタックをよういて実現したいのですが、プログラムがうまくかけません。 どなたか教えていただけないでしょうか?
432 :
デフォルトの名無しさん :02/12/31 18:15
よういて?
もちいてだっての バカ
434 :
デフォルトの名無しさん :02/12/31 18:45
用いる。 餅炒る。 モチ要る。
435 :
デフォルトの名無しさん :02/12/31 18:46
>>431 if (数字) {
スタックにpush;
} eles if(演算子) {
スタックから二つpopして演算;
結果をスタックにpush;
} else {
error;
}
IP記録実験
http://qb.2ch.net/test/read.cgi/accuse/1042013605/ 1 名前:ひろゆき ◆3SHRUNYAXA @どうやら管理人 ★ 投稿日:03/01/08 17:13 ID:???
そんなわけで、qbサーバでIPの記録実験をはじめましたー。
27 名前:心得をよく読みましょう 投稿日:03/01/08 17:20 ID:yL/kYdMc
SETTING.TXT管轄でないということは全鯖導入を視野に、か?
38 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/08 17:22 ID:rLfxQ17l
>>27 鋭いです。
73 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/08 17:27 ID:rLfxQ17l
>ところで、IPが抜かれて何か今までと変わることってあるのでしょうか?
・今までより、サーバが重くなる。
・裁判所や警察からの照会があった場合にはIPを提出することがある。
>>1 全板IP記録に追い込まれた今の気持ちをどうぞ。
記念カキコ
ひろゆきは架空の人物ですよ。
(´皿`;)邪穂でごめん
IP記録実験
http://qb.2ch.net/test/read.cgi/accuse/1042013605/ 1 名前:ひろゆき ◆3SHRUNYAXA @どうやら管理人 ★ 投稿日:03/01/08 17:13 ID:???
そんなわけで、qbサーバでIPの記録実験をはじめましたー。
27 名前:心得をよく読みましょう 投稿日:03/01/08 17:20 ID:yL/kYdMc
SETTING.TXT管轄でないということは全鯖導入を視野に、か?
38 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/08 17:22 ID:rLfxQ17l
>>27 鋭いです。
73 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/08 17:27 ID:rLfxQ17l
>ところで、IPが抜かれて何か今までと変わることってあるのでしょうか?
・今までより、サーバが重くなる。
・裁判所や警察からの照会があった場合にはIPを提出することがある。
======2==C==H======================================================
2ちゃんねるのお勧めな話題と
ネットでの面白い出来事を配送したいと思ってます。。。
===============================読者数: 138720人 発行日:2003/1/9
年末年始ボケがそろそろ収まり始めた今日このごろのひろゆきです。
そんなわけで、年末に予告したIP記録ですが実験を開始しています。
「2ちゃんねる20030107」
こんな感じで各掲示板の最下部に日付が入ってるんですが、
20030107以降になってるところはログ記録実験中ですー。
んじゃ!
────────────────────────Age2ch─
■この書き込みは、Age2chを使って配信されています。
────────────────────────────
Keep your thread alive !
http://pc3.2ch.net/test/read.cgi/software/1041952901/l50 ────────────────────────────
qbだけじゃなかったのか
モルモットにされたのか
もうちょっと電波度下げよう。意味不明になりすぎてる
厨房板の荒らしは削除されたようだ いつか全板で強制表示になるのだろうか? スクリプトくめばどこの板だって荒らせるだろうし
実験のためにトオルに依頼されてコピペやってるって可能性もあるのか・・。
>>936 それは当然考えてはいますが、小ネタやちょっとした意見を書き込むときにもそれを
意識しなくてはならないというのはしんどい
FreePascalはマルチプラットフォームであることを忘れているに、1Penis
つーかちょっと北朝鮮や朝鮮総連を批判しただけでログから身元割れたりしないか心配。 奴ら何しでかすかわからない凶悪な連中だからな。 ログってひろゆきしかみれないのか? 削除人が見れたら問題・・・以前削除に絡んで強請をした奴もいるらしいし
ふむ。
言いたいことも言えないこんな世の中じゃ ウェー ハッハッハ
2chのIDてIPを変換してるんだっけ? だったら、全板強制IDにして暗号キーだけ保存しておけばいいんじゃないの?
夜勤 ★さんはなんでふだんはBG ★とかキャップを使い分けてるんですか?
削除板に書き込む時いちいち設定し直すのが面倒臭いから
元々パク(ry
======2==C==H======================================================
2ちゃんねるのお勧めな話題と
ネットでの面白い出来事を配送したいと思ってます。。。
===============================読者数: 139038人 発行日:2003/1/10
なにやら、連日メルマガだしてるひろゆきです。
そんなわけで、ログ記録実験ですが、いちいちサーバ指定するのが面倒なので、
全部のサーバに入れてみました。
重くなって落ちたりしてもご愛嬌ってことで。。。
んじゃ!
────────────────────────Age2ch─
■この書き込みは、Age2chを使って配信されています。
────────────────────────────
Keep your thread alive !
http://pc3.2ch.net/test/read.cgi/software/1041952901/l50 ────────────────────────────
フェミホモ荒らしが来なくなるなら まあいいか。。。 悪いことをする気はなかったど、なんだか 夢がなくなるな。 なんつーか、手口のきれいな銀行破りが 捕まっちゃったみたいな気分。
まあ、匿名じゃなきゃできんような自由な言論なんてたかが知れてるしな。 今までの2ちゃんみてりゃ一目瞭然。 匿名のかさをきて暴言はいてる奴らが減っていいかも。
じゃ、おまえが2ch来なければ良い。それだけのこと。
ネオむぎを超えるわけない 犯人が17歳以下なら話は別だが
中国の漬け物ですか?(^_^;)
IP取るようになったら些細なことでも訴えられるかもな。 ここまで話題性の在るサイトだし。 IP取ってるんだから今までは『訴えても意味無い』って諦めてた 人たちも訴えるようになるかもね。 基本的に訴えられるのは書き込みした人だろうけど、 その様な場所を提供したって事実に変わりは無いから 今まで以上に2chも訴えられるかも…。 推論スマソ
削除前の手続きの話なんで、発信者の責任の話とはまぜないで欲しいが。
辞書登録してみた⇒夜勤さん!! ヘ(^^ヘ)(ノ^^)ノ
472 :
デフォルトの名無しさん :03/01/13 01:22
3 6 1 4 2 5 をクイックソートで整列させるにはどうしたらいいですか?
(^^)
今GNUパスカルを使って勉強しているんですが freeパスカルとの違いは何かあるんですか? 使える文法が違う、みたいな
405 名前:心得をよく読みましょう 投稿日:02/12/31 11:04 ID:ADTGAx9x はぁぁぁ。あと、1週間以内で生理・・・。 何事にもむかついてたまらないっ! 生理前って、ブルーになったり、いらいらしたり。。。 ほんと勘弁してって感じ。
(^^)
constって何なんですか?
たしかサリエヌの友人だったと思います
>>477 const {定数}
BUF_SIZE = 32768;{ Buffer Size = 32768 (8000h) }
Ver: string[3] = '1.0';
定数の事かと…
var {変数}
argc: integer;
argv: string;
i,k,l: integer;
(^^)
>>479 すいません
なかなか書き込むひまがありませんでした
レスありがとうございました
483 :
デフォルトの名無しさん :03/01/29 00:31
CarbonLibは使えるんだろうか
上のリンク見る限りでは無理そうだね。 別途コード戦士が必要みたい。 でもそれだったら最初からコード戦士でやった方が良い罠。
485 :
デフォルトの名無しさん :03/02/02 04:46
test
const hexcode: array[0..15] of char = ('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'); function HexStrB(num:byte):string; begin hexstrB:=hexcode[lo(num) shr 4 ]+hexcode[lo(num) and $f] ; end; ten := ' '; num := 0; repeat writeln(HexStrB(buf[num]) + ten + HexStrB(buf[num+1]) + ten + HexStrB(buf[num+2]) + ten + HexStrB(buf[num+3]) + ten + HexStrB(buf[num+4]) + ten + HexStrB(buf[num+5]) + ten + HexStrB(buf[num+6]) + ten + HexStrB(buf[num+7]) + ten + HexStrB(buf[num+8]) + ten + HexStrB(buf[num+9]) + ten + HexStrB(buf[num+10]) + ten + HexStrB(buf[num+11]) + ten + HexStrB(buf[num+12]) + ten + HexStrB(buf[num+13]) + ten + HexStrB(buf[num+14]) + ten + HexStrB(buf[num+15]))); inc(num,$10) until (num = $200);
おお、神!(´д`;)アリガd
490 :
デフォルトの名無しさん :03/02/10 20:53
Pascalって実用性無いのに勉強しても平気でしょうか?
えーと…、まあ、これからやるならやめときなさい。 Eiffelをお薦めしよう。
>>490 C++を勉強しなさい
C#はだめだぞ
Gnu CppならLinuxでも使用可能だ
えいめ〜ん
493 :
デフォルトの名無しさん :03/03/08 12:55
はげしくホッシュ
>>490 Pascalを勉強する価値がないとしたらそれは
実用的では無いからではなく時代遅れだから。
昔は教育用言語として教えられてはいたけど
今ではJavaとSchemeに取って代わられたよ。
と、一ヶ月前のレスに混じれ酢してみました。
496 :
デフォルトの名無しさん :03/03/29 11:11
10年程前にPC-DOS+Turbo Pascal 7で作ったプログラムを動かしたいのですが、困ったことに最近のパソコンはEMSメモリが使えないものが多いのです。 新型パソコンでEMSメモリ使用可能なものがあったら教えてください。
DOS 上で動かすか、エミュレータ上で動かせば。
>>496 DOS5.0の時とかXMSをEMM386でEMSに化けさせてたと記憶してるけど。
499 :
デフォルトの名無しさん :03/04/01 21:59
496です。 497さん498さんレスありがとうございます。 >DOS 上で動かすか、エミュレータ上で動かせば。 ハードの問題なのでどちらの方法でも動かないのでは? システムコマンダーでWinとDosのデュアルブートにするつもりなのですが
>>499 間を取ってWindows3.1とかどうだ?
って言うかVMWareでも使った方が楽ちんな予感。
EMS だけの話なら EMS をエミュればOK! 昔やった記憶があるが具体的には忘れた。 ただ楽するなら、500(おめ!)さんの 言うようにVMWareでも使った方がいい。
現在Pascal勉強中の初心者です。 Pascalって実用性が無いんですか? CGIをやるのに適してるって聞いたんだけど・・・
趣味でやるぶんにはかまわないでしょ。
実用性はあるが、CGIってのは多分Perlと混同してる(w Pure Pascalじゃなくて有償版Delphi/Kylixなら高機能なCGIも作れないでもない
>Pure Pascalじゃなくて有償版Delphi/Kylixなら高機能なCGIも作れないでもない アホがいます。
WebSnapとかIntraWebとか、まあ知らないなら知らないでいいけどさ
>>506 何でもかんでもライブラリがないと何もできないかわいそうな人がいます。
こういう書き込みの後でなんですが, Cのscanfに相当する機能を実現する関するのライブラリって どこかにありませんでしょうか. 以前自作したのですが作りが下手なのか処理が重すぎて…. テキスト解析はちゃんと本を読んで勉強しないとダメかな.
>>508 > Cのscanfに相当する機能を実現する関するのライブラリって
> どこかにありませんでしょうか.
scanf のソース見てポーティングすればいいとおもうけど。
可変引数の扱いをどうするかが問題かと思うが。
(^^)
>>509-510 レスが遅くなってごめんなさい….
scanfのソースは探してみます.ありがとうございます.
ちなみに可変引数は前に作ったときは配列型で対応していました.
var指定が出来なかったのでポインタを渡す仕様にしていました.
513 :
デフォルトの名無しさん :03/04/25 04:18
JIS PASCAL水準1準拠の処理系ってありませんか。 またpacked array[0..7] of booleanを1バイトに詰め込んでくれたり、set of 0..256が書けたりするのも…。 どれも実装が面倒なんだろうか…
514 :
bloom :03/04/25 04:26
そういえば規格では set of Charが集合の最大サイズでしたっけ。 ってことはCharがWideCharになるDelphi.NETではset of 0..65535が可能に!?
そうかset of charが集合の最大サイズなのか… JIS規格書が会社なんで確認できないな。 基底型は任意の順序型だと思っていた。
517 :
デフォルトの名無しさん :03/04/25 05:17
>>502 実用性がないとかまことしやかに言われていますが、そんなことはないです。
CGI は、言語が標準入力と標準出力をサポートしていれば、どんな言語でも可能です。
518 :
デフォルトの名無しさん :03/04/25 05:44
519 :
デフォルトの名無しさん :03/04/25 05:46
>>517 適用範囲を限定すればJIS PASCALでも実用性が見いだせるということですね
逆に何らかの拡張を施さないと適用範囲は広がらないと。
>>518 ありがとう。
危うく自前でコンパイラ作りそうだったよ。
GNU PASCAL検討してみます。
CodeWarrior Pascal packed array[0..7] of booleanを1バイトに → 出来る。 set of 0..256が書けたり → set of 0..2047までOK。 (256byte) THINK Pascal packed array[0..7] of booleanを1バイトに → 不可 set of 0..256が書けたり → set of -32768..32767までOK。
522 :
デフォルトの名無しさん :03/04/25 06:14
>>519 JIS Pascal と厳密にやると、分割コンパイルができないなど不便はありますが、
JIS/ISO 互換でやりたいなら、Turbo Pascal や Delphi のようなものを使って、
分割コンパイルは拡張機能を利用し、コード自体は、できる限り JIS/ISO 標準で
書くということなら、ISO C 言語程度の実用性は出てきます。
Turbo Pascal や Delphi が完全に ISO/JIS に準拠しているわけではありませんが、
かなり標準 Pascal の文法をサポートしています。
この本は、Turbo Pascal や JIS/ISO 標準 Pascal その他の文法に差異があるところに
注釈が入っていてよい本です。
演習PASCALとその応用
http://www.saiensu.co.jp/books-htm/ISBN4-7819-0507-2.htm
523 :
デフォルトの名無しさん :03/04/25 06:25
>>513 手元の Linux に入っていた GNU Pascal 2.95.4 でやってみましたらできるようです。
サンプル・ソース:
program iso(input, output);
var
a : packed array[0..7] of boolean;
b : set of 0..65535;
begin
writeln('hello');
end.
gpc -o iso iso.p
とやったら、
iso.p:5: warning: integer set size limited to 65535 elements from low bound
iso.p:5: warning: use `--setlimit=NUMBER' to change the limit at compile time
と出たので、
gpc --setlimit=65536 -o iso iso.p
としたら、エラーも警告もなくコンパイルできました。
動作は未確認ですが (^^
ちなみに、GNU Pascal は cygwin を使えば Windows でも動きます。
524 :
動画直リン :03/04/25 06:26
こうしてみるとDelphiって基礎部分が貧弱ですねぇ。 確か標準ってオープン配列で procedure A(const B: array[L..H] of Integer); なんて構文も使えませんでしたっけ?
>>521 ありがとう
最近の処理系は制限が少しずつ取れてきてるのですね
packed set of -maxint..maxintはどうだろう。
コンパイル出来ても実行は出来なくて当然だとは思うが…
CのビットフィールドとPASCALの詰めあり構造型の性質がそっくりなのは偶然?
527 :
デフォルトの名無しさん :03/04/25 06:45
あ、でも packed array[0..7] of boolean は 2 バイトになりました。0..15 まで 2 バイトで、0..31 は 4 バイト。これじゃだめですかね。 オプション指定もあるのかもしれませんが。
528 :
デフォルトの名無しさん :03/04/25 06:46
529 :
デフォルトの名無しさん :03/04/25 06:55
>>527 多分それは各要素に不定値を表すビットが含まれているんじゃないかと。
531 :
デフォルトの名無しさん :03/04/25 07:04
GNU Pascal で c : set of -10..65535; とおりました。
>>530 単に2byte単位でしか割り当て出来ないだけのような
>>530 そういわれればそうだな。はやとちりでした。
実行環境に適切な境界迄余分なバイトが詰められるのは構わないです。
534 :
デフォルトの名無しさん :03/04/25 07:26
535 :
デフォルトの名無しさん :03/04/25 08:09
GNU Pascal で set -65535..65535 は gpc --standard-pascal --setlimit=131071 でとおりました。
訂正;THINK Pascalでもpacked array[0..7] of booleanは1byteでした。
>>526 >packed set of -maxint..maxintはどうだろう。
>コンパイル出来ても実行は出来なくて当然だとは思うが…
maxintが32767なのでTHINK Pascalでコンパイル&実行できます。
集合はもともと1bit扱いなのでpackedがついてもつかなくても
変数のサイズは同じです。
エラトステネスのふるいで素数を求めるプログラム、
set of 0..maxint (32767)でコンパイル&実行できました。
最後の3つの素数 = 32717 32719 32749
537 :
デフォルトの名無しさん :03/04/25 08:52
>>536 エラトステネスのふるいって、集合型でどうやるんですか?
0 から n までの配列を用意して、素数なら true、合成数なら false にしていく、
というものだと思うんですが。
set of Xもarray[X] of Booleanも、言語仕様上はともかく役割としては変わらないよ。 配列で A[i] → 集合で i in A A[i] := True → Include(A, i) A[i] := False → Exclude(A, i) Adaなんか開き直ってBoolean配列に集合演算の能力持たせてるし。
やってることは配列を使うのと大差ない。 はじめに[2,3,4,5,6..maxint]という集合を用意しておいて nの倍数を集合から除去していくだけ。
540 :
デフォルトの名無しさん :03/04/25 11:12
エラトステネスのふるい、集合型バージョン。こんなんでできました。 コンパイル・コマンド: gpc --standard-pascal --setlimit=65536 -o primenumber primenumber.p program primenumber(input, output); const n = 65535; var prime : set of 0..n; i : integer; j : integer; begin prime := [0..n]; for i := 2 to n do if prime >= [i] then begin j := i + i; while j <= n do begin prime := prime - [j]; j := j + i; end end; for i := 2 to n do begin if prime >= [i] then writeln(i); end end.
541 :
デフォルトの名無しさん :03/04/25 11:16
空白が崩れた。スマソ。 program primenumber(input, output); const n = 65535; var prime : set of 0..n; i : integer; j : integer; begin prime := [0..n]; for i := 2 to n do if prime >= [i] then begin j := i + i; while j <= n do begin prime := prime - [j]; j := j + i; end end; for i := 2 to n do begin if prime >= [i] then writeln(i); end end.
>>541 &ensp;の嵐で何が書かれているのかさっぱりわからん。
543 :
デフォルトの名無しさん :03/04/25 12:02
>>542 あれ、そうですか。私 Opera なんですけど、大丈夫です。
ブラウザ依存なんでしょうか。すみません。
544 :
デフォルトの名無しさん :03/04/25 12:03
545 :
デフォルトの名無しさん :03/04/25 12:44
そうそう、
>>541 の結果ですけれど、最後の 3 つは、65497、65519、65521 でした。
型T=set of 0..maxintの各元表記全体からmaxint+1ビットの符号無し整数への1対1写像は定義できるよな? もし定義できるのならinteger型の範囲は遙かに越えてしまうな で、更に(有限)整数上の加法と一致するように型T上の加法をうまく定義して…(略) 普通はintegerの配列で実現する多倍長整数とは一風変わった整数(環)が出来そう これをリストに持たせてもっと大きな数に対する〜のふるいが… 工夫しないとメモリ不足になりそうだな 或いはset of -maxint..maxintを基数2の固定小数点表現とみなすのも面白そうだ 体調が回復したらやってみよう
We Love Pascal.
━―━―━―━―━―━―━―━―━[JR山崎駅(^^)]━―━―━―━―━―━―━―━―━―
∧_∧ ピュ.ー ( ^^ ) <これからも僕を応援して下さいね(^^)。 =〔~∪ ̄ ̄〕 = ◎――◎ 山崎渉
良スレの予感
その教科書のどこかにある list 型構造体の定義を見直してみてくれ。
Lazarusの落とし方がわからん...
554 :
デフォルトの名無しさん :03/07/03 20:20
初心者から質問です 10人分の学生の成績データを打ち込み、 次に10点区切りでヒストグラムを出力するプログラムを書こうとしています。 現在ヒストグラムの作り方がちとわかりません。どんな形のヒストグラムでもいいのでプログラムソースを教えてもらえないでしょうか?
if (点数 => 0) and (点数 < 10) then ヒストグラム[1] := ヒストグラム[1] + 1; if (点数 => 10) and (点数 < 20) then ヒストグラム[2] := ヒストグラム[2] + 1; ... と並べて書くとか。
556 :
デフォルトの名無しさん :03/07/03 20:39
>>554 学校の課題だろうと思うんで、ここでいきなり答えを書くのはちょっとね。
自分でどこまでやったん?
PROGRAM Histogram; VAR data: ARRAY[1..5] OF INTEGER; i, j: INTEGER; BEGIN data[1] := 0; data[2] := 1; data[3] := 4; data[4] := 2; data[5] := 1; FOR i := 1 TO 5 DO BEGIN Write('Fraction ' + IntToStr(i) + ':'); FOR j := 1 TO data[i] DO Write('*'); WriteLn; END; END.
558 :
デフォルトの名無しさん :03/07/03 20:43
まず、「ヒストグラム」とは何か、わかっているか。 プログラムの流れとしては (1)データの入力 (2)集計 (3)ヒストグラムの出力 に分かれるわけだが。
スマソ>556
集合型はフラグくらいにしか使ったことなかったけど なかなかエレガントな使い方があるものだね 感心しますた
561 :
デフォルトの名無しさん :03/07/11 15:43
学校の課題で『ブラックジャック』作ることになったんですが どなたか、教えていただけませんか。
>561 取り敢えず「手塚治虫」で検索しとけ。
563 :
デフォルトの名無しさん :03/07/12 23:44
>>561 カードゲームなら実際のカードを使って一人遊びすれば必要な構造が見えてくるぞ。
564 :
デフォルトの名無しさん :03/07/13 00:06
一人遊び? ハァハァ
565 :
名無し@沢村 :03/07/13 00:08
A U T H O R D A T A
本田 守さん
--------------------------------------------------------------------------------
名前
本田 守/ほんだ まもる
ハンドル
Mr.あねさん
ホームページ
http://www2.neweb.ne.jp/wd/wonder/ http://hp.vector.co.jp/authors/VA015412/ MESSAGE
プログラムの勉強をはじめて1年とちょっとになります。まだまだ高度なものを作るには程遠いですが、先だっては某社のプログラミングコンテストに入賞させていただきました。
--------------------------------------------------------------------------------
S O F T W A R E
--------------------------------------------------------------------------------
Windows95/98/Me/アミューズメント
●KIKU おど〜る
音楽CDをかけるとキャラクターが踊ります
567 :
デフォルトの名無しさん :03/07/13 03:20
集合型にシフト演算子があったらなぁ
それは集合なのか?
569 :
デフォルトの名無しさん :03/07/13 12:46
ビットの集合です
>>562 あの漫画の題名はトランプのそれとは無関係だそうです.
…じゃなくて,どうしてプログラミングを教えている学校の先生は
生徒の理解度を無視してこういう課題を出すのか理解に苦しみます.
とりあえず>561はじゃんけんゲームは作れますか?
>570 もちろん作れません 何かヒントでもいいんでおねがいします。
572 :
デフォルトの名無しさん :03/07/14 08:12
>>571 ゲームのルールをよく吟味して場にある有形、無形のものを列挙してみんさい
カードをとってくる関数と 勝敗を判定する関数と 手に持ったカードを表示する関数と 入力を受け付けてカードをとるか終了するか決める関数を書けばいい。
574 :
デフォルトの名無しさん :03/07/14 11:30
データ構造決めなきゃ片手落ち
575 :
デフォルトの名無しさん :03/07/14 13:50
>>573 関数が使っている教科書にあまり載ってないんで
何かいいサイトあったら教えてください
>>571 簡単なゲームプログラムを解説したサイトか入門書を見つけてみて.
やりたい処理をプログラムというカタチにするというのは一番基本的な能力であり,
一つや二つのヒントで解決する問題ではありません.
でもこれさえクリアすればプログラミングは半分マスターしたようなものです.
ルール見たけど結構複雑。ま、そこまで要求してないのかもしれんが。 「無限デック使ってます」って言えばカードの残り考えなくてもすむかも。 (ハートのAが10枚出てきても知らんふり。)
__∧_∧_ |( ^^ )| <寝るぽ(^^) |\⌒⌒⌒\ \ |⌒⌒⌒~| 山崎渉 ~ ̄ ̄ ̄ ̄
良スレ保守
Pascalの集合型と混同してるのかな。このプログラムは集合型は関係ないよ。
どのプログラム?
583 :
デフォルトの名無しさん :03/07/27 17:35
比較用関数を複数作って関数ポインタで切り替えて使う。
ソート用の手続きをつくる。 引数は点数でソートするか学生番号でソートするかを示す。 「student_record」と「ソートの引数」を引数にとる関数をつくる。 返り値は点数か、学生番号。 この関数をつかってソートをつくる。 あんまり効率よくなさそうだけど。
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ダウンロード済み)
なるほど。ありがとうございます。
>>585 と
>>586 の手法は同じではないですよね。
かなり参考になりました。
ですが、585さんの
>ソート用の手続きをつくる。
>引数は点数でソートするか学生番号でソートするかを示す。
これを具体的にどうしたらよいのかぜんぜんわからないんです・・・
例題だと、
if student[i].score < student[j].score then begin
で点数で比較してますよね。
これを点数だけではなく番号でも比較できるにするためにはどうしたらいいのでしょうか。
procedure sort(x: ...); ... if hoge(student[i], x) < hoge(student[j], x) then begin って書いて、hogeも書く。
>>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で動作確認済み
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文忘れてしまったよ)
なるほどなるほど。 かなりよくわかりました! ここは本当にすごい人が来るんですね。 驚きました。
すごくはないよ。基本的なことだし。 動的な関数を作りたいなと思って Pascalの上で実現してしまったとかならすごいと思うけど。
Lazarusの落とし方知ってるひといますか?
「ハノイの塔」とやらの問題解決プログラムを教えて下さい。 本気で何がなにやら・・・。
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;
どうもありがとうございます。 なんだかエラーが沢山出るんですけど、貼り付けるだけじゃ駄目なのでしょうか。。。 厨ですみません。
hogeと .... from から to へ一枚写す のところをきちんとかかないとダメ。 hogeを文字列にして 移動を表示するようにするとか。 writeln(from + 'から' + to + 'へ移動'); Pascalの細かいところ忘れたんで正しいかどうか解らないけど。 再帰するにはforwardとか要るような気もするな。
(^^)
(⌒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にはない。 処理系依存の機能を仮定しないと無理っぽい。
無理ですか。 あ、そっか。画面の大きさが分からないから、 1ページ分書き直してスクロールアップ するのも無理だ。うーむ。
プログラムパラメタに画面の大きさを渡してもらえばいいんだった。 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; ってどう?
そういう手もあるか。 でも、画面の大きさを取得するのに、処理系毎の 工夫が必要。つーか、無理な場合もありそうな予感。 それよりも、独自に拡張して、cls, locateなどを 処理系毎に作るのが良いような気がしてきた。 ・・・でも、それやってると、キリがないし、 実力の範囲を超えそうです。
画面制御ライブラリを1つだけ用意する。 実体は各処理系に移植されたC言語のcursesライブラリを呼び出すだけ。 外部ライブラリの実装方法に規格上、規定はないのでやりたい放題。 cursesが移植されていない処理系はライブラリの仕様を公開してユーザーに任す。 というのは駄目?
標準的なPascalの文字変数ってstring[255]ですよね? で、var s:string[255]; という状態で、 1行ずつreadln(f,s); で読んでいくとして。 もしも1行の長さが255バイト以上だったら、 どうなるんでしょう。 アホな質問ですみません。
後ろの方がカットされます。
1行が255バイト以上の行を含むテキストファイルの読み込みは、 どうしたら良いのでしょう?
DelphiでもFreePascalでも、大抵は長い文字列を持ってるんじゃないかな…。 無いならChar単位で読むとか。
初心者質問ですいません。 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
>>611 Delphiの無限とも言える長さの文字列は、
便利で良いですねぇ。しかも、CommaTextで
自動的にCSVを切り分けてくれるし。(日本語対応で)
でも、今はちょっと長い文字列は無理みたい。
というか、やりたいのはCSVの読み込みなんですけど、
ひょっとしたら1行を一度に読み込むんじゃなくて、
1文字ずつ分析して、項目を切り分けながら
読み込む方が良いのかな?
ひょっとして、アルゴリズムって、公開されてる?
615 :
◆R/rLuLKeEI :03/08/27 02:02
>>614 >ひょっとして、アルゴリズムって、公開されてる?
理論的には有限オートマトン、正規表現、字句解析、構文解析などを検索すれば、いいんじゃないかな。
CSV形式をうまく構文(文法)に書き下す事が出来れば、ある程度形式的にプログラムに落す方法があるよ。
>>616 そだね、CSVごときに有限オートマトンとか大袈裟だったな。
で、これは日本語対応?
C#に日本語非対応なコードなど無い。
無知の知ったか。
>>620 おおっ!忘れていたが、何か画期的なアイデアに思える。(w
と、思ったが、調べてみたらこう書いてあった。
>どの文字列をエスケープシークエンスとして解釈するかは
>ソフトウェアによって千差万別であり、統一された規格の
>ようなものが存在するわけではない。
(T^T)
>>615 ,616
ありがとうございます。それをきっかけに調べてみます。
622 :
◆R/rLuLKeEI :03/08/29 00:54
>どの文字列をエスケープシークエンスとして解釈するかは >ソフトウェアによって千差万別であり、統一された規格の >ようなものが存在するわけではない。 なのに、「ANSI【アメリカ規格協会】」を冠しているのが不思議。
「ANSIエスケープシーケンス」は
>>602 へのコメントだよ。
0x1b(ESC)で始まる文字列をコンソールに送ることで
画面、コンソールの位置、文字の色等を制御するもの。
624 :
デフォルトの名無しさん :03/08/29 07:39
>>623 s/コンソールの位置/カーソルの位置/
一応、CSVを切り分けられるコードは書けた。 C#の>616のコードは読めなかったので、 適当に考えてやってみた。だけど、""→"に するのとか、漢字コードのチェックとか やってないし、変なCSVを回避するのも できないし、拡張性が無いコードになって しまっている。
Delphiのコンパイラ使おうぜ。
>>622 ANSIエスケープシーケンスも知らないコテハンか。
時代だな。
>>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より)。
と、慌てて調べても後の祭。
Cのソースを見ながら、CSV切り分け書いてるんだけど。 Cだとbreak,continueとかで、loopを跳んだり、 文をキャンセルするので、全然参考にならん。
同じように書けば良いじゃん。
無理じゃん。 break, continueが使えるか使えないかで、全然変わるよ。 とりあえず、フラグを追加して、似たような動作を確保。 ""→"にするのも出来たし、"なし文字列のスペースを 取り除くのも出来た。変なCSVでなければ、概ね基準通り 切り分けられるようになった。
>>631 えっ…
ひょっとして、DelphiやFreePascalにあるSystem.Breakは、独自拡張!?
634 :
◆R/rLuLKeEI :03/08/30 18:31
>>631 >無理じゃん。
>break, continueが使えるか使えないかで、全然変わるよ。
break文、continue文はラベル無しgoto文といわれるように、これらは等価なラベル有りgoto文に変換可能です。
>>632 DelphiやFreePascalのBreak、Continueが手続きであることの方が吃驚!
知らなかった私も低脳かえ?
>633は別人だが。
>>634 もちろん、goto文を使うことも考えたけど、
なんか邪道っぽくない?
ちなみに、うちのはTHINK Pascal。
>>635 PASCALで大域ジャンプ以外にgotoを使うのは邪道っぽい。
ちなみに、うちのはGNU Pascal。
ただし、JIS-PASCAL(X3008-1990)の範囲内で考えている。
macの場合、NewHandleやNewPointerでメモリーを 確保した場合、メモリー確保に失敗したら OSErrで分かるんだけど。 標準pascalのnewでメモリー確保に失敗したら どうなるの?というか、その判別方法は?
>>637 >標準pascalのnewでメモリー確保に失敗したら
>どうなるの?というか、その判別方法は?
JIS-PASCAL(X3008-1990)には何の記述もない。
必ず成功するかのようにも読める。
というわけで、その判別方法はない。
1.2 規定外事項
(1) 特定のデータ処理システム又は処理系が処理できるプログラム及び
データの大きさ又は複雑さの限界並びにそれらの限界を超えた場合の措置。
>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)
>>639 ほんとだ・・・あった・・・。サンクス
標準Pascalの本を見ながらやってたので、気づかなかった。
THINK Pacal入門の後ろの方に、ちらっと載ってた。
あとこれでCとの違いといえば、case文の挙動が
ちょっと違う事くらいか。
例えば、'tarou'と入力させて、 tarouという名前の変数か、 tarouという添え字の配列を作って、 tarou[rika]:=100; とか代入するには、どうすればいい?
できません。
じゃあ、tensuuは固定の名前で、 name:='tarou'; kamoku:='rika' tensuu[name,kamoku]:=100; kamoku:='eigo' tensuu[name,kamoku]:=90; とかは?
連想配列かあ。純粋なPascalじゃ無理かもね。 拡張構文使っていいならやりようはあるけど。
そうそう。連想配列。無理か・・・。 似たようなことは出来ない? つまり、プログラム自体は一定で、 データの構造次第で変数を増やしたり 減らしたり、参照したり、したい。 いっそ、独自のスクリプト言語を Pascalで作る方法を考えた方がいいか・・・。
連想配列そのものじゃなくても type Tensuu = record Name, Kamoku: string; Tensuu: Integer end; の配列かリンクリストでいいのでは? SetTensuu(list, name, kamoku, 90); みたいに使えるアクセサ関数を用意しとけば不便ってこともないでしょ。 Delphiなら、配列プロパティとかカスタムバリアントで構文上連想配列作れるけど
ここは「Pascal の初心者」なので、Delphi 等の拡張 Pascal は外すべきでは? で、純正 PASCAL には「連想配列」はありません。 配列の引数として許されるのは列挙可能な型のみです。列挙不可能な数学的実数を表現している実数型も使用できません。 だいたい、純正 Pascal には文字列型すらないんだし.... 連想配列を実現するコードを自分で書くことになります。 それを使って 647 さんの >Delphiなら、配列プロパティとかカスタムバリアントで構文上連想配列作れるけど ってことを実現することができるでしょう。
Delphiで言うところの動的配列も、標準では無いですよね?
var hairetu: array [0..maxNum] of integer;
の maxNumが変数であるのは許されないもんね。
まあ、この程度ならリストで代用できるから良いけど。
BasicでいうDIM文が懐かしい・・・。
>>648 >連想配列を実現するコードを自分で書くことになります。
どこかに、転がってないでしょうか。
"pascal 連想配列"でググッても、rubyやPHPが出てくる。
それと、連想配列って英語ではなんて言うの?
あそしえーしょんあれい。
久しぶりにTHINK Pascalのマニュアルを引っぱり出したが。
associtation arrayは載ってない。当然か・・・。
探していたら、こんなのを見つけた。
PASCAL ファンのための CGI プラットフォーム 「Reims」
ttp://member.nifty.ne.jp/ymagami/Reims.html こいつの言語仕様を参考に、associationやlongstringが
標準のPascalでも使えるようなルーチンを作るか。
・・・って、自分にできるか?(^^;
もっと偉い人が作った奴、どっかに落ちてないかなぁ。
PNL Librariesに、連想配列のコードがあった。 だけど、これはMacの、しかもコードウォーリアー用みたい。 少し書き換えればTHINK Pascalでもいけるみたいだけど。 スレ違いになりそうです。失礼しました。
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 のように一致したキーを探すことになる。 毎回、全数検査すると遅くなるからハッシュを使うとか、速度向上の手法はいくらでもあるけど、本質は検索だ
まだソースをざっと見ている段階ですけど、 結構高度なことをやっている様子。 追加、削除、検索など、一通りのルーチンは 揃っているみたい。使い方を解析せねば。
処理速度を犠牲にしてもいいなら 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としては↑間違ってる えいめ〜ん
3つの整数を読み込み、最小値と最大値を出力するプログラムを作りなさい。
>656 宿題?
最初に 整数を三つ読み込む。 次に 最小値を見つける。そして出力。 最後に 最大値を見つけ、それを出力。 簡単でしょ
こういうのをわざと、ObjectPascal使ってやったりしてな。
あ、そろそろ後期の授業が始まったわけか。
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.
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.
あ、sgn に if文を使っているんだっけ。
function sgn (si: integer): integer; begin case si of 0: si := 0; otherwise begin sgn := si div abs(si); end; end; end;
あ。begin, end 一個余分だ。 function sgn (si: integer): integer; begin case si of 0: si := 0; otherwise sgn := si div abs(si); end; end;
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.
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.
>>667 発想がすごい!
けど、うちの環境(THINK Pascal)だと、
2行目が通らないっす・・・
>>668 あ、関数型(手続き型の方が分かりが良いかな)って
標準Pascal仕様じゃなかったんですね。ちなみにDelphi
では通りました。
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.
>>656 読み込んでソートして一番上と一番下を見る
>>670 あ、なるほど。2変数のやつをもう一度繰り返せば3変数
に対応出来ますね。私は「一度に3変数に対応出来ない
か」と考えていました。
>>672 でもこれって、>667の
>writeln('min=', fmin(fmin(a, b), c));
>writeln('max=', fmax(fmax(a, b), c));
の派生みたいな物ですよ。
ただ、公式にあてはめただけです。
他にも、 const maxint = 32767; minint = -32768; var index: array[minint..maxint] of boolean; を使う方法も考えたけど、 メモリーが足りない(?)とかで 配列が確保できずに断念したっス。
>>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 配列とか知っているか?
それとなんでその問題で「実数型」にする必要があるんだ?
実数型だと比較が難しいぞ。
679 :
デフォルトの名無しさん :03/10/31 08:01
>>678 問題が実数型で入力せよとなっているので・・・。
配列はあやふやです・・・。
3つの最大・最小の次は、この課題ですか。ふふーん じゃあ、どうしよっかなー
(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.
>>682 ほとんどできてるじゃん。
>IF sin[i]:=max then
>write(' ',sin[i]);
>IF sin[i]:=min then
>write(' ',sin[i]);
ここ、「:=」じゃなくて「=」だ。
それと、この次に、
writeln;
の1行を入れる必要がある。
>>682 実数型を使っていないけど、いいのか?
それとトレース表の人数のあとに改行が入っているけど
それも問題無し?
>>684 そやな、ごもっとも。(w
でも、例とは違ってもええんちゃう?
それ言い始めると、「最低」の数字の
表示位置がずれてる気がするけど。
ところで。私も詳しく知らないんだが。 実数型って比較が難しいの?
>>685 おお、表示位置のずれは気づかなかった。という
ことで、そこも直す必要があるぞ。
>>682 >>686 10進と2進の変換誤差(浮動小数点の場合)と計
算誤差があるから、等号比較だと偽になる場合
が考えられる。あと、有効桁数の問題も気にとめ
ておく必要が出る場合もあるし。
まあ、今回みたいに変数に入れた物を代入する
場合なんかは等号比較が出来る場合が多いけ
ど、代入を計算と見なした場合は一度倍精度に
してから単精度に戻すなどの処理が入って値が
変わる可能性があることを頭に入れておいた方
が破綻しづらくなります。
と言うことで私は整数型で実装出来るものは整数
型で実装するようにしています。
>>687 そうか。誤差か。普段そこまでシビアな計算って
したことないんで、気にしなかった。
うちも整数型がほとんどです。
今回の場合、まさか身長で小数点以下2桁以上が
必要になることはないので。入力した数値を
×10して整数型で保存・計算。表示の時に
÷10して実数型(例だと下一桁)っぽく
表示するのではあかんのやろか。
この処理、逆に面倒?誤差が大きくなる?
>>688 私もその方が良いと思ったので「実数型にする必要があ
るんだ?」と聞いたんだけど... でも「問題が実数型で入力
せよ」という事らしいから、実数型にする必要があるみた
いですね。
それとも「入力が実数型」を受け付けると言うことだけで
良いのなら内部は整数で扱う方がプログラム的には楽
ですね。
計算することを考えるのなら、小数点以下2桁くらい取っ
ておいた方が安全かも。
実数型で入力し・・・そうか!!やっぱり
入力さえ実数型なら、ええんちゃう?
処理まで実数型とは書いてないもんな。
>>682 考えることは同じやね。うちも最初は小数点以下
2桁と思ったけど、例が下1桁だったので、表示
するときの手間を考えて下1桁って書いてた。
そんなわけで。>682は、課題完了だな。
レス有難うございます!!
あとですね、
>>676 のwhile文のほうがあって身長に0を入力した場合に入力が終わるプログラムなんだけど、
そうすると出力のときに身長に0が出てしまうんですよ。どうすればいいですか?
>>691 forとwhileの基本的な違いではないか。
それを考えるのが課題のポイントじゃ。
for 1〜2回 入力 1〜2回繰り返し 戻る repeat 入力 1〜2回繰り返し、3回目に0を入力 0以外は戻る 最後の入力は無効 で、ええんちゃうか。 そうすると問題は、のっけから0を入力された 場合のエラーセーフだけど。ま、やってみそ。
if文は使ったらいけないのヵ begin 一つ目を入力; while i>0 do begin 出力; 入力; end; end. たぶん不合格。 ん?0を「入力した」場合に「入力が」終わる?
あ。すまぬ。>693は何か勘違いして書いてるかもしれん。 そか。repeatはuntilで、whileは違うか。 ま、気にするな。(w
罪滅ぼしに、ちょっとヒントを。 var next:boolean; ... next:=true; while next do begin 入力 if a=0 then next:=false; その他のチェック end;
なんだその変なコード。
>>697 まあ、でたらめっちゅー事で。気にするな。
よかったら、すばらしいサンプルを提示して
やってくだされ。
>>696 while true do で if 〜then break すればいいんじゃ?
>>699 前にも似たような話があったけど、
標準Pascalではbreakが使えないのよん。
と、思って>700を書いたが。私の勘違い?
1周目を必ず通すならrepeat使いなよ。
ちょっくら問題作った奴に山嵐決めてくる。
ほんとだ、これは問題を作ったやつがバカ。
repeat - until を使った方が素直に組めるのに。
どうしてもwhileでやらなきゃならないのなら、入力
関数でも作って以下のようにするか...
function 身長入力関数(var 身長) : boolean;
begin 入力処理 end;
while 身長入力関数(身長) do
身長追加処理;
>>701 その通り、breakは無いです。元が教育用言語
だから、抜け道は作らないような構文になって
いるんですよね(caseのelse、otherwiseも無い)。
>>705 「課題」なんだから仕方ないよ。
Cだと、入力しつつ比較が出来るから、
関数を作る必要はないんだよね?確か。
breakが無いのはまだいいけど、
caseのotherwiseも標準にはないの?
これないと辛い。つーか、無理。
THINK Pascalはある。
>>706 いや、課題だからこそ変な制約を付けることなく作ら
せるのがよい。まあ、一定の方向に仕向けるためだ
ろうけど、それでプログラミング嫌いになったら教育
の価値無し。
otherwise(Delphiではelse)は無い。と言うかcase
を使う時点で出てくる要素は判っているはずだから、
全て列挙しろと言うことでしょう。otherwiseに入れら
れた処理を「あとで分類し直す」なんて事になったら
結構大変だというのは想像が付きそうだけど。
こんな強引な感じになりましたが一応例どおり動きました。 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);
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.
あのー、sinの宣言を見ていると、 整数型なんですけど・・・ 小数入力しても、小数点以下が 切られてない? (試してないので分からんけど)
sinってのは正弦みたいでやだな。
右シフトさせるプログラムがどーしても 出来ない・・・・
表示位置のずれはまだ直っていないようだが... あと
ちゃんとコンパイルして実行して動くかどうか確認し
て(もしくは不明点が見つかって)からアップしてくれ。
おまえのソースを全てチェックするほど暇じゃないん
だ。そっちのソースを直すより自分で全て書いた方
が早そうだし。
>>714 環境(対象コンパイラ、機種、OS等)の必要情報が
判らないとコメント付けようがないぞ。
>>716 とても例どうりに動くとは思えんが、本人がそう言っている
のならそれでいいや。
>>717 確かFreePascalはTurboPascalの構文が使えるんじゃな
かったでしたっけ?それならshrで行けます。下記参考。ち
なみに左シフトはshl。
var
a, b : byte;
begin
a := 8;
b := a shr 1; (* シフトしたいビット数 *)
writeln(a, ' ', b);
end.
>>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.
今日配列使って作ったもう一個のヤツ 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. 配列メンドイ なんか中途半端に理解した。
>>719 俺、配列使えなんて一言も言ってないんだけど。
何か良く分かんない(理解出来ないやり取りの)
所に来てしまったようなので、落ち着くまでしばら
く黙っていることにする。
学校の課題なんでないかい? 配列使え、っていう。
>>723 課題は課題で良いんだけど、「他の人に分かって
もらう書き方」ってのがあると思うんだ。特にこうい
う場では。それと「自分で出来るだけ努力する」っ
てのも大事だし。
それをしないでソース垂れ流し(それもちょっと?の)
されるんで、もう私には理解不能。だからこの件
(と思われるもの)には黙ることにしました。
ところで。右シフトって何? 2で割ればいいんじゃないの?
>>725 マイナスの値を右シフトと2で割ることをしてみれば、
違いが分かると思う。それと、算術計算とビット操作
はやっぱり別の話だから。
マイナスか。それは考えなかった。 でも、ビット操作なんてアセンブラでも使わない 限り必要ないんじゃないかと思うけど。 Cならいざしらず、Pacalでは意味ないよねぇ。 課題じゃしょうがないけど。
>>727 だってグラフィックフォーマットとか通信プロトコルなんかで
「ビットで状態を表す」物って結構多いから、ビット操作がで
きないと辛い場合って結構あるよん。
そういう時までアセンブラを持ち出すのはちょっと大仰だと
思う。高級言語でサクサク組めた方が何倍もカンタン。
>>728 そうか。なるほど。
ビット操作はマックならtoolboxにあるので、
THINK Pascalでもコマンド一発。
730 :
デフォルトの名無しさん :03/11/11 16:54
a<>b<>c みたいなことをやらせるには どうしたらいいのでしょう… 配列を使った課題がT-T
a <> b and a <> c
a <> b and a <> c and b <> c 等しくはならんが気休めにどうぞ。
andの方が優先度高い罠
そもそも、>730の課題は何がさせたいのだ? aとbとcがいずれも異なる値であることを 確認すればいいの? にしては、配列を使うって・・・意味不明。
>>735 意味を取ろうとするから意味不明。気にしなければOK。
課題を出している方はまともな課題を出していて、ここで
聞いているのの頭が「意味不明」なだけのような気がする
(もしくは本気で訊いていないのか)。今までの経緯から
すると。
意味が通る訊き方をすれば、それなりに答える気になる
のに。
配列を使ったプログラムの途中にa<>b<>cという判定が必要な部分があるとか
738 :
デフォルトの名無しさん :03/11/15 22:16
すいませんご教授おねがいします。 画面を再構成させる方法は存在するのでしょうか? 存在するのでしたら教えてください。 学校の宿題を作ってるとき、再構成しないと見栄えが悪いもので…
>>738 再構成ってどんなこと? 宿題と言われてもこっちは何も
分かっていないんだと言うことを理解して、詳しく説明し
てくれないと何の手助けも出来ないんだが。課題の内
容をこと細かく説明する必要は無いんだけど、「どんな
ことをやろうとして、どうなってしまったから、こうしたい」
くらいの説明がないと何とも。
あと、コンパイラ依存? それとも汎用? OSに関わりのあ
る(と思われる)場所は無いのかな?
見栄えを求めるとしたらどのレベル? 事によると宿題の
域を大幅に超えるかもしれないので、どれくらいの事を
したいのか分からないと答え辛いかも。
>>738 まるで
「僕のお小遣いで買いに行ける一番美味しいケーキはどれ?」
っていう質問に答えるようなものだな。
すいません、プログラミング初心者なので、 質問の仕方すらよくわかってません(/_<。) delphi6のコンソールで、文字列がずらずらと繰り返えされ 見難くなるので、画面の文字をいったん全部消去する 方法を教えてもらいたいのですが… 正直どう説明すればいいのかすら分かりません(-_-;)
>>741 Delphi6と言うことはWin32コンソールもしくはDOS窓に
なるのか。OSによって対応は違いますね。
16ビット系(Win95からMEまで)なら「ANSIエスケープ
シーケンス」が使えると思うのですが、32ビット系(NT
から2000,XPまで)はこれが使えないので「いちいちコ
ンソールと文字モードのサポートにあるAPIで制御」す
るか、改行で区切って綺麗に見せて出力するかしか
無いですね。
>>742 そうですか…きっぱりあきらめることにします。
初心者の馬鹿な質問に答えて下さいまして本当にありがとうございました
>>738-743 pageコマンドは?
(A)コンソールに対して
writeln('abc');
page;
writeln('xyz');
こうすると(THINK Pascalの場合)
(abcが表示された後、画面消去するので)
コンソールにxyzだけが表示される。
(B)ファイルに対して
var f:text;
..
writeln(f, 'abc');
page(f);
writeln(f, 'xyz');
こうするとabcとxyzの間に(改ページ)が挿入される。
一般的なPascalの教科書に出ているコマンドだよ。
745 :
デフォルトの名無しさん :03/11/17 22:23
>>744 delphiのコンソールじゃ出来ないんじゃない?
>>744 残念ながらBorlandのPascal言語系(Delphiだけで
なくTurboPascalから)はPageはサポートしていな
かったりする。
そうなんだ。
全く紛らわしいことしやがって。
TurboPascal風のコンソールユニット
http://www.slis.keio.ac.jp/~anakata/filearea/filearea.html から
Win32Crt.pas (w32crt03.lzh) を落として、解凍後、Win32Crt.pasを
Libフォルダにコピーする。
古いユニットなので、Delphi6では未定義の識別子 : 'KeyEvent' という
エラーが出るから、KeyEventという文字列を全てEvent.KeyEventに
置き換える。
これで、TurboPascalのCRTユニット風の関数が使えるようになる。
GotoXY, WhereX, WhereYがゼロオリジンなので、互換性を考えれば
ソースをいじったほうがいいかもしれない。
とりあえず、簡単なサンプル(Delphi6で確認)。 何かキーを押すと終了する。 program Project2; {$APPTYPE CONSOLE} uses Windows, SysUtils, Win32Crt; var f, b: Integer; begin for b := 0 to 15 do begin ClrScr; for f := 0 to 15 do begin TextColor(f); TextBackground(b); gotoXY(f * 2, f); Writeln('Test String [', WhereX, ',', WhereY, ']'); Sleep(1000); if KeyPressed then Exit end end end.
751 :
デフォルトの名無しさん :03/11/18 23:36
n個の値 a[0] , a[1] , ・・・ , a[n-1] が与えられているとき、 a[i]の順位 r を求めるプログラムを書いてください。 ただし、順位=(自分より大きいものの個数+1)です。 また、プログラム中に使用する名前の型、属性、意味内容を明示し、 実際の実行例もお願いします。
順番に調べればいいんじゃない。 x := 1; for i := 0 to n-1 do if a[i] > a[r] then x := x + 1;
>また、プログラム中に使用する名前の型、属性、意味内容を明示し、 >実際の実行例もお願いします。 それくらいは自分で考えた方が良いぞ。属性ってそもそも何?
とても素朴な疑問なんだが。 >n個の値 a[0] , a[1] , ・・・ , a[n-1] が与えられているとき この「与えられているとき」ってのを見る度に悩むんだな。 サンプルをどうしよう?って。 programなら、入力ルーチンを作るか、ファイルから読み込むか、 constで適当な値を作るか。 procedureやfunctionだけ作るとしても、pascalでは配列を 関数には渡せないよね? それとも、a[0]...っていうグローバル変数があるものと してもいいけど、それも美しくないし。
755 :
デフォルトの名無しさん :03/11/19 11:17
>pascalでは配列を関数には渡せないよね? いや…渡せるけど procedure A(B: array[C..D] of Integer); みたいな。 Delphiならprocedure A(B: array of Integer); で範囲はLow/Highで取る。
いや、勘違いだったら失礼。
>>756 そのC..Dが変数でもできたっけ?
>>755 ポインタで渡すのが確実か。確かに。
>>754 渡せるぞ。ちゃんと宣言すれば。以下参照。
Type
TIntArray = array[LO..HI] of integer;
var
A : TSomeArray;
procedure DoSomething(B : TIntArray);
として(LOとHIは定数で適当に宣言されているとする)、
DoSomething(A);
とすればちゃんと呼び出せるぞ。
>>756 手続き宣言の場所で直接配列を宣言すると、処理系に
よっては「違う型と見なされて配列を渡せない」事態にな
る可能性があるぞ。これは実装依存らしいから、絶対大
丈夫だとか絶対ダメだとか言えないのが面倒。
>>757 変数はダメです(処理系によっては大丈夫かも)。標準で
は定数しか受け付けません(というか実行時に大きさが
決まる配列自体が使えないはず)。
>>758 いや、私が言いたかったのはオープン配列。
規格はよく知らないけど、ものの教科書では
procedure A(B: array[C..D] of Integer);
で、任意の長さの配列を渡せるらしい。C..Dには実引数の添え字範囲が入る、らしい。
(もっとも、対応しているコンパイラは知らないけどね)
追記しているようにTP系(FreePascal/Delphi)では同じ機能はあっても構文が違う。
たぶん、環境に依存しないやり方としては、>758が 正しいと思う。見て、おぼろに思い出した。 だけど、わざわざ型を指定するのって、面倒なんだよね。
>>759 あー、オープン配列は使ったことがなかったので、完全に
忘れていました。書かれて初めて「そういうのがあったっけ
なぁ」という感じ。
私はオープン配列を使うような場面ではTListを使うので使っ
たことがありません。オープン配列を使わなきゃならないよ
うな手続きなんかも書かないし。
762 :
デフォルトの名無しさん :03/11/20 22:44
>>762 いいじゃん、放っておけば。大体用途の違う言語を
比較して「こっちが好きだ」って書いているような人
にろくなのはいないから。
分かっている人は「その言語はそういう用途には向
かない」とか「そういうことを目的として設計された言
語ではない」と書くと思う。
俺はタイプ量が多くなっても if (hoge)と括弧を書くよりは if hoge thenと書くほうが好きだ。 好きなところってそこしか思い浮かばなかった。 嫌いなところばっかり浮かんで来る・・・。
部分範囲型、集合型、配列の関係が好きだ… C系の言語でこれらの概念を持ってるのがサッパリ無いのはどういうことか
ビットで済ましているんだろ。
767 :
デフォルトの名無しさん :03/11/22 11:26
お願いします 英単語を入力して、そのつづりを逆順にした文字列を作りなさい。 実行例 英単語は? beautiful 逆順にしたつづりは lufituaeb できそうだと思ったんだけど挫折・・・
function ReverseString( S : String ) : string; var I, J : Integer; begin J:=Length(S); SetLength( Result, J); for I:=1 to J do Result[i]:=S[J+1-I]; end; 実行してないんで動くかどうかはシラネ
program rev; var st : string; i : integer; procedure swap(var a, b : char); var t : char; begin t := a; a := b; b := t; end; begin readln(st); for i := 1 to length(st) div 2 do swap(st[i], st[length(st) - i + 1]); writeln(st); end. こんな感じ?
770 :
デフォルトの名無しさん :03/11/22 17:51
回すのは、半分くらいでいいのでは?
あっ、半分になってるよね。スレ汚しすまん。
■フォーマット xx xx xx xx -- -- ----- A B C A... アイテムコード B... 強化パラメータ ( 9C < 0 < 64 ) C... 使用回数 ( 00 01 < E8 03 < 00 00 ) ※00 00 : 無制限 これどういういみでつか??
>>768 funciton ReverseString(S : String) : string;
var i : integer;
begin
for i := length(S) downto 1 do
result := concat(result, S[i]);
end;
これで良い気がする。
ほぉ。concat関数ですか。知りませんでした。
でも
>function Concat(s1 [, s2,..., sn]: string): string;
>説明
>Concat 関数を使うと,任意の数の文字列を結合できます。各パラメータは文字列型の式です。結果はすべての文字列型パラメータ>の結合です。
>次に示すように,正符号演算子(+)を使っても Concat 関数と同じ結果が得られます。
>S := 'ABC' + 'DEF';
>参考正符号演算子の方が Concat よりも処理が速くなります。
正符号演算子では文字列の加算の「度に」文字列分のメモリの確保と開放が行われてる(と思う)ので
前もってメモリを確保してある
>>768 のほうが速いと思われます。
(文字列が長くなるに従って差は大きくなると思います。
つまり、
速度を求めるなら
>>773 氏の方法より
>>768 のほうがよろしいかと。
実際に試してないんで知らないけど。
添字の計算部分の差で負けたりして(w
>>774 うーん、確かに速度的には遅くなるかもしれないけど、
この関数をそんなに頻繁に使うとは思わないので、な
るべく単純な形の方が分かりやすいような気がする。
あと、以下の形にすると、日本語に対応するのも楽。
function ReverseString(S : string) : string;
var
途中で書き込んでしまった。 function ReverseString(S : string) : string; var i : integer; begin for i := 1 to length(S) do result := concat(S[i], result); end;
再帰バージョン function reverseString (a: string): string; begin if length(a) <= 1 then reverseString := a else reverseString := concat(reverseString(omit(a, 1, 1)), a[1]); end; omitは omit(文字列,位置,文字数) で指定した部分を削除した文字列を返す, THINK Pascal の組み込み関数。
>>775 単純さを求めるとなると手っ取り早い日本語対応は
function ReverseString(S : widestring) : widestring;
では?(w
>>776 >result := concat(S[i], result);
result := S[i] + result;
むしろこちらのほうが単純(直感的)かと。
ただconcat関数に慣れてないだけかも知れんが…
>ただconcat関数に慣れてないだけかも知れんが… 文字列連結に「+」が使える事にかえって驚く。 resultというのもDelphi独自の規格だよね。
>>778 widestringを使うのは環境にだいぶ依存しそう
ですけど(確かに単純と言えば単純だけど)。
concatを使うのはあくまで私のやり方ですので、
+の方が分かりやすければそちらで問題ありま
せん。
781 :
デフォルトの名無しさん :03/11/25 00:22
>>779 Turbo Pascalからの仕様ですね。
782 :
デフォルトの名無しさん :03/11/25 08:07
おながいします 問 正の整数を読み込み、30桁の数になるまでそれを2倍、2倍にしていき、 30桁の数になったら出力する。 桁数ってどうだっけ・・・
program Hoge; {$APPTYPE CONSOLE} var bignum : array [1..30] of Integer; function keta: Integer; var i : Integer; begin i := 30; while (bignum[i] = 0) and (i > 1) do i := i - 1; keta := i; end; { keta } procedure nibai; var i : Integer; begin for i := 1 to 30 do bignum[i] := bignum[i] * 2; for i := 1 to 29 do begin bignum[i+1] := bignum[i+1] + bignum[i] div 10; bignum[i] := bignum[i] mod 10; end;end; { nibai } procedure print; var i : Integer; begin for i := 30 downto 1 do Write(bignum[i]);end; { print } procedure init; var i : Integer; begin for i := 2 to 30 do bignum[i] := 0; bignum[1] := 1;end; { init } begin init; while keta < 30 do nibai; print; end.
procedure init; var i : Integer; begin Read(i); bignum[1] := i; for i := 1 to 29 do begin bignum[i+1] := bignum[i] div 10; bignum[i] := bignum[i] mod 10; end; end; { init }
785 :
デフォルトの名無しさん :03/11/25 11:46
>>767 program ensyu(input,output);
const msg ='英単語の綴りを逆順にします。';
var engword,downword:string[30];
Len,i :integer;
begin
writeln(msg);
write('英単語は?');
readln(engword);
Len:=length(engword);
for i:=Len downto 1 do
begin
downword:=downword+engword[i];
end;
writeln('逆順にした綴りは',downword,'です。');
readln;
end.
function ReverseString(S: String): String; var i, j : integer; c : char; begin i := 1; j := Length(S); while i < j do begin c := S[i]; S[i] := S[j]; S[j] := c; i := i + 1; j := j - 1; end; ReverseString := S; end; { ReverseString }
激遅 function ketaketa(e : extended):integer; begin while true do begin e:=e*2; if log10(e)>=30 then break; end; ShowMessage(FloatToStr(e)); end;
procedure ketaketa(e : extended); begin while log10(e) < 30-1 do e:=e*2; ShowMessage(FloatToStr(e)); end;
procedure ketaketa(e : extended); var i : Integer; begin for i := 1 to Ceil((30-1 - log10(e)) / log10(2)) do e := e * 2; ShowMessage(FloatToStr(e)); end;
procedure ketaketa(e : extended); begin ShowMessage(FloatToStr(e * power(2, Ceil((30 - 1 - log10(e)) / log10(2))))); end;
procedure ketaketa(e : extended); begin ShowMessage(FloatToStr(e * power(2, Ceil((30-1)*log2(10) - log2(e))))); end;
function keta(e : Extended): Integer; var n : Integer; begin n := 1; while e >= 10 do begin n := n + 1; e := e / 10; end; keta := n; end; procedure ketaketa(e : extended); begin while keta(e) < 30 do e := e * 2; ShowMessage(FloatToStr(e)); end;
いろいろカキコ有難うございます。今日の授業で
>>782 を以下の.........の部分を埋めて作れと言われました。
program enshu(input,output);
const K=30;
var i,j,m,v, :integer
n :array[1..K]of integer;
begin
write('出発の値は?');
readln(m);
if m >0 then
begin
.............
while m<>0 do
begin
.............
end;
J:=J+1;
・・。
while j > 1 do begin for i:=K downto J do n[i]:= 2*n[i]; for i:=K downto J do begin ............... end; if n[i-1]<>0 then j:=j-1 end; for i:=1 1 to K do write(chr(n[i]+Ord('0'))); writeln end; readln end. スマソ全然わかんないです・
program enshu(input,output); const K= 30; var i,j,m : integer; {var i,j,m,v, : integer} n : array[1..K]of integer; begin write('出発の値は?'); readln(m); if m >0 then begin j := K; while m<>0 do begin n[j] := m mod 10; m := m div 10; j := j - 1; end; J:=J+1;
while j > 1 do begin for i:=K downto J do n[i]:= 2*n[i]; for i:=K downto J do begin n[i-1] := n[i-1] + n[i] div 10; n[i] := n[i] mod 10; end; if n[j-1]<>0 then j:=j-1 { if n[i-1]<>0 then j:=j-1 } end; for i:= 1 to K do { for i:=1 1 to K do } write(chr(n[i]+Ord('0'))); writeln end; readln end.
799 :
デフォルトの名無しさん :03/11/27 20:00
お願いします。 「・・・」の部分を埋めて作るように言われましたが、全然・・・。 氏名(全角7文字)、数学、英語の得点(100点満点)からなる個人データが保存されているファイルからデータを入力してそれぞれの合計点を計算し、合計点の大きい順に整列して表示するプログラムを作りなさい。 実行例 得点データを合計点順に整列します データファイル名は? SEISEKI.DAT 氏 名 数学 英語 合計 あああああああ 100 59 159 いいいいいいい 80 80 160 ・・・ program seiretu(input,output); const nmax=100; type index=1..nmax; Person=record name:string[14] math,eng:0..100; total:0..200; end;
続きです Personarray=array[index] of person; procedure sort(n:index;var x:personarray); procedure exchangeperson(var A,B:person); var temp:person; begin ・・・ end; var i,j:index; begin for i:=1 to N-1 do for j:=N-1 downto 1 do ・・・ end; var num:o..nmax; i:index; Student:personarray; Infile:text; Filename:string[80]; begin ・・・ end.
あのー、少しは自分でやった方がいいと思うよ? せめて、自分が考えたものを書くとかしたほうが。
コンパイル通しただけだから、バグ取りは自分で program seiretu(input,output); const nmax = 100; type index = 1..nmax; Person = record name : string[14]; math,eng : 0..100; total : 0..200; end; Personarray = array[index] of person; procedure sort(n : index; var x:personarray); procedure exchangeperson(var A,B : person); var temp : person; begin temp := A; A := B; B := temp; end; var i,j: index; begin for i:=1 to N-1 do for j:=N-1 downto i do if x[j+1].total < x[j].total then exchangeperson(x[j+1], x[j]); end;
var num : 0..nmax; i : index; Student : personarray; Infile : text; Filename : string[80]; begin Write('データファイル名は?'); Readln(Filename); i := 1; Assign(Infile, Filename); while not eof(Infile) do begin Readln(Infile, Student[i].name, Student[i].math, Student[i].eng); i := i + 1; end; num := i - 1; sort(num, Student); for i := 1 to num do Writeln(Student[i].name, Student[i].math, Student[i].eng, Student[i].total); end.
>>801 うん、私もそう思う。課題をそのまま丸写ししたのは、無視するか
どこが分からないか聞き直すのが良いと思う。
>>805 無視は冷酷なんで。ヒントくらいかな、最初は。
THINK Pascalに詳しい方がおられるようなので、 ちょっとスレ違いだけど、質問。 THINK Pascalで、「アプリケーションはそのままで、 ライブラリで機能拡張するもの」は作れますか? 具体的には、「HyperCardとXCMD/XFCN」や 「フォトショップとプラグイン」 「MacOSと機能拡張やコントロールパネル」 みたいな関係のもの。 できるとしたら、大雑把に言って、どうやるんですか?
>>805 いや、別に何も考えずに教えてくださいといってるわけではないんですよ。
クラスみんなですごく悩みながらやってて、どうしても分からん問題だけ聞いてるんです。
ただ、これからは途中のわかるとこまで書き込むように心がけます。
これは言い訳なんですけど、授業では何もパスカルのこと教えないのにやたら難しい問題ばかり出す先生なので・・・
>>807 出来ないかも。
やり方は多分『(1)コードリソースを作って(2)それをメモリ上に読み込み、(3)それを呼び出す』
という手順でやっているのだと思う。(68Kの場合)
で、3番目の“呼び出し”はC言語なら出来るんだけど
THINK Pascalだとハンドルを関数/手続き扱いしなければならないのでかなり難しいと思う。
(コードリソースの作成はTHINK Pascalでも出来る。)
色々やってみた結果CodeWarrior Pascalで
fPtr = function (a,b:integer):integer;
こんな感じで関数を型定義してやったらできた。
しかし、これをTHINK Pascalに持ってくると文法違反でコンパイルが通らなかった。
CodeWarrior Pascalで実行できたソースコードの例 プラグイン側の関数は2数の和を返す関数。 type fPtr = function (a,b:integer):integer; {←ここがTHINKでNG。型は必要に応じて変える} fHdl = ^fPtr; var plugHdl: fHdl; plugin: fPtr; c: integer; procedure loadPlugin; {とりあえずファイル名、リソースタイプ、IDは決め打ち} var iFileRef, iErr: integer; begin iFileRef := OpenResFile('pl1'); {プラグインファイルを開く} plugHdl := fHdl(Get1Resource('MyPL', 128)); {メモリ上に読み込み} iErr := FSClose(iFileRef); end; begin loadPlugin; {プラグインをファイルから読み込む} hlock(handle(plugHdl)); {ハンドルロック} plugin := plugHdl^; {一旦ポインタに移し替えないとダメっぽい} c := plugin(3,6); {関数呼び出し。プラグインは2数の和を返す関数}
>>808 どうしても分からん問題だけ聞くのは良いんだけど、こっちは
どうしても分からなん問題かどうかなんて判断付かないし、問
題だけ書かれたら「ただ丸投げしている」と思われても仕方が
ないだろう。
あと、「分かるところまで書き込む」んじゃなくて、「分からない
ところだけ抜き出す」事をしてくれ。元の問題も分からず、ここ
まで分かりましたと書かれても答えようがないし、問題と分かっ
たところを書かれると「こっちが分からないところを探し出す作
業」をしなければならん。
分からないところを抜き出す作業が面倒と言うことはないと思
うが、「分からないところを抜き出す作業をミス」したり、間違っ
て解釈したりするかもしれん。それでお互い時間と数レスを費
やすかもしれないと思うと面倒くさい。
812 :
デフォルトの名無しさん :03/12/02 23:26
10進法で表現された数を 2進法、8進法、16進法の表現に変換するプログラムを書いてください。 ただし、入力する10進法の数は(16^4)-1=65535までです。 また、実際の実行例もお願いします。
IntToHex といって見るだけ
>>812 **進法というのは分かっているのか? 分かっているとしたら
どこが分からないんだ? 分からないところだけを聞き直して
くれ。
あと、実行例くらい自分で実行して作ってもいいだろ。おん
ぶにだっこじゃ身につかんぞ。
>>809 ,810
いろいろ試していただいたようで、ありがとうございます。
ハンドルを関数型で確保するのが無理、って事ですね。
仕方ないですね。型にうるさいのは仕様ですから。
型を指定しないで、普通のハンドルなりポインターで確保
して、いきなりそのアドレスをinlineでコールしたら・・・
って思ったけど、それだと変数の受け渡しが出来ませんね。
817 :
デフォルトの名無しさん :03/12/03 12:11
function hoge(n, base: integer): string; var x: integer; s: string; begin if (base <> 2) and (base <> 8) and (base <> 16) then base := 16; s := ''; repeat x := n mod base; if x < 10 then s := chr(ord('0') + x) + s else s := chr(ord('A') + x - 10) + s; n := n div base; until n <= 0; hoge := s; end;
>実際の実行例もお願いします。 萎え
>>815 (807)
できました!
最初、引数・返り値を同じにしたダミーの関数を作って
その関数を実行時に機械語の絶対ジャンプで上書きするというのをやってみたんですが
デバッガ(Lights Bug)で追うと、きちんと上書きされているにも関わらず
平然と元の関数を実行してるんですね。(失敗)
で、動作をMacs Bugで追ってみたところ、
どうやら関数のアドレスを取得すると
ジャンプテーブルのアドレスが帰ってくるみたいです。
で、普通に関数コールするとジャンプテーブルをショートカットして
元の関数がダイレクトに呼び出されているようです。
そこで関数を引数にした手続きを別に作成し、
そこから関数を呼び出してみたところ、
うまいこと、プラグインの関数が呼び出されました。
[通常の関数コール]→[目的の関数]
[関数、手続きを引数とした関数コール]→[ジャンプテーブル]→[目的の関数]
なお、inline関数の場合、関数のアドレス取得自体が出来ませんでした。(コンパイル時にエラー)
どこかにひとつ、その関数が作られるわけではなく
コードの随所にそのバイト列が単純に埋め込まれるようになっているからだろうと思います。
THINK Pascalで出来るコードリソース呼び出し
type
funcOverWriteT = record {関数書換用の型}
opCode: integer; {JMP命令オペコード用領域}
operand: longint; {JMP先絶対アドレス用領域}
end;
funcOWPtr = ^funcOverWriteT;
var
fp: funcOWPtr; {ダミー関数アドレス保持}
h: handle; {プラグインアドレス保持}
c: integer;
function dummy_Func (a, b: integer): integer; {ダミー関数。形式はプラグインと合わせる}
begin
dummy_Func := 1 + a + b - 3 + 4;
end;
procedure Plugin_Caller (function f (a, b: integer): integer); {Plug-in呼び出し用手続き}
begin
c := f(3, 6);
end;
begin
h := loadPluginManual; {プラグインアドレス取得。
>>810 の手続きを関数にしたもの}
hlock(handle(h)); {プラグインのハンドルロック}
fp := funcOWPtr(@dummy_Func); {ダミー関数のアドレス取得}
fp^.opCode := $4ef9; {68KのJMP命令を上書き}
fp^.operand := ord4(h^); {プラグインの絶対アドレスを上書き。ハンドル→ポインタを忘れずに}
c := dummy_Func(3, 6); writeln(c); {失敗。ジャンプテーブルを経由しないので元の関数が呼ばれる。}
Plugin_Caller(dummy_Func); writeln(c); {プラグイン呼び出し成功!!}
>>820 ,821
なんと!!できましたか!!すばらしい。小生の
知識不足からまだ理解も、再現も出来ていませんが、
希望が持てました。がんばってみます。
>>817 ありがとうございました。
実行例もお願いします。
>>823 自分の所で実行してみなよ。
それが実行例。
>>809 ,810
>>820 ,821
動きました。
Plugin_Callerを書き換えて変数を渡せるように
しても、ちゃんと動きました。
ありがとうございました。
>>817 のプログラムの意味解説をお願いします。
>>826 お前やる気あんの?
全部分からない訳じゃないだろ?
分からないとこを聞けよ。
漠然とした要求をするな
>>817 これでも良さそう
const
STR16='0123456789ABCDEF';
・・・略
repeat
x := n mod base;
s := concat(STR16[x + 1], s);
n := n div base;
until n <= 0;
・・・略
>>826 解説するまでもない明解なプログラムだぞ。>817は。
10÷2=5...0 5÷2=2...1 2÷2=1...0 1÷2=0...1 10=1010 この意味が分からなければ、 調べ直した方がいい。
わからないのは以下の部分です。 >hoge(n, base: ): string; >s: string; hoge,n,base,string はどういう意味ですか?? >(base <> 2) and (base <> 8) and (base <> 16) これはどういう意味ですか。 >base := 16; >s := ''; >n mod base; n mod baseとはどういう意味ですか。 >s := chr(ord('0') + x) + s >s := chr(ord('A') + x - 10) + s; chr,ordはどういう意味ですか。 >n div base; これはどういう意味ですか。 >until n <= 0; >hoge ここもまるでわかりません お願いします
>>832 ちっとは、Pascalの教科書を読んでおいでよ。
さすがにそれは、不勉強すぎです。
834 :
デフォルトの名無しさん :03/12/04 21:51
>>832 ちょいと812さん、mod divが分からないなんて…
ぶっちゃけpascalなんにも知らないと違います?(;´▽`A``
>>834 そうなんです。
私は数学科で、pascalは何も知らないんです。
コンピュータの教科書に詳細な説明はないんです。
わかるのは
function,var,integer,if,then,elseといったものぐらいです。
そこであらためて
817の意味解説をお願いします。
>>835 Pascalの教科書を図書館で借りて読め。「分からないから
教えてくれ」というのは先生にしか言っちゃいけない言葉だぞ。
hogeは関数名、nは変換する数値、baseは変換の基底、stringは文字列 baseが2,8,16以外だったらbaseを16にしてる。 n mod baseで一の位が分かる。 数値から文字への変換。'0'の次が'1'、'A'の次が'B' n div baseは整数の割り算。base進数で一の位を削る 0になったら終了。関数の返り値をsにする。
>817さんが親切に>838のような解説を書いても、 >812にはさっぱり意味不明だろう。 pascalの教科書を探して読んで来ない限り、 どこまでいっても全く無駄。 教科書じゃなくても、pascalの初歩のページでも せめて探して読んできなよ。
やっぱり「何も考えずに教えてください」って言っているのと
変わらんな。やっぱり無視した方が良いかも。
>>801
>825 あ、できましたか。よかったですね。
843 :
デフォルトの名無しさん :03/12/05 01:20
6ケタの数を入力し、N個右にずらす(たとえばN=2だとすると123456を を561234)にするにはどのようなプログラムにすればいいですか?
x := x div 10 + (x mod 10) * 100000 をN回繰り返せばいーんでないの
こいつ、課題を全部ここで訊いて済まそうとしているのか? そんなやつに答える事はないと思うけど。>>ALL
10のN乗を使ってもいいね。
10のn乗だと、桁、大丈夫?
6乗までだから大丈夫でしょう。 function hoge(x, n: integer): integer; const k = 1000000; var i, j: integer; begin x := x mod k; j := 1; for i := 1 to n mod 6 do j := j * 10; hoge := (x mod j) * (k div j) + x div j end;
>function,var,integer,if,then,elseといったものぐらいです。 えっ、? >>hoge(n, base: ): string; >>s: string; >hoge,n,base,string はどういう意味ですか?? function分かってるんじゃなかったの? しかも抜き出し方がおかしすぎだろう >function hoge(n, base: integer): string; これで何で分かる「単語」だけを消すかなぁ >hoge(n, base: ): string; ここでintegerを抜いて意味が分からないとは・・・レベル高杉(藁 ほんと基本から学んできてね? というより、分からない単語があったら まず せめて 最低限 ヘルプで調べてね? あかん、、突っ込みどころ大杉 根負けするわ
ひょっとして、質問してる>812は 自分の実行環境を持ってないのか?
winならDelphi DOSならturbo pascal macならTHINK Pascal debianならgpc linuxならKylix ぜ〜んぶ無料
空いてる時間は大学のコンピュータにかじりついてでも コードを書いてコンパイルしてとにかく試せ。 処理系が見つからなくてCへのコンバータ使ってたころもあったなあ。
854 :
デフォルトの名無しさん :03/12/12 00:28
ほしゅすしゅしゅ(´・ω・`)ショボーン
では、保守ついでに、またもTHINK Pascalの質問。 コードリソースからToolBoxのルーチンを使うには、 コードリソースのプロジェクトに何を入れれば良い?
>>855 ・Runtime.libを外してかわりにRSRCRuntime.Libを入れる。
・Interface.libはそのまま。
↑はコードリソースを作る時の一般的な手順なんだけど これでダメって事?
>>856 ,857
アプリしか作った事が無いので、
その一般的な手順を知らなかった・・・(^^;
あとで試してみます。ありがとう。
ある手続きで、newでメモリーを確保しながら不定の個数の データを生成するとする。 type myPtr = ^myList; myList = record next: myPtr; Word: string[255]; end; のようなリスト形式だから、順番にデータを読みだせる。 disposeも順番にできる。 この手続きをライブラリ化したとして、 disposeをライブラリ外のメインルーチン側に任せるのは お行儀としてはいかがでしょう? あぶない? ライブラリに、読み出しやdisposeのルーチンを含める べきでしょうか?
>>859 使う使わないは別として、一揃いの機能はライブラリにもって
いて欲しいというのが普通じゃないかな。ライブラリ側としては
堅牢に作っておけば、それで問題ないわけだし。あと、リスト追
加(メモリ確保も含む)、削除、ソート、検索なども入れておけば、
わざわざライブラリ外で操作しようと思わないだろうし。
もしリスト形式(というかデータ形式)を「ライブラリ外から隠す」
ようなコンパイラの場合は「ライブラリで処理すべき」だと思い
ます。そうすれば「メモリ保護機能を付け加える」というような
場合でも、インターフェイスさえ変えなければ、同じ感覚で使う
ことが出来ますから。
861 :
デフォルトの名無しさん :04/01/08 20:49
質問です A、B、Cに数値が移動していく問題なのですが A B C 100 0 0 という状態から A B C 70 30 0 A B C 49 48 3 上記のように AからBには30%、BからCには10%分ステップごとに移動していくようには どのようなプログラムを書けばよろしいのでしょうか? 御教授の程よろしくお願いします。
var x, y: integer; begin repeat x = a * 30 div 100; y = b * 10 div 100; a = a - x; b = b + x - y; c = c + y; until loop_end;
迅速な回答本当にありがとうございました。 重ね重ね失礼を承知の上で2,3お聞きしたいことがあるのですが 上のプログラムではABC3個の値の移動ですが 自分で移動する個数を指定したり(10と入力すればA〜Jまでの数値の移動) Aから右に数値が移動していくと同時に、Cからある割合で左に数値を返していく A B C 100 0 0 A B C 70 30 0 A B C 52 39 9 (右へは30%、左へは10%という感じです) というプログラムはどう書けばよろしいのでしょうか? よろしければ教えていただけると嬉しいです。
配列かな。 右へ移動する分を蓄えるのと左の分を蓄えるのと用意して計算する。 Pascalで動的確保はどうやるか知らない。
宿題は自分でやりましょう
よくやるのが、値とポインタをセットにした構造体を定義して、 newでメモリーを確保しながら、つないで行く事かな。 これなら、メモリーの許す限り、いくつ増えても大丈夫。 あ、でも、標準のpascalだと、メモリー確保できたかどうかは 検出できないんだっけ。 ただ、最大何個か決まってるなら、配列でそれだけの数を 確保しちゃってある方が、プログラムは簡単だわな。
>>864 ,865,866
アドバイスをどうもありがとうございました。
配列を用いてといているのですが、
『右へ移動する分を蓄えるのと左の分を蓄えるのと用意して計算』
という部分がどう記述していいのかよくわからないのです。
右から戻ってくる値はdowntoを用いて計算すればいいのでしょうか?
また、蓄えた値を足したり引いたりして解を求めるということは
ABC…といった場所の値が常に変化してしまうので
変化した値を常に用いて左右に移動する値を求める
という部分の記述がどうにもわかりません。
どうか御教授の程よろしくお願いします。
自分なりに、出来ているコードを提示してはどうですか? コードが出てくればどの程度の知識があるのかも予測できるし。
hoge: array [0..1] of array [0..10] of integer; hoge[0]にa,b,c...が入り hoge[1]に右からと左からを入れる 最後にhoge[0]に足す。
>>869 わざわざ二次元配列にするより、一次元配列を2つ作った方が
分かりやすいと思うんだけど。
配列を2つ作る必要ってあるのか?
>>871 私に言わせると「わざわざ二次元配列にする必要ってあるのか」
になるんだけど。
値を保存する配列と計算用の配列は分けた方が分かりやすいと
思うんだけど。
ああ。出題の意味を取り違えていた。 配列は2ついるね。失礼。 2次元配列は意味ないね。確かに。
>>867 問題をもう少し整理してくれ。
1. 移動率は場所によって変わるのか?
>>861 だとA->Bは30%、B->Cは10%になっている。
2.
>>863 で左右に移動する場合、上記1と左右の移動率の関わりは?
3. 左右端の処理はどうするのか?
あと、移動率は定数か変数のどちらかもはっきりしないし。
ここいらへんがちゃんと定義されていないと、プログラムを書こうにも書けないぞ。
皆様色々とアドバイスをありがとうございます。
>>874 そうでしたすみませんでした。
1は
移動率は場所によって変動です。
2は
移動率なんですが右方向へは(n/50)、左方向へは(n/100)といったようにN番目の場所により移動率が変化。
3は
左端は右隣に移動と右隣からの移動、右端は左隣からの移動と左隣への移動です。
移動率は変数です。
宿題の設問、そのまま書いてくれたほうがわかりやすいんだけどなぁ
下のような状態遷移図が書いてあって → → → → @ A B ・・・ I ← ← ← ← @に適当な値を与えると まず@からAに移動、次に@からAに、AからBに、Aから@に、その次は・・・ といった様に数値が移動していく。 また、移動率は右方向には(n/50)、左方向には(n/100)というように、位置Nの値を 用いて設定する。 これにより、各場所での定常値を求めるプログラムを作成しなさい。 というようなことが書いてあります。
ほんとに宿題だったか.... 右が n/50, 左が n/100 だと足して1になりませんが、ここはホントはなんてかいてあった?
別に足して1にならなくてもいいんでしょ。 const N = 10; var foo: array [1..N] of integer; procedure move; var i, right, left, temp: integer; begin right := foo[1] div 50; for i := 2 to N do begin left := foo[i] * i div 100; foo[i-1] := foo[i-1] - right + left; temp := right; right := foo[i] * i div 50; foo[i] := foo[i] + temp - left; end; end;
>>877 「移動率は位置Nの値を用いて設定する」ってのがよく分からない
なぁ。Nは何を表していて、その場所との関係はどうなっているの
かをはっきりさせないとプログラムは組めないと思うんだけど。あと
「右方向には(n/50)」のnって何を表しているの?
あと、数値は実数にするのか? それとも整数で良いのか? もし整
数なら除算の余り部分の処理はどうするのかが問題ですね。
>>878 ,879,880
アドバイスをどうもありがとうございました
>>880 説明が足らず申し訳ありませんでした。
NというのはN番目ということです。
図の@〜Iのことです。
「右方向には(n/50)」、「右方向には(n/100)」のnはNと同じです。
@からAに移動する時は(1/50)、AからBに移動する時は(2/50)、・・・
HからIに移動する時は(9/50)ということです。
数値は実数です。
>>881 なんだ算出可能なら簡単じゃん。私は場所によって特定値
(左右別)になるのかと思って「場所別、左右別の配列」を
用意しなければならないかと思っていました。
で、ここまではっきりすれば簡単に組めるのでは。日本語ア
ルゴリズムだとこんな感じ。
{ 事前に元量配列に量をセットしておく}
for 遷移回数ループ do begin
計算配列を0クリア
for 最初の要素から最後の要素まで do begin
左右の漏れ率計算
左右の漏れ量、残り量計算
計算配列に漏れ量と残り量を加える
end;
元量配列に計算配列を代入
{途中結果の出力(遷移回数,元量配列)}
end;
{最終結果出力(元量配列)}
移動する個数を可変にする場合は、配列宣言を大きくセット
しておいてその一部だけを使うとか、動的配列を使う(処理
系が許せば)などの方法があります。
注意点は最初の要素と最後の要素は片方にしか漏れ出さ
ないことです。あとは自分で組めるでしょ。
皆様のアドバイスを単に組み合わせただけですが以下のように記述してみました。 type foo=array [1..100] of real; var data:foo; i,j,n:integer; right,left,temp:real; begin write('移動する個数は?'); readln(n); data[1]:=100; j:=0; repeat right:=data[1]/50; for i:=2 to n do begin left:=data[i]*i/100; data[i-1]:=data[i-1]-right+left; temp:=right; right:=data[i]*i/50; data[i]:=data[i]+temp-left end; j:=j+1 until j=100; for i:=1 to n do begin writeln(i,'番目の定常値は',data[i]:5:3,'です。') end.
上のプログラムを1000回繰り返したときと2000回繰り返したときに 得られた値に変化が見られないのですがなぜなのでしょうか? また、左右に移動する確率をrandomを用いて得ようと思い 簡単なプログラムでどのような乱数が返ってくるのかを 試したところ毎回同じ値しか帰ってこないのはなぜなのでしょうか?
それが定常値
やっぱり定常値なんですね。 もっと果てしない回数を繰り返して得られるものだと思っていたので… type x=array [1..5] of real; var data:x; a,n:integer; begin for n:=1 to 5 do data[n]:=random; for n:=1 to 5 do writeln(data[n]) end. こんなプログラムでいつも同じ乱数しか返ってこないのですが 違う乱数を得るにはどうしたらいいんでしょうか?
Randomと一緒にRandomizeを説明してない教科書は窓からポイ
窓から ・⌒ヾ(*´_`)ポイしてきました ありがとうございました
883で書いたプログラムは 待ち行列と考えると 右に移動していく値は人の到着の確率 左に移動していく値はサービスをうけ列を離れていく確率 になるのではないかと思うのですがどうでしょうか?
type foo=array [1..100] of real; var data:foo; i,j,n,k,m:integer; right,left,temp:real; begin write('行列の全人数は?'); readln(n); write('何ステップ?'); readln(k); write('窓口の数は?'); readln(m); {初期値の設定} data[1]:=1; j:=0; repeat {最初に人がが到着する確率} right:=data[1]*・・・; {移動} for i:=2 to n do begin {窓口でのサービス提供} if i<=m then begin {サービス終了率} left:=data[i]*・・・; data[i-1]:=data[i-1]-right+left; temp:=right; right:=data[i]*・・・; data[i]:=data[i]+temp-left end
{待ち行列} else begin {途中放棄率?} left:=data[i]*・・・; data[i-1]:=data[i-1]-right+left; temp:=right; right:=data[i]*・・・; data[i]:=data[i]+temp-left end; end j:=j+1 {決められたステップ数まで} until j=k; for i:=1 to n do writeln(i,'番目の定常値は',data[i]:5:10,'です。') end. 待ち行列に用いて行列の定常値を求めるには こんな感じにすればいいんでしょうか?
下の式を記述したいのですが (AのN乗÷N!)÷(Σ AのX乗/X!) X=0〜N この式の左側は記述できたのですが 右側はどうやって記述したらいいのでしょうか?
まず数式読みづらい あと0からってのがおかしいと思うが 0の階乗なんてないし 0で割ったらダメでしょ 括弧の結びどころがみにくい Σ(A^X / X!) こう解釈していいか? Σの上下につく数字も明示してくれ 下手っぴでずれてもいいからさ X=1からNまでってところか?
>>893 その解釈で大丈夫です。
Xは1からNまででした。
見にくい上にわかりにくくてすみませんでした
(A^N/N!)/(Σ(A^X)/) Xは1からNまで type hako=array [1..100] of real; hako2=array [1..100] of real; hako3=array [1..100] of real; var box:hako; box2:hako2; box3:hako3; n,b,x,y,z,temp:integer; ue,a,seki,total,kotae,goukei:real; begin write('Nは?'); readln(n); write('Aは?'); readln(a); seki:=1; for b:=1 to n do begin seki:=seki*a; box[b]:=seki end; x:=0; y:=1; z:=0; repeat x:=x+1; y:=y*x; temp:=y; z:=z+1; box2[z]:=temp until z=n; ue:=seki/y;
for b:=1 to n do box3[b]:=box[b]/box2[b]; total:=0; for b:=1 to n do total:=total+box3[b]; goukei:=total+1; kotae:=ue/goukei; writeln('求める値は',kotae:5:3,'です。') end. こんな感じであってますか?
問題は (A^N/N!)/(Σ((A^X)/X!)) Xは1からNまでで やっぱりX=0の時も値を求める必要があるみたいなので 1を加えてみたのですが、どうでしょうか?
X=0のときってのが意味わからん
Σ (nCm)*{a/(n-a)}^m m=1〜s-1まで Σ {a/(n-a)}^m/(n-m)!*s^(m-s) m=s〜nまで nCmはコンビネーションです。 a,n,sにはこちらから値を与えて解を求める問題なのですが どう記述したらよろしいでしょうか? お願いします
900 :
デフォルトの名無しさん :04/01/15 13:25
900
901 :
デフォルトの名無しさん :04/01/18 11:34
配列1に5個の数値が順番に1,2,3,4,5と入っているものを 配列2に5,4,3,2,1と入れ替えるにはどうしたらいいですか?
for i:=Low(array1) to High(array1) do array2[i] := array1[High(array1) - i];
どういたまして
905 :
デフォルトの名無しさん :04/01/18 13:03
type box1=array [1..100] of longint; box2=array [1..100] of longint; var hako:box1; hako2:box2; i,n:integer; p,q,r:real; begin p:=0; q:=1; r:=0; repeat p:=p+1; q:=q*p; r:=r+1; hako[r]:=q until r=10; for i:=Low(hako) to High(hako) do hako2[i]:=hako[High(hako)-i]; for n:=1 to 10 do writeln(hako2[n]) end. 上のプログラムのようにリピートを用いた記述で 配列の入れ替えを行うと0しか戻ってこない場合はどうしたらいいですか?
until r=10; これを until r=100; とやってみなさい
907 :
デフォルトの名無しさん :04/01/18 13:14
うそだった やってみたら for n:=90 to 100 do writeln(hako2[n]); こうだな それか box1=array [1..10] of longint; box2=array [1..10] of longint; ↑これ
909 :
デフォルトの名無しさん :04/01/20 20:18
N!のような値の大きなものを求めるプログラムで realで宣言すると100!の階乗でも求められるのに 配列(realで宣言)に入れてしまうとエラーが出てしまうのはなぜですか?
>>909 1) 配列は本当に実数型ですか?
2) 初期化していますか?
3) 小さな値(2!、3! など)でもそうなりますか?
エラーの内容を書けょ コード書けょ 配列なのにhoge:=kaijou(100); みたいなことやってるんじゃないの? hoge[0]:=kaijou(100);
type box=array [1..100] of real; var hako:box; a,b,c,d:real; begin a:=0; b:=1; c:=0; write('数値入力'); readln(d); repeat a:=a+1; b:=b*a; c:=c+1; hako[c]:=b until c=d; writeln('答えは',hako[c],'です。') end. これで、 Error: Type mismatch Error: Incompatible types: got "S64REAL" expected "LONGINT"というのが hako[c]のところにでてしまいます
Type がミスマッチしてるんねん。 LONGINT を期待してはるのに S64REAL 型の変数がやってきたんや。
そんなときはキャスト、キャスト。 コンパイルエラーが出なくなるまでキャストし続ける。 何でもいいからよさそうな型でキャスト。 912 のコードなら hako[ byte(c) ]:=b; でどうだろう。
Cはカウンタだから整数型でいいんじゃないの? var a, b: real; c, d: integer; で。
916 :
デフォルトの名無しさん :04/01/25 11:59
質問です。 指数分布に従う乱数を発生させるにはどうしたらいいですか?
2,4,8,16... ってことか? いや、分布だから大きい数がめっちゃ出やすいってことか?
function Expondist : extended; begin Result := -Ln( Random ); end;
919 :
デフォルトの名無しさん :04/02/05 11:40
英単語をいくつか入力して、辞書みたいなアルファベット順に表示するにはどうすればいい? アルファベット順にするのはソート関数でいいとして、文字列の配列(?)っていうのが分からない。 たとえばA[i](char)って配列を用意したとして、英単語を my may と入力した場合は、 A[1]='m' A[2]='y' A[3]='m' A[4]='a' A[5]='y' となるような気がするんですが、これじゃあソート出来ないですよね? A[1]='my' A[2]='may' として、さらに一文字ずつ比較していくにはどうすればいいですか?(分かりづらいとは思いますが)
使っている処理系の名前は? array[1..100] of string; って定義は可能?
921 :
デフォルトの名無しさん :04/02/05 11:54
SSH使って大学のにログインしてて、処理系は分かりません。 試しにやってみたら warning: missing string capacity - assuming 255 と出ましたが、これ出てきても出来ます?
メモリーばか食いしてもいいのなら、 type Str255:string[255] とか定義して、 array[1..100] of Str255 しちゃえば良いのでは? (って、昔のマック風みたい)
923 :
デフォルトの名無しさん :04/02/05 13:23
いざとなれば別のコンパイラを使うことにして、定義はこれでやってみます。 でも今度は、stringで定義した文字列で、アルファベット順に順序を比較していく方法が分かりません。
文字列ではない、たとえば整数の配列のソートは出来ますか? type TargetType = array[1..100] of integer; と定義しているとき、 procedure Sort( var TargetData : TargetType ); という関数を実装出来ますか? これが出来るなら、文字列ソートも容易でしょう。
なんか文字と文字列がごちゃ混ぜになっているっぽいね。 「アルファベット順に順序を比較」ってことは、与えられた二つの文字列に順序をつける。 という操作と同義。 type CompareResult = (sGREATER, sEQUAL, sLESS); function CompareString( s1, s2 : string ) : CompareResult; という関数を作り、任意の文字列間に順序を定める。 もし使っている処理系が文字列間比較をサポートしているのなら、 if s1 > s2 みたいに書いてしまえばよい。大きいか小さいか、等しいかの3通りあるので間違えないように。 文字列間比較をサポートしていない処理系の場合は「アルファベット順」の定義に基づき 一文字ずつ比較。
926 :
デフォルトの名無しさん :04/02/05 16:20
整数でのソートは出来ます。それの配列の型をintegerからstringに変えるだけで、英単語も整数と同様に並び変わるってことですね。
927 :
デフォルトの名無しさん :04/02/05 17:59
やってみたら出来ました。ありがとうございます。
Ord
929 :
げんげんげんげん :04/02/08 04:49
分布関数 F(x)=x^n(0<x<1) をもつ乱数を発生させるプログラム誰か教えてください!! お願いいたします。
nは定数? Exp(x * Ln(n)); //n>0のときのみ
それじゃあx^nにならない?
↑は「それじゃあn^xにならない?」の間違い
そうなると思うならxとnを逆にしたらいいんじゃないかとか考えないのか
>>933 いや、俺は
>>929 じゃないから。
俺が
>>933 のように考えたとしても、何の意味もないじゃんか。
名前からしても別人である可能性が高いのに。釣りか?
930≠931ですが何か?
Pascal の言語仕様書(のようなもの)はどこかのサイトで閲覧できますか? Pascal の言語が一通りわかれば良いのですが。
>>940 Pascalって言っても方言から拡張まで何でもありだから、対象の開発環境によってまるっきり違いそうな気がする。
それに言語仕様といっても厳密に書き出すと膨大な量になるから、あまりやっているところはないんじゃないかな。
一通りということなら、入門サイトでも見たらどうかな?
私は本(WirthのPascal本)から入ったのでサイトを紹介することはできないけど。
上のURLだと見れんみたい トップページから「JIS検索」たどってくれ
とりあえずはANS/JISの標準化された古い仕様だけだよね。 その後のオブジェクト指向方面の拡張はAppleのとBorlandので違うもんねぇ。 gpcはBorlandに近いんだっけ?
>>941-944 どうもです。
いま直接関係しているのが Pascal の方言なので、サイトとかを見て回ってみます。
946 :
デフォルトの名無しさん :04/05/15 21:02
perlのハッシュのようにキーと要素を扱わせることは出来ないでしょうか? iniファイルのようにキーがたびたび変更される場合を扱いたいのです
すいません・・・思いっきり上の方で連想配列の話題がありましたね 忘れてください
>>946 「キーがたびたび変更されるのでそれに対応する」んじゃなくて「キーがたびたび変更されないように(もしくは変更されても簡単に対応できるように)プログラミングする」のが良いと思う。
キーを作るプログラムが他のだと手の出しようもないけど、自分で作るのならデータ構成、プログラミングで対応できそうな気がする。
949 :
デフォルトの名無しさん :04/06/25 01:20
レベルの低い質問で申し訳ないんですけど
大学の授業で先週からpascalやってるんですけどわけがわからなくなってるんで
家でpascalの勉強をしたいんですけどどうすれば自宅のパソコンで使えるようになるんですか?
OSはウインドウズXPなんですけど。
CDとかで売ってたりするんですか?
>>1 のサイトでダウンロードしてもインストールすることができないし
何をどうすれば自宅のパソコンでpascalが使えるようになるんですか?
>>949 >>950 が言う通りだと思うけど、その教授に自習したいから処理系教えれ!って聞くのがいいんじゃなかろうか?
学校のマシンが何かのUnix系の端末でgpcってオチが一番ありそうな気はするけども。
Cygwinあたりを突っ込んで(SFUとかU-WinとかMinGWとかでも構わんかもしれんけど)自力でgpcを入れるとかなのかな?
後、大学生なら
ttp://www.pascal-central.com/ あたりとりあえず眺めてみるのもお勉強になるかもね。
って、情報系でもなんでもなくてマジわけわかんね〜〜〜〜〜!!!とかだとこういう情報過多なサイトは遠慮しとくベキ?
>>950-952 レスありがとうございます。
とりあえずFreePascal(fpc)というのを試してみます。
√cの近似値をニュートン法で求めるプログラムと、 二分法でfor文を使って求めるプログラム、 さらに二分法で求めたものを再帰的手続きにより求めるプログラムを テストで出されるそうなのですが、まったくわかりません・・。 なんとか助けていただけないでしょうか?? よろしくお願いします!!!
車の運転ができない人に免許をとらせても世の中のためになりません。 以上
筆記試験か。すごいね。穴埋めになるのかな。
再帰的二分法。のアイデア。 function 再帰で開平を求める関数(c: real); function 実際の再帰で開平を求める関数(範囲の最低値, 範囲の最高値: real); var 二分点: real; begin 二分点 := (範囲の最低地 + 範囲の最高値)/2; if (二分点 * 二分点) < c then result := 実際の再帰で開平を求める関数(二分点, 範囲の最高値) else (二分点 * 二分点) > c result := 実際の再帰で開平を求める関数(範囲の最低値, 二分点) else result := 二分点; end; begin 実際の再帰開平を求める関数(0, c)// 初期値は 0 から c までとする。 end;
958 :
デフォルトの名無しさん :04/07/26 01:12
レポートが出たのですが、全く分かりません↓ LD A−Aをレジスターに格納する ST A−レジスターの中身をAに格納 AD A−レジスターの中身とAを足して、レジスターに格納 SB A−レジスターの中身とAを足して、レジスターに格納 ML A−レジスターの中身とAを掛けて、レジスターに格納 DV A−レジスターの中身をAで割って、レジスターに格納 接尾辞表現で ABC*+DE-/(普通に書いたら(A+B*C)/(D-E))と入力して 上の指示表現を使って答えを解いていくための別のプログラムを書くとしたら LD B ML C ST TEMP1 LD A AD TEMP1 ST TEMP2 LD D SB E ST TEMP3 LD TEMP2 DV TEMP3 ST TEMP4 と表示できるようなプログラムをpascalで作りなさい。という内容です。 ヒント 式を順にスタックに入れていって、 最初のBC*はop2:=c;op1:=b;として、取り出していくそうです 人助けだと思ってお願いします(ToT)/~~~
オレニマカセロ! とはいうものの、処理系手に入れるまで待ってね。
ずれてたらごめん 1→2→3→4→5→6→7→8→9→α→β→γ→δ * + − / A B C C X X Y D E E Z Z W A B B A A Y D D Y Y A A Y Y 4: (B * C -> X) => (LD B / ML C / ST TEMP1) 6: (A + X -> Y) => (LD A / AD TEMP1 / ST TEMP2) α: (D - E -> Z) => (LD D / SB E / ST TEMP3) γ: (Y / Z -> W) => (LD TEMP2 / DV TEMP3 / ST TEMP4)
961 :
デフォルトの名無しさん :04/07/27 14:16
どうもありがとうございました(*^_^*)頑張ってやってみます♪
962 :
デフォルトの名無しさん :04/08/09 10:05
現在、Pascalによるプログラムが実用されている所ってあるんですかね。 どっかの工場のPCで動いてるとか。
>>962 君の知らない「あそこ」で動いている。
秘主義務があるので具体的な内容は話せない。
>>962 私はngraphを現役で使っています。
一応Win95が動いているマシンです。 あとアドインプログラム書くのでコンパイラも時々動かしてます。
969 :
デフォルトの名無しさん :04/08/22 03:48
大学院入試のアルゴリズムとデータ構造でPascalで書かれた問題があるのですが、 Pascalは詳しくやってないのでよくわかりません。二分探索木の問題で type tree = @node; node = record; element:integer; left,right:tree; end; で2分木のデータ型treeを定義しているのですが、これはC言語で書くと struct node{ int element; struct node *right,*left; }; struct node *tree; といった感じのイメージでいいのでしょうか(Cの方の文法も間違ってるかも…)。
>>969 あ、Pascalの方の2行目recordと4行目treeの後ろにセミコロン;はありませんでした。
すみません。
あってるよ
ありがとうございます。ここでtree型の変数pのelementの部分にアクセスするためには Pascalではどう書けばいいのでしょうか?
あ、あと問題の一部に(pはtree、xはintegerです) if p=nil then begin new(p); with p do begin (穴埋問題) :=x; left :=nil;right :=nil; end end ってのがあったんですが、with p って何ですか?
>>972-973 pがtree型ならそいつの指すnode型のブツをゲットする必要があるから例えば
p^.element
だな。Cの
(*p).element
に相当する書き方。
withの意味は自分で調べれよ。それで分からないところだけ質問しる。
ところで、そこの「with p」は「with p^」 が正しいと思うがどうか。
975 :
969=970=972=973 :04/08/22 15:44
>>974 ありがとうございます。問題文を見直した所、with p と書かれています。問題の間違いですかね?
with文についてググったのですが
「Pascalでレコードのメンバーを扱うには「レコード名.メンバー名」という書式を使うが、
レコード名をある程度省略する方法がある。それにwithを使う。
withの内部では「メンバー名」を書くだけで、そのレコードのメンバーが参照できる。」とありました。
例えば穴埋問題の部分には(p^)のelementメンバにxを代入したいわけですが、
ここは「(p^).」を付けずに element := x; と書ける、ということですか?
書けるとしたら、p^.elementと書くのは間違いとなるのでしょうか?
>>969 のtype tree = @node;は、type tree = ^node; じゃないのかなあ…まあ、Pascalも方言多いから何とも言えんけど
with p or with p^も、Delphiなんかじゃrecordへのポインタに直接"."を続けられるから間違いとも言い切れ無さげ…
あと、withは、名前を探す順番を変えるだけなので、p^.elementももちろん書ける…私の知ってるPascalであれば…
>>976 ありがとうございました。
@については、ここ数年分見ましたが、同様の問題では全て@node;のような書き方をしていました。
別な方言なんでしょうね。
>>976 PASCALのJIS規格では「@」は「^」の代替表現なので、とりあえず
どっちで書いても同じです。Delphiでは意味が違いますが。
「with p」は規格としては「with p^」でないとまずいでしょう。
もちろん「with p」と書ける処理系は存在するかもしれませんが,
すくなくとも GNU Pascal ではだめでした。