C言語何でも質問掲示板


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

規約と使い方

 
   アクションのジャンプ ....   
     ・[9574] tai 
     ・[9590] 零 
   実行ファイルにするに ....   
     ・[9566] Hermit 
     ・[9567] sdsd 
     ・[9570] tkmakwins15 
   C++でRPG * 戦闘   
     ・[9548] Justy 
     ・[9550] tkmakwins15 
     ・[9551] YuO 
     ・[9552] たかぎ 
     ・[9555] YuO 
     ・[9559] たかぎ 
     ・[9564] tkmakwins15 
   敵キャラの表示2   
     ・[9432] ぷ〜 
     ・[9441] 湘南七夕 
     ・[9513] ぷ〜 
     ・[9561] 湘南七夕 
   無題   
     ・[9558] ナガレ 
   修正はさみうち法につ ....   
   ポインタのポインタに ....   
     ・[9539] box 
     ・[9540] けるびん 
     ・[9544] けるびん 
     ・[9545] tkmakwins15 
     ・[9547] けるびん 
   フローチャート   
     ・[9535] 組木紙織 
     ・[9536] ロキ 
   確率の問題   
     ・[9532] box 
     ・[9533] たかぎ 
   確率分布について   
     ・[9529] box 
     ・[9531] yasu 
   非線形方程式に対して ....   
     ・[9527] まーくん 
   最小二乗法のプログラ ....   
     ・[9525] Jastin 
   #include "DxLib.h"   
     ・[9523] YuO 
   非線形方程式について   
   DirectXについて   
     ・[9482] Justy 
     ・[9496] やっかい者 
     ・[9509] Justy 
     ・[9520] やっかい者 
   テイラー展開のこの問 ....   
     ・[9515] Hermit 
     ・[9519] asd 
   DxLib.slnがVC++6.0で ....   
     ・[9486] Justy 
     ・[9498] クアー 
     ・[9499] クアー 
     ・[9502] Justy 
     ・[9506] クアー 
     ・[9507] バグ 
     ・[9511] Justy 
     ・[9518] クアー 
   このプログラムとフロ ....   
   万年カレンダー   
     ・[9443] box 
     ・[9445] 雪中 蓮 
     ・[9448] box 
     ・[9449] tkmakwins15 
     ・[9450] 雪中 蓮 
     ・[9451] たかぎ 
     ・[9452] box 
     ・[9453] 雪中 蓮 
     ・[9454] box 
     ・[9455] 雪中 蓮 
     ・[9456] box 
     ・[9457] 雪中 蓮 
     ・[9458] 雪中 蓮 
     ・[9479] 雪中 蓮 
     ・[9490] box 
     ・[9505] 雪中 蓮 
   ファイル操作について   
     ・[9495] バグ 
     ・[9497] keichan 
     ・[9500] hana 
     ・[9501] hana 
   自動ファイル作成   
     ・[9483] たかぎ 
   ステレオ法について   
   ハフマン符号化の簡単 ....   
     ・[9478] kaoru 
   演算子   
     ・[9464] YuO 
     ・[9465] 管理人 
     ・[9476] ☆ 
     ・[9477] ☆ 
   配列でのキューを用い ....   
     ・[9467] tela 
     ・[9468] box 
     ・[9469] box 
     ・[9470] tela 
     ・[9471] tela 
     ・[9473] box 
     ・[9474] tela 
   画像の表示   
     ・[9462] pom 
   C++のクラスについて   
     ・[9433] tkmakwins15 
     ・[9460] Chii☆ 
   二次元配列に代入でき ....   
     ・[9412] Bose 
     ・[9414] box 
     ・[9418] Bose 
     ・[9420] Bose 
     ・[9435] box 
     ・[9459] Boze 
   クイックソートと2分 ....   
     ・[9436] box 
     ・[9438] マサキ 
     ・[9439] box 
     ・[9446] マサキ 
     ・[9447] マサキ 
   括弧使用の四則演算プ ....   
     ・[9419] 初心者A 
     ・[9434] tkmakwins15 
     ・[9440] 管理人 
     ・[9444] たかぎ 
   円を書くプログラム   
     ・[9427] Justy 
     ・[9437] けるびん 
   ポインタ変数への乱数 ....   
     ・[9429] box 
     ・[9430] テオリア 
   敵キャラの表示   
     ・[9425] Justy 
   無題   
     ・[9421] Justy 
   おつり問題。   
     ・[9416] YuO 
   出力フォーマットにつ ....   
     ・[9401] 管理人 
     ・[9402] 管理人 
     ・[9406] Justy 
     ・[9410] tkmakwins15 
     ・[9413] Justy 
   参照について(C++)   
     ・[9291] Justy 
     ・[9292] tkmakwins15 
     ・[9293] Justy 
     ・[9297] tkmakwins15 
     ・[9298] Justy 
     ・[9299] 組木紙織 
     ・[9301] tkmakwins15 
     ・[9302] バグ 
     ・[9303] tkmakwins15 
     ・[9304] Justy 
     ・[9305] tkmakwins15 
     ・[9306] 組木紙織 
     ・[9308] GPGA 
     ・[9309] Justy 
     ・[9310] 組木紙織 
     ・[9312] tkmakwins15 
     ・[9313] Justy 
     ・[9315] tkmakwins15 
     ・[9324] Justy 
     ・[9325] tkmakwins15 
     ・[9327] Justy 
     ・[9329] YuO 
     ・[9332] tkmakwins15 
     ・[9333] YuO 
     ・[9335] tkmakwins15 
     ・[9336] YuO 
     ・[9338] tkmakwins15 
     ・[9339] 組木紙織 
     ・[9343] tkmakwins15 
     ・[9348] YuO 
     ・[9352] tkmakwins15 
     ・[9358] Justy 
     ・[9362] tkmakwins15 
     ・[9366] Justy 
     ・[9381] tkmakwins15 
     ・[9392] 組木紙織 
     ・[9398] tkmakwins15 
     ・[9405] YuO 
     ・[9408] 組木紙織 
     ・[9409] tkmakwins15 
   ファイルの比較   
   ゲームプログラミング   
     ・[9380] Justy 
     ・[9384] たのもー 
     ・[9387] Justy 
     ・[9395] たのもー 
     ・[9399] Justy 
     ・[9400] たのもー 
   ・デスクトップやWind ....   
     ・[9346] 管理人 
     ・[9396] けるびん 
   乗換検索をつくる   
   引数として2次元配列を ....   
     ・[9319] box 
     ・[9337] bose 
     ・[9350] YuO 
     ・[9354] Hermit 
     ・[9393] Boze 
   文字の描画   
     ・[9383] Justy 
     ・[9391] Lbfuvab 
   ダブルポインタがうま ....   
     ・[9388] フリオ 
     ・[9389] nao 
     ・[9390] フリオ 
   線形リストのソート   
     ・[9250] box 
     ・[9255] マルクス 
     ・[9258] box 
     ・[9326] マルクス 
     ・[9331] box 
     ・[9385] マルクス 
   CygWinで.......   
   符号化のことで   
     ・[9373] バグ 
     ・[9374] 空 
     ・[9375] バグ 
     ・[9376] 空 
     ・[9377] バグ 
     ・[9378] 空 
   extern static を使っ ....   
     ・[9328] TT414 
     ・[9344] Hermit 
     ・[9371] asd 
   宿題です(汗)   
     ・[9345] Hermit 
     ・[9347] 羽流布 
     ・[9349] Hermit 
     ・[9351] 羽流布 
     ・[9353] Hermit 
     ・[9356] 羽流布 
     ・[9357] Hermit 
     ・[9359] 初心者A 
     ・[9360] 羽流布 
     ・[9361] 羽流布 
     ・[9363] フリオ 
     ・[9364] フリオ 
     ・[9365] 羽流布 
     ・[9368] 初心者A 
     ・[9369] フリオ 
     ・[9370] 羽流布 

Name:  ..ぴよぴよ(117ポイント)   Date: 2007/07/28(土) 17:46   No:9569       
Title: アクションのジャンプのソースについて・・・    
C++でアクションゲームを作りたいのですが、
ジャンプの制御がうまくいかなくて困っています。
こちらのホームページの講座を見たのですが
ちょっと小難しくて完全に理解ということが出来ません・・・・
簡易的なジャンプの式は無いのでしょうか?
頭悪い質問ですみません==;


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


Name: tai  ..ぴよぴよ(196ポイント)   Date: 2007/07/28(土) 23:00   No:9574     
Title: Re:アクションのジャンプのソースについて・・・    
http://www.play21.jp/board/formz.cgi?action=res&resno=9573&page=&id=dixq&rln=9573
たった今質問投稿したやつですが、自由な軌道でジャンプするアクションゲームですよ。
ソースコードを追うと参考になるかもしれません。すぐ入手できますし。
シェアウェア手前の、あまりお手軽ではない代物ですけど。

コーダーではないのでこんな厨なレスでごめんなさい。


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

Name:  ..ぴよぴよ(161ポイント)   Date: 2007/07/29(日) 01:58   No:9590 解決!     
Title: Re:アクションのジャンプのソースについて・・・    
えー返信ありがとうございます。
いろいろと試行錯誤した結果くだらないミスで出来なかったようです。
まことに申し訳ない・・・・・
今後は一日ぐらい悩んでから質問することにします・・・・orz
5時間悩んだぐらいじゃ少なかったようですm(_ _)m


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



Name: sdsd  ..ぴよぴよ(7ポイント)   Date: 2007/07/28(土) 12:33   No:9565       
Title: 実行ファイルにするには?    
c言語の質問です。初心者です。
無料のBorland C++ Compiler をダウンロードして、環境変数を設定して、
コマンドプロンプトでソースファイルを、コンパイルをして、exeファイルを作ったのですが
フォルダで、そのexeファイルのアイコンをクリックすると、コマンドプロンプトの画面が出て、すぐ消えてしまいます。ずっと表示をするにはどうしたらいいですか?windowsから実行したいです。




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


Name: Hermit  ..中級者(12,335ポイント)   Date: 2007/07/28(土) 13:07   No:9566     
Title: Re:実行ファイルにするには?    
コマンドプロンプトが出てくるということは、
コンソールアプリケーションとしてコンパイルしている物と思われますので、
ウインドーズアプリケーションを作りましょう。

入門の有名どころでは、
http://www.kumei.ne.jp/c_lang/
でしょう。



Windows で、と書いてあるので、以下は役不足ではあると思いますが、
コマンドプロンプトでの表示でもいいなら、
#include <stdio.h>

/* いろいろ */
int main(int argc, char *argv[])
{
/* 処理、など */
getchar();
return 0;
}

などとして、getchar() などのキーボード入力待ちの関数を入れておくと、
Enter を入れるまでは消えないでいてくれます。


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

Name: sdsd  ..ぴよぴよ(31ポイント)   Date: 2007/07/28(土) 14:20   No:9567     
Title: Re:実行ファイルにするには?    
返信ありがとうございます。解決しました。

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

Name: tkmakwins15 [URL]  ..初心者(8,589ポイント)   Date: 2007/07/28(土) 18:54   No:9570     
Title: Re:実行ファイルにするには?    
scanf()使用時は2回getchar()を使うの無難です。(バッファクリアのため)


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



Name:  ..ぴよぴよ(0ポイント)   Date: 2007/07/26(木) 20:12   No:9537       
Title: C++でRPG * 戦闘    
初めて書き込ませて頂きます。
Microsoft Visual C++ 6.0でドラクエ風のRPGを作っているのですが、いまいち戦闘に関するプログラミングが分りません;
かなりの初心者なのですが、どなたか分かりやすい簡単なソースを教えて頂けないでしょうか(><)



Name: Justy  ..ハッカー(139,834ポイント)   Date: 2007/07/27(金) 01:51   No:9548     
Title: Re:C++でRPG * 戦闘    
 RPGの戦闘といっても仕様次第なところもありますし、
幅広いのでなかなか難しいのですが。

 紹介できるところとしては(どこまで役に立つかはわかりませんが)

http://www.amazon.co.jp/dp/4797339616/
 を買ってみるとか、

ゲーム制作研究室
http://www.sm.rim.or.jp/~shishido/gamedev.html
 のRPG制作記を読む、とか

ゲムデヴあぷろだ
http://gamdev.org/up/
http://gamdev2.hp.infoseek.co.jp/cgi-bin/up/upup.html
http://gamdev3.hp.infoseek.co.jp/cgi-bin/up/upup.html

 に時々作りかけのRPGがアップされていたりするので根気よく探すとか。


 あとはこちらの過去ログのスレで管理人さん作の
http://www.play21.jp/board/nextz.cgi?id=dixq&lognum=23&dispnum=6287

 があります。


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

Name: tkmakwins15 [URL]  ..初心者(7,790ポイント)   Date: 2007/07/27(金) 02:14   No:9550     
Title: Re:C++でRPG * 戦闘    
ドラクエ風…

こんな感じでいいのでしょうか。ソースじゃないのですが。

1 魔法などを選択させる。
2 その選択肢に応じたデモを流す。
3 ダメージ計算。
4 結果表示

といった感じで処理すれば大丈夫でしょう。実装法は環境などにも影響しますので
ちょっと書くのは僕には無理です。


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

Name: YuO  ..中級者(9,611ポイント)   Date: 2007/07/27(金) 03:46   No:9551     
Title: Re:C++でRPG * 戦闘    
ドラクエ風ということなら,
1/256の世界 : http://www.asahi-net.or.jp/~hp8n-nkmr/index.html
の,
特技ダメージ計算式一覧 : http://www.asahi-net.or.jp/~hp8n-nkmr/damage.html
をダメージ式に使うと,ダメージがそれっぽくなるかと思います。
最低でもPS以降,DQ4(PS)/5(PS2)/7/8はこの式に従っています。


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

Name: たかぎ [URL]  ..ぴよぴよ(912ポイント)   Date: 2007/07/27(金) 11:29   No:9552     
Title: Re:C++でRPG * 戦闘    
戦闘だけに関していえば、コンピュータゲームではない本来のロールプレイングゲーム、あるいはミニチュアゲームを参考にするのもよいでしょう。
これらは、基本的にユーザーが手作業で処理することを前提にしているので、そのルールブックを読めば、プログラムで実装すべき内容が把握できます。ただし、グラフィックやサウンドに関する知見は得られませんので、それらは別に学ばなければなりません。

コンピュータを使えば、手作業では煩雑すぎるシステムも実現できます。公開当初、煩雑すぎると指摘された元祖?「DragonQuest」のようなものでも、(ユーザーにとって)簡単にプレイできるようになるはずです(ゲームマスターの裁量にゆだねられるようなものは不可能、または困難ですが)。

ゲームを作るのに、プログラミングの技術論に走ってしまうと、完成したとしてもつまらないものになってしまいます。
まずは、ゲームとしての骨格をしっかり作ることが重要です。


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

Name: YuO  ..中級者(9,649ポイント)   Date: 2007/07/27(金) 16:41   No:9555     
Title: Re:C++でRPG * 戦闘    
ピンポイントに反応。

> ゲームマスターの裁量にゆだねられるようなものは不可能、または困難ですが

これがコンピュータにできたら,チューリングテストをパスする人工知能に近いかもしれませんね。


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

Name: たかぎ [URL]  ..かけだし(1,021ポイント)   Date: 2007/07/27(金) 19:25   No:9559     
Title: Re:C++でRPG * 戦闘    
> これがコンピュータにできたら,チューリングテストをパスする人工知能に近いかもしれませんね。

いや、もっと要求レベルは高いと思いますよ。
チューリングテストは尋ねられたことに対する受け答えだけですが、ゲームマスターはもっと能動的にその場を「仕切る」必要がありますから。
例えば、汎用的なルールでは網羅できないような、狭い屋内で揉み合いになるような状況を解決したり、もっといえば心理戦を解決したりするのは、単純な受け答えが出来たぐらいではどうにもなりませんね。


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

Name: tkmakwins15 [URL]  ..初心者(8,555ポイント)   Date: 2007/07/28(土) 09:10   No:9564     
Title: Re:C++でRPG * 戦闘    
>ゲームマスターはもっと能動的にその場を「仕切る」必要がありますから。
>例えば、汎用的なルールでは網羅できないような、狭い屋内で揉み合いになるような状況を解決したり、もっといえば心理戦を解決したりする
>のは、単純な受け答えが出来たぐらいではどうにもなりませんね。


その点ではコンピューターは人に勝てないと思います。ただ、そのレベルのプログラムを組む事ができる
プログラマーがいるとしたら話は別ですが、しかし、そのプログラムを組むには、心理学者も必要そうで
すね。ただ、コンピューターというのは同じ「条件」に対しては、常に同じ「答え」を返しますから、人
のように柔軟性があるわけではないですので、その場の流れに対応できるか というと、難しいと思いま
すが。

>チューリングテストをパスする人工知能に近いかもしれませんね。


例えば、同じ話を何度もしてくるような人間相手だと、苦戦しそうですね。チューリングテストについて
は、書籍で読んだ事があるのですが、実は現在の状況でもパスする事は絶対不可能じゃないようです。た
だし、その内容というのは、とても知能といえる内容ではないようです。


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



Name: 湘南七夕  ..かけだし(1,407ポイント)   Date: 2007/07/19(木) 01:14   No:9424       
Title: 敵キャラの表示2    
すみません。ソースを表示するのがうまくいきませんでした。
#include "DxLib.h"
#include <math.h>


#define PI 3.141593

struct data{
double x;
double y;
double size;
int flag;
int counter;
int hp;
int pattern;
};

struct data enemy[100];


void EnemyCalcDisp();
void EnemyPattern1(int i);
void EnemyPattern2(int i);
void EnemyPattern3(int i);
void EnemyPattern4(int i);

void EnemyControl();

/* グローバル宣言 */
int counter=0;
char Key[256];
int img_enemy1[5];

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{

int RefreshTime=0;

// ウインドウモードに変更
ChangeWindowMode( TRUE ) ;

if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}

SetDrawScreen( DX_SCREEN_BACK ) ;

// BMP画像のメモリへの読みこみ

img_enemy1[0] = LoadGraph("Sh/img/mons/mons1_0.png");
img_enemy1[1] = LoadGraph("Sh/img/mons/mons1_1.png");
img_enemy1[2] = LoadGraph("Sh/img/mons/mons1_2.png");
img_enemy1[3] = LoadGraph("Sh/img/mons/mons1_3.png");
img_enemy1[4] = LoadGraph("Sh/img/mons/mons1_4.png");

for(int i=0;i<100;i++)
enemy[i].flag=0;

while(ProcessMessage() == 0 && GetHitKeyStateAll(Key) == 0)
{
RefreshTime = GetNowCount();
ClearDrawScreen(); //裏画面のデータを全て削除
EnemyControl();
EnemyCalcDisp();
ScreenFlip();
counter++;
if(Key[KEY_INPUT_ESCAPE]==1) break; //Escapeが押されたら終了
while(GetNowCount() - RefreshTime < 17);//1周の処理が17ミリ秒になるまで待つ
}
DxLib_End() ; // DXライブラリ使用の終了処理

return 0 ; // ソフトの終了
}

void EnemyCalcDisp(){
int i;
for(i=0;i<100;i++)
if(enemy[i].flag==0)
break;
switch(counter){
case 50:
enemy[i].pattern=1; //どういう軌道を描くか
enemy[i].flag=1; //出現フラグを立てる
enemy[i].counter=0;//出現して何カウント目か測るカウンター初期化
enemy[i].size=0.5f;//敵の大きさ
enemy[i].x=100.0; //xの初期座標
enemy[i].y=-10.0; //yの初期座標
break;
case 200:
enemy[i].pattern=2;
enemy[i].flag=1;
enemy[i].counter=0;
enemy[i].size=0.5f;
enemy[i].x=100.0;
enemy[i].y=-10.0;
break;
case 350:
enemy[i].pattern=3;
enemy[i].flag=1;
enemy[i].counter=0;
enemy[i].size=0.5f;
enemy[i].x=100.0;
enemy[i].y=-10.0;
break;
case 500:
enemy[i].pattern=4;
enemy[i].flag=1;
enemy[i].counter=0;
enemy[i].size=0.5f;
enemy[i].x=100.0;
enemy[i].y=-10.0;
break;

default:
break;
}

int enemy_img[8]={0,1,2,3,4,3,2,1};

for(i=0;i<100;i++)
if(enemy[i].flag==1)
DrawRotaGraph( (int)enemy[i].x , (int)enemy[i].y , enemy[i].size , 0.0f , img_enemy1[0] , TRUE ) ;

if(enemy[i].x<0.0-140/2.0*enemy[i].size || enemy[i].x>420.0+140/2.0*enemy[i].size ||
enemy[i].y<0.0-128/2.0*enemy[i].size || enemy[i].y<0.0-128/2.0*enemy[i].size)
enemy[i].flag=0;

}

void EnemyPattern1(int i){
enemy[i].y+=1.5;
}


void EnemyPattern2(int i){
if(enemy[i].counter<50)
enemy[i].y+=4.0f;
if(enemy[i].counter>50 && enemy[i].counter<100)
enemy[i].y+=0;
if(enemy[i].counter>100)
enemy[i].y-=4.0f;
}

void EnemyPattern3(int i){
enemy[i].x+=sin(PI*enemy[i].counter/40.0f)*5.0f;
enemy[i].y+=1.5f;
}

void EnemyPattern4(int i){
if(enemy[i].counter<100)
enemy[i].y+=2.5f;
if(enemy[i].counter>=100){
enemy[i].x+=sin(PI*(enemy[i].counter-100.0f)/160.0f)*2.5f;
enemy[i].y+=sin(PI*(enemy[i].counter-20.0f )/160.0f)*2.5f;
}
}




void EnemyControl(){
for(int i=0;i<100;i++)
if(enemy[i].flag==1)
if(enemy[i].pattern==1)
EnemyPattern1(i);
if(enemy[i].pattern==2)
EnemyPattern2(i);
if(enemy[i].pattern==3)
EnemyPattern3(i);
if(enemy[i].pattern==4)
EnemyPattern4(i);

}
パタパタと一人降りてきて、二人目は画面上部でちょっとだけ見えています。







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


Name: ぷ〜  ..ぴよぴよ(49ポイント)   Date: 2007/07/19(木) 15:12   No:9432     
Title: Re:敵キャラの表示2    
Justyさんの指摘されている通り、
for文の構文がおかしいため、
for(int i=0;i<100;i++)
if(enemy[i].flag==1)
if(enemy[i].pattern==1)
EnemyPattern1(i);

のところでforのループが終わってるような気がします。

さらにi=100となってループを抜けた後にパターン2のif文に処理が移ってませんか?

"{","}"をよく確認されてみてください。





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

Name: 湘南七夕  ..初心者(5,675ポイント)   Date: 2007/07/19(木) 21:48   No:9441     
Title: Re:敵キャラの表示2    
早速の返事ありがとうございます。自分なりに括弧を整理してみたのですが、やはりうまく動きません。プログラム自体がよく判っていないのかもしませんが、一人目がゆっくり降りてくるときに、二人目がさっと降りてきて(移動量が違うのは判ります)これで終わります。一人目が降りたら二人目が降りてきて上に上がるはずなのですがやはりEnemyControl()のところでしょうか。

#include "DxLib.h"
#include <math.h>

#define PI 3.141593

struct data{
double x;
double y;
double size;
int flag;
int counter;
int hp;
int pattern;
};

struct data enemy[100];

void EnemyCalcDisp();
void EnemyPattern1(int i);
void EnemyPattern2(int i);
void EnemyPattern3(int i);
void EnemyPattern4(int i);
void EnemyControl();

/* グローバル宣言 */
int counter=0;
char Key[256];
int img_enemy1[5];

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{

int RefreshTime=0;
// ウインドウモードに変更
ChangeWindowMode( TRUE ) ;
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}

SetDrawScreen( DX_SCREEN_BACK ) ;

img_enemy1[0] = LoadGraph("Sh/img/mons/mons1_0.png");
img_enemy1[1] = LoadGraph("Sh/img/mons/mons1_1.png");
img_enemy1[2] = LoadGraph("Sh/img/mons/mons1_2.png");
img_enemy1[3] = LoadGraph("Sh/img/mons/mons1_3.png");
img_enemy1[4] = LoadGraph("Sh/img/mons/mons1_4.png");

for(int i=0;i<100;i++)
{
enemy[i].flag=0;
}

while(ProcessMessage() == 0 && GetHitKeyStateAll(Key) == 0)
{
RefreshTime = GetNowCount();
ClearDrawScreen();
EnemyControl();
EnemyCalcDisp();
ScreenFlip();
counter++;
if(Key[KEY_INPUT_ESCAPE]==1) break; //Escapeが押されたら終了
while(GetNowCount() - RefreshTime < 17);//1周の処理が17ミリ秒になるまで待つ
}
DxLib_End() ; // DXライブラリ使用の終了処理

return 0 ; // ソフトの終了
}

void EnemyCalcDisp()
{
int i;
for(i=0;i<100;i++)
{
if(enemy[i].flag==0) break;
}
switch(counter){
case 50:
enemy[i].pattern=1; //どういう軌道を描くか
enemy[i].flag=1; //出現フラグを立てる
enemy[i].counter=0;//出現して何カウント目か測るカウンター初期化
enemy[i].size=0.5f;//敵の大きさ
enemy[i].x=100.0; //xの初期座標
enemy[i].y=-10.0; //yの初期座標
break;
case 200:
enemy[i].pattern=2;
enemy[i].flag=1;
enemy[i].counter=0;
enemy[i].size=0.5f;
enemy[i].x=100.0;
enemy[i].y=-10.0;
break;
case 350:
enemy[i].pattern=3;
enemy[i].flag=1;
enemy[i].counter=0;
enemy[i].size=0.5f;
enemy[i].x=100.0;
enemy[i].y=-10.0;
break;
case 500:
enemy[i].pattern=4;
enemy[i].flag=1;
enemy[i].counter=0;
enemy[i].size=0.5f;
enemy[i].x=100.0;
enemy[i].y=-10.0;
break;

default:
break;
}

for(i=0;i<100;i++)
{
if(enemy[i].flag==1)
{
DrawRotaGraph( (int)enemy[i].x , (int)enemy[i].y , enemy[i].size , 0.0f , img_enemy1[0] , TRUE ) ;
if(enemy[i].x<0.0-140/2.0*enemy[i].size || enemy[i].x>420.0+140/2.0*enemy[i].size ||
enemy[i].y<0.0-128/2.0*enemy[i].size || enemy[i].y<0.0-128/2.0*enemy[i].size)
enemy[i].flag=0;
}
}
}

void EnemyPattern1(int i)
{
enemy[i].y+=1.5;
}


void EnemyPattern2(int i)
{
if(enemy[i].counter<50)
enemy[i].y+=4.0f;
if(enemy[i].counter>100)
enemy[i].y-=4.0f;
}

void EnemyPattern3(int i)
{
enemy[i].x+=sin(PI*enemy[i].counter/40.0f)*5.0f;
enemy[i].y+=1.5f;
}

void EnemyPattern4(int i)
{
if(enemy[i].counter<100)
enemy[i].y+=2.5f;
if(enemy[i].counter>=100)
{
enemy[i].x+=sin(PI*(enemy[i].counter-100.0f)/160.0f)*2.5f;
enemy[i].y+=sin(PI*(enemy[i].counter-20.0f )/160.0f)*2.5f;
}
}

void EnemyControl()
{
for(int i=0;i<100;i++)
{
if(enemy[i].flag==1)
{
if(enemy[i].pattern==1)
EnemyPattern1(i);
if(enemy[i].pattern==2)
EnemyPattern2(i);
if(enemy[i].pattern==3)
EnemyPattern3(i);
if(enemy[i].pattern==4)
EnemyPattern4(i);
}
}
}








2倍のポイントを手に入れた! 4,268ポイント を手に入れた。

Name: ぷ〜  ..ぴよぴよ(349ポイント)   Date: 2007/07/24(火) 18:26   No:9513     
Title: Re:敵キャラの表示2    
ぷ〜です。

えーと、C言語素人の私が言うのも何なんですが・・・
今、引っかかっているのは「2体目の敵の軌道が思い通りにいっていない」
と言うことでよろしいでしょうか。
3体目以降はうまくいっているのかな?

それは置いといて、なぜ2体目がうまく動かないかと言うと、

enemy[i].counter の値が変わっていないからではないでしょうか?

グローバル変数のcounterと思いっきり混同しやすいですが、別ですよね?

EnemyPattern2 のところで座標をセットし終わった後に、enemy[i].counterの値を増減されてはどうでしょう?

enemy[i].counter++;
なのかな?
enemy[i].counter+=counter;
なのかな?
そうすればうまくいきそうな気がしませんか?(全く検証していない投げやりな意見ですみません^^;)

また、
DrawRotaGraph( (int)enemy[i].x , (int)enemy[i].y , enemy[i].size , 0.0f , img_enemy1[0] , TRUE ) ;
ですが、「img_enemy1[0]」と画像ファイル固定になってますが??
「img_enemy1[i]」ですか?


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

Name: 湘南七夕  ..初心者(7,042ポイント)   Date: 2007/07/27(金) 22:13   No:9561 解決!     
Title: Re:敵キャラの表示2    
アドバイスありがとうございました。熱を出して寝込んでしまってお返事が遅くなりました。
敵が4体降りてきて、これで正解のようです。
img_enemy[0]のところは、本当は配列にいくつが画像を入れてアニメさせるのですが、ド素人のためわざと固定でアニメさせていないためです。ありがとうございました。

#include "DxLib.h"
#include <math.h>

#define PI 3.141593

struct data{
double x;
double y;
double size;
int flag;
int counter;
int hp;
int pattern;
};

struct data enemy[100];

void EnemyDisp();
void EnemyPattern1(int i);
void EnemyPattern2(int i);
void EnemyPattern3(int i);
void EnemyPattern4(int i);
void EnemyControl();
void EnemyCalc();

/* グローバル宣言 */
int counter=0;
char Key[256];
int img_enemy1[5];

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{

int RefreshTime=0;
// ウインドウモードに変更
ChangeWindowMode( TRUE ) ;
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}

SetDrawScreen( DX_SCREEN_BACK ) ;

img_enemy1[0] = LoadGraph("Sh/img/mons/mons1_0.png");
img_enemy1[1] = LoadGraph("Sh/img/mons/mons1_1.png");
img_enemy1[2] = LoadGraph("Sh/img/mons/mons1_2.png");
img_enemy1[3] = LoadGraph("Sh/img/mons/mons1_3.png");
img_enemy1[4] = LoadGraph("Sh/img/mons/mons1_4.png");

for(int i=0;i<100;i++)
{
enemy[i].flag=0;
}

while(ProcessMessage() == 0 && GetHitKeyStateAll(Key) == 0)
{
RefreshTime = GetNowCount();
ClearDrawScreen();
EnemyCalc();
EnemyControl();
EnemyDisp();
ScreenFlip();
counter++;
if(Key[KEY_INPUT_ESCAPE]==1) break; //Escapeが押されたら終了
while(GetNowCount() - RefreshTime < 17);//1周の処理が17ミリ秒になるまで待つ
}
DxLib_End() ; // DXライブラリ使用の終了処理

return 0 ; // ソフトの終了
}

void EnemyCalc(){
int i;
for(i=0;i<100;i++)
{
if(enemy[i].flag==0)
break;
}
switch(counter){
case 100:
case 150:
case 200:
case 250:
enemy[i].flag=1; //出現フラグを立てる
enemy[i].counter=0;//出現して何カウント目か測るカウンター初期化
enemy[i].pattern=1; //どういう軌道を描くか
enemy[i].size=0.5f;//敵の大きさ
enemy[i].x=100.0; //xの初期座標
enemy[i].y=-10.0; //yの初期座標
break;
default:
break;

}
}





void EnemyPattern1(int i)
{
enemy[i].y+=1.5;
}


void EnemyPattern2(int i)
{
if(enemy[i].counter<50)
enemy[i].y+=4.0f;
if(enemy[i].counter>100)
enemy[i].y-=4.0f;
}

void EnemyPattern3(int i)
{
enemy[i].x+=sin(PI*enemy[i].counter/40.0f)*5.0f;
enemy[i].y+=1.5f;
}

void EnemyPattern4(int i)
{
if(enemy[i].counter<100)
enemy[i].y+=2.5f;
if(enemy[i].counter>=100)
{
enemy[i].x+=sin(PI*(enemy[i].counter-100.0f)/160.0f)*2.5f;
enemy[i].y+=sin(PI*(enemy[i].counter-20.0f )/160.0f)*2.5f;
}
}

void EnemyControl()
{
for(int i=0;i<100;i++)
{
if(enemy[i].flag==1)
{
if(enemy[i].pattern==1)
EnemyPattern1(i);
}
}
}

void EnemyDisp()
{
for(int i=0;i<100;i++)
{
if(enemy[i].flag==1)
DrawRotaGraph( (int)enemy[i].x , (int)enemy[i].y , enemy[i].size , 0.0f , img_enemy1[0] , TRUE ) ;
}
}













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



Name: goo  ..ぴよぴよ(12ポイント)   Date: 2007/07/27(金) 17:36   No:9557       
Title: 無題    
皆さんの数値解析の意義についてご意見・お考えをお聞かせください。

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


Name: ナガレ  ..ぴよぴよ(72ポイント)   Date: 2007/07/27(金) 18:50   No:9558     
Title: Re:無題    
http://www.google.com/search?num=50&hl=ja&q=%E6%95%B0%E5%80%A4%E8%A7%A3%E6%9E%90%E3%81%AE%E6%84%8F%E7%BE%A9%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6&lr=lang_ja

C言語の質問じゃないよなあ。


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



Name: 大滝  ..ぴよぴよ(23ポイント)   Date: 2007/07/27(金) 17:32   No:9556       
Title: 修正はさみうち法について    
はさみうち法と修正はさみうち法のアルゴリズムを教えてください。

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




Name: けるびん  ..ぴよぴよ(852ポイント)   Date: 2007/07/26(木) 21:12   No:9538       
Title: ポインタのポインタについて    
また、ポインタのポインタを使った問題なんですが。


コマンドラインで -a<数字> が与えられたら,"good morning" を<数字>回表示し, -h<数字> が与えられたら,"good afternoon" を<数字>回表示し, -y<数字> が与えられたら,"good night" を<数字>回表示するプログラムを作成せよ.

(実行例)
$ ./a.out -a1
good morning
$ ./a.out -a1 -h2
good morning
good afternoon
good afternoon
$ ./a.out -a1 -h2 -y3
good morning
good afternoon
good afternoon
good night
good night
good night

問題は以上です。

入力数字が1桁なら、ちゃんとその回数分出力するんですが、2桁以上となると最上位の桁の数字しか読み込んでくれず、200と入力すると2回分しか文字が表示されないんです。
原因はポインタのポインタが数字の部分の先頭アドレスしか読んでないからだと思うんですが、改善策をプログラム化できなくて困っています。
2桁以上の入力にも対応できるようにするには、どのようにすればいいでしょうか。
御願いします。


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


Name: box  ..比類無きプログラマー(82,963ポイント)   Date: 2007/07/26(木) 21:35   No:9539     
Title: Re:ポインタのポインタについて    
ちょっとした例です。よかったら解析してみてください。

なお、97, 104, 121のような、特定のコード体系に依存する数値を
直接書かない方がよいと思います。
'a', 'h', 'y'と書く方がわかりやすいと思いませんか?


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

typedef struct _message {
char timezone;
char *greeting;
} MESSAGE;

int main(int argc, char **argv)
{
MESSAGE msg[] = {
{ 'a', "good morning" },
{ 'h', "good afternoon" },
{ 'y', "good night" },
};
int i, j, n;
char opt;

while (--argc) { /* コマンドライン引数がある間 */
opt = **(++argv); /* 各引数の先頭文字 */
if (opt == '-') { /* '-'で始まるのが有効 */
opt = *++(*argv); /* '-'の次の文字 */
for (i = 0; i < sizeof(msg) / sizeof(msg[0]); i++) {
if (opt == msg[i].timezone) { /* 時間帯として有効な文字なら */
n = atoi(++(*argv)); /* 後に続く文字列を数値化する */
for (j = 0; j < n; j++)
printf("%s\n", msg[i].greeting); /* 挨拶の出力 */
}
}
}
}
return 0;
}



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

Name: けるびん  ..かけだし(1,071ポイント)   Date: 2007/07/26(木) 22:20   No:9540     
Title: Re:ポインタのポインタについて    
プログラムが見やすくて、助かります。
自分は、プログラムの流れがつかめていなかったようです
コメントまで付けてくださりありがとうございました。
sizeof演算子には少し疎いので、もう少し、勉強しようと思います。
しかし、こんな短い行数でできるとは思ってませんでした。

このプログラムを見て自分で作ってみたんですが、
完全に我流にしてしまい、教えていただいたのに申し訳ないです。
本当に参考にしたの??っていうくらいなんで。

本当にありがとうございましたm(_ _)m


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

Name: けるびん  ..かけだし(1,223ポイント)   Date: 2007/07/27(金) 00:08   No:9544     
Title: Re:ポインタのポインタについて(今更質問なんですが)    
for (i = 0; i < sizeof(msg) / sizeof(msg[0]); i++) {
if (opt == msg[i].timezone) {/* 時間帯として有効な文字なら */
n = atoi(++(*argv));/* 後に続く文字列を数値化する */
}

まず、分からないところは

for(i = 0; i < sizeof(msg) / sizeof(msg[0]); i++)

のところの i < sizeof(msg) / sizeof(msg[0]); でiをどういう考えの範囲まで回そうとしているのか。

もうひとつは if文内の"時間帯として有効な文字なら"の意味がよく分からないです。

お礼を言った後なんですが、よろしく御願いします。


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

Name: tkmakwins15 [URL]  ..初心者(7,893ポイント)   Date: 2007/07/27(金) 00:30   No:9545     
Title: Re:ポインタのポインタについて(今更質問なんですが)    
>sizeof(msg) / sizeof(msg[0]);

配列msgの大きさじゃないでしょうか。sizeof(msg)で配列全体のバイト数を求めて、
sizeof(msg[0])で配列の最初の要素(は必ずあるので)のバイト数を求め、割り算すれば、
配列の大きさが求まりますので。


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

Name: けるびん  ..かけだし(1,268ポイント)   Date: 2007/07/27(金) 01:33   No:9547     
Title: Re:ポインタのポインタについて(今更質問なんですが)    
またまたお礼です。

この問題に関して・・・
修行してきます。

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


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



Name: ロキ  ..ぴよぴよ(139ポイント)   Date: 2007/07/26(木) 10:12   No:9534       
Title: フローチャート    
↓のプログラムのフローチャートがかけません。教えてくれる方いましたらお願いします。


適当な数(ピボットという)を選択する (データの中央値が望ましい)
ピボットより小さい数を前方、大きい数を後方に移動させる (分割)
二分割された各々のデータを、それぞれソートする
実際にこれを実現するためのアルゴリズムは色々考えられるが、一例を挙げると以下のようなものがある。

ピボットとして一つ選びそれをPとする。
左から順に値を調べ、P以上のものを見つけたらその位置をiとする。
右から順に値を調べ、P以下のものを見つけたらその位置をjとする。
iがjより左にあるのならばその二つの位置を入れ替え、2に戻る。ただし、次の2での探索はiの一つ右、次の3での探索はjの一つ左から行う。
2に戻らなかった場合、iの左側を境界に分割を行って2つの領域に分け、そのそれぞれに対して再帰的に1からの手順を行う。要素数が1以下の領域ができた場合、その領域は確定とする。


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


Name: 組木紙織  ..上級者(19,788ポイント)   Date: 2007/07/26(木) 11:07   No:9535     
Title: Re:フローチャート    
クイックソートのアルゴリズムですね。
ソースなら探せば色々なところで見つかりますが、フローチャートとなると。。。

というより再帰を使ったプログラムをフローチャートで書けるのかなというところが気になります。
少し考えてみたいとおもいます。


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

Name: ロキ  ..ぴよぴよ(218ポイント)   Date: 2007/07/26(木) 12:40   No:9536     
Title: Re:フローチャート    
早い返信ありがとうございます。

自分でも考えていますがどうもフローチャートは・・・Google検索でもフローチャートはクイックソートのフローチャートは中々ないようでのので;


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



Name: ゴリさん  ..ぴよぴよ(90ポイント)   Date: 2007/07/25(水) 22:50   No:9530       
Title: 確率の問題    
確立の問題なのですがどのように考えればいいかわかりません。手がつけられない状況です。よろしくお願いします。
問題 献血はエイズ検査を受けなければなりません。この検査は99%正確で、あなたと同年齢の人の1/10,000がHIV陽性であるとします。また検査で陽性と判断されたうち5%は間違いであるとします。あなたがこの検査で陽性と判定されたとすると、あなたがエイズに罹っている確立はいくらでしょう?


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


Name: box  ..比類無きプログラマー(82,574ポイント)   Date: 2007/07/25(水) 22:57   No:9532     
Title: Re:確率の問題    
OKwave系列の数学カテゴリーへ話を持っていった方が早いと思います。
あるいは、「ベイズの公式」あたりでググってみると、
もしかすると数値が違うだけで同じ種類の問題について解説している
サイトが見つかるかもしれません。


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

Name: たかぎ [URL]  ..ぴよぴよ(506ポイント)   Date: 2007/07/26(木) 10:03   No:9533     
Title: Re:確率の問題    
> また検査で陽性と判断されたうち5%は間違いであるとします。

これが間違いないないとすれば...

> あなたがこの検査で陽性と判定されたとすると、あなたがエイズに罹っている確立はいくらでしょう?

HIVに感染している「確率」は95%ですね。(「確立」ではなく「確率」です)
ただし、HIVに感染していることと、エイズに罹っていることは同義ではありません。
これを知るためには、罹患率や発症率といった情報が別途必要になるかと思います。

いずれにしても、C言語とは何の関係もないので、質問する場を間違えている気がします。


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



Name: yasu  ..ぴよぴよ(435ポイント)   Date: 2007/07/25(水) 22:40   No:9528       
Title: 確率分布について    
確率分布の問題がわかりません。
質問者:shin0602 (1)平均4、分散5の正規分布
(2)自由度13のt分布
(3)自由度23のx2分布(x2→エックスの2乗です)
(4)自由度(4、13)のF分布
それぞれの下側5%点と上側5%を求めたいのですが、どのようにすれば解答が求まるかまったくわかりません。手のつけようがないんです。
よろしくお願いします。


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


Name: box  ..比類無きプログラマー(82,506ポイント)   Date: 2007/07/25(水) 22:48   No:9529     
Title: Re:確率分布について    
C言語を使ってその問題を解くことができないので何とかならないか、
という話ですか?

もしそういう話でなければ、OKwave系列の数学カテゴリーでのお問い合わせに
答えが返ってくるのをお待ちになる方がよいと思います。


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

Name: yasu  ..ぴよぴよ(454ポイント)   Date: 2007/07/25(水) 22:51   No:9531     
Title: Re:確率分布について    
そういうことなんです。なんとかなりませんか?

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



Name: たーくん  ..ぴよぴよ(34ポイント)   Date: 2007/07/25(水) 17:45   No:9526       
Title: 非線形方程式に対しての質問です。    
非線形方程式に対しての数値解析法(二分法、はさみうち法、反復法、NR法)以外ってなにがありますか?すいません教えてください。

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


Name: まーくん  ..ぴよぴよ(23ポイント)   Date: 2007/07/25(水) 17:47   No:9527     
Title: Re:非線形方程式に対しての質問です。    
ニュートン・ラプソン法じゃないですかねぇ?!


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



Name: Jastin  ..ぴよぴよ(131ポイント)   Date: 2007/07/25(水) 17:08   No:9524       
Title: 最小二乗法のプログラムがうまく動作しません。    
はじめまして。私は電気系を専攻している大学生です。
現在私はプログラミング(C言語)の授業を履修して1年半目になるのですが、
「最小二乗法」の分野のときに出された以下の課題に例題も何もないまま取り組み、後述の添付ファイルのプログラムを
作ったところ、コンパイルはされるのですが、答えがうまく出ず、とても困っています。
何回も検討し、TAの人にも聞いたのですが、何が違うのか分からないと言われ、他に誰にも聞くことが出来ません。

プログラムのどこがおかしくて答えがうまく出ないのかをどうか教えてください。
コンパイラはソラリスのユニックス、エディタは秀丸エディタを使っています。パソコン自体はWindouwsで
いずれも学校で動作させました。

問題 n
最小二乗法を用いて、与えられたデータから最小二乗近似多項式g(x)=ΣAjx^(j-1) (n=4)
j=1
を求めるプログラムを作成せよ。データは以下を利用せよ。
x1=0.0, x2=0.2, x3=0.4, x4=0.6, x5=0.8, x6=1.0
y1=0.00,y2=0.95,y3=0.59,y4=-0.59,y5=-0.95,y6=0.0


プログラムの後半はガウス・ジョルダン法で解いています。


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


Name: Jastin  ..ぴよぴよ(155ポイント)   Date: 2007/07/25(水) 17:12   No:9525     
Title: Re:最小二乗法のプログラムがうまく動作しません。    
↑すみません。秀丸エディタで添付しました。
ワードパッドでもう一度添付しました。


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



Name: 名無し  ..ぴよぴよ(650ポイント)   Date: 2007/07/25(水) 14:44   No:9521       
Title: #include "DxLib.h"    
僕はVisualC++ 2005 Expressを使っているのですが、#include "DxLib.h"だけが必ずエラーが起きます。ここ以外のエラーは無いのに……
何故ですか?教えてください。


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


Name: YuO  ..中級者(9,490ポイント)   Date: 2007/07/25(水) 16:17   No:9523     
Title: Re:#include    
エラーの内容が書かれていないので,予想の範疇でしかないのですが……。

DxLib.hが
・#includeが書かれているファイルと同じディレクトリ
・clの/Iオプションで指定されているディレクトリ
・INCLUDE環境変数で指定されているディレクトリ
のどこにも存在しないのではないでしょうか。
# 1番目以外はプロジェクトオプションとIDEオプションで変更可能。


「エラーが起きます」ではなく,「〜〜〜というエラーが起きます」という風に書くと,原因を把握した上での回答がつくかもしれません。
ベストはエラーメッセージのコピペです。
# 「エラーが起きます」としかないのは何も書いていないのと同じです。


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



Name: サトル  ..ぴよぴよ(61ポイント)   Date: 2007/07/25(水) 15:59   No:9522       
Title: 非線形方程式について    
f(x)=1/X-tanx=0
xが(P)の数値解⇔│f(x)│<1×10(マイナス9乗)

(1)はさみうち法を用いて解く
(2)NR法を用いて解く

これについて考えたのですが、プログラムを作れませんでした。
ぜひ教えてください。


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




Name: やっかい者  ..かけだし(1,973ポイント)   Date: 2007/07/22(日) 11:47   No:9472       
Title: DirectXについて    
いつも、お世話になります。

さて、DirectX7で組んだソースがDirectX8の環境でコンパイル出来ません。
以前のDX7のincludeやlibファイルが不明でDX7の開発環境を再現できません。

そこで、DX7のソースをDX8に移植する方法をお尋ねします。
または、DX7のファイルの入手先URLをご存知の方は
ご教授よろしくお願いします。

コンパイラーはMSDV(VC++6)になります。


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


Name: Justy  ..ハッカー(138,830ポイント)   Date: 2007/07/22(日) 23:16   No:9482     
Title: Re:DirectXについて    
>以前のDX7のincludeやlibファイルが不明
>DX7のソースをDX8に移植する方法をお尋ねします
 入手できない、ということですか?
 7にしても8も昔の雑誌とかは探しましたか?
 古本屋か図書館か、どこかで手に入れられると思います。

 ところで、何故8なのでしょう?
 9ならMSのサイトから入手できますし、7で作られたソースも
一応ビルドできるようです(多少制限があるかもしれませんが)。
 試してみては?


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

Name: やっかい者  ..かけだし(2,049ポイント)   Date: 2007/07/24(火) 09:53   No:9496 解決!     
Title: Re:DirectXについて    
DX8はXPに標準装備なので作ったソフトが誰にでも動作するように8にこだわりました。
7はたしか以前MSからDLしたと思うのですが現在未対応なので今回の質問となりました。
開発環境を9で試してみます。

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


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

Name: Justy  ..ハッカー(139,081ポイント)   Date: 2007/07/24(火) 17:50   No:9509     
Title: Re:DirectXについて    
 XP-SP2なら 9.0cが標準になっていますし、(あまり確証はないですが)7か8の APIだけを
使い libも 7か8のものだけをリンクすればSDKは 9を使っていても大丈夫なのではないか、
と思います。


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

Name: やっかい者  ..かけだし(2,172ポイント)   Date: 2007/07/25(水) 10:49   No:9520     
Title: Re:DirectXについて    
ランタイムライブラリは最新バージョンにこした事はないのですが・・・
開発者にとっては、ソースににあうバージョンが必要で「やっかい」です。

今回の事例は、工学社の「DirectX7実践プログラミング」のバックナンバー
にて解決しました。

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


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



Name: にゃ〜  ..ぴよぴよ(95ポイント)   Date: 2007/07/24(火) 18:24   No:9512       
Title: テイラー展開のこの問題を教えてください    
f(x)=sin(x)をテイラー展開すると

   ∞
f(x)=(-1)^(k-1)*{x^(2k-1)/(2k-1)!}
   k=1

となる.これを利用してsin(x)の値を多項式近似する関数double mysin(double x)を定義し,この関数を利用して,読み込んだ実数xのsin(x)を計算して出力するプログラム(sin.c)を書け.
また,数学関数sin(x)と自分で作ったsin(x)を比較せよ.

という問題なのですがどうしてもわからないんです。
今日中にできる方いらっしゃいますか??  
理解したいので、コメント付きでどうかお願いします。


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


Name: Hermit  ..中級者(12,062ポイント)   Date: 2007/07/24(火) 21:35   No:9515     
Title: Re:テイラー展開のこの問題を教えてください    
こんな感じで、定義した関数と、sin との比較をするくらいでいいのではないかと思います。
 

#include <stdio.h>
#include <math.h>
int main () {
double d = -20.0;
for (;d < 20.0; d += 0.01) {
double s = sin(d);
double m = mysin(d);
printf("%f:sin-> %f: mysin-> %f: 差-> %g\n",d,s,m,s-m);
}
return 0;
}


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

Name: asd  ..上級者(16,512ポイント)   Date: 2007/07/25(水) 10:38   No:9519     
Title: Re:テイラー展開のこの問題を教えてください    
> 今日中にできる方いらっしゃいますか??

お急ぎなら課題を出された先生に聞いてみてはいかがでしょうか?

> 理解したいので、コメント付きでどうかお願いします。

丸投げ、マルチポストをして答えだけを急いでもらおうとしているあたり、
学習意欲が感じられません。
#同一人物かは分かりませんが、マルチポスト先で暴言を吐かれているようですし。

http://www3.realint.com/cgi-bin/tarticles.cgi?pointc2+7715


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



Name: クアー  ..ぴよぴよ(166ポイント)   Date: 2007/07/23(月) 12:17   No:9485       
Title: DxLib.slnがVC++6.0で開けない    
入門編0節のところでつまづいています。DxLib.slnが開けません。このファイルをダブルクリックするとMicrosoft Development Environmentが開き、エラーが表示されます。
「選択されたファイルはVisual Studioのソリューション ファイルではありません。」
というエラーです。

別の方法で開けるかもと思い、DxLib.dsxを実行しましたが、Visual C++はエラーが一つあると言います。
「(・・・中略)\debug\vc60.pdb'を開けません。」
というエラーです。

自分が使っているのは製品版のVisual C++6.0です。この掲示板を「サンプルプログラム実行」で検索してヒットした4つの結果では他のバージョンの質問のようで、自分の問題の解決には至りませんでした。
DXライブラリはバージョン2.23と2.19を試しましたがどちらもうまく同じ結果で開けませんでした。自分はVBでは幾つかプログラムを書いたことがありますが、C++は初めて一ヶ月目です。

他に試せることはないでしょうか?


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


Name: Justy  ..ハッカー(138,869ポイント)   Date: 2007/07/23(月) 12:52   No:9486     
Title: Re:DxLib.slnがVC++6.0で開けない    
 DxLib.dsxは見たことがないですが、同じディレクトリに DxLib.dswはありませんか?
 MSVC6.0ならそのファイルを開くことができるはずです。


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

Name: クアー  ..ぴよぴよ(438ポイント)   Date: 2007/07/24(火) 10:12   No:9498     
Title: Re:DxLib.slnがVC++6.0で開けない    
Justyさん、早速の助言をどうもありがとうございます。.dsxは私の間違いでDxLib.dswでした。しかしMicrosoft Visual C++6.0でこのファイルを開くまではできますがデバッグしようとすると下記のエラーが出ます。
「c:\documents and settings\(中略)\デベハトップ\dxlib_vc\フンプルプロバラム縦行用フドルダ\test.cpp(0) : fatal error C1033:(中略)\debug\vc60.pdb'を開けません。cl.exeの実行エラー」

日本語が文字化けしているようですね。一週間ほど前にVC++の英語版をアンインストールして日本語版をインストールした影響でしょうか。念のためにもう一度VC++日本語版をアンインストールとインストールして試してみます。


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

Name: クアー  ..ぴよぴよ(517ポイント)   Date: 2007/07/24(火) 11:14   No:9499     
Title: Re:DxLib.slnがVC++6.0で開けない    
VC++の日本語版をアンインストールして再インストールしましたが結果は同じでデバッグするとエラーが一つ出ます。他のコンピューターを見つけてそれで試してみます。

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

Name: Justy  ..ハッカー(139,015ポイント)   Date: 2007/07/24(火) 11:44   No:9502     
Title: Re:DxLib.slnがVC++6.0で開けない    
 完全に文字化けてますね。
 "デベハトップ"は結構有名なアレで、文字を無理矢理アルファベットと見なして、
大文字を小文字に変換するとこうなります。

 試しに、DxLib.dswのフルパスが日本語文字やスペース・記号を一切含まないパスに
置いて試してみてはどうでしょうか。

 例えば dxlib_vcをCドライブの直下において、「サンプルプログラム実行用フォルダ」を
"sample"にリネームするとか。
(c:\dxlib_vc\sample\DxLib.dswな感じで)


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

Name: クアー  ..ぴよぴよ(665ポイント)   Date: 2007/07/24(火) 16:55   No:9506 解決!     
Title: Re:DxLib.slnがVC++6.0で開けない    
解決しました!

Justyさんの助言通りにパスに日本語を含めないようにしたところ、デバッグ成功、プログラムの実行も成功し、出るべき画像が出てきましたよ!ありがとうございます。

しかし日本語を含めないパスでもDxLib.slnは開いてくれません。Microsoft Development Environmentが返すエラーには「選択されたファイルはVisual Studioのソリューション ファイルではありません。」と書いてあります。この先もトラブルが予想されそうです。それでも今回の問題は解決してとてもうれしいです。ありがとうございました。


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

Name: バグ  ..熟練のプログラマー(54,564ポイント)   Date: 2007/07/24(火) 17:00   No:9507     
Title: Re:DxLib.slnがVC++6.0で開けない    
ソリューションはVC++2005でないと開けないのではなかったでしょうか?


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

Name: Justy  ..ハッカー(139,189ポイント)   Date: 2007/07/24(火) 18:01   No:9511     
Title: Re:DxLib.slnがVC++6.0で開けない    
>パスに日本語を含めないようにしたところ、デバッグ成功
 解決して何よりです。


>DxLib.slnは開いてくれません
 slnファイルはたしか Visual Studio .Net(2002)以降で使用されるファイルで、
VisualC++6.0では開けないので、そこは気にしなくていいかと。


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

Name: クアー  ..ぴよぴよ(755ポイント)   Date: 2007/07/25(水) 10:07   No:9518 解決!     
Title: Re:DxLib.slnがVC++6.0で開けない    
バグ さん、Justy さん、ソリューション・ファイルはVC++6.0では開けない旨了解しました。いろいろとご親切にありがとうございます。問題はすべて解決したのでプログラムを先に進めたいと思います。ありがとうございました。

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



Name: ぶぅ  ..ぴよぴよ(1ポイント)   Date: 2007/07/24(火) 17:59   No:9510       
Title: このプログラムとフローチャートまたはPAD教えてください    
sin(x)についてテイラー展開を用いた近似解と関数sinを用いた解の比較です。


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




Name: 雪中 蓮  ..入門者(4,795ポイント)   Date: 2007/07/19(木) 21:50   No:9442       
Title: 万年カレンダー    
こんばんは。今学校の課題で、万年カレンダーのプログラムを作成しているのですが、プログラムの組み方が悪いのか上手くいきません。それ以前にコンパイルエラーになるのですが・・・。

長いですが、全文はっておきますのでご指摘、助言をお願いします。

#include <stdio.h>



/******************************************/
void ym_input(int *year, int *month);

int get_day_of_week(char *date);

void cal_disp(int year,int month, int dayofweek);


/******************************************/
char *dp,date[8] = {0,0,0,0,0,0,0,0};
int *yp, *mp;
int year,month,day,dayofweek;


/******************************************/
int main(void)
{
yp = date[0];
mp = date[4];
ym_input(yp,mp);

date[6] = '0';
date[7] = '1';
dp = date[0];
dayofweek = get_day_of_week(dp);

cal_disp(year,month,dayofweek);

return 0;
}


/******************************************/
void ym_input(int *year, int *month)
{
printf("表示させたいカレンダーの年を西暦で入力してください\nただし入力可能範囲は1583〜3999年とする ->");
while('15830000'>=date || '39990000'<=date){
scanf("%d",&year);
if('15830000'>=date || '39990000'<=date) printf("Error:入力値が正しくありません\n");
}
printf("表示させたいカレンダーの月を入力してください ->");
while('0100'>=*month || '1200'<=*month){
scanf("%d",&month);
if('0100'>=*month || '1200'<=*month) printf("Error:入力値が正しくありません\n");
}
}


/******************************************/
int get_day_of_week(char *date)
{
int i,d[8],a;
int *j;

j = d[0];
for(i=0;i<8;i++)
{
*(j + i) = *(date + i) - 48;
}

year = d[0] * 1000 + d[1] * 100 + d[2] * 10 + d[3];
month = d[4] * 10 + d[5];
day = d[6] * 10 + d[7];

a=(year+(year/4)-(year/100)+(year/400) + ((13 * month)+8)/5)+day)%7 ;
return a;
}


/******************************************/
void cal_disp(int year,int month, int dayofweek)
{
int i,j,a,max,flag,cal[6][7]={
{" "," "," "," "," "," "," "},
{" "," "," "," "," "," "," "},
{" "," "," "," "," "," "," "},
{" "," "," "," "," "," "," "},
{" "," "," "," "," "," "," "},
{" "," "," "," "," "," "," "}
};

switch(month){
case 2 : {
if((year%4==0&&!(year%100==0))||year%400==0)
max=29;
else
max=28;
break;
}
case 4 :
case 6 :
case 9 :
case 11 : {
max=30;
break;
}
default : {
max=31;
break;
}
}

a=0;
flag=0;
for(i=0;i<6||flag==1;i++){
for(j=0;j<7||flag==1;j++){
if(i=0) j=dayofweek;
cal[i][j]=a++;
if(a==max) flag=1;
}
}
printf("%.4d年 %.2d月\n",year,month);
printf("日 月 火 水 木 金 土\n");

for(i=0;i<6||flag==1;i++){
for(j=0;j<7||flag==1;j++){
if(cal[i][j]=" ")
printf(" ");
else
printf("%.2d",cal[i][j]);
printf(" ");
}
printf("\n");
}

}
 
 


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


Name: box  ..比類無きプログラマー(81,618ポイント)   Date: 2007/07/19(木) 22:07   No:9443     
Title: Re:万年カレンダー    
コンパイル時のエラーメッセージの意味はおわかりになりますか?
おわかりになるところは、ご自分で修正してみてください。


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

Name: 雪中 蓮  ..入門者(4,940ポイント)   Date: 2007/07/19(木) 22:40   No:9445     
Title: Re:万年カレンダー    
エラーの部分なんですが、

printf("表示させたいカレンダーの年を西暦で入力してください\nただし入力可能範囲は1583〜3999年とする ->");
while('15830000'>=date || '39990000'<=date){
scanf("%d",&year);
if('15830000'>=date || '39990000'<=date) printf("Error:入力値が正しくありません\n");
}

この行の比較でエラーが出ているようなんですが、どう対処すればいいかがわかりません。


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

Name: box  ..比類無きプログラマー(81,704ポイント)   Date: 2007/07/19(木) 23:11   No:9448     
Title: Re:万年カレンダー    

そこよりも前に、main()で警告が出ていませんか?

> yp = date[0];
> mp = date[4];

date[0]やdate[4]というchar型のデータ(中身は0、つまり'\0')を
int *型に代入する意味がわからないです。


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

Name: tkmakwins15 [URL]  ..初心者(6,815ポイント)   Date: 2007/07/19(木) 23:23   No:9449     
Title: Re:万年カレンダー    
文字列比較に、比較演算子は使えませんよ。
string.hをインクルードして、strcmp()で文
字比較を、strlen()で文字数を数えてくださ
い。これがCの厄介なとこなんですよ。


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

Name: 雪中 蓮  ..初心者(5,014ポイント)   Date: 2007/07/19(木) 23:26   No:9450     
Title: Re:万年カレンダー    
ypにはdateの先頭アドレスを入れようとしているのですが・・・

>char *dp,date[8] = {'0','0','0','0','0','0','0','0'};

> yp = date;
> mp = yp + 4;

・・・このようにすればよいのでしょうか?


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

Name: たかぎ [URL]  ..ぴよぴよ(146ポイント)   Date: 2007/07/19(木) 23:28   No:9451     
Title: Re:万年カレンダー    
> printf("表示させたいカレンダーの年を西暦で入力してください\nただし入力可能範囲は1583〜3999年とする ->");
> while('15830000'>=date || '39990000'<=date){
> scanf("%d",&year);
> if('15830000'>=date || '39990000'<=date) printf("Error:入力値が正しくありません\n");
> }
>
> この行の比較でエラーが出ているようなんですが、どう対処すればいいかがわかりません。

2文字以上を含む文字定数の値は処理系定義ですが、エラーにはならないはずです。
実際に試してみましたが、上の箇所では、警告は出ますがエラーにはなりませんでした。
なお、一重引用符で囲まれた文字の並びは、「文字列定数」ではなく「文字定数」になります。
「文字定数」の比較は関係演算子を使うべきで、strcmpは役に立ちません。

もっとも、そんなこと以前に根本的に間違っていると思います。

ちなみに、最初のエラーは、

> a=(year+(year/4)-(year/100)+(year/400) + ((13 * month)+8)/5)+day)%7 ;

の部分で、括弧がバランスしていないことによるものです。

ところで、西暦3999年まで扱う場合には、
http://www.water.sannet.ne.jp/kazuya-ai/14/weak-5.html
にあるように、閏年の計算が上記では通用しなくなる可能性が大です。


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

Name: box  ..比類無きプログラマー(81,918ポイント)   Date: 2007/07/19(木) 23:45   No:9452     
Title: Re:万年カレンダー    
int型の年とint型の月を与えて、その年・月の
カレンダーを出力する、という問題ですよね?

ym_input()で年・月を入力し、入力結果を他の関数に渡すのであれば、
int型の年・月のための変数を定義してから、
それらのアドレスをym_input()に渡せばよい(他にも方法はあります)わけで、
date[]というchar型の配列を介する必要は全くないと思います。

年・月として有効な値かどうかを判定する際にも、
int型の年・月をそのまま使えばよいのです。

なお、3999年だと閏年の計算がずれるという話は事実なのでしょうけれど、
「カレンダーを出力するためのロジックを学ぶ」という今回の話とは
本質的に異なるので、気になさる必要はありません。
「自分は何に着目すべきなのか?」を常に考えて、
横道にそれていきそうな話には目を向けないようにすることが大切です。


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

Name: 雪中 蓮  ..初心者(5,135ポイント)   Date: 2007/07/19(木) 23:52   No:9453     
Title: Re:万年カレンダー    
すみません、このプログラムには仕様書がありまして・・・。

>void ym_input(int *year, int *month);
>int get_day_of_week(char *date);
>void cal_disp(int year,int month, int dayofweek);

この3つの関数をそのままの形で使わなければならないのです。


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

Name: box  ..比類無きプログラマー(81,997ポイント)   Date: 2007/07/19(木) 23:56   No:9454     
Title: Re:万年カレンダー    
>int get_day_of_week(char *date);

dateには何が入っているのですか?
また、戻り値は何の値ですか?

仕様書があるということは、引数や戻り値についての説明があるはずです。


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

Name: 雪中 蓮  ..初心者(5,317ポイント)   Date: 2007/07/20(金) 00:03   No:9455     
Title: Re:万年カレンダー    
すみません。入力し忘れてました。

>void ym_input(int *year, int *month);
戻り値:なし
year・・・年、month・・・月
>int get_day_of_week(char *date);
戻り値:曜日を表す数値(0〜6)
0:日1:月2:火3:水4:木5:金6:土
date・・・年月日を表す8桁の数字文字列(年:西暦4桁、月:2桁、日:2桁)
>void cal_disp(int year,int month, int dayofweek);
戻り値:なし
year・・・年、month・・・月、dayofweek・・・曜日を現す整数値


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

Name: box  ..比類無きプログラマー(82,262ポイント)   Date: 2007/07/20(金) 00:13   No:9456     
Title: Re:万年カレンダー    
ということは、int型で入力した年・月をもとにして、
char *型のdateを組み立てればよいです。

しかし、2桁の日をどこからも与えませんので、
どうやってdateを組み立てるかがよくわからないですね。

ただ、get_day_of_week()の戻り値がおそらく
その年・月の初日の曜日であろう(当方の思いこみかも)ことから推して、
"YYYYMM01"の形式(YYYY:西暦年、MM:月)の文字列を組み立てることを
期待しているのでしょうか。これも推測です。

仮にこれらの推測が当たっているとしても、当該年・月の初日の曜日を
求めるにはint型のままの方が楽なはずなので、
やはりchar *dateの必要性については個人的に疑問が残ります。


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

Name: 雪中 蓮  ..初心者(5,523ポイント)   Date: 2007/07/20(金) 00:20   No:9457     
Title: Re:万年カレンダー    
この課題が出された時に、わざとややこしい事をしていると言っていたのでそう思われるのも無理は無いでしょう。
とりあえず、助言を参考にもう一度プログラムを組みなおしてみます。
またなにかあったときはよろしくお願いします。


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

Name: 雪中 蓮  ..初心者(5,542ポイント)   Date: 2007/07/20(金) 00:21   No:9458 解決!     
Title: Re:万年カレンダー    
すみません、マークを変え忘れました・・・。

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

Name: 雪中 蓮  ..初心者(6,848ポイント)   Date: 2007/07/22(日) 19:07   No:9479     
Title: Re:万年カレンダー    
先日に助言していただき、それを元に組み直してみましたが、またよくわからなくなってしまいました。
ポインタに関連する部分のイメージがわからなくなってしまっているので、またご助言ください。

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

#include <stdio.h>
#include <string.h>


/******************************************/
void ym_input(int *year, int *month);

int get_day_of_week(char *date);

void cal_disp(int year,int month, int dayofweek);


/******************************************/
char *dp,date[8];
int *yp, *mp;
int year,month,day,dayofweek;


/******************************************/
int main(void)
{
int y2,m2;
char moji,moji_hen;

strcpy(date,"10000101");

yp = &y2;
mp = &m2;
ym_input(yp,mp);
moji=(char)y2;
moji_hen=(moji/1000+'0')*1000+(moji/100%10+'0')*100+(moji/10%10+'0')*10+(moji%10+'0');
strcpy(date,moji_hen);
moji=(char)m2;
moji_hen=(moji/1000+'0')*1000+(moji/100%10+'0')*100+(moji/10%10+'0')*10+(moji%10+'0');
strcpy(date,moji_hen);

dp = date[0];
dayofweek = get_day_of_week(dp);

cal_disp(year,month,dayofweek);

return 0;
}


/******************************************/
void ym_input(int *year, int *month)
{
int i;

printf("表示させたいカレンダーの年を西暦で入力してください\nただし入力可能範囲は1583〜3999年とする ->");
while(1583>=i || 3999<=i){
scanf("%d",i);
if(1583>=i || 3999<=i) printf("Error:入力値が正しくありません\n");
}
*year=i;

printf("表示させたいカレンダーの月を入力してください ->");
while(01>=i || 12<=i){
scanf("%d",i);
if(1>=i || 12<=i) printf("Error:入力値が正しくありません\n");
}
*month=i;
}


/******************************************/
int get_day_of_week(char *date)
{
int i,a,d[8];
int *j;

j = d[0];
for(i=0;i<8;i++)
{
*(j + i) = *(date + i) - 48;
}

year = d[0] * 1000 + d[1] * 100 + d[2] * 10 + d[3];
month = d[4] * 10 + d[5];
day = d[6] * 10 + d[7];

a=((year+(year/4)-(year/100)+(year/400) + ((13 * month)+8)/5)+day)%7 ;
return a;
}


/******************************************/
void cal_disp(int year,int month, int dayofweek)
{
int i,j,a,max,flag;
char cal[6][7];

for(i=0;i<6||flag==1;i++){
for(j=0;j<7||flag==1;j++){
strcpy(cal[i][j]," ");
}
}


switch(month){
case 2 : {
if((year%4==0&&!(year%100==0))||year%400==0)
max=29;
else
max=28;
break;
}
case 4 :
case 6 :
case 9 :
case 11 : {
max=30;
break;
}
default : {
max=31;
break;
}
}

a=0;
flag=0;
for(i=0;i<6||flag==1;i++){
for(j=0;j<7||flag==1;j++){
if(i==0) j=dayofweek;
cal[i][j]=a++;
if(a==max) flag=1;
}
}
printf("%.4d年 %.2d月\n",year,month);
printf("日 月 火 水 木 金 土\n");

for(i=0;i<6||flag==1;i++){
for(j=0;j<7||flag==1;j++){
if(!(strcmp((char)cal[i][j]," ")))
printf(" ");
else
printf("%.2d",cal[i][j]);
printf(" ");
}
printf("\n");
}

}


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

Name: box  ..比類無きプログラマー(82,460ポイント)   Date: 2007/07/23(月) 20:54   No:9490     
Title: Re:万年カレンダー    

cal_disp()の例を載せます。
他の関数のコードは考えてみてください。


void cal_disp(int year, int month, int dayofweek)
{
int days[2][13] = {
{ 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }, // 平年
{ 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }, // 閏年
};
int leap, lastday, w, d, n;

leap = year % 4 == 0 && year % 100 != 0 || year % 400 == 0; // 閏年の判定
lastday = days[leap][month]; // 当該月の日数

printf("\n%d年%2d月\n", year, month);
printf("日 月 火 水 木 金 土\n");
for (w = 0; w < 6; w++) { // 1ヶ月を6週とする
n = 7 * w + 1 - dayofweek; // 第w週日曜日の日付
for (d = n; d < n + 7; d++) { // 第w週を出力する
if (1 <= d && d <= lastday) // 有効な日付ならば
printf("%2d ", d); // 出力する
else // 無効な日付ならば
printf(" "); // 空白を出力する
}
printf("\n");
}
printf("\n");
}



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

Name: 雪中 蓮  ..初心者(6,879ポイント)   Date: 2007/07/24(火) 16:35   No:9505 解決!     
Title: Re:万年カレンダー    
ありがとうございます。
その他の部分もなんとか解決できました。
色々とすみませんでした。


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



Name: hana  ..かけだし(1,104ポイント)   Date: 2007/07/24(火) 09:20   No:9494       
Title: ファイル操作について    
おはようございます。
ファイル操作について勉強しているのですが、分からないところがあってメールしました。
どなたか助言をお願いします。

プログラムの内容は、テキストファイル(タブで区切られた10進数の数値が64個)を読み込んできて
プログラムの中でテキストファイルの数値の順序を入れ替えるものです。(des暗号のs-boxなんですが・・・)

1つのテキストファイルの中身を入れ替えるところまではできたのですが、同様のテキストファイルが8個あった
場合の処理の方法がいまいち分かりません。

自分でやっててもコンパイル通らないだろうなぁ・・・とおもいつつ、
8個のテキストファイルの名前を1.txt、2.txt、3.txt・・・8.txt、としてfor文で回してみましたが
当然うまくいきませんでした。(あさはかでした。)



for(i=1;i<3;i++){
fp = fopen("i.txt","r");
for(j=0;j<64;j++){
fscanf(fp,"%d",&s[j]);
}
fclose(fp);



このように複数のファイルを準備して同じ処理をする場合の方法を教えてください。


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


Name: バグ  ..熟練のプログラマー(54,544ポイント)   Date: 2007/07/24(火) 09:40   No:9495     
Title: Re:ファイル操作について    
単純に配列を増やせばいいのではないでしょうか?
例えば、2次元配列を使って格納するとか…


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

Name: keichan  ..プログラマー(27,128ポイント)   Date: 2007/07/24(火) 09:53   No:9497     
Title: Re:ファイル操作について    
"i.txt"はいつまで経っても"i.txt"になります。
あと、for文の外で fclose してますがfor中に入れないと
最後にオープンしたファイルしか閉じません。


char filename[32] = {'\0'};
for( i = 1; i < 3; ++i ) {
sprintf(filename, "%d.txt", i);
fp = fopen(filename, "r");
...
fclose(fp);
}


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

Name: hana  ..かけだし(1,271ポイント)   Date: 2007/07/24(火) 11:22   No:9500     
Title: Re:ファイル操作について    
バグさん、keichanさんありがとうございます。
確かに配列を2次にして考えればいけそうです。(^_^)v

char filename[32] = {'\0'};
for( i = 1; i < 3; ++i ) {
sprintf(filename, "%d.txt", i);
fp = fopen(filename, "r");
 ↑
あと、keichanさんのような方法があるとは知りませんでした。

sprintfの機能は知ってても、ほかの構文と組み合わせて使うのって、ひらめき的なものがあるんですかね?
(経験もない私が言うのもなんですが・・・)

お二人の助言を参考にがんばります。


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

Name: hana  ..かけだし(1,286ポイント)   Date: 2007/07/24(火) 11:23   No:9501 解決!     
Title: Re:ファイル操作について    
すみません、「質問」ではなくて「お礼」です。

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



Name: 悩みさん  ..ぴよぴよ(21ポイント)   Date: 2007/07/22(日) 21:47   No:9480       
Title: 自動ファイル作成    
こんばんわ。2ヶ月前にプログラミングを始めたばかりの入門者です。
一昨日、C言語でテキストファイルを自動作成するツールを作る宿題をだされました。
ネットで調べたり、本を読んでるんですが、なにから始めてよいやら、
全く分からずここに書き込みました。
なにかヒントになるものでも教えてくれる方がいたらお願いします。


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


Name: たかぎ [URL]  ..ぴよぴよ(242ポイント)   Date: 2007/07/22(日) 23:16   No:9483     
Title: Re:自動ファイル作成    

FILE *stream = fopen(ファイル名, "w");


とすれば、後はfprintfなどを使って、標準出力に書くのと同じようにするだけです。
書き終わったら、
flose(stream);



でファイルを閉じましょう。


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



Name: karu  ..ぴよぴよ(6ポイント)   Date: 2007/07/22(日) 22:45   No:9481       
Title: ステレオ法について    
Cでステレオ法のプログラムが説明されているよいHPなどありましたら、教えていただけないでしょうか?

よろしくお願いします。


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




Name: kaoru  ..入門者(3,531ポイント)   Date: 2007/07/22(日) 13:59   No:9475       
Title: ハフマン符号化の簡単なプログラム    
管理人さんお久しぶりです。

火曜日までの宿題でハフマン符号化のプログラムが宿題として出たのですが…

たとえば以下のように配列を宣言するとします。

struct huff{
double freq;
int parent;
int up;
};

次にこの構造体を struct huff a[10];
のように配列を使って宣言します。


最小値を求める際に以下の関数に
先ほど宣言した構造体の配列を入れたいのですが

int min(○○○)
{
int i;
double min;
min=a[0].freq;
int number;

for(i=1;i<WORKSPACE;i++){
if(min>a[i].freq && a[i].freq!=0.0){
min=a[i].freq;
number=i;
}
}
a[number].freq=0.0;
return number;
}


min と a[].freq を比較し最小値を求め、
その最小値を持つ配列の番号を返したいのですが
関数の引数に何を入れればいいかわかりません。

またそのせいで配列を使った行が(例:min=a[0].freq など)
subscripted value is neither array nor pointer

となってしまいうまく動作しません。

ポインタの知識がいまいちでさらに構造体もかかわってきては…

どなたかご教授お願いいたします。


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


Name: kaoru  ..入門者(3,577ポイント)   Date: 2007/07/22(日) 14:35   No:9478 解決!     
Title: Re:ハフマン符号化の簡単なプログラム    
すいません、ポインタを使いまくってみたら
何とか動作するようになりました。

ご迷惑おかけしました。


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



Name:  ..上級者(19,457ポイント)   Date: 2007/07/21(土) 20:21   No:9463       
Title: 演算子    
こんばんゎ☆
テスト間近でかなり焦ってきました。。。。
助けてくださぁーーーーーーぃ。。


<質問>
演算子の優先度と結合法則の表についてなんですけど、
とりあえず、表は、上が優先度が高いってことは分かります。

ただ、それを使った次のような問題がとけません。。。
次の式の計算の意味を変更することなく、省略できる括弧を全て省いた式に変形しなさい。
括弧を省略すること以外の変形をしてはいけない。

1) a-((b-c)*d))-e

どこから、どのよにみてけばいいんでしょうか??

2) (+a(++a))+((b&c)<<(d+e))

3) (((*(a.b)).c->d)++

このような問題もあります。。

御指導お願いします。


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


Name: YuO  ..中級者(9,210ポイント)   Date: 2007/07/22(日) 00:30   No:9464     
Title: Re:演算子    
> どこから、どのよにみてけばいいんでしょうか??

とりあえず,括弧を外したものと括弧を付けたもので,順序が替わらないのであれば,その括弧は不要です。


> 1) a-((b-c)*d))-e

閉じ括弧が一個多いのですが……。

それはおいておくとして,小学校の算数で,かけ算・割り算は足し算・引き算よりも先にやる,というのを習いましたよね。
つまり,*や/は+や-より演算子の優先順位が高い事になります。

こいつについて考えると,
・(b-c)
括弧の外側にある演算子は*で内側にある演算子は-
括弧内の演算子の方が優先順位が低いから,この括弧を外すと順序が替わるためこの括弧は外せない。
・((b-c)*d)
括弧の外側にある演算子は-と-で内側にある演算子は* (このとき,括弧内にある括弧はひとくくりとして見る)。
括弧内の演算子の方が優先順位が高いから,この括弧を外しても順序が替わらずこの括弧は外せる。

というわけで,括弧を外すと
a-(b-c)*d-e
となります。


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

Name: 管理人 [URL]  ..伝説のハッカー(383,499ポイント)   Date: 2007/07/22(日) 02:43   No:9465     
Title: Re:演算子    
既に☆さんが「表」とおっしゃっているので紹介する必要がないのかもしれませんが
http://www9.plala.or.jp/sgwr-t/c/sec14.html
この辺の下の方に優先順位をまとめた表があります。
この表の通りに優先順位を見ていけばわかりますよ。

Yuoさんがお答えになっているので必要ないですけど、

a - (b*c)

はカッコが外れても計算過程は同じになるので、カッコが外れます。
問題はそういう意味でしょうね。



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

Name:  ..上級者(19,668ポイント)   Date: 2007/07/22(日) 14:22   No:9476 解決!     
Title: Re:演算子    
お二方、丁寧に説明していただいて、ありがとうございます。

計算の順序を考えながら、とればいいんですね★
解き方を教えてもらったので、違う問題お解いてみます。

本当に、救いの手をさしのべていただき、ありがとうございます★

>>管理人サン。。
ですよねぇ。。。そのまんまな感じするかもなんですけど。。。
実は、またメールしたんですょ。。。
なんで通じ合えないんでしょうー(笑)

また送ってみます!!!(笑)


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

Name:  ..上級者(19,730ポイント)   Date: 2007/07/22(日) 14:33   No:9477     
Title: Re:演算子    
また送ったんですが・・・・・(笑)

よろしくお願いします(*^▽^*)


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



Name: tela  ..かけだし(1,075ポイント)   Date: 2007/07/22(日) 09:13   No:9466       
Title: 配列でのキューを用いた二分木の幅優先    
こんにちは。自分ではできてると思うのですが、なぜか出力の順序がおかしくなるのでお願いします。

[問題] 配列によるキューを用いて、二分木を幅優先(breath first)で出力するプログラムを作れ。
(すでにリストによるキューを使った同様の問題をやっており、
それを配列によるキューで作り直す問題です)

[ソース]

#include <stdio.h>
#include <stdlib.h>
#define MaxSize 100

typedef struct node *NodeP;

typedef struct node {
int data; /* 処理対象のデータ */
NodeP llink, rlink; /* 左・右部分木 */
} Node;

/****** 配列によるキューの実現(ここから) *****/

/* キューを配列で実現するためのデータ型 Queue の定義 */
typedef struct queue {
NodeP array[MaxSize];
int size; /* 格納済データ領域の次の要素番号 */
} Queue;

/* Queue のポインタ型 QueueP の定義 */
typedef Queue *QueueP;

/* キューへのポインタを格納する変数の宣言 */
static QueueP queue;


/******* ここからが、間違ってるかもしれないところ ********/

void initQueue(void)
/* キューの初期化 */
{
queue = (QueueP)malloc(sizeof(Queue));

if(queue == NULL) {
fprintf(stderr,"Can't allocate memory!\n");
exit(1);
}

queue->size = 0;
}

int isEmpty(void)
/* キューが空なら1、空でなければ0を返す */
{
return ((queue->size) != 0) ? 0 : 1;
}

void enqueue(NodeP nd)
/* キューに節点を追加 */
{
if (queue->size < MaxSize) {
queue->array[queue->size] = nd;
queue->size++;
}
}

NodeP dequeue(void)
/* キューから節点を取り出す */
{
NodeP nd;

if (queue->size > 0 )
queue->size--;
nd = queue->array[queue->size];
return nd;
}
}

/*** 以上が間違っているかもしれないところ ****/
/**** 配列によるキューの実現(ここまで) ****/

void breathFirst(NodeP root)
/* root を根とする二分木を幅優先訪問する */
{
NodeP p;

initQueue();
enqueue(root);

while(!isEmpty()) {
p = dequeue();
printf(" %d,", p->data);

if(p->llink != NULL) enqueue(p->llink);
/* 左部分木が存在するならキューに左部分木の節点を追加 */
if(p->rlink != NULL) enqueue(p->rlink);
/* 右部分木が存在するならキューに右部分木の節点を追加 */
}
}

NodeP newNode(int val)
/* 値 val をもつ節点を生成する補助関数 */
{
NodeP newp = (NodeP)malloc(sizeof(Node));

if(newp == NULL) {
fprintf(stderr, "Can't allocate memory!\n");
exit(1);
}

newp->data = val;
newp->llink = NULL;
newp->rlink = NULL;

return newp;
}

NodeP createTree(void)
/* 以下の二分木を作る
* 1
* 2 3
* 4 5 6 7
* 8 9 10
* 11
*/
{
NodeP root;

root = newNode(1);
root->llink = newNode(2);
root->rlink = newNode(3);
root->llink->llink = newNode(4);
root->llink->rlink = newNode(5);
root->rlink->llink = newNode(6);
root->rlink->rlink = newNode(7);
root->rlink->llink->llink = newNode(8);
root->rlink->llink->rlink = newNode(9);
root->rlink->rlink->rlink = newNode(10);
root->rlink->llink->llink->llink = newNode(11);

return root;
}

void freeTree(NodeP root)
/* root を根とする二分木をメモリ上から開放する */
{
if(root == NULL) return;

/* 左部分木の開放 */
freeTree(root->llink);
/* 右部分木の開放 */
freeTree(root->rlink);
/* root の開放 */
freeTree(root);
}

int main(void)
{
NodeP root;

root = createTree(); /* 二分木の生成 */

printf("breathFirst: ");
breathFirst(root); /* 二分木を幅優先探索で表示 */
printf("\n");

freeTree(root); /* 二分木の開放 */
return 0;
}


このまま実行すると、

breathFirst: 1, 3, 7, 10, 6, 9, 8, 11, 2, 5, 4

となってしまいます。実際は

breathFirst: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11

とならなければなりません。

ソースでも示したとおり、

(void)initQueue(void) , int isEmpty(void) ,
void enqueue(NodeP nd) , NodeP dequeue(void)

の四つの関数のどれかが間違っていると思われます。

それ以外の部分は、先にリストによるキューでの同様の問題を解いたときに
使ったものなので、間違っていません。


自分は、
void enqueue(NodeP nd) , NodeP dequeue(void)
辺りを間違っていると思うのですが、知恵を貸してくれませんか?


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


Name: tela  ..かけだし(1,216ポイント)   Date: 2007/07/22(日) 09:24   No:9467     
Title: Re:配列でのキューを用いた二分木の幅優先    
すいません。
vod freeTree(NodeP root) が少し間違ってました。
正しくは↓です。


void freeTree(NodeP root)
/* root を根とする二分木をメモリ上から開放する */
{
if(root == NULL) return;

/* 左部分木の開放 */
freeTree(root->llink);
/* 右部分木の開放 */
freeTree(root->rlink);
/* root の開放 */
free(root);
}





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

Name: box  ..比類無きプログラマー(82,241ポイント)   Date: 2007/07/22(日) 10:16   No:9468     
Title: Re:配列でのキューを用いた二分木の幅優先    
dequeue()で、{と}の数が合わないため、コンパイルエラーが出ます。

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

Name: box  ..比類無きプログラマー(82,334ポイント)   Date: 2007/07/22(日) 10:34   No:9469     
Title: Re:配列でのキューを用いた二分木の幅優先    
また、キューを管理するにはsizeだけでは不足です。
配列の最後にenqueueして先頭からdequeueする、という
構造ですので、「どこから」と「どこまで」の2つを
管理する必要があります。


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

Name: tela  ..かけだし(1,386ポイント)   Date: 2007/07/22(日) 10:37   No:9470     
Title: Re:配列でのキューを用いた二分木の幅優先    
>dequeue()で、{と}の数が合わないため、コンパイルエラーが出ます。
すいません。忘れていました。


NodeP dequeue(void)
/* キューから節点を取り出す */
{
NodeP nd;

if (queue->size > 0 ) {
queue->size--;
nd = queue->array[queue->size];
return nd;
}
}


ですね。この状態で、出力する値の順序がおかしくなってしまいます。

>「どこから」と「どこまで」の2つを管理する必要があります。

enqueue と dequeue 、両方間違っているということでしょうか?


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

Name: tela  ..かけだし(1,412ポイント)   Date: 2007/07/22(日) 11:12   No:9471     
Title: Re:配列でのキューを用いた二分木の幅優先    
暫く考えましたが、やはり分かりません。

if の条件部分は変えなければなりませんか?


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

Name: box  ..比類無きプログラマー(82,263ポイント)   Date: 2007/07/22(日) 11:57   No:9473     
Title: Re:配列でのキューを用いた二分木の幅優先    
> enqueue と dequeue 、両方間違っているということでしょうか?

enqueue()は、「キューの最後に格納する」ことができていると思います。

しかし、dequeue()は、「キューの先頭から取り出す」ことができていなくて、
「キューの最後から取り出す」ようになっています。
sizeとは別に、「次にどこから取り出すか」という状態を管理する必要があります。


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

Name: tela  ..かけだし(1,417ポイント)   Date: 2007/07/22(日) 12:50   No:9474 解決!     
Title: Re:配列でのキューを用いた二分木の幅優先    
できました!
なるほど、そういうことでしたか。
最初のデータを格納しておいて、
残りのデータを一つ前にもっていき、
配列の要素数を一つ減らせばよかったんですね。
ありがとうございました。


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



Name: pom  ..ぴよぴよ(10ポイント)   Date: 2007/07/21(土) 17:45   No:9461       
Title: 画像の表示    
最近こちらのサイトを知り
利用させていただいています、本当に助かります。

現在、光度を変えての画像の表示をやっているのですが
コンパイラ上で実行した場合は画像が表示されるのですが
exeファイルを実行した場合に画像が表示されません。

なにか原因があるのでしょうか・・・?

コンパイラ:Microsoft Visual C++
OS:MicrosoftWindwsVista BASIC
メモリ:512MB



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


Name: pom  ..ぴよぴよ(61ポイント)   Date: 2007/07/21(土) 17:50   No:9462 解決!     
Title: Re:画像の表示    
すみません
自己解決しました。

ビルドした際にDebugフォルダが作成されます
その中に画像を入れていなかったのが原因のようです。



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



Name: Chii☆  ..ぴよぴよ(139ポイント)   Date: 2007/07/19(木) 10:12   No:9426       
Title: C++のクラスについて    
お久しぶりです☆

C++のクラスの学習をしようと思っているのですが、わかりやすぃHPがなかなか探せません。

どなたかC++やC++のクラスについて”このHPはわかりやすい!!”みたいなオススメが
あれば、教えてくださぃ!!

よろしくお願い致します。


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


Name: tkmakwins15 [URL]  ..初心者(6,708ポイント)   Date: 2007/07/19(木) 19:05   No:9433     
Title: Re:C++のクラスについて    
わかりやすいHPです。

http://www.kumei.ne.jp/c_lang/cpp/cpp_07.htm

ですが、簡単にクラスについて説明しておきます。クラスとは、今まで別々に独立されて作られていた。
関数などを、オブジェクトという単位に分けて、その単位ごとにプログラミングをして、機能ごとに独立
させようというものです。とりあえず、クラスの文法については、このHPで学んでください。


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

Name: Chii☆  ..ぴよぴよ(241ポイント)   Date: 2007/07/20(金) 15:50   No:9460 解決!     
Title: Re:C++のクラスについて    
ありがとうございます。

HPの方、拝見しましたが、とてもわかりやすく学習できています。
ありがとうございました。

また、C++に関して質問するかもしれませんが、その時は
また、よろしくお願いします。


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



Name: Bose  ..かけだし(1,836ポイント)   Date: 2007/07/18(水) 17:40   No:9411       
Title: 二次元配列に代入できない    
以前2次元配列を引数に持つような関数の作成方法を質問したものです.
動的メモリ確保の方法で無事コンパイルを通り安心していましたが,実行時にエラーがでてしまいました.
boxさんにアドバイスしていただいき,以下のプログラムとなりました.


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

#define LEN (80)

typedef struct param {
int param1;
int param2;
} Param;

typedef struct kind {
char filename[LEN];
char message[LEN];
Param param;
} Kind;

void mapFunction(Kind kind, double ***map);

int main(void)
{
double **map[2];
Kind kind[2] = {
{ "TCOutputTorque.csv", "TCOutputTorque", { 15, 3 }, },
{ "TCInputTorque.csv", "TCInputTorque", { 18, 2 }, },
};
int i, j;

mapFunction(kind[0], &map[0]);
mapFunction(kind[1], &map[1]);

for (i = 0; i < 2; i++) {
for (j = 0; j < kind[i].param.param1; j++)
free(map[i][j]);
free(map[i]);
}
return 0;
}

void mapFunction(Kind kind, double ***map)
{
int i, j;
double a;
FILE *file;

printf("%s\n", kind.message);
file = fopen(kind.filename, "r");
if (!file)
fprintf(stderr, "open error\n"), exit(1);

*map = (double **) malloc(sizeof(double *) * kind.param.param1);
if (!*map){
fprintf(stderr, "out of memory\n");
exit(1);
}
for (i = 0; i < kind.param.param1; i++) {
*map[i] = (double *) malloc(sizeof(double) * kind.param.param2);
if (!*map[i])
fprintf(stderr, "out of memory\n"), exit(1);
for (j = 0; j < kind.param.param2; j++) {
fscanf(file, "%lf,", &a);
*map[i][j] = a;/*ここでエラーが生じる*/
map[i][j]=(double *)malloc(sizeof(double));
fscanf(file, "%lf,", map[i][j]);
printf("map[%d][%d] = %4.1f,", i, j, *map[i][j]);
}
printf("\n");
}
fclose(file);
}


自分なりにデバックしてみたところ,/*ここでエラー生じている*/のところでエラーが生じていました.
具体的には
*map[0][0]にaは代入できてる.
*map[0][1]にaが代入できずにエラーがでていることがわかりました.
しかしなぜjが1の時がだめなのかわかりません.
aは(j=1の時も)ファイルから読み込めています.

OSはWindowsXPでCygwinでgccコンパイルをしています.

原因がわかるようでしたら教えていただきたいです.宜しくお願いいたします.


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


Name: Bose  ..かけだし(2,479ポイント)   Date: 2007/07/18(水) 17:44   No:9412     
Title: Re:二次元配列に代入できない    
すみません.プログラムが間違っていました.
下記のプログラムが正しいです.
申し訳ありません.

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

#define LEN (80)

typedef struct param {
int param1;
int param2;
} Param;

typedef struct kind {
char filename[LEN];
char message[LEN];
Param param;
} Kind;

void mapFunction(Kind kind, double ***map);

int main(void)
{
double **map[2];
Kind kind[2] = {
{ "TCOutputTorque.csv", "TCOutputTorque", { 15, 3 }, },
{ "TCInputTorque.csv", "TCInputTorque", { 18, 2 }, },
};
int i, j;

mapFunction(kind[0], &map[0]);
mapFunction(kind[1], &map[1]);

for (i = 0; i < 2; i++) {
for (j = 0; j < kind[i].param.param1; j++)
free(map[i][j]);
free(map[i]);
}
return 0;
}

void mapFunction(Kind kind, double ***map)
{
int i, j;
double a;
FILE *file;

printf("%s\n", kind.message);
file = fopen(kind.filename, "r");
if (!file)
fprintf(stderr, "open error\n"), exit(1);

*map = (double **) malloc(sizeof(double *) * kind.param.param1);
if (!*map){
fprintf(stderr, "out of memory\n");
exit(1);
}
for (i = 0; i < kind.param.param1; i++) {
*map[i] = (double *) malloc(sizeof(double) * kind.param.param2);
if (!*map[i])
fprintf(stderr, "out of memory\n"), exit(1);
for (j = 0; j < kind.param.param2; j++) {
fscanf(file, "%lf,", &a);
*map[i][j] = a;/*ここでエラーが生じる*/
fscanf(file, "%lf,", map[i][j]);
printf("map[%d][%d] = %4.1f,", i, j, *map[i][j]);
}
printf("\n");
}
fclose(file);
}



自分なりにデバックしてみたところ,/*ここでエラー生じている*/のところでエラーが生じていました.
具体的には
*map[0][0]にaは代入できてる.
*map[0][1]にaが代入できずにエラーがでていることがわかりました.
しかしなぜjが1の時がだめなのかわかりません.
aは(j=1の時も)ファイルから読み込めています.

OSはWindowsXPでCygwinでgccコンパイルをしています.

原因がわかるようでしたら教えていただきたいです.宜しくお願いいたします


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

Name: box  ..比類無きプログラマー(80,399ポイント)   Date: 2007/07/18(水) 18:10   No:9414     
Title: Re:二次元配列に代入できない    
差し支えなければ、入力ファイル(2つ)を提示していただけますか?

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

Name: Bose  ..入門者(2,521ポイント)   Date: 2007/07/18(水) 23:41   No:9418     
Title: Re:二次元配列に代入できない    
入力ファイル1つ目です.
よろしくお願いいたします.


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

Name: Bose  ..入門者(2,643ポイント)   Date: 2007/07/19(木) 00:17   No:9420     
Title: Re:二次元配列に代入できない    
ファイル名が変わってしまっていました.
先ほど添付した1つ目のファイルはTCOutputTorque.csvです.xls形式で開くと化けてしまいますので,csvファイルとして開いていただきたいです.

ここでは2つ目にTCInputTorque.csvを添付いたします.
よろしくお願いいたします.






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

Name: box  ..比類無きプログラマー(81,227ポイント)   Date: 2007/07/19(木) 20:27   No:9435     
Title: Re:二次元配列に代入できない    
領域の動的確保について、私が考え違いをしていました。
修正したコードを載せますので、実行してみてください。


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

#define LEN (80)

typedef struct param {
int param1;
int param2;
} Param;

typedef struct kind {
char filename[LEN];
char message[LEN];
Param param;
} Kind;

void mapFunction(Kind kind, double ***map);

int main(void)
{
double **map[2];
Kind kind[2] = {
{ "TCOutputTorque.csv", "トルコン領域マップ", { 15, 3 }, },
{ "TCInputTorque.csv", "エンジン特性マップ", { 18, 2 }, },
};
int i, j;

mapFunction(kind[0], &map[0]);
mapFunction(kind[1], &map[1]);

for (i = 0; i < 2; i++) {
for (j = 0; j < kind[i].param.param1; j++)
free(map[i][j]);
free(map[i]);
}
return 0;
}

void mapFunction(Kind kind, double ***map)
{
int i, j;
FILE *file;

printf("%s\n", kind.message);
file = fopen(kind.filename, "r");
if (!file)
fprintf(stderr, "%s open error\n"), exit(1);

for (i = 0; i < kind.param.param1; i++) {
map[i] = (double **) malloc(sizeof(double *) * kind.param.param1);
if (!map[i])
fprintf(stderr, "out of memory\n"), exit(1);

for (j = 0; j < kind.param.param2; j++) {
map[i][j] = (double *) malloc(sizeof(double) * kind.param.param2);
if (!map[i][j])
fprintf(stderr, "out of memory\n"), exit(1);
fscanf(file, "%lf", map[i][j]);
printf("map[%d][%d] = %4.1f,", i, j, *map[i][j]);
}
printf("\n");
}
fclose(file);
}



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

Name: Boze  ..ぴよぴよ(104ポイント)   Date: 2007/07/20(金) 01:08   No:9459     
Title: Re:二次元配列に代入できない    
無事実行できました.
boxさんありがとうございました!


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



Name: マサキ  ..入門者(4,883ポイント)   Date: 2007/07/19(木) 14:00   No:9431       
Title: クイックソートと2分探索    
こんにちわ。
今回は

・<電話番号ファイル>からキー(氏名の読み)とデータ(漢字またはカタカナ氏名と電話番号)を読み込む
・これらのデータを配列に格納する。
・クイックソートを持ちいて、辞書式順序になるように並び替える。
・標準入力から、名前の読みを入力させ、これに対応する名前と電話番号を表示させる(2分探索を用いて探索)

というプログラムを作っているのですが、うまく作動しません。
コンパイルはできるのですが、何も出力されないで終わってしまいます。
どのようにすればいいでしょうか?
アドバイスお願いします。

(注)電話番号ファイルは以下のものを使うものとします。


<電話番号ファイル>
tanaka 田中 5801
iwasaki 岩崎 5803
akiyama 秋山 5805
takahashi.s 高橋(貞) 5807
ueda 上田 5809
masuda 増田 5811
horio 堀尾 5813
watanabe 渡部 5817
idogawa 井戸川 5153
kasahara 笠原 5154
hori 堀 5162
aiba 相場 5166
wakaki 若木 5158
moen モエン 5160
takahashi.m 高橋(正) 5815
miyoshi 三好 5816
hirata 平田 5173
yamamoto 山本 5175
nakano 中野 5177
kawamo 川面 5179
sato 佐藤 5181
komeda 米田 5183
miyagi 宮城 5185
koyama 小山 5187
kawakami 川上 5189
abe 阿部 5164
kojo 古城 5169
okamura 岡村 5161
matsushita 松下 5821
mizuguchi 水口 5823
kuwata 桑田 5825
tsutsumi 堤 5827
sone 曽根 5829
miura 三浦 5831
kosaka 小坂 5833
itai 衣袋 5835
shinozaki 篠崎 5837
nakaguchi 中口 5156
ohkouchi 大河内 5165




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


Name: box  ..比類無きプログラマー(81,451ポイント)   Date: 2007/07/19(木) 20:50   No:9436     
Title: Re:クイックソートと2分探索    
quicksort関数の

> ind = strcmp(x,a[y].yomi);
> ind2=strcmp(x,a[z].yomi);
> while(ind<0) y=y+1;
> while(ind2>0) z=z-1;

ここのロジックに問題があります。

例えば、1行目を実行してindが負だったとします。
すると、3行目のwhileループを実行し続け、抜け出すことができません。

1行目を実行してindがゼロ以上だったとしても、
2行目でind2が正だったら、4行目のwhileループを実行し続けます。

何も出力しないのは、このように無限ループに陥っているためです。


ところで、今回はquicksort関数を自作することもテーマになっているのでしょうか?
もし、そうでないとすれば、標準関数のqsort()を使えばよいと思います。


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

Name: マサキ  ..初心者(5,109ポイント)   Date: 2007/07/19(木) 21:10   No:9438     
Title: Re:クイックソートと2分探索    
boxさん、ありがとうございます。

> ind = strcmp(x,a[y].yomi);
> ind2=strcmp(x,a[z].yomi);
> while(ind<0) y=y+1;
> while(ind2>0) z=z-1;

を以下のように修正した所、ちゃんと動くようになりました。

while(strcmp(x,a[y].yomi)<0) y=y+1;
while(strcmp(x,a[z].yomi)>0) z=z-1;


しかし、新たな問題が問題が発生しました。
どんな文字を入力しても、全て未登録として認識されてしまいます。
これはやはり、2分探索関数を間違えているということでしょうか?

また、クイックソート関数も自作しなければいけないんです.....
クイックソートのアルゴリズムを習ったので、それに習ってプログラムを作れ。みたいな感じなので......


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

Name: box  ..比類無きプログラマー(81,562ポイント)   Date: 2007/07/19(木) 21:26   No:9439     
Title: Re:クイックソートと2分探索    
> どんな文字を入力しても、全て未登録として認識されてしまいます。

探すことができる名前もあります。例えばmiuraさんのように。

> これはやはり、2分探索関数を間違えているということでしょうか?

二分探索ができるのは、探索対象がソート済みであることが前提ですね。
quicksort()の実行直後に、配列のすべての内容を出力してみてください。
ソートしていないことがわかります。

quicksort()のロジックを見直してください。

ところで、quicksort()の第3引数jは、SIZE-1固定でよいのでしょうか?
ファイルから実際に読んだ件数にする必要はありませんか?
また、並べ替えを行なっているところのコードでは
降順ソートをしているように見えます。
そうすると、search()のロジックと食い違ってこないですか?


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

Name: マサキ  ..初心者(5,703ポイント)   Date: 2007/07/19(木) 22:41   No:9446     
Title: Re:クイックソートと2分探索    
> ところで、quicksort()の第3引数jは、SIZE-1固定でよいのでしょうか?
> ファイルから実際に読んだ件数にする必要はありませんか?

その通りですね。すいません。
読み込むたびにカウンタを増やしていたkを第3引数にすることに修正します。

たしかにクイックソート関数実行後に配列の内容を表示させると、何ともいえない中途半端な順序で表示されました。
入れ替えが行われたり、行われていなかったりしてるようです。
また、どうやら降順に並べ替えられてるような気がします。
しかし私は
基準値よりも大きい値を持つ配列の場所を見つけるために
while(strcmp(x,a[y].yomi)<0) y=y+1;

基準値よりも小さい値を持つ配列の場所を見つけるために
while(strcmp(x,a[z].yomi)>0) z=z-1;

として、これらを入れ替えるために
B[0]=a[y];
a[y]=a[z];
a[z]=B[0];
としたのですが、どうしてこれが降順になってしまうのでしょうか.....??



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

Name: マサキ  ..初心者(5,549ポイント)   Date: 2007/07/19(木) 22:47   No:9447     
Title: Re:クイックソートと2分探索    
すいません。どうやらstrcmp関数の引数が逆だったようです。

//配列の先頭から、文字を比べていく//
while(strcmp(a[y].yomi,x)<0) y=y+1;

//配列の末尾から、文字を比べていく//
while(strcmp(a[z].yomi,x)>0) z=z-1;

このように修正した所、昇順に並べ替えられてるのですが、まだ中途半端に入れ替えが行われていない場所があるようです.......
見直してみたところ、何でこのようになるのかわかりません。何処がおかしいのでしょうか?


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



Name: マチマチ  ..ぴよぴよ(80ポイント)   Date: 2007/07/18(水) 11:38   No:9407       
Title: 括弧使用の四則演算プログラム    
初めまして、マチマチといいます。
例の如く仕事でC言語を習い始め、6ヶ月経ったところで
例の如く上司に課題を出され、課題の内容が
例の如く四則演算のプログラムでした。
現在指定された条件は

文字入力で"12*2+(4-1)="というように入力したら答えを返すようにする
関数はgets()

とのことです。
習い始めて6ヶ月といいましたが殆ど独学だったため
はっきり言って2.3ヶ月目の人と大差ないかむしろそれ以下かもしれません・・・
今までずっとソース解析ばかりで一から全て自分で書くというのは殆どやった事がないため苦戦しています。
とりあえず参考程度にサンプルプログラムなどをご教授願えないでしょうか?


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


Name: 初心者A  ..かけだし(1,217ポイント)   Date: 2007/07/18(水) 23:55   No:9419     
Title: Re:括弧使用の四則演算プログラム    
ただ単に課題を解決すれば良いというものではありません。

上司の方もあなたが独力で解決できるとは思っていないでしょう。
解決するために何をどう努力するのか、
その努力の中でなにを身に付けていくのか、
おそらくそうした総合的な意味での課題なのです。

上司の指導により勉強中であるなら質問は上司にするべきです。
全くの他人に質問するのは社会人として失格です。



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

Name: tkmakwins15 [URL]  ..初心者(6,779ポイント)   Date: 2007/07/19(木) 19:11   No:9434     
Title: Re:括弧使用の四則演算プログラム    
とりあえず、どこまでプログラムを書けるのか言ったほうが、
解決が早いかもしれません。そして、いきなり課題をしようと
せずに、まずは書く勉強をしたほうがいいと思います。読める
のであれば、書けるようになるのも速いと思いますし………。


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

Name: 管理人 [URL]  ..伝説のハッカー(383,270ポイント)   Date: 2007/07/19(木) 21:47   No:9440     
Title: Re:括弧使用の四則演算プログラム    
サンプルが欲しいと言う事でさしあたりスタックを使った四則演算など。
サンプルはこの辺に書きました。
http://www.play21.jp/board/formz.cgi?action=res&resno=7821&page=&id=dixq&lognum=#7836
このままではカッコ付きは計算出来ませんけど・・。
四則演算はスタックを使うと便利です。

四則演算だけなら出来るのでしょうか?
どの辺りまでわかっているかおっしゃれば回答者様も答えやすいと思います。


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

Name: たかぎ [URL]  ..ぴよぴよ(70ポイント)   Date: 2007/07/19(木) 22:22   No:9444     
Title: Re:括弧使用の四則演算プログラム    
一応、そのものズバリのコードを紹介しておきます。
http://www.sra.co.jp/people/miyata/algorithm/eval.txt
(getsは使っていないので、その部分は修正が必要です)

ただ、

> 今までずっとソース解析ばかりで一から全て自分で書くというのは殆どやった事がないため苦戦しています。

ということをご自身でも分かっておられるように、この機会に自力でプログラムを書けるようにしておかないと、次回もまた同じ状態になります。
上のリンク先を見る前に、どんなに汚くても、バグがあっても構わないので、とりあえず動くものを自分で作ってみましょう。


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



Name: けるびん  ..ぴよぴよ(353ポイント)   Date: 2007/07/19(木) 01:05   No:9423       
Title: 円を書くプログラム    
半径はdouble型で書く問題なんですが、今のところ、ポインタのポインタを使うということしか分かりません。

ちなみに問題は

計算結果は以下のような形式でファイルcircle.datに出力する.なお,第1列および第2列はそれぞれ,x座標の値およびy座標をしめす.
2.000000e+01 0.000000e+00
1.999924e+01 1.745307e-01
1.999695e+01 3.490481e-01
1.999315e+01 5.235390e-01

ターミナル上で
gnuplot
と入力しgnuplotという描画プログラムを起動後,
gnuplot> plot"circle.dat" with lines
と入力することでcircle.datのデータを描画できる.

という感じなんですが、できればポインタのポインタの問題が記載されているサイト、URLを教えてください。
とりあえず、教科書の問題だけでは量が足りない気がするので。
あと、問題のことなんですが、どういう流れでプログラムを書けばいいのか教えてください。
御願いします。


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


Name: Justy  ..ハッカー(138,696ポイント)   Date: 2007/07/19(木) 11:14   No:9427     
Title: Re:円を書くプログラム    
 この問題は普通に解くなら、ポインタのポインタなんて使うところがないのですが、
本当に使わなければならないのでしょうか?

ポインタのポインタ
http://wisdom.sakura.ne.jp/programming/c/c25.html

ポインタ配列にまつわる話
http://sometime.minidns.net/~ccgi/pointer_array.html

C言語-ポインタの話(おまけ)
http://www.mm2d.net/c/c-18.shtml



どういう流れでプログラムを書けばいいのか教えてください
 処理の流れとしては

1. 書き込み用ファイルを開く

2. 円の方程式を利用して、半径 20の円の各頂点を計算します。

 [ x, y ] = [ 20 * cos(角度), 20 * sin(角度) ]

 角度を 0.5度(ラジアン単位で 0.0087266...)ずつ変化させながら
計算すれば、提示されたような値になります。

3. 随時、ファイルに値を書き込む
 fprintf()を使います。書式には "%e"を使うことで浮動小数点を指数で表現できます。



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

Name: けるびん  ..ぴよぴよ(419ポイント)   Date: 2007/07/19(木) 21:01   No:9437 解決!     
Title: Re:円を書くプログラム    
じつは学校の先生から、ポインタのポインタを習ったばかりの頃に、「あれ使うと便利だよ」とか言ってたので、ポインタのポインタしかないと思いまして。
URLともにプログラムの流れまでありがとうございました。勉強になります。


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



Name: テオリア  ..ぴよぴよ(285ポイント)   Date: 2007/07/19(木) 11:25   No:9428       
Title: ポインタ変数への乱数の代入    
下記のようなプログラムで

ポインタ変数に乱数を代入するようにしたら、コンパイルエラーはないのですが、

実行すると、エラーとなってしまいます。

int *a;

*a = rand()%2;

これは、なぜなのでしょうか?

ご教授よろしくお願いいたします。


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


Name: box  ..比類無きプログラマー(80,598ポイント)   Date: 2007/07/19(木) 11:34   No:9429     
Title: Re:ポインタ変数への乱数の代入    
> int *a;

この時点では、aというint型へのポインタ変数を定義しただけです。
aの値(つまり、どの領域を指しているか)はゴミ(不定)です。

> *a = rand()%2;

aの値が不定状態のまま、aが指している領域に書き込もうとすると、
プログラムが異常終了することがあります。しないこともあります。

解決策は2つあります。
1)a = &b; のようにして、既存のint型の領域(ここではb)を明示的に指す。
2)a = (int *) malloc(sizeof(int)); のようにして、
  aが指す領域をプログラム実行時に動的確保する。


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

Name: テオリア  ..ぴよぴよ(252ポイント)   Date: 2007/07/19(木) 11:43   No:9430 解決!     
Title: Re:ポインタ変数への乱数の代入    
boxさん、素早い解答、かつわかりやすい説明ありがとうございます。





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



Name: 湘南七夕  ..ぴよぴよ(2ポイント)   Date: 2007/07/19(木) 00:52   No:9422       
Title: 敵キャラの表示    
はじめまして。大学3年生です。2年のときC言語の授業をとって、今授業の一環としてDXライブラリを使ってゲームを製作しています。敵キャラ担当なのですが、うまく動かなくてこのサイトを参考にさせていただいています。サイトに書いてあるプログラムの敵キャラのところだけを抜き出して動かしてみたのですが、途中でうまく動かなくなりました。どこが悪いのかよく判りません。ほとんどコピーしたのですが、何かが抜けているのでしょうか。使っているのはVisualC++6.0です。プログラミングがあまり上手ではないので、教えていただけたらとても助かります。よろしくお願いいたします。

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


Name: Justy  ..ハッカー(138,388ポイント)   Date: 2007/07/19(木) 01:20   No:9425     
Title: Re:敵キャラの表示    
 ズバリ、EnemyControl()がおかしいです。

 パターン2以降は全く flagのチェックをしていませんし、
さらには i=100の状態で配列にアクセスするという
最悪な状態になっています。

 for文によるループがどこからどこまでなのかを確認してみて下さい。


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



Name: とむ  ..ぴよぴよ(111ポイント)   Date: 2007/07/18(水) 23:00   No:9417       
Title: 無題    
[1] 授業単元:情報活用
[2] 問題文:キーボードから順次入力された正の整数を0が入力されるまで、
配列に順番に格納し、入力された(0を除く)値の平均値(実数として扱うこと)
にもっとも近い値(平均との差が最小となる値)が何番目に入力された
どういう値であるかを表示するプログラムを作成せよ。

例)
数字(1)を入力してください。 2
数字(2)を入力してください。 5
数字(3)を入力してください。 3
数字(4)を入力してください。 1
数字(5)を入力してください。 0
入力された数字の平均は2.75です。
これは、3番目に入力された3に最も近いです。
[3] 環境
 [3.1] OS: Linux
 [3.2] コンパイラ名とバージョン:gcc
 [3.3] 言語: C
[4] 期限: [7月19日20:00]
[5] その他の制限:特になし

授業はカスのくせに課題難しすぎてまったく手が出せません。よろしくお願いします。


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


Name: Justy  ..ハッカー(138,254ポイント)   Date: 2007/07/19(木) 00:47   No:9421     
Title: Re:無題    
 何で詰まっているのかよく分からないです。
 本当にまったく何も手が出ないとなると、掲示板で説明できる分量を大幅に超えてしまいますし。

 とりあえず手順だけ。

・ 可変配列の準備
 入力個数が事前に確定できないので、通常の配列が使えません。
 不定な数のデータを格納するために、動的に伸長できる可変配列を作る必要があります。

・ 入力値を可変配列に順次格納
 0が入力されたら中止、負や数字以外の文字が入力されたらリトライする処理を入れて、
キーボードから入力し、格納します。


・ 入力が終わったら、それらの平均を求める
 各要素は intですが、平均は doubleか floatの浮動小数点で計算することに留意して下さい。

・ 平均に近いのを見つける
 各要素と平均値の差分を調べ、最も差が小さいのをピックアップします。
 平均との差分が等しい要素もある(要素が 2と 3の2つのとき、平均は 2.5となり、
両方とも平均との差分が 0.5で同じになる)ので、それも考慮に入れて調べます。

・ 結果表示


 いきなり可変配列は難しいと思うので、まずは普通に10個とか数を限った上で
それらの平均を算出するプログラムを書いてみてはどうでしょうか。



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



Name: まこと  ..ぴよぴよ(612ポイント)   Date: 2007/07/18(水) 18:36   No:9415       
Title: おつり問題。    
下のプログラムは日本の貨幣でおつりを計算するプログラムをファイルから開くようにしたソースコードです。
これはできたんですが、20円と25円玉を加えて考えてみなさいとのことなんです><
いろいろ考えたんですが40円のときは25円玉と10円玉と5円玉の三枚より、20円を二枚使ったほうが最小になりますよね。ちょっと混乱してしまいました。
下のプログラムをどのように変えたらいいですか???

#include<stdio.h>
#define MAXNUMCOIN 10

int main(void){
FILE *inputfile;
int num_coin,coin[MAXNUMCOIN];
int mai[MAXNUMCOIN];
int i,j,money;

printf("お釣を入力してください。\n");
scanf("%d",&money);

inputfile=fopen("change1.txt","r");

if(inputfile==NULL){
printf("ERROR:ファイルが開けませんんでした!\n");
exit(1);
}

fscanf(inputfile,"%d",&num_coin);
if(num_coin>MAXNUMCOIN){
printf("ERROR:コインの数が多過ぎます!\n");
exit(1);
}
for(i=0;i<num_coin;i++){
fscanf(inputfile,"%d",&coin[i]);
}
for(i=0;i<num_coin;i++){
mai[i] = money / coin[i];
money = money % coin[i];
}


for(i=0;i<num_coin;i++){
printf("%d円*%d枚\n",coin[i],mai[i]);
}
return 0;
}



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


Name: YuO  ..初心者(8,937ポイント)   Date: 2007/07/18(水) 19:06   No:9416     
Title: Re:おつり問題。    
規約と使い方より引用。
>・マルチポスト(複数の掲示板に同じ質問を書く事)は禁止です。
ref) http://www2.realint.com/cgi-bin/tarticles.cgi?pointc+30522


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



Name: hash  ..ぴよぴよ(325ポイント)   Date: 2007/07/18(水) 00:31   No:9397       
Title: 出力フォーマットについて    
printf() 関数についてなのですが、

main(){
double value = ???; // 定数
printf("%g", value);
}

とすると、%g で指定される書式、
value = 123 なら、出力 123
value = 123.45678 なら、出力 123.45678
となりますが、valueが整数値であれば小数点以下の表示をせず、
valueが小数値であれば、小数点以下n桁目までしか表示させないような指定はできるのでしょうか?

小数点以下3桁までを指定したいとき、
"%.3f" とすれば、小数点以下3桁よりも長い場合は理想的な表示になりますが、
それより短い場合や整数値の場合には 123.000 などと表示されてしまいます。

"%.3g" では、小数点以下ではなく記号を含む全体の字数の指定になってしまいます。

小数点以下"3"桁までを表示させたいとして、
value = 123 のとき、出力 123
value = 123.000 のとき、出力 123
value = 123.45 のとき、出力 123.45
value = 123.45678 のとき、出力 123.456 (123.457)
value = 123.00000001 のとき、出力 123 または 123.000
value = 123.00099999 のとき、出力 123 または 123.000 (123.001)
※ 整数部分の桁数は不定です。

このように表示をしたい場合、適する表記はあるのでしょうか?


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


Name: 管理人 [URL]  ..伝説のハッカー(382,955ポイント)   Date: 2007/07/18(水) 04:15   No:9401     
Title: Re:出力フォーマットについて    
実数なら整数部と小数部にわければ行いたい事が出来るでしょう。

表示させる部分は
四捨五入無しの表示したいのならそのまま表示させればいいですし、
例えばもしxを小数点代N位で四捨五入するならこんな事も出来ます。


#include <stdio.h>
#include <math.h>
#define N 2.0

int main(){

double p=pow(10.0,N);
double x=3.4568172;

x = (int)((x + 0.5/p)*p) / p;
printf("%f",x);
return 0;

}

出力結果

3.46

 


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

Name: 管理人 [URL]  ..伝説のハッカー(382,970ポイント)   Date: 2007/07/18(水) 04:20   No:9402     
Title: Re:出力フォーマットについて    
http://always-pg.com/c/runtime_rd/

逆引き辞典便利ですよ。


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

Name: Justy  ..ハッカー(138,033ポイント)   Date: 2007/07/18(水) 11:10   No:9406     
Title: Re:出力フォーマットについて    
"%.3g" では、小数点以下ではなく記号を含む全体の字数の指定になってしまいます
 であれば、"3"の部分を "*"にして、自分でその数値を動的に決めて指定すれば
自由に桁制御ができるようになります。


static void PrintfDoubleFloat3(double val)

{
int digitIntegerPart = 0;
double t = fabs(val);
do
{
t /= 10.0;
digitIntegerPart++;
}
while(t > 1.f);

printf("%.*g\n", digitIntegerPart+3, val);
}


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

Name: tkmakwins15 [URL]  ..初心者(6,695ポイント)   Date: 2007/07/18(水) 16:28   No:9410     
Title: Re:出力フォーマットについて    
指数部と仮数部に分ける関数で指数部を求めるなんてのはどうでしょうか。
この動作をする関数はfrexp()を使えば問題ないと思います。浮動小数点数
は、10の何乗かで表していますから、詳しくは知りませんが、こんな感じ
でどうでしょうか。



include<stdio.h>
include<muth.h>

int main(void)
{
int keta; /*10の何乗かを記憶する変数*/
double num = 1.2345; /*適当な実数*/
frexp(num,&keta);
/* frexp(double,int *);
  引数::実数、指数部の値を入れる変数のポインタ。
  戻り値::仮数部(このプログラムでは使わないので無視)
*/
printf(%.*g\n",keta,num);
return 0;
}

doubleが十進浮動小数点数ならうまくいくはずです。


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

Name: Justy  ..ハッカー(138,019ポイント)   Date: 2007/07/18(水) 17:53   No:9413     
Title: Re:出力フォーマットについて    
>doubleが十進浮動小数点数ならうまくいくはずです
 C/C++で double型を十進浮動小数点で計算している環境ってものすごく少ないんじゃ・・・。


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



Name: tkmakwins15 [URL]  ..かけだし(1,546ポイント)   Date: 2007/07/14(土) 15:59   No:9290       
Title: 参照について(C++)    
C++についてのサイトで、関数で呼び出し元の変数を書き換える時は
参照ではなくポインタを使うのが暗黙のルールだと書いてあったのですが
なぜでしょうか?どちらかといえば参照を使うほうがより安全なプログラムが
書けると思ったのですが。どうでしょうか?


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


Name: Justy  ..ハッカー(135,701ポイント)   Date: 2007/07/14(土) 17:17   No:9291     
Title: Re:参照について(C++)    
参照ではなくポインタを使うのが暗黙のルール
 そういうローカルルールが存在するのはたしかです。
 1つには呼び出し元にしても呼び出し先にしても見ただけで、各変数の inと outが明確になるようにする
意図があると思われます。

 例えば
void SomeFunction(SOME_BIG_DATA &nonmodifiableData, SOME_BIG_DATA *modifiableData);
 の場合、呼び出し先ではポインタ渡しされた modifiableDataは中身を変更し、
参照渡しされた nonmodifiableDataは変更しないことを obj−>memberか obj.memberで行うかで(視覚的に)
見分けることができることを狙っています。

 呼び出し元でも
SomeFunction(bigData1, &bigData1);
 となり、引数の型がポインタかどうかで変更されるかどうかがわかるようになります。


 C++的には
void SomeFunction(const SOME_BIG_DATA &nonmodifiableData, SOME_BIG_DATA &modifiableData);
 のように constをつけることで intと outの区別をつける方法の方がいいかな、とは思います。
 できるだけ constが付けられるなら constを付けるのが望ましいですから。

 ただ、自分のソースだけを相手にしている場合ならそれでもいいのですが、
他人のライブラリやソースを使っている場合、const付きのクラスオブジェクトの扱いに困ることがあります。

 例えば本来であれば
class A

{
public:
int getA() const { return m_a; }

private:
int a;
};

 こうなっていなければならないところを
class A

{
public:
int getA() { return m_a; }

private:
int a;
};

 のようにメンバ関数 getA()に constが付いていない場合、
void CopyA(const A &a, int &b)

{
b = a.getA();
}
 
 とすると const付きの Aのオブジェクト aからは getA()は呼び出せないのでコンパイルエラーになります。

 ソースが自分の管理下にあれば修正すれば済みますが、そうでない場合仕方なく constを付けないで
void CopyA(A &a, int &b);
 と定義することになり、結果(引数の名前以外では)intと outの区別が付かなくなります。

 というわけで、ポインタを使って区別すればいいんじゃない? というのが2つ目の理由になります。


 あともう1つあってC言語しか知らない人が見た場合、参照渡しが値渡ししているように
見えることです。
 本当に値渡しであれば、呼び出し元の方の値は変更されないので、勘違いしても
(細かい動作はともかく、呼び出し元の値が変更されないという)結果が同じである確率は高くなります。


 たしか理由としてはこんな感じだったかと思います。
 他にも細かく探せば理由はありそうですね。


 ちなみに私個人としてはポインタか参照かはどっちでもいいです。
 いつもは、そのルーチンにおいてポインタか参照のどちらが都合がいいかで決め(大抵参照になります)、
必要なところにちゃんと constつけ、引数など名前で outがわかるようにしています。


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

Name: tkmakwins15 [URL]  ..かけだし(1,834ポイント)   Date: 2007/07/14(土) 18:54   No:9292     
Title: Re:参照について(C++)    
質問した僕が言うのも何ですが。個人的な開発しかやっていませんし、(というかそもそも中3生)
C++にできるだけ移行しようとしているので参照のほうがいいと思ったのです。独習C++にも参照の
ほうが優れていると書いてあったので、どっちかなと思ったので投稿しました。個人開発ではどっ
ちでもあまり問題はありませんよね?


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

Name: Justy  ..ハッカー(135,758ポイント)   Date: 2007/07/14(土) 20:38   No:9293     
Title: Re:参照について(C++)    
>個人開発ではどっちでもあまり問題はありませんよね?
 ということであれば、全然問題ないです。
 用途とお好みに合わせて、使い分けて下さい。


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

Name: tkmakwins15 [URL]  ..かけだし(1,879ポイント)   Date: 2007/07/14(土) 23:11   No:9297     
Title: Re:参照について(C++)    
しかし、C++というのはいろいろと便利な機能がついていて
プログラミングがやりやすいですね。個人的にはクラス・
テンプレート、STLがいい機能だと思いますが、どうでしょ
うか。


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

Name: Justy  ..ハッカー(135,961ポイント)   Date: 2007/07/15(日) 01:48   No:9298     
Title: Re:参照について(C++)    
C++というのはいろいろと便利な機能がついていて プログラミングがやりやすいですね
 たしかに。
 
 ただ、高機能すぎるというか、覚えることがあまりにも多すぎて、
付いていけない人が続出する、という面もあります。
 周りに C++使いは多くいるのですが、個々のレベルの差が激しいんですよ、これが。

 体感的にですが今の C++の世界って、Cの 10倍以上はあるんじゃないでしょうか。
 全部覚える・使う必要はないにしても、これだけ世界が広いとなかなか
それらを押さえるのは大変です(^^


個人的にはクラス・ テンプレート、STLがいい機能だと思いますが
 やはり(STL含む)テンプレートでしょう。
 先の 10倍説のうち 7倍くらいはテンプレートですから。


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

Name: 組木紙織  ..上級者(18,149ポイント)   Date: 2007/07/15(日) 07:27   No:9299     
Title: Re:参照について(C++)    
>参照ではなくポインタを使うのが暗黙のルール

ポインタを使うときには、
ポインタが指す内容でなく、ポインタ自体が書き換えられる可能性があるので、
constをつけてそれを防いだほうが良いとおもいます。

>体感的にですが今の C++の世界って、Cの 10倍以上はあるんじゃないでしょうか。

それは私もそう思います。c++のコンパイラを個人で作れる人は、世の中に数えるほどしか
いないらしいですし。

てきとーに使うだけなら言語使用だけ覚えておけばよいのですが、安全に、開発をしやすく
使おうと思うといろいろな副読本を読んでおかないと、難しいのもc++の特徴のように思います。
c++を最大限使おうと思ったらデザインパターンやオブジェクト指向設計などの
関連する部分も押さえておかないといけないのがc++使いの悩みどころだと思います。

参照について言うと、独立参照なんて、いつ、どこで、何のために使うのかがまったく分からないので
c++になくても問題はないのではないか。
と思っています。
というより、
独立参照はc++には必要がないものだと思っています。


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

Name: tkmakwins15 [URL]  ..かけだし(2,134ポイント)   Date: 2007/07/15(日) 08:40   No:9301     
Title: Re:参照について(C++)    
なるほど、確かにC++はCから拡張しすぎて肥大化した部分も多いといわれています。
しかし、僕は個人開発ですし、まだCをやってから4ヶ月でC++に移行したのですが、
とりあえず、Cの全貌を知っているわけではありませんが、コンソールアプリなら一
応作れるので、たぶんC++も全ての仕様を把握しなくても、大丈夫だと思いますが。
僕も継承とか仮想関数や実行時型情報、C++の入出力もよく分からないです。だから
ぼくがC++を使うと、cout、cinを使う入出力ぐらいしか、使わなくて、後はC形式の
入出力を使ったりして、C++を生かしきれてるのかな…って思ったりします。


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

Name: バグ  ..熟練のプログラマー(54,241ポイント)   Date: 2007/07/15(日) 11:47   No:9302     
Title: Re:参照について(C++)    
C++の全てを学習する事が目的なのですか?
それとも、何か組んでみたいアプリケーションがあっての学習なのでしょうか?
前者ならば、それはそれで素晴らしい事だと思いますが途方も無い学習量になりそうですね(;^_^A
もし後者ならば、目的を達成する為に必要な知識を絞り込んで学習するほうがスマートだと思います。
その理由は、プログラム言語なんて、所詮は手段であって目的ではないからです。
これは、勉強しようという姿勢を否定しているコメントではないので、そこはご理解下さいm(__)m


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

Name: tkmakwins15 [URL]  ..かけだし(2,375ポイント)   Date: 2007/07/15(日) 12:53   No:9303     
Title: Re:参照について(C++)    
ただ、Cでは最近C++の仕様を取り込むような拡張をC99でやりましたよね。
しかし、それでもC++ほどの大きさになったわけではないわけですよね。僕
はC++のいいところとして、wchar_t型がキーワードになった事があると思う
のです。理由は、初期のCではwchar_tがなかったために、あとからtypedef
として定義しましたよね。それで思ったのですが。たぶんCのwchar_tという
のは、普通の整数型と同じとして扱われるのではないでしょうか(コンパイラにとって)。つまり、
整数型と文字型の混同ができてしまうのではないかという事です。それこそ
デバッグの量を増やす事になりかねないのではないかと思うのです。C++では
型の制限が厳しくなっています。それは型の混同によるバグを減らすためだと
思います。ただ、malloc()の戻り値をキャストしなければならないというのは
少々面倒くさい気もしますが。


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

Name: Justy  ..ハッカー(134,688ポイント)   Date: 2007/07/15(日) 15:10   No:9304     
Title: Re:参照について(C++)    
# 組木紙織さん
c++のコンパイラを個人で作れる人は、世の中に数えるほどしかいない
 そうでしょうねぇ。
 作れといわれても、ある程度形になるまで一体何人の人員と期間がかかることやら。


てきとーに使うだけなら言語使用だけ覚えておけばよいのですが
安全に、開発をしやすく 使おうと思うといろいろな副読本を読んでおかないと
 そうですね。
 オブジェクト指向1つとっても最初のうちは頭でわかったつもりでも、すぐにはコードに書けなかったりします。
 C++の危険な使い方を回避するための方法も複雑で多岐にわたっていて結構大変です。
 必要に応じて順次覚えていくのがベストですね。

 とはいえ、仕事じゃなければそんなん無視して突っ走るのもありかな、とはおもいますが(w


独立参照はc++には必要がないものだと思っています
 独立参照という言葉にあまり聞き覚えがないのですが、関数の引数や戻り値ではなく
単独で用いられる(宣言時に明示的な初期化が必要な)参照ということでいいでしょうか?

 であれば私は必要ですね(そうでなければここは無視して下さい)。
 ないと無駄なコピーをすることになったり、無駄な処理を強いられることになったりしますので。


# tkmakwins15さん
たぶんCのwchar_tという のは、普通の整数型と同じとして扱われるのではないでしょうか
 typedefの元になった型と同義と見なされるので、そうなりますね。
 wchar_tが予約語になっていれば、インクルードなしに使えますし、型としては別に扱われるので関数の
オーバーロードなどでは他の整数型とは区別されます(ただ wchar_tから整数型への汎整数昇格もあるので、
少し注意が必要ですが)。


C++では 型の制限が厳しくなっています。
それは型の混同によるバグを減らすためだと思います
 これはその通りです。
 型キャストが4種類に分けられ、Cスタイルのキャストが非推奨になったのもそういう理由が関係していますね。


malloc()の戻り値をキャストしなければならないというのは
 C++で malloc/freeはあまり使われません(というか非推奨)。
 new/deleteを使えばキャストの必要はなくなりますし、sizeof演算子すら不要になりますよ。
 


1,273ポイント を落としてしまった。

Name: tkmakwins15 [URL]  ..入門者(2,664ポイント)   Date: 2007/07/15(日) 15:29   No:9305     
Title: Re:参照について(C++)    
malloc()関数が推奨されない理由というのは、そういう型の問題もありますが。
new演算子と比べて、決定的な違いがあるのですよね。malloc()は単なる領域と
してメモリを確保しますが。newは型としてメモリを確保しますよね? この違い
というのは、やはりC++の型に対して厳格になったところからきていると思います。
ただ、消費税などのお金の計算においては、double型からint型にキャストしないと、丸め
誤差が発生して不正確になりますよね、それにfloor()関数などの整数値となっ
た時に、int型に代入したい時もありますよね。そういう場合は、キャストが優
れた手段になる時もありますよね…。また、windows APIの操作においても、ハ
ンドル値などやスタイル指定などの時に、C++だとキャストが必要な時が多いですよね


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

Name: 組木紙織  ..上級者(18,326ポイント)   Date: 2007/07/15(日) 15:56   No:9306     
Title: Re:参照について(C++)    
>単独で用いられる(宣言時に明示的な初期化が必要な)参照ということでいいでしょうか?
そのとおりだとおもいます。
そのサンプルが。

int main()
{
int x;
int &ref =x;

x=10; //この二つの文の
ref =10;//機能は同等である。

ref = 100;
//100を二回出力する

cout << x << ' ' << ref << "\n";

return 0;
}

となっており、これからどのように使えばよいかが全然見当がつかないので、必要ないと思っています。


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

Name: GPGA  ..プログラマー(33,973ポイント)   Date: 2007/07/15(日) 17:00   No:9308     
Title: Re:参照について(C++)    
構造体の中に構造体があって、またその中に構造体あり
その先の変数に対して複数回の処理をする、などという場合に必要になるのではないでしょうか?


void func(HOGE hoge)
{
int& x = hoge.zzz.yyy.x;

// xに対して複数回処理する

return 0;
}
 
これでしたら、構造体のメンバにアクセスする処理を
省くことが出来るため、この参照方法の意味が出てくると思います。


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

Name: Justy  ..ハッカー(135,835ポイント)   Date: 2007/07/15(日) 17:05   No:9309     
Title: Re:参照について(C++)    
# tkmakwins15さん
 malloc()が推奨されないのはクラスオブジェクトのコンストラクタが呼ばれないからです。
 free()も同様にデストラクタが呼ばれないからです。
 自分で明示的に呼ぶなら話は別ですけど。


ただ、消費税などのお金の計算においては〜(略)
 まぁ、お金の計算を doubleを使って行うことの是非はともかくとして、
もちろん C++といえどキャストは必要なときには必要になります。

 C++のキャストにおいて、Cと異なるのは RTTIを利用した dynamic_castが可能になっていることです。
 この差は大きいですよ。



# 組木紙織さん
これからどのように使えばよいかが全然見当がつかないので、必要ないと思っています。
 これはたしかに要らない(w
 でもこれは例があまりにも・・・。

 こんな例でしたらどうでしょう。
#include <iostream>

#include <cstdlib>
#include <ctime>

namespace
{
class A
{
public:
int getData() { return std::rand(); }
};

class B
{
public:
A &getA()
{
// ここでものすごく時間のかかる処理をしてから m_aを返す
for(int n=0; n<0x100000; ++n)
printf("");
return m_a;
}
private:
A m_a;
};
}

int main()
{
std::srand(std::time(NULL));
const int loop_times = 30;

B b;
{
// 1)参照を使わないでそのままアクセス
for(int n=0; n<loop_times; ++n)
std::cout << "type 1 :" << b.getA().getData() << std::endl;
}
{
// 2)参照を使ってアクセス
A &refA = b.getA();
for(int n=0; n<loop_times; ++n)
std::cout << "type 2 :" << refA.getData() << std::endl;
}
return 0;
}


 1)はかなり時間がかかりますが、2)は比較的速く処理が終わります。
 これは無駄なループを使っているので実際には意味がありませんが、
このように別のクラスが持つ情報へのアクセスを簡易・高速に、或いは可読性向上の為、
参照を使って別の名前をつけておくことは、よくあります。


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

Name: 組木紙織  ..上級者(18,569ポイント)   Date: 2007/07/15(日) 18:21   No:9310     
Title: Re:参照について(C++)    
GPGAさん、 Justyさんコメントありがとうございます。

独立参照(independent reference)という名前が出ているのは私が持っている書籍の中では
[独習C++]のなかだけなんですよね。
この中では
"繰り返しますが、この種の参照を使用する利点はほとんどありません。"
とかなり強調して、使わないほうがよいと書いてあり、私自身使い方を考えても利点が分からなかったので、
この筆者の意見と同一でした。
[プログラミング言語C++第3版]で参照のところを調べてみると、このタイプの参照に関して
何もコメントをしていないのもありますが。

このタイプの参照を使って読み込む場合の利点は分かりました。
書き込みの場合は、必要があるかどうか分かりませんが、その場合の利点を考えてみようを思います。


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

Name: tkmakwins15 [URL]  ..入門者(2,983ポイント)   Date: 2007/07/15(日) 18:56   No:9312     
Title: Re:参照について(C++)    
ただ、calloc()関数は使う価値はあると思います。それは、new演算子と違って
動的に確保したメモリ領域を、自動的に初期化してくれますので、calloc()に
ついてはmalloc()やnewと違ういいところがあると思います。

また、参照というのは、Cであればポインタを使って危険な手作業をして書い
ていたプログラムを、自動的に処理してくれる機構なのだと思います。だとす
れば、不正なメモリ領域のアクセスという、危険極まりなく、また見つかりに
くいバグを排除することが、可能になるのではないでしょうか。STLとして、
stringクラスを導入したのも、そのような理由があるのではないでしょうか。
charのポインタ型を使った終端文字式文字列には、どうしても不正なメモリア
クセスの危険がまとわりつきますから。ポインタをC++から出来るだけ排除し
ようという考え方に基づいて参照が導入されたのだと思います。


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

Name: Justy  ..ハッカー(136,076ポイント)   Date: 2007/07/15(日) 19:10   No:9313     
Title: Re:参照について(C++)    
私自身使い方を考えても利点が分からなかったので、この筆者の意見と同一でした

 先に組木紙織さんが提示されたサンプルで、無理矢理利点を挙げるとしたら

・ 同一変数を異なる用途で使い回す際の明示化
・ コンパイラへの最適化の妨害
・ 難読化

 くらいしか思いつきません・・・(これは利点なのか!?)。


 と、ぐぐってみたら
ttp://monpe.cliff.jp/computer/cpp/160_cpp_ed_doc.html

 こちらでも同じようにあまり使わない、と書いていますね。
 う〜ん、謎ですね。


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

Name: tkmakwins15 [URL]  ..入門者(3,316ポイント)   Date: 2007/07/15(日) 19:42   No:9315     
Title: Re:参照について(C++)    
よく考えてみたらポインタを使っても同一のプログラムは書けるのですよね…
例えばこの二つは同じ挙動をします。


#include<iostream>
using namespace std;

int main()
{
int x;
int *p_x = &x;
x = 3;
cout << x;
*p_x = 10;
cout << x << "," <<*p_x ;
return 0;
}


と、以下のプログラム


#include<iostream>
using namespace std;

int main()
{
int x;
int &p_x = x;
x = 3;
cout << x;
p_x = 10;
cout << x << "," << p_x ;
return 0;
}


まぁどっちのプログラムにも言えることといえばどちらも無駄な事してますよね…。
この形の参照は確かに使わないかな………。かといってC++でもしこのようなプログ
ラムを書くとしたら安全性は下のほうが大きいですね。


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

Name: Justy  ..ハッカー(136,314ポイント)   Date: 2007/07/16(月) 02:36   No:9324     
Title: Re:参照について(C++)    
calloc()関数は使う価値はあると思います
 とはいえ C++では使いどころが少ないですね。
 どうしても0初期化したければ後から明示的に std::memsetなりをすればいいですし、
 そもそも malloc/calloc/newが混在していると、どうやって確保したかを
そのポインタからは知る方法がないので、解放方法に混乱が生じるという問題もあります。


C++でもしこのようなプログラムを書くとしたら安全性は下のほうが大きいですね。ね
 Yes。
 p_x = 10とかやってしまう危険は少なくともなくなりますからね。


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

Name: tkmakwins15 [URL]  ..入門者(3,676ポイント)   Date: 2007/07/16(月) 02:58   No:9325     
Title: Re:参照について(C++)    
出来れば、C++にnewを実装する時に、動的配列の初期化ができるように
するべきですよね。newの動的配列にcallocのような初期化がないのは、
何かしらの技術面の問題があるからだと、本には載っていたのですが、
少なくともスカラ型に対してはそれができるように実装すべきだったと
僕は思います。結構変数の初期化を忘れてバグが発生したという事例は
あるので、自動的にそれができればだいぶその手のバグが減ると思いま
す。


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

Name: Justy  ..ハッカー(136,473ポイント)   Date: 2007/07/16(月) 03:19   No:9327     
Title: Re:参照について(C++)    
>newの動的配列にcallocのような初期化がないのは、 何かしらの技術面の問題があるからだと
 技術的な問題というか、遅くなる方を標準にするのは好ましくないからでしょう。
 C++が使える環境全てにおいて高速な CPUやメモリがあるわけではないので。

 それに C++は operator newをオーバーロードすることができるので、それを使えば
いかようにでも出来るので特に問題は無いのではないでしょうか。


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

Name: YuO  ..初心者(8,955ポイント)   Date: 2007/07/16(月) 08:36   No:9329     
Title: Re:参照について(C++)    
> ただ、calloc()関数は使う価値はあると思います。それは、new演算子と違って
> 動的に確保したメモリ領域を、自動的に初期化してくれますので、calloc()に
> ついてはmalloc()やnewと違ういいところがあると思います。

callocなんて使い道ほとんどないと思うのですが。
整数型のみからなる配列,構造体相手にしか使えない時点であまり意味がない……。
そもそも0に値をセットすることは初期化ではないですし。
# 初期値として本当に必要な値を設定することが初期化。calloc/memsetは決して初期化してはくれない。

そもそもC由来の記憶域制御関数を必要とする場面が全く思い浮かばない……。
ついでに,new[]を必要とする場面も。


> 出来れば、C++にnewを実装する時に、動的配列の初期化ができるように
> するべきですよね。

そもそもnew[]を使うことが皆無なので不要でしょう。
std::vector使えば初期値を設定できますし。


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

Name: tkmakwins15 [URL]  ..入門者(3,847ポイント)   Date: 2007/07/16(月) 10:17   No:9332     
Title: Re:参照について(C++)    
うーん、ただnewはクラスオブジェクトを作成する時に必要になるのではないでしょうか
deleteを使えばデストラクタが呼ばれるという事で、明示的になると思いますが、それに
僕はテンプレートはわかるのですがSTLについてはstringクラスしかまだわからず、vector
についてはよく分からないので、newによる動的配列で実装しているのです。vectorクラ
スがわかったらそれ使って動的配列実装しようと思いますが。


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

Name: YuO  ..中級者(9,120ポイント)   Date: 2007/07/16(月) 12:02   No:9333     
Title: Re:参照について(C++)    
> うーん、ただnewはクラスオブジェクトを作成する時に必要になるのではないでしょうか

new自体は使いますよ。
RAIIに則ってすぐにスマートポインタに格納しますが。

new[] (配列用のnew) を使わないだけです。


> deleteを使えばデストラクタが呼ばれるという事で、明示的になると思いますが、

deleteはコード中に出てくることはまずないですね。


> vectorクラスがわかったらそれ使って動的配列実装しようと思いますが。

std::vector「で実装する」んでじゃなく,std::vector「が実装そのもの」です。
わざわざ,
class DynamicArray<T>

{
private:
std::vector<T> data_;
public:
DynamicArray<T> (int size, const T & init = T()) : data_(size, init) {}

T& operator[] (int index) { return data_[index]; }
const T& operator[] (int index) const { return data_[index]; }
};

なんてクラス作るんだったら,std::vectorをそのまま使えばいいわけでして。


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

Name: tkmakwins15 [URL]  ..入門者(4,114ポイント)   Date: 2007/07/16(月) 14:23   No:9335     
Title: Re:参照について(C++)    
しかし、STLというのはあまりにも大きすぎて理解するのに相当の時間がかかると思います
STLがC++に追加された事で、ほぼ完璧にデバッグされたコードやデータ型を使う事ができる
という利点がありますが、その反面、C++の完全な習得が難しくなり、その上にC++の標準化
が遅延してしまったというあまりよくないことまでもたらしてしまったという欠点もあるの
ですよね。これ以上にC++が巨大化すると、個人でC++のコンパイラを作る事が、ほぼ不可能
になる気がします。ただ、C++に追加して欲しい仕様があります。それは64ビット整数のサポ
ートです。そうすれば、あと30年くらいしたら全世界中のC/C++で書かれたプログラムが誤作
動をするという2038年問題に、対応できると思います。(time_tを64ビット化すれば)


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

Name: YuO  ..中級者(9,650ポイント)   Date: 2007/07/16(月) 15:52   No:9336     
Title: Re:参照について(C++)    
> しかし、STLというのはあまりにも大きすぎて理解するのに相当の時間がかかると思います

大きいから理解するのに時間がかかることはないです。
時間がかかるとしたら,パラダイムシフトのためでしょう。
Generic-Programmingというプログラム手法を使っているため,それに慣れていない開発者が理解に時間がかかっているだけです。


> その反面、C++の完全な習得が難しくなり、

完全な習得とは?

プログラム言語は道具ですから,必要な部分だけ覚えて,後は仕様書でも見ながら使えばよいのです。


> これ以上にC++が巨大化すると、個人でC++のコンパイラを作る事が、ほぼ不可能
> になる気がします。

なぜ個人でC++コンパイラを作成することにこだわるのかがわかりませんが……。
現時点においても,文法の一部 (ぶっちゃけexport) を実装するためにはリンカサポートが必須になっています。
つまり,コンパイラを作成するだけではC++を実装しきれません。

はっきり言って,個人でC++コンパイラを作成できるかどうかは意味のない論です。
最終的に時間と個人の資質の問題に帰結されるので。


> そうすれば、あと30年くらいしたら全世界中のC/C++で書かれたプログラムが誤作
> 動をするという2038年問題に、対応できると思います。(time_tを64ビット化すれば)

time_tを32ビット整数で定義しなければいけないという規格もなければ,1970年1月1日起算でなければいけないという規格もありません。
現実に,VC++2005付属ライブラリではtime_tは64bit整数型です。

でもって,現時点でtime_tが32ビット整数で動いているプログラムが存在する以上,そのプログラムが稼働している場合に問題はおきます。
# 2000年問題を考えてみれば,30年後に動いていることは予測がつきます。


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

Name: tkmakwins15 [URL]  ..入門者(4,368ポイント)   Date: 2007/07/16(月) 16:59   No:9338     
Title: Re:参照について(C++)    
あっ、そうなんですか。VC++2005ではもうすでにtime_tを64bit化したんですね。
という事はlong long int型にも対応しているのでしょうか?


> time_tを32ビット整数で定義しなければいけないという規格もなければ,1970年1月1日起算でなければいけな>いという規格もありません。

>現時点でtime_tが32ビット整数で動いているプログラムが存在する以上,そのプログラムが稼働している場合
>に問題はおきます。

ただ、time_tが32bitである環境があるというのは、現時点ではなんら問題はなくても。将来的には問題を
起こしますよね。time_tの64bit化を規格に盛り込む事で、そういった問題を抱えたプログラムを、できる
だけ少なくした方が、結果的にいい方向に物事が進むと思います。ただ、結局64bit化したとしても、また
そのオーバーフロー期限が迫ってきたら、同じような論議になるのでしょうが…。


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

Name: 組木紙織  ..上級者(19,109ポイント)   Date: 2007/07/16(月) 17:16   No:9339     
Title: Re:参照について(C++)    
>個人でC++のコンパイラを作る事

このことは多分私のせいだと思います。
c++の仕様が大きいことの比喩として聞いたことがあって、印象に残っていたので使ったのですが。

>2038年問題
が近づくと、急にプログラムの修正の仕事がたくさん入って儲かる。。。

ことになったらいいなと密かにおもっているのですが。


> しかし、STLというのはあまりにも大きすぎて理解するのに相当の時間がかかると思います

理解するだけならそんなに時間はかからない。
覚えて使えるようにするとなると時間はかかる。
実際に仕事で使うとすると、覚えることに無意味に時間をかけれないので、
必要な部分だけ覚えて、後は仕様書を見ながら使う。

といったことだろうと思います。
STLにはある特定の分野でしか使わない部分(complexなど)
も数多くあるので、STLのすべてを使ったことがある人はほとんどいないはず。
という意味ではリストやベクタなどの良く使うものだけを覚えておけば十分だと思います。

#仕様を全部覚えているのが理想だとは思いますが。

それに言語なんて目的のための手段でしかないので、C++が苦手な分野をわざわざC++で書かずに、
目的にあった言語を選択していくのがベストだと思います。

>将来的には問題を 起こしますよね。

プログラムに完全な汎用性を求めるとひどいことになる。
と私は思っています。
数値型だって多くの桁数が必要な場合から、(少し桁数が少なくても)2進数に置き換えた時の誤差を嫌う
場合、更に高速の更に高速を求めている場合もありますので。
同じ数値型といっても求められている機能は目的によってだいぶ異なります。

プログラムを作る場合は目的にあったプログラムを目的に沿って作るのが一番良いと
思っています。
そのことで言うと、
将来的に問題を起こすことが分かっていても、求められているプログラムの動作期間はそんなに長くないので
無視、あるいは簡単な警告を出すだけにしよう。
と決めてプログラムを作ることを、
将来的に正しく動作しないことが分かっていても、
将来っていつまで?という根本的な問題が入ってくるので、
否定出来ないと思います。


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

Name: tkmakwins15 [URL]  ..入門者(4,592ポイント)   Date: 2007/07/16(月) 17:52   No:9343     
Title: Re:参照について(C++)    
ただ、僕の場合は、とんでもなく恐ろしい事に64bitをこえる128bit整数のライブラリを作ろう
と思ったぐらいですから、ただ、設計段階でどう足し算を実装しようかでだいぶ悩み、結局の
ところ挫折してしまいましたが…。趣味なので挫折しようが、いくら時間をかけようが別に問
題は生じないので。そもそも中学生なので、結構ヒマが多いのでゆっくりとやっています。


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

Name: YuO  ..初心者(8,402ポイント)   Date: 2007/07/16(月) 22:07   No:9348     
Title: Re:参照について(C++)    
> あっ、そうなんですか。VC++2005ではもうすでにtime_tを64bit化したんですね。
> という事はlong long int型にも対応しているのでしょうか?

long longは単に__int64の別名です。
# __int32はintの別名。
#include <iostream>

#include <typeinfo>
int main ()
{
std::cout << typeid(long long).name() << std::endl;
return 0;
}

というtest.cppについて,
>cl /EHsc test.cpp && test

Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.762 for 80x
Copyright (C) Microsoft Corporation. All rights reserved.

test.cpp
Microsoft (R) Incremental Linker Version 8.00.50727.762
Copyright (C) Microsoft Corporation. All rights reserved.

/out:test.exe
test.obj
__int64
となります。


> time_tの64bit化を規格に盛り込む事で、そういった問題を抱えたプログラムを、できる
> だけ少なくした方が、結果的にいい方向に物事が進むと思います。

だから,time_tのサイズについての規定なんて全く存在しないんですってば。
ISO/IEC 9899:1999 or INCITS/ISO/IEC 9899:1999 or JIS X 3010:2003の7.23.1の第3段落を読んで下さい。
# JIS X 3010:2003ならJISC行けば一応PDFが読めます。

規格に文句言うなら,規格を読むくらいはしないと話になりませんよ。


> が近づくと、急にプログラムの修正の仕事がたくさん入って儲かる。。。
> ことになったらいいなと密かにおもっているのですが。

Y2Kの時よりも難儀そうですけどね……。
UNIXの今より古いカーネルコードを読んで,とか。

でも,特需はありそうです。
2038-01-19T12:13:00+09:00から67secのカウントダウンで,2038-01-19T12:14:10+09:00を過ぎたタイミングで,
・何事もなく,安堵のため息が漏れる
→本当に何も起こらず,帰りに一杯引っかけて買える組
→実はシステム時間が遅れていて,1分後くらいに不意打ちで来てあたふた組
 に分裂
・何か起こって,緊急対策状態へ移行
・実はシステム時間が早まっていてて,すでに緊急対策状態へ移行している
の4パターンに分かれそうですが。


> STLにはある特定の分野でしか使わない部分(complexなど)
> も数多くあるので、STLのすべてを使ったことがある人はほとんどいないはず。

complexはSTLに入れるものでしょうかね……。
まぁ,標準ライブラリでもcomplexは使い方のわかりやすいほうでしょうけれど,
<locale>とか,普通使わないようなライブラリは……。
# まぁ,codecvtとか趣味で使ったことありますが……<ICUとか使う方がどう考えても賢い。


> という意味ではリストやベクタなどの良く使うものだけを覚えておけば十分だと思います。

STLだとコンテナ系と<algorithm>くらいですかね。
とりあえず
・std::vector<T>
・std::map<K, V>
・std::for_each
・std::find
・std::copy
・std::remove
・std::sort
・std::swap
・std::accumerate @ <numeric>
あたりの基本的な使い方がわかれば,よいかな,と思います。
アルゴリズムで重要なのは,左閉右開区間の反復子を渡すことと,std::removeなどは実際には削除しないことくらいでしょうか。

ちなみに,私の使う「STL」という用語は,ISO/IEC 14882:2003中の
・20.3 Function objects
・23 Containers library
・24 Iterators library,
・25 Algorithm library
・26.4 Generalized numeric operations
で定義されるものを指しています。
# 26.4は時々入らないこともあるのですが……。


> ただ、僕の場合は、とんでもなく恐ろしい事に64bitをこえる128bit整数のライブラリを作ろう
> と思ったぐらいですから

多倍長整数演算のクラスなら,ネット上に沢山転がっていますよ。
# というか,Boostに無いのが不思議。
32bit + 32bit => 64bitができるのであれば,
64bit + 64bit => 128bitもほぼ同じ実装でできるはず。
以下同じ。
というわけで,そのあたりはtempalteを賢く使うことで解決できそうな感じです。


1,248ポイント を落としてしまった。

Name: tkmakwins15 [URL]  ..入門者(4,821ポイント)   Date: 2007/07/16(月) 22:35   No:9352     
Title: Re:参照について(C++)    
>というわけで,そのあたりはtempalteを賢く使うことで解決できそうな感じです。

テンプレートですか!?いったいどのように応用するのでしょうか。

また、time_tのサイズですが、フリーのBCC++ 5.5では4byteだったので、僕の今使っ
ているコンパイラでは、2038年問題にそのまま直面するので。かといってこのまま
ではVisual Studio 2005 AEを購入した意味がないのですが、今趣味でやっている
ゲーム製作を、購入する前に始めてしまったのが、この問題に直面したわけなので
す。なので、ただ、Windows APIでは時間関係の整数型を64bitになっていれば、まぁ
問題はないのですが………。

また、C++の利点を最大限に生かそうとするならば、やはりC++を全て網羅するとはい
きませんがそれくらい学習し身につけたほうがC++にとって最良の方法でのコーディ
ングなどが可能になると思うのですが。僕の場合はいろいろと何か身につけたほうが
いいかなと思って、このC++の世界に入って、勉強しているので…


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

Name: Justy  ..ハッカー(136,888ポイント)   Date: 2007/07/16(月) 23:53   No:9358     
Title: Re:参照について(C++)    
 おっと、気が付けばスレが伸びてる・・・。


# YuOさん
というか,Boostに無いのが不思議
 非公式には boost::big_uintクラスなんてのがありました。
 でも何故か unsignedオンリー・・・。


# tkmakwins15さん
趣味でやっている ゲーム製作を、購入する前に始めてしまったのが
この問題に直面したわけなのです
 それはまたすごいね。
 2038年問題に引っかかる仕様のゲームを作ろうとしているわけですか。
 差し支えなければ教えて下さい。どういうゲームなのでしょうか?


Windows APIでは時間関係の整数型を64bitになっていれば
 WindowAPIの時間関連は年・月・日などがそれぞれ別変数になっているので、
理論的には60000年以上に対応できます。
 OSがきちんと正しい値を返すかどうかは別問題ですが。

http://support.microsoft.com/kb/436249/JA/


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

Name: tkmakwins15 [URL]  ..初心者(5,823ポイント)   Date: 2007/07/17(火) 01:04   No:9362     
Title: Re:参照について(C++)    
>おっと、気が付けばスレが伸びてる・・・。

確かに伸びてますね。このスレ入れて34件目なんですね…。これだったら
どっかでスレ分けるべきだったと後悔しています…。

>それはまたすごいね。
>2038年問題に引っかかる仕様のゲームを作ろうとしているわけですか。
>差し支えなければ教えて下さい。どういうゲームなのでしょうか?

内容は2DのRPGです。とりあえずこのまま作り、完成させてからVC++に移して
2038年問題に引っかからない仕様に、とりあえずする予定です。でも、そ
ういえば現在時刻の取得はCの time()でUTC取得→localetime()で日本時間
に直す作業をしなくても、Win32 APIのGetLocalTime()を使えば一発なんで
すよね…。また、time()を使うもう一つの訳は、プレイ時間の記録、というわ
けなのですけれども、これはtime_tがいくらオーバーフローを起こそうとも、
(2038年問題後も)次のようなコードは別に問題を起こさないんですよね↓


#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;

int main()
{
time_t start,finish;//処理を始めた時間と、処理を終えた時間の記録の変数
int count;
start = time();

//10億回乱数を計算させる
for(count=1;count<1000000000;count++){
cout<<rand();
}
finish = time();
cout<<(finish-start);
return 0;
}


結局、いくらオーバーフローを起こそうとも、引き算をすると逆にオーバーフローを起こす
ので、正確な数値が得られるという事があるので、現在時刻の取得に32bitのtime_tさえ使
わなければ、まぁ大丈夫だと思います。あーでもclock()のほうがいいのかな? clock()の場
合はCLOCK_PER_SECマクロで割る必要があるのですよね。また、プレイ時間がintの上限を超
えた時の対策は、今のところ思いつかないので、これはまた、じっくりと考えていくつもり
です。あと、time_tを64bitにすると、西暦で3000億年弱まで正常稼動するそうです。これは
宇宙の歴史の20倍ほどであるそうなので(ウィキペディアより)、今よりもコンピューター
が強力になったり、intが普通に128,256…bitと実装されてもおかしくはないですから。
64bit化が、現時点での一番の解決法だと僕は思います。

ちなみにゲーム開発には山田 巧氏のDxライブラリを使用させてもらっています。ただし、
このライブラリの目的であるメッセージ処理の簡素化については、この目的に反して、
プロシージャを書いたりしていますが…。Win32 APIの練習もかねてやってますので。


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

Name: Justy  ..ハッカー(137,118ポイント)   Date: 2007/07/17(火) 02:05   No:9366     
Title: Re:参照について(C++)    
内容は2DのRPGです
time()を使うもう一つの訳は、プレイ時間の記録、というわけなのです
プレイ時間がintの上限を超えた時の対策
 なるほど。
 ということであれば、その対策って本当に必要ですか?
 つまり、その頃までそのゲームを遊び続ける予定があるか、ってことですが。


次のようなコードは別に問題を起こさないんですよね
 Windowsの時計を 2038年にすればテストできますので実際にいろいろ試してみてはどうでしょうか。


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

Name: tkmakwins15 [URL]  ..初心者(5,879ポイント)   Date: 2007/07/17(火) 14:40   No:9381     
Title: Re:参照について(C++)    
よく考えてみればそこまで考える必要がないですね。int型の上限なんて
秒単位で記録しても、2038-1970として68→約60年分なので、こんなに長
い間同じゲームを同じデータでやり続ける人ってあまりいませんよね。


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

Name: 組木紙織  ..上級者(19,416ポイント)   Date: 2007/07/17(火) 23:16   No:9392     
Title: Re:参照について(C++)    
>テンプレートですか!?いったいどのように応用するのでしょうか。

こんなかんじでしょうか。確認などはしていませんが、感覚だけでもつかんでもらえたら。
符号なし整数型を使う場合しか考えていません。

template<typename U>
class Hoge
{
private:
U num[2];
public:
U operator+(U const & rhs);
};
template<typename U>
U Hoge<U>::operator+(U const &rhs)
{
U out;
out.[0] = this->num[0] + rhs.num[0]
out.[1] = this->num[1] + rhs.num[1]
//桁上がり考慮
out.[1] += (out.[0] < this->num[0] || out.[0] < rhs.num[0]) ? 1:0;

return out;
}


>ちなみに,私の使う「STL」という用語は
私は、単純に
C++の標準ライブラリのうちテンプレートを使うものをSTLと呼ぶと思っていました。


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

Name: tkmakwins15 [URL]  ..初心者(6,226ポイント)   Date: 2007/07/18(水) 00:52   No:9398     
Title: Re:参照について(C++)    
組木紙織さん::
これは足し算の実装なのですよね。とりあえず掛け算については、
これを掛ける数だけ繰り返す。というアルゴリズムで大丈夫だと
思うので…、しっかりと「多倍長整数」とググって見たらいろいろと
見つかって、それ参考にしながら作っています。

あと、長いプログラムを書こうと思ったら、僕の場合は、保守性を
考慮した上で、クラスを使ってのオブジェクト指向プログラミング
の効果を結構実感しています。特にゲームプログラミングでは、
機能毎にクラスを分けて、関係のありつつ、なおかつ機能を一つ
の関数でできるように、またベースとなる構造(骨組み)のクラスを
それから派生したクラスによって機能を強化していくというスタイ
ルは、結構保守性の向上に役立つと実感しています。(ゲームプロ
グラミングやりながらC++を使えるようになっている。今日ようや
く継承ができるようになった。)なので、C++はいい言語だと思いま
す。


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

Name: YuO  ..初心者(8,856ポイント)   Date: 2007/07/18(水) 11:08   No:9405     
Title: Re:参照について(C++)    
> >テンプレートですか!?いったいどのように応用するのでしょうか。
> こんなかんじでしょうか。

うーん,違います……。

template <unsigned bit_size> class Hoge;

template <unsigned bit_size> struct HogeTraits
{
typedef Hoge<bit_size / 2> BaseType;
};
template <> struct HogeTraits<64>
{
typedef unsigned long BaseType;
};
template <unsigned bit_size> class Hoge
{
public:
typedef typename HogeTraits<bit_size>::BaseType BaseType;
private:
BaseType data_[2];
public:
Hoge & operator+= (const Hoge & rhs)
{
if (std::numeric_limits<BaseType>::max() - data_[0] < rhs.data_[0]) {
// 桁上がり
++data_[1];
}
data_[0] += rhs.data_[0];
data_[1] += rhs.data_[1];
return *this;
}
};

一応,sizeは64以上で2の累乗でないといけなかったり,std::numeric_limitsの特殊化が必要だったりしますが,
# ついでにunsigned longが32bitであることも前提にしています。
こうやっておけばHoge<512>はHoge<256>を,Hoge<256>はHoge<128>を,Hoge<128>はHoge<64>を,Hoge<64>はunsigned longを,
それぞれ使って自動的に実装を生成してくれます。

組木紙織さんの方法では,Hoge<Hoge<Hoge<Hoge<unsigned long> > > >と書かないといけないので,使う側が大変です。


> >ちなみに,私の使う「STL」という用語は
> 私は、単純に
> C++の標準ライブラリのうちテンプレートを使うものをSTLと呼ぶと思っていました。

iostreamは通常STLに入れないですね。
std::basic_stringは微妙な線です。

ただ,STLという用語の範囲は人それぞれなので,自分の範囲を定義して提示しておかないと誤解を生む可能性を持っています。


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

Name: 組木紙織  ..上級者(19,696ポイント)   Date: 2007/07/18(水) 15:50   No:9408     
Title: Re:参照について(C++)    
YuOさま

これはまさしくテンプレートメタプログラミング。
私も現在勉強中ですが、なかなか難しくて大変です。

>template <> struct HogeTraits<64>

template <> struct HogeTraits<sizeof(unsigned long)>
とすれば
unsigned longが32であるという前提は、なくなるのですが、
今度は環境によって使える数字が違ったりする可能性が。
実際に使おうと思ったら変な数字を入れたらコンパイルエラーを出すようにしたほうがいいですね。

と思いますが、こんなのを作れるのは凄いです。

>これは足し算の実装なのですよね。とりあえず掛け算については、
>これを掛ける数だけ繰り返す。というアルゴリズムで大丈夫だと

実際にこのアルゴリズムを使うと、時間がかかるので、別のアルゴリズムを調べたほうが
いいと思います。
幸いにも調べたら他のアルゴリズムは出てくると思います。



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

Name: tkmakwins15 [URL]  ..初心者(6,396ポイント)   Date: 2007/07/18(水) 16:11   No:9409     
Title: Re:参照について(C++)    
>iostreamは通常STLに入れないですね

STLの定義とは何かという問題になるのですよね。C++の入出力
はiostreamを含むストリームによってしますが。この<<や>>は
数値、文字列、文字などの入出力に同じ要領で使えますし、ジ
ェネリックプログラミングの考え方がここにあるとしたら、
iostreamを入れるという考え方になると思いますし、アルゴリ
ズム、コンテナ、反復子によって定義される汎用データ型ライ
ブラリ。とするならば、iostreamはSTLではないという考え方
になると思いますが。ただ、C++のストリーム入出力をSTLとす
るのかは、正直僕にはわかりません。


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



Name: でぃず  ..ぴよぴよ(137ポイント)   Date: 2007/07/18(水) 09:01   No:9404       
Title: ファイルの比較    
こんにちは、初めて投稿させてもらいます。
こんなプログラムをつくりたいと思うのですが・・・
ファイルをA、B開く→その中身のある部分(中身は時間データ)を比較→時間が同値なら横にならべて表示
同じでなければ時間が合うまで、片方の表示をつづける(あったところから表示)
こんな感じです

ファイルA     ファイルB
12:00
12:01 12:01
12:02 12:02
.
.
.
説明がわかりづらいかと思いますが、ファイルを開いたあとある部分を比較する仕方がわかりません。


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




Name: たのもー  ..入門者(3,058ポイント)   Date: 2007/07/17(火) 02:29   No:9367       
Title: ゲームプログラミング    
こんにちは。 
今回は、ゲームプログラミングに関することです。
以下のソースをメイクし、実行するとウィンドウが開き、
水色の四角形が現れ、適当なキーを押すと終了するようなのですが、
私の場合、ウィンドウは開きますが水色の四角形など表れませんし、
キーを押しても終了せず、しばらくすると勝手に消えてしまいます。
メイクは普通にできます。
これを解消するにはどうすればよいのですか?
ご意見よろしくお願いしますm(_ _)m

  ↓ ↓ ソースです ↓ ↓

#include "DxLib.h"

int WINAPI WinMain(HINSTANCE hI, HINSTANCE hP, LPSTR lpC, int nC)
{
ChangeWindowMode(TRUE);
if(DxLib_Init() == -1) return(-1);
DrawBox(0, 0, 120, 120, 65535, TRUE);

WaitKey();
DxLib_End();
return(0);
}


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


Name: Justy  ..ハッカー(137,158ポイント)   Date: 2007/07/17(火) 12:50   No:9380     
Title: Re:ゲームプログラミング    
 WaitKey()の前に ScreenFlip()を入れたらどうなりますか?

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

Name: たのもー  ..入門者(3,095ポイント)   Date: 2007/07/17(火) 19:23   No:9384     
Title: Re:ゲームプログラミング    
Justyさん、お返事ありがとうございます。
何度も試してみましたが以前となんら変わりはありません。


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

Name: Justy  ..ハッカー(137,478ポイント)   Date: 2007/07/17(火) 20:53   No:9387     
Title: Re:ゲームプログラミング    
 となると

・ DrawBoxの行は実行されていますか?
 デバッガでブレークをかけるか、OutputDebugString()で何か出力するとか、どういう方法でもいいのですが
その行が確実に実行されていることを確かめて下さい。
(つまり DxLib_Init()に失敗して、-1が戻った為にその後の行が実行されなかったのでは
ないか、ということです)


・ ログはどうなっていますか?
 どこかに Log.txtというファイルが出来ていると思います。
 このログのどこかでエラーの記述があったりしませんか?


・ SetUseDirectDrawFlag関数を使う
  DxLib_Init()より前に SetUseDirectDrawFlag(FALSE)の1行を入れてみて下さい。


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

Name: たのもー  ..入門者(4,684ポイント)   Date: 2007/07/18(水) 00:11   No:9395     
Title: Re:ゲームプログラミング    
丁寧なお返事ありがとうございます。

>DrawBoxの行は実行されていますか?
ブレークすると、どうもDrwaBoxが実行されてないみたいでした。

デバッグ(ブレーク)という機能があるなんてはじめて知りました。

>ログはどうなっていますか?
これも始めて存在に気づきました。

で、結果なのですが、一応、下に載せさせていたいてますが
僕が見つけた、異常みたいものは
「現在の画面モードで使用できる描画デバイスが見つかりませんでした」
というものです。

>SetUseDirectDrawFlag関数を使う
>DxLib_Init()より前に SetUseDirectDrawFlag(FALSE)の1行を入れてみて下さい。

なんと成功いたしました。
ただ、水色ではなく白で表示されました。
なぜこの関数を使うと、成功したのでしょうか?
よろしければ教えてくださいm(_ _)m


  ↓ ↓ ログファイルです ↓ ↓

0:システムの情報を出力します
2: DXライブラリ Ver2.23
4: OS WindowsXP ( Build 2600 Service Pack 2 )
108: CPU動作速度:大体1.59GHz
111: MMX命令を使用します
112: CPUベンダ:GenuineIntel
122: CPU名: Mobile Intel(R) Celeron(R) CPU 1.60GHz
124:COMの初期化... 成功しました
141:メモリ総量:190.98MB 空きメモリ領域:50.18MB
143:タイマーの精度を検査します
145:精度結果 更新回数 マルチメディアタイマー:0 パフォーマンスカウンター:60
149: パフォーマンスカウンターを使用します タイマー分解能 : 3579.545000 KHz
153: ソフトの二重起動検査... 二重起動はされていませんでした
162:ウインドウクラスを登録します... 登録に成功しました
170:ウインドウモード起動用のウインドウを作成します
341:IMEを無効にしました
543:ウインドウスタイルをウインドウモード用に変更します... 完了
549:DirectInput関係初期化処理
550: DirectInput7 の取得中... 成功
641: 引き続き初期化処理... 初期化成功
646: ジョイパッドの初期化...
657: ジョイパッドの初期化は正常に終了しました
659: マウスデバイスの初期化... 初期化成功
663: キーボードデバイスの初期化... 初期化成功
671:DirectInput 関連の初期化は正常に終了しました
672:DirectSound の初期化を行います
675:DirectSound インターフェースの取得を行います.... 成功
684:引き続きインターフェースの初期化処理... 成功
987: DirectSound デバイスを列挙します
992: モジュール名: ドライバ記述:プライマリ サウンド ドライバ
993: モジュール名: smwdm.sys ドライバ記述:SoundMAX Digital Audio
996: 最大サンプリングレート:48.00KHz 最小サンプリングレート:8.00KHz
999: 総サウンドメモリ領域:0.00KB 空きサウンドメモリ領域:0.00KB

1000: 利用可能サンプリング精度
1002: プライマリ 16bit = OK 8bit = NO
1005: セカンダリ 16bit = OK 8bit = NO

1007: 利用可能チャンネル
1009: プライマリ MONO = OK STEREO = OK
1011: セカンダリ MONO = OK STEREO = OK

1013:DirectSound の初期化は正常に終了しました
1015:DirectDraw 関連の初期化を行います
1017: DirectDraw オブジェクトの取得を行います.... 成功
1028: 引き続き初期化処理... 初期化に成功しました
1040: ビデオカードの情報
1042: 画面モード変更処理を開始します
1138: 画面モードの変更処理を開始します 640 x 480 16 bit
1139: ウインドウモードにします
1141: 画面モードの変更は正常に終了しました
1143: カラー情報
1145: A:00000000 B:00ff0000 G:0000ff00 B:000000ff
1150: ウインドウスタイルをウインドウモード用に変更します... 完了
1155: 出力画面用の DirectDrawSurface を作成します
1168: 各スクリーンメモリの配置位置
1170: PrimaryBuffer : SYSTEMMEMORY
1173: BaskBuffer : SYSTEMMEMORY
1174: 出力画面用の DirectDrawSurface の作成は正常に終了しました
1176: Direct3D 関連の初期化を行います
1180: Direct3Dオブジェクトを取得します
1513: Direct3Dオブジェクトを取得しました
1515: 現在の画面モードで使用できる描画デバイスが見つかりませんでした
1517: グラフィック管理系の初期化を行います
1521: 3Dグラフィック描画機能は使用しません
1523: フォントの初期化を行います
1531: フォントの初期化は正常に終了しました
1533: グラフィック管理系の初期化は正常に終了しました
2975: サーフェス間転送には BltFast を使用します
2977: BitBlt:768416μs BltFast:667552μs
2979: スキャンラインの数:768

2982: 1フレーム当たりの時間は 0 msecです
2985: Tri00:0 msec
2987: Tri01:0 msec
2989: Tri02:0 msec
2991: Tri03:0 msec
2994: Tri04:0 msec
2996: Tri05:0 msec
2998: Tri06:0 msec
3003: Tri07:0 msec
3005: Tri08:0 msec
3006: Tri09:0 msec
3009: Tri10:0 msec
3014: Tri11:0 msec
3017: Tri12:0 msec
3019: Tri13:0 msec
3021: Tri14:0 msec
3023: Tri15:0 msec
3027: Tri16:0 msec
3028: Tri17:0 msec
3032: Tri18:0 msec
3034: Tri19:0 msec
3036: 画面モード変更処理は正常に終了しました
3043: オーバーレイサーフェスは使用しません
3046: DirectDraw 関連の初期化は正常に終了しました
3070: 文字コードバッファの初期化を行います... 完了しました
7141: DirectDraw 関連の終了処理をおこないます
7144: フォントの初期化を行います
7152: フォントの初期化は正常に終了しました
7154: グラフィック管理系の終了処理は正常に終了しました
7159: メインサーフェスを破棄をします... 完了しました
7162: DirectDrawオブジェクトを解放します
7167: DirectDrawオブジェクトを解放しました
7169: DirectDraw 関連の終了処理は正常に終了しました
7171: DirectInput 関連の終了処理... 完了
7190: DirectSound の終了処理は正常に終了しました
7193: ウインドウを閉じようとしています
7248: ウインドウが破棄されようとしています
7265: ソフトを終了する準備が整いました
8163:
8164: Alloc memory dump Total size:0(0.000kb) Alloc num:0
8170:


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

Name: Justy  ..ハッカー(137,808ポイント)   Date: 2007/07/18(水) 01:15   No:9399     
Title: Re:ゲームプログラミング    
>「現在の画面モードで使用できる描画デバイスが見つかりませんでした」
 このエラーは DxLibの内部で使われている DirectXの初期化(デバイスの列挙)時に
失敗したときのメッセージですね。
 どうして失敗したのかはわかりませんが・・・。


>ただ、水色ではなく白で表示されました
 なるほど。
 色の問題はわかりません。それについては本家のBBSで訊いた方がいいと思います。

 では、それは削除して元に戻した上で、代わりにSetNotUse3DFlag(FALSE)ではどうなりますか?
 やっぱり同じように動くことは動くけど、色が・・・でしょうか?


>なぜこの関数を使うと、成功したのでしょうか
 DirectDrawを使わないで描画するようになります。
 3D機能がオフになり、VRAMを使用しなくなります。
 その為パフォーマンスが落ちるかもしれませんが、互換性が上がるらしいです。


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

Name: たのもー  ..入門者(4,879ポイント)   Date: 2007/07/18(水) 02:33   No:9400 解決!     
Title: Re:ゲームプログラミング    
回答ありがとうございますm(_ _)m

>このエラーは DxLibの内部で使われている DirectXの初期化(デバイスの列挙)時に
>失敗したときのメッセージですね。

深く調べていくと、どうやらグラフィックカードがおかしいらしいです。
それ以上はわかりませんでしたが、これからも調べていきたいと思います。



>代わりにSetNotUse3DFlag(FALSE)ではどうなりますか?

WaitKey()は、働いていますが、四角形は表示されませんでした。



>DirectDrawを使わないで描画するようになります。
>3D機能がオフになり、VRAMを使用しなくなります。

ということは、DirectXの初期化に成功しないと3D機能は利用できないということですね。



親切な回答ありがとうございましたm(_ _)m


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



Name: けるびん  ..ぴよぴよ(53ポイント)   Date: 2007/07/16(月) 17:46   No:9340       
Title: ・デスクトップやWindowsをかっこよくカスタマイズする事について    
特に急いでる質問とかではないんですが、この掲示板で載せてあったことについて質問です。
タイトルので言った様に、かっこよくカスタマイズしたいんですが、どなたか教えてください。


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


Name: 管理人 [URL]  ..伝説のハッカー(382,788ポイント)   Date: 2007/07/16(月) 21:35   No:9346     
Title: Re:・デスクトップやWindowsをかっこよくカスタマイズする事について    
使われているOSは何ですか?
単に以前私はWindowsBlindsとか使ってXPをきれいにデコレートしていたんですが、
vistaではやってません。

今見てみたところ、私が使っていた頃とずいぶんHPがかわっているようで・・。
windowsBlindsは無料でインストール出来ます。
スキンは無料でデスタからダウンロードできます。
http://www.desta.jp/category_list.php?page=1&category=5&sort=new

ここからスキンをダウンロードできます。
ものすごい量のスキンがありますので、どれだけ使っても飽きることはないと思います。
例えばこんなスキンをダウンロードすると、

http://www.desta.jp/detail.php?id=2908&category=267

ソフトがインストールされていたらダブルクリックだけでウィンドウなどのスキンが変更できます。
上記リンク先をみるとオブジェクトなんかの置き方もわかりますよ。
マックのウィンドウはよくオブジェクトというか大きなアイコンがありますけど、あんなものも出来ますし、
vistaが出たので珍しくなくなりましたがデスクトップの右側に写真スクロールや天気予報、時計なんかを配置することも出来ます☆

インターフェイスに飽きたらwindowsblindsで結構遊べますよ^^


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

Name: けるびん  ..ぴよぴよ(96ポイント)   Date: 2007/07/18(水) 00:22   No:9396 解決!     
Title: Re:・デスクトップやWindowsをかっこよくカスタマイズする事について    
管理人さんありがとうございます。僕のはXPなんでいろいろやりがいがあって楽しいです。

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



Name: タケ  ..ぴよぴよ(334ポイント)   Date: 2007/07/17(火) 23:41   No:9394       
Title: 乗換検索をつくる    
質問です。
大学の課題で時刻表及び所要時間、料金についてのデータ(エクセル)から、
時間優先と料金優先で検索するプログラムを作るという課題が出ました。

細かい内容は自分で何とか頑張ってみようと思うのですが、
大まかな方針すら決まりません。
どのようなやり方が考えられるか概要でいいので教えてください。
お願いします。


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




Name: Bose  ..かけだし(1,134ポイント)   Date: 2007/07/15(日) 18:41   No:9311       
Title: 引数として2次元配列を関数に渡したい    
C言語の初心者です.
2次元配列を引数に持つ関数を作成したいです.
具体的には以下のようなプログラムを作成しました.

#include<stdio.h>

void TCMap();
void EngineMap();
int Search_i(double map[][],int j,int i_mim,int i_max,double x);

double enginemap[18][2];
double tcmap[15][3];

int main(void){

int i_now,i_now2;

TCMap();//配列に値を代入
EngineMap();//配列に値を代入

i_now = Search_i(enginemap[][],0,0,17,1850);//i_now = 10のはず
i_now2 = Search_i(tcmap[][],3,0,14,500);//i_now2 = 9のはず

printf("%f,%f\n",i_now,i_now2);

return 0;
}

int Seacrh_i(double map[][],int j,int i_min,int i_max,double x){
int i;
if(map[i_min][j]<map[i_max][j]){//単調増加のとき
for(i=0;i<i_max+1;i++){
if(x<map[i_min][j]){//最小値以下ならi=i_min;
i = i_min;
break;
}
else if(x>map[i_max][j]){//最大値以上ならi=i_max
i = i_max;
break;
}
else if(x<map[i][j]){//
i = i;
break;
}
}
}
else if(map[i_min][j]>map[i_max][j]){//単調減少の時
for(i=0;i<i_max+1;i++){
if(x>map[i_min][j]){//最大値以上ならi=i_min
i = i_min;
break;
}
else if(x<map[i_max][j]){//最小値以下ならi=i_max;
i = i_max;
break;
}
else if(x>map[i][j]){
i = i;
break;
}
}
}
return(i);
}

void TCMap(){
int i,j;
FILE *file;
double a;
printf("トルコン領域マップ\n");
file = fopen("TCOutputTorque.csv","r");
for(i=0;i<15;i++){
for(j=0;j<3;j++){
fscanf(file,"%lf,",&a);
tcmap[i][j] = a;
printf("tcmap[%d][%d] = %4.1f,",i,j,tcmap[i][j]);
}
printf("\n");
}
fclose(file);
}

void EngineMap(){
int i,j;
FILE *file;
double a;
printf("エンジン特性マップ\n");
file = fopen("TCInputTorque.csv","r");
for(i=0;i<18;i++){
for(j=0;j<2;j++){
fscanf(file,"%lf,",&a);
enginemap[i][j] = a;
printf("enginemap[%d][%d] = %4.1f,",i,j,enginemap[i][j]);
}
printf("\n");
}
fclose(file);
}

ここでSearch_i(...)に要素数の異なる配列enginemap[][]とtcmap[][]の両方を引数として渡したいのです.
しかしエラーが出てしまい,引数として要素数の異なる2次元配列を渡せません.
少し調べたのですが,
int f(double[][5],...)
のように配列の第2要素の個数を指定する方法しかわかりませんでした.
これではenginemap[18][2]とtcmap[15][3]の第2要素の個数が(2個,3個と)異なっているので困ります.
どのように修正すべきでしょうか?


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


Name: box  ..比類無きプログラマー(80,109ポイント)   Date: 2007/07/16(月) 00:50   No:9319     
Title: Re:引数として2次元配列を関数に渡したい    

配列のかわりに動的メモリ確保を使ってみた例です。
TCMap()とEngineMap()のロジックが同等でしたので、1つにまとめてみました。

コンパイルは通っていますが、データファイルが手元にないので
実行は試せていません。


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

#define LEN (80)

typedef struct param {
int param1;
int param2;
} Param;

typedef struct kind {
char filename[LEN];
char message[LEN];
Param param;
} Kind;

void mapFunction(Kind kind, double ***map);
int Search_i(double **map, int j, int i_min, int i_max, double x);

int main(void)
{
double **map[2];
Kind kind[2] = {
{ "TCOutputTorque.csv", "トルコン領域マップ", { 15, 3 }, },
{ "TCInputTorque.csv", "エンジン特性マップ", { 18, 2 }, },
};
int i_now, i_now2;
int i, j;

mapFunction(kind[0], &map[0]);
mapFunction(kind[1], &map[1]);

i_now = Search_i(map[1], 0, 0, kind[1].param.param1-1, 1850); //i_now = 10のはず
i_now2 = Search_i(map[0], kind[0].param.param2-1, 0, kind[0].param.param1-1, 500); //i_now2 = 9のはず
printf("%d,%d\n", i_now, i_now2);

for (i = 0; i < 2; i++) {
for (j = 0; j < kind[i].param.param1; j++)
free(map[i][j]);
free(map[i]);
}
return 0;
}

int Search_i(double **map, int j, int i_min, int i_max, double x)
{
int i;

if (map[i_min][j] < map[i_max][j]) { //単調増加のとき
for (i = 0; i < i_max+1; i++) {
if (x < map[i_min][j]) { //最小値以下ならi=i_min;
i = i_min;
break;
}
else if (x > map[i_max][j]) { //最大値以上ならi=i_max
i = i_max;
break;
}
else if (x < map[i][j]) {
break;
}
}
}
else if (map[i_min][j] > map[i_max][j]) { //単調減少の時
for (i = 0; i < i_max+1; i++) {
if (x > map[i_min][j]) { //最大値以上ならi=i_min
i = i_min;
break;
}
else if (x < map[i_max][j]) { //最小値以下ならi=i_max;
i = i_max;
break;
}
else if (x > map[i][j]) {
break;
}
}
}
return i;
}

void mapFunction(Kind kind, double ***map)
{
int i, j;
FILE *file;

printf("%s\n", kind.message);
file = fopen(kind.filename, "r");
if (!file)
fprintf(stderr, "%s open error\n"), exit(1);

*map = (double **) malloc(sizeof(double *) * kind.param.param1);
if (!*map)
fprintf(stderr, "out of memory\n"), exit(1);
for (i = 0; i < kind.param.param1; i++) {
*map[i] = (double *) malloc(sizeof(double) * kind.param.param2);
if (!*map[i])
fprintf(stderr, "out of memory\n"), exit(1);
for (j = 0; j < kind.param.param2; j++) {
fscanf(file, "%lf", map[i][j]);
printf("map[%d][%d] = %4.1f,", i, j, *map[i][j]);
}
printf("\n");
}
fclose(file);
}


2倍のポイントを手に入れた! 1,956ポイント を手に入れた。

Name: bose  ..ぴよぴよ(37ポイント)   Date: 2007/07/16(月) 16:32   No:9337 解決!     
Title: Re:引数として2次元配列を関数に渡したい    
box さん,回答ありがとうございます.
無事目的が果たせました.

しかし動的メモリ確保ですか...そのようなものは知りませんでした.
勉強して使いこなしたいものです.

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


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

Name: YuO  ..初心者(8,492ポイント)   Date: 2007/07/16(月) 22:13   No:9350     
Title: Re:引数として2次元配列を関数に渡したい    
> ここでSearch_i(...)に要素数の異なる配列enginemap[][]とtcmap[][]の両方を引数として渡したいのです.
> しかしエラーが出てしまい,引数として要素数の異なる2次元配列を渡せません.
> 少し調べたのですが,
> int f(double[][5],...)
> のように配列の第2要素の個数を指定する方法しかわかりませんでした.
> これではenginemap[18][2]とtcmap[15][3]の第2要素の個数が(2個,3個と)異なっているので困ります.
> どのように修正すべきでしょうか?

環境にも依るのですが,標準Cの範囲内であれば,
int f (int m, double [][m], ...)
のようにすればよいと思いますが。
古いCではコンパイル通りませんけどね。
# 標準C = ISO/IEC 9899:1999,古いC = ISO以前のCおよびISO/IEC 9899:1990とかISO/IEC 9899/AMD 1:1995とか。


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

Name: Hermit  ..中級者(11,094ポイント)   Date: 2007/07/16(月) 23:22   No:9354     
Title: Re:引数として2次元配列を関数に渡したい    
古い C では
 

int Search_i( m, map, j, i_min, i_max, x)
int m; /* YuO さんのと同じ使い方ね。 */
double map[];
int j;
int i_min;
int i_max;
double x;
{
if (map[i_min * m + j] < map[i_max * m + j]) {



の様にしていました。
昔も今も、配列は連続で確保と決まっているので。

PS.
プロトタイプ宣言で、二次元配列と一次元配列の違いでエラーになったかどうか不安だったので
OLD C で書いてみましたが・・・基本的には同じなので。


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

Name: Boze  ..ぴよぴよ(90ポイント)   Date: 2007/07/17(火) 23:20   No:9393     
Title: Re:引数として2次元配列を関数に渡したい    
YuOさん,Hermitさんご回答ありがとうございます.
当初は box さんに回答頂いた動的メモリ確保の方法でもできるんですね.
まだまだ勉強不足の私にはこちらの方が合ってると思います.

できればboxさんに教えて頂いた方法も身につけたいものです.

丁寧な解説ありがとうございました.


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



Name: Lbfuvab  ..入門者(4,528ポイント)   Date: 2007/07/17(火) 17:17   No:9382       
Title: 文字の描画    
SDKで簡単なチェスのプログラムを作ろうと思って試作品を作ったのですが文字の背景で白く消えてしまいます。
どうしたらいいのでしょう。

#include <windows.h>


LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp);
ATOM InitApp(HINSTANCE hInst);
BOOL InitInstance(HINSTANCE hInst, int nCmdShow);
void DrawChessboard(HDC,short,short);
BOOL GetCurPos(short*,short*,LPARAM);

char szClassName[] = "WinChess"; //ウィンドウクラス
char *kihu[8][8]={
{"r","p","","","","","P","R"},
{"n","p","","","","","P","N"},
{"b","p","","","","","P","R"},
{"q","p","","","","","P","Q"},
{"k","p","","","","","P","K"},
{"b","p","","","","","P","B"},
{"n","p","","","","","P","N"},
{"r","p","","","","","P","R"}};
int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst,LPSTR lpsCmdLine, int nCmdShow){
MSG msg;
BOOL bRet;

if (!InitApp(hCurInst))
return FALSE;
if (!InitInstance(hCurInst, nCmdShow))
return FALSE;
while ((bRet=GetMessage(&msg, NULL, 0, 0))!=0) {
if (bRet == -1) {
break;
}
else{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int)msg.wParam;
}


//ウィンドウ・クラスの登録

ATOM InitApp(HINSTANCE hInst){
WNDCLASSEX wc;
wc.cbSize=sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
wc.lpfnWndProc=WndProc; //プロシージャ名
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hInstance=hInst;//インスタンス
wc.hIcon=(HICON)LoadImage(NULL,
MAKEINTRESOURCE(IDI_APPLICATION),
IMAGE_ICON,
0,
0,
LR_DEFAULTSIZE | LR_SHARED);
wc.hCursor=(HCURSOR)LoadImage(NULL,
MAKEINTRESOURCE(IDC_ARROW),
IMAGE_CURSOR,
0,
0,
LR_DEFAULTSIZE | LR_SHARED);
wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName=NULL; //メニュー名
wc.lpszClassName=(LPCSTR)szClassName;
wc.hIconSm=NULL;

return (RegisterClassEx(&wc));
}

//ウィンドウの生成

BOOL InitInstance(HINSTANCE hInst, int nCmdShow){
HWND hWnd;

hWnd=CreateWindow(szClassName,
"Winchess", //タイトルバーにこの名前が表示されます
WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME & ~WS_MAXIMIZEBOX,
50, //X座標
50, //Y座標
450, //幅
450, //高さ
NULL, //親ウィンドウのハンドル、親を作るときはNULL
NULL, //メニューハンドル、クラスメニューを使うときはNULL
hInst, //インスタンスハンドル
NULL);
if (!hWnd)
return FALSE;
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
//座標特定
BOOL GetCurPos(short *x,short *y,LPARAM lp){
POINTS point;
int temp;

point=MAKEPOINTS(lp);
if(point.x<10 || point.x>410 || point.y<10 || point.y>410)return FALSE;
temp=(point.x-10)%50;
temp=point.x-10-temp;
*x=temp/50;

temp=(point.y-10)%50;
temp=point.y-10-temp;
*y=temp/50;
return TRUE;
}
//チェス盤の描画
void DrawChessboard(HDC hdc,short x,short y){
int i,j;
HPEN hBoldPen,hOldPen;
HBRUSH hOldBrush,hNullBrush,hGreenBrush;
HFONT hFont,hOldFont;
//初期化
hBoldPen=CreatePen(PS_SOLID,5,RGB(255,0,0));
hNullBrush=(HBRUSH)GetStockObject(NULL_BRUSH);
hGreenBrush=CreateSolidBrush(RGB(0,140,20));
hOldBrush=(HBRUSH)SelectObject(hdc,hGreenBrush);
hFont=CreateFont(35,0,0,0
,FW_SEMIBOLD
,FALSE,FALSE,FALSE
,SHIFTJIS_CHARSET
,OUT_DEFAULT_PRECIS
,CLIP_DEFAULT_PRECIS
,DEFAULT_QUALITY
,DEFAULT_PITCH | FF_DONTCARE
,"MS ゴシック");
hOldFont=(HFONT)SelectObject(hdc,hFont);
//初期化終了
for(i=0;i<8;i++){
for(j=0;j<8;j++){
if((i+j)%2)SelectObject(hdc,hGreenBrush);
else SelectObject(hdc,hOldBrush);
Rectangle(hdc,10+i*50,10+j*50,60+i*50,60+j*50);
}
}
hOldPen=(HPEN)SelectObject(hdc,hBoldPen);
SelectObject(hdc,hNullBrush);
Rectangle(hdc,10+x*50,10+y*50,60+x*50,60+y*50);
for(i=0;i<8;i++){
for(j=0;j<8;j++){

TextOut(hdc,27+i*50,17+j*50,(LPCTSTR)kihu[i][j],1);
}
}
//終了処理
SelectObject(hdc,hOldPen);
SelectObject(hdc,hOldBrush);
SelectObject(hdc,hOldFont);
DeleteObject(hFont);
DeleteObject(hGreenBrush);
DeleteObject(hBoldPen);
}
//ウィンドウプロシージャ
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp){
PAINTSTRUCT ps;
HDC hdc;
static POINTS zahyo={0,0};

switch (msg) {
case WM_PAINT:
hdc=BeginPaint(hWnd,&ps);
DrawChessboard(hdc,zahyo.x,zahyo.y);
EndPaint(hWnd,&ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_LBUTTONDBLCLK:
if(GetCurPos(&zahyo.x,&zahyo.y,lp))
InvalidateRect(hWnd,NULL,TRUE);
break;
default:
return (DefWindowProc(hWnd, msg, wp, lp));
}
return 0;
}


2,145ポイント を手に入れた。


Name: Justy  ..ハッカー(137,217ポイント)   Date: 2007/07/17(火) 18:01   No:9383     
Title: Re:文字の描画    
 SetBkMode(hdc , TRANSPARENT);
 をどこかに入ればいいんじゃないかと。

背景色とモード
http://wisdom.sakura.ne.jp/system/winapi/win32/win21.html


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

Name: Lbfuvab  ..入門者(4,590ポイント)   Date: 2007/07/17(火) 22:31   No:9391     
Title: Re:文字の描画    
有難うございました。
SetBkMode(hdc,TRANSPARENT);を文字描画の直前に入れておきます。
返す返すも有難うございました。


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



Name: nao  ..ぴよぴよ(213ポイント)   Date: 2007/07/17(火) 20:04   No:9386       
Title: ダブルポインタがうまく動作しない    
ご教授お願いしますm(__)m

目的:main関数に空ポインタを作り、それを関数へ引数としてそのアドレスを渡す。
   渡されたポインタに5つのポインタ変数を連番でつくり、そこのポインタ変数に構造体の先頭アドレスを
   入れる。
   アドレスをいれられて戻ってきたmain関数でその構造体の中身を出したり書き換えたりしたい。

というものなのですが、main関数に帰ってきた後、そのデータをいざ使おうとしても中身はぐちゃぐちゃに
なっておりうまくいきません。
何がおかしいかご教授願います。

typedef struct {
int x,y,xx,yy;
} AA;


void sub(AA **a)
{
int i;
*a = (AA *) malloc(sizeof(AA*) * 5);
for (i = 0; i < 5; i++) {
a[i] = (AA*) malloc(sizeof(AA));
memset(a[i],0,sizeof(AA));
}


}

void main(void)
{
AA *a;
sub(&a);
a[3].x = 2;
}


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


Name: フリオ  ..中級者(14,210ポイント)   Date: 2007/07/17(火) 21:45   No:9388     
Title: Re:ダブルポインタがうまく動作しない    
 
 ソースは"pre"タグで字下げしてほしい。

 こういうことでしょうか?


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

typedef struct{
int x,y,xx,yy;
} AA;

int sub(AA ***a)
{
int i;

if(!(*a = (AA **)malloc(sizeof(AA *) * 5))) return 0;
for (i = 0; i < 5; i ++){
if(!((*a)[i] = (AA *)malloc(sizeof(AA)))) return 0;
}
return 1;
}

void freeAA(AA **a)
{
int i;

for(i = 0; i < 5; i ++){
free(a[i]);
}
free(a);
return;
}

int main(void)
{
AA **a;

if(!sub(&a)) return 1;
a[3]->x = 2;
a[3]->y = 3;
a[3]->xx = 4;
a[3]->yy = 5;
printf("%d %d %d %d\n", a[3]->x, a[3]->y, a[3]->xx, a[3]->yy);
freeAA(a);
return 0;
}


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

Name: nao  ..ぴよぴよ(173ポイント)   Date: 2007/07/17(火) 22:01   No:9389 解決!     
Title: Re:ダブルポインタがうまく動作しない    
なるほど…
(*a)[i]とすることにより解決したんですね(´д`;
ありがとうございましたm(__)m


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

Name: フリオ  ..中級者(14,223ポイント)   Date: 2007/07/17(火) 22:10   No:9390     
Title: Re:ダブルポインタがうまく動作しない    
 
> (*a)[i]とすることにより解決したんですね

 違うんだけど・・・
 


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



Name: マルクス  ..ぴよぴよ(813ポイント)   Date: 2007/07/12(木) 05:19   No:9242       
Title: 線形リストのソート    
はじめまして。今回教えてほしいことなのですがリストをつくってランク順に並べるという方法なのですが
リストを作成してソートする方法はできるのですがノードを作成して適切な場所に挿入する方法がいまいち
わかりません;;
一応ソースはこのようになりました。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct List {
char Number[10];
char rank;
struct List *next;
} rankNode;


/*
makeNewNode()関数:新しいノードを作成する関数
*/
rankNode *NewNode( void ) {
rankNode *newNode;

newNode = (rankNode *)malloc( sizeof( rankNode ) );
newNode->next = NULL;
return( newNode );
}

/*
insertNext()関数:引数で渡されたノードの後ろに新しいノードを追加する
*/
void insertNext( rankNode *curNode, char *pId, char cGrade ) {
rankNode *newNode;

newNode = NewNode();

/* 新しいノードにデータをコピー */
strcpy( newNode->Number, pId );
newNode->rank = cGrade;

newNode->next = curNode->next;
curNode->next = newNode;
}

/*
insertFirst()関数:最初のノードの前に新しいノードを追加する
*/
rankNode *insertFirst( rankNode *firstNode, char *pId, char cGrade ) {
rankNode *newNode;

newNode = NewNode();

/* 新しいノードにデータをコピー */
strcpy( newNode->Number, pId );
newNode->rank = cGrade;

newNode->next = firstNode;
firstNode = newNode;

return( firstNode );
}


int main( void ) {
int i;
char Number[10];
char rank;
FILE *pFile;

rankNode *pTop;
rankNode *pNow;

/* データファイルを開く */
pFile = fopen( "rank.txt", "r" );
if( pFile == NULL ) {
printf( "Error!!! \n" );
return( 2 );
}

pTop = NULL;

/* ファイルの終わりまで読み込み,リストの最初に追加する */
while( fscanf( pFile, "%s %c", Number, &rank ) != EOF ) {
/* ノードがない場合 */
if( pTop == NULL ) {
pTop = insertFirst( pTop, Number, rank );
}
/* ノードが1つの場合 */
else if( pTop->next == NULL ) {
if( pTop->rank > rank ) {
pTop = insertFirst( pTop, Number, rank );
}
else{
insertNext( pTop, Number, rank );
}
}
/* ノードが2つ以上の場合 */
else {

}
}

return( 0 );
}
ノードがないときと1つの時はできたのですが
ノードを2つ以上ある時の挿入方法がいまいちわからないのです。
ちなみにrank.txtの内容はこんなかんじです。
番号  ランク
001 C
002 A
003 B
004 C
005 D
よろしくお願いします。


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


Name: box  ..比類無きプログラマー(77,710ポイント)   Date: 2007/07/12(木) 18:37   No:9250     
Title: Re:線形リストのソート    
同一ランク(今回の場合はC)の場合にどういう並び順に
したいかを含めて、希望されている結果を提示してください。

なお、ダミーノードの考え方を使うと、リスト構造のどこに
挿入するかを考えるのが多少楽になります。
先頭かどうかを意識する必要性が減るか、あるいは
全く意識しなくてよくなりますので。


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

Name: マルクス  ..ぴよぴよ(941ポイント)   Date: 2007/07/12(木) 21:03   No:9255     
Title: Re:線形リストのソート    
返信ありがとうございます@@
少し説明不足でしたが結果は
002 A
003 B
001 C
004 C
005 D
のように同ランクの場合は後から追加したものを
先に追加した同ランクの後ろについかします。

ダミーノードという考えは初めて?聞きました。
すこし調べてきます・・・・orz


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

Name: box  ..比類無きプログラマー(77,791ポイント)   Date: 2007/07/12(木) 21:36   No:9258     
Title: Re:線形リストのソート    
リスト構造について説明しているサイトはたくさんありますが、
私が知っている中で比較的わかりやすかったところを挙げておきます。
よかったら行ってみてください。

http://tdweb.cssa.chs.nihon-u.ac.jp/ds/ds03.html
http://tdweb.cssa.chs.nihon-u.ac.jp/ds/ds04.html

ds04の方で、ダミーノードについて説明しています。


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

Name: マルクス  ..かけだし(1,859ポイント)   Date: 2007/07/16(月) 03:11   No:9326     
Title: Re:線形リストのソート    
返信遅くなりました。結果を表示する関数などを追加して新たにつくってみたのですがうまくいきません。
ちなみにこれがソースです。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct List {
char Number[10];
char rank;
struct List *next;
} rankNode;


/*
makeNewNode()関数:新しいノードを作成する関数
*/
rankNode *NewNode( void ) {
rankNode *newNode;

newNode = (rankNode *)malloc( sizeof( rankNode ) );
newNode->next = NULL;
return( newNode );
}

/*
insertNext()関数:引数で渡されたノードの後ろに新しいノードを追加する
*/
void insertNext( rankNode *curNode, char *pId, char cGrade ) {
rankNode *newNode;

newNode = NewNode();

/* 新しいノードにデータをコピー */
strcpy( newNode->Number, pId );
newNode->rank = cGrade;

newNode->next = curNode->next;
curNode->next = newNode;
}

/*
insertFirst()関数:最初のノードの前に新しいノードを追加する
*/
rankNode *insertFirst( rankNode *firstNode, char *pId, char cGrade ) {
rankNode *newNode;

newNode = NewNode();

/* 新しいノードにデータをコピー */
strcpy( newNode->Number, pId );
newNode->rank = cGrade;

newNode->next = firstNode;
firstNode = newNode;

return( firstNode );
}

/*
traverseList()関数:リストを走査する
引数
gradeNode *firstNode:最初のノードのアドレス
返値
なし
*/
void printfList( rankNode *firstNode ) {
rankNode *nowNode;

/* 最初のノードを見るようにする */
nowNode = firstNode;

/* 現在見ているノードがNULL(リストの最後)になるまで繰り返す */
while( nowNode != NULL ) {

printf( "Number=%s, rank=%c, \n",
nowNode->Number, nowNode->rank);

nowNode = nowNode->next; /* 次のノードを見るようにする */
}
}

int main( void ) {
int i;
char Number[10];
char rank;
FILE *pFile;

rankNode *pTop;
rankNode *pNow;

/* データファイルを開く */
pFile = fopen( "rank.txt", "r" );
if( pFile == NULL ) {
printf( "Error!!! \n" );
return( 2 );
}

pTop = NULL;

/* ファイルの終わりまで読み込み,リストの最初に追加する */
while( fscanf( pFile, "%s %c", Number, &rank ) != EOF ) {
/* ノードがない場合 */
if( pTop == NULL ) {
pTop = insertFirst( pTop, Number, rank );
}
/* ノードが1つの場合 */
else if( pTop->next == NULL ) {
if( pTop->rank > rank ) {
pTop = insertFirst( pTop, Number, rank );
}
else{
insertNext( pTop, Number, rank );
}
}
/* ノードが2つ以上の場合 */
else {
pNow=pTop;
if( pTop->rank > rank )
pTop=insertFirst( pTop, Number, rank);
else if( pTop->rank == rank){
while(pNow!=NULL){
if(pNow->next!=NULL && pNow->next->rank==rank)
pNow=pNow->next;
else break;
}
insertNext(pNow,Number,rank);
pNow=pTop;
}
else
while(pNow!=NULL){
if(pNow->next!=NULL && pNow->next->rank<=rank)
pNow=pNow->next;
else break;
}
insertNext(pNow,Number,rank);
pNow=pTop;
}
}
printfList(pTop);
return( 0 );
}

それでrank.txtの中身は下でしめしますが
001 C
002 A
003 B
004 C
005 D
006 B
007 A
008 D
です。
しかし表示が
Number=002, rank=A
Number=007, rank=A
Number=007, rank=A
Number=003, rank=B
Number=006, rank=B
Number=001, rank=C
Number=004, rank=C
Number=005, rank=D
Number=008, rank=D
となってしまいます。
なぜか重複?するのがでてきてしまいます。。。。(Number007が2つ。。。orz)
どこがおかしいのかお分かりでしたら教えてください、お願いします<(__)>


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

Name: box  ..比類無きプログラマー(80,375ポイント)   Date: 2007/07/16(月) 08:40   No:9331     
Title: Re:線形リストのソート    

main()で、ノードが2つ以上の場合の処理に問題があります。

else
while(pNow!=NULL){
if(pNow->next!=NULL && pNow->next->rank<=rank)
pNow=pNow->next;
else break;
}
insertNext(pNow,Number,rank);
pNow=pTop;

このコードだと、else句の範囲がwhile文によるループまでとなり、
insertNext()とその次の文は必ず実行してしまいます。
No.007をリストに2回登録したのは、これが原因だと思います。

こんな風に修正する必要があります。

else {
while(pNow!=NULL){
if(pNow->next!=NULL && pNow->next->rank<=rank)
pNow=pNow->next;
else break;
}
insertNext(pNow,Number,rank);
pNow=pTop;
}

これで、とりあえず正しい結果を得るようになるはずです。

また、以下の点も修正する方がよいと思います。
  ・同じ処理を複数回書いている箇所があるが、冗長である
  ・malloc()に失敗した場合のことを考慮する
  ・malloc()した領域が不要になったら、free()する
  ・使っていない変数の定義は削除する


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

Name: マルクス  ..かけだし(1,906ポイント)   Date: 2007/07/17(火) 19:42   No:9385 解決!     
Title: Re:線形リストのソート    
返信遅くなりました;;
確かにそのようにやるとできました!
修正する点もなんとか改良してできました^^
boxさんありがとうございます!


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



Name: ぽっぷ  ..ぴよぴよ(60ポイント)   Date: 2007/07/17(火) 12:16   No:9379       
Title: CygWinで.......    
はじめまして。
さっそく質問なのですが、添付したファイルをCygwinで実行させることができるでしょうか?

このプログラムはあるサイト(http://www2.ee.knct.ac.jp/el/E4/H15-E406/eigenvalue.html)で見つけたものです。

只今私は数値解析を学んでおり、このプログラムを実行してみて、どのように解に収束するのか見てみたいのです。

どのようにすればよいのでしょうか?教えて頂けるととても助かります。


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




Name:  ..ぴよぴよ(109ポイント)   Date: 2007/07/17(火) 10:38   No:9372       
Title: 符号化のことで    
はじめまして。
今、入力された数値を3桁ずつに分けて、最後の3桁に満たない残りの桁は、2桁もしくは1桁とし
その分けられたものをそれぞれ2進数に変換し(分けられたデータが3桁の場合は10桁の、2桁の場合は7桁の、1桁の場合は4桁の)それを結合させるプログラムを作成したいのですが、どうすればよいかわかりません。どのように作成すれば良いのでしょうか?


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


Name: バグ  ..熟練のプログラマー(54,378ポイント)   Date: 2007/07/17(火) 10:45   No:9373     
Title: Re:符号化のことで    
一気に解こうと考えずに1つずつ順番に考えてみてはいかがでしょうか?


1:数値の入力

2:数値を3桁ずつに分ける

3:それぞれの数値を2進数に変換する

4:2進数の文字列を桁を整えた後に連結する


例えばこのような感じに分割して、1ステップずつ解決していくと楽だと思いますよ。


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

Name:  ..ぴよぴよ(125ポイント)   Date: 2007/07/17(火) 10:51   No:9374     
Title: Re:符号化のことで    
なるほど。
2進数へ変換し、配列に格納した後、文字列にするにはどうしたらよいのでしょうか?





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

Name: バグ  ..熟練のプログラマー(54,439ポイント)   Date: 2007/07/17(火) 10:58   No:9375     
Title: Re:符号化のことで    
一番簡単な方法であれば、大きめの文字列格納用バッファを用意して、strcat関数やsprintf関数を利用すれば良いのではないでしょうか?(^-^)

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

Name:  ..ぴよぴよ(243ポイント)   Date: 2007/07/17(火) 11:04   No:9376     
Title: Re:符号化のことで    
例えば、3桁の数字データを2進数にするにあたり
        int binary[16];
int data, i;
         for(i=0; i<10; i++){
       binary[i] = data % 2;
      data = data / 2;
     }
という処理を行ったあと、どのようにsprintf関数をしようして文字列かすればよいのでしょうか?


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

Name: バグ  ..熟練のプログラマー(54,492ポイント)   Date: 2007/07/17(火) 11:28   No:9377     
Title: Re:符号化のことで    
それならば、いっその事、文字列に直接代入してはいかがでしょう?


char Binary[33];
int Data, i;

/* この位置で、Dataになんらかの数値を10進数で入力 */

for(i = 0; i <= 31; i++)
{
if (Data % 2 == 1)
{
Binary[31 - i] = '1';
}
else
{
Binary[31 - i] = '0';
}

Data = Data / 2;
}

Binary[i] = '\0';
printf("%s\n", Binary);


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

Name:  ..ぴよぴよ(282ポイント)   Date: 2007/07/17(火) 12:08   No:9378 解決!     
Title: Re:符号化のことで    
なるほど。そうすれば文字列で扱えますね^^
どうも親切にありがとうございました。また困ったときはよろしくお願いします。


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



Name: デニス。M  ..ぴよぴよ(312ポイント)   Date: 2007/07/16(月) 02:27   No:9323       
Title: extern static を使った力率の問題    
自分はレベル4ちょっと手前くらいなんですが、学校の宿題が分かりません。ちなみに学校のレベルは、勉強しなかったせいで、レベル7くらいまで行ってます。必死に焦っていて。

問題は以下の通りです。

RL直列回路に並列にコンデンサCを接続した回路がある.
Cの大きさを変化させると,回路全体の電流の大きさ,および力率が変化する.
コンデンサの容量を1×10-7Fから500×10-7Fまで1×10-7F刻で変化させたときの
回路全体の電流の大きさ,および力率を出力するプログラムを作成せよ.
ただし,R=30Ω,L=0.02H, f=50Hz, 電源電圧の実効値を100Vとする.
extern や static など適宜利用し,ファイルは少なくとも以下の3つを作成すること

1.main関数

2.myimpedance.c インピーダンスの大きさを返すプログラム

3.mypf.c 力率を返す関数

計算の流れは、まず、回路の合成アドミタンスを求めて、アドミタンスの大きさを虚軸と実軸より三平方の定理で求める。アドミタンス、インピーダンス、電流の順番で求めて、力率はcosθで、∠Y=∠-Zだから、力率=cos∠Yとなる。

staticを使い、コンデンサの容量を宣言。
ここまでは分かったんですが、これをプログラムで実行するとなると、手も足も出ない状態です。
できれば、ソースを書いてもらいたいです。そこから試行錯誤してできるので、何が分かっていないのか、どういう考えが必要なの分かると思うからです。

御願いします。


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


Name: TT414  ..ぴよぴよ(146ポイント)   Date: 2007/07/16(月) 06:58   No:9328     
Title: Re:extern static を使った力率の問題    
マルチポスト
http://www3.realint.com/cgi-bin/tarticles.cgi?pointc2+7674


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

Name: Hermit  ..中級者(10,672ポイント)   Date: 2007/07/16(月) 20:29   No:9344     
Title: Re:extern static を使った力率の問題    
RL直列であれば、最初並列接続のC分を無視して計算、
周波数が一定なのでインピーダンスの変化は無いので、
RL 並列に置き換えるだけでいいと思います。
それで有効電力は変化しませんので。

後は、L 分の打ち消し分が C によってどれだけになるか計算するだけです。


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

Name: asd  ..上級者(16,459ポイント)   Date: 2007/07/17(火) 10:36   No:9371     
Title: Re:extern static を使った力率の問題    
マルチポストです。
http://okwave.jp/qa3171514.html


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



Name: 羽流布 [URL]  ..中級者(9,476ポイント)   Date: 2007/07/16(月) 17:49   No:9342       
Title: 宿題です(汗)    
<問題>
一万個の乱数を格納したファイル(RANDF.DAT)を入力データとし,次の仕様を満たすプログラムを作成せよ.

・最初の2行(特性の記録行)を読み飛ばす.
・1万個の乱数データを順次入力して,各々の値が0-9,10-19,・・・,980-989,990-999の100段階のどこに分類されるかを調べ,各段階の出現回数を数え,出現表(度数分布表)を出力する.
・上の表の各データから,統計量を計算する.

現在、以下の状況で行き詰まってます。

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

int main(void) {
FILE *ifp;
int n[100] = {0}, j, x;
double a = 0;

if ((ifp = fopen("RANDF.DAT", "r")) == NULL) {
printf("ファイル RANDF.DAT はオープンできない.\n");
exit (1);
}
printf("段階    出現個数\n");
for (j = 0; j < 100; j++) {
printf("%3d-%3d", j * 10, j * 10 + 9);
ifp += 2;
while (fscanf(ifp, "%d", &x) != EOF) {
if (j * 10 <= x && x <= j * 10 + 9) {
n[j]++;
}
}
printf("%13d\n", n[j]);
}
fclose(ifp);
for (j = 0; j < 100; j++) {
a += ((n[j] - 100) * (n[j] - 100)) / 100;
}
printf("統計量 x^2 = %.1f", a);
return (0);
}

助言おねがいしますm(_ _)m


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


Name: Hermit  ..中級者(10,798ポイント)   Date: 2007/07/16(月) 20:56   No:9345     
Title: Re:宿題です(汗)    
ifp += 2;
普通、ファイルポインタは変えない物ですが。

で、何をやりたいのかさっぱりわからないソースですね。
どこをどう勘違いしているのかも・・・

とりあえず、
100段階のどこに分類されるかを調べ,各段階の出現回数を数え,それの個数だけでも表示できますか?


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

Name: 羽流布 [URL]  ..中級者(9,646ポイント)   Date: 2007/07/16(月) 21:47   No:9347     
Title: Re:宿題です(汗)    
>普通、ファイルポインタは変えない物ですが。
最初の2行を読み飛ばせると思ってやったのですが出来ませんね……。
と言いますか、ファイル変数の扱いが分かりません。
よって個数を表示できなくて困っております○TZ


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

Name: Hermit  ..中級者(10,888ポイント)   Date: 2007/07/16(月) 22:09   No:9349     
Title: Re:宿題です(汗)    
char buff[256]; // 256 はテキトウ、30 くらいでもいいかな

...............
if ((ifp = fopen("RANDF.DAT", "r")) == NULL) {
printf("ファイル RANDF.DAT はオープンできない.\n");
exit (1);
}
fgets(buff,sizeof buff,ifp); // 単純に、1行読み捨てているだけ
fgets(buff,sizeof buff,ifp); // 2行目読み捨て


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

Name: 羽流布 [URL]  ..中級者(10,072ポイント)   Date: 2007/07/16(月) 22:21   No:9351 解決!     
Title: Re:宿題です(汗)    
なんとか出来ました……。

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

int main(void) {
FILE *ifp;
int n[100] = {0}, j, x;
char buff[256];
double a = 0;

printf("段階    出現個数\n");
for (j = 0; j < 100; j++) {
if ((ifp = fopen("RANDF.DAT", "r")) == NULL) {
printf("ファイル RANDF.DAT はオープンできない.\n");
exit (1);
}
fgets(buff, sizeof buff, ifp);
fgets(buff, sizeof buff, ifp);
printf("%3d-%3d", j * 10, j * 10 + 9);
while (fscanf(ifp, "%d", &x) != EOF) {
if (j * 10 <= x && x <= j * 10 + 9) {
n[j]++;
}
}
fclose(ifp);
printf("%13d\n", n[j]);
}
for (j = 0; j < 100; j++) {
a += ((n[j] - 100) * (n[j] - 100)) / 100;
}
printf("統計量 x^2 = %.1f", a);
return (0);
}

助言ありがとうございましたm(_ _)m


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

Name: Hermit  ..中級者(10,895ポイント)   Date: 2007/07/16(月) 22:50   No:9353     
Title: Re:宿題です(汗)    
多分間違ってます。

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

Name: 羽流布 [URL]  ..中級者(10,858ポイント)   Date: 2007/07/16(月) 23:33   No:9356     
Title: Re:宿題です(汗)    
え? そうなんですか!?
結果はそれらしいのですが……。

段階  出現個数
0- 9 96
10- 19 106
20- 29 103
30- 39 101
40- 49 111
50- 59 105
60- 69 97
70- 79 108
80- 89 94
90- 99 108
100-109 103
110-119 96
120-129 112
130-139 108
140-149 95
150-159 86
160-169 100
170-179 100
180-189 95
190-199 109
200-209 89
210-219 92
220-229 115
230-239 97
240-249 119
250-259 95
260-269 113
270-279 94
280-289 94
290-299 93
300-309 89
310-319 112
320-329 115
330-339 97
340-349 72
350-359 80
360-369 114
370-379 101
380-389 70
390-399 95
400-409 111
410-419 105
420-429 90
430-439 92
440-449 109
450-459 105
460-469 97
470-479 83
480-489 112
490-499 104
500-509 99
510-519 102
520-529 127
530-539 102
540-549 93
550-559 93
560-569 109
570-579 118
580-589 89
590-599 94
600-609 106
610-619 104
620-629 100
630-639 103
640-649 83
650-659 90
660-669 104
670-679 108
680-689 117
690-699 96
700-709 97
710-719 97
720-729 95
730-739 118
740-749 97
750-759 108
760-769 92
770-779 98
780-789 85
790-799 103
800-809 98
810-819 100
820-829 109
830-839 104
840-849 98
850-859 87
860-869 80
870-879 113
880-889 88
890-899 125
900-909 85
910-919 96
920-929 106
930-939 93
940-949 96
950-959 94
960-969 99
970-979 105
980-989 97
990-999 113
統計量 x^2 = 77.0


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

Name: Hermit  ..中級者(11,269ポイント)   Date: 2007/07/16(月) 23:49   No:9357     
Title: Re:宿題です(汗)    
ああ、結果はいいんですね。
失礼しました。

ただ、その為に、100回ファイルをオープンするのはどうかと思いますが。


if ((ifp = fopen("RANDF.DAT", "r")) == NULL) {
printf("ファイル RANDF.DAT はオープンできない.\n");
exit (1);
}
fgets(buff,sizeof buff,ifp);
fgets(buff,sizeof buff,ifp);
printf("段階    出現個数\n");
while (fscanf(ifp, "%d", &x) != EOF) {
n[x/10]++;
}
fclose(ifp);
for (j = 0; j < 100; j++) {
printf("%3d-%3d%13d\n",j*10,j*10+9,n[j]);
}


こんな感じでいいような気がします。
(エラー処理はしてませんが)


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

Name: 初心者A  ..ぴよぴよ(560ポイント)   Date: 2007/07/16(月) 23:54   No:9359     
Title: Re:宿題です(汗)    
見事なリソースの無駄使いです。

ほぼ均一に分布していると考えた場合、
ファイルからのデータを99%読み飛ばし、
1%ずつ格納する処理を100回繰り返し、
最終的にファイルのデータを100%格納しています。

1回のファイルopenとcloseで処理できますので、
頑張ってみて下さい。



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

Name: 羽流布 [URL]  ..中級者(10,903ポイント)   Date: 2007/07/16(月) 23:58   No:9360 解決!     
Title: Re:宿題です(汗)    
確かにファイルを百回もオープンするのは無駄ですね。
気付きませんでした……。

ありがとうございます!


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

Name: 羽流布 [URL]  ..中級者(11,465ポイント)   Date: 2007/07/17(火) 00:19   No:9361     
Title: Re:宿題です(汗)    
すいません(汗)
またまた助言お願いします。
下記のプログラムは何か間違っているのでしょうか?
結果は、

ファイルA:2 4 7 8 10 15
ファイルB:3 5 7 9 10 16 18
ファイルC:2 3 4 5 7 7 8 9 10 10 15 16 18

と表示させたいのです。

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

int main(void) {
FILE *fa, *fb, *fc;
int a, b, c;

if ((fa = fopen("f1.dat", "r")) == NULL) {
printf("ファイル f1.dat はオープンできない.\n");
exit (1);
}
if ((fb = fopen("f2.dat", "r")) == NULL) {
printf("ファイル f2.dat はオープンできない.\n");
exit (1);
}
fc = fopen("f3.dat", "w");
for ( ; ; ) {
if (fscanf(fa, "%d", &a) != EOF) {
if (fscanf(fb, "%d", &b) != EOF) {
if (a >= b) {
fprintf(fc, " %2d", b);
fprintf(fc, " %2d", a);
}
else {
fprintf(fc, " %2d", a);
fprintf(fc, " %2d", b);
}
}
else {
fprintf(fc, " %2d", a);
}
}
else {
if (fscanf(fb, "%d", &b) != EOF) {
fprintf(fc, " %2d", b);
}
else {
break;
}
}
}
fclose(fa);
fclose(fb);
fclose(fc);
printf("ファイルA:");
if ((fa = fopen("f1.dat", "r")) == NULL) {
printf("ファイル f1.dat はオープンできない.\n");
exit (1);
}
while (fscanf(fa, "%d", &a) != EOF) {
printf(" %d", a);
}
printf("\n");
fclose(fa);
printf("ファイルB:");
if ((fb = fopen("f2.dat", "r")) == NULL) {
printf("ファイル f2.dat はオープンできない.\n");
exit (1);
}
while (fscanf(fb, "%d", &b) != EOF) {
printf(" %d", b);
}
printf("\n");
fclose(fb);
printf("ファイルC:");
if ((fc = fopen("f3.dat", "r")) == NULL) {
printf("ファイル f3.dat はオープンできない.\n");
exit (1);
}
while (fscanf(fc, "%d", &c) != EOF) {
printf(" %d", c);
}
printf("\n");
fclose(fc);
return (0);
}

朝10時までなら間に合いますので、助言お願いしますm(_ _)m


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

Name: フリオ  ..中級者(13,317ポイント)   Date: 2007/07/17(火) 01:31   No:9363     
Title: Re:宿題です(汗)    
 
 最初の質問ですが、

> 統計量 x^2 = 77.0

これ、間違ってませんか?


#include <stdio.h>

#define MAX 100
#define SKIP 2

int GetData(int *freq)
{
FILE *fp = fopen("RANDF.DAT", "r");
int num, i;

if(!fp) return 0;
for(i = 0; i < SKIP; i += (fgetc(fp) == '\n')) ;
while(fscanf(fp, "%d ", &num) != EOF) freq[num / 10] ++;
fclose(fp);
return 1;
}

double Variance(int *freq, int max)
{
int i;
double v = 0;

for(i = 0; i < max; i ++){
v += (freq[i] - 100) * (freq[i] - 100) / 100.0;
}
return v;
}

void Print(double v, int *freq, int max)
{
int i;

for(i = 0; i < max; i ++){
printf("%3d ~ %3d\t%5d\n", 10 * i, 10 * i + 9, freq[i]);
}
printf("\nVariance : %.1f\n", v);
return;
}

int main(void)
{
int freq[MAX] = {0,};

if(!GetData(freq)){
puts("File Open Error");
return 1;
}
Print(Variance(freq, MAX), freq, MAX);
return 0;
}

 
 
 あとの質問ですが、
これは、何をするプログラムでしょうか。
"ファイルA"、"ファイルB"、"ファイルC"とは何でしょうか。
何故、"間違っている"と判断したのでしょうか。
 


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

Name: フリオ  ..中級者(13,457ポイント)   Date: 2007/07/17(火) 01:41   No:9364     
Title: Re:宿題です(汗)    
 
 最初の質問の方、なんか、面倒くさい事してました。
"Print"関数を以下に訂正します。


void Print(int *freq, int max)
{
int i;

for(i = 0; i < max; i ++){
printf("%3d ~ %3d\t%5d\n", 10 * i, 10 * i + 9, freq[i]);
}
printf("\nVariance : %.1f\n", Variance(freq, MAX));
return;
}

 


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

Name: 羽流布  ..中級者(11,515ポイント)   Date: 2007/07/17(火) 01:56   No:9365     
Title: Re:宿題です(汗)    
すいません、説明不足でした(汗)                    Aはf1.dat、Bはf2.dat、Cはf3.datです。                AとBの値を比べて小さいほうから順次並べたものがCです。                    現在のプログラムですと、Cへ限りなく書き込んでしまうようなのです。

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

Name: 初心者A  ..かけだし(1,080ポイント)   Date: 2007/07/17(火) 05:11   No:9368     
Title: Re:宿題です(汗)    
最初のネタの続きです。

今のままでは不正データで誤動作するのと、
区切文字の汎用性がないので、
フリオさんご提示のロジックを少々アレンジしてみました。

尚、必然性のない書き換えは関心しないですね。>羽流布さん


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

#define MAX 100
#define SKIP 2
#define NUM_MIN "0"
#define NUM_MAX "999"

int GetData(int *freq, char **errmsg)
{
FILE *fp = fopen("RANDF.DAT", "r");
int num, i, ch;
char buff[sizeof(NUM_MAX)] = "";
const int num_min = atoi(NUM_MIN);
const int num_max = atoi(NUM_MAX);

if(!fp){
*errmsg = "File Open Error";
return 0;
}
for(i = 0; ch = fgetc(fp),i < SKIP && ch != EOF; i += (ch == '\n')) ;
if(ch == EOF){
fclose(fp);
*errmsg = "Header Nothing Error";
return 0;
}
for(num = 0;;){
ch = fgetc(fp);
if(ch <= ' ' || ch == ','){
buff[num] = '\0';
if(*buff){
num = atoi(buff);
if(num < num_min || num > num_max){
fclose(fp);
*errmsg = "Data Value Error";
return 0;
}
freq[num / 10] ++;
}
if(ch == EOF) break;
num = 0;
continue;
}
if(!isdigit(ch)){
fclose(fp);
*errmsg = "Data Not Digit Error";
return 0;
}
buff[num++] = (char)ch;
if(num >= sizeof(buff)){
fclose(fp);
*errmsg = "Data Length Error";
return 0;
}
}
fclose(fp);
return 1;
}

double Variance(int *freq, int max)
{
int i;
double v = 0;

for(i = 0; i < max; i ++){
v += (freq[i] - 100) * (freq[i] - 100) / 100.0;
}
return v;
}

void Print(double v, int *freq, int max)
{
int i;

for(i = 0; i < max; i ++){
printf("%3d ~ %3d\t%5d\n", 10 * i, 10 * i + 9, freq[i]);
}
printf("\nVariance : %.1f\n", v);
return;
}

int main(void)
{
int freq[MAX] = {0,};
char *errmsg;

if(!GetData(freq, &errmsg)){
puts(errmsg);
return 1;
}
Print(Variance(freq, MAX), freq, MAX);
return 0;
}



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

Name: フリオ  ..中級者(13,782ポイント)   Date: 2007/07/17(火) 06:09   No:9369     
Title: Re:宿題です(汗)    
 
 あとの質問に関して、
 こちらで試したところ、"Cへ限りなく書き込んでしまう"ことはありませんが、
データが交互でない場合、例えば、

ファイルA : 1 2 3 7 8 9
ファイルB : 4 5 6 10 11 12

だとうまくいきません。

一応、私が考えたものを書いておきますが、
もっとすっきりした方法があるかも。


#include <stdio.h>

int main(void)
{
FILE *fpa = fopen("f1.dat", "r"),
*fpb = fopen("f2.dat", "r");
int v_a, v_b, flag_a, flag_b;

if(!(fpa && fpb)){
puts("File Open Error");
return 1;
}
flag_a = fscanf(fpa, "%d ", &v_a);
flag_b = fscanf(fpb, "%d ", &v_b);
while(flag_a != EOF && flag_b != EOF){
if(v_a > v_b){
printf("%d ", v_b);
flag_b = fscanf(fpb, "%d ", &v_b);
}
else{
printf("%d ", v_a);
flag_a = fscanf(fpa, "%d ", &v_a);
}
}
while(flag_a != EOF){
printf("%d ", v_a);
flag_a = fscanf(fpa, "%d ", &v_a);
}
while(flag_b != EOF){
printf("%d ", v_b);
flag_b = fscanf(fpb, "%d ", &v_b);
}
fclose(fpa);
fclose(fpb);
return 0;
}

 


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

Name: 羽流布 [URL]  ..中級者(11,543ポイント)   Date: 2007/07/17(火) 09:01   No:9370 解決!     
Title: Re:宿題です(汗)    
すいません、2行を飛ばす必要があったようです。
でも、あとは何とかなりそうです。

助言ありがとうございましたm(_ _)m


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




 
[ 1 , ... ]
 
 
管理者画面   RSS   + Powered By 21style +