C言語何でも質問掲示板


アンケートにご協力下さい → >> アンケートフォーム <<

規約と使い方

 
   本格的な野球のプログ ....   
     ・[10165] box 
     ・[10167] box 
     ・[10168] box 
     ・[10169] やそ 
     ・[10170] プーコ 
     ・[10171] バグ 
     ・[10172] バグ 
     ・[10175] プーコ 
     ・[10177] box 
     ・[10178] バグ 
     ・[10194] 管理人 
     ・[10476] プーコ 
     ・[10478] バグ 
     ・[10481] 管理人 
     ・[10486] プーコ 
     ・[10487] box 
     ・[10488] プーコ 
     ・[10489] 管理人 
     ・[10490] box 
     ・[10492] プーコ 
     ・[10496] プーコ 
     ・[10502] box 
     ・[10503] プーコ 
     ・[10504] box 
     ・[10505] 管理人 
     ・[10506] 管理人 
     ・[10507] 管理人 
     ・[10536] プーコ 
     ・[10537] プーコ 
     ・[10538] 管理人 
     ・[10539] やそ 
     ・[10547] 管理人 
     ・[10670] プーコ 
     ・[10732] プーコ 
     ・[10743] 管理人 
   円周率を求める   
     ・[10678] たかぎ 
     ・[10685] マヨネィズ 
     ・[10687] たかぎ 
     ・[10733] マヨネィズ 
     ・[10734] tkmakwins15 
     ・[10739] マヨネィズ 
     ・[10740] tkmakwins15 
   マイクロソフトに疑問   
     ・[10690] バグ 
     ・[10691] tkmakwins15 
     ・[10692] DDK 
     ・[10693] a 
     ・[10694] tkmakwins15 
     ・[10695] Justy 
     ・[10696] DDK 
     ・[10697] バグ 
     ・[10698] たかぎ 
     ・[10699] tkmakwins15 
     ・[10703] YuO 
     ・[10706] たかぎ 
     ・[10707] tkmakwins15 
     ・[10708] たかぎ 
     ・[10710] tkmakwins15 
     ・[10711] たかぎ 
     ・[10713] Justy 
     ・[10715] Hermit 
     ・[10716] たかぎ 
     ・[10718] Hermit 
     ・[10719] たかぎ 
     ・[10721] Hermit 
     ・[10722] たかぎ 
   NULLの扱いについて教 ....   
     ・[10701] YuO 
     ・[10702] すすむ 
     ・[10704] YuO 
     ・[10705] YuO 
     ・[10709] \n 
   効率化・処理速度につ ....   
     ・[10663] box 
     ・[10665] たかぎ 
     ・[10681] 夏天 
     ・[10682] たかぎ 
     ・[10683] 管理人 
     ・[10684] 管理人 
     ・[10686] 夏天 
     ・[10688] tkmakwins15 
   fprintfについて   
     ・[10666] box 
     ・[10668] 大工 
     ・[10673] Hermit 
     ・[10677] たかぎ 
   DirectX   
     ・[10563] 管理人 
     ・[10585] けるびん 
     ・[10586] 管理人 
     ・[10587] Justy 
     ・[10617] けるびん 
     ・[10624] 管理人 
     ・[10667] けるびん 
   デバッグの混合モード   
     ・[10661] たかぎ 
   TransparentBltについ ....   
     ・[10655] keichan 
     ・[10658] garuma 
     ・[10659] parapara 
   png画像が透過されない ....   
     ・[10590] 管理人 
     ・[10596] しのぶ 
     ・[10597] 管理人 
     ・[10603] しのぶ 
     ・[10606] 管理人 
     ・[10610] しのぶ 
     ・[10612] 管理人 
     ・[10619] tkmakwins15 
     ・[10622] しのぶ 
     ・[10623] しのぶ 
     ・[10625] 管理人 
     ・[10626] tkmakwins15 
     ・[10637] しのぶ 
     ・[10638] tkmakwins15 
     ・[10639] 管理人 
     ・[10643] tkmakwins15 
     ・[10647] バグ 
     ・[10648] しのぶ 
     ・[10649] 管理人 
     ・[10651] tkmakwins15 
     ・[10656] しのぶ 
     ・[10657] tkmakwins15 
   導入   
     ・[10636] 管理人 
     ・[10640] zzz 
     ・[10645] 管理人 
     ・[10646] tkmakwins15 
     ・[10650] 管理人 
     ・[10653] zzz 
     ・[10654] tkmakwins15 
   異なる種類のthrowに対 ....   
     ・[10567] たかぎ 
     ・[10568] DDK 
     ・[10569] keichan 
     ・[10598] 組木紙織 
     ・[10600] たかぎ 
     ・[10601] 組木紙織 
     ・[10604] たかぎ 
     ・[10627] DDK 
     ・[10628] たかぎ 
     ・[10641] 組木紙織 
     ・[10644] たかぎ 
   数字を文字列に   
     ・[10630] バグ 
     ・[10631] tkmakwins15 
     ・[10632] box 
     ・[10633] tkmakwins15 
     ・[10642] 夏天 
   エラーが出て出来ませ ....   
     ・[10608] 管理人 
     ・[10609] tornade 
     ・[10616] 管理人 
     ・[10634] tornade 
   数独の問題自動生成に ....   
     ・[10620] box 
     ・[10621] 初者 
   C++のプログラミングで ....   
     ・[10509] たかぎ 
     ・[10510] tkmakwins15 
     ・[10511] たかぎ 
     ・[10512] tkmakwins15 
     ・[10514] Justy 
     ・[10515] tkmakwins15 
     ・[10516] 組木紙織 
     ・[10517] Justy 
     ・[10521] たかぎ 
     ・[10522] tkmakwins15 
     ・[10523] たかぎ 
     ・[10525] tkmakwins15 
     ・[10526] たかぎ 
     ・[10527] tkmakwins15 
     ・[10528] たかぎ 
     ・[10529] tkmakwins15 
     ・[10530] たかぎ 
     ・[10531] tkmakwins15 
     ・[10532] たかぎ 
     ・[10540] tkmakwins15 
     ・[10541] Hermit 
     ・[10543] tkmakwins15 
     ・[10544] たかぎ 
     ・[10545] Hermit 
     ・[10546] tkmakwins15 
     ・[10565] hoge 
     ・[10574] tkmakwins15 
     ・[10577] たかぎ 
     ・[10579] hoge 
     ・[10580] tkmakwins15 
     ・[10583] Hermit 
     ・[10593] たかぎ 
     ・[10605] tkmakwins15 
     ・[10611] たかぎ 
     ・[10613] tkmakwins15 
     ・[10614] たかぎ 
     ・[10615] tkmakwins15 
   xファイルの変換につい ....   
     ・[10584] Justy 
     ・[10602] はね 
   isdigitと同じ機能のマ ....   
     ・[10578] たかぎ 
     ・[10594] Teaty 
     ・[10599] たかぎ 
   悩んでいます。   
     ・[10595] 管理人 
   二次元配列構造体のプ ....   
     ・[10582] box 
     ・[10588] box 
     ・[10591] A.A 
   ゲームの背景   
     ・[10575] はね 
     ・[10576] バグ 
     ・[10581] me 
   検索で、ユーザ入力を ....   
     ・[10552] やそ 
     ・[10553] Lbfuvab 
     ・[10554] たかぎ 
     ・[10555] コンドル 
     ・[10556] コンドル 
     ・[10557] コンドル 
     ・[10561] けるびん 
     ・[10564] コンドル 
   BCCをやめてVC++を試し ....   
     ・[10560] Justy 
   プロセス制御とパイプ   
   ウイルスについて   
     ・[10549] 管理人 
     ・[10550] けるびん 
   削除されたトピック   
     ・[10464] tkmakwins15 
     ・[10542] けるびん 

Name: プーコ  ..ぴよぴよ(735ポイント)   Date: 2007/09/05(水) 14:01   No:10162       
Title: 本格的な野球のプログラムを作っているのですが・・・    
何度もすいません(TT)
野球のプログラムを作っています!1回から9回までとりあえず打者がヒットと2ベース、スリーベース、HR、四死球、アウトのどれかになるようにしたいのです。

問題が生じました。
1番から9番打者までのヒット、2ベース、スリーベース、HR,四死球の確率を設定して乱数を取るのですが、
1打者につき5つの確率をどのように繰り返していいかわかりません。

また、どのようにしてベースを埋めていけばいいのか、なかなか思いつきません。

何かいい方法はないでしょうか?
質問ばかりすいません(TT)


2倍のポイントを手に入れた! 278ポイント を手に入れた。


Name: box  ..比類無きプログラマー(85,013ポイント)   Date: 2007/09/05(水) 15:15   No:10165     
Title: Re:本格的な野球のプログラムを作っているのですが・・・    
> また、どのようにしてベースを埋めていけばいいのか、なかなか思いつきません。

一つの例を挙げてみます。

1バイトの変数を用意し、いちばん右のビットを第0ビット、
いちばん左のビットを第7ビットと呼ぶことにします。

第0ビットはバッターが打席に立っているかいないかを表わすことにします。
第1〜第3の各ビットは、1塁〜3塁の各ベースにランナーがいるかどうかを
表わすことにします。ビットが立っていれば、そのベースにランナーがいる状態です。

そうすると、バッターが打席に立っているときの
バッターとランナーの状態を1バイト(8ビット)で表わすと、
 ・ランナーなし(00000001)
 ・1塁 (00000011)
 ・2塁 (00000101)
 ・1、2塁 (00000111)
 ・3塁 (00001001)
 ・1、3塁 (00001011)
 ・2、3塁 (00001101)
 ・満塁 (00001111)
の8パターンのいずれかになります。

ヒットエンドランのように、1塁ランナーがシングルヒットで一挙に3塁へ
進むことを考えないとすると、
打撃結果によってバッターとランナーの塁を進めることは、
上記8パターンを所定のビットだけ左へシフトすることに相当します。
つまり、シングルヒットまたは四死球ならば1ビット左へシフトし、
ホームランならば4ビット左へシフトします。

シフトした結果、第0〜第3の各ビットが、
その時点でのバッター(打席に立っていない状態)とランナーの状態を
表わします。
そして、第4〜第7ビットのうち、オンになっているビットの数が
当該の打撃結果によって加わる得点数を表わします。


193ポイント を手に入れた。

Name: box  ..比類無きプログラマー(85,082ポイント)   Date: 2007/09/05(水) 15:36   No:10167     
Title: Re:本格的な野球のプログラムを作っているのですが・・・    
> つまり、シングルヒットまたは四死球ならば1ビット左へシフトし、

四死球の場合、単純に1ビットシフトするわけにはいかないですね。

バッターの第0ビットを1ビット左へシフトしようとする際に、
第1ビット(1塁)の状態を見て、さらに必要があれば
第2ビット(2塁)や第3ビット(3塁)の状態も見てから
シフトしないと、野球のルールと合わなくなります。


69ポイント を手に入れた。

Name: box  ..比類無きプログラマー(85,129ポイント)   Date: 2007/09/05(水) 16:02   No:10168     
Title: Re:本格的な野球のプログラムを作っているのですが・・・    
> 1番から9番打者までのヒット、2ベース、スリーベース、HR,四死球の確率を設定して乱数を取るのですが、
> 1打者につき5つの確率をどのように繰り返していいかわかりません。

[9][5]の配列を用意し、あらかじめ適切に設定しておいた初期値にしたがって
打撃結果を決めればよいのではないでしょうか。


47ポイント を手に入れた。

Name: やそ  ..ぴよぴよ(376ポイント)   Date: 2007/09/05(水) 16:20   No:10169     
Title: Re:本格的な野球のプログラムを作っているのですが・・・    
本格的というなら、ボークでの進塁、けん制アウト、盗塁、タッチアップ、振り逃げとかは?
ランナーが居る場合、ダブルプレイやトリプルプレイだって考えられますよ。
アルゴリズムというより、野球のルール、戦略などについてもっと理解を深めるのが先決じゃないでしょうか?
どのような攻撃パターンが考えられ、結果、成功したときのパターン(大成功、成功)、失敗したときのパターン。
いろんな場面を想定し、全ての動きを論理的に捉える思考が必要かと。
ランナー1塁でバッターがシングルヒットを打った場合でもランナーの走力と守備力、打球の行方、返球までの時間により3塁に進めるかもしれません。さらに返球がそれればホームインだってw
それらを全体の確率からはじき出して反映させられれば、かなり本格的だと思います。

どうしたら出来るのか?ではなくて
何をどうしたいのか。またそれはどこまで細かく考えて処理するのか?
を明確にするほうが先じゃないかな?

boxさんの考えるように2進数で考えてBit演算するのもいい考えですし、各桁それぞれを別の変数で確保したって良いわけです。
プーコさんはバッターを基準に考えておられるようですね。
特に監督からのサインとかバッターの打率、クセ、相手の投手力、守備力、風向きなどを考えない完全確率ならば4bit(もしくは変数4個)でそれぞれの塁に対応させればよいのでは?

あとは刻々と変わる状況ごとにどのように(バッターの結果の)確率をとっていくかですね。

余計にハードルを上げて混乱させてしまうようなら申し訳ない、スルーしていいです。。。


376ポイント を手に入れた。

Name: プーコ  ..ぴよぴよ(797ポイント)   Date: 2007/09/05(水) 17:00   No:10170     
Title: Re:本格的な野球のプログラムを作っているのですが・・・    
boxさん、やそさん、ありがとうございます。
本格的と言う表現が誤りでした!今私は完全確率の簡単な野球のプログラムを作りたいのです。
力では走力や、ボーク、またはエラーやイレギュラー等の細部をプログラムに入れる事はできないです(TT)
また、bit演算をした事がないのですが、c言語の話ですよね?

また、配列で、P[9][5]というものはできるのですか?(P[1][1]でヒット、P[1][2]でツーベース等)


62ポイント を手に入れた。

Name: バグ  ..熟練のプログラマー(57,186ポイント)   Date: 2007/09/05(水) 17:36   No:10171     
Title: Re:本格的な野球のプログラムを作っているのですが・・・    
例えば、1番バッターのデータを…

ヒット 20%
2塁打  5%
3塁打  3%
本塁打  2%
四死球 10%
アウト 60%

みたいに設定するとします。
そうすると、下記のように処理できるかと思います。

a = rand() % 100;

if (a < 20) ヒット
else if (a < 25) 2塁打
else if (a < 28) 3塁打
else if (a < 30) 本塁打
else if (a < 40) 四死球
else アウト

と、こんな感じでどうでしょうか?
if文の判定用の数値を変数にしてれば打者毎に違う確率になると思いますよ。


2倍のポイントを手に入れた! 508ポイント を手に入れた。

Name: バグ  ..熟練のプログラマー(57,202ポイント)   Date: 2007/09/05(水) 17:56   No:10172     
Title: Re:本格的な野球のプログラムを作っているのですが・・・    
コンソールアプリで画面だけ作ってみました(笑)

16ポイント を手に入れた。

Name: プーコ  ..かけだし(1,610ポイント)   Date: 2007/09/05(水) 19:07   No:10175     
Title: Re:本格的な野球のプログラムを作っているのですが・・・    
バグさんありがとうございます!!
私は今こんな感じでプログラムを作っています!!
とりあえず、ランナーを考えずにバッターの結果のみを表しているだけです。
boxさんのアドバイスを参考にすると大丈夫でした!!ありがとうございます。
#include <stdio.h>

#include <stdlib.h>

#include <math.h>

#include <time.h>

int main()

{

int e,o,s,k;

float ran0,P[9][5];

srand((unsigned)time( NULL ));

/*イニング数、アウト数、得点、打順の初期設定*/

e=1; o=0; s=0; k=1;

/*1から9番までの打者のヒット、二塁打、三塁打、HR、四死球の確立の設定*/

P[1][1]=0.25;

P[1][2]=0.30;

P[1][3]=0.31;

P[1][4]=0.34;

P[1][5]=0.36;



P[2][1]=0.23;

P[2][2]=0.25;

P[2][3]=0.26;

P[2][4]=0.27;

P[2][5]=0.31;



P[3][1]=0.23;

P[3][2]=0.26;

P[3][3]=0.27;

P[3][4]=0.34;

P[3][5]=0.39;



P[4][1]=0.22;

P[4][2]=0.24;

P[4][3]=0.24;

P[4][4]=0.34;

P[4][5]=0.38;



P[5][1]=0.26;

P[5][2]=0.30;

P[5][3]=0.31;

P[5][4]=0.32;

P[5][5]=0.37;



P[6][1]=0.20;

P[6][2]=0.23;

P[6][3]=0.24;

P[6][4]=0.26;

P[6][5]=0.30;



P[7][1]=0.30;

P[7][2]=0.32;

P[7][3]=0.33;

P[7][4]=0.34;

P[7][5]=0.38;



P[8][1]=0.13;

P[8][2]=0.18;

P[8][3]=0.20;

P[8][4]=0.21;

P[8][5]=0.25;



P[9][1]=0.36;

P[9][2]=0.38;

P[9][3]=0.40;

P[9][4]=0.45;

P[9][5]=0.50;







for(k==1;k<=9;k++)

{

ran0 = rand()/(RAND_MAX+1.0);

if(0.0<ran0&&ran0<P[k][1])

{

printf(" %d番打者 ヒットです!\n",k);

}

else if(P[k][1]<ran0&&ran0<P[k][2])

{

printf(" %d番打者 ツーベースヒットです!!\n",k);

}

else if(P[k][2]<ran0&&ran0<P[k][3])

{

printf(" %d番打者 スリーベースヒットです!!!\n",k);

}

else if(P[k][3]<ran0&&ran0<P[k][4])

{

printf(" %d番打者 HRです!!!!\n",k);

s=s+1;

}

else if(P[k][4]<ran0&&ran0<P[k][5])

{

printf(" %d番打者 四死球です!!!!!\n",k);

}

else

{

printf(" %d番打者 アウト!\n",k);

o=o+1;

}

if(o==3)

{

o=0;
e=e+1;

printf(" 3アウトになりました! \n%d回の攻撃に移ります。\n",e);

}

if(k==9)

{

k=0;

}

if(e==10)

{

printf(" 10回の攻撃はありません!\n試合終了です!\n総得点は%d点です!\n",s);

break;

}

}

return 0;

}


813ポイント を手に入れた。

Name: box  ..比類無きプログラマー(85,891ポイント)   Date: 2007/09/05(水) 22:36   No:10177     
Title: Re:本格的な野球のプログラムを作っているのですが・・・    
> float ran0,P[9][5];

C言語の配列の添字はゼロ始まりですね。
P[9][5]と定義したら、使えるのはP[0][0]〜P[8][4]の範囲です。
したがって、初期化の部分が正しくありません。
また、初期化の際、ひとつひとつの要素に値を代入しても
もちろんかまいませんが、ソースコードが冗長になるきらいがあります。
そこで、定義と同時に初期化を行なうことにしてみてはいかがでしょうか。
例えば、


float P[9][5] = {
{ 0.25, 0.30, 0.31, 0.34, 0.36 },
{ 0.23, 0.25, 0.26, 0.27, 0.31 },
// 以下、同様に3番打者〜9番打者の定義
};


762ポイント を手に入れた。

Name: バグ  ..熟練のプログラマー(57,291ポイント)   Date: 2007/09/05(水) 23:00   No:10178     
Title: Re:本格的な野球のプログラムを作っているのですが・・・    
これ、打率の他に選手の名前なんかもメンバにして構造体にして、値はファイルから読み込むようにしたら、管理が楽な気がしますね。

野球盤みたいで、ちょっと面白くなってきました。

基本は見てるだけなんだけど、いくつかチームを用意してペナントレースモードとか付けると燃えるかも…


89ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(400,398ポイント)   Date: 2007/09/06(木) 03:59   No:10194     
Title: Re:本格的な野球のプログラムを作っているのですが・・・    
>バグさん
うぉ、ササッとコンソールでそれらしいウィンドウが出来ているw
さすがバグさんw
いや〜こういうトピがあると簡単な野球ゲーム作ってみたくなりますね〜^^
作ってる間に簡単の字が本格の字に変わってきそうですがw

>プーコさん
厳密な確率が計算したいという事なので、乱数を生成するライブラリを使うとか、少なくとも少し上のビットを利用するとかしてみてはいかがでしょうか。簡単に言えば1の位は使わないとか。
標準関数の乱数は質がよくないとよく言われますし、例えばLinuxでrandを呼ぶと偶数と基数が交互に現れ、
rand()%2なんかで利用すると酷い目に合います。
VC++環境であまり切り捨てて上を使いすぎると確率が変わってしまうのでお気をつけて。
例えば150が乱数のマックスだとして、この環境でrand()%100を使うと0~50に偏ります。
VC++のRAND_MAXは32767ですが、Linux環境なら2の31乗まであったと思うので20億位まで使えると思います。
あと、投稿は<pre>と</pre>タグ(括弧は半角)に挟んでコードを書くと字下げされてきれいに表示されますよ。
たとえば


for(i=0;i<10;i++)
if(rand()%2)
printf("酷い目");

 
こんなかんじです。目にはみえませんが、プレタグで挟んであります。


402ポイント を手に入れた。

Name: プーコ  ..かけだし(1,657ポイント)   Date: 2007/09/15(土) 17:50   No:10476     
Title: Re:本格的な野球のプログラムを作っているのですが・・・    
皆様のアドバイスを参考にさせていただいて、1つのチームについて1回から9回まで攻撃するプログラムはできました!!(^^)
次に、二つのチームを対戦させようと思ったのですが、うまくできない事があります!!
1回表の攻撃→1回裏の攻撃→二回表の攻撃→二回裏の攻撃・・・
などと、別のチームの攻撃に移すのに、どのようにループすればよいかわかりません(TT)
何か良いアイデアはないでしょうか?
よろしくお願いいたします!!


47ポイント を手に入れた。

Name: バグ  ..熟練のプログラマー(58,783ポイント)   Date: 2007/09/15(土) 18:16   No:10478     
Title: Re:本格的な野球のプログラムを作っているのですが・・・    
論理演算を利用してはいかがでしょうか?

int OmoteUra = 0;

while(1){
OmoteUra = (OmoteUra + 1) & 1;
printf("%d\n", OmoteUra);
}

これで、OmoteUraの中身は1と0で切り替わるはずです。0の時を表、1の時を裏みたいに管理してはいかがでしょう?

C++ならばbool型を使用してもいいかと思います。


103ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(407,329ポイント)   Date: 2007/09/15(土) 18:39   No:10481     
Title: Re:本格的な野球のプログラムを作っているのですが・・・    
おそらくココであそこでループをと言葉で言っても解りにくいと思いますので、サンプルプログラムを書いてみました。
3イニングだけ書いてみました。
行動はヒット、HR、三振の三パターンだけです。
{20,10}とpに格納する事で20%ヒット、10%HR、70%三振ということになります。
70%はどこにも書いてありませんが、自然と前の確率からそうなります。
pは三次元配列で

int p[チーム数][イニング数][行動パターン-1];

で宣言してあります。

行動はact関数で決定します。3種類の行動のどれになったかは、0〜2の数字で返されます。

詳しい中身は注釈と一緒にみてください。


#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int p[2][3][2]=
{
{//セ・リーグの確率
{20,10},//1イニング目、20%ヒット、10%HR、70%三振
{25,15},
{30,20}
},
{//パ・リーグ
{25,15},
{35,20},
{40,25}
}
};
char name[2][16]={"セ・リーグ","パ・リーグ"};
char st[3][16]={"三振 ","ヒット","本塁打"};

int act(int team, int i){
int r=rand()%100;

if(r < p[team][i][0])
return 1;//ヒット
else if(r < p[team][i][0] + p[team][i][1])
return 2;//ホームラン
else
return 0;//三振
}

int main(){
int i,out=0,result,team=0;
srand((unsigned)time( NULL ));//初期化

for(i=0;i<3;i++){//3イニングループ
printf("%dイニング目\n",i+1);
for(team=0;team<2;team++){//2チームのループ
printf("  %sの攻撃\n",name[team]);
while(out<3){//3アウトまでループ
result = act(team,i);//行動結果を0~2の数字で格納
printf("      %sです。\n",st[result]);
if(result == 0){//act関数にiを渡し、返って来た結果が三振だったら
out++;//アウトをカウントアップ
printf("    %dアウト\n",out);
}
}
out=0;//3アウトになってイニングが変わるときoutを0に。
}
}
return 0;
}


実行結果例

1イニング目
  セ・リーグの攻撃
      本塁打です。
      ヒットです。
      ヒットです。
      三振 です。
    1アウト
      三振 です。
    2アウト
      ヒットです。
      三振 です。
    3アウト
  パ・リーグの攻撃
      三振 です。
    1アウト
      本塁打です。
      ヒットです。
      三振 です。
    2アウト
      本塁打です。
      三振 です。
    3アウト
2イニング目
  セ・リーグの攻撃
      ヒットです。
      三振 です。
    1アウト
      本塁打です。
・・・(略)

 
 



こんな感じでループしてはいかがでしょうか?



872ポイント を手に入れた。

Name: プーコ  ..かけだし(1,744ポイント)   Date: 2007/09/15(土) 23:16   No:10486     
Title: Re:本格的な野球のプログラムを作っているのですが・・・    
管理人様のサンプルがわかりそうでイマイチぴんときません(TT)申し訳ありません・・
バグ様のプログラムも、わかりそうでもう少しです・・・
具体的にプログラムの中のどこにどのようにして加えるのか分かりません・・・。



87ポイント を手に入れた。

Name: box  ..比類無きプログラマー(86,283ポイント)   Date: 2007/09/15(土) 23:24   No:10487     
Title: Re:本格的な野球のプログラムを作っているのですが・・・    
> 1つのチームについて1回から9回まで攻撃するプログラムはできました

すでにできあがっている「1つのチームについて」の部分を各イニングの表とみなして、
同様の処理を各イニングの裏として構成すればよいのではないでしょうか。


52ポイント を手に入れた。

Name: プーコ  ..かけだし(1,902ポイント)   Date: 2007/09/16(日) 00:07   No:10488     
Title: Re:本格的な野球のプログラムを作っているのですが・・・    
box様ありがとうございます!!
まず、Aチームの1回から9回までの攻撃を実行し、それからBチームの1回から9回までの攻撃を実行させる、それでふたつのチームの総得点を比べてどちらが勝ったか(負けたか、引き分けか)を表示するプログラムを作りました。
表示する際に、Aチームの攻撃(表)→Bチームの攻撃(裏)→・・・と言う風に表示させたいと言う思いで、改良をしたかったのですが・・・
なかなかうまくいきません(TT)


158ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(408,196ポイント)   Date: 2007/09/16(日) 00:21   No:10489     
Title: Re:本格的な野球のプログラムを作っているのですが・・・    
3次元配列とか3重ループとか使っているので混乱なさっているのかもしれませんが、めちゃくちゃ簡単な事しか
やってないので、落ち着いてみてください。
昔提示されたコードを読むときなかなか理解出来なくて苦労した経験が邪魔して、きっとコードを見てもすぐにはわからないだろう・・という先入観にとらわれているのだと思います。
私のサンプルは効率のよいものかどうかわからないので、そこまでして理解する必要があるかどうかはわかりませんが・・。
とりあえず上のサンプルを日本語で書くと



3アウト分が2チーム分、それが3イニングあるわけですから3重ループで以下のようにかけますね。

-------------------------

3イニング分ループ{

  2チーム分ループ{

    3アウト分ループ{

      //ここにヒットや三振などの処理

    }

  }
}

------------------------------

ここまでOkでしょうか?

ここで、act関数は、チーム情報とそのイニング数を渡せば、そのチームとイニングにあった
確率で計算した行動結果が返ってきます。
チーム情報とは0か1が入る「team」です。
イニング数は0〜2が入る「i」です。ただのループカウンタiに見えますが、
inningのiを取ったものです。

result = act( team , i );

teamとiを渡すと0〜2のどれかが帰ってきます。0は三振、1はヒット、2はHRです。
その結果がresultに入ります。
現在アウトになるのは三振だけですから、返って来た数値resultが0ならアウトの
カウントをあげればいいですね。
だから

if(result == 0)//三振だったら
out++;//アウトをカウントアップ

と書いています。
このことを理解したうえで、先ほどのサンプルをみてみましょう。
以下はprintf文を取っただけの全く同じものです。


for(i=0;i<3;i++){//3イニングループ

for(team=0;team<2;team++){//2チームのループ

while(out<3){//3アウトまでループ

result = act(team,i);//行動結果を0~2の数字で格納

if(result == 0)//三振だったら
out++;//アウトをカウントアップ
}
out=0;//3アウトになってイニングが変わるときoutを0に。
}
}

どうでしょう。上の理論をただ実装しただけですよね。
余計なprintf文が沢山はいっているのでややこしくみえただけです。

で、確率の計算ですが、普通に0~99までの乱数をとってきて、
確率の情報として格納しているpにはいっている数値にそって確率を計算しています。

3次元配列を使っているので少々難しいかもしれませんが、

int p[チーム数][イニング数][行動パターン-1];

で宣言していることに注意すればすぐわかると思います。
もし3次元配列を使いたくなければ、お使いになっている2次元配列を2チーム分作ればOKです。
具体的にどこがわからないか教えていただければその辺を重点的に解説します。

もし他の回答者様がもっといいプログラムを提示なさればそちらを参考にしてください・・。
 


867ポイント を手に入れた。

Name: box  ..比類無きプログラマー(86,229ポイント)   Date: 2007/09/16(日) 00:24   No:10490     
Title: Re:本格的な野球のプログラムを作っているのですが・・・    
> Aチームの1回から9回までの攻撃を実行し、それからBチームの1回から9回までの攻撃を実行させる

どうせ作るなら、
 ・1回〜9回のイニング順に実行する
 ・各イニングでは、先攻、後攻の順に攻撃する
とする方が、実際の試合の流れに沿っていてそれらしく見えると思います。

ループの仕方を
 ・まず、イニングのループを構成する
 ・イニングのループの中で、先攻チームの攻撃と後攻チームの攻撃を構成する
とすればよいです。

今は、ループの優先順位の考え方が逆になっていて、
 ・先攻チームの1回〜9回の攻撃を構成する
 ・後攻チームの1回〜9回の攻撃を構成する
となっているのではありませんか?


54ポイント を落としてしまった。

Name: プーコ  ..かけだし(1,996ポイント)   Date: 2007/09/16(日) 11:23   No:10492     
Title: Re:本格的な野球のプログラムを作っているのですが・・・    
管理人様、box様、丁寧にありがとうございます!!
私は、イニングを、ループではなく、アウトが3つになったらイニングがひとつ増える、というようにしていました!
if(o==3)
{
i=i+1;
}
というように!
イニングをループにし、やってみます!!
管理人様の解説で突破口がみえてきた気がします!!やってみてできなかったらまたお願い致します!!


94ポイント を手に入れた。

Name: プーコ  ..かけだし(1,775ポイント)   Date: 2007/09/16(日) 14:03   No:10496     
Title: Re:本格的な野球のプログラムを作っているのですが・・・    
管理人様やbox様のアドバイスをもとに作ってみました!
構造は良いと思うのですが、実行すると、3アウトで攻撃が終わらずにアウトが無限に表示されてしまいます(TT
while(o<3)としてやっているのですが、なぜうまくいかないのでしょうか?

3イニング分ループ{



  2チーム分ループ{



    3アウト分ループ{

1番から9番までの打順のループ{

      //ここに動きの処理



    }



  }

}
}

というような感じですが。。。


221ポイント を落としてしまった。

Name: box  ..比類無きプログラマー(86,238ポイント)   Date: 2007/09/16(日) 19:25   No:10502     
Title: Re:本格的な野球のプログラムを作っているのですが・・・    
そこの、実際のコードを見せていただけますか?

9ポイント を手に入れた。

Name: プーコ  ..入門者(2,949ポイント)   Date: 2007/09/16(日) 20:52   No:10503     
Title: Re:本格的な野球のプログラムを作っているのですが・・・    
box様!!自分で改良を加えているうちに、アウトの問題は解決しました!!!!
ご迷惑をおかけしました。。
そして、また問題が(TT)
打順に関してなのですが、
Aチームが3番で終わるとBチームの攻撃は3番からになってしまいます。
Bチームが8番で終わるとAチームの攻撃は8番からになってしまいます。
うまく打順を運ぶ方法を現在考えています。
コードはこのような感じです!!

ヒットの確立をP[team][k][1]としています。
このような感じでツーベースやスリーベースも書いています!

for(e==0;e<9;e++)
{
printf(" %d回の攻撃です!!\n\n",e+1);
for(team=0;team<2;team++)
{
printf(" %sの攻撃です!!\n\n\n",name[team]);
while(o<3)
{

for(k==1;k<=9;k++)
{
ran0 = rand()/(RAND_MAX+1.0);
if(0.0<ran0&&ran0<P[team][k]][1])/*ヒット*/
{
/*ランナーなしの時の動き*/
if(b[1]==0&&b[2]==0&&b[3]==0&&b[0]==1)
{
printf(" %d番打者 ヒットです!ランナー一塁!\n",k);
b[1]=1;
b[2]=0;
b[3]=0;
b[0]=1;
}
/*ランナー一塁のときの動き*/
else if(b[1]==1&&b[2]==0&&b[3]==0&&b[0]==1)
{
printf(" %d番打者 ヒットです!ランナー一塁二塁!!\n",k);
b[1]=1;
b[2]=1;
b[3]=0;
b[0]=1;
}
/*ランナー一塁二塁のときの動き*/
else if(b[1]==1&&b[2]==1&&b[3]==0&&b[0]==1)
{
printf(" %d番打者 ヒットです!満塁!!ランナー満塁!!\n",k);
b[1]=1;
b[2]=1;
b[3]=1;
b[0]=1;
}
/*ランナー満塁の時の動き*/
else if(b[1]==1&&b[2]==1&&b[3]==1&&b[0]==1)
{
printf(" %d番打者 ヒットです!一点追加!!なおもランナー満塁!\n",k);
b[1]=1;
b[2]=1;
b[3]=1;
b[0]=1;
s[team]=s[team]+1;
}
/*ランナー一塁三塁の時の動き*/
else if(b[1]==1&&b[3]==1&&b[2]==0&&b[0]==1)
{
printf(" %d番打者 ヒットです!一点追加でランナー一塁二塁!\n",k);
b[1]=1;
b[2]=1;
b[3]=0;
b[0]=1;
s[team]=s[team]+1;
}
/*ランナー二塁三塁のときの動き*/
else if(b[2]==1&&b[3]==1&&b[1]==0&&b[0]==1)
{
printf(" %d番打者 ヒットです!一点追加でランナー一塁三塁!\n",k);
b[1]=1;
b[2]=0;
b[3]=1;
b[0]=1;
s[team]=s[team]+1;
}
/*ランナー二塁のとき*/
else if(b[1]==0&&b[2]==1&&b[3]==0&&b[0]==1)
{
printf(" %d番打者 ヒットです!ランナー2塁3塁!!\n",k);
b[1]=0;
b[2]=1;
b[3]=1;
b[0]=1;
}
/*ランナー三塁のとき*/
else if(b[1]==0&&b[2]==0&&b[3]==1&&b[0]==1)
{

printf(" %d番打者 ヒットです!一点追加でランナー一塁!!\n",k);
b[1]=1;
b[2]=0;
b[3]=0;
b[0]=1;
s[team]=s[team]+1;
}
 
 
}


1,174ポイント を手に入れた。

Name: box  ..比類無きプログラマー(86,285ポイント)   Date: 2007/09/16(日) 22:11   No:10504     
Title: Re:本格的な野球のプログラムを作っているのですが・・・    
> 打順に関してなのですが、
> Aチームが3番で終わるとBチームの攻撃は3番からになってしまいます。
> Bチームが8番で終わるとAチームの攻撃は8番からになってしまいます。

打順を管理する領域が1個だけなのではありませんか?
dajun[2]のように配列にしてもいいですし、
dajun_top, dajun_bottomのように別々の名前を付けてもいいです。


47ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(408,531ポイント)   Date: 2007/09/17(月) 04:09   No:10505     
Title: Re:本格的な野球のプログラムを作っているのですが・・・    
これではおかしいと思うのですが・・。

>3イニング分ループ{
>  2チーム分ループ{
>    3アウト分ループ{
>      1番から9番までの打順のループ{
>        //ここに動きの処理
>      }
>    }
>  }
>}

この部分は

>      1番から9番までの打順のループ{

後から付け足されたものだと思いますが、ここに1〜9番までループしてしまっては・・。
ブレイク文をどのように書いているかわかりませんが、
1アウトのうちに1イニングから9イニングまで全部の確率で計算する事になるのではないでしょうか。
サンプルプログラムで3イニングというのは、プログラムを複雑にしないように短くしたものなので、ここを9イニングにしてもらったらいいだけです。ですので

9イニング分ループ{
  2チーム分ループ{
    3アウト分ループ{
        //ここに動きの処理
    }
  }
}

こうなるべきだと思います。
私の作ったact関数もそのまま使ってもらったほうが便利な気がしますが。


335ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(407,690ポイント)   Date: 2007/09/17(月) 04:34   No:10506     
Title: Re:本格的な野球のプログラムを作っているのですが・・・    
ベースに居る人の情報を管理するのが大変そうですね。
何かスマートに書ける方法は無いか考えてみました。
例によってこの方法が最適かどうかはわかりませんが、一応書いておきますね。

まず、
1バイトの状態変数Sを用意します。

0の状態だとSのビットの状態が

0000 0000

ですね。ここで、後ろの5ビットのみに焦点をあててみましょう。


5ビット目はホームベースを表し、4ビット目は3塁を表し・・

0 0 0 0 1
↑HM ↑3塁 ↑2塁 ↑1塁 ↑打者

このように表します。0ならランナー無し、1ならランナーありとします。
打者は打順が回ってきた時には、常に1です。
nベースヒットが出た時は、全部のビットを一つ左にnビットずらしてやればいいのです。
入った点数はHMの5ビット目以降にあるビットのたっている数でわかります。

今、打順が回ってきました。
0000 0001
0 0 0 0 1
↑HM ↑3塁 ↑2塁 ↑1塁 ↑打者

ここで、四球になりました。すると1ビット左にずらします。

0000 0010
0 0 0 1 0
↑HM ↑3塁 ↑2塁 ↑1塁 ↑打者

このように変わりますね?
四球になったので、現在1塁のみにいます。
次に、打順が回ってきました。また打者は1にします。

0000 0011
0 0 0 1 1
↑HM ↑3塁 ↑2塁 ↑1塁 ↑打者

ここでツーベースヒットが出ました。2ビット左にずらします。

0000 1100
0 1 1 0 0
↑HM ↑3塁 ↑2塁 ↑1塁 ↑打者

ちゃんとランナー2,3塁になっています。ここで打順が回ってきます。
打者を1にします。

0000 1101
0 1 1 0 1
↑HM ↑3塁 ↑2塁 ↑1塁 ↑打者

ここでスリーベースヒットが出ました。3ビット左にずらします。

0110 1000
0 1 0 0 0
↑HM ↑3塁 ↑2塁 ↑1塁 ↑打者

ここで5ビット目より左に立っているビットの数は2ですね。
得点はここで2点入った事がわかります。

これをプログラムで実装した方がif文を沢山かかなくてすむのではないでしょうか。


841ポイント を落としてしまった。

Name: 管理人 [URL]  ..伝説のハッカー(408,450ポイント)   Date: 2007/09/17(月) 05:39   No:10507     
Title: Re:本格的な野球のプログラムを作っているのですが・・・    
ビットシフトなんたらと言葉で言っても解りにくいと思うのでサンプルを書いてみました。

上記理論を実装したものです。



return (x >> k) & ~(~0 << 1);

これはxの変数のk番目のビットが立っていれば1を、たっていなければ0を返す方法です。
これは落ち着いてみればわかりますが、面倒でしたら、そういう機能だと思ってください。


#include <stdio.h>

char st_base[3][16]={"一塁","二塁","三塁"};
char st_hit[4][4]={"一","二","三","本"};

//xのkビット目が立っているか調べる関数
//返り値= 1(立っている),0(立っていない)
int bits(int x, int k){
return (x >> k) & ~(~0 << 1);
}

//打者が入ったとき、0ビット目を1にする関数。
//0ビット目が0なら1を立てる。
void in_bits(int *x){
if(bits(*x,0)==0)
*x+=1;
}

//今どこの塁にランナーがいるかを表示する関数。
//xの1ビット目から3ビット目はそれぞれ1塁から3塁に対応している事に注目
void show_base(int x){
int i;
printf("\nベース [[");
for(i=1;i<4;i++){
if(bits(x,i)==1)//iビット目はi塁を示す。
printf("%s ",st_base[i-1]);
else
printf("   ");
}
printf("]]\n");
}

//n塁打を打ったとき、nビットだけxを移動する関数。
//同時に何点入ったかも計算する。
int move_bits(int *x,int n){
int score=0;
*x;
while(n>0){//n塁打分ループ
*x= *x << 1;//1つずつずらす。
if(bits(*x,4)==1){//ホームベースに人が帰ったら
score++;//スコアアップ
*x -= 1<<4;//ホームベースの人を消す。
printf("ホームイン!\n");
}
n--;
}
return score;
}

void base_calc(int *x,int hit,int *score){
in_bits(x);
printf("\n打者が入りました。\n");
printf("%s塁打、打った〜!!\n",st_hit[hit-1]);
*score+=move_bits(x,hit);
printf("現在[%d]点\n",*score);
show_base(*x);
}

int main(){
int x=1,score=0,hit=0;

show_base(x);//現在の塁の状態を見せる。
base_calc(&x,1,&score);//引数は順に 塁の状態変数、○塁打数、スコア
base_calc(&x,2,&score);
base_calc(&x,1,&score);
base_calc(&x,3,&score);

return 0;
}

実行結果

ベース [[         ]]

打者が入りました。
一塁打、打った〜!!
現在[0]点

ベース [[一塁       ]]

打者が入りました。
二塁打、打った〜!!
現在[0]点

ベース [[   二塁 三塁 ]]

打者が入りました。
一塁打、打った〜!!
ホームイン!
現在[1]点

ベース [[一塁    三塁 ]]

打者が入りました。
三塁打、打った〜!!
ホームイン!
ホームイン!
現在[3]点

ベース [[      三塁 ]]


 
 
見てて意味がわからなくなったら、上の理論を書いた記事と見比べながらサンプルを確認してください。
こっちの方が汎用的にかけるだろうと思って紹介しましたが、難しかったですかね・・(汗


760ポイント を手に入れた。

Name: プーコ  ..入門者(3,103ポイント)   Date: 2007/09/18(火) 13:23   No:10536     
Title: Re:本格的な野球のプログラムを作っているのですが・・・    
box様、管理人様ありがとうございます。。
管理人様のビットのコードは、見ていると大変わかりやすいのですが、
ビットを使ったコードを学んだことがありません!!
ですので、if文を使って作成していたのです。
if文を使えば、1チームだけの攻撃であればまちがいなくできていると思います。
それを2チーム分にして対戦させるのがなかなかうまくいかないのです(TT)
もう少し考えてみます!!
ほんとうにいつも丁寧にありがとうございます!!!!


154ポイント を手に入れた。

Name: プーコ  ..入門者(3,129ポイント)   Date: 2007/09/18(火) 13:43   No:10537     
Title: Re:本格的な野球のプログラムを作っているのですが・・・    
管理人様の構造でプログラムを作るとすれば、
どこに打順をもってくればよいのでしょうか?


26ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(410,006ポイント)   Date: 2007/09/18(火) 14:44   No:10538     
Title: Re:本格的な野球のプログラムを作っているのですが・・・    


すみません、イニングによる確率分けをしたいのかと思っていました。
打順による確率わけですね。考えてみれば当然ですね(汗
プログラムの流れはほとんどかわりませんが、打順に沿った確率わけが出来るサンプルにしてみました。

変更した箇所は、打順の変数を用意した事です。
これからチームによる変数が色々でてくるでしょうから、今後の事を考えて
構造体にしてみました。

typedef struct{
int dajun;
}team_states_t;

このように用意する事で、team_states_t型の型が作成でき、dajunを持つことになります。

team_states_t team_states[2] ;

と宣言してこの型をチーム分作ります。だから打順は

team_states[team].dajun

で表す事になります。

サンプルはほとんどそのままですが、チョコチョコ変えています。
行動できるパターンは
一塁打、二塁打、三塁打、HR、三振 の5種類です。
act関数の確率の計算部分がfor文に変わっている事に注目してください。
このようにかけばif文は一つでOKです。
理屈は同じなので前のサンプルと見比べてください。

黄色の部分が主な変更点です。
pは

int p[チーム数][打席数][行動パターン-1] で格納しているので

int p[2][9][4];

となっています。行動パターン-1の引く1はなぜかというと、三振はelseで計算するため、これ自身に確率は必要ないからです。
どの行動もしなかった場合、三振となります。



#include <stdio.h>
#include <stdlib.h>
#include <time.h>

typedef struct{
int dajun;
}team_states_t;

team_states_t team_states[2] ;

int p[2][9][4]=
{
{//セ・リーグの確率
{30,20,10,10},//1塁打30%、2塁打20%、3塁打10%、本塁打10%、三振30%
{30,20,10,10},//1塁打30%、2塁打20%、3塁打10%、本塁打10%、三振30%
{30,20,10,10},//1塁打30%、2塁打20%、3塁打10%、本塁打10%、三振30%
{30,20,10,10},//1塁打30%、2塁打20%、3塁打10%、本塁打10%、三振30%
{30,20,10,10},//1塁打30%、2塁打20%、3塁打10%、本塁打10%、三振30%
{30,20,10,10},//1塁打30%、2塁打20%、3塁打10%、本塁打10%、三振30%
{30,20,10,10},//1塁打30%、2塁打20%、3塁打10%、本塁打10%、三振30%
{30,20,10,10},//1塁打30%、2塁打20%、3塁打10%、本塁打10%、三振30%
{30,20,10,10},//1塁打30%、2塁打20%、3塁打10%、本塁打10%、三振30%
},
{//パ・リーグ
{30,20,10,10},//1塁打30%、2塁打20%、3塁打10%、本塁打10%、三振30%
{30,20,10,10},//1塁打30%、2塁打20%、3塁打10%、本塁打10%、三振30%
{30,20,10,10},//1塁打30%、2塁打20%、3塁打10%、本塁打10%、三振30%
{30,20,10,10},//1塁打30%、2塁打20%、3塁打10%、本塁打10%、三振30%
{30,20,10,10},//1塁打30%、2塁打20%、3塁打10%、本塁打10%、三振30%
{30,20,10,10},//1塁打30%、2塁打20%、3塁打10%、本塁打10%、三振30%
{30,20,10,10},//1塁打30%、2塁打20%、3塁打10%、本塁打10%、三振30%
{30,20,10,10},//1塁打30%、2塁打20%、3塁打10%、本塁打10%、三振30%
{30,20,10,10},//1塁打30%、2塁打20%、3塁打10%、本塁打10%、三振30%
}
};
char name[2][16]={"セ・リーグ","パ・リーグ"};
char st[5][16]={"三振 ","一塁打","二塁打","三塁打","本塁打"};

int act(int team, int dajun){//チームと打順にあった行動結果を返す
int r=rand()%100,i,range=0;

for(i=0;i<4;i++){
if(range <= r && r < range+p[team][dajun][i])
return i+1;//i+1塁打
range += p[team][dajun][i];
}

return 0;
}//return 0:三振 1:一塁打 2:二塁打 3:三塁打 4:HR

int main(){
int i,out=0,result,team=0;
srand((unsigned)time( NULL ));//初期化

for(i=0;i<9;i++){//9イニングループ
printf("%dイニング目\n",i+1);
for(team=0;team<2;team++){//2チームのループ
printf("  %sの攻撃\n",name[team]);
while(out<3){//3アウトまでループ
result = act(team,team_states[team].dajun);//行動結果を0~2の数字で格納
printf("      %d番打者\n",team_states[team].dajun+1);
printf("      %sです。\n",st[result]);
if(result == 0){//act関数にiを渡し、返って来た結果が三振だったら
out++;//アウトをカウントアップ
printf("    %dアウト\n",out);
}
team_states[team].dajun = (++team_states[team].dajun)%9;//打順を回す。9になったら0へ }
out=0;//3アウトになってイニングが変わるときoutを0に。
}
}
return 0;
}

実効結果

・・・
・・・(略


      8番打者
      三振 です。
    3アウト
2イニング目
  セ・リーグの攻撃
      8番打者
      二塁打です。
      9番打者
      本塁打です。
      1番打者
      三振 です。
    1アウト
      2番打者
      三塁打です。
      3番打者
      二塁打です。
      4番打者
      三振 です。
    2アウト
      5番打者
      一塁打です。
      6番打者
      三振 です。
    3アウト
  パ・リーグの攻撃
      9番打者
      三振 です。
    1アウト
      1番打者

・・・
・・・(略

 
 
このサンプルはかなり縦に長い結果を表示するので、バッファサイズが小さいと全部表示できないかもしれません。
もしXPでしたら、
コマンドプロンプトの上の青いステータスバー上で右クリックし、「既定値」を選択。
「画面のバッファサイズ」をこれからのことも考えて、500以上位にして置いてください。


1,470ポイント を手に入れた。

Name: やそ  ..ぴよぴよ(670ポイント)   Date: 2007/09/18(火) 15:38   No:10539     
Title: Re:本格的な野球のプログラムを作っているのですが・・・    
main関数内にロジックを組めばいいと思います。

管理人さんのロジックを借りるならば・・・

各チームの打順をdajun[2]とする。
dajunの初期値は1
dajun[0]=1
dajun[1]=1
9イニング分ループ{
  2チーム分ループ{ //for(j=0;j<=1;j++)のループでいいでしょう。
if(j=0) //チーム名の表示
printf("\nA(先攻)チームの攻撃");
else
printf("\nB(後攻)チームの攻撃");

out=0;//アウトカウントのクリア

    3アウト分ループ{
乱数取得
乱数判定
アウトならout++;
塁打ならbasecalcに渡す。
打順を進める
dajun[j]++;//j=0ならAチーム
if(dajun[j]>9)
dajun[j]=1;
    }
  }
}

basecalcは打順の表示はないようなので引数を増やしてdajun[]も受け渡せばうまく表示できるかも^^
全て推測で書いてますが、誰かフォローして下さいませ^^;


294ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(410,092ポイント)   Date: 2007/09/19(水) 04:09   No:10547     
Title: Re:本格的な野球のプログラムを作っているのですが・・・    
DXライブラリを使って表現してみました。
やりたい事はこういう感じでしょうか?
ちなみに自動終了条件は無いので、適当に見飽きたらEcsボタンで止めてください。

http://dixq.net/zip/base.zip


86ポイント を手に入れた。

Name: プーコ  ..入門者(3,219ポイント)   Date: 2007/09/27(木) 14:37   No:10670     
Title: Re:本格的な野球のプログラムを作っているのですが・・・    
管理人様、やそ様!!
できましたっ!!!!(^^)打順はdajun[1]というふうにふたつの変数にすればうまくいきました。
大きすぎるのかな、ここに載せられないのが残念です。。
アドバイスありがとうございました。
できればこれをもっと発展させていきたいです!!


90ポイント を手に入れた。

Name: プーコ  ..入門者(3,369ポイント)   Date: 2007/10/01(月) 18:36   No:10732     
Title: Re:本格的な野球のプログラムを作っているのですが・・・    
以前プログラムができたと書き込みましたが、疑問に残る点が浮かんできました。
:2チームの選手を全員同じ打者にして、全ての確立(ヒット、二塁打、三塁打、HR、四死球)を全員同じにしました。が、srand((unsigned)time( NULL ));で乱数を初期化しても、疑問があります。
全員がまったく同じ打率なので、それぞれの勝数は大体同じくらいになると予想していたのですが、
100試合繰り返したら、毎回大体、先攻勝ち:後攻勝ち:引き分け=6:3:1
くらいになります。1000試合しても大体勝ちの割合は同じです。
なにか理由が分かればいいのですが(TT)
乱数の取りかたがわるいのでしょうか?




150ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(419,628ポイント)   Date: 2007/10/02(火) 01:25   No:10743     
Title: Re:本格的な野球のプログラムを作っているのですが・・・    
srand((unsigned)time( NULL ));
の書き方が悪いのかもしれません。
この行が呼ばれるのは最初の1回だけですか?

この関数で取得するのは現在の「秒数」だと思ってください。
今の瞬間33秒だったとしましょう。(実際はもっと多い数字ですが)
同じ1秒間に100回初期化したら、毎回33で初期化されます。
同じ数で初期化するということは、乱数の出方も一緒になります。
だから、プログラムで
srand((unsigned)time( NULL ));
を書くのは最初の一回だけにしてください。

もしそれでも解決しなければ、ここにアップロードしてください。
「参照」ボタンを押せばソースファイルがアップ出来ます。
その際、このトピは長くなりすぎたので、どうぞお気軽に新しくトピを立てて下さい。

(あと、何度か書き込みがあったので念の為に。○確率、×確立、ではm(_ _)m)


217ポイント を落としてしまった。



Name: マヨネィズ  ..ぴよぴよ(80ポイント)   Date: 2007/09/27(木) 20:11   No:10676       
Title: 円周率を求める    
はじめまして、マヨネィズです。
C言語で円周率を求めろ、という課題がでました。
ここで過去ログを検索した所、同じような質問があったのですが、
解決されていなかったので質問します。

プログラムを作る際の条件は
1.コマンドラインから求めたい桁数を入力するとその桁数だけ円周率を出力させる。(何千何万という桁)
2.円周率を求める際に、マーチンの公式を使う。

マーチンの公式は調べた所、16*arctan(1/5)-4*arctan(1/239) ということはわかりました。
ここからどのようにすればいいのかサッパリお手上げです。
俺作ったことある!とか詳しいかたいましたら(図々しいですが)わかりやすいアドバイス
お願いします。
ちなみに、C++ではなくてただのCです。


80ポイント を手に入れた。


Name: たかぎ [URL]  ..中級者(14,148ポイント)   Date: 2007/09/27(木) 21:14   No:10678     
Title: Re:円周率を求める    
課題ということなので、ヒントだけ...

一度に条件を全て満たそうと思うと大変なので、

1. 桁数は少なくてもよいので、円周率を求めるプログラムを作る。
2. 多倍長演算のモジュールを作る。
3. 指定桁数まで円周率を求める。

の順番でやってみては。



93ポイント を手に入れた。

Name: マヨネィズ  ..ぴよぴよ(119ポイント)   Date: 2007/09/28(金) 17:59   No:10685     
Title: Re:円周率を求める    
回答ありがとうございます。
1はできるのですが、2と3についてまったくお手上げ状態です。


39ポイント を手に入れた。

Name: たかぎ [URL]  ..中級者(14,443ポイント)   Date: 2007/09/28(金) 18:21   No:10687     
Title: Re:円周率を求める    
とりあえずこの辺を参考にしてみては
http://www5.airnet.ne.jp/tomy/cpro/longint.htm

指定桁まで求めるには、逆正接を級数展開で計算する必要があるかと思います。
収束条件を、指定した桁数を元に決めればどうにかなるでしょう。

ちなみに、そのものずばりのソースコードを載せることはしません。
課題だからということもありますが、一番の理由は面倒だからです。
# 一応、プログラミングは本業なので、ある程度以上の内容は無償では引き受けないことにしています。


226ポイント を手に入れた。

Name: マヨネィズ  ..ぴよぴよ(569ポイント)   Date: 2007/10/01(月) 19:59   No:10733     
Title: Re:円周率を求める    
回答ありがとうございます。お礼が遅れてすいません。
逆正接の級数展開というのは

アークタンジェント(x) = 1/1*x -1/3*x^3 +1/5*x^5 ...
というやつですよね。

収束条件を指定した桁数を元に・・・というのがよくわからないのですが
級数展開で無限に増える項を指定した桁数によって制限して計算しろ。ということですか?

ついでにキー入力はコマンドラインからなので桁数を指定するのにscanf関数などは
使えないのかなと・・・よくわかりませんが。
コマンドラインっていうのは ./a.out の後に続けて・・・ということでいいんですよね。

コマンドラインからの入力はポインタのポインタを使えばできるというのは習いました。
それ以外は全然わかりません。


2倍のポイントを手に入れた! 450ポイント を手に入れた。

Name: tkmakwins15 [URL]  ..プログラマー(28,723ポイント)   Date: 2007/10/01(月) 22:38   No:10734     
Title: Re:円周率を求める    
コマンドラインというのは、プログラム実行時に与えられる引数の事です。これは文字列として与えられます。
Windows環境の場合、「ファイル名を指定して実行」という風なところがあると思います。ここに、実行したいファイル名を指定すれば実行するのですが、ファイルのフルパスのあとに追加で文字列を指定できます。
例えば、Cドライブのprogramというディレクトリにprogram.exeという実行ファイルがあったとします。これを、ファイル名を指定して実行で実行するには↓

C:\program\program.exe

と入力すればいいのですが、例えば、コマンドラインから -a という文字列を受け取るとします。これを渡すには、

C:\program\program.exe -a

と入力すればいいのです。そして、これをプログラム側が受け取るためには、今までのmain関数に、引数を追加します。

int main(int argc,char *argv[])
{
/*コードを書く*/
return 0;
}

そして、argcはコマンドラインの数。argvはコマンドラインが順番に入った文字列ポインタの配列です。
argv[0]は必ずプログラムのフルパスになります。argc-1までの要素にコマンドラインが入っています。


492ポイント を手に入れた。

Name: マヨネィズ  ..ぴよぴよ(896ポイント)   Date: 2007/10/01(月) 23:25   No:10739     
Title: Re:円周率を求める    
再度回答ありがとうございます。
ということは、自分はknopppiを使ってますが
[gcc ファイル名.c] でコンパイルした後、実行コマンドが[a.out] なので [a.out 100]と入力すれば
argvに[1]に文字列として100があるということになるんですね。
これを使えば任意の桁をコマンドラインからというのは難しくはないですね。

今、多倍長で整数で20000桁を扱うことには成功しましたが(四則演算のみですが)
少数は無理です。
級数展開すると明らかに少数が出てくるのでそれをどう処理すればいいかということで
悩んでいます。
これは何かうまいやりかたとかあるのでしょうか?
少し調べてみたら固定小数点なんちゃらというのがあったのですがよくわかりません。




327ポイント を手に入れた。

Name: tkmakwins15 [URL]  ..プログラマー(28,812ポイント)   Date: 2007/10/02(火) 00:09   No:10740     
Title: Re:円周率を求める    
固定小数点数ですね。Cではサポートされていませんが、たぶん扱えるはずです。
ポイントは、小数点の位置が固定であるということから、整数部と小数部に分ければいいのです。
どちらもlong型で変数を作り、どっちかを整数部、もう一方を小数部として作れるはずです。


89ポイント を手に入れた。



Name: DDK  ..入門者(3,587ポイント)   Date: 2007/09/29(土) 12:21   No:10689       
Title: マイクロソフトに疑問    
こんにちは

最近MS-VC2005を本格的に導入しようとしたが、やっぱり旧来のfwrite()関数をはじめ幾つかの関数を
xxx_s(...)へ変更せよとコンパイラーに要求されました。
要は xxx_s(...)のほうは安全だと。

不思議に思うのは、
1.関数の安全性を図ろうとしたら、その中身を書き換えれば、いい話で、interface(関数名や引数の順番)を換える必要はないでしょう。

2.しっぽ(_s)の付いている関数はC++言語の国際的な標準になっているのでしょうか。


マイクロソフトより、やはりここの皆さんのご見解をお伺いするほうがいいと思いまして、、、

宜しくお願い致します。





288ポイント を手に入れた。


Name: バグ  ..熟練のプログラマー(58,963ポイント)   Date: 2007/09/29(土) 12:36   No:10690     
Title: Re:マイクロソフトに疑問    
Windows上でより安全に動かす為の変更であって、強要ではなかったと思いますが…

36ポイント を手に入れた。

Name: tkmakwins15 [URL]  ..プログラマー(26,224ポイント)   Date: 2007/09/29(土) 13:14   No:10691     
Title: Re:マイクロソフトに疑問    
>しっぽ(_s)の付いている関数はC++言語の国際的な標準になっているのでしょうか

それは全く違います。それを使うとMS以外のコンパイラでは全く通用しないコードになる恐れがあります。

>関数の安全性を図ろうとしたら、その中身を書き換えれば、いい話で、interface(関数名や引数の順番)を換える必要はないでしょう。

C/C++では、関数にバッファを渡すとそのバッファのサイズが引渡し先ではそのサイズを知る事ができないのです。
そこで、バッファをのサイズを関数に引き渡す事で、それを解決しようというわけです。

結論として、他環境でもコンパイルしたい場合は使わない、MS-VC2005のみでのコンパイル、そして安全性を高めるという場合は使うほうがいい。ということになるのではないでしょうか。


294ポイント を手に入れた。

Name: DDK  ..入門者(3,733ポイント)   Date: 2007/09/29(土) 13:16   No:10692     
Title: Re:マイクロソフトに疑問    

> Windows上でより安全に動かす為の変更であって、強要ではなかったと思いますが…

コンパイルする時に以下のようなメッセージが出されたので、全部"_s"の付いた関数に換えたのです。

***********************************************************************************************
セキュリティが強化されたバージョンが使用可能になったので、これらの関数は使用されなくなりました。
***********************************************************************************************

「これらの関数は使用されなくなりました」ということは"強要"に近いですね。


146ポイント を手に入れた。

Name: a  ..ぴよぴよ(36ポイント)   Date: 2007/09/29(土) 13:20   No:10693     
Title: Re:マイクロソフトに疑問    
> やっぱり旧来のfwrite()関数をはじめ幾つかの関数を
> xxx_s(...)へ変更せよとコンパイラーに要求されました。

fwrite も警告出すの?


14ポイント を手に入れた。

Name: tkmakwins15 [URL]  ..プログラマー(26,545ポイント)   Date: 2007/09/29(土) 13:27   No:10694     
Title: Re:マイクロソフトに疑問    
>***********************************************************************************************
>セキュリティが強化されたバージョンが使用可能になったので、これらの関数は使用されなくなりました。
>***********************************************************************************************
>
>「これらの関数は使用されなくなりました」ということは"強要"に近いですね。

「これらの関数は使用されなくなりました」というのははっきり言って、MSの誇張です。正確に言うならば、
「これらの標準関数は危険が伴う恐れがあります。なので、安全性の高い非標準関数を使用することを推奨します。」
がまだ正しい表現ではないでしょうか。この警告は無視してもかまいません。

ある意味でMSの体質かもしれませんね(笑)



321ポイント を手に入れた。

Name: Justy  ..ハッカー(164,516ポイント)   Date: 2007/09/29(土) 14:02   No:10695     
Title: Re:マイクロソフトに疑問    
 その手の関数はC言語の次の改訂で追加されるよう検討されているんじゃなかったでしたっけ?
 MSも標準化委員会と連絡を取り合っていたという話も昔聞いたことがあります。


http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1199.pdf
http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1193.pdf

 細かいところで MSVC版とは違ったりしますが・・・。


 セキュア関数を使わない選択をするなら

VisualC++2005 の警告メッセージについて
http://www.geocities.jp/ky_webid/common/vc2005warning.html

 で警告を抑制するのがいいかと。


202ポイント を手に入れた。

Name: DDK  ..入門者(4,011ポイント)   Date: 2007/09/29(土) 15:09   No:10696     
Title: Re:マイクロソフトに疑問    
Justy様
>VisualC++2005 の警告メッセージについて
>http://www.geocities.jp/ky_webid/common/vc2005warning.html

情報有難うございます。
本当に安全性に問題あれば、当然安全なものを使いたいですね。
ただ、あれは関数名のせいではなくて関数の実装の問題です。
その関数の実装を改善すればいいのにわざわざ"_s"付けて別の関数にする必要はないでしょう。

MSのC(C++)関係のソースコードにいつもごみごみに見受けます。

____...._...____
__ABCD_____.___

アンダーバーだらけで、時にはそのアンダーバーの数を数えるにも苦労。
乱暴な言語+乱暴な命名法=MS-VC ?






278ポイント を手に入れた。

Name: バグ  ..熟練のプログラマー(58,980ポイント)   Date: 2007/09/29(土) 15:43   No:10697     
Title: Re:マイクロソフトに疑問    
ぶっちゃけ、MS社の世界征服への布石ではないでしょうか?(笑)

17ポイント を手に入れた。

Name: たかぎ [URL]  ..中級者(14,625ポイント)   Date: 2007/09/29(土) 18:53   No:10698     
Title: Re:マイクロソフトに疑問    
「安全」と一口に言っても、それは何に重きを置くかによって全く変わってきます。

個人的には、移植性が保たれることの方が、つまらないミスを犯す下手糞プログラマのための対策を施している独自仕様のライブラリを使うよりずっと安全だと思います。
特定の処理系でしか使えないコードを書いてしまうのは、いわゆるセキュリティホールとは別の意味で、非常に大きな危険を伴いますから。

ところで、Linux上でGCCを使っていても、getsやtmpnamに対して、同様の露骨な警告が出ます。getsはともかく、tmpnamは代替手段が(ほぼ)ないので、そんなことを言われても、なかなかつらいところです。


182ポイント を手に入れた。

Name: tkmakwins15 [URL]  ..プログラマー(26,950ポイント)   Date: 2007/09/29(土) 23:03   No:10699     
Title: Re:マイクロソフトに疑問    
>アンダーバーだらけで、時にはそのアンダーバーの数を数えるにも苦労。
>乱暴な言語+乱暴な命名法=MS-VC ?

C++なので何故オーバーロードで対応しないのでしょうか。Cとの互換性?
乱暴な命名法といえば、確かWinAPIの変数命名規則はシステムハンガリアンではなかったでしょうか。MSもそれを今は廃止してますけど。

>ぶっちゃけ、MS社の世界征服への布石ではないでしょうか?(笑)

僕もそう思います。もしやMSが「俺らのいうこと聞け!!」という意味でこの警告出すのでは。

この関数はバッファオーバーラン対策には有効かもしれませんが。そもそもMSはコンパイラを作っているので、バッファ情報を自動的にメモリに保存する、といった実行はいるを作成することも不可能ではないはずです。それそのものは規格をは無関係のはずです

#define疑似命令によってそうするかしないか切り替えるスイッチを作ったほうがいいかもしれませんね。さっきのような実行コードは遅くなるのが必至です。


405ポイント を手に入れた。

Name: YuO  ..中級者(12,446ポイント)   Date: 2007/09/30(日) 03:05   No:10703     
Title: Re:マイクロソフトに疑問    
> ただ、あれは関数名のせいではなくて関数の実装の問題です。
> その関数の実装を改善すればいいのにわざわざ"_s"付けて別の関数にする必要はないでしょう。

関数のインターフェースが変わるのですから,別の関数にするのは自然だと思いますが。

>アンダーバーだらけで、時にはそのアンダーバーの数を数えるにも苦労。

連続するunderscoreを含むから始まる識別子は実装が使うために予約されていますから (in C++),それでunderscoreを使っているのでしょう。

> C++なので何故オーバーロードで対応しないのでしょうか。Cとの互換性?

strcpyなどは元々Cのライブラリであることをお忘れ無く。
# 確かに<cstdio>はC++のライブラリでもありますが。

それに,
template <size_t size> errno_t std::strcpy (char (&)[size], const char *);
なんかが導入されると,配列相手の場合に
char * std::strcpy (char *, const char *);
とどちらが使われるか,直感で答えられますか?
# 基本的に非template関数は関数templateよりも強い。ただ,規格書のoverload resolutionは理解ができないのですけど……。

>> ぶっちゃけ、MS社の世界征服への布石ではないでしょうか?(笑)
> 僕もそう思います。もしやMSが「俺らのいうこと聞け!!」という意味でこの警告出すのでは。

なぜにこういう陰謀論が出てくるのだか……。
陰謀論に流れる前に,ちゃんと技術的な視点から警告を出している理由を考えた方がよいかと。
# 結局は,それだけバッファオーバーランによる問題が起きやすい,ということかと。

> この関数はバッファオーバーラン対策には有効かもしれませんが。そもそもMSはコンパイラを作っているので、バッファ情報を自動的にメモリに保存する、といった実行はいるを作成することも不可能ではないはずです。それそのものは規格をは無関係のはずです
> #define疑似命令によってそうするかしないか切り替えるスイッチを作ったほうがいいかもしれませんね。さっきのような実行コードは遅くなるのが必至です。

#defineどころかコンパイラスイッチやリンカスイッチでも,既に存在する関数の動作を変更することはできません。
そのことは理解していますか?
# つまりは,呼び出し側でいくら頑張ったところで既存のライブラリ(CRT含む,templateやinline系を除く)の動作を変更するのは無理だということ。


176ポイント を手に入れた。

Name: たかぎ [URL]  ..中級者(14,878ポイント)   Date: 2007/09/30(日) 08:00   No:10706     
Title: Re:マイクロソフトに疑問    
> なぜにこういう陰謀論が出てくるのだか……。
> 陰謀論に流れる前に,ちゃんと技術的な視点から警告を出している理由を考えた方がよいかと。
> # 結局は,それだけバッファオーバーランによる問題が起きやすい,ということかと。

陰謀論というのはいいすぎですね。
ただ、MSの方針に一貫性がないのは確かです。たとえば、_strdup などの非標準関数は、非標準ゆえにアンダスコアから始めています。それなら、strcpy_s も当然 _strcpy_s とすべきですよね。
私としては、<string.h> で宣言されるのも不満で、できれば <string_s.h> のようなヘッダを別に作ってほしかったところです。そうでなければ、せっかくよいライブラリが提供されていても、移植性に難があるので、結局は使えなくなります。

もうひとつ、既存のコードでこれだけ大量の警告が出て、その警告を回避する方法が詳細な説明抜きで出回ると、盲目的に警告を回避してしまうケースが続出することは必至です。

> そもそもMSはコンパイラを作っているので、

「コンパイラを作っている」ので、プロジェクトを静的解析して、問題がない strcpy 等の使用個所では警告を出さないといったことは可能なはずですね。
# コンパイル時間はかかるかもしれませんが...


253ポイント を手に入れた。

Name: tkmakwins15 [URL]  ..プログラマー(27,441ポイント)   Date: 2007/09/30(日) 10:17   No:10707     
Title: Re:マイクロソフトに疑問    
># 結局は,それだけバッファオーバーランによる問題が起きやすい,ということかと。

バッファオーバーランの問題が一番の理由だと思います。しかし「使用されなくなった」というのは言い過ぎではないでしょうか。

>#defineどころかコンパイラスイッチやリンカスイッチでも,既に存在する関数の動作を変更することはできません。
>そのことは理解していますか?

僕の考え方は、すでに存在する関数の表向きなど動作は変更せずに、配列の構造で対応しようというものです。
配列の一個前のアドレスに、サイズ情報を含ませておく事は、そんなに無理な話ではないと思います。
そして、バッファオーバーランが起こる前に、abort()などでプログラムを強制終了でいいのではないかと思います。
そうすれば、バッファオーバーランという最悪の事態だけは免れるのではないでしょうか。

>「コンパイラを作っている」ので、プロジェクトを静的解析して、問題がない strcpy 等の使用個所では警告を出さないといったことは可能なはずですね。

ただ、入力系統に、scanfやgetsを使うのはちょっと問題があるかなと思います。使うことに問題がある関数に対しては警告を出してもいいとは思いますが、使い方に問題がある関数は、解析してからでも問題はないと思います。


491ポイント を手に入れた。

Name: たかぎ [URL]  ..中級者(14,978ポイント)   Date: 2007/09/30(日) 10:46   No:10708     
Title: Re:マイクロソフトに疑問    
> 配列の一個前のアドレスに、サイズ情報を含ませておく事は、そんなに無理な話ではないと思います。

無理な話だと思います。
strcpy などは、必ずしも割付けられた配列の先頭を渡されるとは限りません。
例えば、
char str[16] = "0:";

strcpy(str + 2, "何か文字列");
str[0] = '1';


のようなケースは普通にあり得ますから。

> 入力系統に、scanfやgetsを使うのはちょっと問題があるかなと思います。

gets はともかく、scanf にどんな問題があるというのでしょうか?
一応、下記も参照してみてください。
http://www.kijineko.co.jp/tech/superstitions/buffer-overrun-of-scanf.html


100ポイント を手に入れた。

Name: tkmakwins15 [URL]  ..プログラマー(27,463ポイント)   Date: 2007/09/30(日) 11:22   No:10710     
Title: Re:マイクロソフトに疑問    
>gets はともかく、scanf にどんな問題があるというのでしょうか

これは迷信なんですね。これは勘違いしてました。


22ポイント を手に入れた。

Name: たかぎ [URL]  ..上級者(15,253ポイント)   Date: 2007/09/30(日) 12:40   No:10711     
Title: Re:マイクロソフトに疑問    
scanf 系の関数は、バッファサイズのことより、可変個引数を使っていることが一番危険です。
scanf_s 関数は、配列のサイズを size_t 型ではなく unsigned 型で指定しなければなりません。
しかし、
char str[10];

scanf_s("%9s", str, sizeof(str));


のように書いてしまうことは少なくないはずです。しかも、VC++ではたまたまこれでも動くんですね。
ところが、別の環境に移植したとたん、上のコードは突如として牙を剥きます。

また、算術型を読み込む際のオーバーフロー・アンダーフローの問題も解消されていません。
さらに、わざわざ新しく関数を実装するのに、なぜC99の書式が使えないのかもまったくの謎です。


275ポイント を手に入れた。

Name: Justy  ..ハッカー(164,581ポイント)   Date: 2007/09/30(日) 13:11   No:10713     
Title: Re:マイクロソフトに疑問    
> 配列のサイズを size_t 型ではなく unsigned 型で指定しなければなりません
 あ、ほんとですね。

http://msdn2.microsoft.com/ja-jp/library/w40768et(VS.80).aspx

 TRの方はちゃんと rsize_t型なのに・・・。


65ポイント を手に入れた。

Name: Hermit  ..中級者(14,437ポイント)   Date: 2007/09/30(日) 13:23   No:10715     
Title: Re:マイクロソフトに疑問    
>scanf 系の関数は、バッファサイズのことより、可変個引数を使っていることが一番危険です。
そのあたりは、プログラマが気をつけるべきことでしょう。
C,C++の精神によれば(^^;、プログラマが配慮してバグが出ない様にすればいいだけです。
いやだったら、他の言語やコンパイラで作りましょう。
(または他の言語自体を作るか、他の安全な関数を作るか)

>さらに、わざわざ新しく関数を実装するのに、なぜC99の書式が使えないのかもまったくの謎です。
ライブラリと、コンパイラ自体は、また別物だと思いますが。
バグが発生するかもしれないコンパイラの仕様変更は・・・あまりしたくは無いとは思います。
(VisualC++2005 の警告メッセージも仕様変更ではあるけど)



217ポイント を手に入れた。

Name: たかぎ [URL]  ..上級者(15,371ポイント)   Date: 2007/09/30(日) 15:27   No:10716     
Title: Re:マイクロソフトに疑問    
> >scanf 系の関数は、バッファサイズのことより、可変個引数を使っていることが一番危険です。
> そのあたりは、プログラマが気をつけるべきことでしょう。

プログラマが気をつけるべきだという意見には賛成のなのですが...
その方針であれば、
char str[10];

scanf("%9s", str);


で済むところを、わざわざミスを犯しやすい引数をもう一つ追加しないといけないのは不思議なのです。

> >さらに、わざわざ新しく関数を実装するのに、なぜC99の書式が使えないのかもまったくの謎です。
> ライブラリと、コンパイラ自体は、また別物だと思いますが。

コンパイラの話はしていません。
なぜ、scanf 系関数で、"%zu" や "%hhd", "%td" などの書式が使えないのかが謎なのです。


118ポイント を手に入れた。

Name: Hermit  ..中級者(14,367ポイント)   Date: 2007/09/30(日) 15:44   No:10718     
Title: Re:マイクロソフトに疑問    
>なぜ、scanf 系関数で、"%zu" や "%hhd", "%td" などの書式が使えないのかが謎なのです。
そんなのがあるんですか。知らなかった。
C99 に対応する気が無いんじゃなかろうかと・・・(^^;

>で済むところを、わざわざミスを犯しやすい引数をもう一つ追加しないといけないのは不思議なのです。
確かにミスしやすくなっている仕様ですね。
単純に、仕様をきちんと把握できないプログラマを排除して、
安全なプログラムを書けるプログラマだけを残すための布石ではないでしょうか (^^;


70ポイント を落としてしまった。

Name: たかぎ [URL]  ..上級者(15,460ポイント)   Date: 2007/09/30(日) 16:09   No:10719     
Title: Re:マイクロソフトに疑問    
> C99 に対応する気が無いんじゃなかろうかと・・・(^^;

TR に出すのであれば、当然 C99 の書式は全サポートして然るべきですよね。

それに、いくら TR を出して、次期規格にこのライブラリを盛り込んでみても、コンパイラが最新規格に準拠していなければ、いつまでたっても独自拡張の域を出ることはできませんね。


67ポイント を手に入れた。

Name: Hermit  ..中級者(14,493ポイント)   Date: 2007/09/30(日) 22:05   No:10721     
Title: Re:マイクロソフトに疑問    
>TR に出すのであれば、当然 C99 の書式は全サポートして然るべきですよね。
ごめんなさい、TR が何か知らないので(最近プログラムの仕事にはタッチしてないので)


12ポイント を手に入れた。

Name: たかぎ [URL]  ..上級者(15,488ポイント)   Date: 2007/09/30(日) 22:25   No:10722     
Title: Re:マイクロソフトに疑問    
> ごめんなさい、TR が何か知らないので(最近プログラムの仕事にはタッチしてないので)

↓これのこと
http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1199.pdf


28ポイント を手に入れた。



Name: すすむ  ..ぴよぴよ(96ポイント)   Date: 2007/09/30(日) 01:22   No:10700       
Title: NULLの扱いについて教えてください    
C言語初心者で、プログラム勉強中です。
わからないことがありますので教えてください。
いろいろ試しているのですができないのです。
下記のようにNULLを引数で渡したい時は送り側は
どのようにしたらよろしいのでしょうか?。
できれば解説付きで教えてください。
#include <stdio.h>
typedef struct susumu {
int test1;
int test2;
int test3;
} SUSUMU;
void test1(SUSUMU test);

int main()
{
SUSUMU test;

test.test1 = 1;
test.test2 = 2;
test.test3 = 3;

test1(NULL);
return 0;
}
void test1(SUSUMU test1)
{
if(&test1 = NULL){
 printf("%d",12345);
}
}


96ポイント を手に入れた。


Name: YuO  ..中級者(12,270ポイント)   Date: 2007/09/30(日) 01:48   No:10701     
Title: Re:NULLの扱いについて教えてください    
NULLはポインタですから,
---- 引用開始 ----
void test1(SUSUMU test);
---- 引用終了 ----
を,
void test1 (SUSUMU * test);
として,
---- 引用開始 ----
void test1(SUSUMU test1) 

{
if(&test1 = NULL){
 printf("%d",12345);
}
}
---- 引用終了 ----
は,
void test1 (SUSUMU * test)

{
if (test == NULL) { /* Cの比較演算子は=ではなく==です */
printf("%d", 12345);
}
}
のようにします。


133ポイント を手に入れた。

Name: すすむ  ..ぴよぴよ(6ポイント)   Date: 2007/09/30(日) 01:54   No:10702     
Title: Re:NULLの扱いについて教えてください    
ご回答ありがとうございます。
私の質問が足りませんでした。
test1(NULL);の関数は変えないで
呼び側を変えてNULLを渡したいのです。
そんなことできますか?。

何度もすいませんが、ご教授お願い致します。


90ポイント を落としてしまった。

Name: YuO  ..中級者(12,624ポイント)   Date: 2007/09/30(日) 03:11   No:10704     
Title: Re:NULLの扱いについて教えてください    
・構造体を変化させず,非ポインタ型の引数のままにしたいのであれば,NULLを渡す事をあきらめる
・構造体を変化させず,NULLを渡したいのであれば,引数をポインタ型にする
この2択です。
空ポインタ定数とはどういうものか,ちゃんと考えてみて下さい。

# Null-Object patternという方法もあるものの,CでやるとSUSUMUを利用する箇所全体に影響を及ぼしそうなので……。


178ポイント を手に入れた。

Name: YuO  ..中級者(12,653ポイント)   Date: 2007/09/30(日) 03:25   No:10705     
Title: Re:NULLの扱いについて教えてください    
ぐはっ……最悪……。
「初心者のためのポイント学習C言語」さんの掲示板2#8022とのマルチポストか……。


29ポイント を手に入れた。

Name: \n  ..ぴよぴよ(40ポイント)   Date: 2007/09/30(日) 10:50   No:10709     
Title: Re:NULLの扱いについて教えてください    
http://hpcgi1.nifty.com/MADIA/Vcbbs/wwwlng.cgi?print+200709/07090061.txt
http://www3.realint.com/cgi-bin/tarticles.cgi?pointc2+8022
http://www.shunzei.com/cgibin/lounge/kirifuda/wforum.cgi?mode=allread&no=433&page=0


40ポイント を手に入れた。



Name: 夏天 [URL]  ..初心者(6,071ポイント)   Date: 2007/09/26(水) 20:27   No:10662       
Title: 効率化・処理速度について    
自分が今つくってるプログラムは
動作が重くカクカクしています。

プログラムの効率化などを図って
処理速度を早くしようとしています。

そこでどのようなプログラムが効率的なのか
教えてください。


97ポイント を手に入れた。


Name: box  ..比類無きプログラマー(86,846ポイント)   Date: 2007/09/26(水) 20:55   No:10663     
Title: Re:効率化・処理速度について    
> 動作が重くカクカクしています。

差し支えなければ、どういった種類のプログラムですか?

> そこでどのようなプログラムが効率的なのか
> 教えてください。

「効率が高い」の定義は2つあるとおもいます。
一つは、書かれているように処理速度を上げること、
もう一つは、メモリの使用量を減らすことです。

いずれにしても、データ構造とアルゴリズムに関する
いくらかの知識が必要です。


97ポイント を手に入れた。

Name: たかぎ [URL]  ..中級者(14,025ポイント)   Date: 2007/09/26(水) 22:54   No:10665     
Title: Re:効率化・処理速度について    
処理系も実際のコードも不明なので、あくまでも一般論として...

プロファイラを用いてボトルネックになっている部分を見つけ出し、その部分を最適化します。
最適化にあたっては、

1. アルゴリズムの改善
2. データ構造の改善
3. 不要な処理の削減
4. 静的に処理できるものは静的に行う
5. コンパイル結果を調べながら、より高速なコードが生成されるように修正

などを行うことになります。


188ポイント を手に入れた。

Name: 夏天 [URL]  ..初心者(6,108ポイント)   Date: 2007/09/28(金) 13:52   No:10681 解決!     
Title: Re:効率化・処理速度について    
データ構造とルゴリズム・・・面妖な・・・
頑張ってみます

ありがとうございました。


37ポイント を手に入れた。

Name: たかぎ [URL]  ..中級者(14,217ポイント)   Date: 2007/09/28(金) 14:17   No:10682     
Title: Re:効率化・処理速度について    
> 頑張ってみます

それでいいんですか?
コードの最適化はかなり難しい部類に入ります。
もっと具体的な情報を出していただければ、即効性のある回答が得られるのではないでしょうか?



69ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(417,071ポイント)   Date: 2007/09/28(金) 17:06   No:10683     
Title: Re:効率化・処理速度について    
もう少しご質問を具体的にしていただければ皆様ももっと具体的に回答してくださると思いますが、もう解決されたのでしょうか?

以前何度かDXライブラリのご質問をなさっていることと、動作がカクカクするという内容を受けて、DXライブラリでのプログラムだという可能性も考えて回答します。

2をかけたり、4をかけたりする掛け算はビットシフトの方が早いなど、一般的に色々早くする方法はあると思いますが、DXライブラリに限っては、重くなる関数を避けるという方法があります。

例えばフォントを変更する関数などは、毎回処理ごとによんでいたのでは、FPSが下がります。
この辺にそれが書いてあります。
http://dixq.net/g/#55

また、描画先に指定されている画面をキャプチャするGetDrawScreenGraph関数も処理に時間がかかるので、
毎回使用するわけにいきません。
http://homepage2.nifty.com/natupaji/DxLib/dxfunc.html#R3N12

処理に時間がかかる関数はリファレンスページに注意書きとして書かれているものもありますが、書かれていないものもあります。
また、一つの小規模な処理では重くならないものも、大きな範囲で使用すると知らないうちに処理が重くなってしまうものもあります。
例えばαブレンドがいい例だと思います。
私はいつも自分のPCでしか実行した事が無いので、気づかなかったのですが、例えばSPボムマンを作ったとき、
http://www.youtube.com/watch?v=CUkQ4RBEvnE&eurl=http%3A%2F%2Fl%2Ehuu%2Ecc%2Fsakuhin%2Ehtml
最初、暗い画面から段々明るくなって行くシーンを作ったとき、これは1024x768の範囲すべてにαブレンドしているんですが、
こうすると少し古いPCで実行するとここだけすごく重くなりFPSがガクッと下がりました。
なので次からは画面全てにαブレンドするようなエフェクトはさけ、違うエフェクトで代用するようにしました。

また、DrawGraph関数などで書いた画像は、「画面外」でも全て計算されているのだと思います。
つまり見えない部分に間違っていくつも表示させるようなプログラムを書いてしまうと、
目には見えないのに重くなるという事が発生します。
RPGのスクロールがいい例で、現在いる場所のみ書くようなプログラムではなく、画面に表示されない場所まで全て表示するようなプログラムを書くと非常にFPSが遅くなります。

どのような事をお答えすればいいか分からなかったので、こんな事しか言えませんが、参考にしていただければ幸いです。


343ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(417,204ポイント)   Date: 2007/09/28(金) 17:25   No:10684     
Title: Re:効率化・処理速度について    
後、言語による処理の早さもあるのではないでしょうか。
具体的にどれ位違うのかはわかりませんが、自分の頭の中では勝手に

速い←        →遅い
C言語 C++ Delphi C# VB JAVA Perl PHP Script系

 
こんな感じを想像しています。(順番は勝手な想像です)
JAVAで書かれたコードをわざわざ処理速度を上げる為にCに書き換えたという話をどこかで聞きました。


133ポイント を手に入れた。

Name: 夏天 [URL]  ..初心者(6,113ポイント)   Date: 2007/09/28(金) 18:17   No:10686     
Title: Re:効率化・処理速度について    
皆さんは処理速度を上げるためにどのような工夫をしてるんですか〜?
みたいなノリだったのですよ・・・^^;

自分のプログラムはフォントデータを作っては消してを繰り返していた模様で
そこを消したら早くなりましたww


5ポイント を手に入れた。

Name: tkmakwins15 [URL]  ..プログラマー(25,930ポイント)   Date: 2007/09/28(金) 20:23   No:10688     
Title: Re:効率化・処理速度について    
コンパイラの最適化を掛けてみるというのも一つの手ではないでしょうか。

2倍のポイントを手に入れた! 44ポイント を手に入れた。



Name: 大工  ..上級者(20,977ポイント)   Date: 2007/09/26(水) 22:26   No:10664       
Title: fprintfについて    

#include <stdio.h>

int main (void) {

int i, status, value, value2;

for(i = 0; i < 10; i++) {
fprintf(stderr, "値1 >>> "); //エラー出力
status = scanf(" %d", &value); //値1に入力する.
if(EOF == status) break;

fprintf(stderr, "値2 >>> "); //エラー出力
status = scanf(" %d", &value2);//値2に入力する.
if(EOF == status) break;


fprintf(stderr, "和・差・積\n");
printf("%2d %2d %2d", value + value2, value - value2, value * value2); //和.差.積.
}

return 0;
}


printf("%2d %2d %2d", value + value2, value - value2, value * value2);においてCygwin上で表示すると
値1 >>> 3
値2 >>> 4
和・差・積
値1 >>> 7 -1 12

となり

printf("%2d %2d %2d\n", value + value2, value - value2, value * value2);だと
値1 >>> 3
値2 >>> 4
和・差・積
7 -1 12
値1 >>>
となります。こちらが求めているほうです。

気になるのは前者のほうで、なぜfor文のアタマの値1 >>>が先に出力されでから7 -1 12となるのでしょうか?


400ポイント を手に入れた。


Name: box  ..比類無きプログラマー(87,032ポイント)   Date: 2007/09/26(水) 22:54   No:10666     
Title: Re:fprintfについて    
標準出力と標準エラー出力での、
バッファにたまった内容を吐き出すタイミングの
違いではないかと思います。

お使いの処理系では、標準出力は'\n'が来るまで
バッファにたまったままで、
その間に標準エラー出力への出力が来ると、
バッファにたまっている内容を後回しにする、
という動きをしているように思えます。

別の処理系では別の動きをするかもしれません。
別の処理系が使える環境にあれば、そちらでも
同じプログラムを動かして、結果を比べてみては
いかがでしょう。


186ポイント を手に入れた。

Name: 大工  ..上級者(21,001ポイント)   Date: 2007/09/26(水) 23:05   No:10668     
Title: Re:fprintfについて    
わかりました!

ありがとうございます。


24ポイント を手に入れた。

Name: Hermit  ..中級者(14,178ポイント)   Date: 2007/09/27(木) 19:46   No:10673     
Title: Re:fprintfについて    
とりあえず、fflush(stdout) を、printf() の後に入れておくのもひとつの手です。

41ポイント を手に入れた。

Name: たかぎ [URL]  ..中級者(14,055ポイント)   Date: 2007/09/27(木) 21:08   No:10677     
Title: Re:fprintfについて    
あるいは、stdoutに対して、setvbufで_IONBFを設定しておくとか。


30ポイント を手に入れた。



Name: けるびん  ..かけだし(2,465ポイント)   Date: 2007/09/21(金) 01:28   No:10562       
Title: DirectX    
最新版にしたんですが、対応するドライバもそのDirectXに対応してないと
相互関係がだめとかで。
今、僕はゲームをしたいんですが
DirectXとかがよく分からないのでできないんです。
どのようにしたら、そのドライバをダウンロードできるのでしょうか?
できれば、なぜDirectXだけでは動作がうまくいかないのかということも御願いします。


107ポイント を手に入れた。


Name: 管理人 [URL]  ..伝説のハッカー(410,499ポイント)   Date: 2007/09/21(金) 02:30   No:10563     
Title: Re:DirectX    
お使いのパソコンのグラフィックカードは何でしょうか?


28ポイント を手に入れた。

Name: けるびん  ..かけだし(2,490ポイント)   Date: 2007/09/21(金) 22:34   No:10585     
Title: Re:DirectX    
Intel(R)82852/82855 GM/GME Graphics Controller

です。


25ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(410,539ポイント)   Date: 2007/09/21(金) 22:41   No:10586     
Title: Re:DirectX    
ドライバの更新をしてもダメなんですね?
この辺参考にならないでしょうか。

http://www.intel.co.jp/jp/support/graphics/intel852gm/directx.htm


40ポイント を手に入れた。

Name: Justy  ..ハッカー(164,314ポイント)   Date: 2007/09/21(金) 22:55   No:10587     
Title: Re:DirectX    
 オンボードのインテル製のグラフィックスコントローラは性能が低いですからねぇ。
 どんなゲームをやりたいのか判りませんが、最近の3Dゲームとかは
無理なんじゃないでしょうか。

 あ、一応ハードウェアアクセラレータの設定とかも確認してみて下さい。


128ポイント を手に入れた。

Name: けるびん  ..入門者(2,558ポイント)   Date: 2007/09/23(日) 22:21   No:10617     
Title: Re:DirectX    
>オンボードのインテル製のグラフィックスコントローラは性能が低いですからねぇ。

なんか難しい話になってきましたね。
この際、グラフィックカード買ってみるっていうのも手ですかね。
少々高いですが。


68ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(414,119ポイント)   Date: 2007/09/24(月) 04:05   No:10624     
Title: Re:DirectX    
オンボードグラフィックのマザーボードはグラフィックカードがさせるかどうかわかりません。
お使いのマザーボードにグラフィックカードがさせるか確認して、購入してくださいね。
まぁパーツをご自分で購入される位ですから、ご存知かとは思いますが。
もしマザーボードが対応していなければ、対応したマザーボードをconeconetなどを利用して新品を取り寄せると安く手に入りますよ。
また、どれ位の3Dゲームをされるのかわかりませんが、よほどの最新3Dゲームをしない限り最近のVGAは必要有りません。
2Dゲームなら一番最低のVGAでも十分です。ご参考までに。


148ポイント を手に入れた。

Name: けるびん  ..入門者(2,715ポイント)   Date: 2007/09/26(水) 23:04   No:10667 解決!     
Title: Re:DirectX    
変身遅れてすみません

>オンボードグラフィックのマザーボードはグラフィックカードがさせるかどうかわかりません。
お使いのマザーボードにグラフィックカードがさせるか確認して、購入してくださいね。

調べたところ、どうやら挿せるようです

>よほどの最新3Dゲームをしない限り最近のVGAは必要有りません。
2Dゲームなら一番最低のVGAでも十分です。

そこまで本格的にするわけでもないので、何もしなくていいみたいですね。

雑談に付き合わせてしまってすみませんでした
僕としてはいい勉強になりました。

ありがとうございました


157ポイント を手に入れた。



Name: Chii☆  ..入門者(4,350ポイント)   Date: 2007/09/26(水) 11:30   No:10660       
Title: デバッグの混合モード    
いつもお世話になっております。
Chii☆と申します!!


VC++6.0のデバッグについての質問なのですが、

ブレイクポイントを付けて、値を見たいのですが混合モードになってしまいます。
ブレイクポイントを付けていなくても混合モードになってしまいます・・

ソースでデバッグしたいのですが、どのようにすれば混合モードではなくて
ソースでデバッグ出来るのでしょうか??

申し訳ありませんが、どなたかご教授下さい!!

お願い致します!!


185ポイント を手に入れた。


Name: たかぎ [URL]  ..中級者(13,837ポイント)   Date: 2007/09/26(水) 15:30   No:10661     
Title: Re:デバッグの混合モード    
どんなコードを書いているのか分かりませんが、
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200701/07010033.txt
あたりが参考になりませんか?


54ポイント を手に入れた。



Name: garuma  ..ぴよぴよ(147ポイント)   Date: 2007/09/25(火) 09:50   No:10652       
Title: TransparentBltについて    
当方、visual studio.NET2003を使っているものですが、
"デバッグなしで実行"と"開始"の違いもわからない超初心者なので、
超初心者でもわかるように教えてもらいたいです、お願いします。
プラットフォームSDKの(たぶん?)
TransparentBlt(HDC,int,int,int,int,HDC,int,int,int,int,UINT);
を使うためには、msimg32.dllに実装されているらしいのですが、
開発環境の設定によってはmsimg32.libをリンカにインポートする必要があるらしいのですが、
設定の仕方がわかりません。
ちなみにエラーでTransparentBltの位置が不明と出ます。
設定の仕方を詳細に教えてほしいです。


147ポイント を手に入れた。


Name: keichan  ..プログラマー(27,371ポイント)   Date: 2007/09/25(火) 13:24   No:10655     
Title: Re:TransparentBltについて    
えーっと、使用言語は何をお使いなんでしょうか?
(リンカにインポートと仰っているのでおそらくVC++だと思って回答します)

プロジェクト → プロパティ → 構成プロパティ → リンカ → 入力 → 追加の依存ファイル
に手打ちで msimg32.dll と入力。

または TransparentBlt を使用しているソースファイルの先頭らへんに
#pragma comment(lib, "msimg32.dll")
を追加する。

以上2案のどちらかで解決すると思います。


137ポイント を手に入れた。

Name: garuma  ..ぴよぴよ(283ポイント)   Date: 2007/09/26(水) 08:45   No:10658     
Title: Re:TransparentBltについて    
親切に教えてくださり、大変有り難う御座います。
早速、家に帰ったら試してみます。それに関連してもう一つ
大変恐縮なんですが、
msimg32.libを追加する方のやり方はないんでしょうか?
勉強してる本に"開発環境の設定によってはmsimg32.libをリンカにインポートする必要がある"とあったもので、教えてくだされば幸いです。