C言語何でも質問掲示板


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

規約と使い方

 
   初歩の初歩で・・・・   
     ・[9268] 管理人 
     ・[9271] 幻 
     ・[9355] たまねぎ 
   ClearDrawScreen   
     ・[9334] 管理人 
     ・[9341] フォンクス 
   セマフォの課題なんで ....   
     ・[9321] 太郎 
     ・[9322] 太郎 
   2次元のポインタ配列   
     ・[9316] box 
     ・[9317] YuO 
     ・[9318] テオリア 
   基本的なことかもしれ ....   
     ・[9267] Justy 
     ・[9270] tkmakwins15 
     ・[9285] マサキ 
     ・[9286] Justy 
     ・[9307] マサキ 
   C言語の質問です   
     ・[9295] ハヤト 
     ・[9300] ハヤト 
   WM_PAINTメッセージ   
     ・[9248] バグ 
     ・[9251] Justy 
     ・[9296] Lbfuvab 
   GAME OVER画面とSTART ....   
     ・[92891185801462] 解決さん 
   無題   
     ・[9233] tkmakwins15 
     ・[9269] kidd 
     ・[9287] Justy 
     ・[9288] tkmakwins15 
   お久しぶりです。   
     ・[9240] 管理人 
     ・[9241] ダッシュ 
     ・[9244] 管理人 
     ・[9252] ダッシュ 
     ・[9254] ダッシュ 
     ・[9256] 管理人 
     ・[9257] 管理人 
     ・[9260] ダッシュ 
     ・[9261] ダッシュ 
     ・[9273] 管理人 
     ・[9276] ☆ 
     ・[9277] 管理人 
     ・[9281] ダッシュ 
     ・[9283] 管理人 
     ・[9284] ダッシュ 
   SendMessageについて   
     ・[9282] tkmakwins15 
   fgets関数について   
     ・[9262] Hermit 
     ・[9263] テオリア 
     ・[9265] tkmakwins15 
     ・[9279] テオリア 
   質問します。   
     ・[9278] 管理人 
   配列を用いた課題   
     ・[9274] フリオ 
   前の投稿は分かりにく ....   
     ・[9253] Hermit 
   wchar_t型の変数の入力 ....   
     ・[9235] Justy 
     ・[9237] tkmakwins15 
     ・[9238] Justy 
     ・[9247] tkmakwins15 
   複雑ネットワークのW ....   
   前回はありがとうござ ....   
     ・[9236] 管理人 
     ・[9243] プログラミング初心者 
   CSVに書き換える   
     ・[9195] Hermit 
     ・[9198] さっかん 
     ・[9204] さっかん 
     ・[9207] Hermit 
     ・[9210] さっかん 
     ・[9215] @とんぷぅ〜 
     ・[9216] さっかん 
     ・[9224] Hermit 
     ・[9232] さっかん 
   またまた課題(文字列 ....   
     ・[9132] keichan 
     ・[9133] バグ 
     ・[9134] 管理人 
     ・[9136] バグ 
     ・[9230] 徹夜 
   ものすごく初歩的なん ....   
     ・[9099] 管理人 
     ・[9229] プログラミング初心者 
   gets()等   
     ・[9214] toyo 
     ・[9226] te05 
     ・[9227] Hermit 
   順列で…   
     ・[9225] box 
   nanについて   
     ・[9218] 組木紙織 
     ・[9219] マサキ 
     ・[9220] YuO 
     ・[9222] 組木紙織 
     ・[9223] マサキ 
   ファイル内容のソート   
     ・[9094] toyo 
     ・[9095] toyo 
     ・[9097] @とんぷぅ〜 
     ・[9101] とよtoyo 
     ・[9104] @とんぷぅ〜 
     ・[9106] @とんぷぅ〜 
     ・[9107] toyo 
     ・[9108] @とんぷぅ〜 
     ・[9109] toyo 
     ・[9110] @とんぷぅ〜 
     ・[9111] toyo 
     ・[9112] @とんぷぅ〜 
     ・[9113] @とんぷぅ〜 
     ・[9114] toyo 
     ・[9116] @とんぷぅ〜 
     ・[9117] toyo 
     ・[9118] toyo 
     ・[9124] @とんぷぅ〜 
     ・[9137] @とんぷぅ〜 
     ・[9138] toyo 
     ・[9139] @とんぷぅ〜 
     ・[9145] @とんぷぅ〜 
     ・[9212] @とんぷぅ〜 
   C言語の課題で…   
     ・[9128] 大学生 
     ・[9135] 管理人 
     ・[9150] 組木紙織 
     ・[9151] box 
     ・[9153] 大学生 
     ・[9154] box 
     ・[9157] 大学生 
     ・[9159] 組木紙織 
     ・[9211] 大学生 
   乱数発生器について。   
     ・[9203] box 
     ・[9205] tkmakwins15 
     ・[9206] Justy 
     ・[9209] tkmakwins15 
   fork()について   
     ・[9208] ぽん太 
   再帰関数の宿題   
     ・[9192] 組木紙織 
     ・[9193] box 
     ・[9197] 羽流布 
     ・[9199] box 
     ・[9200] 羽流布 
     ・[9201] 組木紙織 
   BorlandC++Compiler5. ....   
     ・[9129] toyo 
     ・[9130] バグ 
     ・[9196] かさい 
   小文字を大文字に   
     ・[9161] box 
     ・[9175] さっかん 
     ・[9177] box 
     ・[9180] さっかん 
     ・[9181] さっかん 
     ・[9182] Hermit 
     ・[9184] さっかん 
     ・[9185] box 
     ・[9186] さっかん 
     ・[9187] box 
     ・[9188] さっかん 
     ・[9189] box 
     ・[9190] さっかん 
   char**型の関数   
     ・[9172] Hermit 
     ・[9176] ini 
     ・[9179] Hermit 
   先日はありがとうござ ....   
     ・[9125] Justy 
     ・[9178] shaka 
   画像を表示   
     ・[9174] 管理人 
   熱流体   
   単語の長さを縦にヒス ....   
     ・[9163] box 
     ・[9164] parapara 
     ・[9165] box 
     ・[9166] Hermit 
     ・[9168] Hermit 
     ・[9169] box 
     ・[9170] parapara 
   無題   
     ・[9156] box 
     ・[9158] TDU 
   最初のコンパイル?   
     ・[9122] Justy 
     ・[9152] ゆえ 
   ルンゲクッタって?? ....   
     ・[9144] acid 
   ジュリアンダー(ユリ ....   
     ・[9141] TT414 
     ・[9143] 東海○学 
   WSモデルについて   
   経路の問題です。   
     ・[9119] toyo 
     ・[9120] miku 
   2分探索木を用いた探 ....   
     ・[8978] box 
     ・[8979] マサキ 
     ・[8980] box 
     ・[9000] マサキ 
     ・[9002] box 
     ・[9006] マサキ 
     ・[9007] フリオ 
     ・[9010] マサキ 
     ・[9014] box 
     ・[9019] マサキ 
     ・[9027] box 
     ・[9029] Justy 
     ・[9033] box 
     ・[9036] Justy 
     ・[9039] フリオ 
     ・[9054] マサキ 
     ・[9064] box 
     ・[9067] マサキ 
     ・[9071] box 
     ・[9075] マサキ 
     ・[9080] フリオ 
     ・[9082] box 
     ・[9083] マサキ 
     ・[9084] マサキ 
     ・[9085] box 
     ・[9086] box 
     ・[9088] マサキ 
     ・[9091] box 
     ・[9098] マサキ 
     ・[9100] box 
     ・[9105] マサキ 
   シューティングゲーム ....   
     ・[9076] Justy 
     ・[9102] 雪中 蓮 
   タイトルバーに関する ....   
     ・[8797] ま〜く 
     ・[8798] バグ 
     ・[8799] バグ 
     ・[8801] ま〜く 
     ・[8802] バグ 
     ・[8804] ま〜く 
     ・[8832] バグ 
     ・[8848] ま〜く 
     ・[8850] バグ 
     ・[8853] ま〜く 
     ・[8854] 組木紙織 
     ・[8860] ま〜く 
     ・[8945] バグ 
     ・[8954] ま〜く 
     ・[8956] バグ 
     ・[9096] バグ 
   テイラー級数   
     ・[9087] 管理人 
     ・[9089] toyo 
     ・[9090] toyo 
   リバーシゲームについ ....   
     ・[9059] にゃんこ 
     ・[9060] にゃんこ 
     ・[9061] にゃんこ 
     ・[9062] 組木紙織 
     ・[9072] にゃんこ 
     ・[9079] 組木紙織 
   関数について(初心者 ....   
     ・[9069] box 
     ・[9070] まんま 
     ・[9077] 管理人 
     ・[9078] 組木紙織 
   オーバーロードについ ....   
     ・[9024] Justy 
     ・[9032] ouh 
     ・[9034] YuO 
     ・[9037] Justy 
     ・[9043] ouh 
     ・[9044] Justy 
     ・[9073] ouh 
   構造体   
     ・[9015] なぎ 
     ・[9046] toyo 
     ・[9053] keichan 
     ・[9066] なぎ 
   関数の問題で…   
     ・[9065] 管理人 
   ヒープソートについて   
     ・[9021] りむ 
     ・[9022] バグ 
     ・[9023] りむ 
     ・[9042] 管理人 
     ・[9045] あや 
     ・[9047] 管理人 
     ・[9048] りむ 
     ・[9057] あや 
   DXライブラリをDirect ....   
     ・[9026] 管理人 
     ・[9030] Justy 
     ・[9035] りむ 
     ・[9038] 管理人 
     ・[9041] Justy 
     ・[9049] りむ 
     ・[9050] バグ 
     ・[9051] Justy 
     ・[9052] 管理人 
     ・[9056] Justy 

Name:  ..ぴよぴよ(283ポイント)   Date: 2007/07/12(木) 23:39   No:9266       
Title: 初歩の初歩で・・・・    
今、僕は「VisualC++ 2005」を用いて、0「導入」より始めようとしたのですが
何度やっても、「DxLib.sln」をビルドすると
『ビルド エラーが発生しました。続行して、最後に成功したビルドを実行しますか?』
と出て、「はい」とすると・・・

『プログラム'C:\Documents and Settings\****\デスクトップ\DxLib_VC
\サンプルプログラム実行用フォルダ\Debug\DxLib.exe'を開始できません。

指名されたファイルが見つかりません。』

と出てしまい、どうしようもないのです。
ちなみに「DxLib.sln」を開く前には変換ヴィザードが出ました。
「VisualC++」最新だからでしょうか教えてください。


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


Name: 管理人 [URL]  ..伝説のハッカー(382,388ポイント)   Date: 2007/07/12(木) 23:51   No:9268     
Title: Re:初歩の初歩で・・・・    
お使いのコンパイラは製品版ですか?
それともフリーのExpressEditionですか?
前者でしたら何も設定なしに出来ますが、後者では設定が必要です。

http://homepage2.nifty.com/natupaji/DxLib/dxuse.html

この辺ご参考にどうぞ。


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

Name:  ..ぴよぴよ(317ポイント)   Date: 2007/07/13(金) 00:17   No:9271     
Title: Re:初歩の初歩で・・・・    
そうです・・・後者なのです。
参考にさせていただきます。
ありがとうございました!


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

Name: たまねぎ  ..ぴよぴよ(81ポイント)   Date: 2007/07/16(月) 23:29   No:9355     
Title: Re:初歩の初歩で・・・・    
突然すいません。

visual studio2005でCtrl+F5と押してコンパイル?をすると、”指定されたファイルは見つかりません。”と出てきます。

おそらくコンパイルは出来ているのだと思うんですが、実行結果が出てきません。

どうしたらいいのか教えてください。


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



Name: フォンクス  ..ぴよぴよ(239ポイント)   Date: 2007/07/16(月) 08:38   No:9330       
Title: ClearDrawScreen    
C言語〜ゲームプログラミングの館〜で
12画像を動かすってあって、
そこのClearDrawScreenのところなんですけど、

Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
D:\programming\test\DrawPixiel.cpp:
エラー E2268 D:\programming\test\DrawPixiel.cpp 10: 未定義の関数 'ClearDrawScreen' を呼び出した(関数 __stdcall WinMain(HINSTANCE__ *,HINSTANCE__ *,char *,int) )
*** 1 errors in Compile ***

** error 1 ** deleting Debug\DrawPixiel.obj」

ってでてコンパイルできないんですけど、どうすればいいんでしょうか?


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


Name: 管理人 [URL]  ..伝説のハッカー(382,699ポイント)   Date: 2007/07/16(月) 12:39   No:9334     
Title: Re:ClearDrawScreen    
ClearDrawScreenは古いDXライブラリのバージョンには入っていない関数です。
恐らくそれに相当する古い関数名が
cls...なんとかScreenという名前だったと思いますが、
なるべく改善された最新バージョンをお使いになった方がいいと思います。

DXライブラリのダウンロードから、最新バージョンをダウンロードしてください。


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

Name: フォンクス  ..ぴよぴよ(252ポイント)   Date: 2007/07/16(月) 17:47   No:9341 解決!     
Title: Re:ClearDrawScreen    
できました。
ありがとうございます。


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



Name: 太郎  ..かけだし(1,908ポイント)   Date: 2007/07/16(月) 01:00   No:9320       
Title: セマフォの課題なんですが・・・    
大学の課題でセマフォに関するものが出たのですがよくわからなくて・・・
セマフォを使って親プロセスと子プロセスを同期させてメッセージ通信をさせるというものです。
親プロセスで書き込んだものが子プロセスで表示され、そして子プロセスで書き込まれたものが親プロセスで表示されるという流れです。

以下のようなプログラムを書いたのですが、親プロセス内でしかやりとりをしてくれない状態です。
これのどこをどのようになおしたら良いのか教えていただけないでしょうか・・・?

よろしくお願いします

/* (#include &各種宣言)*/
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/shm.h>

struct sembuf p2c[1],c2p[1];
union semun {
int val;
struct semid_ds *buf;
unsigned short *array;
struct seminfo *__buf;
}arg;


int main() {

/* (共有バッファ(128B)の確保)*/
int smid,p2csemid,c2psemid,pid;
int *smad;
if((smid=shmget(IPC_PRIVATE,128,IPC_CREAT|0666))==-1){
perror("shm get ");
}
if((smad=shmat(smid,0,0))==(int *)(-1)){
perror("shm attach ");
}

/* p2c:親→子メッセージ用セマフォ c2p:子→親用セマフォ */
if((p2csemid=semget(IPC_PRIVATE,1,0600))==-1){
perror("p2csem get ");
}
if((c2psemid=semget(IPC_PRIVATE,1,0600))==-1){
perror("c2psem get ");
}
arg.val=0;
if((semctl(p2csemid,0,SETVAL,arg))==-1){
perror("p2csem initialize ");
}
if((semctl(c2psemid,0,SETVAL,arg))==-1){
perror("c2psem initialize ");
}
p2c[0].sem_num=0;
p2c[0].sem_flg=0;
c2p[0].sem_num=0;
c2p[0].sem_flg=0;

if((pid=fork())==0){
for(;;){

/* 親の書き込み待ち */
p2c[0].sem_op=-1;
if((semop(p2csemid,p2c,1))==-1){
perror("child r_lock ");
}

/* ・(親からのメッセージのバッファからの読み出し)*/
printf( "parent:%s\n", smad );
/* ・(親へのメッセージのバッファへの書き込み)*/
scanf( "%s", smad );
/* 親の読み出し待機解除 */
c2p[0].sem_op=1;
if((semop(c2psemid,c2p,1))==-1){
perror("child w_unlock ");
}

/* ・(以下、親のプロセス)*/
}} else {
sleep(1);
for(;;){
/* ・(子へのメッセージのバッファへの書き込み)*/
scanf( "%s", smad );
/* ・(子の読み出し待機解除)*/
p2c[0].sem_op=1;
if((semop(p2csemid,p2c,1))==-1){
perror("parent w_unlock ");
}
/* ・(子の書き込み待ち)*/
c2p[0].sem_op=-1;
if((semop(c2psemid,c2p,1))==-1){
perror("parent r_lock ");
}
/* ・(子からのメッセージのバッファからの読み出し)*/
printf( "child:%s\n", smad );
}
}
return 0;
}


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


Name: 太郎  ..入門者(2,669ポイント)   Date: 2007/07/16(月) 01:01   No:9321     
Title: Re:セマフォの課題なんですが・・・    
以下が宿題として与えられた資料です


(3)セマフォを使った同期 −共有バッファを用いたプロセス間
               メッセージ通信
  親/子プロセスでメッセージを書き込み、子/親プロセスで読
  み出す →semprog2.c
[sugie@localhost enshu]$ vi semprog2.c

  ・(#include &各種宣言)
struct sembuf p2c[1],c2p[1];
  ・(共有バッファ(128B)の確保)

/* p2c:親→子メッセージ用セマフォ c2p:子→親用セマフォ */
if((p2csemid=semget(IPC_PRIVATE,1,0600))==-1){
perror("p2csem get ");
}
if((c2psemid=semget(IPC_PRIVATE,1,0600))==-1){
perror("c2psem get ");
}
arg.val=0;
if((semctl(p2csemid,0,SETVAL,arg))==-1){
perror("p2csem initialize ");
}
if((semctl(c2psemid,0,SETVAL,arg))==-1){
perror("c2psem initialize ");
}

p2c[0].sem_num=0;
p2c[0].sem_flg=0;
c2p[0].sem_num=0;
c2p[0].sem_flg=0;

if((pid=fork())==0){
for(;;){
          /* 親の書き込み待ち */
p2c[0].sem_op=-1;
if((semop(p2csemid,p2c,1))==-1){
perror("child r_lock ");
}

  ・(親からのメッセージのバッファからの読み出し)
  ・(親へのメッセージのバッファへの書き込み)
          /* 親の読み出し待機解除 */
c2p[0].sem_op=1;
if((semop(c2psemid,c2p,1))==-1){
perror("child w_unlock ");
}

  ・(以下、親のプロセス)
  sleep(1);
for(;;){
  ・(子へのメッセージのバッファへの書き込み)
  ・(子の読み出し待機解除)
  ・(子の書き込み待ち)
  ・(子からのメッセージのバッファからの読み出し)

[sugie@localhost enshu]$ gcc semprog2.c
[sugie@localhost enshu]$ ./a.out →親子で通信できたか?


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

Name: 太郎  ..入門者(2,684ポイント)   Date: 2007/07/16(月) 01:03   No:9322     
Title: Re:セマフォの課題なんですが・・・    
環境はLinux、コンパイルはgccです

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



Name: テオリア  ..ぴよぴよ(182ポイント)   Date: 2007/07/15(日) 19:29   No:9314       
Title: 2次元のポインタ配列    
再度よろしくお願いいたします。

int *pt[5][3]

上記の二次元ポインタ配列を関数に渡す(実引数)にはどうしたらよいのでしょうか?


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


Name: box  ..比類無きプログラマー(78,153ポイント)   Date: 2007/07/15(日) 21:32   No:9316     
Title: Re:2次元のポインタ配列    

ちょっとした例です。
func()は、列の数が3である行列を受け取れます。
行の数は、引数で与えます。


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

#define M1 (5)
#define M2 (10)
#define N (3)

void func(int *(*p)[N], int m)
{
int i, j;
for (i = 0; i < m; i++) {
for (j = 0; j < N; j++)
printf("%10d", *p[i][j]);
putchar('\n');
}
printf("\n\n");
}

int main(void)
{
int *pt1[M1][N], *pt2[M2][N], i, j;

for (j = 0; j < N; j++) {
for (i = 0; i < M1; i++) {
pt1[i][j] = (int *) malloc(sizeof(int));
if (!pt1[i][j])
fprintf(stderr, "out of memory\n"), exit(1);
*pt1[i][j] = i * 100 + j;
}

for (i = 0; i < M2; i++) {
pt2[i][j] = (int *) malloc(sizeof(int));
if (!pt2[i][j])
fprintf(stderr, "out of memory\n"), exit(1);
*pt2[i][j] = i * 10000 + j;
}
}

func(pt1, M1);
func(pt2, M2);

for (j = 0; j < N; j++) {
for (i = 0; i < M1; i++)
free(pt1[i][j]);
for (i = 0; i < M2; i++)
free(pt2[i][j]);
}

return 0;
}


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

Name: YuO  ..初心者(8,838ポイント)   Date: 2007/07/15(日) 23:07   No:9317     
Title: Re:2次元のポインタ配列    
> 上記の二次元ポインタ配列を関数に渡す(実引数)にはどうしたらよいのでしょうか?

素直にそのまま書けばよいです。
つまり,
void func (int *arg[5][3]);

とでもしておけば,ptをそのまま渡せます。


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

Name: テオリア  ..ぴよぴよ(203ポイント)   Date: 2007/07/16(月) 00:02   No:9318 解決!     
Title: Re:2次元のポインタ配列    
boxさん、YuOさん、回答ありがとうございます。

無事できました。


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



Name: マサキ  ..入門者(4,567ポイント)   Date: 2007/07/12(木) 23:29   No:9264       
Title: 基本的なことかもしれませんが........    
添付したプログラムをコンパイルしたところ、エラーが出てしまいコンパイルできません。
強引に実行させれば動くのですが、エラーが気になります。
ちなみにエラー内容は39行目に
unknown escape sequence: '\202'
です。
39行目を調べたのですが、おかしなところは見つかりません。
どうすれば解決するでしょうか?


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


Name: Justy  ..ハッカー(135,335ポイント)   Date: 2007/07/12(木) 23:42   No:9267     
Title: Re:基本的なことかもしれませんが........    
 環境は何ですか?


 以下は、仮に linux+gccだとした場合の話です。

 「表」という文字が悪さをしていそうな気がします。
 ソースの文字コードが Shift-JISだったりしませんか?

 EUC-JPで保存し直して試してみて下さい。


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

Name: tkmakwins15 [URL]  ..かけだし(1,402ポイント)   Date: 2007/07/12(木) 23:57   No:9270     
Title: Re:基本的なことかもしれませんが........    
僕の環境であるwindowsとborland C++ 5.5では問題なくコンパイルできました。
たぶんJustyさんの言う事ぐらいしか思い当たる節がありません
ちなみにVisual Studio 2005 のC++でも問題なく実行できました。


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

Name: マサキ  ..入門者(4,595ポイント)   Date: 2007/07/14(土) 01:01   No:9285     
Title: Re:基本的なことかもしれませんが........    
使ってる環境はWindowsにCygWinをダウンロードして使っています。


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

Name: Justy  ..ハッカー(135,098ポイント)   Date: 2007/07/14(土) 03:10   No:9286     
Title: Re:基本的なことかもしれませんが........    
 だとしたら解決方法は3通りあります。


・ ソースの文字コードを EUCに変更
 テキストエディタなどから保存し直して下さい。

・ 「表」などのエスケープ(\)を含む2バイト文字を使わない
 SHIFT-JISにおける「表」の文字コードは 955cと 5c(\)を含んでいます。
 こういう 5c(\)を含む2バイトの文字・・・「ソ」「能」「十」「圭」「構」「―」「申」の
文字を一切使わないようにソースを書き直して下さい。

・ エスケープ(\)を含む2バイト文字の後ろに '\'を挿入
 「ハッシュ表に登録」を「ハッシュ表\に登録」としてみて下さい。
 それでコンパイラをごまかすことができると思います。



# 昔

// XXX表
++i;

 とか書いたソースを gccでコンパイルしたら警告なしで ++iの行がコメント扱いになって
消えてしまったということが・・・。
 今は警告が出るんですね。


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

Name: マサキ  ..入門者(4,470ポイント)   Date: 2007/07/15(日) 16:36   No:9307 解決!     
Title: Re:基本的なことかもしれませんが........    
返事が遅くなって大変申し訳ございません。


>エスケープ(\)を含む2バイト文字の後ろに '\'を挿入
「ハッシュ表に登録」を「ハッシュ表\に登録」としてみて下さい。
それでコンパイラをごまかすことができると思います。

このようにしたらちゃんと作動させることができました。ありがとうございました。


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



Name: ハヤト  ..ぴよぴよ(76ポイント)   Date: 2007/07/14(土) 21:48   No:9294       
Title: C言語の質問です    
カードゲームのブラックジャックを作るという課題で、トランプは各スートの1〜10までの計40枚を用いるのですが、一応自分で作ってみたのですが、実行するとプレーヤーが勝った時にはもう一度ゲームを行うことができず、プレーヤーが負けると、ゲームを続けるかという表示が出ずに、そのままもう一度ゲームを行うようになってしまいます。どうしたらよいのか教えてください。

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


Name: ハヤト  ..ぴよぴよ(111ポイント)   Date: 2007/07/14(土) 21:52   No:9295     
Title: Re:C言語の質問です    
上の添付したプログラムは少し間違えていました。投稿しなおさせてもらいます。


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

Name: ハヤト  ..ぴよぴよ(154ポイント)   Date: 2007/07/15(日) 08:19   No:9300 解決!     
Title: Re:C言語の質問です    
何度もすみません。もう一回朝にやり押してみたところできました。すみませんでした。



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



Name: Lbfuvab  ..かけだし(2,354ポイント)   Date: 2007/07/12(木) 17:04   No:9245       
Title: WM_PAINTメッセージ    
何度もすいません。
参考書(猫Win2版)には画面を書き直すときは無効領域を発生させよと書いてありますが、
SendMessageを使ってはいけないのでしょうか?


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


Name: バグ  ..熟練のプログラマー(54,042ポイント)   Date: 2007/07/12(木) 17:41   No:9248     
Title: Re:WM_PAINTメッセージ    
どういう状況か詳細が分かりませんが、再描画させるだけならば、SendMessageを使っても問題無いと思いますよ。

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

Name: Justy  ..ハッカー(135,235ポイント)   Date: 2007/07/12(木) 18:41   No:9251     
Title: Re:WM_PAINTメッセージ    
>SendMessageを使ってはいけないのでしょうか?
 SendMessageで WM_PAINTを指定する、ってことですか?

 状況次第と言えば状況次第なのですが、SendMessageを使った場合、
たしかに WM_PAINTメッセージは発生しますが、OSがその領域は描画済みだから
描画する必要なし、と判断した場合そこの部分が再描画されないことがあります。

 そういうこともあって、一般的には InvalidateRect(+ UpdateWindow)を使います。


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

Name: Lbfuvab  ..かけだし(2,383ポイント)   Date: 2007/07/14(土) 22:39   No:9296 解決!     
Title: Re:WM_PAINTメッセージ    
有難うございました。
今急いでSendMessageをInvalidateRectに代えてます。


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



Name: プログラミング初心者  ..ぴよぴよ(530ポイント)   Date: 2007/07/14(土) 09:36   No:9289       
Title: GAME OVER画面とSTART画面    
質問ばかりで申し訳ないです><

自機が敵の弾に当たる。
という判定はできたんですが、それからの処理がいまいちよくわからず、
exeファイルから実行してみたところ、
はじめからGAME OVER画面になってしまいます。
具体的には、

if( (int)sqrt(x*x+y*y) < range+Player.range{
ClearDrawScreen();

EnemyShot[i].EnemyShots[j].x = Player.x; EnemyShot[i].EnemyShots[j].y = Player.y;


StopSoundMem(sound_enemy_shot[0]);
StopSoundMem(sound_enemy_shot[1]);

int White;
White = GetColor( 255, 255, 255 );

DrawString( 100, 120, "GAME OVER!", White);
DrawString( 100, 240, "Ecsキーで終了します。", White);
}

初心者なんでがたがたなんですが、
当たり判定後のGAME OVERみたいな画面について、
アドバイスをいただけないでしょうか。

よろしくお願いします。


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


Name: 解決さん   Date: 2007/07/30(月) 22:17   No:92891185801462 解決!     
Title: Re:GAME OVER画面とSTART画面    
ありがとうございます。アレから一週間いただいたコメントからファイル関数を見つけ、解決しました。
返事が遅くなり申し訳ありません。ありがとうございます。




Name: kidd  ..ぴよぴよ(14ポイント)   Date: 2007/07/11(水) 17:36   No:9231       
Title: 無題    
c言語で「正整数Nを入力後、N個の実数を入力し、それらの平均値と最大値を表示するプログラム」を教えてください。

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


Name: tkmakwins15 [URL]  ..かけだし(1,017ポイント)   Date: 2007/07/11(水) 21:59   No:9233     
Title: Re:無題    
こんな感じでしょうか↓

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

double average(int,double*); /*平均値を求める関数*/
double max(double,double); /*二つの実数のうち大きいほうを返す関数*/

int main(void)
{
char nyuryoku[1000]; /*入力した値を一時的に記憶する変数*/
int N; /*最初の正整数N*/
int count;/*実数入力時のカウントのための変数*/
double *input; /*そのあとの実数を記憶する変数*/
double heikin; /*平均値の変数*/
double saidai; /*最大値の変数*/

/*Nの入力部分*/
fgets(nyuryoku,1000,stdin);
N = atoi(nyuryoku);

input = (double*)malloc(sizeof(int)*N); /*N個の配列を確保(動的配列)*/
if(input==NULL){
return -1;
}

/*実数の入力部分*/
for(count=0;count<N;count++){
fgets(nyuryoku,1000,stdin);
input[count] = atof(nyuryoku);
}

/*平均値を求める*/
heikin = average(N,input);

/*最大値を求める*/
saidai=input[0];
for(count=0;count<N;count++){
saidai=max(saidai,input[count]);
}

/*まとめて表示*/
printf("%f,%f\n",heikin,saidai);

free(input);
return 0;
}

double average(int kazu,double *value)
{
int count; /*カウント用変数*/
double total=0;/*配列の総和*/
for(count=0;count<kazu;count++){
total += value[count];
}
return(total/kazu);
}

double max(double index1,double index2)
{
if(index1>=index2){
return index1;
}else{
return index2;
}
return 0.0;
}



表示はコンマで区切るようにしています。数値入力については、一回一回改行が必要です。


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

Name: kidd  ..ぴよぴよ(18ポイント)   Date: 2007/07/12(木) 23:54   No:9269 解決!     
Title: Re:無題    
ありがとうございました

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

Name: Justy  ..ハッカー(135,195ポイント)   Date: 2007/07/14(土) 03:15   No:9287     
Title: Re:無題    
input = (double*)malloc(sizeof(int)*N);
 この行はちょっとまずい気がします。
 sizeof(int) >= sizeof(double)な環境なら大丈夫かもしれませんが、
sizeof(int) < sizeof(double)な環境だと、後で領域が不足しそうです。


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

Name: tkmakwins15 [URL]  ..かけだし(1,482ポイント)   Date: 2007/07/14(土) 09:01   No:9288     
Title: Re:無題    
あっ、そうでした。これはまずいですね。kiddさん、justyさん、申し訳ありませんでした。

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



Name: ダッシュ  ..中級者(13,399ポイント)   Date: 2007/07/12(木) 02:39   No:9239       
Title: お久しぶりです。    
管理人さん。海外での発表に向けての英語の勉強はいかがですか。
こちらは受験勉強とかありますが、これが終わったら、ここにきてC言語を教えてもらいつつゲームを作るという目標を心の支えにして頑張っております。最近は作りたいゲームを色々考えた結果、シミュゲーに落ち着いてしまいました。今まではただ作ってみたいだけだったんですが、今回はかなり構想が組みあがっております。(脳内で///)
オープンキャンパスにも参加してみることにしました。取り合えず2校行ってみようと思います。でも旅費が半端ないことに(TT)

とまあ、前ふりはここまでで質問です。

管理人さんはメールアドレス公開してますよね?あれって迷惑メールとかウイルスとか入ってこないんですか?
今、僕はPCのアドの中に実名が入ってるんで変えようかと思ってるんですが、まず変え方がわからない。あとネット上にそのアドレスをさらす場合or誰かと情報を取る時にもっと安全なやり方はないものでしょうか?
後者では自分の掲示板とかなら大丈夫かなと思ったりしました。


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


Name: 管理人 [URL]  ..伝説のハッカー(381,854ポイント)   Date: 2007/07/12(木) 03:09   No:9240     
Title: Re:お久しぶりです。    
お久しぶりです〜^^
お元気でしたか??
英語の勉強は・・・洋書は読めど、話すようには慣れない今日この頃です・・。
いや、洋書も読めてはいませんが・・。

そちらは受験で忙しそうですね!
オープンキャンパスはどの辺お越しなのでしょう?
うちの大学に来てくれたら案内しますよ〜♪w
研究室公開とかしますしね!

メールアドレスは公開してますけど、今まで一度も迷惑メールきたことないですねぇ。
きっとそれはこのHTMLソースをみてもわかるとおり、メルアドが特殊文字に変換されているからではないでしょうか?
きっとホームページにだいたいてきにmailto:なんかで書いてると迷惑メール来るようになるんじゃないかと思います。
そのときは、画像にするといいですよ。
メルアドの部分だけ、背景同じにしてぱっとみわからないように作ればOKです。
ただ入力する側の人間としてはちとめんどうですけどね。

ここの掲示板以外でもメルアドは公開しますけど、迷惑メールはほとんどきませんよ。
4年くらい前はうんざりするほど来てましたけど・・。
どうしてでしょう?私のとこにたまたま来てないだけすかね。

メルアドはどこのものですか?
プロバイダメールならプロバイダのHPにいけばたいてい変更できますよ。
ホットメールとかなら変更できないんで、新しく違うメルアドでID取得しましょう。
基本的に無料メールは変更できないですねぇ。
安全なやり方は、フリーメールなら安全ではないでしょうか?
メールのヘッダ情報を見ると微妙に追跡出来るようですが、個人特定など不可能ですし、
プロバイダメールだからといって、プロバイダにこのメルアドつかってる人の情報教えてくれといったってまず教えるはずが無いですし。
mixiなんかのコミュニティサイトを使ってメッセージを交換するとかって手もあります。
掲示板やチャットも使えますよね。

私自身すぐ自分の個人情報さらけだすタイプなんで全然神経質じゃないんであまり参考にならないかもしれませんが^^;

ただ気にしだすときりないですしねぇ、メールどうのこうのよりも
掲示板に書き込みしただけで、リモートホストわかってしまいますし、そうなると住んでる県名とか、
PCの環境とか色々メールでわかることなんかよりずっと詳しい個人情報わかってしまいますし、
そうなると掲示板にも書き込めないしメールもきになるといってたんじゃ、何も出来なくなってしまう感じがします^^;

まぁネットには色んな人がいますからねぇ、トラブルになったこともありますが、ネットでゴタゴタ文字で文句言うならリアルに会って話したほうが早い気もしますし、
、、、やはり参考になりませんでしたねw
私自身メール送るだけで送り先に住所わかってしまうようなシステムでも別にいいよ・・って感じですので・・。


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

Name: ダッシュ  ..中級者(13,706ポイント)   Date: 2007/07/12(木) 03:32   No:9241     
Title: Re:お久しぶりです。    
おおーー。流石は管理人さん!!早いっすね〜〜。

>>うちの大学に来てくれたら案内しますよ〜♪w

ありがとう御座います。でも私立は×です。いえ、嫌というわけではないです。お金の面でやっぱ国公立しか無理です。(それに工学なのは確かですが、情報ではなく物理or化学工です。)管理人さんには散々お世話になってますから、一度あってみたいですが、オープンキャンパスでは無理そうです。大学でそっち方向になったらお会いすることもできるかもしれませんね。
ということで、管理人さんの出身県と愛知の方にお邪魔してみようと思います。



回答を読んで考えたのですが、メールなどをさらして、変なメールが入ってくるようになったら、その時変えたので個人情報は大丈夫と考えてよいのでしょうか?携帯とかはウイルスとか関係ないし、昔持ってたとき変なメールが入ってきてもすぐ変えてたので、さらしても大丈夫という感じがするのですが。PCの場合少し不安です。


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

Name: 管理人 [URL]  ..伝説のハッカー(381,957ポイント)   Date: 2007/07/12(木) 13:22   No:9244     
Title: Re:お久しぶりです。    
私立ですが、親には一銭も出してもらわないでもここに来てる友達いますよ☆
私も学費は半分出すということにしていますが、まぁ奨学金もあるので、視野の中にいれて下さい^^
状況を全く知らないのであまりいえませんけどね^^;

国公立と私立では、施設の充実度が半端なく違います^^;
(大学によるとは思いますけどね)

ちなみにうちの大学、私は情報ですが、隣の学科は物質化学ですよ☆

しかし愛知の国公立なら名大ですか〜?頭いいですね〜w頑張ってください^^


メールアドレスの件そこまで神経質にならなくてもいいんじゃないですかね〜^^;
別に個人名を知られてはいけない人に間違ってメール送ったりしたわけではなく、
単にウェブ上にメルアドをのせた、そこに名前がはいっていたというだけですよね?

私の友達はメルアドに「musashi」と入れていますけど、これペットの名前ですし、
変なメールが来るようになったとしても、何十億件もウェブを俳諧して何百万件も登録されたメルアドの一つになったというだけであって
そこから何かを特定しようとしている人がいるとは思えませんけど・・。

変な添付ファイルが沢山ついたメールが1日に100件位きていたことはありますが、
別に実行しなければいいだけですし、メルアド変更したならもう来ないし、何も心配する事は無いと思いますけど。どうでしょう?


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

Name: ダッシュ  ..中級者(13,942ポイント)   Date: 2007/07/12(木) 20:15   No:9252     
Title: Re:お久しぶりです。    
情報だけじゃなく化学もあるんですか。管理人さんはどこの大学なんです?

あと頭は全然悪いです・・ホントやばいですが、夏休みには精進してみようと思います。



そう言ってもらえると安心します。それとまださらしたわけじゃないです。でも念のため実名は抜いたアドレスにして公開しようと思います。2つアドレスってもてるんですかね?それができればアド変の通知回さなくていいから楽なのですが・・・。取り合えず、今からプロバイダのHPに行ってみます!!

PS サイトの600000アクセスおめでとうございます!


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

Name: ダッシュ  ..中級者(14,038ポイント)   Date: 2007/07/12(木) 20:59   No:9254     
Title: Re:お久しぶりです。    
連投スマソです。

2つ登録できました!!!

うん?でもよく考えてみると相手に送った時に自分のアドレス表示されますよね?あれってどうなるんですか?2つ表示されるんじゃ意味がないし・・・。


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

Name: 管理人 [URL]  ..伝説のハッカー(382,317ポイント)   Date: 2007/07/12(木) 21:06   No:9256     
Title: Re:お久しぶりです。    
京都本学のR大学です〜☆ 学生数だけはやたら多いですw
まぁ個人的に具体的な事でしたらメール送ってくださいw

まぁダッシュさんは私立ならK大とかW大とか、もっと賢いとこ狙ってください^^;

プロバイダは2つといわず、月100円とかオプションつければいくらでも持てると思いますよ。
標準で付いているメールアドレスは1つしか持てませんけど、プロバイダによっては変更前のアドレスに送られてきたメールを転送出来る機能もついているものがありますので、
プロバイダのHPをよく見てみるといいですよ。
プロバイダならまずメルアド変更は出来るはずです。
メルアド変更に料金がいるところもありますが・・。

60万アクセスありがとうございます!
しかし最近はもう大学が忙しくて忙しくて・・。
昨日も家に帰ったのは夜明けの時ですし、一昨日もそれ位でした。
期末が近くなってレポート三昧、半期研究はもうすぐ締め切り、8月は学会があって、もうすぐその原稿の締め切りですし、
DVD3枚せっかくレンタルしたのに1枚も見ずにしかも延滞して返してしまいました・・。

まぁ「忙しい」と口に出す奴は単に時間の作り方が悪いだけだとはよくいいますが、いっぱいいっぱいです(T_T


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

Name: 管理人 [URL]  ..伝説のハッカー(382,300ポイント)   Date: 2007/07/12(木) 21:23   No:9257     
Title: Re:お久しぶりです。    
もしよければ時間もある時にでも私にメール送ってください☆

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

Name: ダッシュ  ..中級者(14,282ポイント)   Date: 2007/07/12(木) 22:00   No:9260     
Title: Re:お久しぶりです。    
うう(TT)もう駄目です。限界です。。。

取り合えずアドレス2つ取得したんで、アカウントとかユーザーとかいじってたんですが、その概念もやり方もよくわかりません(泣)アカウントとユーザーの切り替え何が違うんですか><?

とにかく僕が考えてたのは、もし間違えて実名入りのアドレスを送るつもりのない人に送ったらいけないので、ユーザーごとで切り替えて、メインの方のユーザーの時→実名入りのアドレスでメール。他のユーザーの時→今取得したアドレスでメールって感じなのですが、もう全然わかんなくなりました・・・。


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

Name: ダッシュ  ..中級者(14,503ポイント)   Date: 2007/07/12(木) 22:09   No:9261     
Title: Re:お久しぶりです。    
大学の話です。
やっぱりR大でしたか。十中八九僕の、いえ一般に知らされているR大だと思いますが、やっぱ管理人さん凄いですね。確か第一志望ではないと聞きましたが、まさか滑り止めがR大とはいやはや。

もう国公立で絞り込んでしまっていて、大体どこにしようかも固まってるんで、これからそう動くことはないと思います。それと先日の管理人さんのアドバイスでもありましたが、実際に教授にメール出してみました。とてもいいお返事を頂いて、化学or物理工への決心が固まりました。ここは管理人さんにもお礼をいっとかなくてはなりません。ありがとうございました。

大学も忙しそうですね。理系って忙しいと聞くので、余暇を使ってのゲーム制作ができるかちょっと不安です。


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

Name: 管理人 [URL]  ..伝説のハッカー(382,510ポイント)   Date: 2007/07/13(金) 04:40   No:9273     
Title: Re:お久しぶりです。    
ユーザーとアカウントってoutlookの設定のことですか?
ユーザーが異なればメールを使う人が違う設定になっているはずです。
アカウントは同じ人がいくつももてるのではないでしょうか?違うかな?

雨ふってるなぁ・・、そろそろ帰って風呂はいって寝ますzzZ


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

Name:  ..上級者(19,198ポイント)   Date: 2007/07/13(金) 14:25   No:9276     
Title: Re:お久しぶりです。    
こんにちは★
会話に入っちゃいまぁーーっす♪♪

私、R大分かんないんですけど・・・・(笑)

私、一回管理人さんにメール送ったんですよ!!
前、マイミクの話しをしたんで・・・mixiのマイミクになってもらおうーと思って・・・でも返事がこなかったので、たぶん遅れなかったみたいです↓↓


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

Name: 管理人 [URL]  ..伝説のハッカー(382,556ポイント)   Date: 2007/07/13(金) 14:38   No:9277     
Title: Re:お久しぶりです。    
あれ・・、送られてきたメールは全て見ているはずなので、
きっと届いてないのかもしれません^^;
もう一度送ってもらえませんか?

dixqhp@gmail.com

こちらです〜☆


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

Name: ダッシュ  ..中級者(14,612ポイント)   Date: 2007/07/13(金) 17:40   No:9281     
Title: Re:お久しぶりです。    
はあ、昨日はすいませんでした。やっとアカウントとユーザー設定の意味が分かりました・・・。今やっと設定完了したところです。

それにしても管理人さんの第一志望ってどこだったんですか?R大より上って結構限られてると思うのですが・・・。


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

Name: 管理人 [URL]  ..伝説のハッカー(382,598ポイント)   Date: 2007/07/13(金) 20:10   No:9283     
Title: Re:お久しぶりです。    
まぁどうせ入れなかったわけですからw
受けるだけなら東大でもハーバードでも受けれますし☆

メルアド教えてもらえるか、私に送ってもらえたらメール送りますよ〜♪


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

Name: ダッシュ  ..中級者(14,636ポイント)   Date: 2007/07/13(金) 20:34   No:9284     
Title: Re:お久しぶりです。    
一応こっちにも書いときます。メール送りました。

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



Name: ひろ  ..入門者(2,852ポイント)   Date: 2007/07/13(金) 16:48   No:9280       
Title: SendMessageについて    
こんにちわ。

ちょっと疑問に思ったので質問させてください。

WindowAPIのSendMessage関数のパラメータLPARAMとかWPARAMでよく使われる「0L」ってどういう意味ですか?
「0」じゃだめなんですか?


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


Name: tkmakwins15 [URL]  ..かけだし(1,446ポイント)   Date: 2007/07/13(金) 18:08   No:9282     
Title: Re:SendMessageについて    
windows API については、よく分からないのですが。0Lと言うのは、
long int型の変数に数値0を代入するときの表記です。


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



Name: テオリア [URL]  ..ぴよぴよ(47ポイント)   Date: 2007/07/12(木) 21:47   No:9259       
Title: fgets関数について    
http://www.dia-net.ne.jp/~xbox/question.html

上記のURLにプログラムのソースを載せました。

実行し、文字列の個数を入力すると、なぜか最初のループで、文字列の入力ができません。

2回目以降は、入力ができます。

どうしてなのでしょうか?

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


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


Name: Hermit  ..中級者(10,554ポイント)   Date: 2007/07/12(木) 22:16   No:9262     
Title: Re:fgets関数について    
scanf("%d", &n);
では、数値の後の改行までは取得されないため、
最初の入力時にその改行が入ってしまいます。

最初の改行を取り除く処理が必要です。

scanf("%d", &n);
fgets(str, 100, stdin);

くらいでいいんじゃないかな?もっとスマートなやり方あったかもしれないが(^^;


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

Name: テオリア  ..ぴよぴよ(72ポイント)   Date: 2007/07/12(木) 22:35   No:9263     
Title: Re:fgets関数について    
そういうことだったんですか!

ありがとうございます。



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

Name: tkmakwins15 [URL]  ..かけだし(1,208ポイント)   Date: 2007/07/12(木) 23:38   No:9265     
Title: Re:fgets関数について    
>くらいでいいんじゃないかな?もっとスマートなやり方あったかもしれないが(^^;

getchar()関数で空読みするという方法がいいと思います、getchar()の場合は、戻り値
に入力されたキー(正確には入力バッファに残っているもの)を返すだけですから、それ
を無視してしまえばいいと思います。


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

Name: テオリア  ..ぴよぴよ(113ポイント)   Date: 2007/07/13(金) 16:18   No:9279 解決!     
Title: Re:fgets関数について    
tkmakwins15さん、回答ありがとうございます。

実際やってみたところ、私が求めていたものでした。

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


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



Name: yama  ..ぴよぴよ(41ポイント)   Date: 2007/07/13(金) 14:19   No:9275       
Title: 質問します。    
シューティングゲームの館で勉強しているのですが、ばらまきショットの所で自分は全角度に弾をばらまきたいのですが、どうしたらいいのですか?すいませんが教えてください。


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


Name: 管理人 [URL]  ..伝説のハッカー(382,570ポイント)   Date: 2007/07/13(金) 14:42   No:9278     
Title: Re:質問します。    
そこに書いてある説明を読んでいただけたら解ると思いますが、

まず、80度位の範囲で、弾をばらまこうと思います。
1ラジアン(rad)はだいたい、57度位なので、1.5ラジアンの範囲で、乱数をとれば、80度の範囲のばらまきができます。
ということは、敵とプレイヤーの角度-0.75ラジアン〜+0.75ラジアンの範囲でばらまけばいいわけです。
-0.75〜+0.75の乱数は(double)GetRand(1500) / 1000.0f - 0.75fで作ることが出来ます。


つまり1周と言うことは円周率X2と言うことですよね。
3.14159216....という数に2をかければ360度になります。
その範囲の数を乱数で生成してやればいいわけです。
今回の場合は敵と自分との範囲角度は関係ないので単純に360度の角度だけ乱数でつくってやればいいことになります。


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



Name: ライト  ..ぴよぴよ(335ポイント)   Date: 2007/07/13(金) 01:09   No:9272       
Title: 配列を用いた課題    
なんとか、できました。ありがとうございました。


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


Name: フリオ  ..中級者(12,866ポイント)   Date: 2007/07/13(金) 12:37   No:9274     
Title: Re:配列を用いた課題    
 
 "pos"を配列にして、見つかった数字の添え字を記録していけばできます。

 


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



Name: 徹夜  ..かけだし(2,400ポイント)   Date: 2007/07/12(木) 18:06   No:9249       
Title: 前の投稿は分かりにくかったですね。文字列の課題    
文字strの中に、文字cが含まれている個数(含まれていなければ0)を返す関数
int str_chum(const char str[],int c)
を作成せよと言う問題なのですが
下まで作ってみたのですが、実行結果
どんな文字を打っても個数は0個ですとでてしまい数えられていないのですが
どこがおかしいですか
#include<stdio.h>
int str_chum(const char str[],int c);

int main()
{
char st[256];
char ch[10];


printf("文字列を入力してください:");
scanf("%s",st);

printf("個数を数えたい文字を入力してください:");
scanf("%s",ch);


printf("入力された文字の個数は%dです",str_chum(st,ch[0]));
}
int str_chum(const char str[],int c)
{
int i;
int count=0;

if(i=0,str[i]!='\0',i++){
if(*str==c)
count++;

}
return(count);
}


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


Name: Hermit  ..中級者(10,438ポイント)   Date: 2007/07/12(木) 20:46   No:9253     
Title: Re:前の投稿は分かりにくかったですね。文字列の課題    
色々おかしいです。
どこが変かご自分でチェックしてみてください。
 

#include<stdio.h>
int str_chum1(const char str[], int c);
int str_chum2(const char str[], int c);

int main()
{
char st[256];
char ch[10];

printf("文字列を入力してください:");
scanf("%s", st);

printf("個数を数えたい文字を入力してください:");
scanf("%s", ch);

printf("入力された文字の個数は%dです\n", str_chum1(st, ch[0]));
printf("入力された文字の個数は%dです\n", str_chum2(st, ch[0]));

return 0;
}
int str_chum1(const char str[], int c)
{
int i;
int count = 0;

for (i = 0; str[i] != '\0'; i++) {
if (str[i] == c)
count++;
}
return count;
}
int str_chum2(const char *str, int c)
{ // bcc32 Ver5.5.1 では、const char str[] ではエラーになるようなので、変更。他では問題ないはず。
int count = 0;

for ( ; *str != '\0'; str++) {
if (*str == c)
count++;
}
return count;
}


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



Name: tkmakwins15 [URL]  ..かけだし(1,044ポイント)   Date: 2007/07/11(水) 22:03   No:9234       
Title: wchar_t型の変数の入力について    
wchar_t型で漢字入力はできるのでしょうか?
できるのならば、その方法を教えてください。
直接のリテラルなどによる代入や、その表示、
ロケールの設定はできますので、よろしく
お願いします。


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


Name: Justy  ..ハッカー(135,224ポイント)   Date: 2007/07/11(水) 23:02   No:9235     
Title: Re:wchar_t型の変数の入力について    
 MSVCだとするなら、fwscanf/wscanfとか fgetws/_getwsとかでできますよ。


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

Name: tkmakwins15 [URL]  ..かけだし(1,121ポイント)   Date: 2007/07/12(木) 00:42   No:9237     
Title: Re:wchar_t型の変数の入力について    
追加の質問で悪いのですが、漢字への変換はスペースキーなど普通の変換キーでできるのですか?
また、Visual Studio 2005のC++でやっているのですが、これらの関数の引数は、普通のgets()関数
などに準じていいのでしょうか?


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

Name: Justy  ..ハッカー(135,094ポイント)   Date: 2007/07/12(木) 01:36   No:9238     
Title: Re:wchar_t型の変数の入力について    
漢字への変換はスペースキーなど普通の変換キーでできるのですか?
 コマンドプロンプトの話ですよね?
 Alt+半角/全角キーとかで切り替わると思いますが、どうでしょう?
 それがダメなら、ファイルとかからリダイレクトするか、(コピー&)ペーストすれば入力できます。


これらの関数の引数は、普通のgets()関数などに準じていいのでしょうか?
 charか wchar_tの違いくらいで、後は同じです。


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

Name: tkmakwins15 [URL]  ..かけだし(1,126ポイント)   Date: 2007/07/12(木) 17:29   No:9247 解決!     
Title: Re:wchar_t型の変数の入力について    
ありがとうございました。またよろしくお願いします。

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



Name: forget  ..ぴよぴよ(750ポイント)   Date: 2007/07/12(木) 17:07   No:9246       
Title: 複雑ネットワークのWSモデルについて    
ワッツ・ストロガッツモデル(WSモデル)をC言語で作っていますが、つまづいています。

ノード数 N
次数(偶数)m
確率p(0<p<1)

を与えたときに、
二次元配列link[i][j]の[]にノードを入れます。
iは枝が出る頂点、jは枝が到着する頂点です。
WSモデルのルールに従って、p=0つまり「枝が変化しない」場合のWSモデルまでは作れましたが、
p>0が作れません。
お分かりになる方、お助けください。

動作はこのようになります。
p=0,m=2,N=6の場合

1 2          
2 3
3 4
4 5
5 6
6 1

下がこれまで作ったWSモデルプログラムです。

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

void ws_model(int N, int m, double p);

int main(int argc, char *argv[])
{
int N; //ノードの数
int m=atoi(argv[1]); //次数(偶数)
double p=atof(argv[1]); //確率

if(argc == NULL) exit(0);

printf("Input Vertex Size: ");
scanf("%d", &N);

ws_model(N,m,p);
return 0;
}

void ws_model(int N, int m, double p)
{
int i,j,q; //ノード番号
int edge;
int link[200][200];

srand((unsigned)time(NULL));

for(i=0;i<N;i++)
for(j=i+1;j<m/2+i+1;j++) {
if(j>=N) {
q=j-N;
}else{
q=j;
}
link[i][q]=1;
link[q][i]=1;

printf("%d %d 1\n", i+1, q+1);
/* ここまで p=0のときのWSモデル  ノードのペア重複しない*/
/* 以下 0<p<1のときのWSモデル */
if(p>(double)rand()/RAND_MAX) {


         ?

//変化する枝の本数 p*m*N/2 本
/*全枝の中からp*m*N/2本をランダムに選び、
  @同じ頂点以外A隣の頂点以外 の頂点に接続する
*/
}
}
}





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




Name: プログラミング初心者  ..ぴよぴよ(141ポイント)   Date: 2007/07/11(水) 11:57   No:9228       
Title: 前回はありがとうございました。    
前回の問題解決しました。

お礼に便乗してもうひとつ聞きたいことができました。

シューティングゲームの館のとおりにプログラムを組んだんですが、
・敵の動作のパターン2,4以外で、弾を打つようにするやり方。
・敵の弾と、自機との当たり判定。

上の二つがどうもうまくいきません。
いい方法があったら教えてもらえないでしょうか。

質問ばかりで申し訳ないです><


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


Name: 管理人 [URL]  ..伝説のハッカー(381,031ポイント)   Date: 2007/07/12(木) 00:06   No:9236     
Title: Re:前回はありがとうございました。    
こんにちは。

「うまくいきません」⇒「いい方法は?」

と抽象的にお聞きいただいても回答に困ってしまうのですが、、
具体的にどのようにうまくいかないのでしょうか?
また、あのプログラムはとにかく初心者にわかりやすく、とりあえず雰囲気を味わってもらうようなプログラムなので完全な形ではありませんし、
最適な方法ではありませんので、その辺ご了承下さい。

やり方はサンプルを実行してもらってサンプルの意味を理解していただければ応用が効くと思います。

当たり判定はピタゴラスの定理を使って距離を計算したり、範囲円にはいってきたら当たったと判定すればいいですし、
もし期待を飛行機のような形にし、円でも長方形でもないとするのなら、
正方形(長方形)の塊だと考えるといいですよ。
たとえば飛行機の形に当たり判定を作りたい時は

    □
    □
    □□
   □□□
  □□□□□
    □
 
 
こんな感じ?(絵が下手)
で当たり判定をすると高速に計算でき、アルゴリズムも簡単になっていいでしょう。


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

Name: プログラミング初心者  ..ぴよぴよ(97ポイント)   Date: 2007/07/12(木) 12:07   No:9243 解決!     
Title: Re:前回はありがとうございました。    
ありがとうございます。
サンプルプログラムとにらめっこしてみますね。


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



Name: さっかん  ..入門者(4,889ポイント)   Date: 2007/07/08(日) 20:39   No:9194       
Title: CSVに書き換える    
再びつまずいてしまいました;;よろしくお願いします。
CSVに書き換える課題です。
JZK-30 jizake_tsumeawase 4500
BSP-15 body_soap_set 3000
というファイルを
JZK-30, 4500, jizake_tsumeawase
BSP-15, 3000, body_soap_set
というように順番を入れ替えつつカンマをつけて指定したファイルに書き込む課題なんですが、やはり実行して書き込むファイル名を指定したとたんセグメントエラーになってしまいます;;
ご指摘おねがいします。
方法としては一端fpというファイルに一行ずつ書き込んでからfp2に書き込んでいます。

#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
int main()
{
FILE *fp1,*fp2,*fp;
char s[256],data1[20],data2[20],data3[20];
char fname1[20],fname2[20];
int i;
printf("Input filename:");
scanf("%s",fname1);
printf("Output filename:");
scanf("%s",fname2);
if ((fp1 =fopen(fname1,"r"))==NULL){
printf("file open error!!\n");
exit(1);
}
fp2=fopen(fname2,"a+");
while(fgets(s,256,fp1)!=NULL){
for (i = 0; s[i] !='\0'; i++){
fputs(s,fp);
fscanf(fp,"%s %s %s",data1,data2,data3);
fprintf(fp2,"%s, %s, %s\n",data1,data3,data2);
}
}
fclose(fp1);
fclose(fp2);
printf("Conversion finished\n");
return 0;
}


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


Name: Hermit  ..中級者(9,432ポイント)   Date: 2007/07/08(日) 21:25   No:9195     
Title: Re:CSVに書き換える    
こんな感じかな・・・
 

fp2 = fopen(fname2, "a+");
while (fgets(s, sizeof s, fp1) != NULL) {
sscanf(s, "%s %s %s", data1, data2, data3);
fprintf(fp2, "%s, %s, %s\n", data1, data3, data2);
}

ところで、書き込みモードは "a+" でいいんですよね。


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

Name: さっかん  ..初心者(5,112ポイント)   Date: 2007/07/08(日) 21:54   No:9198     
Title: Re:CSVに書き換える    
前のデーターが消えてしまうのが嫌だったのでa+にしてます。
ご指摘の通りこのように書き換えてみたんですが
fp2=fopen(fname2,"a+");
while(fgets(s,256,fp1)!=NULL){
sscanf(s,"%s %s %s",data1,data2,data3);
fprintf(fp2,"%s, %s, %s\n",data1,data3,data2);
}
実行後に書き込んだファイルの中身を見てみると
JZK-30, 4500, jizake_tsumeawase
BSP-15, 3000, body_soap_set
BSP-15, 3000, body_soap_set
という感じで最後だけ二回書き込まれてるんですが、これはどのように修正すれば良いでしょうか?


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

Name: さっかん  ..初心者(5,200ポイント)   Date: 2007/07/08(日) 23:40   No:9204     
Title: Re:CSVに書き換える    
JZK-30 jizake_tsumeawase 4500
BSP-15 body_soap_set 3000
のファイルの最後に改行を入れているのが原因でした。ご迷惑をおかけしました;;
あと、このプログラムをキーボード入力ではなく、コマンド引数に指定することで動作するようにしたいんですが、全然検討もつきません。ちなみに例をあげるとこんな感じです。

% ./change smpl.txt smpl.csv

ご指導のほどよろしくお願いします。


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

Name: Hermit  ..中級者(9,731ポイント)   Date: 2007/07/09(月) 19:08   No:9207     
Title: Re:CSVに書き換える    
こんな感じでどうでしょう?ちょっと遊んではいますが(^^;
 

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

int main(int argc, char **argv) {
FILE *fp[] = {NULL,stdin, stdout};
char s[256];
char *mode[] = {NULL,"r","a+"};
int i;

for (i = 1; i < argc && i < 3; i++) {
fp[i] = fopen(argv[i],mode[i]);
if (fp[i] == NULL) {
fprintf(stderr,"file open error %s\n",argv[i]);
exit(1);
}
}

while (fgets(s, sizeof s, fp[1]) != NULL) {
char data1[20], data2[20], data3[20], check;
i = sscanf(s, "%19s %19s %19s %c", data1, data2, data3, &check);
if (i != 3) {
fprintf(stderr,"input error\n");
exit(1);
}
fprintf(fp[2], "%s, %s, %s\n", data1, data3, data2);
}

fclose(fp[1]);
fclose(fp[2]);

printf("Conversion finished\n");

return 0;
}


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

Name: さっかん  ..初心者(5,351ポイント)   Date: 2007/07/09(月) 23:58   No:9210     
Title: Re:CSVに書き換える    
ちょっと難しいので少しずつでも理解していこうと思います!
あと、すいませんが引数の数を数えて、引数の数を間違えて入力された時のエラーメッセージ(使用方法を表示する)も出したいんですが、可能でしょうか?こんな感じです↓

% ./change smpl.txt (読み取るファイル名しか入力されてない)

Usage: change INFILE OUTFILE  (使用方法を表示して終了)


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

Name: @とんぷぅ〜  ..プログラマー(34,717ポイント)   Date: 2007/07/10(火) 17:05   No:9215     
Title: Re:CSVに書き換える    
普通にこんな感じでいいんではないでしょうか?

// パラメータのチェック
if (argc != 3) {
printf("usage: %s change INFILE OUTFILE\n", argv[0]);
exit(1);
}


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

Name: さっかん  ..初心者(5,512ポイント)   Date: 2007/07/10(火) 17:53   No:9216     
Title: Re:CSVに書き換える    
argcに引数の数、argvに引数の名前が入るんですよね?
FILE *fp[] = {NULL,stdin, stdout};
char *mode[] = {NULL,"r","a+"};
i = sscanf(s, "%19s %19s %19s %c", data1, data2, data3, &check);
の行が何を行っているのかわからないんですが、使いかたの説明もふまえて教えていただけるとありがたいです。


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

Name: Hermit  ..中級者(10,070ポイント)   Date: 2007/07/10(火) 20:39   No:9224     
Title: Re:CSVに書き換える    
遊んでる所ですね。

int main(int argc, char **argv)

例えば、
c:\bin\foo.exe foo.txt bar.txt
とした場合、
argv[0] -> プログラム名 -> c:\bin\foo.exe
argv[1] -> foo.txt
argv[2] -> bar.txt
だから、

0 の時、無視 -> NULL でうめておく

argv[1] に対応する時、argv[2] に対応する時

FILE *fp[] = {NULL,stdin, stdout};
で、入力ファイルが指定されない時は、stdin
出力ファイルが指定されなければ、stdout をデフォルトで当てています。

foo.exe foo.txt などとしておけば、bar.txt を開かなくてもコンソールに出てくるので楽だから(^^;

char *mode[] = {NULL,"r","a+"};

これは、argv[1],argv[2] の時のファイルのオープンモードの指定だけです。
fopen(argv[1],mode[1])
の様に、同じ添え字で済まそうと言う手抜きです。

i = sscanf(s, "%19s %19s %19s %c", data1, data2, data3, &check);
if (i != 3) {

これは、sscanf で変換された物が、3 個である事をチェックしています。
%19s は、バッファが 20byte なので、19文字 + null文字 の範囲しか入らないようにです。
最後の %c と、&check は、変換されないはずですが、変換されたら i が 4 になるのでエラーにしています。
少ない場合も、当然エラーです。
前回の、改行だけの時表示してしまった事への対策です。


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

Name: さっかん  ..初心者(5,576ポイント)   Date: 2007/07/11(水) 21:26   No:9232 解決!     
Title: Re:CSVに書き換える    
なるほど〜。かなりよく理解できました。
おかげさまで問題も解決しました!
Hermitさん、@とんぷぅ〜さん、どうもありがとうございました!!


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



Name: 徹夜  ..かけだし(1,977ポイント)   Date: 2007/07/06(金) 10:44   No:9131       
Title: またまた課題(文字列)    
文字strの中に、文字cが含まれていなければ(複数ある場合は最も先頭側とする)

その添え字を返し、含まれていなければ-1を返す関数

この問題で含まれている 含まれていないがよくわかんないんですね
↓に書いてみましたが教えてください


int str_char(const char str[],int c)
{
unsigned len=0;
while(str[len]){
if(str[len]==c)
return(len);
len++;
}
printf("-1\n");


}

int main()
{
char st[100];
int c='A';
int no;
printf("文字列を入力した下さい:");
scanf("%s",st);
no=str_char(st,c);
if(no>=0)printf("指定した文字は%d番目に見つかりました\n",no);
else printf("指定した文字は見つかりませんでした\n");

}


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


Name: keichan  ..プログラマー(27,038ポイント)   Date: 2007/07/06(金) 11:09   No:9132     
Title: Re:またまた課題(文字列)    
>printf("-1\n");
  ↓
return -1;


>この問題で含まれている 含まれていないがよくわかんないんですね
申し訳ありませんが、質問の意味がわかりません。
詳しい補足をお願いします。


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

Name: バグ  ..熟練のプログラマー(53,994ポイント)   Date: 2007/07/06(金) 11:16   No:9133     
Title: Re:またまた課題(文字列)    
1:str_char関数で指定した文字が見つからなかった場合の戻り値が設定されていません。

2:[ if(no>=0) ]この部分ですが、個人的にはエラーだった場合を判定した方がいいかと思います。あくまでも個人的な意見なので、間違いではありません。

3:これも個人的な意見ですが、[ unsigned len; ]これも[ unsigned int len; ]のように明示的に宣言しておいた方がより良いかと思います。

※2と3は本当に個人的な意見なので、無視してもらってもかまいません


#include <stdio.h>

int str_char(const char str[], int c)
{
unsigned int len = 0;

while (str[len] != '\0')
{
if (str[len]==c)
{
return len;
}

len++;
}

return -1;
}

int main()
{
char st[100];
int c = 'A';
int no;

printf("文字列を入力して下さい : ");
scanf("%s", st);
no = str_char(st, c);

if(no == -1)
{
printf("指定した文字は見つかりませんでした\n");
}
else
{
printf("指定した文字は%d番目に見つかりました\n",no);
}

return 0;
}


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

Name: 管理人 [URL]  ..伝説のハッカー(381,348ポイント)   Date: 2007/07/06(金) 11:19   No:9134     
Title: Re:またまた課題(文字列)    
return -1さえ直せば実行結果としてとりあえず出ていると思いますが、どこが足りないのでしょうか?
またno番目だと、見た感じ1文字足りていないように思うので、no+1番目としたほうがよくないでしょうか。

それともプログラムコードについては配布されたもので、このコードの意味がわからないと言う事でしょうか?


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

Name: バグ  ..熟練のプログラマー(54,016ポイント)   Date: 2007/07/06(金) 11:24   No:9136     
Title: Re:またまた課題(文字列)    
あ、追記です。

4:main関数の戻り値がありません。


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

Name: 徹夜  ..かけだし(2,123ポイント)   Date: 2007/07/11(水) 16:10   No:9230     
Title: Re:またまた課題(文字列)    
大変遅くなりましたが質問した内容は解決いたしましたが、
文字列strの中に文字cが含まれている個数(なければ0)を返す関数で
returnの返し方が分かりません。というか上記のプログラムで表示とか変更した上でreturnのみを変換すればできるということなのでしょうか?

文字列str内のすべての数字を削除するプログラムを作りたいのですが、これもよくわかりません。

文字列は実行時に入力で求めたいです




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



Name: プログラミング初心者  ..ぴよぴよ(41ポイント)   Date: 2007/07/04(水) 15:50   No:9092       
Title: ものすごく初歩的なんですが、    
はじめのDxLibのセッティングのところで、
既存項目の追加 → DxLib.hを追加
のところが出来なくて、
プログラムを組んでもインクルードできないんですが…
わかる方教えていただけないでしょうか・・・


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


Name: 管理人 [URL]  ..伝説のハッカー(381,222ポイント)   Date: 2007/07/04(水) 18:40   No:9099     
Title: Re:ものすごく初歩的なんですが、    
DXライブラリの設定はhttp://homepage2.nifty.com/natupaji/DxLib/dxuse.htmlここに詳しく書いてあるので参考にしてください☆

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

Name: プログラミング初心者  ..ぴよぴよ(136ポイント)   Date: 2007/07/11(水) 12:22   No:9229 解決!     
Title: Re:ものすごく初歩的なんですが、    
本当にありがとうございました。
なんとかできました。


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



Name: te05  ..ぴよぴよ(160ポイント)   Date: 2007/07/10(火) 14:09   No:9213       
Title: gets()等    
80字以内の英文をgets()を用いて入力し、putchar()を用いて出力する。また、文字の並びを逆向きにputchar()で出力する。
80字以内の英文をgetchar()を用いて入力し、puts()を用いて出力する。

ただし、strcpy()、strcat()、strlen()は使用しない。



以上です。
よろしければ、教えて下さい。


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


Name: toyo  ..入門者(3,822ポイント)   Date: 2007/07/10(火) 14:42   No:9214     
Title: Re:gets()等    
これは課題でしょうか
gets( )の危険性を理解して練習で使う分にはよいのでしょうが

とりあえず入力用のバッファとしてchar型の配列変数を十分なサイズで宣言しましょう
gets( )関数を使って宣言した変数に入力します

ここまでは出来ますか。


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

Name: te05  ..ぴよぴよ(170ポイント)   Date: 2007/07/10(火) 21:54   No:9226     
Title: Re:gets()等    
返事遅れてすいません。
ありがとうございます。
はい、そこまでは大丈夫です。


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

Name: Hermit  ..中級者(10,193ポイント)   Date: 2007/07/10(火) 22:40   No:9227     
Title: Re:gets()等    
80字以内の英文 なので、バッファは、81byte 以上は必要と思われます。

gets,getchar,puts,putchar のエラー時の対応はどうすればいいか

このあたりが気をつけるところでしょうか。

あとは、書いてある通りにプログラムするだけなので、簡単でしょう。


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



Name: 順列  ..ぴよぴよ(256ポイント)   Date: 2007/07/10(火) 20:09   No:9221       
Title: 順列で…    
n個の中からr個をえらんで並べる順列の計算をするプログラム int kaijo(int n)というn!を計算する関数を使って書きなさい。

#include<stdio.h>
int kaijo(int n);
int main(void)
{
int i,j;
for(i=0;i<=5;i++){
for(j=0;j<=i;j++){
printf("%dP%d=%d\n",i,j,kaijo(i,j));
}
printf("\n");
}
return 0;
}
int kaijo(int n,int r)
{
int i,nk=1,rk=1,nr=1;
for(i=1;i<=n;i++){
nk*=i;
}
for(i=1;i<=(n-r);i++){
nr*=i;
}
return nk/nr;
}

わからないので教えてください((+_+))


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


Name: box  ..比類無きプログラマー(77,611ポイント)   Date: 2007/07/10(火) 21:28   No:9225     
Title: Re:順列で…    
マルチポストを発見しましたので、回答した内容を削除します。

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



Name: マサキ  ..入門者(4,287ポイント)   Date: 2007/07/10(火) 19:08   No:9217       
Title: nanについて    
ただいま手作業でやるのが面倒なため、プログラムを作り計算をさせようとしました。
プログラム自体は何の問題もなくコンパイルでき、ちゃんと実行もできるのですが、実行結果が思わしくありません。
nanと出てきてしまうのです。
nanとは何なのでしょう??
またこのプログラムの何処を修正すれば、ちゃんとした結果が得られるのでしょうか?
宜しくお願いします。


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


Name: 組木紙織  ..上級者(17,838ポイント)   Date: 2007/07/10(火) 19:22   No:9218     
Title: Re:nanについて    
途中0で割ったりしていませんか?
>scanf("%f",&b);
bはdoubleなので
scanf("%lf",&b);
ですね。
scanf()では必須です。

ちなみにprintf()では[%f]でも正しく動くはずです。


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

Name: マサキ  ..入門者(4,372ポイント)   Date: 2007/07/10(火) 19:58   No:9219     
Title: Re:nanについて    
ありがとうございます。
scanf("%lf",&b);
に直してみました。
しかし、結果はnanのままです。
途中で0で割るところは出てこないはずなんですけどね....なんででしょう?


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

Name: YuO  ..初心者(8,805ポイント)   Date: 2007/07/10(火) 20:06   No:9220     
Title: Re:nanについて    
NaNはNot a Number,非数のことです。
0割の結果とか,tan π/2とか,そういう数学的に定義不可能な値の場合に出てきます。


で,コードを見ましたが,mが0になっています。
よって,aがNaNになり,それが伝播してNaNが出力されています。

double m = 1/45;
ではなく,
double m = 1.0 / 45;
とか
double m = 1.0 / 45.0;
のように初期化してやる必要があるのだと思います。


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

Name: 組木紙織  ..上級者(17,862ポイント)   Date: 2007/07/10(火) 20:11   No:9222     
Title: Re:nanについて    
私の環境ではmが0になります。
多分そのせいではないでしょうか。


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

Name: マサキ  ..入門者(4,438ポイント)   Date: 2007/07/10(火) 20:34   No:9223 解決!     
Title: Re:nanについて    
double m = 1.0 / 45.0;
としたところ上手く作動しました。
こんな初歩的なミスをしてしまい申し訳ないです。
ありがとうございました。


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



Name: @とんぷぅ〜  ..プログラマー(32,663ポイント)   Date: 2007/07/04(水) 16:54   No:9093       
Title: ファイル内容のソート    

Seseki.txtというファイルに、以下のように試験の成績が入っている。
件数は、最大100件とする。

学籍番号 性    名   性別   国語 数学 理科 社会 英語
0001 Fukusima Taro M 60 70 90 30 50
0002 Fukuda Hanako F 80 50 90 70 40
0003
:
:

このファイルを読み、以下の処理を施して科目別のファイルに結果を書き込むプログラムを作成せよ。
・処理
・科目ごとに成績順に並び変える。
 成績が同じ場合、学籍番号順に並べる。

・科目ごとの平均点を求める。
 平均点は、全体の平均、男の平均、女の平均、それぞれを求める。

・個人ごとの総合点を求め、総合点順に並べ変える。
 成績が同じ場合、学籍番号順に並べる。

・総合点の平均を求める。
 平均点は、全体の平均、男の平均、女の平均、それぞれを求める。

書き込むファイルは全部で6個のファイルである。
・国語の成績表 Kokugo.txt
・数学の成績表 Suugaku.txt
・理科の成績表 Rika.txt
・社会の成績表 Syakai.txt
・英語の成績表 Eigo.txt
・総合の成績表 Sougou.txt

書き込むファイルのフォーマットは以下の通り。

成績表  国語
平均点     
男の平均点
女の平均点
順位 学籍番号 性 名   性別      得点
    1   0002 Fukuda Hanako F 80
2 0001 Fukushima Taro M 60

というのが今回の課題なんですが、ハッキリ言って殆ど分かりません(涙)
まずファイルをオープンして、ファイル内容をソートするのが分かりません。
どのようにすればよいのでしょうか?

自分もよく分からないまま作成しているので意味不明なんですが、
ソートとファイルオープンまではやってみました。これから具体的にどうすれば
いいのかご教授下さい。構造体も初めて使ったので変数宣言で、
足りない部分やおかしい部分があったら指摘して下さい。
よろしくお願いします。


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


Name: toyo  ..入門者(2,541ポイント)   Date: 2007/07/04(水) 17:22   No:9094     
Title: Re:ファイル内容のソート    
まずファイルからデータの読み込みですが
最大100件ということならSCORE構造体の配列を100個作っておいて
それにファイルから読み込んだデータをループでEOFになるまで代入していけばどうでしょうか
fgets( )で文字列として1行読んでscanf( )で代入するか最初からfscanf( )で代入も出来ます。


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

Name: toyo  ..入門者(2,762ポイント)   Date: 2007/07/04(水) 17:34   No:9095     
Title: Re:ファイル内容のソート    
構造体がファイルと違ってますね
性別のところは姓のことでしょうか

typedef struct SCORE
{
int bangou; // 学籍番号
char sei[20]; // 性
char name[10]; // 名前
char sex; // 性別
int Japanese; // 国語
int math; // 数学
int science; // 理科
int social; // 社会
int english; // 英語
} SCORE;

あと読み込むときにカウンタをつけて件数を保存しておくといいですね


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

Name: @とんぷぅ〜  ..ぴよぴよ(505ポイント)   Date: 2007/07/04(水) 18:32   No:9097     
Title: Re:ファイル内容のソート    
toyoさん初めまして。

丁寧な説明ありがとうございます。

typedef struct SCORE
{
int number; // 学籍番号
char sei[20]; // 性別
char name[10]; // 名前
int japanese; // 国語
int math; // 数学
int science; // 理科
int social; // 社会
int english; // 英語
};
struct SCORE student[100];

一応上記の様にSCORE構造体の配列を100個ほど作りました。

>それにファイルから読み込んだデータをループでEOFになるまで代入していけばどうでしょうか
 fgets( )で文字列として1行読んでscanf( )で代入するか最初からfscanf( )で代入も出来ます。

すみません。知識不足で理解できていないんですが、こういうことでしょうか?

while ((c = fgetc(fp)) != EOF)
{
for ( i = 0; i < 100; i++ )
{
fscanf(fp, "%d", &student[i].number);
fscanf(fp, "%s", &student[i].sei);
fscanf(fp, "%s", &student[i].name);
fscanf(fp, "%d", &student[i].japanese);
fscanf(fp, "%d", &student[i].math);
fscanf(fp, "%d", &student[i].science);
fscanf(fp, "%d", &student[i].social);
fscanf(fp, "%d", &student[i].english);
}
}

たぶん違うと思いますが。。。


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

Name: とよtoyo  ..ぴよぴよ(398ポイント)   Date: 2007/07/04(水) 20:47   No:9101     
Title: Re:ファイル内容のソート    
エラー処理等考えると1行ずつ読み込んでsscanfしたほうがいいかもしれません
データを読み込んで確認表示するところまで

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

#define ARRAY_SIZE 100

typedef struct SCORE
{
int bangou; // 学籍番号
char sei[20]; // 性
char name[20]; // 名
char sex; // 性別
int japanese; // 国語
int math; // 数学
int science; // 理科
int social; // 社会
int english; // 英語
};

struct SCORE student[ARRAY_SIZE];

int main(void)
{
FILE *fp;
char buf[256];
int count = 0;
int n, i;

if ((fp = fopen("Seiseki.txt", "rt")) == NULL) {
fprintf(stderr, "The file doesn't open it\n");
return 1;
}
while (fgets(buf, 256, fp) != NULL)
{
n = sscanf(buf, "%d %s %s %c %d %d %d %d %d",
&student[count].bangou, student[count].sei, student[count].name, &student[count].sex,
&student[count].japanese, &student[count].math, &student[count].science, &student[count].social, &student[count].english
);
if (n != 9)
{
fprintf(stderr, "scanf error in line %d\n", count + 1);
return 1;
}
count++;
}
fclose(fp);
for (i = 0; i < count; i++)
{
printf("%d %s %s %c %d %d %d %d %d\n",
student[i].bangou, student[i].sei, student[i].name, student[i].sex,
student[i].japanese, student[i].math, student[i].science, student[i].social, student[i].english
);
}

return 0;
}


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

Name: @とんぷぅ〜  ..プログラマー(32,803ポイント)   Date: 2007/07/05(木) 00:18   No:9104     
Title: Re:ファイル内容のソート    
とよtoyoさん初めまして。もしかしてtoyoさんですか???

>エラー処理等考えると1行ずつ読み込んでsscanfしたほうがいいかもしれません
 ご指摘ありがとうございます。確かにエラーチェック
 が可能なので上記関数を使う方がいいかもしれませんね。

明日、早速コンパイルして動かしてみます。レスありがとうございました。


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

Name: @とんぷぅ〜  ..プログラマー(32,884ポイント)   Date: 2007/07/05(木) 11:52   No:9106     
Title: Re:ファイル内容のソート    
ソートなんですが、バブルソートの関数を作成して引数を渡す場合
構造体の各メンバを指定してやればいいのでしょうか?

・例えば科目ごとに成績順に並び替える場合
 国語なら国語、数学なら数学という感じでいいんでしょうか?

分かりにくくてすみません。


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

Name: toyo  ..入門者(2,789ポイント)   Date: 2007/07/05(木) 12:28   No:9107     
Title: Re:ファイル内容のソート    
もちろんいろいろ方法があるのでこれが正解というものはありませんが
バブルソート関数の引数にソートキーの項目を増やす方法もありますし
int Bsort(SCORE x[], int n, int key){ }
ソート用の配列にキーデータをコピーして関数を呼び出す方法も

int Bsort(int x[], int n) { }

for (i = 0; i < count; i++)
{
x[i] = student[i].japanese;
}
Bsort(x, count);


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

Name: @とんぷぅ〜  ..プログラマー(33,226ポイント)   Date: 2007/07/05(木) 13:49   No:9108     
Title: Re:ファイル内容のソート    
toyoさん。レスありがとうございます。

科目ごとに並べ替えなんですが
x[i] = student[i].japanese;
x[i] = student[i].math;
とすると、最初のiの値が上書きされてしまうのを防ぐため
関数の引き数を増やすということなんでしょうか?

う〜ん。どのように行えばいいのか全く分かりません(泣)
実際同じ場合等はどのようにすればよいのでしょうか?
質問ばかりで申し訳ないです。



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

Name: toyo  ..入門者(2,851ポイント)   Date: 2007/07/05(木) 14:38   No:9109     
Title: Re:ファイル内容のソート    
一応こんな風に書いてみました
科目別には繰り返しでいいですが合計点の時はキーに各科目の合計を入れると良いでしょう


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

Name: @とんぷぅ〜  ..プログラマー(33,455ポイント)   Date: 2007/07/05(木) 16:11   No:9110     
Title: Re:ファイル内容のソート    
toyoさん。レスありがとうございます。

>科目別には繰り返しでいいですが
 英語なら英語で変数を用意して以下のようにすればよいでしょうか?

for (s = 0; s < count; s++)
{
key[s] = student[s].english;
}

>合計点の時はキーに各科目の合計を入れる
 合計と平均の関数を作成して求めたいのですが、ファイルに入力されている
 点数を拾うにはどうすればよいのでしょうか?
 具体的には // 合計点、男女別の点数も処理の部分です。



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

Name: toyo  ..入門者(2,985ポイント)   Date: 2007/07/05(木) 16:29   No:9111     
Title: Re:ファイル内容のソート    
国語の処理を全部終わらせて次の科目に移るので変数は同じものを使いまわします。

// 国語
for (i = 0; i < count; i++)
{
key[i] = student[i].japanese;
}
Bsort(key, count);
// ファイル書き込み

// 数学
for (i = 0; i < count; i++)
{
key[i] = student[i].math;
}
Bsort(key, count);
// ファイル書き込み
/*
他の科目繰り返し
*/
// 合計
for (i = 0; i < count; i++)
{
key[i] = student[i].japanese+student[i].math
+student[i].science+student[i].social+student[i].english;
}
Bsort(key, count);
// ファイル書き込み


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

Name: @とんぷぅ〜  ..プログラマー(33,628ポイント)   Date: 2007/07/05(木) 17:20   No:9112     
Title: Re:ファイル内容のソート    
toyoさんレスありがとうございます。

一応コーディングしてみましたが、後は平均点なんですが
処理が多くて混乱しています。どのようにすればよいでしょうか?

ちなみに書き込みフォーマットなんですが、

成績表 国語
平均点        64.8
男の平均点 58.9
女の平均点      72.1
順位 学籍番号 性 名 性別 得点
1 0002 Fukuda Hanako F 80
2 0001 Fukushima Taro M 60
:
:

のように出力するのですが、なかなか上手くいきません。
ご教授お願いします。何度もすみません。


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

Name: @とんぷぅ〜  ..プログラマー(33,652ポイント)   Date: 2007/07/05(木) 17:22   No:9113     
Title: Re:ファイル内容のソート    
ちなみに上の男の平均だけずれてますが、64.8と72.1の間にきます。
順位から下もずれてますが。。。(汗)見ずらくてすみません。


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

Name: toyo  ..入門者(3,036ポイント)   Date: 2007/07/05(木) 18:00   No:9114     
Title: Re:ファイル内容のソート    
国語の部分だけ平均処理つけてみました
ファイル書き込みは1行ずつにしたほうが見やすいと思いますが


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

Name: @とんぷぅ〜  ..プログラマー(33,739ポイント)   Date: 2007/07/05(木) 18:34   No:9116     
Title: Re:ファイル内容のソート    
レスありがとうございます。

フォーマットのことなんですが、性と名の部分は
性    名
Fukuda  Hanako
Fukusima Taro

としたいのですがここが上手くいきません。
個人個人で長さが違うのでどうすればよいのでしょうか? 


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

Name: toyo  ..入門者(3,148ポイント)   Date: 2007/07/05(木) 19:01   No:9117     
Title: Re:ファイル内容のソート    
そうですねタブやスペースでいろいろ調節するしかないですね

fprintf(fp, "順位 学籍番号\t性 名 性別\t得点\n");
for (i = 0; i < count; i++)
{
fprintf(fp, "%3d %04d\t%-20s%-20s %c\t%3d\n",
i + 1, student[i].bangou, student[i].sei, student[i].name, student[i].sex, key[i]
);
}


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

Name: toyo  ..入門者(3,158ポイント)   Date: 2007/07/05(木) 19:03   No:9118     
Title: Re:ファイル内容のソート    
性じゃなくて姓ですね

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

Name: @とんぷぅ〜  ..プログラマー(33,883ポイント)   Date: 2007/07/06(金) 01:01   No:9124     
Title: Re:ファイル内容のソート    
toyoさんレスありがとうございます。

やはりスペースで調整していくしかなさそうですね。
ただ一人一人苗字と名前の長さが違うのがネックですね。

一応国語だけはそれっぽくしてみました。
指摘ありましたらよろしくお願いします。


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

Name: @とんぷぅ〜  ..プログラマー(34,032ポイント)   Date: 2007/07/06(金) 11:47   No:9137     
Title: Re:ファイル内容のソート    
連続レスすみません。

出力フォーマットなんですが、格項目の下に先頭文字を配置したい
んですが、スペースで揃えると、名前がそれぞれ違う長さなので
その部分を揃えても性別や各教科の部分でズレが生じてしまいます。


Fukusima


Taro

性別
M

という感じにしたいです。今はバラバラなのでどうにかしたいのですが、
どんな方法があるでしょうか?


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

Name: toyo  ..入門者(3,719ポイント)   Date: 2007/07/06(金) 13:11   No:9138     
Title: Re:ファイル内容のソート    
%-20sのように文字数決めて左揃えでどうでしょう

fprintf(fp, "順位 学籍番号 姓 名 性別 得点\n");
fprintf(fp, "%3d %04d %-20s%-20s%c %3d\n",


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

Name: @とんぷぅ〜  ..プログラマー(34,086ポイント)   Date: 2007/07/06(金) 13:57   No:9139     
Title: Re:ファイル内容のソート    
toyoさん。レスありがとうございます。
%-は新たな発見でした。本当にありがとうございます。

後は頑張って関数化してみます。


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

Name: @とんぷぅ〜  ..プログラマー(34,565ポイント)   Date: 2007/07/06(金) 18:37   No:9145     
Title: Re:ファイル内容のソート    
連レス失礼します。

少しずつ関数化を始めたのですが、書き込みの部分が
繰り返し起こっているので、1回にしたいのですが、
これは構造体の部分を繰り返す(?)様な関数を作ればよいのでしょうか?
一応ソース載せておきます。

---ヘッダ部分---

/* マクロ */
#define ARRAY_SIZE 100 // 配列サイズ

#define ERROR_CODE_OPEN_ERROR "The file doesn't open it" // ファイルオープンエラー
#define ERROR_CODE_SCANF_ERROR "Scanf error in line" // 入力した個数が違う場合のエラー
#define ERROR_CODE_SEX_ERROR "Unkown sex in line" // 性別が異なる (M, F) 以外の場合のエラー
#define ERROR_CODE_WRITE_ERROR "The file cannot write and it do" // ファイル書き込みエラー


/* プロトタイプ宣言 */
int Bsort(int[], int); // バブルソート


/* 構造体の宣言 */
typedef struct
{
int bangou; // 学籍番号
char sei[20]; // 姓
char name[20]; // 名
char sex; // 性別
int japanese; // 国語
int math; // 数学
int science; // 理科
int social; // 社会
int english; // 英語
} SCORE;


/* 構造体の配列studentの宣言 */
SCORE student[ARRAY_SIZE];


---バブルソート部分---


#include "Test.h"

int Bsort(int x[], int n)
{
int i, j, tmp;
SCORE stmp;

// 比較作業を止める位置の添字
for (i = 0; i < n - 1; i++)
{
// 比較対象となる要素の添字
for (j = i + 1; j < n; j++)
{
// 目的の順番の逆になっているか
if ( x[j] > x[i] )
{
// 逆になっていたら、並び替えを行う
tmp = x[j];
x[j] = x[i];
x[i] = tmp;
stmp = student[j];
student[j] = student[i];
student[i] = stmp;
}
else if (x[i] == x[j] && student[i].bangou > student[j].bangou)
{
// 学籍番号順
tmp = x[j];
x[j] = x[i];
x[i] = tmp;
stmp = student[j];
student[j] = student[i];
student[i] = stmp;
}
}
}
return 0;
}




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

Name: @とんぷぅ〜  ..プログラマー(34,623ポイント)   Date: 2007/07/10(火) 10:20   No:9212 解決!     
Title: Re:ファイル内容のソート    
無事解決できました。

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


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



Name: 大学生  ..ぴよぴよ(493ポイント)   Date: 2007/07/06(金) 05:27   No:9127       
Title: C言語の課題で…    
現在出されている課題なんですが、虚数解の出力の仕方が思い浮かびません。アドバイスお願いします。
以下途中まで作成したプログラムです。
課題



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


Name: 大学生  ..ぴよぴよ(9ポイント)   Date: 2007/07/06(金) 05:29   No:9128     
Title: Re:大学生    
名前とタイトル逆にしてしまいました…

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

Name: 管理人 [URL]  ..伝説のハッカー(381,411ポイント)   Date: 2007/07/06(金) 11:21   No:9135     
Title: Re:大学生    
名前とタイトルについては修正しておきました☆
コードはなるべく字下げしたものを使用してください^^;
<pre>タグと</pre>タグで囲めば字下げされたまま投稿できます。
タグは全て半角で書いてください。

質問についてですが、計算式がわからないのでしょうか?
もし数学的なことでしたら、
http://www.google.co.jp/search?q=%E8%A4%87%E7%B4%A0%E6%95%B0%E3%80%80%E6%96%B9%E7%A8%8B%E5%BC%8F&hl=ja
こちらなど参考にしてください。


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

Name: 組木紙織  ..上級者(17,196ポイント)   Date: 2007/07/06(金) 20:20   No:9150     
Title: Re:大学生    
細かいことですが、係数はdouble型なのに、判別式Dがfloatなのが気になります。
キャストをしているところがありますが、型をそろえておけばこのキャストは不必要です。

浮動点小数型を等号を使って比較しているのも気になります。
誤差が入ってくるので、浮動点小数型では数学的には正しくても、実行したら正しくないということが
よくあります。

fabs(D)<0.1

のようなことして、誤差の範囲で0と見做すということをよく使います。

>虚数解
虚数解は実数部と虚数部に分けて考えてあげれば計算できます。
分け方さえ思いつけば後はそんなに難しくありません。


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

Name: box  ..比類無きプログラマー(76,318ポイント)   Date: 2007/07/06(金) 20:32   No:9151     
Title: Re:大学生    
> 浮動点小数型を等号を使って比較しているのも気になります。

丸め誤差の影響で、判別式の値が、例えば0.0000001なんていう、
ゼロに非常に近いけれどちょうどゼロではないという状態のとき、
本当は重解であるところプログラム上はそうならないことが
起こりえますね。

同じ理由で、本当は2つの解を持つのだけれどプログラム上は
重解とみなすことがあるかもしれません。

というわけで、判別式の値をゼロと比較すること自体は
特に問題ないと思います。


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

Name: 大学生  ..かけだし(1,401ポイント)   Date: 2007/07/06(金) 23:35   No:9153     
Title: Re:大学生    
みなさん、アドバイスありがとうございます。参考にしてプログラム修正しました。
これなら、問題ないでしょうか?(家にC言語の環境がないので、動作確認はまだしていません。)



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

Name: box  ..比類無きプログラマー(76,384ポイント)   Date: 2007/07/07(土) 00:50   No:9154     
Title: Re:大学生    

> D=b*b-4*a*c;
> A=-b/( 2 * a );
> B=sqrt(-D)/( 2 * a );

Dの正負がわかっていないのに、決めうちでsqrt(-D)とするのはまずいです。
このコードでは、もしDが正だったら負数の平方根を求めようとしますので、
正しい結果を得ません。



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

Name: 大学生  ..かけだし(1,436ポイント)   Date: 2007/07/07(土) 01:26   No:9157     
Title: Re:大学生    
なるほど確かにそうですね…
A=-b/(2*a)  B=sqrt(-D)/(2*a)の場所を変えてみました。
これでもダメでしょうか…?


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

Name: 組木紙織  ..上級者(17,445ポイント)   Date: 2007/07/07(土) 11:20   No:9159     
Title: Re:大学生    
>同じ理由で、本当は2つの解を持つのだけれどプログラム上は
>重解とみなすことがあるかもしれません。

可能性としては、ありうるとは思いますが、実際問題としては、
数学的には同じであるが、プログラム上では異なるという場合のほうが圧倒的に多いので、

浮動点小数を扱うときには等号は、
同じであるとする範囲をどれくらいにすべきかという問題もあるのですが、
使うべきではないと思っています。

この場合は普通の数字の範囲では十分等号で判定できると思いますが、
気にしていないと不自然な結果がでたときに、困るので、書き込みをしました。


>これでもダメでしょうか…?
>scanf("%f",&a);
をscnaf("%lf",&a);
にすることぐらいでしょうか。
aの型はdoubleですので。

実際に動かしてみるのが一番なのですが、家に環境が無いのなら仕方ないですね。
調べてみたら無料で手に入るので家に環境を用意してみるといいと思います。


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

Name: 大学生  ..かけだし(1,467ポイント)   Date: 2007/07/10(火) 02:36   No:9211 解決!     
Title: Re:大学生    
おかげさまで完成しました。
ありがとうございました。


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



Name: tkmakwins15 [URL]  ..ぴよぴよ(126ポイント)   Date: 2007/07/08(日) 23:09   No:9202       
Title: 乱数発生器について。    
はじめまして、tkmakwins15です。いきなり質問なのですが、
乱数発生器のアルゴリズムについて、教えてください。
C標準ライブラリの rand() は性能が悪いと聞いたので、ほか
のアルゴリズムに付いて詳しく知りたいのです。Cについては
ある程度のプログラムは書けます。環境はVisualStudio 2005
です。


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


Name: box  ..比類無きプログラマー(77,576ポイント)   Date: 2007/07/08(日) 23:27   No:9203     
Title: Re:乱数発生器について。    
日本人が開発した「メルセンヌ・ツイスタ」という乱数生成器があります。
私は残念ながら詳しくないので、説明ができません。
「メルセンヌ・ツイスタ」でググってみてください。


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

Name: tkmakwins15 [URL]  ..ぴよぴよ(218ポイント)   Date: 2007/07/09(月) 16:09   No:9205     
Title: Re:乱数発生器について。    
ありがとうございました。しかし、「メルセンヌ・ツイスタ」は、
ググってもほとんどアルゴリズムに関するページがないのです。
なので、「線形合同法」以外のアルゴリズムでいいのがあれば、
教えてもらえませんか?


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

Name: Justy  ..ハッカー(135,193ポイント)   Date: 2007/07/09(月) 18:11   No:9206     
Title: Re:乱数発生器について。    
 メルセンヌツイスタはソース公開されていますし、解説なら
Cマガジン 2004年10月号の特集記事に開発者である松本眞氏ご本人が
アルゴリズムや高速化手法などについて書かれていますので、
それを参考にしてみてください。

C MAGAZINE 2004年10月号
http://www.cmagazine.jp/contents/200410.html



 乱数の種類はこれ以外だと

・ 乗算合同法
・ M系列
・ Well
・ Xorshift
・ RANROT
・ Lagged Fibonacci
・ Windowsの高分解能パフォーマンスカウンタを利用したhdrand
・ linuxの /dev/random と /dev/urandom

 とかとか他にも多数ありますが、簡単なものもあれば複雑なものもあって
なかなか掲示板ではカバーしきれないです。


 私も詳しくないので解説はできませんが、どれがいいかと訊かれると
MTがだめとなると(用途にもよりますが)Wellなんて MTの短所を
改善していると言われているのでいいのかもしれません。


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

Name: tkmakwins15 [URL]  ..ぴよぴよ(256ポイント)   Date: 2007/07/09(月) 20:06   No:9209 解決!     
Title: Re:乱数発生器について。    
ありがとうございました。いろいろと調べてみます。

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



Name: kazuo  ..ぴよぴよ(300ポイント)   Date: 2007/07/08(日) 14:39   No:9183       
Title: fork()について    
unixでいうパイプの機能を実現したいのですが、どうもうまくいきません。以下にプログラムを載せるので、
アドバイスを宜しくお願いします。
forkしてdup2をしてexecvpで実行する、という手順は踏んでいるのですが、リダイレクトや’;’,’&’等も使いたいので、
孫プロセスを呼び出して実行したいのです。
OSはFC5、コンパイラはgccです。現在システムコールについて学んでおります。
詳細やヘッダのincludeを省略すると、以下のようにしてみました:


pipe(fd);

if(fork()==0){

dup2(fd[1], STDOUT_FILENO);
close(fd[0]);
close(fd[1]);
arg[0] = "ls";
arg[1] = NULL;

if(fork()==0){
execvp(arg[0], arg);
}
}

if(fork()==0){

dup2(fd[0], STDIN_FILENO);
close(fd[0]);
close(fd[1]);
arg[0] = "wc";
arg[1] = NULL;

if(fork()== 0){
execvp(arg[0], arg);
}

}



これで、ls|wcが実行できると思い、コンパイルして実行するのですが、実行するとファイル記述子のエラー,
と出てしまいます。
if(fork()==0){
execvp(arg[0], arg);
}
の部分を、単に
execvp(arg[0], arg);
とすれば実行はうまくいきます。これはどういうわけなのでしょうか。アドバイス宜しくお願いします。


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


Name: ぽん太  ..中級者(13,892ポイント)   Date: 2007/07/09(月) 19:24   No:9208     
Title: Re:fork()について    
*****印のところを付け加えたらこちらの環境では正しく動作しました。
パイプバッファをオープンしているプロセスが混在するのを防止する措置です。
この措置によりパイプバッファの書き込みと読み込みはそれぞれ1つずつのプロセスになります。
lsやwc内部でread(),write()から呼び出されるシステムコールに相等するものがが呼ばれていると思います。
これらのライブラリの仕様を見てみるとread()の場合はどこかの書き込みが開いている限り読み込み続けます。
なのでlsプログラムが書き込みを終えて書き込みを閉じても他のプロセスが開いているのでwcが読み込みをするためにブロックに陥ります。それを回避するためにclose()をそれぞれのプロセスで行いました。
実際こちらの環境ではブロックらしき挙動が見受けられました。
実際ぼくも本日数時間前に学校でシステムプログラムを習ったばかりでしかも何の説明もなくいきなり
演習しろー!と言われて演習していただけなので完全なる憶測ですが参考になれば幸いです。


pipe(fd);

if(fork()==0){

dup2(fd[1], STDOUT_FILENO);
close(fd[0]);
close(fd[1]);
arg[0] = "ls";
arg[1] = NULL;

if(fork()==0){
execvp(arg[0], arg);
}
  ***** _exit(0);
}

if(fork()==0){

dup2(fd[0], STDIN_FILENO);
close(fd[0]);
close(fd[1]);
arg[0] = "wc";
arg[1] = NULL;

if(fork()== 0){
execvp(arg[0], arg);
}
***** close(STDIN_FILENO)
}
***** close(fd[0]);
***** close(fd[1]);


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



Name: 羽流布 [URL]  ..初心者(8,154ポイント)   Date: 2007/07/08(日) 18:17   No:9191       
Title: 再帰関数の宿題    
(問題)
組合せの総数(二項係数)nCr は次の関係式で定義できる.
 nC0 = 1 (n >= 0)
 nCn = 1 (n >= 1)
 nCr = 0 (r > n)
 nCr = n-1Cr + n-1Cr-1 (n > r > 0)
この式に従って再帰関数 unsigned int reccomb(int m, int n) を定義し,動作テストせよ.
ただし,関数 reccomb() には関数を呼び出した回数を数える機能を追加しておき,何回 reccomb() を呼び出したかも表示せよ.

なのですが、現在、下記の状況で行き詰まっています。
どのように再帰関数を使えばいいのか分からないのと、関数を呼び出した回数を数える方法が分かりません。

#include <stdio.h>

int count = 0;

int recfact(int n) {
return (n <= 1 ? 1 : n * recfact(n - 1));
}

unsigned int reccomb(int m, int n) {
count++;
if (m >= 0 && n == 0) {
return (1);
}
else if (m >= 1 && m == n) {
return (1);
}
else if (m < n) {
return (0);
}
else {

}
}

int main(void) {
int n, r;

printf("n C r の n と r を入力せよ.\n");
printf("n = "); scanf("%d", &n);
printf("r = "); scanf("%d", &r);
printf(" reccomb() の呼び出し回数:%d\n", count);
printf(" n C r = %d\n", reccomb(n, r));
return (0);
}

助言だけでもいいですので、よろしくお願いしますm(_ _)m


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


Name: 組木紙織  ..上級者(17,567ポイント)   Date: 2007/07/08(日) 18:45   No:9192     
Title: Re:再帰関数の宿題    
一言助言を
>printf(" reccomb() の呼び出し回数:%d\n", count);
>printf(" n C r = %d\n", reccomb(n, r));

この部分ですが、
一度もreccomb()を呼ばずにcountを使っているの分かりますか?
countはreccomb()を呼び出した後に使わないと、絶対に0になります。



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

Name: box  ..比類無きプログラマー(77,417ポイント)   Date: 2007/07/08(日) 19:14   No:9193     
Title: Re:再帰関数の宿題    

> int recfact(int n) {
> return (n <= 1 ? 1 : n * recfact(n - 1));
> }

この関数は不要ですね。

> else {
>
> }

ここには、

>  nCr = n-1Cr + n-1Cr-1 (n > r > 0)

この式の右辺をreturnするような文を書けばよいです。



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

Name: 羽流布 [URL]  ..初心者(8,625ポイント)   Date: 2007/07/08(日) 21:53   No:9197     
Title: Re:再帰関数の宿題    
皆さん、助言ありがとうございますm(_ _)m
とりあえず、下記のような感じになったのですが、合っているのでしょうか?(特に呼び出し回数)

#include <stdio.h>

int count = 0;

unsigned int reccomb(int m, int n) {
int comb = 0;

if (m >= 0 && n == 0) {
return (1);
}
else if (m >= 1 && m == n) {
return (1);
}
else if (m < n) {
return (0);
}
else {
comb += reccomb(m - 1, n);
++count;
comb += reccomb(m - 1, n - 1);
++count;
return (comb);
}
}

int main(void) {
int n, r;

printf("n C r の n と r を入力せよ.\n");
printf("n = "); scanf("%d", &n);
printf("r = "); scanf("%d", &r);
printf(" n C r = %d\n", reccomb(n, r));
printf(" reccomb() の呼び出し回数:%d\n", ++count);
return (0);
}
/* 実行結果

n C r の n と r を入力せよ.
n = 32
r = 16
n C r = 601080390
reccomb() の呼び出し回数:1202160779

n C r の n と r を入力せよ.
n = 3
r = 2
n C r = 3
reccomb() の呼び出し回数:5

n C r の n と r を入力せよ.
n = 16
r = 12
n C r = 1820
reccomb() の呼び出し回数:3639

n C r の n と r を入力せよ.
n = 8
r = 4
n C r = 70
reccomb() の呼び出し回数:139

*/


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

Name: box  ..比類無きプログラマー(77,525ポイント)   Date: 2007/07/08(日) 22:03   No:9199     
Title: Re:再帰関数の宿題    

> とりあえず、下記のような感じになったのですが、合っているのでしょうか?(特に呼び出し回数)

呼び出し回数は、reccomb()に入った直後に1回だけ加える方が、
多少なりともコード量が少なくてよいと思います。
今のままでも答えは正しいのですけれど。

また、組み合わせの数は、combという変数を使わなくても、式のとおりに

return reccomb(m-1, n) + reccomb(m-1, n-1);

と書く方がスッキリしているでしょう。

(追記)
実は、答えを早く求めるという観点からは、再帰呼び出しを使うと不利です。
最初の投稿で書かれていた階乗を計算する関数を使う方が、
計算時間の点では格段に有利です。

ところで、組み合わせの数と再帰呼び出し回数との間に
おもしろい関係があることにお気づきになりましたか?
時間があれば、なぜそういう関係があるのかについて
考えてみるのも一興でしょう。



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

Name: 羽流布 [URL]  ..初心者(8,956ポイント)   Date: 2007/07/08(日) 22:28   No:9200 解決!     
Title: Re:再帰関数の宿題    
> box さん
確かにこのコードでは結果を表示するまでに結構かかりました。(特に数字が大きい場合)
先生も言ってましたが、まさかここまで長いとは思いませんでした。(私のパソコンのスペックが低いこともあるでしょうが)

コードは下記のようにスッキリさせました。

#include <stdio.h>

int count = 0;

unsigned int reccomb(int m, int n) {
++count;
if (m >= 0 && n == 0) {
return (1);
}
else if (m >= 1 && m == n) {
return (1);
}
else if (m < n) {
return (0);
}
else {
return (reccomb(m-1, n) + reccomb(m-1, n-1));
}
}

int main(void) {
int n, r;

printf("n C r の n と r を入力せよ.\n");
printf("n = "); scanf("%d", &n);
printf("r = "); scanf("%d", &r);
printf(" n C r = %d\n", reccomb(n, r));
printf(" reccomb() の呼び出し回数:%d\n", count);
return (0);
}

では、本当に助かりました(汗)


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

Name: 組木紙織  ..上級者(17,772ポイント)   Date: 2007/07/08(日) 22:48   No:9201     
Title: Re:再帰関数の宿題    
好みの問題になると思いますが、
次のように書いたらすっきりすると思います。

unsigned int reccomb(int m, int n) {
++count;
if (m >= 0 && n == 0) return (1);
if (m >= 1 && m == n) return (1);
if (m < n) return (0);
return (reccomb(m-1, n) + reccomb(m-1, n-1));
}


/*次はかなり細かい部分なので無視して下さってもかまいません。*/
引数は二項係数なので負になることは無いのでunsignedをつけたほうがいいのかな。
intだと負の値が入ったときを考える必要があるような気がします。
出題者側のミス、になるのかな。

戻り値にはunsignedがついているので少しきになりました。


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



Name: かさい  ..ぴよぴよ(12ポイント)   Date: 2007/07/06(金) 01:14   No:9126       
Title: BorlandC++Compiler5.5で画像処理    
はじめまして。

画像処理プログラミングを独学している者です。
使用環境としまして、Windows-XP上で C言語はBorlandC++Compiler5.5を使用しております。
BMPファイルから画像の一部を切り出したいのですが、この環境では無理でしょうか?
どうかご教示ください。最も簡単な一例(例えばBMPファイルの半分を切り出すなど)を
ご教示頂ければ、ありがたいのですが。
なお、私は初歩的なC言語はできるつもりです。他の言語はあまり知りません。

どうぞ、よろしくお願いします。


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


Name: toyo  ..入門者(3,650ポイント)   Date: 2007/07/06(金) 07:39   No:9129     
Title: Re:BorlandC++Compiler5.5で画像処理    
もちろんできます。
バイナリファイルの読み書きが出来る言語ならどれでも可能ですよ。
まず下記のURL等でBMPファイルのフォーマットを調べてください。
やり方は最初にヘッダを読み込みます。
後は1ドットに対応するバイト数に応じて必要な部分を抜き出せばよいでしょう。
ヘッダの画像サイズ等を変更して書き込めば出来上がりです。

http://www.kk.iij4u.or.jp/~kondo/bmp/


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

Name: バグ  ..熟練のプログラマー(53,491ポイント)   Date: 2007/07/06(金) 08:46   No:9130     
Title: Re:BorlandC++Compiler5.5で画像処理    
部分表示をさせたいだけであれば、BitBlt関数が使えるかと思いますよ(^-^)
的外れな回答だった場合はスルーしてください(^_^;)

http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpgdi/html/_win32_bitblt.asp


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

Name: かさい  ..ぴよぴよ(54ポイント)   Date: 2007/07/08(日) 21:37   No:9196     
Title: Re:BorlandC++Compiler5.5で画像処理    
ありがとうございます。

幾つか方法がありそうなので、順に試してみます。


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



Name: さっかん  ..かけだし(2,328ポイント)   Date: 2007/07/07(土) 11:57   No:9160       
Title: 小文字を大文字に    
ファイルの読み込みの課題で、小文字を大文字に変換して読み込みたいんですが、toupperの行でエラーが出てしまいます。文字列においての理解不足が原因だと思うのですが、ご教授お願いします。

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(void)
{
FILE *fp;
char s[256],ch[256];
int i;
if ((fp = fopen("smpl.txt", "r")) == NULL) {
printf("file open error!!\n");
exit(1);
}
while (fgets(s, 256, fp) != NULL) {
ch=toupper(s);
printf("%s\n",ch);
}
fclose(fp);
return 0;
}


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


Name: box  ..比類無きプログラマー(76,439ポイント)   Date: 2007/07/07(土) 13:40   No:9161     
Title: Re:小文字を大文字に    
toupper()には、sの要素を1バイトずつ渡してください。


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

Name: さっかん  ..かけだし(2,349ポイント)   Date: 2007/07/07(土) 23:30   No:9175     
Title: Re:小文字を大文字に    
for文でs[0]からs[1]、s[2]というように渡せばいいんですか?

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

Name: box  ..比類無きプログラマー(76,968ポイント)   Date: 2007/07/07(土) 23:56   No:9177     
Title: Re:小文字を大文字に    

そうです。
今回の場合でしたら、whileループの中にforループを設けて、
sを1文字ずつ大文字に変換した結果をchに1文字ずつセットしていきます。

for (i = 0; s[i] != '\0'; i++)
ch[i] = toupper(s[i]);
ch[i] = '\0'; // 文字列終端用の'\0'

この後、printf()でchを出力してください。


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

Name: さっかん  ..かけだし(2,360ポイント)   Date: 2007/07/08(日) 11:30   No:9180 解決!     
Title: Re:小文字を大文字に    
うまく実行されました。
わかりやすい説明ありがとうございます!!


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

Name: さっかん  ..入門者(2,787ポイント)   Date: 2007/07/08(日) 12:55   No:9181     
Title: Re:小文字を大文字に    
もうひとつ疑問があります。指定したファイルの中身の小文字を大文字にして、別の指定したファイルに書き込むという課題なんですが、fscanfを使わずにこのような書き方にしてみたところ、エラーが出てしまいました。fscanfは絶対に使わなくてはいけないのでしょうか。あと、ファイルの書き込みは初めてなので、他にも書き方の間違えているところがあればご指摘お願いします。
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
int main()
{
FILE *fp1,*fp2;
char s[256],ch[256];
int i,fname1,fname2;
printf("Input filename:");
scanf("%d",&fname1);
if ((fp1 =fopen("%d",fname1,"r"))==NULL){
printf("file open error!!\n");
exit(1);
}
while(fgets(s,256,fp1)!=NULL){
for (i = 0; s[i] !='\0'; i++){
ch[i] = toupper(s[i]);
}
ch[i] = '\0';
}
fclose(fp1);
printf("Output filename:");
scanf("%d",&fname2);
fp2=fopen("%d",fname2"a+");
for (i = 0; ch[i] !='\0'; i++){
fputs(ch[i],fp2);
fputs("\n",fp2);
}
fclose(fp2);
return 0;
}


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

Name: Hermit  ..中級者(9,326ポイント)   Date: 2007/07/08(日) 13:18   No:9182     
Title: Re:小文字を大文字に    
fopen 関数は、
FILE *fopen(const char *, const char *);
です。
引数はふたつまでで、
引数は共に、文字列で無ければいけません。

fopen("%d",fname1,"r")
3個の引数は多すぎます。
fname1 は、int なので使用できません。


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

Name: さっかん  ..入門者(3,100ポイント)   Date: 2007/07/08(日) 14:54   No:9184     
Title: Re:小文字を大文字に    
Hermitさんの言う事を理解したつもりでこのように書き換えてみたのですが、セグメントエラーになってしまいます。全然的外れな事をしているかもしれませんが、ご指摘お願いします。
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
int main()
{
FILE *fp1,*fp2;
char s[256],ch[256];
char fname1[20],fname2[20];
int i;
printf("Input filename:");
fscanf(fp1,"%s",&fname1);
if ((fp1 =fopen("fname1","r"))==NULL){
printf("file open error!!\n");
exit(1);
}
while(fgets(s,256,fp1)!=NULL){
for (i = 0; s[i] !='\0'; i++){
ch[i] = toupper(s[i]);
}
ch[i] = '\0';
}
fclose(fp1);
printf("Output filename:");
fscanf(fp2,"%s",&fname2);
fp2=fopen("fname2","a+");
for (i = 0; ch[i] !='\0'; i++){
fputs("ch[i]",fp2);
fputs("\n",fp2);
}
fclose(fp2);
return 0;
}


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

Name: box  ..比類無きプログラマー(77,102ポイント)   Date: 2007/07/08(日) 15:11   No:9185     
Title: Re:小文字を大文字に    

> fscanf(fp1,"%s",&fname1);

fscanf()ではなくscanf()で、fname1[]に入力ファイル名を格納してください。
fname1の頭にある&は不要です。
また、ここではfp1は不要です。

> if ((fp1 =fopen("fname1","r"))==NULL){

fname1をダブルクォーテーションで囲むと、「fname1という名前の」ファイルを
オープンしようとします。
今回はそうではなく、fname1という変数に入っている名前のファイルを
オープンするのです。

> fscanf(fp2,"%s",&fname2);
> fp2=fopen("fname2","a+");

この2行は、上記と同様に修正してください。

> fputs("ch[i]",fp2);

ここのダブルクォーテーションも不要です。


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

Name: さっかん  ..入門者(3,563ポイント)   Date: 2007/07/08(日) 15:35   No:9186     
Title: Re:小文字を大文字に    
Boxさん、詳しい解説ありがとうございます!でも何故fname1の頭にある&が不要なんでしょうか?
あと、このように書き換えてみたのですが、fputの行でエラー警告があって、試しに実行してみたらOutput filenameでファイル名を入力した後にセグメントエラーになってしまいました。

#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
int main()
{
FILE *fp1,*fp2;
char s[256],ch[256];
char fname1[20],fname2[20];
int i;
printf("Input filename:");
scanf("%s",fname1);
if ((fp1 =fopen(fname1,"r"))==NULL){
printf("file open error!!\n");
exit(1);
}
while(fgets(s,256,fp1)!=NULL){
for (i = 0; s[i] !='\0'; i++){
ch[i] = toupper(s[i]);
}
ch[i] = '\0';
}
fclose(fp1);
printf("Output filename:");
scanf("%s",fname2);
fp2=fopen(fname2,"a+");
for (i = 0; ch[i] !='\0'; i++){
fputs(ch[i],fp2);
fputs("\n",fp2);
}
fclose(fp2);
return 0;
}


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

Name: box  ..比類無きプログラマー(77,212ポイント)   Date: 2007/07/08(日) 15:55   No:9187     
Title: Re:小文字を大文字に    

> 何故fname1の頭にある&が不要なんでしょうか?

配列の変数名は、その配列の先頭要素へのポインタと同義です。
scanf()の第2引数(以降)にchar型の配列(今回の例ではfname1[])を指定する場合、
単にfname1と書けば&fname1[0]と同じ意味になります。

> for (i = 0; ch[i] !='\0'; i++){
> fputs(ch[i],fp2);
> fputs("\n",fp2);
> }

fputs()の第1引数はchar型へのポインタです。
ここではforループを回す必要はなく、単に
fputs(ch, fp2);
だけでよいのです。
ここでも、「配列の変数名は、その配列の先頭要素へのポインタと同義」を使っています。
上に引用したコードでは、fputs()の第1引数に配列の個別の要素であるchar型を
渡しているため、引数の本来の型と合わず、異常終了するのです。

また、fputs()は自動的に改行しますので、
fputs("\n", fp2);
は不要です。出力のたびに1行空白行をあけるという仕様ならば別ですけれど。


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

Name: さっかん  ..入門者(4,031ポイント)   Date: 2007/07/08(日) 17:25   No:9188     
Title: Re:小文字を大文字に    
おかげさまで&が不要な理由がよく理解できました!
fputsのところに気をつけて作り直してみたんですが、chの中身が一回ずつ変わってしまうため、最後に変更された中身しか記憶できてなくて、
読み込むファイルの中身が
pdg
buk
12a
だったとすると、書き込んだファイルの中身が
12A
だけになってしまいました。chは二次元配列にしなければならないのでしょうか?
ちなみに今の状態です↓

#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
int main()
{
FILE *fp1,*fp2;
char s[256],ch[256];
char fname1[20],fname2[20];
int i;
printf("Input filename:");
scanf("%s",fname1);
if ((fp1 =fopen(fname1,"r"))==NULL){
printf("file open error!!\n");
exit(1);
}
while(fgets(s,256,fp1)!=NULL){
for (i = 0; s[i] !='\0'; i++){
ch[i] = toupper(s[i]);
}
ch[i] = '\0';
}
fclose(fp1);
printf("Output filename:");
scanf("%s",fname2);
fp2=fopen(fname2,"a+");
for (i = 0; ch[i] !='\0'; i++){
}
fputs(ch,fp2);
fclose(fp2);
return 0;
}


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

Name: box  ..比類無きプログラマー(77,450ポイント)   Date: 2007/07/08(日) 17:55   No:9189     
Title: Re:小文字を大文字に    
こんな流れにしてみてください。
2次元配列を使う必要はありません。


入力ファイル名を得る
入力ファイルをオープンする
   オープンできなければ、エラーメッセージを出力して終了する

出力ファイル名を得る
出力ファイルをオープンする
   オープンできなければ、エラーメッセージを出力して終了する

読むデータがある間、入力ファイルから1行分を得る
   その1行分を大文字に変換する
   大文字に変換した結果を出力ファイルに書き込む

入力ファイルをクローズする
出力ファイルをクローズする
おしまい


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

Name: さっかん  ..入門者(4,147ポイント)   Date: 2007/07/08(日) 18:12   No:9190 解決!     
Title: Re:小文字を大文字に    
2つ一気にオープンすればよかったんですね!
おかげさまで完成しました♪
Hermitさん、boxさんありがとうございました!!


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



Name: ini  ..ぴよぴよ(149ポイント)   Date: 2007/07/07(土) 21:20   No:9171       
Title: char**型の関数    
char **Word(char* --, int --){
 char **str;
 .
 .
 .
 return str;
}

上のような、返り値がchar**のような関数を作ったのですが、
たとえばmain関数で関数Word(char** --, int --)を呼び出して、
main関数内でstr[0]やstr[1]などを表示させるにはどうしたら良いのでしょうか。


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


Name: Hermit  ..初心者(8,823ポイント)   Date: 2007/07/07(土) 21:57   No:9172     
Title: Re:char**型の関数    
char **Word() 内で auto 確保された領域は、
Word() を抜けると開放される為、他の領域では使用できません。

main() 関数内で参照できる範囲に、str 配列を作る必要があります。


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

Name: ini  ..ぴよぴよ(268ポイント)   Date: 2007/07/07(土) 23:37   No:9176     
Title: Re:char**型の関数    
回答ありがとうございます!

main関数でchar**型の、たとえばdataというのは、
関数char **Word()内でdataを表示させることが出来ますよね?
それの反対を考えていたのですが、それも出来ないのでしょうか?

もし出来ないのであれば、どうすれば関数char **Word()内のstrを
main関数内で表示させることが出来るでしょうか?

まだまだ勉強中なので、伝わらないこともあるかも知れないのですがよろしくお願いしますm(__)m


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

Name: Hermit  ..中級者(9,237ポイント)   Date: 2007/07/08(日) 00:55   No:9179     
Title: Re:char**型の関数    
>関数char **Word()内でdataを表示させることが出来ますよね?
>それの反対を考えていたのですが、それも出来ないのでしょうか?

auto で確保した領域でなければいいのです。

str は、そのままポインタを返すので問題ありません。返却した値を他の変数に代入すればいいので。
char **ptr = Word(char** --, int --);
とすれば、ptr[?] などでかまいません。

次に、*str (char のポインタ配列)と、**str (char 配列)をどこで確保しているかということです。
malloc で領域確保したり、static エリアを用意したり、外部領域で確保していたりすれば、
そのまま Word の返却値がつかえます。

この二つの部分を、auto で取ると、Word を抜けた時点で開放されるので、
コンパイラはその部分を使う命令を出すかもしれませんし、(他のデータで上書きする)
または、使用禁止区域にしてしまうかもしれません。(バスエラーなど)
または、何事も無かった様に使用できるかもしれません。

ですので、auto で確保した領域は使用できません。
逆に言うと、auto で確保しなければ、使用できます。


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



Name: shaka  ..かけだし(1,129ポイント)   Date: 2007/07/06(金) 00:07   No:9123       
Title: 先日はありがとうございました。    
学校の製作課題でボンバーマンのようなゲームを作ることになったものです。
敵の動きなんですがいくらやっても上手く出来ず、一時あきらめて、他の処理をやっていましたが
そろそろ敵の動きも完成させなければまずくなってきました。

前回、敵のスピードが32で割り切れていないかも?と指摘していただきましたが、敵のスピードは1に設定してあるので割り切れないということは無いはずなのですが・・・。。。

どうか助言をお願いします!!
ちなみにも載せましたが、今の時点のソースはこれです。


void move_teki()
{

if((en.x%32)==0 && (en.y%32)==0 )
{
   teki_move_flg = 1;//敵移動フラグをたてる
if(teki_move_flg == 1)
   {
if(can_cannot(en.x,en.y,en.muki,hantei)==1)//向いてる方向がすすめるか判定
{
en.muki = rand()%4;//向きをランダムで変更する
}
   }
}

if(teki_move_flg == 1)
{
if(en.muki==0) //右向きならx座標を増やす
{
en.x = en.x+en.espeed;//敵のスピードは1です
if(en.x >= 608)
{
en.x = 0;
}
}

else if(en.muki==1) //左向きならx座標を減らす
{
en.x = en.x+en.espeed;
if(en.x <= 0)
{
en.x = 608;
}
}
else if(en.muki==2)//上
{
en.y = en.y-en.espeed;
if(en.y <= 0)
{
en.y = 480;
}
}
else if(en.muki==3)//下
{
en.y = en.y+en.espeed;
if(en.y >= 480)
{
en.y = 0;
}
}
}
}

最後にうちの学校の話を少し。

うちの学校ではとにかくゲームを自分で作るということによって技術を高めていこうという方針で、2年間の学校生活で大体3〜4本のゲームを作ることになっています。
卒業までにどこまで習うのかというのはいまいち分からないのですが、2年生になると大体の生徒がインターンシップやらアルバイトやらで実際のゲーム会社の現場で働いてる感じですね。
今の自分からはあまり想像できませんが・・・。
とりあえずうちの学校はそんな感じです。

毎回駄文で申し訳ありませんがよろしくお願いいたします!!


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


Name: Justy  ..ハッカー(134,771ポイント)   Date: 2007/07/06(金) 01:05   No:9125     
Title: Re:先日はありがとうございました。    
敵の動きなんですがいくらやっても上手く出来ず
 全体のソースがないので、具体的にどううまくいっていないのか
書かないとこちらでは状況がさっぱりわかりません。

 現状どういう動作をしていて、本当はどういう動作をして欲しいのかを提示して下さい。


 とはいえ、この一部分だけのソースを見た段階で疑問な点がいくつもあります。

・ enの初期値
 enの初期値は何でしょう?
 杞憂だとは思いますが、万が一 enxやex.yが 32で割り切れず、teki_move_flg = 0だったりしたら、
xや yが割り切れないので動くフラグが立たない -> その場に立ちっぱなし
 と動かなくなりそうな構造です。


・ 意味のないチェック
    teki_move_flg = 1;//敵移動フラグをたてる 

if(teki_move_flg == 1)

 この if文の意図はなんでしょうか?


・ 移動方向の判定
 コメントを信用するとしたら、向いてる方向が進めるか判定してOKなら、
ランダムで移動方向を決めているようですが、その移動方向も進入不可だった場合について
考慮されているように見えません。

 「移動しようとしている方向」に進めるかどうかを確認する必要はないのでしょうか?


・ teki_move_flgの存在意義
 移動が始まるとずっと teki_move_flg = 1なのですがこのフラグは何の為に必要なのでしょうか?




2年間の学校生活で大体3〜4本のゲームを作ることになっています
 今は1年生ということでしょうか。
 2年で3〜4本というのが少ないのか多いのかわかりませんが、チームで制作ですか?


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

Name: shaka  ..かけだし(1,207ポイント)   Date: 2007/07/08(日) 00:10   No:9178 解決!     
Title: Re:先日はありがとうございました。    
学校の友だちにもソースを見せてみたのですが、向きが右でも左でもスピードが+en.speedされていたということがわかり、そこを直した結果きちんと動きました!!!
何回も見直したはずなんですがまったく気づかないでいました。。。
でも壁をすり抜けて行くことはなくなったので、これからいろいろな動きを試していきたいと思います!!

いろいろご指摘ありがとうございました。
ご指摘いただいたところも含めてこれからまた頑張ってみようと思います。

ちなみに今自分は1年生です。
製作なんですが、2本が企画科とグラフィック科の共同製作で、残りの1〜2本が個人製作となっています。
この作品を就職活動に利用することになるという感じです。




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



Name: パズえもん  ..ぴよぴよ(0ポイント)   Date: 2007/07/07(土) 18:27   No:9167       
Title: 画像を表示    
一番最初の画像を表示させるところで、
char.pngをちゃんとサンプルプログラム実行用フォルダのDebugフォルダに入れたのに、プログラムをコピペしてみても表示されませんどうしたらいいでしょうか?



Name: 管理人 [URL]  ..伝説のハッカー(381,470ポイント)   Date: 2007/07/07(土) 23:01   No:9174     
Title: Re:画像を表示    
Debugフォルダの上のフォルダに保存してもう一度やってみてください。
あと、VisualStudio2005 ExpressEditionをお使いの場合別の設定が必要です。


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



Name: 亜美☆  ..ぴよぴよ(51ポイント)   Date: 2007/07/07(土) 22:30   No:9173       
Title: 熱流体    
初投稿です☆

図において加熱端(点1)の温度を100℃,フィンの長さ0.5m,厚さdが0.05m,周囲温度θfが0℃,α=10kal/m^2h℃,λ=50kal/mh℃としてフィンの定常状態の温度分布を計算せよ.この結果を,次の解析解で求めた結果と比較せよ.
u(x) = (u0-θf) / 1+e^(2ml)×{e^(mx)+e^(2ml)e^(-mx)}  ,m = √(αP/λA)
ここでu0はx=0(加熱端)のときの温度,lはフィンの長さ,Aは断面積,Pは周囲長である.

といった課題が出されたのですが,どなたか助けてくださいm(_ _)mおねがいします。


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




Name: parapara  ..初心者(5,180ポイント)   Date: 2007/07/07(土) 15:51   No:9162       
Title: 単語の長さを縦にヒストグラム化する関数    
お久しぶりです、何ヶ月ぶりですが、またお世話になります。

独学でC言語を勉強してる物ですが、問題文中のヒストグラムの単語の意味があまり良く分からないので教えてください。
PCはDELLのディメンション8300です。
コンパイラはMicrosoft Visual C++ .NET 55577-640-4383485-18159
説明不足だと思いますが、以下の状況(*の数でグラフを作ってる)です。
これでヒストグラムを作ってるといえますでしょうか?
#include<stdio.h>//単語の数
#include<string.h>
#define OUT 0
#define IN 1
int main(void){
int c,nl,nw,nc,state,l[1000],i,j;
state=OUT;
nl=nw=nc=i=0;
for(i=0;i<1000;i++){
l[i]=0;
}i=0;
while((c=getchar())!=EOF){
nc++;
if(c=='\n')nl++;
if(c==' '||c=='\t'||c=='\n'){
if(state==IN)i++;
state=OUT;
}else if(state==OUT){
l[i]++;
state=IN;
nw++;
}else if(state==IN){
l[i]++;
}
}
c=i;j=0;
for(i=0;i<26;i++){//最大の単語の長さ
for(j=0;j<c;j++){//i単語の数
if(i<l[j]){//l[i]単語の長さ
printf("*");
}
putchar('\t');
}
putchar('\n');
}
return(0);
}
行の数(nl)・単語の数(nw)・文字の数(nc)を表示するプログラムを改変して作ってるので見にくいと思いますが、何卒ご指導・ご指摘お願いします。


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


Name: box  ..比類無きプログラマー(76,611ポイント)   Date: 2007/07/07(土) 16:02   No:9163     
Title: Re:単語の長さを縦にヒストグラム化する関数    

This is a program written by C Language.
という文に出てくる単語の長さは、それぞれ

This : 4
is : 2
a : 1
program : 7
written : 7
by : 2
C : 1
Language : 8

ですね。これを、縦方向に'*'を並べたヒストグラムで表現すると、
例えばこんな風になります。

*
* * *
* * *
* * *
* * * *
* * * *
* * * * * *
* * * * * * * *

各々の単語は、どのように表示したいですか?それとも、表示しなくてよいですか?



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

Name: parapara  ..初心者(5,308ポイント)   Date: 2007/07/07(土) 16:21   No:9164     
Title: Re:単語の長さを縦にヒストグラム化する関数    
まだ、K&R(29ページ)始めたばかりなんで表示しなくてもいいです。
俺が作ったプログラムだと逆さまなんですが、一応あってるといえるでしょうか?
box様の示したようなプログラムだと、i番目の単語の長さl[i]の中から最大の長さ(最大値)
を求めなくちゃ作れない気がするんですけど、最大値を求めなくてエレガントに書く方法があるんでしょうか?


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

Name: box  ..比類無きプログラマー(76,799ポイント)   Date: 2007/07/07(土) 17:55   No:9165     
Title: Re:単語の長さを縦にヒストグラム化する関数    
> 俺が作ったプログラムだと逆さまなんですが、一応あってるといえるでしょうか?

縦方向のヒストグラムであることに変わりはないので、
全く問題ありません。

> box様の示したようなプログラムだと、i番目の単語の長さl[i]の中から最大の長さ(最大値)
> を求めなくちゃ作れない気がするんですけど、最大値を求めなくてエレガントに書く方法があるんでしょうか?

私が図示した結果を得たい場合、
あらかじめ最大値を求めておくことは必須だと思います。
最大値を求めておかずにその結果を得る方法は、
今のところちょっと思いつかないです。


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

Name: Hermit  ..初心者(8,649ポイント)   Date: 2007/07/07(土) 18:27   No:9166     
Title: Re:単語の長さを縦にヒストグラム化する関数    
ヒストグラムって、度数分布じゃなかったでしょうか?
それだと単なる棒グラフな気がしますが。>box


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

Name: Hermit  ..初心者(8,737ポイント)   Date: 2007/07/07(土) 18:44   No:9168     
Title: Re:単語の長さを縦にヒストグラム化する関数    
This : 4
is : 2
a : 1
program : 7
written : 7
by : 2
C : 1
Language : 8

だから、

1:**
2:**
3:
4:*
5:
6:
7:**
8:*

を縦に書くのではないでしょうか。

(前の、削除キー入れ忘れたので、追加でコメント)


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

Name: box  ..比類無きプログラマー(76,811ポイント)   Date: 2007/07/07(土) 18:50   No:9169     
Title: Re:単語の長さを縦にヒストグラム化する関数    
> ヒストグラムって、度数分布じゃなかったでしょうか?

そうですね。
大きな間違いでした。


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

Name: parapara  ..初心者(5,216ポイント)   Date: 2007/07/07(土) 20:35   No:9170 解決!     
Title: Re:単語の長さを縦にヒストグラム化する関数    
皆さん、box様色々ご指導ご指摘ありがとうございます。

This : 4
is : 2
a : 1
program : 7
written : 7
by : 2
C : 1
Language : 8

だから、

1:**
2:**
3:
4:*
5:
6:
7:**
8:*
を縦に書くのではないでしょうか。
を元に考えていこうと思います。
<!--13-->


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



Name: TDU  ..ぴよぴよ(167ポイント)   Date: 2007/07/07(土) 01:03   No:9155       
Title: 無題    
次のメンバを持つ構造体time を宣言し、与えられた関数を作成し、動作を確認せよ。
(a) メンバは時、分である。ただし時刻の表示方式は24 時間制とする。
(b) 現在時刻を画面に表示する関数を作成せよ。
(c) n 時間m 分後の時刻を表示する関数を作成せよ。時間は0〜23、分は0〜59 であることに注意せよ。
という課題です。
現在時刻を表示する関数の作成がまったくわかりません。
どうかよろしくお願いします。


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


Name: box  ..比類無きプログラマー(76,407ポイント)   Date: 2007/07/07(土) 01:09   No:9156     
Title: Re:無題    
「現在時刻の取得」でググってみてください。

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

Name: TDU  ..ぴよぴよ(136ポイント)   Date: 2007/07/07(土) 02:29   No:9158 解決!     
Title: Re:無題    
無事解決しました。
アドバイスありがとうございました。


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



Name: ゆえ  ..ぴよぴよ(91ポイント)   Date: 2007/07/04(水) 23:41   No:9103       
Title: 最初のコンパイル?    
一番最初に、VC++を起動してコンパイルをするところなのですが、エラーが起こって、
最後に成功したビルドを実行しますか?ではいを選択すると、
「・・・・・DxLib_VC\サンプルプログラム実行用フォルダ\Debug\DxLib.exe'を開始できません

指定したファイルが見つかりません。」
とでるのですが、どうすればいいでしょうか・・・
一応・・VC++のバージョンは2005のものです


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


Name: Justy  ..ハッカー(134,106ポイント)   Date: 2007/07/05(木) 22:25   No:9122     
Title: Re:最初のコンパイル?    
>エラーが起こって・・・どうすればいいでしょうか・・
 エラーがなんなのか判らないので具体的にどうこうとはいえませんが、
そのエラーを取り除けば、問題は解決すると思います。
 


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

Name: ゆえ  ..ぴよぴよ(149ポイント)   Date: 2007/07/06(金) 21:06   No:9152     
Title: Re:最初のコンパイル?    
回答ありがとうございます〜
とりあえずDebugフォルダを見てみたんですが、書いてある通りDxLib.exeという
ファイルが入っていませんでした。
これが何故なのかわかりません、原因がわかる方おしえてください


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



Name: hy  ..ぴよぴよ(30ポイント)   Date: 2007/07/06(金) 16:22   No:9142       
Title: ルンゲクッタって???    
微分方程式の数値計算のプログラムがまったく 手も足も出ません。
誰か助けてください
c言語やってます。


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


Name: acid  ..ぴよぴよ(47ポイント)   Date: 2007/07/06(金) 18:23   No:9144     
Title: Re:ルンゲクッタって???    
ぐーぐるせんせい〜(某青い猫風に)

http://www.google.com/search?num=50&hl=ja&q=%E3%83%AB%E3%83%B3%E3%82%B2%E3%82%AF%E3%83%83%E3%82%BF+c&lr=lang_ja


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



Name: 山男  ..ぴよぴよ(32ポイント)   Date: 2007/07/06(金) 16:02   No:9140       
Title: ジュリアンダー(ユリウス?)    
年と月と日を入力してジュリアンデー(1 月1 日を1 として,閏年の12 月31 日を366)を計算するプログラムと年とジュリアンデーを入力して月と日を計算するプログラムを作ろうとしています。閏年を考慮しなくてはならないため苦戦しております。閏年は年を4で割ると余りが出ない年のこととと定義していますが、毎月の日数をスウィッチ文で表すとすごい文数になりそうです。何か良い例など御存知ないでしょうか?


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


Name: TT414  ..ぴよぴよ(125ポイント)   Date: 2007/07/06(金) 16:19   No:9141     
Title: Re:ジュリアンダー(ユリウス?)    
http://www2.realint.com/cgi-bin/tarticles.cgi?pointc+30419
マルチポスト


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

Name: 東海○学  ..ぴよぴよ(6ポイント)   Date: 2007/07/06(金) 16:37   No:9143     
Title: Re:ジュリアンダー(ユリウス?)    
大学はどういう教育をしているんだろうか。

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



Name: TmT  ..ぴよぴよ(181ポイント)   Date: 2007/07/05(木) 21:57   No:9121       
Title: WSモデルについて    
ランダムモデルを改造してスモールワールドモデルにしようと思っているのですが、
理論を見れば見るほど混乱してしまいます。
データはネットファイルにして保存する形です。
どなたかお分かりになる方、教えてください。
下記はランダムモデルです。


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

void ws_model(int N, double p);

int main(int argc, char *argv[])
{
int N; //頂点数
double p=atof(argv[1]); //確率 p

char filename[18]="model.net";
FILE *fp;

if(argc == NULL) exit(0);

printf("Input Vertex Size: ");
scanf("%d", &N);
 srand(time(0));

printf("Vertex size: %d\n", N);
fp=fopen(filename, "w");
fprintf(fp, "*Vertices %d\n", N);
fprintf(fp, "*Edges\n");

ws_model(N, p);

fclose(fp);
return 0;
}

void ws_model(int N, double p)
{

int i, j;

char filename[18] = "model.net";
FILE *fp;
fp=fopen(filename, "w");

for(i=0; i<N; i++) {
for(j=i+1; j<N; j++) {
if(p > (double)rand()/RAND_MAX) {
fprintf(fp, "%d %d 1\n", i+1, j+1);
}
}
fclose(fp);
}


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




Name: miku  ..ぴよぴよ(286ポイント)   Date: 2007/07/05(木) 18:16   No:9115       
Title: 経路の問題です。    
(0,0)から(x,y)(x,yは自然数)まで格子点を通る経路の問題です。

図のようにx,yの方向へ、上、斜め、右方向に進めます。戻ることは出来ません。
この(0,0)からx,yまでの全ての経路を知りたいのですが、なかなか思うように結果が出ません・・。
例えば(0,0)から(2,2)までの経路であった場合

経路1
(0,0) -> (1,0) -> (2,0) -> (2,1) -> (2,2)

経路2
(0,0) -> (1,0) -> (1,1) -> (2,2)

とかこういう感じで全通り出したいのですが・・。
再帰関数を使って若干作ってみたもののうまくいきません・・。

一応こんな感じです。


#include <stdio.h>
#include <string.h>
int len_a=2,len_b=2;
void serch(int ia,int ib){
int i;
printf("(%d,%d)\n",ia,ib);
for(i=0;i<3;i++){
if(i==0 && ia<len_a)
ia++;
else if(i==1 && ia<len_a && ib<len_b)
ia++ , ib++;
else if(i==2 && ib<len_b)
ib++;
else
continue;
serch(ia,ib);
}
}
int main(){
serch(0,0);
return 0;
}

 
すみませんが、おわかりになるかたご指導よろしくお願いします。


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


Name: toyo  ..入門者(3,544ポイント)   Date: 2007/07/05(木) 19:51   No:9119     
Title: Re:経路の問題です。    
こうなりました

#include <stdio.h>

#define POINT_X 2
#define POINT_Y 2

typedef struct coordinates {
int x;
int y;
} COORDINATES;
COORDINATES co[1000];
int top = 0;

void search(int x,int y){
COORDINATES c;
int i;

c.x = x;
c.y = y;
co[top] = c;
top++;
if (x == POINT_X && y == POINT_Y)
{
// 終点
for (i = 0; i < top; i++)
{
printf("(%d,%d)", co[i].x, co[i].y);
}
printf("\n");
// 1個戻る
top--;
return;
}
if (x < POINT_X)
{
// 右へ
search(x+1, y);
}
if (x < POINT_X && y < POINT_Y)
{
// 斜めへ
search(x+1, y+1);
}
if (y < POINT_Y)
{
// 上へ
search(x, y+1);
}
// 1個戻る
top--;
}

int main()
{
search(0,0);
return 0;
}


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

Name: miku  ..ぴよぴよ(330ポイント)   Date: 2007/07/05(木) 21:06   No:9120 解決!     
Title: 無題    
なるほど!!

再帰の仕方がわかっていませんでした^^;;
ありがとうございました!!


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



Name: マサキ  ..かけだし(1,751ポイント)   Date: 2007/06/28(木) 21:19   No:8976       
Title: 2分探索木を用いた探索    
タイトルの通り、2分探索木を用いた探索のプログラムを作っています。
これは、あるテキストファイルに入っている単語の数を調べるものです。
プログラムは添付しておきました。また、使うテキストファイルも添付しておきます。
ここで条件として、

「文章には, ; : ( )などの記号が入っているのでそれらを取り除いてから格納すること。また、数字が含まれている単語は格納せず、文章中にある大文字は小文字に変換してから格納すること」

という条件があるのですが。これのやり方がわかりませんでした。
無能な私は、元のテキストファイルをいじって記号を消し、大文字を小文字に変えようとしてました。
このような作業をプログラムとして作るためには、どのようにすればいいのでしょうか?
教えていただけると助かります。 宜しくお願いします。


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


Name: box  ..比類無きプログラマー(74,219ポイント)   Date: 2007/06/28(木) 22:01   No:8978     
Title: Re:2分探索木を用いた探索    
> 「文章には, ; : ( )などの記号が入っているのでそれらを取り除いてから格納すること。
> また、数字が含まれている単語は格納せず、文章中にある大文字は小文字に変換してから格納すること」

scanf関数を使い、"00"で終了するのは必須条件ですか?
もし必須ではないなら、改行が見つかるまで1行分を読み込むfgets関数を
使ってみてはいかがでしょうか。

fgets関数を使って1行分を読み込んだとします。
そのデータから単語群を切り出すためには、strtok関数を使うとよいでしょう。
strtok関数の第2引数には、単語の区切りを表わす文字群(空白も可)を指定します。

切り出した単語に'0'〜'9'の数字を含んでいるかどうかを調べるには、
isdigit関数を使うとよいでしょう。

英字だけを含む単語を取得したら、tolower関数を使って小文字に変換すればよいでしょう。

isdigit関数とtolower関数は1文字ずつ扱いますので、1つの単語全体を扱うには
その単語の文字数を求める関数が必要です。それはstrlen関数です。

fgets, strtok, isdigit, tolowerおよびstrlenは、すべて標準関数です。
各関数の引数の指定方法については、書籍やネットなどで調べてみてください。


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

Name: マサキ  ..かけだし(1,693ポイント)   Date: 2007/06/28(木) 22:15   No:8979     
Title: Re:2分探索木を用いた探索    
残念ながら00の入力で終了というのは必須条件なんですよ.....
その場合だとやり方が変わってくるのでしょうか??

とりあえずは、fgets, strtok, isdigitおよびtolowerについて調べてみます。


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

Name: box  ..比類無きプログラマー(74,387ポイント)   Date: 2007/06/28(木) 22:36   No:8980     
Title: Re:2分探索木を用いた探索    
では、scanf()は"00"入力による終了時だけに使うようにして、
テキストファイルからの入力についてはfgets()を使うようにするとよいでしょう。

なお、"00"をscanf()で標準入力から受け取りますので、
fgets()の第3引数に指定するファイルハンドルは標準入力(stdin)以外に
する方がよいでしょう。
その場合、単語群を格納したテキストファイルの読み込み用の
ファイルハンドルを用意することになります。
したがって、fopen(), fclose()という標準関数も必要です。


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

Name: マサキ  ..かけだし(1,828ポイント)   Date: 2007/07/01(日) 21:01   No:9000     
Title: Re:2分探索木を用いた探索    
boxさん、せっかくアドバイスくれたのに返事が遅くなって大変申し訳ございません。他の教科の課題に追われていたので........

教えていただいたことを参考に先ほどのプログラムを書き換えてみました。まぁ書き換えたといっても、文字を変換させる部分だけですが。
しかし、まだわからないことがあります。添付したファイルを見ていただければわかると思いますが、文字が数値だったり記号だった場合の処理が未完成です。これらの文字を取り除きたい場合は、どのようにすればいのでしょうか?
宜しくおねがいします。


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

Name: box  ..比類無きプログラマー(75,135ポイント)   Date: 2007/07/01(日) 22:38   No:9002     
Title: Re:2分探索木を用いた探索    
テキストファイルから1行分読み取れる間
  1行分に含んでいる単語の候補(ここでは、まだ候補の段階)を取り出せる間、
    単語候補の内容をチェックする
      1文字でも数字を含んでいたら候補から除外する
      すべてが英数字から成っていたら
        単語を小文字に変換する→この時点で、候補から登録対象に昇格
        二分探索木の中の登録すべき場所を見つける
        二分探索木に登録する


という処理を、単語群を含むテキストファイルのデータがある間、繰り返します。
初めの2行は「〜できる間」という表現をしています。
C言語のwhile文によるループに相当します。

「1行分を読み取る」というループがあって、その中には
「1行分に含んでいる(複数の)単語を切り出す」というループがあります。


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

Name: マサキ  ..かけだし(2,145ポイント)   Date: 2007/07/02(月) 00:39   No:9006     
Title: Re:2分探索木を用いた探索    
while( fscanf(sfp,"%s",name) != EOF ){
l=strlen(name);

for(i=0 ; i<=l-1 ; i++){
if(isalnum(name[i])==0 || isdigit(name[i])!=0){
for(n=i ; n<=l-1 ; n++){
name[n]=name[n+1];
}
}
else{
name[i]=tolower(name[i]);
}
}

root = tinsert(root,name);
}

このようにしたら、上手く作動しました。アドバイスありがとうございました。
とても助かりました。
あと最後に質問なのですが、登録した単語の種類の数を表示させるにはどのようにすればいいのでしょう?
私は木構造に登録するときにカウンターを一つずつ増やして、最後にその数を表示させたのですが、それではダブった単語も数に含まれてしまうため、上手くできませんでした。


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

Name: フリオ  ..中級者(12,062ポイント)   Date: 2007/07/02(月) 03:40   No:9007     
Title: Re:2分探索木を用いた探索    
 
 ソースは、読みやすいように"pre"タグで字下げしてほしい。


 提示のコードだと、"foo-bar"は"foobar"、"foo--bar"は"foo-bar"、
"foo2nd"は"foond"、"foo22nd"は"foo2nd"として登録されてしまいますが、
課題の条件は、
"foo-bar"や"foo--bar"は"foo"と"bar"として登録し、
"foo2nd"や"foo22nd"は登録しない。
ということではないのでしょうか。


> 登録した単語の種類の数を表示させるにはどのようにすればいいのでしょう?

 単語を、新しく登録したときにカウンターをひとつ進め、
それ以外は何もしなければ、総登録語数が出ます。
 


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

Name: マサキ  ..かけだし(2,206ポイント)   Date: 2007/07/02(月) 12:51   No:9010     
Title: Re:2分探索木を用いた探索    
フリオさん、ありがとうございます。
たしかにそうですね....すっかり完成したと勘違いしてました。
では、どのようにすれば良いのでしょうか?^^;
私の力でこれ以上は思い付きませんでした.....


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

Name: box  ..比類無きプログラマー(75,169ポイント)   Date: 2007/07/02(月) 14:35   No:9014     
Title: Re:2分探索木を用いた探索    
入力ファイルを1行分読んだ後、strtok関数を使って
単語群を切り出していけばよいと思います。


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

Name: マサキ  ..かけだし(2,346ポイント)   Date: 2007/07/02(月) 20:24   No:9019     
Title: Re:2分探索木を用いた探索    
色んなサイトを見て標準関数について調べたのですが、最終的に混乱してしまい何が何だかわからなくなってしまいました↓
文字を操作する部分だけ、プログラム貼っておきます。一応コンパイルはできたのですが、セグメントエラーです。
間違いだらけのプログラムだと思いますが、アドバイス宜しくお願いします。


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

Name: box  ..比類無きプログラマー(75,679ポイント)   Date: 2007/07/02(月) 23:37   No:9027     
Title: Re:2分探索木を用いた探索    
例題の一節をお借りして、こんなコードを書いてみました。
参考になるでしょうか。

単語の途中に、わざと数字を含めているところがあります。
また、入力用ファイルをfgets()で読むことを想定して、
各行の末尾に相当する箇所に'\n'を入れてあります。

出力結果のカッコ内の数値はその単語の文字数で、
矢印の後ろに小文字変換後の単語を出力していれば二分探索木に登録する必要があり、
×印が付いていれば登録する必要がありません。


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

int main(void)
{
char *str[]= {
"Before he enter on the exe7cution of his office, he shall take the follow8ing\n",
"oath or affirmation:--\"I4 d2o solemnly swear (or affirm) that I will\n",
"faithfully execu5te the office of President of the United States, a9nd will\n",
"to the be0st of my ability, preserve, protect and defend the Constitution\n",
"3of the United States.\"\n",
};
char dlm[] = " .,():-\n\"";
char *token;
int valid, i, j;

for (i = 0; i < sizeof(str) / sizeof(str[0]); i++) {
token = strtok(str[i], dlm);
valid = 1;
while (token) {
printf("%s(%d)→", token, strlen(token));
for (j = 0; j < strlen(token) && valid; j++) {
token[j] = tolower(token[j]);
if (isdigit(token[j]))
valid = 0;
}
printf("%s\n", valid ? token : "×");
token = strtok(NULL, dlm);
valid = 1;
}
}
return 0;
}



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

Name: Justy  ..ハッカー(132,198ポイント)   Date: 2007/07/03(火) 00:06   No:9029     
Title: Re:2分探索木を用いた探索    
 えーと、横槍ですみません。
 strtokが ROM領域にある文字列を破壊しているようにみえます。


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

Name: box  ..比類無きプログラマー(75,814ポイント)   Date: 2007/07/03(火) 00:50   No:9033     
Title: Re:2分探索木を用いた探索    
もしかすると、*str[]ではなく、例えばstr[][256]でなければならなかったのでしょうか?
何年C言語に携わっていてもまだまだ未熟ですみません。


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

Name: Justy  ..ハッカー(132,719ポイント)   Date: 2007/07/03(火) 01:36   No:9036     
Title: Re:2分探索木を用いた探索    
もしかすると、*str[]ではなく、例えばstr[][256]でなければならなかったのでしょうか?
 そうですね、それなら大丈夫だと思います。

 文字リテラルへの書き込みは未定義な動作になりますんで、文字通りプログラムが
ROMに焼かれていたりすると、リテラルが ROM側にあったりするので、非常にまずいことに・・・。


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

Name: フリオ  ..中級者(12,728ポイント)   Date: 2007/07/03(火) 02:26   No:9039     
Title: Re:2分探索木を用いた探索    
 
 テキストから単語を取り出し、数字が含まれていれば()でくくって
表示します。サンプルのテキストは、boxさんのをお借りしました。

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

#define MAXLEN 256
#define TOKEN " "

void Func(char *str)
{
char *sptr;

for(sptr = str; *sptr != '\0'; sptr ++){
if(isalnum(*sptr)) *sptr = tolower(*sptr);
else *sptr = TOKEN[0];
}
for(sptr = strtok(str, TOKEN); sptr != NULL; sptr = strtok(NULL, TOKEN)){
if(strcspn(sptr, "0123456789") < strlen(sptr)) printf("(%s) ", sptr);
else printf("%s ", sptr);
}
return;
}

int main(void)
{
FILE *fp = fopen("test.txt", "r");
char str[MAXLEN];

if(!fp){
puts("Error : File not Opened");
return 1;
}
while(fgets(str, MAXLEN, fp) != NULL) Func(str);
fclose(fp);
return 0;
}


 
test.txt

Before he enter on the exe7cution of his office, he shall take the follow8ing
oath or affirmation:--\"I4 d2o solemnly swear (or affirm) that I will
faithfully execu5te the office of President of the United States, a9nd will
to the be0st of my ability, preserve, protect and defend the Constitution\n
3of the United States.\"



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

Name: マサキ  ..かけだし(2,488ポイント)   Date: 2007/07/03(火) 16:12   No:9054     
Title: Re:2分探索木を用いた探索    
boxさんJustyさんフリオさんありがとうございました。また、返事が遅くなって申し訳ありません。
掲載して頂いたプログラムを参考に少し書き直したのですが、やはりセグメントエラーになってしまいます。
やはり、文字列を読みこみ、単語ごとに区切り、それぞれの単語を判定する部分が上手く作動していないのだと思います。
プログラム貼っておきます。もしよろしければ、おかしな点を教えてください。

ちなみに、文字列読みこみ→単語の判定の部分は45〜55行目くらいです。
宜しくお願いします


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

Name: box  ..比類無きプログラマー(75,839ポイント)   Date: 2007/07/03(火) 22:11   No:9064     
Title: Re:2分探索木を用いた探索    
> char name[20];
> while( fgets(name,1000,sfp) != NULL ){ //ファイルから文字列を1行分読み込み、nameに格納//

name[]の実際の大きさと、読み込んでいる領域の大きさが
食い違っています。


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

Name: マサキ  ..入門者(2,762ポイント)   Date: 2007/07/03(火) 23:32   No:9067     
Title: Re:2分探索木を用いた探索    
boxさん、ありがとうございます。こんな基本的なところで間違えていた自分が恥ずかしいです。
おかげでちゃんと作動するようになりました!

しかし...........まだどこかおかしいようです。
実行結果のヒントとして 
americaの出現頻度:4 
yearの出現頻度:11
というものが与えられています。
しかし、このプログラムを実行させてみるとこのような出現頻度にはなりません。
どうやら、本来の頻度よりも少なくなってしまっているようです。
これは、本来登録するべき単語が木に登録されていないということですよね?
やはり「ファイルから読み取り→単語を切り出し→木に登録する」という部分が何処か間違っているのでしょうか?

 


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

Name: box  ..比類無きプログラマー(75,895ポイント)   Date: 2007/07/04(水) 00:02   No:9071     
Title: Re:2分探索木を用いた探索    
strtok()の戻り値がNULLになる(つまり、その行にある単語をすべて取得し終わった)場合のことを
考慮していませんね。
例えば、私が2007/07/02(月) 23:37に投稿したサンプルコードと見比べてみてください。


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

Name: マサキ  ..入門者(3,077ポイント)   Date: 2007/07/04(水) 01:13   No:9075     
Title: Re:2分探索木を用いた探索    

boxさんが乗せてくれたプログラムに習って作ったのですが、駄目でした↓
見比べてみても何処が違うのかわかりません。




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

Name: フリオ  ..中級者(12,778ポイント)   Date: 2007/07/04(水) 08:54   No:9080     
Title: Re:2分探索木を用いた探索    
 
 一度に解決しようとせず、
"プログラムにさせたいこと" と "プログラムがしていること" が
一致しているかどうか、一つずつ確認しながら進んだほうが
いいんじゃないでしょうか。
 


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

Name: box  ..比類無きプログラマー(75,942ポイント)   Date: 2007/07/04(水) 10:26   No:9082     
Title: Re:2分探索木を用いた探索    
> boxさんが乗せてくれたプログラムに習って作ったのですが、駄目でした↓
> 見比べてみても何処が違うのかわかりません。

どんな風にだめなのでしょうか?
fgets()で読み込む長さは20バイトでよいのでしょうか?
入力用のテキストファイルの1行の長さは、もっと長いのではありませんか?


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

Name: マサキ  ..入門者(3,304ポイント)   Date: 2007/07/04(水) 10:34   No:9083     
Title: Re:2分探索木を用いた探索    
フリオさんに言われたとおり、簡単なテキストを適当に作りプログラムを実行させてみました。
そうすることで、、自分のプログラムが明らかに間違っていることに気づきました。

a.tex
dog,cat,fish,rat,ca2,fd2

このようなテキストに対して実行させたところ実行結果が
ca
cat
dog
fish
rat
のようになりました。
数字が含まれている単語の処理がちゃんと行われていないのだと思いました。
しかし数字が含まれている文字は ca2 fd2 と二つあるのに、fd2の方はちゃんと処理されています。
何故このような結果になってしまうのでしょうか?


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

Name: マサキ  ..入門者(3,656ポイント)   Date: 2007/07/04(水) 10:44   No:9084     
Title: Re:2分探索木を用いた探索    
boxさん
2007/07/03(火) 22:11 に
 name[]の実際の大きさと、読み込んでいる領域の大きさが食い違っています。
といわれたので20にしたのですが........
実際の大きさと、読み込んでいる領域の大きさが食い違っているとはこのよな意味ではないのでしょうか?

あと、どのように間違っていたかというと
@実行結果にところどころ空行が混じっている。
Aたとえばzensといったように、実際のテキストに含まれていない単語が出てきてしまう。

単語の切り出し方にどこか間違いがあるため、A番のようなミスが起こっているのだと思うのですが、@についてはなんでこのようになるのかわかりません。
boxさんに掲載して頂いたプログラムを参考に作ったのですが、どこか誤りがあるでしょうか?
宜しくお願いいたします。


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

Name: box  ..比類無きプログラマー(76,202ポイント)   Date: 2007/07/04(水) 10:59   No:9085     
Title: Re:2分探索木を用いた探索    
>  name[]の実際の大きさと、読み込んでいる領域の大きさが食い違っています。
> といわれたので20にしたのですが........

20という数値の根拠は何でしょうか?
入力用テキストファイルの1行は、何バイトありますか?
fgets()で1行分丸ごと読むのであれば、そのための領域の大きさは、
入力用テキストファイルの1行の最大長以上でなければなりません。
入力用テキストファイルを見る限り、20では明らかに不足しています。

> @実行結果にところどころ空行が混じっている。
> Aたとえばzensといったように、実際のテキストに含まれていない単語が出てきてしまう。

zensは、citizensという単語の一部です。
これらの原因は、ひとえにfgets()の第2引数の大きさによります。
入力用テキストファイルの1行は明らかに20バイト以上であるにもかかわらず、
fgets()で20バイトずつ読み込むと、単語の途中で区切られてしまいます。


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

Name: box  ..比類無きプログラマー(76,283ポイント)   Date: 2007/07/04(水) 11:04   No:9086     
Title: Re:2分探索木を用いた探索    
> @実行結果にところどころ空行が混じっている。

fgets()は、行末の'\n'を含めて読み取ります。
今回のプログラムの仕様では、おそらく'\n'は単語を構成する文字の対象外でありましょう。
そこで、strtok()の第2引数で指定している
単語区切り文字に'\n'を含める必要があります。


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

Name: マサキ  ..入門者(3,874ポイント)   Date: 2007/07/04(水) 11:35   No:9088     
Title: Re:2分探索木を用いた探索    
では、少し改良を加えてみます。
まず、
strtok()の第2引数に'\n'を加えてみました。
そうしたところ、ところどころの改行はなくなりました。
ありがとうございます。
次に
fgets()の第2引数を変えてみます。
fgets()の第2引数は読み込む文字数の最大値ですよね?
なので、100としてみます。
そうしたところ、セグメントエラーになってしまいました。

fgets()の第2引数が20のときはちゃんと動くのに、100にするとセグメントエラー.........
これはどういうことでしょう?^^;



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

Name: box  ..比類無きプログラマー(76,293ポイント)   Date: 2007/07/04(水) 15:23   No:9091     
Title: Re:2分探索木を用いた探索    
> fgets()の第2引数が20のときはちゃんと動くのに、100にするとセグメントエラー.........

name[]の定義も100にしましたね?


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

Name: マサキ  ..入門者(4,035ポイント)   Date: 2007/07/04(水) 18:39   No:9098     
Title: Re:2分探索木を用いた探索    
nameとstrtokを両方とも100にしたら上手く作動しました。
boxさん、ありがとうございました。
しかし、最後の最後でもう一つエラーを発見してしまいました。
゛を単語を切り出す条件にいれてませんでした。
゛をstrtok関数の第2引数に追加した所、エラーになってしまいます。
strtok関数で第2引数に゛を追加するにはどのようにすればいいのでしょうか?


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

Name: box  ..比類無きプログラマー(76,299ポイント)   Date: 2007/07/04(水) 18:52   No:9100     
Title: Re:2分探索木を用いた探索    
\"
です。


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

Name: マサキ  ..入門者(4,113ポイント)   Date: 2007/07/05(木) 11:09   No:9105     
Title: Re:2分探索木を用いた探索    
おかげさまでプログラムが完成しました。ありがとうございました。
まだまだ未熟者ですが、これからも頑張っていきたいと思います。
また何かあった時は、よろしくお願いします。


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



Name: 雪中 蓮  ..入門者(3,277ポイント)   Date: 2007/07/04(水) 00:26   No:9074       
Title: シューティングゲームで・・・    
お久しぶりです。

早速なんですが今、学校の授業でシューティングゲームを作っているのですが、

その作成中のプログラムに

こちらのサイトのシューティングゲーム館の内容を参考にして

自機の弾を増やしたのですがうまく表示されません。

どなたかアドバイスをお願いします。

長いですが、貼っておきます。


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

#include "DxLib.h" // DxLibライブラリを使用する
#include <math.h> //平方根の計算のため

//プロトタイプ宣言
float rad(float degree);
/*
*
* 変数定義
*
*/
int Counter = 0;

int Backimg;

int PlayerGraph;
int PlayerX;
int PlayerY;

double ShotSpeed = 10;

typedef struct{
double x,y;
double Mx,My;
double Angle;
int flag;
} SHOT_t;

SHOT_t PlayerShot[5][15];//1:列 2:1列の最大個数

int ShotGraph[2];

int EnemyGraph;
int EnemyX;
int EnemyY;
bool EFlag;

double root = 5 * sqrt(2.0f);

// ========== WinMain関数
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{

// ---------- システム処理
SetGraphMode(640, 480, 16); // 640×480ドット65536色モードに設定
SetWindowText("Shooting_kadai");
ChangeWindowMode(true); //true:window false:フルスクリーン
if(DxLib_Init() == -1) return -1; // DXライブラリ初期化処理
SetDrawScreen(DX_SCREEN_BACK); // ひとまずバックバッファに描画

/*
*
* 初期設定
*
*/

//背景
Backimg=LoadGraph("image/haikei.bmp");

//自機グラフィック
SetTransColor(255,0,255);
PlayerGraph = LoadGraph("image/player.bmp");
PlayerX = 319;
PlayerY = 239;

//弾グラフィック
SetTransColor(255,0,255);
ShotGraph[0] = LoadGraph("image/shot.bmp");
ShotGraph[1] = LoadGraph("image/shot2.bmp");

//弾移動量初期化
float degree[5]={0+90,22.5+90,-22.5+90,45+90,-45+90};
int a,b;
for(a=0;a<5;a++){
for(b=0;b<15;b++){
PlayerShot[a][b].Mx=cos(rad(degree[a]))*ShotSpeed;
PlayerShot[a][b].My=sin(rad(degree[a]))*ShotSpeed;
}
}

//敵グラフィック
SetTransColor(255,0,255);
EnemyGraph = LoadGraph("image/enemy.bmp");
EnemyX = 319;
EnemyY = 75;
EFlag = true;

// ---------- ゲームループ
while(ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0)
{
ClsDrawScreen(); // 画面消去

//フレームカウント 60fpsを正常動作とする
if(Counter == 60){
Counter = -1;
}
Counter++;
/*
* メイン処理
*/
DrawGraph(0, 0, Backimg,false);

//キー入力
if(CheckHitKey(KEY_INPUT_RIGHT))PlayerX += 5;
if(CheckHitKey(KEY_INPUT_LEFT))PlayerX -= 5;
if(CheckHitKey(KEY_INPUT_UP))PlayerY -= 5;
if(CheckHitKey(KEY_INPUT_DOWN))PlayerY += 5;

//画面外判定
if(PlayerX < 16) PlayerX = 16;
if(PlayerX > 623) PlayerX = 623;
if(PlayerY < 16) PlayerY = 16;
if(PlayerY > 463) PlayerY = 463;

DrawGraph(PlayerX, PlayerY, PlayerGraph,true);


//ショット

//表示チェック 表示されてないものを探して表示させる
if(CheckHitKey(KEY_INPUT_LCONTROL) && Counter%5==0){
for(a=0;a<5;a++){
for(b=0;b<15;b++){
if(PlayerShot[a][b].flag==0){
PlayerShot[a][b].flag=1;
PlayerShot[a][b].x=PlayerX;
PlayerShot[a][b].y=PlayerY;
break;
}
}
}
}
//ショット移動
for(a=0;a<5;a++){
for(b=0;b<15;b++){
if(PlayerShot[a][b].flag==1){
PlayerShot[a][b].x-=PlayerShot[a][b].Mx;
PlayerShot[a][b].y-=PlayerShot[a][b].My;
if(PlayerShot[a][b].x<-32||PlayerShot[a][b].x>640+32||PlayerShot[a][b].y<-32)
PlayerShot[a][b].flag=0;
}
}
}
//表示
for(a=0;a<5;a++){
for(b=0;b<15;b++){
if(PlayerShot[a][b].flag==1){
if(a==0) DrawGraph(PlayerShot[a][b].x-10,PlayerShot[0][b].y-18,ShotGraph[0],true);
if(a==1) DrawGraph(PlayerShot[a][b].x-10,PlayerShot[0][b].y-18,ShotGraph[1],true);
}
}
}

//敵表示
if(EFlag == true){
EnemyX -= 6;
if(EnemyX <= 0) EFlag = false;
}
if(EFlag == false){
EnemyX += 6;
if(EnemyX >= 640-32) EFlag = true;
}
DrawGraph(EnemyX - 32, EnemyY - 32, EnemyGraph, true);


ScreenFlip(); // 裏画面を表画面に瞬間コピー
}
DxLib_End(); // DXライブラリの終了処理
return 0; // このプログラムの終了
}



float rad(float degree)
{
return degree / 180.0 * 3.14159265;
}


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


Name: Justy  ..ハッカー(134,069ポイント)   Date: 2007/07/04(水) 01:50   No:9076     
Title: Re:シューティングゲームで・・・    
 ぱっと見おかしなところは

	if (a == 0)

DrawGraph(PlayerShot[a][b].x - 10, PlayerShot[0][b].y - 18, ShotGraph[0], true);
if (a == 1)
DrawGraph(PlayerShot[a][b].x - 10, PlayerShot[0][b].y - 18, ShotGraph[1], true);

 ここですね。

 a=0と a=1の時しか描画していないので、どうやっても 2〜4は表示されません。
 それに y座標のほうで PlayerShot[0][b]としていますが、これは aではないのでしょうか?


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

Name: 雪中 蓮  ..ぴよぴよ(28ポイント)   Date: 2007/07/04(水) 23:26   No:9102 解決!     
Title: Re:シューティングゲームで・・・    
ご指摘ありがとうございます。

今朝からコンパイルができなくなったので動作確認ができませんので

また何かあれば質問させてもらいます。

返信が遅れて申し訳ありませんでした。


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



Name: バグ  ..熟練のプログラマー(49,378ポイント)   Date: 2007/06/21(木) 09:31   No:8796       
Title: タイトルバーに関する情報の取得方法    
Windowの上部にタイトルバーってありますよね?

あの部分のサイズ(幅、高さ、色…etc)を取得したい場合って、どうしたらいいのでしょうか?

MoveWindow関数でサイズを変更しようと思っても、タイトルバー込みの大きさに変更されてしまうので、タイトルバーの高さ分だけ大きくしたいのですが、方法が分からなくて…

ご存知の方がいらっしゃいましたら、ご教授願いますm(_ _)m
環境はVC++6.0で、MFCを使用しています。


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


Name: ま〜く  ..入門者(3,713ポイント)   Date: 2007/06/21(木) 10:11   No:8797     
Title: Re:タイトルバーに関する情報の取得方法    
GetSystemMetricsでさまざまな大きさを取得できますよ。

そのほかのやりかたとして・・・

MFCをお使いでしたら
virtual void CalcWindowRect とか

AdjustWindowRect を使うのも手ですね。


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

Name: バグ  ..熟練のプログラマー(49,581ポイント)   Date: 2007/06/21(木) 10:21   No:8798 解決!     
Title: Re:タイトルバーに関する情報の取得方法    
返信ありがとうございます(^-^)

今、MSDNを見ていたら、確かにありました!!
GetSystemMetricsの項を開いていたのに、普通に見逃していたようです(^_^;)

GetSystemMetrics(SM_CYCAPTION);

これでタイトルバーの高さが返るんですねぇ…知らなかった。

AdjustWindowはクライアント領域の大きさだけを変更できるんですね。これも全く知りませんでした(苦笑)
便利ですねぇ!!(^o^)

ちなみにこれまでは、使用しないコントロールを1つ貼り付けまして、MoveWindow関数でメインのWindowのクライアント座標(0,0)へ移動させた後に、GetWindowRect関数でそれぞれのスクリーン座標を求めて、その差を利用してタイトルバーの高さを求めていました。

どれだけ、力技なんだと!!(笑)

なんにせよ、助かりました。有難うございます♪(^_^)


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

Name: バグ  ..熟練のプログラマー(49,855ポイント)   Date: 2007/06/21(木) 10:52   No:8799     
Title: Re:タイトルバーに関する情報の取得方法    
うーん、今度はDialogの左右と下部にある枠線が邪魔になったので、結局下記のようにして解決しました(^_^;)


// クライアント領域サイズ設定
int nWidth, nHeight;
CRect rectDialog, rectClient;

this->GetWindowRect(&rectDialog);
this->GetClientRect(&rectClient);
nWidth = rectDialog.Width() - rectClient.Width();
nHeight = rectDialog.Height() - rectClient.Height();
this->SetWindowPos(NULL, 0, 0, CLIENT_WIDTH + nWidth, CLIENT_HEIGHT + nHeight, SWP_NOMOVE);


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

Name: ま〜く  ..入門者(3,830ポイント)   Date: 2007/06/21(木) 11:52   No:8801     
Title: Re:タイトルバーに関する情報の取得方法    
あ〜ダイアログなんですかー^^;
それじゃーウィンドウを作成する前にAdjustWindowで求めるというのも微妙でしたね。

ところでCLIENT_WIDTHやCLIENT_HEIGHTは定数なのですか?それならリソースで最初からその大きさに
しておけば・・・というのは無しですか?^^;


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

Name: バグ  ..熟練のプログラマー(49,951ポイント)   Date: 2007/06/21(木) 12:11   No:8802     
Title: Re:タイトルバーに関する情報の取得方法    
いえいえ、定数ではないです。(^_^;)
それぞれ、クライアント領域の幅と高さを渡してやるという意味で、ああいう風に書きました。
とりあえず、問題なく動いているのですが、もっと効率の良い方法があればいいんですが…(-_-;)

this->MoveWindow(0, 0, CLIENT_WIDTH + nWidth, CLIENT_HEIGHT + nHeight);

この方法ならば、最後のSetWindowPos関数は上記のようにMoveWindow関数でも良いですよね(^-^)


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

Name: ま〜く  ..入門者(3,838ポイント)   Date: 2007/06/21(木) 14:03   No:8804     
Title: Re:タイトルバーに関する情報の取得方法    
そうでしたか^^

>この方法ならば、最後のSetWindowPos関数は上記のようにMoveWindow関数でも良いですよね

そうですね♪


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

Name: バグ  ..熟練のプログラマー(50,234ポイント)   Date: 2007/06/22(金) 17:39   No:8832     
Title: Re:タイトルバーに関する情報の取得方法    
実はシンプルなコラムスを作ってるんですよ。
今回は効果音や音楽も入れてみようかと思っているので、コンソールではありません(笑)

操作はマウス1つで行えるようにする予定です。また完成したら、管理人さんにアップしてもらうかもしれませんので、その時は感想をお願いします(^-^)


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

Name: ま〜く  ..入門者(3,882ポイント)   Date: 2007/06/23(土) 02:13   No:8848     
Title: Re:タイトルバーに関する情報の取得方法    
あ〜このコラムスの右上にある「次のやつ」表示ウィンドウだったんですね^^

前回のようにソースも一緒にアップしてもらえるんでしょうか?


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

Name: バグ  ..熟練のプログラマー(50,022ポイント)   Date: 2007/06/23(土) 06:14   No:8850     
Title: Re:タイトルバーに関する情報の取得方法    
そうです。全部1つのダイアログに収めるつもりだったのですが、次のを表示してないことに気付いて後付けしました(笑)

モードレスダイアログとして生成して、一切の操作を受け付けないようにしてあります。で、メインのダイアログが移動した場合にのみ、WM_MOVEメッセージを送って、常に一定の位置に表示されるようにしてあります(^-^)

結果的に普通に表示した方が楽だった気がしないでもありませんけど(笑)

ソースはMFCを使っているので、無駄に大きく読みづらいですが、一応、添付できたら良いかな?とは思っていますよ(^^)v


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

Name: ま〜く  ..入門者(4,020ポイント)   Date: 2007/06/23(土) 16:56   No:8853     
Title: Re:タイトルバーに関する情報の取得方法    
ふむふむ。
一昔前、MFCを使ってゲームを作ると余計なオーバーヘッドがかかって速度が気になったのですが、今のマシンスペックなら十分ですね。
ゲームなのに無駄にドキュメントビューアーキテクトを利用したりすれば、MFC初心者にはいい参考になるかもですねw
あ〜でもフリー版のVCにはMFCがついていないんでしたっけ??^^;


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

Name: 組木紙織  ..中級者(14,739ポイント)   Date: 2007/06/23(土) 17:23   No:8854     
Title: Re:タイトルバーに関する情報の取得方法    
>あ〜でもフリー版のVCにはMFCがついていないんでしたっけ??^^;

ついていないですねーVCのExpressだと。

C++/CLIが使えるので、マイクロソフトは、そちらで作って欲しいのかな、と思っています。

CLIで作るといまどきのパソコンでも起動が少し重たいのですが(笑)


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

Name: ま〜く  ..入門者(4,070ポイント)   Date: 2007/06/23(土) 20:35   No:8860     
Title: Re:タイトルバーに関する情報の取得方法    
あーやっぱりついていませんでしたね。^^

>C++/CLIが使えるので、マイクロソフトは、そちらで作って欲しいのかな、と思っています。

それは感じますねw


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

Name: バグ  ..熟練のプログラマー(52,381ポイント)   Date: 2007/06/27(水) 16:49   No:8945     
Title: コラムス…その後    
グラフィックを変更してみたりしました。
とりあえず遊べるところまできましたが、まだ音が入ってないのでショボいです(苦笑)


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

Name: ま〜く  ..入門者(4,174ポイント)   Date: 2007/06/27(水) 23:04   No:8954     
Title: Re:コラムス…その後    
お〜
ちゃくちゃくと完成に近づいていますね!
やはりコンソールに比べるとカラフルでいいですね。
背景のレンガ模様はこのままにするんですか?
このHPの背景のような黒を基調とした感じにすると見やすくなると思うのですがどうでしょう?


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

Name: バグ  ..熟練のプログラマー(52,839ポイント)   Date: 2007/06/27(水) 23:34   No:8956     
Title: Re:タイトルバーに関する情報の取得方法    
グラフィックに関しては、画心のない私にとって、非常に頭が痛いところです…あのレンガ模様も単色よりはマシという程度のものですし…(;^_^A
本当は可愛いイラストなんかを背景に表示したいのですが…普通に無理です(笑)
音楽は知り合いのバンドのCDから借りられる事になったので、何も心配してないのですが、グラフィックに関しては打つ手なし状態です(;´Д`)


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

Name: バグ  ..熟練のプログラマー(53,384ポイント)   Date: 2007/07/04(水) 17:35   No:9096     
Title: コラムスのその後のその後    
うーん、忙しくてなかなか進みません…(-_-;)
ゲームに音を入れるのは初めての事なので、どうしたものか(面倒だなぁ…)と思いつつ、今出来ている部分をチョコチョコといじっています。


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



Name: たろぉ  ..ぴよぴよ(125ポイント)   Date: 2007/07/04(水) 10:02   No:9081       
Title: テイラー級数    
e^x=1+x/1!+x^2/2!+x^3/3!+・・・
上記に基づき、e^xの値を計算するプログラムを作成する。forループ whileループ do-whileループ を使う時は、再帰関数によって実現する。仕様は以下の通り。

<<仕様>>
1.xの値を入力し、標準関数 exp() を用いて、比較のための e^x 値を求める。
2.上記式における項数を入力し、テイラー級数による e^x の近似値を求める。


以上です。
長々とすいません。
あまり知識がないので…。
教えて頂ければ幸いです。


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


Name: 管理人 [URL]  ..伝説のハッカー(381,258ポイント)   Date: 2007/07/04(水) 11:32   No:9087     
Title: Re:テイラー級数    

以下の式を数学の式だと思ってください。
例えば、階乗の定義はこうなっていますよね。

f(n) = f(n-1) * n (n>0)
= 1 (n==0)

これをそのまんまプログラムで書けばいいんです。

int f( int n )
{
if( n>0 )
return f(n-1) * n;

else if( n==0 )
return 1;

}

これが階乗を計算するプログラムです。
こういう要領でまず漸化式のような数式を考えてから実装してみてください。
(引数nは0以上の数であることに注意してください。)



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

Name: toyo  ..かけだし(2,443ポイント)   Date: 2007/07/04(水) 11:45   No:9089     
Title: Re:テイラー級数    
1+x/1!+x^2/2!+x^3/3!+・・・
の部分をプログラムにすればいいんです
無限級数ですが x^n/n! は0に収束するので適当に小さくなった時点で打ち切ればよいでしょう
具体的にはdouble型で計算するとして 1e-08 より小さくなったら終了でよいと思います。
whileループの例として

double myexp(double x)
{
double EPS = 1e-08;
double d = 1.0, s = 1.0, e = 1.0, diff;

while (1) {
d = ??; /* x^n */
s = ??; /* n! */
diff = d / s; /* x^n / n! */
e += diff;
if(diff < EPS) {
break;
}
}
return e;
}


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

Name: toyo  ..かけだし(2,457ポイント)   Date: 2007/07/04(水) 11:53   No:9090     
Title: Re:テイラー級数    
項数は入力するんですね
よく読んでいませんでした


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



Name: にゃんこ  ..入門者(4,866ポイント)   Date: 2007/07/03(火) 18:26   No:9058       
Title: リバーシゲームについて    
学校の課題でリバーシ(オセロ)ゲームを作成せよという問題が出たんですが、自分で作ってみてどうしてもうまく動作しないのでどなたか教えてください。お願いします。。
課題の内容は以下の通りです。

リバーシゲームのためのモジュールとその動作を確認するプログラムを作成せよ。ルールは以下の通り。
1.最初に盤の初期状態として8×8の盤上の(4,4)、(5,5)に白の石、(5,4)、(4,5)に黒の石を置き、黒が先手で打ち始める。
2.自分の番がきたら、相手の石を1石以上はさめるところに自分の石を置き、挟んだ相手の石をすべて返して自分の色にする。
3.打てる箇所がない場合はパスをする。
4.盤上に空きがなくなるか双方がパスとなったとき試合は終了。石数が多い方が勝ちとする。

・各マスの状態を定義する列挙型のPointState型を定義すること。定義する状態は以下の3つ。
    NONE,BLACK_STANE,WHITE_STANE
・盤の構造体をBorad型として定義すること。Board型には以下の情報を含めること。
    盤の状態を保持する8×8のPointstate型配列:StateArray[8][8]
    現在の手番を保持するPointState型変数:currentStone
・Board型はboard.hというヘッダファイルにて定義すること。
・board型に対する以下の関数プロトタイプ宣言をboard.hで行うこと。
    盤の初期化を行う関数
    盤の状態表示を行う関数
    盤のx列目y行目のマスの状態を取得する関数
    盤のx列目y行目に石が置けるかどうかを確認し、可能な場合盤を更新する関数
    盤のx+dx列目y+dy行目の増すの石を返せるかどうかを確認し、可能な場合に盤を更新する関数
    盤のx列目y行目のマスの状態を更新する関数
    相手(次の手番)の色を取得する関数
・ユーザに座標を問い合わせること
・座標(0,0)の入力はパス、座標(9,9)の入力は終了とすること。





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


Name: にゃんこ  ..初心者(5,997ポイント)   Date: 2007/07/03(火) 18:40   No:9059     
Title: Re:リバーシゲームについて    
上の課題のソースはこんな感じです↓↓↓

/* board.h */

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

/* 真(TRUE)か偽(FALSE)かの論理表す boolean 型(列挙型) */
typedef enum{
FALSE, TRUE
}boolean;

/* 盤のマス目の状態を表すPointState型(列挙型)*/
typedef enum{
NONE, BLACK_STONE, WHITE_STONE
}PointState;

/* 現在の手番と盤の状態を表すBoard型(構造体)*/
typedef struct{
PointState stateArray[8][8];
PointState currentStone;
}Board;

/* 盤の初期化(プロトタイプ宣言)*/
void initializeBoard(Board* pBoard);

/* 盤の状態の表示(プロトタイプ宣言)*/
void displayState(Board* pBoard);

/* 盤のx列目y行目のマスの状態を取得(プロトタイプ宣言)*/
PointState getState(Board* pBoard, int x, int y);

/*
* 盤のx列目y行目に石が置けるかどうかを確認し、
* 可能な場合に盤を更新
* (プロトタイプ宣言)
*/
boolean tryPlaceStone(Board* pBoard, int x, int y);

/*
* 盤のx+dx列目y+dy行目のマスの石を返せるかどうかの確認、
* 可能な場合に盤を更新
*(プロトタイプ宣言)
*/
boolean tryReverseNext(Board* pBoard, int x, int y, int dx, int dy);

/* 盤のx列目y行目のマスの状態を更新(プロトタイプ宣言)*/
void setState(Board* pBoard, int x, int y, PointState state);

/* 相手(次の手番)の色の取得(プロトタイプ宣言)*/
PointState getEnemyStone(Board*);




/* 動作を確認するプログラム */

#include "board.h"

void inquiry(Board board);

main()
{
/* Board型の変数boardを宣言 */
Board board;
int x=1,y=1;

/* 盤(board)を初期状態に設定 */
initializeBoard(&board);
/* 盤(board)の状態を表示 */
displayState(&board);

while((x!=0 && y!=0) || (x!=9 && y!=9)){
/* 手番の石(Black)を置く位置を問い合わせる */
printf("黒の石を置く座標を入力してください\n(x,y) = ");
inquiry(board);

/* 手番の石(White)を置く位置を問い合わせる */
printf("白の石を置く座標を入力してください\n(x,y) = ");
inquiry(board);

printf("\n");

}
}

/* 石を置く座標の問い合わせをする関数 */
void inquiry(Board board){
int x, y;

scanf("%d,%d",&x,&y);
if(x==9 && y==9)
exit(EXIT_SUCCESS);
else if(x==0 && y==0)
getEnemyStone;
else{
tryPlaceStone(&board,x,y);
/* 盤(board)の状態を表示 */
displayState(&board);
}
}



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

Name: にゃんこ  ..初心者(7,755ポイント)   Date: 2007/07/03(火) 18:42   No:9060     
Title: Re:リバーシゲームについて    
同じく上のモジュールです↓↓↓(長くてすいません……!!)
/* board.c */

#include "board.h"

/*
* 盤の初期化(実装)
*/
void initializeBoard(Board* pBoard) {
int x, y;

/* 最初の手番を黒に設定 */
pBoard->currentStone = BLACK_STONE;

/* 盤上の石を全てクリア(NONEと設定) */
for(x=1; x<9; x++)
for(y=1; y<9; y++)
setState(pBoard, x, y, NONE);
/* 盤を初期状態にするために石を置く */
setState(pBoard, 4, 4, WHITE_STONE);
setState(pBoard, 5, 4, BLACK_STONE);
setState(pBoard, 4, 5, BLACK_STONE);
setState(pBoard, 5, 5, WHITE_STONE);
}

/*
* 盤の状態の表示(実装)
*/
void displayState(Board* pBoard) {
int x, y;
char stone;

printf("\n 12345678\n"); /* 列番号の表示 */
for (y = 1; y < 9; y++) {
printf("%d", y); /* 行番号の表示 */
for (x = 1; x < 9; x++) {
/* x列目、y行目のマスの状態 */
PointState state = getState(pBoard, x, y);
switch (state) {/* 状態に応じて表示を切り替え */
case NONE: stone = '.'; break;
case BLACK_STONE: stone = 'B'; break;
case WHITE_STONE: stone = 'W'; break;
default: stone = 'E';
}
printf("%c",stone);
}
printf("\n");
}
printf("\n");
/* 現在の手番の色の表示 */
printf("現在の手番: %s",
pBoard->currentStone == BLACK_STONE ? "黒(B)" : "白(W)" );
printf("\n");
}

/*
* 盤のx列目y行目のマスの状態を取得(実装)
*/
PointState getState(Board* pBoard, int x, int y){

if (x < 1 || x > 8 || y < 1 || y > 8) {/* マスの範囲外であればエラー */
printf("xとyは、0 以上かつ9以下の値でなければなりません。\n");
exit(EXIT_FAILURE);
}

/* 盤のx列目、y行目の状態をリターン */
return pBoard->stateArray[x-1][y-1];
}

/*
* 盤のx列目y行目に石が置けるかどうかを確認し、
* 可能な場合に盤を更新(実装)
*/
boolean tryPlaceStone(Board* pBoard, int x, int y) {

boolean trial;

if ( getState(pBoard, x, y) != NONE )
return FALSE;

/* 補足:ボードの範囲を考慮にいれて、境界処理も行うと良い。*/

/* 石を置こうとする場所の隣を返せるかどうかを確認 */
trial = FALSE;
trial = trial | tryReverseNext(pBoard, x, y, +1, 0); /* 右 */
trial = trial | tryReverseNext(pBoard, x, y, 0, +1); /* 下 */
trial = trial | tryReverseNext(pBoard, x, y, -1, 0); /* 左 */
trial = trial | tryReverseNext(pBoard, x, y, 0, -1); /* 上 */
trial = trial | tryReverseNext(pBoard, x, y, +1, +1); /* 右上 */
trial = trial | tryReverseNext(pBoard, x, y, +1, -1); /* 右下 */
trial = trial | tryReverseNext(pBoard, x, y, -1, +1); /* 左上 */
trial = trial | tryReverseNext(pBoard, x, y, -1, -1); /* 左下 */

if (trial) { /* 隣の石を返すことができる場合*/
/* 石を置いてボードの状態を更新する。*/
setState(pBoard, x, y, pBoard->currentStone);
/* 手番を相手に渡す */
pBoard->currentStone = getEnemyStone(pBoard);
}

return trial;
}

/*
* 盤のx+dx列目y+dy行目のマスの石を返せるかどうかの確認、
* 可能な場合に盤を更新(実装)
*/
boolean tryReverseNext(Board* pBoard, int x, int y, int dx, int dy) {

/* 隣の石が相手の石であるかどうかの確認 */
if(getState(pBoard, x + dx, y + dy) == getEnemyStone(pBoard)) {
/* 隣の隣の石が自分の石であるかどうかの確認 */

if((x+dx)<1 || (x+dx)>8 || (y+dy)<1 || (y+dy>8)){
return FALSE;
} /* x+dx、y+dyがマスの範囲内にあるかどうかの判定 */

if (getState(pBoard, x+dx+dx, y+dy+dy) == pBoard->currentStone ) {
/* 隣の石が相手で、隣の隣の石が自分である場合、
石を返して盤を更新 */

if((x+dx+dx)<1 || (x+dx+dx)>8 || (y+dy+dy)<1 || (y+dy+dy)>8){
return FALSE;
} /* x+dx+dx、y+dy+dy1がマスの範囲内のあるかどうかの判定 */

setState(pBoard, x+dx, y+dy, pBoard->currentStone);
return TRUE;
}
else
return tryReverseNext(pBoard, x+dx, y+dy ,dx, dy);
}
else
return FALSE;
}

/*
* 盤のx列目y行目のマスの状態を更新(実装)
*/
void setState(Board* pBoard, int x, int y, PointState state) {
/* 盤のx列目y行目のマスの状態を与えられた状態に更新 */
pBoard->stateArray[x-1][y-1] = state;
}

/*
* 相手(次の手番)の色の取得(実装)
*/
PointState getEnemyStone(Board* pBoard) {
/* 相手(次の手番)の色の取得 */
return pBoard->currentStone == BLACK_STONE ? WHITE_STONE : BLACK_STONE;
}




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

Name: にゃんこ  ..初心者(7,837ポイント)   Date: 2007/07/03(火) 18:45   No:9061     
Title: Re:リバーシゲームについて    
えと、上のプログラムで実行すると黒の石はうまく置けるんですが、白石を置く座標を入力しても何故か初期状態の盤が表示されてしまいます。
どこがいけないんでしょうか??


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

Name: 組木紙織  ..上級者(16,571ポイント)   Date: 2007/07/03(火) 19:26   No:9062     
Title: Re:リバーシゲームについて    
ざっと見ただけですが、
>void inquiry(Board board);

この関数はポインタを渡すべきではないでしょうか?
リバーシの版面はコピーで渡す必要は無いはずです。

//リバーシは、コンソールではないですが、私も作りました。
//完成頑張ってください。


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

Name: にゃんこ  ..初心者(8,195ポイント)   Date: 2007/07/04(水) 00:04   No:9072     
Title: Re:リバーシゲームについて    
回答ありがとうございます!!
確かにポインタ渡しにしたら白石もちゃんと表示されるようになりました♪♪

あと、また別の部分の問題になってしまって申し訳ないんですが、
白も黒も間に挟むのが1石ならちゃんとひっくり返してくれるんですが、2石以上になると

 12345678
1 ........
2 ........
3 ........
4 ..BBB...
5 ..BBW...
6 ..B.....
7 ........
8 ........

の状態から(2,5)に白石を置こうとすると

 12345678
1 ........
2 ........
3 ........
4 ..BBB...
5 .WBWW...
6 ..B.....
7 ........
8 ........

とゆう風になってうまく返せません。
上のboard.cのtryReverseNext関数の中がいけないというのは分かるんですが、
やっぱりここもどんな風に直せばいいのかよく分かりません。

分からないとこばっかりですいませんが、教えてください!!
お願いします。。






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

Name: 組木紙織  ..上級者(16,994ポイント)   Date: 2007/07/04(水) 05:14   No:9079     
Title: Re:リバーシゲームについて    
再帰を使っているのですね。
慣れないと結構難しいですよ。
tryReverseNextの関数の中の、

return tryReverseNext(pBoard, x+dx, y+dy ,dx, dy);
の部分を少し変更すれば、よくなります。

このままだと、ひっくり返す関数が1度しか呼ばれないので、return で返す前に
もう一工夫必要です。


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



Name: まんま  ..ぴよぴよ(134ポイント)   Date: 2007/07/03(火) 23:40   No:9068       
Title: 関数について(初心者)    
自分で定義した関数を2重に利用することは出来ますか?
たとえば次のようなことは可能でしょうか?

void sum_a(void);
void sum_b(void);

main()
{
sum_b();
}

void sum_a(void)
{
//sum_aの処理//
}

void sum_b(void)
{
sum_a();
//引き続きsum_bの処理//
}



よろしくお願いします。




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


Name: box  ..比類無きプログラマー(75,851ポイント)   Date: 2007/07/03(火) 23:42   No:9069     
Title: Re:関数について(初心者)    
全く問題ありません。

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

Name: まんま  ..ぴよぴよ(158ポイント)   Date: 2007/07/04(水) 00:00   No:9070 解決!     
Title: Re:関数について(初心者)    
ありがとうございます!!

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

Name: 管理人 [URL]  ..伝説のハッカー(381,063ポイント)   Date: 2007/07/04(水) 04:10   No:9077     
Title: Re:関数について(初心者)    
自分の関数の中で自分の関数を呼ぶ・・なんて事も出来ます。
これは再帰関数として用いられます。
しかし使用方法が若干難しいので、クイックソートや組み合わせの計算なんかの勉強をするまで使わないかもしれませんが、こういうことも出来るって事でしっておくと、突然再帰関数を見たときのハードルが低くなるかもしれません。

出来るかな?と思ったら色々自分でコンパイルしてみるといいですよ。
とりあえず、エラーが出てなかったら大丈夫!って感じで怖いもの知らずでドンドン書いていってみてください!


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

Name: 組木紙織  ..上級者(16,893ポイント)   Date: 2007/07/04(水) 04:23   No:9078     
Title: Re:関数について(初心者)    
再帰関数はこんなのですね。
フィナボッチ数列を返します。

#include<stdio.h>

int f(int num)
{
if(num <=2) return 1;
return f(num-1)+ f(num-2);
}


int main(void)
{
int out,i;
for(i=1;i<10;i++){
out = f(i);
printf("%d\n",out);
}
return 0;
}


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



Name: ouh  ..ぴよぴよ(189ポイント)   Date: 2007/07/02(月) 20:30   No:9020       
Title: オーバーロードについて    
初めまして、ouh と申します。
いつも拝見させて頂いております。

CではなくC++のお話で恐縮ですが、どうか宜しくお願いします。

質問:
以下のように関数を作っておきます。

// 1)
std::string func( const std::string& s ) {
return ( s + "、こっち" );
}

// 2)
void func( char* s ) {
strcat( s, "、やっぱこっち" );
}


そして以下のように呼び出しをします。

char ss[64];
strcpy( ss, "呼ばれるのは" );
std::string str = func( ss );

当然コンパイルエラーです。 char* を引数にとる func() の戻り値の
型は void なのですから。
ですが、2) が存在しなければ上記の呼び出しはエラーではありません。

std::string str = func( ss );
なら 1) が呼ばれ、

func( ss );
なら 2) が呼ばれるようにしたいのですが、なにかいい手はないでしょうか?

これは雑談ですのでお気軽にいろんなお話が聞きたいです。
いい手が無いなら無いで
1) を呼び出すときは

std::string str = func( std::string( ss ) );

とすればいいだけなのですから。本気の本気で困っての質問ではないので
「雑談」にしました。


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


Name: Justy  ..ハッカー(132,167ポイント)   Date: 2007/07/02(月) 22:22   No:9024     
Title: Re:オーバーロードについて    
 う〜ん、オーバーロードは引数だけが対象ですから、そのままでは無理ですね。
 
 テンプレートを使って明示的に戻り値を指定する手もありますが、それだと明示的になってしまうので・・・。


 で、思いついたのがこれです。



#include <string>
#include <iostream>
#include <cstring>

class func
{
public:
func(char *p)
: str(p) {}

operator std::string () const
{
return std::string(str) + "、こっち";
}
operator char* () const
{
std::strcat(str, "、やっぱこっち");
return str;
}
private:
char *str;
};


int main()
{
char ss[64];
strcpy( ss, "呼ばれるのは" );

std::string s1 = func(ss); // operator std::string ()を呼び出す
std::cout << s1 << std::endl;

(char*)func(ss); // キャストして強制的に operator char*()を呼び出す
std::cout << ss << std::endl;

char *s2 = func(ss); // 明示的に戻り値があってもいい
std::cout << ss <<std::endl;

return 0;
}


 関数ではなくクラスになってしまっていますが、これなら戻り値に従って
処理関数を変えることが出来ます。

 ただ、変換関数の都合上 voidを戻り値とすることはできないので、
(std::stringを戻り値とするものと対になる)もう片方を便宜的に char*を
戻り値とするようにしてあります。
 その為、(char*)func(ss) もしくは static_cast<char*>(func(ss))と
キャストするか、実際に戻り値を受け取る必要がありますが。

 妥協点としてはこんな感じですかね。
 いかがでしょう。


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

Name: ouh  ..ぴよぴよ(458ポイント)   Date: 2007/07/03(火) 00:38   No:9032     
Title: Re:オーバーロードについて    
Justy様、返信ありがとうございます。

>  う〜ん、オーバーロードは引数だけが対象ですから、そのままでは無理ですね。
お、お恥ずかしい...
今顔から火が出る思いです。

class と operator を使う方法。私は思いつきもしませんでした。
いかにも C++ という感じで C++ が好きな私にはカッコよくも感じられます。
オーパーロードですらないことがわかった以上、戻り値の型が違う func を
同一ライブラリの中に同居させるわけにはまいりません。
幸い void func( char* ) は最近作ったもので、これを呼び出しているコードはま
だ1つも書いていません(もちろん本物は func なんていう名前じゃないですし、
「、やっぱこっち」を付け足すなどという馬鹿みたいなものじゃありません)。

ひょっとしたら Justy様のコード、パクッてしまうかもしれないです...


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

Name: YuO  ..初心者(8,706ポイント)   Date: 2007/07/03(火) 00:59   No:9034     
Title: Re:オーバーロードについて    
そもそも,その2つの関数は同一の名前空間にないといけないようなものなのですか?

そうであれば名前付けを間違っているのだと思いますし,
そうでないならば名前空間をきっちり分離してやれば良いだけだと思いますが。


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

Name: Justy  ..ハッカー(132,823ポイント)   Date: 2007/07/03(火) 01:41   No:9037     
Title: Re:オーバーロードについて    
>いかにも C++ という感じで C++ が好きな私にはカッコよくも感じられます
 言語的には面白い課題ですが、実際に使うのはあまりお薦めしないです。
 この operatorは暗黙の変換を促すようなときに使うもので、
今回のようなケースで使うのはちょっとタブー的な領域に足を突っ込んでいますね。

 元の関数の中身を正確に把握していないのでなんとも言えませんが、
多分ちゃんと別の名前を付けた方がいいのかもしれません。


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

Name: ouh  ..ぴよぴよ(751ポイント)   Date: 2007/07/03(火) 02:54   No:9043     
Title: Re:オーバーロードについて    
YuO様、Justy様、返信ありがとうございます。

おっしゃるとおりですね。
本来 std::string のものだけでいいですし、戻り値を受け取るタイプと
渡したものを書き換えてもらうものでは別物だから名前か名前空間を変え
たほうがいいですよね。

もともと純粋に関数にしようとしていたので、char* を返してもらったり
参照を返してもらうというのは考えていませんでした。

私が書く C++ のコードがダメダメなんでしょうけれど、C の文法だけで
書いた関数のほうが C++ のものよりいくらやってもちょっぴり速くて。
それほど速いことが重要なケースで使うわけでもないのになんか気になっ
ちゃって。

それで std::string を扱う関数のほとんどに、いわば C バージョンと
でも言うべきものを追加したかったんです。
直前まで char* で来ているなら C っぽい関数のほうを呼びたい、って
いう感じです。

お二方、間抜けな質問にお付き合いくださってほんとうにありがとうご
ざいます。


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

Name: Justy  ..ハッカー(133,408ポイント)   Date: 2007/07/03(火) 03:18   No:9044     
Title: Re:オーバーロードについて    
>C++ のものよりいくらやってもちょっぴり速くて
 この問題は std::stringを使う限り避けられないとは思いますが、
小手先なので良ければを1点だけ。

 もし、戻ってきた std::stringが変更されないのであれば

std::string str = func( ss );

 ではなく、

const std::string &rstr = func( ss );

 とすると、funcの戻り値である一時変数が拘束されて、rstr変数のスコープまで保持されます。
 これなら無駄なオブジェクト丸ごとstrへ代入が1つなくなって少しだけ高速化されます。


>直前まで char* で来ているなら C っぽい関数のほうを呼びたい、って
いう感じです
 判らなくはないです(w
 でもまぁ、文字列の扱いを統一しておかないとバグの元にもなりますし、
文字列を加工するときは一旦は std::stringにしてしまった方が安全だと思います。
(その後再度 char *に変換するのは有りです)


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

Name: ouh  ..ぴよぴよ(882ポイント)   Date: 2007/07/04(水) 00:11   No:9073     
Title: Re:オーバーロードについて    
丸一日開いてしまいました。Justy様、申し訳ありません。
ありがとうございます。

今日は仕事忙しかったうえに中央線止まってくれちゃいまして。
踏んだり蹴ったりで帰ってきました。

> const std::string &rstr = func( ss );
この方法、私の場合最終的にファイルへの出力になることが多く、
受け取ったあと書き換えないような使い方が多いのでとてもいい
方法かもしれません。
しかも出力するとすれば、

std::ifstream ifs( "file" );
ifs << func( ss ) << ...

という感じになるかと思うので、rstr を作る必要もなくてすごく
よさそうです。


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



Name: りょう  ..かけだし(2,171ポイント)   Date: 2007/07/02(月) 14:27   No:9013       
Title: 構造体    
 このプログラムの誤っている箇所を修正し、説明する。
また、このプログラムを実行させた場合、駄々しく動作しない。
どうような結果になることが予想されるか記述する。

#include<stdlib.h>

typedef struct{
char m_ch;
int m_n;
}MyType;

void main(void)
{
MyType *p=(MyType *)malloc(sizeof(char) + sizeof(int));
if(p){
p->m_ch = 'a';
p->m_n = 100;
free(p);
}
}

ここでの誤りは、
     MyType *p=(MyType *)malloc(sizeof(char) + sizeof(int));
                 ↓
     MyType *p=(MyType *)malloc(sizeof(MyType));
となるのはわかります。
 しかし、説明となるとまとめることができません。
nバイトアライメントやパディングなどをどういう風に使えばいいんでしょうか?




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


Name: なぎ  ..プログラマー(25,977ポイント)   Date: 2007/07/02(月) 16:07   No:9015     
Title: Re:構造体    
まずは、「nバイトアライメント」と「パディング」の定義を書いてみるのが吉かなとも思います。
多分、それからでしょう。



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

Name: toyo  ..かけだし(2,224ポイント)   Date: 2007/07/03(火) 09:37   No:9046     
Title: Re:構造体    
構造体のメンバ変数は同じサイズ(nバイト)に揃えた(アライメント)方が扱いやすいと言うことです。


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

Name: keichan  ..プログラマー(26,968ポイント)   Date: 2007/07/03(火) 15:55   No:9053     
Title: Re:構造体    
#本件とは全く関係ありませんが

アライメント されていないとデータを(正常に)取得できない処理系も存在する。
と聞いたことがあります。


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

Name: なぎ  ..プログラマー(26,033ポイント)   Date: 2007/07/03(火) 23:16   No:9066     
Title: Re:構造体    
> アライメント されていないとデータを(正常に)取得できない処理系も存在する。

古い話ですが、モトローラの MC68000 は、16bit のデータが整数アライメント(偶数番地境界)にないと、バスエラーでこけていました。
これはもう、プロセッサレベルのお話です。


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



Name: ドアラ  ..ぴよぴよ(13ポイント)   Date: 2007/07/03(火) 21:58   No:9063       
Title: 関数の問題で…    
二つの整数xとyに対して、xのy乗(べき乗)を計算する関数を作り、その関数を利用して、入力した値の2乗から5乗までの値を計算し出力するプログラムを作りましょう。xのy乗とはxをy回掛け算することで計算できます。

実行例:  数値を入力>> 2
      2の2乗:4
      2の3乗:8
      2の4乗:16
      2の5乗:32
自分で考えてもわらないので教えてください(*^_^*)








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


Name: 管理人 [URL]  ..伝説のハッカー(380,942ポイント)   Date: 2007/07/03(火) 22:17   No:9065     
Title: Re:関数の問題で…    
まず、どの辺まで理解していますか?
これが課題ならある程度のコードは書いてあるのでしょうか?
それとも全く最初からなのでしょうか?

・自作関数について
・引数と返り値について
・for文でn回掛け合わせる方法について

これだけわかれば完成するはずです。
どの辺でつまっていますか?
main関数ないでscanfかなにかで入力させるところは出来ていますか?


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



Name: あや  ..ぴよぴよ(169ポイント)   Date: 2007/07/02(月) 13:49   No:9011       
Title: ヒープソートについて    
C言語を勉強しはじめて一週間ほどなのですが、
ヒープソートの宿題がでました。
どういう順番でソートしていくのかは色々なサイトを見て理解したのですが、
それを式にするのができなく、2.3日悩んでおります;;
整数{45,3,35,40,18,50,18,1,11,2,15,9,5,30,25}の15こをヒープソートで
並べ替えるというものです。
検索をかけてみると、まだ私の知らない関数?が沢山出てきまして、
使えるのはfor、if、elseくらいなのですが、
長くなっても構わないので、初心者な式で教えていただけないでしょうか・・・。
よろしくお願いします!

Microsoft Visual C++ 2005 Express Editionを使っております。


#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{

int i,j,k,n,w;
int a[15]={ 8, 1, 10, 15, 45, 3, 35, 19, 46, 7, 40, 18, 50, 11, 2 };


for( i = n/2; i >= 1; i--)
{
j = i;
while( 1 )
{
if( 2*j > n ){ break ;}
if( 2*j == n )
{
if ( a[j] < a[2*j] )
{
w = a[j];
a[j] = a[2*j];
a[2*j] = w;
}
break;
}
else
{
if( a[2*j] < a[2*j+1] ) { k = 2*j+1; } else{ k = 2*j; }
if( a[j] > a[k] )
{
w = a[j];
a[j] = a[k];
a[k] =w;
j = k;
}

}
}
}

for( i = 1; i<= n; i++)
{
printf("%d ", a[i]);
}
return ;
}


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


Name: りむ  ..中級者(13,907ポイント)   Date: 2007/07/02(月) 21:55   No:9021     
Title: Re:ヒープソートについて    
>C言語を勉強しはじめて一週間ほどなのですが、
ヒープソートの宿題がでました。

凄く進み方の早い授業ですね。C言語を習い始めて7日ほどでヒープソートとは…。

>検索をかけてみると、まだ私の知らない関数?が沢山出てきまして、
使えるのはfor、if、elseくらいなのですが、

while文はわかりますか?わかるならそれら4つを用いるだけで十分に実現可能です。
ただし、ヒープソートは、字のごとく「ヒープ」という特殊なデータ構造を用いているので、
その概念を理解する必要があります。
配列で実現可能なデータ構造なので、配列さえ覚えればあとは簡単だと思います。
グーグル先生で一度検索をかけてみましょう。

肝心のソースですが、これはどこかのサイトからもってきたものですか?
まず1行目に問題点がいきなりあるので、それを把握しましょう。
#include <stdio.h>というものはとてもよく使われますが知っていますか?
これは入出力の標準関数を実装するためにIncludeするもので、これがないとprintf関数が使えません。

そしてまことに申し訳ないのですが#include "stdafx.h"は良くわかりません。
ただ、これがなくても支障はないはずです。

そしてmain関数ですが、何もしないプログラムの場合、

int main(int argc, char* argv[]){
return 0;
}

となります。授業や本によって書き方や教え方が違うかもしれませんが…。
ここでソースの方の問題点は2つ、_TCHAR*という不明な型を指定しています。
そして、int型のmain関数なので、値を返すように指定されているのにreturn;ではまずいです。
少なくとも、return 0; としましょう。

これ以上は長くなりすぎるのであと1つでやめますが、
nの値ですが…いきなり 
for( i = n/2; i >= 1; i--) 
の部分で、値を代入していないのに割り算をしています。nには、この時点では0ですらも入っていません。
これではまずいので、nに配列の最大数を入れましょう。

まだ基礎がしっかりしていないようなので、Cに関する入門書を一から読み直しましょう。
それからきちんと理解したうえで宿題を終えて出すなら、どんな先生だろうと納得するでしょう。
頑張ってください。


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

Name: バグ  ..熟練のプログラマー(53,327ポイント)   Date: 2007/07/02(月) 22:02   No:9022     
Title: Re:ヒープソートについて    
#include "stdafx.h"

このヘッダーファイルはMFCをサポートするアプリケーションの為のファイルです。MFCを使用しない限り必要ありませんよ(^-^)


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

Name: りむ  ..中級者(13,973ポイント)   Date: 2007/07/02(月) 22:07   No:9023     
Title: Re:ヒープソートについて    
>#include "stdafx.h"

そうなのですね…
コンソールアプリケーション、もしくはWindowsアプリケーションで
いつも作っていたのでこれは見たことなかったです。
ありがとうございます。


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

Name: 管理人 [URL]  ..伝説のハッカー(380,675ポイント)   Date: 2007/07/03(火) 02:40   No:9042     
Title: Re:ヒープソートについて    
スマートなプロジェクトならこちらがいいです。

http://www.play21.jp/board/formz.cgi?action=res&resno=8661&page=&lognum=27&id=dixq&rln=8682#8664



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

Name: あや  ..ぴよぴよ(255ポイント)   Date: 2007/07/03(火) 09:26   No:9045 解決!     
Title: Re:ヒープソートについて    
素早い回答ありがとうございました。
Microsoft Visual C++ 2005 Express Editionの新規作成で
Win32 コンソールアプリケーションで作るように言われていまして、
そこは最初から勝手に入るものですから・・・
ヘッダファイルに、#include <stdio.h>が入ってるんです。
nの値・・・本当にただ箱を作っただけでした・・
ソースは調べたり本を見たり色々自分で組み合わせたものなので、
どこからかコピーしてきたわけではないのですが・・


>>そして、int型のmain関数なので、値を返すように指定されているのにreturn;ではまずいです。
少なくとも、return 0; としましょう。

わかりました!0で返すという意味もわかっていませんでした・・お恥ずかしいです。
勉強しなおしてまた色々考えてみます<(_ _)>管理人様ありがとうございました。


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

Name: 管理人 [URL]  ..伝説のハッカー(380,798ポイント)   Date: 2007/07/03(火) 10:46   No:9047     
Title: Re:ヒープソートについて    
Win32 コンソールアプリケーションで、「空のプロジェクト」にチェックをいれて作成すれば、空の状態から始まりますよ^^
プロジェクトを作るとき、ウィンドウが現れて、名前をつけてOKを押した後、ウィザードが現れて、「次へ」「完了」と進んでいくと思いますけど、次へを押した先のウィンドウに「空のプロジェクト」にチェックをいれる欄があったと思います。
そこにチェックをいれておけば空のプロジェクトになります。
ファイルの追加方法などは上記リンク先の紹介と同じですので、一度やってみてください☆


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

Name: りむ  ..中級者(14,944ポイント)   Date: 2007/07/03(火) 12:30   No:9048     
Title: Re:ヒープソートについて    
そうでした、私も常に空のプロジェクトで作っていたので、
それを指定しない場合は良く知らないのでした;;
その場合、そのインクルードが入るのですね…勉強になります。


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

Name: あや  ..ぴよぴよ(355ポイント)   Date: 2007/07/03(火) 17:15   No:9057 解決!     
Title: Re:ヒープソートについて    
空の状態から作ったことがなかったので、大変勉強になりましたっ
一つ一つクリアしていきたいと思います。
丁寧で管理人様の人柄がわかりますね^^。
初めて書き込みしてみて、勇気がわきました。ありがとうございました(^▽^*)ノ


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



Name: りむ  ..中級者(14,364ポイント)   Date: 2007/07/02(月) 22:36   No:9025       
Title: DXライブラリをDirectXのみに変換    
こんばんは、りむです。お久しぶりです。
あれから一ヶ月間作り続けて、一応遊べる程度のシステムまで作り上げることができました。
ありがとうございます。

それで、4月に教授にそれを見せたところ、
卒論はライブラリを使わずにDirectXの機能のみで作ったゲームを再現して、
あと他に何か追加したものにしよう、ということになりました。

追加するものは、3Dエフェクトの実装、ということに決定しました。
4月からは、まずそちらの勉強をしまして、
現在はDXライブラリの関数をDirectXやAPI、標準関数で置き換える作業を行っています。

今のところ、
LoadDivGraph・DrawGraph等に対応する機能(テクスチャとして読み込み、四角形の平面モデルに貼り付ける形。それに加えて、画像回転や反転、変形拡大縮小なら入れてないものの実装できそうです)
キーボード入力(DirectInputの直接データによるキーボード状態の取得)
GetRand関数(srandとrand関数による仮実装。最終的にメルセンヌ・ツイスタを入れたいなと…)
あたりまで変更できました。

ですが、文字描画関係関数や時間関係の関数、音など、他の様々な関数がまだ置き換えられていません。
ゲームの内容を充実させて3Dエフェクトを入れるためにも、早く置き換えないといけないのですが中々進まなくて…。
もし分かる方がいらっしゃったら、どんなことでも良いのでアドバイスや意見お願いします。


使ってはならない素材を仮使用しているため、実行ファイルを配ることができないことはご了承ください。

こちらの掲示板はC言語に対して何でも、となっていますがさすがにDirectX自体は対応してないだろうという理由で雑談としていますので、
意見等ありましたら気軽にお願いします。


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


Name: 管理人 [URL]  ..伝説のハッカー(380,154ポイント)   Date: 2007/07/02(月) 23:02   No:9026     
Title: Re:DXライブラリをDirectXのみに変換    
DirectXの機能のみをということですが、DXライブラリはDirectX7そのもののようですよ。
DirectX7の機能を利用しているので、DirectX7と併用できるようです。
DirectX7自体は詳しく存じないのですが、時間関係の取得は標準ライブラリで出来ます。

http://www9.plala.or.jp/sgwr-t/lib/lib.html

この辺参考にしてください。
clock()やtime()でミリ秒や現在の時刻の取得が出来ます。


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

Name: Justy  ..ハッカー(132,608ポイント)   Date: 2007/07/03(火) 00:09   No:9030     
Title: Re:DXライブラリをDirectXのみに変換    
DirectX自体は対応してないだろうという理由で雑談としていますので、
 使っている人はたくさんいると思いますから、大丈夫だと思いますよ。

 あ、ちなみに DirectXのバージョンは幾つでしょう。
 DxLibは内部で 7が使用されていますが、今最もよく使われているバージョンは 9で、
この2つでは作り方が全く違います。

 DirectX 7を使われるのであれば、DxLibはソースが公開されているので
文字描画などなどそれを参考にされるといいと思います。
(でも 7で 3Dってのはちょっと・・・なの 9ですよね?)



文字描画関係関数
 大きく分けて二種類あります。
 1つは DirextXの ID3DXFontインターフェースを使って Winodwsにインストール済みの
フォント使って表示する方法と自前のフォントテクスチャを持って、そこから文字を切り出して
並べ表示する方法とあります。

 後者は面倒ですが、配布する際に相手先にフォントが入っていなくても表示できる点と
自分でデザインしたカスタムフォントが使えるという利点があります。



 DirectShowとかを使うといろいろ汎用性が高くていいかと思います。
 

3Dエフェクトの実装
 あれ? 今まで3Dゲームを作られていたんでしたっけ?
 それとも3Dゲームとして作り直すのでしょうか?



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

Name: りむ  ..中級者(14,863ポイント)   Date: 2007/07/03(火) 01:35   No:9035     
Title: Re:DXライブラリをDirectXのみに変換    
言葉が足りなかったようで。。。
DirectX9.0cですね。昔のDirectXはゼミでは手に入れれなかったので…それ専門の研究室じゃないので、本もないですし。
なので、オープンソースのDXライブラリの内部を見てもイマイチ理解できず…;;
そして、併用はまったくしない予定です。してしまうと卒論としてみなされないようで。
将来役に立たせるために、実際に社会で使用できることを学習をしてほしいのだそうです。
…DirectXを将来使うかどうかはわかりませんが…(おそらく建前でしょう)

つまりは、そういったライブラリを使わず自分で書けということです。DirectX云々関係無しに…


>それとも3Dゲームとして作り直すのでしょうか?
はい、半分はそのとおりで。2Dゲームをベースに3D対応と申しますか、ぶっちゃけるとテイルズっぽくしたいわけです(作ったのもそっくりですが)
なのでゲーム自体は2Dのようで、魔法のエフェクトだったり他のエフェクトだったりを3Dで表現といいますか。

>clockやtime
それの存在は調べて見つけたのですが、ミリ秒の取得としての使い方がわからなかったのです。
とりあえず無理やり入れてみたのですが、なんとなく今までと違う形になっていて…

void FpsTimeFanction(){
if(FpsTime_i== 0){
FpsTime[0]=clock(); //1周目の時間取得
}
if(FpsTime_i==59){
FpsTime[1]=clock(); //50周目の時間取得
Fps = ((FpsTime[1] - FpsTime[0]) / 15.0f);//測定した値からfpsを計算
FpsTime_i=0;//カウントを初期化
}else{
FpsTime_i++;//現在何周目かカウント
}
return;
}

こんな感じのソースですね、今は。

DXライブラリ使用のほうのゲームのイメージ画面だけ添付しておきます。


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

Name: 管理人 [URL]  ..伝説のハッカー(380,361ポイント)   Date: 2007/07/03(火) 02:11   No:9038     
Title: Re:DXライブラリをDirectXのみに変換    
詳しいDirectXのお話はJustyさんにお任せするとして・・。
時間関係の関数についてですが、

int GetNowCount( void ) ;
Windowsが起動してから経過時間をミリ秒単位であらわした値を返す。


clock_t clock(void);
プログラム実行開始からの経過時間(プロセッサ時間)をミリ秒で返却します。

ということですから機能は同じではないでしょうか?
FpsTimeがclock_t型であれば問題ないと思います。

画像テイルズっぽいですね^^
背景はRPGツクールの奴ですねw

あと、卒論って、卒業制作の他に論文も書かないといけないのですか?


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

Name: Justy  ..ハッカー(133,255ポイント)   Date: 2007/07/03(火) 02:32   No:9041     
Title: Re:DXライブラリをDirectXのみに変換    
>DirectX9.0cですね
 なるほど、そうですか。
 だとすると、参照用に1、2冊 DirectXを扱った書籍を買っておいた方がいいですね。
 私もそれで一通りのことを覚えました。


 あとは

TWINTAIL LOVERS.
http://luna.sumomo.ne.jp/

 こちらで公開されている描画エンジンは DirectX 9を使っており、
ドキュメント・コメントも日本語で書かれていて、かなり読みやすいので
実装方法など参考になるかと思います。



>実際に社会で使用できることを
 判らなくはないですね。
 でもゲーム会社とかにでも就職しない限りDirectXは・・・(w
 まぁ、応用は利きそうですが。


>ぶっちゃけるとテイルズっぽくしたいわけです
>ゲーム自体は2Dのようで、魔法のエフェクトだったり他のエフェクトだったりを3Dで表現
 なるほど。
 テイルズとかのように内部的な座標系は全部3Dで管理して、2Dっぽいところは
それらしく見せる、ということですね。


>DXライブラリ使用のほうのゲームのイメージ画面だけ添付しておきます
 なんとなく雰囲気はわかりました。
 これが DirectX化されればいろいろ可能性が増えるので、
作る方も遊ぶ方も楽しそうな予感。

 環境と時間が許すならプログラマブル・シェーダにまで手を出すといいかもしれません。
 表現の世界が2倍以上に広がりますよ。
(もちろん手間もそれ相応ですが)


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

Name: りむ  ..中級者(14,306ポイント)   Date: 2007/07/03(火) 12:49   No:9049     
Title: Re:DXライブラリをDirectXのみに変換    
>あと、卒論って、卒業制作の他に論文も書かないといけないのですか?
メインは論文です。それに必ずデモ実演をするということで、プロジェクトを作らないとだめなのです。
そもそも論文を書く為には作り方を知っていないとかけないので…。
なので、大変なんですよ。

ただし、卒論だけに限って言えば、形になってさえ居れば良いのでそこまで作りこむ必要はありません。
個人的にそれが終わったら、つくりこむ予定ですが^^;
とりあえずの目標として、完全動作する形にしておいて、それから3Dの魔法エフェクトを入れれる準備をしておかないと…そろそろ時間がやばめで。

>clock_t clock(void);
プログラム実行開始からの経過時間(プロセッサ時間)をミリ秒で返却します。
…えーっと…そう書いてありました…?
確かミリ秒で返すって部分が見当たらなかったので、clock_t型でいいのか悩んでいたのですが…
それならなんとかなりそうです。

>プログラマブル・シェーダ
そこまでは現時点では厳しいですね^^;
将来、会社に勤めながら、個人で製作販売をする夢があるので、
その完成までにまた勉強してみようと思います。

>参照用に1、2冊 DirectXを扱った書籍を
最初に、DirectXゲームグラフィックスプログラミングVer.2.0というグラフィックのみに関する書籍を
すべて読んで、DirectGraphicsのみですが大体の部分の理解は済ませてあります。
教授も一押しなほど理解しやすい書籍だったようです。

それからHP等を参考に、キーボードのみのDirectInputは導入させています。

ですがそれ以外の書籍がない状態で…何か良い書籍があればいいのですが、
DirectXの書籍は、どれがいいのか判断がつかないものですね。

>背景
RPGツクールXPの素材です。ただ、RTPのものなのでコレも実はまずいようで;;
線画程度ならかけるのですが、CGやドット絵はあまりやったことなくて…。
まだまだ大変です。


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

Name: バグ  ..熟練のプログラマー(53,368ポイント)   Date: 2007/07/03(火) 13:49   No:9050     
Title: Re:DXライブラリをDirectXのみに変換    
横レスすみません…
clock_t型って、実装依存なんでしょうか?とりあえず、VC++では実体はlong型のようですが…


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

Name: Justy  ..ハッカー(133,526ポイント)   Date: 2007/07/03(火) 13:57   No:9051     
Title: Re:DXライブラリをDirectXのみに変換    
 clock_tは時刻を表すことができる算術型としか規定されていませんね。
 さらに言えば負を返すこともできないといけないので、符号付きになります。

 で、clock()が必ずしもミリ秒を返すとは限らないので、time.hに定義された
CLOCKS_PER_SECの値(1秒当たりの数)でミリ秒かどうかは確認する必要があります。
 この値が 1000ならその環境ではミリ秒になります。


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

Name: 管理人 [URL]  ..伝説のハッカー(380,838ポイント)   Date: 2007/07/03(火) 15:23   No:9052     
Title: Re:DXライブラリをDirectXのみに変換    
あぁ、だからCLOCKS_PER_SECという定義がわざわざあったんですか・・。
いつもただ単に1000で割ればいいじゃんと思ってました^^;


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

Name: Justy  ..ハッカー(133,817ポイント)   Date: 2007/07/03(火) 16:57   No:9056     
Title: Re:DXライブラリをDirectXのみに変換    
>それから3Dの魔法エフェクトを入れれる準備をしておかないと…そろそろ時間がやばめで。
 ベースが DxLibからだと、座標系の問題も含めて結構手直しが多そうで大変ですね。
 スクロールの方法すら変わりそうですし。


>最初に、DirectXゲームグラフィックスプログラミングVer.2.0というグラフィックのみに関する書籍を
>すべて読んで、DirectGraphicsのみですが大体の部分の理解は済ませてあります。
 あー、あれはいい本ですね。わかりやすくて。
 私も読みました。


>ですがそれ以外の書籍がない状態で…何か良い書籍があればいいのですが、
>DirectXの書籍は、どれがいいのか判断がつかないものですね。
DirectX逆引き大全500の極意」とかはピンポイントで役立ちますよ。
 サウンド録音再生も触れているので、結構重宝しました。


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




 
[ 1 , ... ]
 
 
管理者画面   RSS   + Powered By 21style +