C言語何でも質問掲示板


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

規約と使い方

 
   マルチスレッドでのデ ....   
     ・[8889] Justy 
     ・[8891] 組木紙織 
     ・[8894] Justy 
     ・[8902] 組木紙織 
   火曜までの宿題ですが   
     ・[8862] box 
     ・[8863] まろん 
     ・[8864] box 
     ・[8901] まろん 
   戻し値がchar   
     ・[8866] バグ 
     ・[8867] さっかん 
     ・[8868] バグ 
     ・[8869] さっかん 
     ・[8870] バグ 
     ・[8871] さっかん 
     ・[8872] バグ 
     ・[8873] さっかん 
     ・[8874] YuO 
     ・[8875] バグ 
     ・[8876] バグ 
     ・[8877] さっかん 
     ・[8878] バグ 
     ・[8879] さっかん 
     ・[8880] バグ 
     ・[8881] さっかん 
     ・[8882] バグ 
     ・[8883] box 
     ・[8885] さっかん 
     ・[8886] さっかん 
     ・[8887] 組木紙織 
     ・[8888] さっかん 
     ・[8890] さっかん 
   charについて   
     ・[8856] box 
     ・[8857] きつね 
     ・[8858] 管理人 
     ・[8859] きつね 
   宿題です(汗)   
     ・[8835] 管理人 
     ・[8838] 羽流布 
     ・[8839] 管理人 
     ・[8841] 羽流布 
     ・[8842] box 
     ・[8843] 羽流布 
     ・[8844] 管理人 
     ・[8845] 管理人 
     ・[8846] 羽流布 
     ・[8852] 管理人 
   お久しぶりです!!   
     ・[8820] 管理人 
     ・[8821] Justy 
     ・[8830] 管理人 
     ・[8831] Justy 
     ・[8840] 管理人 
   コマンド引数で16進   
     ・[8836] 零 
     ・[8837] YuO 
   配列を計算して比較す ....   
     ・[8823] フリオ 
     ・[8824] 雷 
     ・[8825] バグ 
     ・[8826] バグ 
     ・[8827] Justy 
     ・[8829] 雷 
   二分法   
     ・[8807] box 
     ・[8809] go- 
     ・[8810] go- 
     ・[8813] box 
   またまたすみません。 ....   
     ・[8794] box 
     ・[8819] 徹夜 
   皆さんはプログラムど ....   
     ・[8676] 管理人 
     ・[8677] 管理人 
     ・[8679] Justy 
     ・[8681] 組木紙織 
     ・[8683] YuO 
     ・[8688] 雷 
     ・[8691] Justy 
     ・[8692] Justy 
     ・[8760] 組木紙織 
     ・[8761] バグ 
     ・[8762] 雷 
     ・[8763] Justy 
     ・[8767] YuO 
     ・[8768] Justy 
     ・[8800] 雷 
     ・[8805] Justy 
     ・[8818] 雷 
   borland c++のアップダ ....   
     ・[8814] GPGA 
     ・[8815] toyo 
     ・[8816] GPGA 
     ・[8817] オス豚 
   雑談ですが・・・   
     ・[8587] バグ 
     ・[8590] ビギナー 
     ・[8591] YuO 
     ・[8592] ビギナー  
     ・[8596] 管理人 
     ・[8605] ビギナー 
     ・[8612] 管理人 
     ・[8617] ビギナー 
     ・[8618] 管理人 
     ・[8619] フリオ 
     ・[8620] なぎ 
     ・[8623] フリオ 
     ・[8636] ビギナー 
     ・[8690] 雷 
     ・[8766] ビギナー 
     ・[8803] 雷 
     ・[8808] Justy 
   配列の課題   
     ・[8786] DORAGON 
     ・[8787] box 
     ・[8788] 管理人 
     ・[8789] DRAGON 
     ・[8791] フリオ 
     ・[8793] 徹夜 
     ・[8795] 管理人 
   この問題わかる方・・ ....   
     ・[8758] 管理人 
     ・[8759] C言語が苦手な人 
     ・[8765] Justy 
     ・[8769] フリオ 
     ・[8770] C言語が苦手な人 
     ・[8772] フリオ 
     ・[8780] Justy 
     ・[8790] フリオ 
   外部変数   
     ・[8784] asd 
   課題;;   
     ・[8771] バグ 
     ・[8774] sumomo 
     ・[8776] バグ 
     ・[8777] sumomo 
     ・[8778] バグ 
     ・[8781] sumomo 
     ・[8782] バグ 
   2次元文字配列変数への ....   
     ・[8775] バグ 
     ・[8779] box 
   while文について   
     ・[8722] 管理人 
     ・[8746] りぃ 
     ・[8751] 管理人 
     ・[8756] りぃ 
   c以外の言語の経験   
     ・[8707] Hermit 
     ・[8709] バグ 
     ・[8710] 組木紙織 
     ・[8732] YuO 
     ・[8745] なぎ 
     ・[8748] 組木紙織 
     ・[8750] なぎ 
     ・[8753] YuO 
     ・[8755] 組木紙織 
   プログラミングがわか ....   
     ・[8639] asd 
     ・[8640] toyo 
     ・[8747] 部長 
     ・[8749] なぎ 
     ・[8752] 部長 
     ・[8754] toyo 
   無題   
     ・[8703] サイト 
     ・[8704] ジミさん 
     ・[8708] Justy 
     ・[8711] ジミさん 
     ・[8713] サイト 
     ・[8714] ジミさん 
     ・[8716] サイト 
     ・[8718] ジミさん 
     ・[8721] サイト 
     ・[8725] ジミさん 
     ・[8744] ジミさん 
   文字のサイズ変更等に ....   
     ・[8727] 管理人 
     ・[8728] 管理人 
     ・[8743] きつね 
   関数を用いるプログラ ....   
     ・[8730] 管理人 
     ・[8731] バグ 
     ・[8737] ぁぃ 
     ・[8738] ぁぃ 
     ・[8739] box 
     ・[8741] バグ 
     ・[8742] 管理人 
   C++でWindowsAPIを使い ....   
     ・[8581] YuO 
     ・[8582] asd 
     ・[8598] ひろ 
     ・[8600] バグ 
     ・[8601] asd 
     ・[8733] ひろ 
     ・[8734] ひろ 
     ・[8735] ひろ 
     ・[8736] ひろ 
     ・[8740] YuO 
     ・[85801183429688] ひろ 
   無題   
     ・[8689] 雷 
     ・[8701] ジミさん 
     ・[8723] 管理人 
     ・[8724] ジミさん 
   バックトラックプログ ....   
     ・[8622] Hermit 
     ・[8624] ☆ 
     ・[8625] ☆ 
     ・[8626] しっぽ 
     ・[8635] ☆ 
     ・[8662] しっぽ 
     ・[8720] ☆ 
   インストラーパッケー ....   
     ・[8715] サイト 
     ・[8717] ジミさん 
   ソートのフローチャー ....   
     ・[8656] 管理人 
     ・[8678] ビスタ 
     ・[8712] 管理人 
   BCCで作ったプログラム ....   
     ・[8593] YuO 
     ・[8628] EL-ZELK 
     ・[8671] 管理人 
     ・[8672] 管理人 
     ・[8705] EL-ZELK 
   キーボード入力につい ....   
     ・[8651] サイト 
     ・[8663] しっぽ 
     ・[8666] サイト 
     ・[8680] しっぽ 
     ・[8685] サイト 
     ・[8686] Justy 
     ・[8693] サイト 
     ・[8694] Justy 
     ・[8695] サイト 
     ・[8698] Justy 
     ・[8699] サイト 
   課題なんですけど・・   
     ・[8696] tete 
     ・[8697] tete 
   コンパイラについて   
     ・[8664] 管理人 
     ・[8665] しっぽ 
     ・[8667] Justy 
     ・[8670] 管理人 
     ・[8682] プロジェクト 
     ・[86611184595977] プロジェクト 
   ポインタの扱い方・・ ....   
     ・[8606] 管理人 
     ・[8610] 管理人 
     ・[8614] box 
     ・[8668] 雷 
     ・[8674] 管理人 
     ・[8675] 雷 
   Visual C++を家でやり ....   
     ・[8631] なぎ 
     ・[8632] バグ 
     ・[8634] バグ 
     ・[8638] なぎ 
     ・[8669] オス豚 
   構造体について   
     ・[8659] Hermit 
     ・[8660] バグ 
   課題のソースについて   
     ・[8654] バグ 
     ・[8655] keichan 
     ・[8657] Hermit 
   課題です   
     ・[8602] keichan 
     ・[8603] asd 
     ・[8648] りょう 
     ・[8650] りょう 
     ・[8652] asd 
   バブル、クイックソー ....   
     ・[8637] バグ 
     ・[8646] ビスタ 

Name: 組木紙織  ..上級者(15,334ポイント)   Date: 2007/06/24(日) 18:42   No:8884       
Title: マルチスレッドでのデータの受け渡し    
現在windows でマルチスレッドの勉強をしています。

HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes, // セキュリティ記述子
DWORD dwStackSize, // 初期のスタックサイズ
LPTHREAD_START_ROUTINE lpStartAddress, // スレッドの機能
LPVOID lpParameter, // スレッドの引数
DWORD dwCreationFlags, // 作成オプション
LPDWORD lpThreadId // スレッド識別子
);

で、スレッドにデータを渡すときにはlpParameterにスレッドに渡すデータへのポインタを渡すようになっています。
親スレッドから子スレッドをCreateThread()関数でつくり、親スレッドを破棄すると、データを静的に確保しておくと、
親スレッドを破棄したときに渡したデータが、途中で変更される可能性があると思います。
(これは正しくない表現ですが。)

親スレッドでデータを動的に確保して、データを渡すようにすると、今度は子スレッドで
渡されたデータを破棄する必要があるので、

スマートポインタのようなスレッドを関係を扱うラッパクラスを作りたいと思っているのですが、
なかなか出来ないです。(というよりどう作っていいのかが分からないです。)


このラッパクラスでしたいことは、
1,コンストラクタでスレッドを生成(スレッドに渡したいデータを引数にする)
2,デストラクタで破棄。
3,途中でスレッドの停止、再開をするメンバ関数を用意する。

と考えています。
現時点で問題なのは
上にも挙げたようにスレッドにデータを渡すときと、
スレッドの破棄をTerminateThread()使わずに(この関数は色々問題があるようなので)
することです。

かなり難しい問題なので、ヒントのようなものはいただけないでしょうか? 


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


Name: Justy  ..ハッカー(127,524ポイント)   Date: 2007/06/24(日) 21:12   No:8889     
Title: Re:マルチスレッドでのデータの受け渡し    
 いろいろとよくわからないので、勘違いな質問があるかもしれませんが。


データを静的に確保しておくと、 親スレッドを破棄したときに
渡したデータが、途中で変更される可能性があると思います
 静的なデータなのに親スレッドを破棄時に変更される可能性がある、というのはどうケースでしょうか?
 メインスレッドが終了するときに静的なクラスのデータにおいてデストラクタが実行されて、
データが変わってしまう、という意味でしょうか?


2,デストラクタで破棄
 何を破棄しますか? データですか? スレッドですか?
 多分スレッドのことだとは思いますが、一応念のため。


スマートポインタのようなスレッドを関係
 えーと、コンストラクタとデストラクタでスレッドの生成・破棄ができるスレッドクラスを
作るのはわかりますが、そこに「スマートポインタのような」表現がつくのは
スレッドの引数として渡したデータを管理するスマートポインタのような機能も欲しい、と
いう意味でしょうか?


現時点で問題なのは 上にも挙げたようにスレッドにデータを渡す
 んーと、それぞれがデータを共有する必要がなければ渡されたデータをコピーして使えば
各スレッドでそれぞれを破棄すればよくなります。

 それができない状況なら、その親と子のスレッドとは別のもっと生存期間の長い例えばメインスレッドなどで
保持しておきます。

 あ、でもクラスをインスタンス化することで子スレッドの生成し、インスタンスの破棄でスレッドが終了するなら
子のスレッドは親のスレッドより長く生きることはないので、そのまま生のポインタを渡しても問題はないですね。


スレッドの破棄をTerminateThread()使わずにすることです
 ちゃんとスレッドの終了がシグナル状態になるのを待ってからなら問題はないですよね?
 まぁ、それでも CloseHandleの方がいいとは思いますが。


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

Name: 組木紙織  ..上級者(16,395ポイント)   Date: 2007/06/24(日) 22:15   No:8891     
Title: Re:マルチスレッドでのデータの受け渡し    
>静的なデータなのに親スレッドを破棄時に変更される可能性がある、というのはどうケースでしょうか?

親スレッドではなく、親スレッドの子スレッド生成関数内で静的に確保したデータという意味でした。
</pre>
void Factory()
{
CreateThread();
return 0;
}
/*子スレッド関数*/
DWORD WINAPI ThreadFunc(LPVOID Param)
{

/*データの引渡し*/

/*色々する*/

}
</pre>

上記のようなコードを考えた場合、Factory関数で子スレッドを生成したときに、Factory関数が
終了する前に、子スレッドでデータを引き渡せればよいのですが、確実に子スレッドにFactory関数で
静的に確保しているデータが引き渡せる保証が無いので、データを正しく引き渡せる保証がしたいということです。

>2,デストラクタで破棄
スレッドですね。
データは動的に確保していなければ関係ないので。

>>現時点で問題なのは 上にも挙げたようにスレッドにデータを渡す
> んーと、それぞれがデータを共有する必要がなければ渡されたデータをコピーして使えば

どうやってデータをコピーすればよいのか?というところで困っています。

>>スレッドの破棄をTerminateThread()使わずにすることです
> ちゃんとスレッドの終了がシグナル状態になるのを待ってからなら問題はないですよね?
そうなのですか?
というより、ミューテックスとセマフォにしかシグナル状態が無いと思っていました。
msdnには
/***********
指定したスレッドが独自のスレッドがクリティカルセクションを持っている場合、そのクリティカルセクションは解放されません。

•終了の時点でスレッドが特定の kernel32 呼び出しを実行している場合、そのスレッドが所属しているプロセスの kernel32 の状態が整合性のない状態に陥る可能性があります。

•指定したスレッドが共有 DLL のグローバル状態を操作している場合、その DLL の状態が破棄され、その DLL を使うほかのスレッドに影響を及ぼす可能性があります。
**********/
と書いており、2番目3番目がまったく意味が分からないので、TerminateThread関数は
今まで使わないようにしていました。


//マルチスレッドプログラム関係の参考書もって無いから、手元においてた方がいいのかな。
//時間かけても全然進まない。。。


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

Name: Justy  ..ハッカー(129,094ポイント)   Date: 2007/06/24(日) 23:06   No:8894     
Title: Re:マルチスレッドでのデータの受け渡し    
親スレッドではなく、親スレッドの子スレッド生成関数内で静的に確保したデータという意味でした
 なるほど、ローカル変数で作った、というようなケースですね。
 でしたら伝わるまで待てばいいんです。



#include <windows.h>
#include <stdio.h>
#include <assert.h>

struct thread_proxy_data
{
thread_proxy_data(LPTHREAD_START_ROUTINE func_, void *arg_)
: func(func_), arg(arg_), is_start() {}
LPTHREAD_START_ROUTINE func;
void * arg;
bool is_start;
};


DWORD WINAPI thread_proxy(LPVOID args)
{
thread_proxy_data *tp = reinterpret_cast<thread_proxy_data *>(args);
tp->is_start = true;
tp->func(tp->arg);
return 0;
}

class Thread
{
public:

Thread(LPTHREAD_START_ROUTINE start, void *arg)
: m_Handle(), m_Param(start, arg), m_Jointable(true)
{
m_Handle = CreateThread(NULL, 0,
(LPTHREAD_START_ROUTINE)&thread_proxy, &m_Param, 0, &m_ThreadID);
assert(m_Handle);
while(!m_Param.is_start)
;
}

void join()
{
if(m_Jointable)
{
DWORD result = WaitForSingleObject(m_Handle, INFINITE);
assert(result == WAIT_OBJECT_0);
result = CloseHandle(m_Handle);
assert(result);
m_Jointable = false;
}
}

~Thread()
{
if(m_Jointable)
{
BOOL ret = CloseHandle(m_Handle);
assert(ret);
}
}

private:
thread_proxy_data m_Param;
HANDLE m_Handle;
DWORD m_ThreadID;
bool m_Jointable;
};

DWORD WINAPI testA(LPVOID arg)
{
int nmax = *reinterpret_cast<int*>(arg);
for(int n = 1; n<=nmax; ++n)
printf("A : %d\n", n);
return 0;
}
DWORD WINAPI testB(LPVOID arg)
{
int nmax = *reinterpret_cast<int*>(arg);
for(int n = 1; n<=nmax; ++n)
printf("B : %d\n", n);
return 0;
}

int main(void)
{
int argA = 5000, argB = 3000;
{
Thread threadA(&testA, &argA);
Thread threadB(&testB, &argB);
threadB.join(); // Bの終了を待って、
} // そのまま Aを強制的に終了させる
return 0;
}

 
 例えばこのように汎用スレッド関数 thread_proxyを介在させることで Threadクラスのコンストラクタは
指定したスレッドが呼び出されるまで戻ってきません。
(厳密にはこのままではマズいタイミングもあるので、is_startの処理に関してはもう一工夫必要ですが)

 この延長線上で考えていけば、データをコピーするタイミングも確保できるかと思います。
 あとは、今はデストラクタはそのまま対象のスレッドを終わらせてしまっていますが、
joinを強制的に実行するようにしておけば、スレッド終了するまでデストラクタが終わらなくすることも
できます。


>>2,デストラクタで破棄
スレッドですね。
データは動的に確保していなければ関係ないので。
 なるほど。わかりました。


ミューテックスとセマフォにしかシグナル状態が無いと思っていました

WaitForSingleObject
http://msdn.microsoft.com/library/ja/jpdllpro/html/_win32_waitforsingleobject.asp?frame=true
 ここにも対象のオブジェクトにはスレッドが含まれていまして、WaitForSingleObjectで
その他のオブジェクトと同様にシグナル状態をチェックできます。



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

Name: 組木紙織  ..上級者(16,459ポイント)   Date: 2007/06/25(月) 07:35   No:8902     
Title: Re:マルチスレッドでのデータの受け渡し    
ヒントとなるサンプルコードありがとうございます。

ざっと見ただけではちょっと良くわかりませんが、じっくり見て、自分が欲しいものに
なるように、少し手を加えようと思います。


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



Name: まろん  ..ぴよぴよ(82ポイント)   Date: 2007/06/23(土) 23:58   No:8861       
Title: 火曜までの宿題ですが    
どうしたら良いかわからず、焦っています。
構造体等を使うのですがどうしたら良いでしょうか。
ちなみに構造体等初めてです

10リットル、8リットル、3リットルの容器があり、10リットルの容器に水がいっぱい入っている。この3つの容器を用い、3リットルの容器に1リットルの水を取り出す最小の手順を答えよ。ただし、水を移す時は、移す側が空になるか、移す側がいっぱいになってときとする。

幅優先探索と言うのを用いるそうです。

急ですがよろしくお願いします


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


Name: box  ..比類無きプログラマー(72,277ポイント)   Date: 2007/06/24(日) 00:32   No:8862     
Title: Re:火曜までの宿題ですが    
幅優先探索の考え方は理解していますか?
また、このアルゴリズムと相性のいいデータ構造は
キュー(FIFO:First In First Out)です。
キューについてはどのくらいご存じですか?


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

Name: まろん  ..ぴよぴよ(117ポイント)   Date: 2007/06/24(日) 00:42   No:8863     
Title: 早速、返答ありがとうございます    
概念が、少しわかる程度で、ほとんど理解していません。
キューはどういう構造なのかがわかる程度です


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

Name: box  ..比類無きプログラマー(72,955ポイント)   Date: 2007/06/24(日) 08:26   No:8864     
Title: Re:早速、返答ありがとうございます    
Xリットルの容器に水がYリットル入っている状態をX(Y)と表わすことにします。
すると、この問題の初期状態は「10(10),8(0),3(0)」と表わせます。
また、終了状態は、とにかく3リットルの容器に1リットル入っていればよいので、
「10(1),8(8),(3(1)」〜「10(8),8(1),3(1)」の8通りあります。

キューは、先の回答で書きましたとおり、「先入れ先出し」方式の構造を持っています。
ある程度大きめの要素を持つ(構造体の)配列で実現することができます。
このとき、ある時点で配列のどこからどこまでを有効な要素として使っているかを管理する必要があります。

幅優先探索の考え方の概要は、以下のとおりです。
 ・初期状態(ゼロ手目)をキューに格納する。
 ・キューからn手目の状態を1つ取り出す。
 ・取り出した状態からたどれる状態(n+1手目)をすべて求める。
 ・求めた状態が終了状態のいずれかに属していれば、初期状態から終了状態までの手順を表示(※)して、終了する。
 ・求めた状態が終了状態に属していなければ、キューに格納する。
 ・終了状態に至らないまま、新しい状態をキューに格納することができなければ、「答えが見つからなかった」として、終了する。
 ・無限ループに陥ることを防ぐため、前に登場した状態が再登場しないようにする。

つまり、初期状態から始めて、
 ・1手目に現われる状態をすべてキューで管理する。
 ・1手目の状態からたどれるすべての状態を2手目としてキューで管理する。
 ・2手目の状態からたどれるすべての状態を3手目としてキューで管理する。
ということを繰り返します。こういう風にすれば、終了状態が見つかったときの
手数が最小であることが保証できます。

また、上の(※)のところで書いた手順表示は、問題文に「最小の手順を答えよ」と
ありましたので、必須だと思います。
手順を表示するためには、キューを表わす構造体のメンバーに「直前の状態」というものを
加えておく必要があります。

このあたりまではよろしいですか?


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

Name: まろん  ..ぴよぴよ(89ポイント)   Date: 2007/06/25(月) 06:12   No:8901     
Title: PCの調子が悪くて    
返信、遅くなりました。
上記の解説で何をしたら良いか、イメージはつきました。


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



Name: さっかん  ..ぴよぴよ(4ポイント)   Date: 2007/06/24(日) 09:23   No:8865       
Title: 戻し値がchar    
C言語を学んでまだ2ヶ月なので色々と知識に乏しいのですが、よろしくお願いします。

#include<stdio.h>
char change(int number);
int main()
{
int x;
char y[10][10];
x=56;
y=change(x);
return 0;
}
char change(int number)
{
char result[10][10];
sprintf(result[1],"%d",number);
return result;
}

xにintの56を入れたらyに文字列の56を返す関数を使ったプログラムにしたいのですが、コンパイルするとエラーが出てしまいます。何処が悪いのでしょうか?


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


Name: バグ  ..熟練のプログラマー(50,110ポイント)   Date: 2007/06/24(日) 10:05   No:8866     
Title: Re:戻し値がchar    
戻り値の型がchar型なのに、実際にはchar型のポインタを返しているからだと思います。

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

Name: さっかん  ..ぴよぴよ(92ポイント)   Date: 2007/06/24(日) 10:18   No:8867     
Title: Re:戻し値がchar    
バグさん返信有難う御座います。しかし本当にすいませんが、ポインタとやらがよくわかりません;;大変お手数ですが、少々変えてもらってもかまわないので、実際に何処を直せばいいか書いてもらえませんか?それを見てポインタを理解したいと思います。できればでいいので、よろしくお願いします。

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

Name: バグ  ..熟練のプログラマー(50,140ポイント)   Date: 2007/06/24(日) 10:51   No:8868     
Title: Re:戻し値がchar    
ポインタを理解しないままに、サンプルを見てもよく分からないと思いますので、順を追って説明しますね。
まず、文字と文字列の違いは理解できていますか?


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

Name: さっかん  ..ぴよぴよ(159ポイント)   Date: 2007/06/24(日) 11:12   No:8869     
Title: Re:戻し値がchar    
とてもありがたいです!よろしくお願いします。文字列は自信がないんですが、文字は'abc'とかを扱う型でprintfで出力する時に%cを使って、文字列は後ろに[]をつけて複数保存できるようにした型で%sを使うんですよね?


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

Name: バグ  ..熟練のプログラマー(50,272ポイント)   Date: 2007/06/24(日) 13:28   No:8870     
Title: Re:戻し値がchar    
基本的に文字とは、あくまで1文字('A'←こんなのです)を指し、2文字以上("ABCDE"←こんなのです)になると文字列になります。

ちなみに、'abc'という記述をするとエラーになります。'(シングルクォーテーション)で括ってよいのは文字だけです。複数の文字…文字列を記述したい場合は、"(ダブルクォーテーション)で括ってやりましょう。

通常、文字列を扱う場合、char型の配列を利用するのですが、char型に限らず、配列については御存じでしょうか?


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

Name: さっかん  ..ぴよぴよ(201ポイント)   Date: 2007/06/24(日) 13:41   No:8871     
Title: Re:戻し値がchar    
そうでした!文字列の場合はダブルクォーテーションでしたね;文字については少しあやふやなところがあったんですが、配列自体は大丈夫だと思います。

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

Name: バグ  ..熟練のプログラマー(50,297ポイント)   Date: 2007/06/24(日) 14:10   No:8872     
Title: Re:戻し値がchar    
それでは、1つ問題です。

char str[6] = {"ABCDE"};

上記のように初期化した場合、a[0],a[1],a[2],a[3],a[4],a[5]のそれぞれに格納されている値は何でしょうか?


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

Name: さっかん  ..ぴよぴよ(234ポイント)   Date: 2007/06/24(日) 14:15   No:8873     
Title: Re:戻し値がchar    
a[0]=A,a[1]=B,a[2]=C,a[3]=D,a[4]=E,a[5]=なし
ですよね??


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

Name: YuO  ..初心者(7,948ポイント)   Date: 2007/06/24(日) 14:54   No:8874     
Title: Re:戻し値がchar    
>>>> ちなみに、'abc'という記述をするとエラーになります。'(シングルクォーテーション)で括ってよいのは文字だけです。

とりあえず,'abc'は「実装依存の振る舞い」なので,エラーになるとは限りません。


> a[0]=A,a[1]=B,a[2]=C,a[3]=D,a[4]=E,a[5]=なし

値を示す場合はソースの表記にあわせる方がよいです。
1と書かれたら,数値の1か数字の'1'か区別がつきません。

「なし」という値はあり得ません (空ポインタはあるが,これは値がなしであるわけではない)。
a[0] : 'A'
a[1] : 'B'
a[2] : 'C'
a[3] : 'D'
a[4] : 'E'
までは正解です。あとは,a[5]の値が何になっているか,です。


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

Name: バグ  ..熟練のプログラマー(50,510ポイント)   Date: 2007/06/24(日) 14:58   No:8875     
Title: Re:戻し値がchar    
a[5]は'\0'が入りますが、ほかはOKです。
こちらが想定していたよりも、分かっているようですね(^-^)
それでは…


void main(void)
{
char a[6];
sprintf(a, "%s", "ABCDE");
}


こうした場合と…


void Dainyu(char* str)
{
sprintf(str, "%s", "ABCDE");
}

void main(void)
{
char a[6];
Dainyu(a);
}


こうした場合、両方ともa[]の中は同じ物になります。
理由は分かりますか?


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

Name: バグ  ..熟練のプログラマー(50,552ポイント)   Date: 2007/06/24(日) 15:01   No:8876     
Title: Re:戻し値がchar    
おおっと、YuOさんの言われるとおり

a[0]=A

こういう記述はまずかったですね…失礼しました(^_^;)


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

Name: さっかん  ..ぴよぴよ(241ポイント)   Date: 2007/06/24(日) 15:19   No:8877     
Title: Re:戻し値がchar    
YuOさんもご教授有難う御座います。確かに’’が必要ですね。
えと、問題の方は上の方がそのままmain内で実行されていて、下の方はDainyuという関数を自分で作って、それをmainで使用しているから結局は結果が同じになるんですよね?


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

Name: バグ  ..熟練のプログラマー(50,772ポイント)   Date: 2007/06/24(日) 15:30   No:8878     
Title: Re:戻し値がchar    
いや、たしかにそうなのですが…
main関数の中のa[]が、何故Dainyu関数の中で書き替えられたか?の理由です。
void Test(int c)
{
int d = 1234;
c = d;
}

void main(void)
{
int a = 0;
Test(a);
}

こんなプログラムを実行しても、aの中身は0のままで変わりませんよね?この理由も分かりますか?


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

Name: さっかん  ..ぴよぴよ(283ポイント)   Date: 2007/06/24(日) 15:48   No:8879     
Title: Re:戻し値がchar    
え〜と、Test(a);だけだったら戻し値が入る場所が指定されてないからですか?
となると、先ほどのプログラムでa[]が書き換えられた理由が分かりません;;


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

Name: バグ  ..熟練のプログラマー(51,384ポイント)   Date: 2007/06/24(日) 17:06   No:8880     
Title: Re:戻し値がchar    
>>え〜と、Test(a);だけだったら戻し値が入る場所が指定されてないからですか?

そうですね、そういう考え方も正しいですが、今はポインタの勉強をしているので、戻り値の事は、今だけはとりあえず忘れてください(^-^)


>>となると、先ほどのプログラムでa[]が書き換えられた理由が分かりません;;

という事で、ここからがようやく本題です。

『何故、値を書き換えられたのか?』ですが、これは変数の中身ではなく、変数が収められている場所(アドレス)を渡しているからなんです。



ちょっと、脱線しますが、たとえ話です。

1冊の本を思い浮かべてください…。あなたの読みたい場所を探すにはどうしますか?

おそらく目次を見るのではないかと思います。それでは、目次には何が書かれているでしょうか?

そう、ページ数ですね。アドレスというのは、ここでいうページ数だと思って下さい。

そして、ポインタというのは、そのページ数を指し示す『しおり』のようなものだと思って下さい。




文字列が書き換わった理由は、文字列の収められた場所を関数の引数として渡してやり、そのページを書き換えたので、内容が書き換わった訳です。

そして、1つ前の書き込みで、値が書き換わらなかったのは、本の中身をコピーして、コピーした紙を書き換えていたから、本そのものの内容は変わらなかったという訳なんです。

サンプルです

#include <stdio.h>

void Change(int nNumber, char szBuf[10][10]);

int main()
{
int x;
char y[10][10];

x = 56;

// 第2引数のyはy[10][10]の先頭のアドレスを示します
Change(x, y);

// Change関数の中身で書き換えられたのはy[1][]の中身なので、y[1]を表示する
printf("%s\n", y[1]);

return 0;
}

void Change(int nNumber, char szBuf[10][10])
{
sprintf(szBuf[1], "%d", nNumber);
}


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

Name: さっかん  ..ぴよぴよ(669ポイント)   Date: 2007/06/24(日) 18:10   No:8881     
Title: Re:戻し値がchar    
#include<stdio.h>
char change(int number,char buf[1][10]);
int main()
{
int x;
char y[1][10];
x=56;
change(x,y);
printf("%s\n%s\n",y[0],y[1]);
return 0;
}
char change(int number,char buf[1][10])
{
sprintf(buf[0],"%d",number);
sprintf(buf[1],"%d",number-11);
}

今このように作り変えてみたら

56
45

とちゃんと表示されました!階乗を計算するpow(x, y)と同じような使い方なんですね。
でも授業では
y【returnの返し値を入れる】=change(x【実因数】);
と習っていて、今までこのように使っていたのですが、何故返し値が文字列になったとたん
change(x,y);
という書き方にしなければならないのですか??
言ってしまえばy=pow(x);でもいいような気になってしまうのですが・・・。


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

Name: バグ  ..熟練のプログラマー(51,549ポイント)   Date: 2007/06/24(日) 18:20   No:8882     
Title: Re:戻し値がchar    
それは、変数には寿命が存在するからです。

基本的にスコープ(環境によって例外はありますが、{ }で括られている範囲)内で用意された変数は、そのスコープ内でのみ有効となり、スコープの外に出た時点で破棄されてしまう物だと思って下さい。

一番最初にさっかんさんが書かれたプログラムですと、change関数内で用意された配列のアドレスを戻り値としていましたよね?

これをしてしまうと、change関数を出た時点で、アドレスを受け取ったものの、実体が存在しないという事になってしまい、危険なんですね。


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

Name: box  ..比類無きプログラマー(72,969ポイント)   Date: 2007/06/24(日) 18:36   No:8883     
Title: Re:戻し値がchar    
うまくいったのは偶然の産物であるようです。
というのは、

> char y[1][10];

この定義だと

> printf("%s\n%s\n",y[0],y[1]);

y[1]は定義範囲外だからです。buf[]についても同じことが言えます。


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

Name: さっかん  ..ぴよぴよ(721ポイント)   Date: 2007/06/24(日) 18:48   No:8885     
Title: Re:戻し値がchar    
では、戻り値がintの時もy=change(x);やreturnなどを使わずにchange(x,y);を使ったほうが無難なのですか?

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

Name: さっかん  ..ぴよぴよ(744ポイント)   Date: 2007/06/24(日) 18:51   No:8886     
Title: Re:戻し値がchar    
え!;;え〜と定義範囲外とはどういうことですか?

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

Name: 組木紙織  ..上級者(15,468ポイント)   Date: 2007/06/24(日) 19:37   No:8887     
Title: Re:戻し値がchar    
>定義範囲外とはどういうことですか?

簡単に言うと"配列の外側"です。

char ch[3];
と配列を確保すると、
ch[0]からch[2]までの3つのcharの領域として定義されます。

このときch[100]の位置は、定義された配列の範囲の外側であるということです。





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

Name: さっかん  ..ぴよぴよ(783ポイント)   Date: 2007/06/24(日) 20:12   No:8888     
Title: Re:戻し値がchar    
そうだったんですか!y[2][10]とbuf[2][10]にすればよかったんですね。
ご教授有難う御座います。


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

Name: さっかん  ..ぴよぴよ(997ポイント)   Date: 2007/06/24(日) 21:27   No:8890 解決!     
Title: Re:戻し値がchar    
バグさんを初め、YuOさん、BOXさん、組木紙織さん本当に有難う御座いました。
あと一つ疑問があるのですが、スレ違いなので改めて投稿させていただきます。
初めに書いた通り、今年大学生になって初めてプログラミングの世界に触れた初心者なので、本当に基本的なことすら分かりませんが、よろしければまたご教授の程よろしくお願いします!


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



Name: きつね  ..ぴよぴよ(429ポイント)   Date: 2007/06/23(土) 17:41   No:8855       
Title: charについて    
char X[10];
strcpy(X,"abc");

こうやった時に
後から"X"に何文字登録されてるか知りたいのですが
どうすればいいのでしょうか?


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


Name: box  ..比類無きプログラマー(72,200ポイント)   Date: 2007/06/23(土) 17:58   No:8856     
Title: Re:charについて    
標準関数のstrlenを使うとよいでしょう。

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

Name: きつね  ..ぴよぴよ(444ポイント)   Date: 2007/06/23(土) 18:36   No:8857 解決!     
Title: Re:charについて    
返答ありがとうございます
おかげでうまくいきました!


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

Name: 管理人 [URL]  ..伝説のハッカー(377,184ポイント)   Date: 2007/06/23(土) 18:40   No:8858     
Title: Re:charについて    
C言語逆引き辞典が便利ですよ。
http://always-pg.com/c/runtime_rd/

一応サンプルはこちらです。

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

int main(){

int n;
char X[10];

strcpy(X,"abc");

n=strlen(X);

printf("Xには%d文字入っています。\n",n);

return 0;
}

実行結果

Xには3文字入っています。

 


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

Name: きつね  ..ぴよぴよ(486ポイント)   Date: 2007/06/23(土) 19:14   No:8859     
Title: Re:charについて    
おお、C言語逆引き辞典ですか
色々乗ってて便利ですね!
参考にさせていただきます


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



Name: 羽流布 [URL]  ..初心者(6,585ポイント)   Date: 2007/06/22(金) 18:40   No:8834       
Title: 宿題です(汗)    
補講で期限が明日になってしまいまして、焦ってます○TZ

内容は、ポインタを使ったプログラムに書き換えるというものなのですが、うまくいきません……。
下記のプログラムになります。

// 左1文字シフト関数
void slshift(char str[]) {
char t;
int len, i;

t = str[0];
len = strlen(str);
for (i = 0; i < len - 1; i++) {
str[i] = str[i + 1];
}
str[i] = t;
}

// 右1文字シフト関数
void srshift(char str[]) {
char t;
int len, i;

len = strlen(str);
t = str[len - 1];
for (i = len - 1; i > 0; i--) {
str[i] = str[i - 1];
}
str[0] = t;
}

// 文字列のn文字シフト関数
void strshift(char str[], int n) {
int an, j, len;

if (n < 0) {
an = -n;
}
else {
an = n;
}
len = strlen(str);
if (len != 0) {
an %= len;
}
for (j = 0; j < an; j++) {
if (n < 0) {
slshift(str);
}
else {
srshift(str);
}
}
}

もう一つの課題は、
整数配列xとxの先頭から格納されているデータの個数nを受け取り,xの平均値と標準偏差を計算してavrとstdに返す関数を作れ.関数内では配列要素を全てポインタで表現せよ.
void stats(int *x, int n, double *avr, double *std);

ネットでポインタについて調べてみましたが、どうも上手くいきません……
今の状況は、こんな感じです

void slshift(char *str) {
char *t;

t = str;

while (*str++ != '\0') {
str = str + 1;
}
str = t;
}

解答まではいかなくていいですので、助言をお願いしますm(_ _)m


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


Name: 管理人 [URL]  ..伝説のハッカー(376,971ポイント)   Date: 2007/06/22(金) 19:15   No:8835     
Title: Re:宿題です(汗)    
左に一文字シフトするのはこういう感じでしょうか。


#include <stdio.h>

void slshift(char *str) {
char t;
t = *str;
while(*(str+1) != '\0'){
*str = *(str+1);
str++;
}
*str=t;
}


int main(){
char str[6]="abcde";
slshift(str);
printf("%s",str);
return 0;
}

実行結果
bcdea
 
 
上記プログラムではあまり1行に沢山処理を書かないでわけて書きました。
まず、先頭にある文字は消されてしまうので、とっておかないといけないのはおわかりのようですね。
1文字保存しておくにはまず文字型で1文字分変数を用意します。
char t;
これです。
で、先頭のアドレスの中身を参照するには*をつけるので、先頭の1文字目は
t = *str;
これでコピーできますね。
後は1文字先の文字を現在の文字にコピーしていきます。
while(*(str+1) != '\0'){
1文字先の文字が終端記号ならコピーしませんから、このように書きます。
*str = *(str+1);
1つ先のアドレスの中身を、現在のアドレスのデータ先に格納します。
str++;
アドレスを一つ進めます。
}
*str=t;
文字列の最後を示しているアドレス先に最初とっておいた文字を入れます。

こういう感じの流れです。
右も、n文字も同じ要領でOKだと思います。
 


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

Name: 羽流布 [URL]  ..初心者(6,762ポイント)   Date: 2007/06/22(金) 22:27   No:8838     
Title: Re:宿題です(汗)    
slshift(str)とsrshift(str)に値を渡すにはどうしたらいいんでしょうか?

void strshift(char *str, int n) {
int an, j, len;

while (*(str + 1) != '\0') {
len++;
str++;
}
if (n < 0) {
an = -n;
}
else {
an = n;
}
if (len != 0) {
an %= len;
}
for (j = 0; j < an; j++) {
if (n < 0) {
slshift(str);
}
else {
srshift(str);
}
}
}


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

Name: 管理人 [URL]  ..伝説のハッカー(377,007ポイント)   Date: 2007/06/22(金) 22:35   No:8839     
Title: Re:宿題です(汗)    
私の書いたサンプルを見たらわかるはずです。
というかすでに答えを自分で書いていらっしゃいますが・・。


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

Name: 羽流布 [URL]  ..初心者(6,781ポイント)   Date: 2007/06/22(金) 22:59   No:8841     
Title: Re:宿題です(汗)    

void strshift(char *str, int n) {
int an, j, len;

if (n < 0) {
an = -n;
}
else {
an = n;
}
len = strlen(&str);
if (len != 0) {
an %= len;
}
for (j = 0; j < an; j++) {
if (n < 0) {
slshift(&str);
}
else {
srshift(&str);
}
}
}

こんな感じになったのですが、うまくいきません……
どうしてでしょうか?


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

Name: box  ..比類無きプログラマー(72,038ポイント)   Date: 2007/06/22(金) 23:25   No:8842     
Title: Re:宿題です(汗)    

> void strshift(char *str, int n) {

strはchar *型ですので、

> len = strlen(&str);
> slshift(&str);
> srshift(&str);

この3行が正しくありません。
今は、&を付けているために、strlen, slshift, srshiftに
char **型を渡してしまっています。



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

Name: 羽流布 [URL]  ..初心者(7,242ポイント)   Date: 2007/06/22(金) 23:39   No:8843     
Title: Re:宿題です(汗)    
boxさん、ありがとうございますm(_ _)m

&が、いらなかったのですね……

これでとりあえず、一つ目は終わりました。

あとは下記のプログラムを完成させるだけです。

#include <stdio.h>
#include <math.h>
#define MAXN 100 // データの最大個数

void stats(int *x, int n, double *avr, double *std);

int main(void) {
int x[MAXN], n, j;
double aver, stdev;

printf("入力データの個数n (n <= %d) ? ", MAXN);
scanf("%d", &n);
printf("整数データを %d 個分入力せよ.適当に改行を入れてよい.\n", n);
for (j = 0; j < n; j++) {
scanf("%d", &x[i]);
}
stats(x, n, &aver, &stdev);
printf(" 平均値 = %.2f\n", aver);
printf("標準偏差 = %.3f\n", stdev);
return (0);
}

void stats(int *x, int n, double *avr, double *std) {

}


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

Name: 管理人 [URL]  ..伝説のハッカー(376,978ポイント)   Date: 2007/06/22(金) 23:56   No:8844     
Title: Re:宿題です(汗)    
計算式さえわかっていれば簡単だと思いますが、標準偏差などの計算方法はOKですか?

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

Name: 管理人 [URL]  ..伝説のハッカー(377,059ポイント)   Date: 2007/06/23(土) 00:08   No:8845     
Title: Re:宿題です(汗)    
たとえば標準偏差と平均だけならネット上にたくさんサンプルがありますよ。
http://www.google.co.jp/search?hl=ja&q=%E6%A8%99%E6%BA%96%E5%81%8F%E5%B7%AE%E3%80%80C%E8%A8%80%E8%AA%9E&lr=


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

Name: 羽流布 [URL]  ..初心者(7,736ポイント)   Date: 2007/06/23(土) 00:34   No:8846 解決!     
Title: Re:宿題です(汗)    
できました!
一応、実行結果が合っていますので、大丈夫かと……

#include <stdio.h>
#include <math.h>
#define MAXN 100 // データの最大個数

void stats(int *x, int n, double *avr, double *std);

int main(void) {
int x[MAXN], n, j;
double aver, stdev;

printf("入力データの個数n (n <= %d) ? ", MAXN);
scanf("%d", &n);
printf("整数データを %d 個分入力せよ.適当に改行を入れてよい.\n", n);
for (j = 0; j < n; j++) {
scanf("%d", &x[j]);
}
stats(x, n, &aver, &stdev);
printf(" 平均値 = %.2f\n", aver);
printf("標準偏差 = %.3f\n", stdev);
return (0);
}

void stats(int *x, int n, double *avr, double *std) {
int i;
double sum = 0, sumsq = 0;

for (i = 0; i < n; i++) {
sum = sum + *x;
sumsq = sumsq + *x * *x;
x++;
}
*avr = sum / n;
*std = sqrt( fabs( sumsq / n - *avr * *avr ) );
}
/*
入力データの個数n (n <= 100) ? 10
整数データを 10 個分入力せよ.適当に改行を入れてよい.
80 70 85 60 95 40 90 60 50 75
 平均値 = 70.50
標準偏差 = 16.948
*/


的確な助言をありがとうございましたm(_ _)m


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

Name: 管理人 [URL]  ..伝説のハッカー(377,077ポイント)   Date: 2007/06/23(土) 10:53   No:8852     
Title: Re:宿題です(汗)    
間に合ってよかったですね^^


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



Name: shaka  ..ぴよぴよ(512ポイント)   Date: 2007/06/21(木) 16:16   No:8811       
Title: お久しぶりです!!    
お久しぶりです!!
ボンバーマンをダウンロードさせていただいたのですが言っている意味が分かりました!!
あの動きは、壁に当たったら上下左右がいける場所かを判断して、OKなら座標を足したり引いたりする処理を書くという感じでしょうか???
あともうひとつ質問なんですが敵の動きが上手くいきません><
壁やオブジェクトに当たったら向きを乱数で変えて動いて行くプログラムを書きたいのですが、何度やっても敵が壁にめり込んだりしてしまいます。

ちなみにソースがこれです。
//敵の移動
void move_teki()
{
if((en.x%32)==0 && (en.y%32)==0 )
{
en.muki = rand()%4;
teki_move_flg = 1;
}

}
void move_teki_a()
{
if(teki_move_flg == 1)
{
if(en.muki==0) //右向きならx座標を増やす
{
en.x = en.x+en.espeed;
}

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

}
}
}

ちなみにライブラリは学校独自のライブラリを使っています。
よろしくお願いします。

あと間違えて過去ログに書き込んでしまったので今回新たに新規に投稿しました。



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


Name: 管理人 [URL]  ..伝説のハッカー(376,369ポイント)   Date: 2007/06/21(木) 23:48   No:8820     
Title: Re:お久しぶりです!!    
う〜ん、実際に行っている処理はボムマンの場合計算上1/100ピクセル単位で移動しているので、もっと複雑ですが、基本的にそんな感じです。
ただ私が言いたかったのは、ぴったり%32==0の地点にいないとき、キャラを操作させるには、曲線上を移動させなければならないということです。
厳密に作るならですけどね。

敵の動きがうまくいかないということですが
en.espeedが32で割ったあまりが0じゃ無いところを通っているのではないのでしょうか?
たとえば3ずつ増やしていると最初32で割ったあまりが0の地点を通りませんし。

敵がかならず32で割ったあまりが0の座標を通るようにすれば壁にのめりこむことも無いと思います。
もしそれでもわからなければ、ポイントつけてデバッグしながら値がどのように変化しているのか見ていってください。
条件付ブレークポイントなども使いながら、値を確認していくとよいと思います。

あと、調べている要素の対象が間違っている可能性もあります。
2次元で考えるとややこしいので1次元で考えて見ます。

座標x=0~31の間は[0]に属し、x=32~63の間は[1]に属し・・・
という処理を行っているのでしょうか?
今、要素が1の場所がいけないばしょ、1の場所がいける場所だとしましょう。

[0] [1] [2] [3]
1 0 0 1

今、x=60の地点にいるとします。[1]に属します・・・。
こうして自分が行っている処理を単純な構造に置き換えて考えてみてください。
何かわかってくるかもしれません


 
ここから関係ない雑談なのですが、
先日ゲーム会社がうちの研究室に、うちの会社どうですか、ゲームプログラマーになりませんかと宣伝に来てました。
専門学校でどんなことをしているのか知らないのですが、専門学校では独自のライブラリなどでゲームをあれこれ作らせているんでしょうかね?
いったい卒業までにどこまで習うのか、結構興味合ったりしますが。。ご存じないでしょうか。もしよければ教えていただければ嬉しいです。


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

Name: Justy  ..ハッカー(126,031ポイント)   Date: 2007/06/22(金) 00:09   No:8821     
Title: Re:お久しぶりです!!    
>壁やオブジェクトに当たったら向きを乱数で変えて動いて行くプログラムを
>書きたいのですが、何度やっても敵が壁にめり込んだりしてしまいます
 こんだけのソースでは判らないことだらけですが、
move_teki()を見る限り壁にぶつからなくても特定の条件さえ満たせば方向転換してしまうようですね。

 で、めりこみの方は can_cannot()の仕様がわからないと何とも言えませんが1つだけ。
 en.xや en.yは座標を表していると思われますが、これちゃんと移動できるかどうか確認してから
移動していますか?
 一見すると移動してから壁かどうか判定しているような気がするのですが。



>専門学校では独自のライブラリなどでゲームをあれこれ作らせているんでしょうかね?
 聞いた話では DirectXか DirectXをラップした独自ライブラリみたいですよ。
 ほとんどが2Dゲームですが、ごく一部の優秀な人は3Dで作るみたいです。

 カリキュラムの方は結構タイトらしいです。

http://diarynote.jp/d/68350/20070217.html


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

Name: 管理人 [URL]  ..伝説のハッカー(376,847ポイント)   Date: 2007/06/22(金) 15:07   No:8830     
Title: Re:お久しぶりです!!    
う、リンク先見ていると目が痛くなる^^;
Justyさん、ご紹介ありがとうございます。
DirectXをラップしたライブラリというと丁度DXライブラリみたいなものでしょうか?

専門学校でやってることは少々わかりました。
実はそろそろ就職活動なので、色々と迷っていまして。
今までソフトウェア開発系の研究してきたので、そちらを活かせる仕事を探していたのですが、先日宣伝に業者の方がこられて説明聞いて、私も趣味でいつもゲーム作っているものですからゲームプログラマーも面白そうだなと思いました。
しかしゲームプログラマーはきっと専門学校でそれ専門に勉強した人が集まるのでしょうから、私が行った所で趣味で得た知識程度のゲームプログラミングでは全く歯がたたないかなとも思ったり・・。
きっと研修とかあって、誰でも知識が付けられるようにはしてくれるのでしょうけど、う〜ん、院での研究テーマと無関係な職業につくのももったいないと思ったり悩んでいます^^;
会社どこが具体的にどういう事をしていて職場の感じがどうだとかパンフレットじゃわからないんですよねぇ・・。
せいぜい雑誌を見たり経常利益の推移を見たり、する位なんですが・・。

って人のトピで個人的な話をしてしまってすみません(_ _|||)


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

Name: Justy  ..ハッカー(126,520ポイント)   Date: 2007/06/22(金) 16:52   No:8831     
Title: Re:お久しぶりです!!    
>DirectXをラップしたライブラリというと丁度DXライブラリみたいなものでしょうか?
 そんな立派なものかどうかはわかりませんが、そんなカンジだと思います。

 一部の学校では実際のコンシューマ機の開発環境をそろえているところもあるようで
そういうところではまたちょっと違うのでしょうけど。


>ゲームプログラマーも面白そうだなと思いました。
 (w


>しかしゲームプログラマーはきっと専門学校でそれ専門に勉強した人が集まるのでしょうから、
>私が行った所で趣味で得た知識程度のゲームプログラミングでは全く歯がたたないかなとも思ったり・・。
 いえ、そんなことはないと思いますよ。
 むしろボンバーマンのゲームを一人で作られた点では評価は高い方だと思います。

 たしかに専門学校では専門にそれを教えていますが、ゲーム制作を通じて
言語の基礎を理解させるだけで終わってしまうことが多く、結局大卒だろうが専卒だろうが、
ごく一部の特殊な人たちを除いては五十歩百歩です。

 それに多少スタート地点に違いはあっても、実際現場に入ったその後の「伸び」には
個人差があるので、管理人さんくらいプログラムができて吸収力もあるなら、
どこへ行ってもやっていけると思います。


>きっと研修とかあって、誰でも知識が付けられるようにはしてくれるのでしょうけど、
 んー、最近のゲームは非常に高度な技術を必要とするので、それなりのフォローは
するでしょうけど、そんな余裕もないところも多いですからねぇ。
 下手すると研修後即プロジェクトに投入ということも・・・。


>会社どこが具体的にどういう事をしていて職場の感じがどうだとか
>パンフレットじゃわからないんですよねぇ・・。
 あ〜、これはOB訪問するとかしないと・・・。

 しかも大手だと開発部がいくつもあって、それぞれに特色のある雰囲気を
持っていたりして、どの部署に配属されるかで全然違ってきますよね。
 難しいですねぇ。


>って人のトピで個人的な話をしてしまってすみません(_ _|||)
 別スレたてた方がいいかもしれませんね。



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

Name: 管理人 [URL]  ..伝説のハッカー(376,935ポイント)   Date: 2007/06/22(金) 22:38   No:8840     
Title: Re:お久しぶりです!!    
なるほど、お答えくださりありがとうございます☆
トピの主旨から離れてしまいそうなので、とりあえず、この辺にしておきます^^;
自分からふっといてすみません(_ _|||)


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



Name:  ..ぴよぴよ(99ポイント)   Date: 2007/06/22(金) 18:35   No:8833       
Title: コマンド引数で16進    
ビットシフトを計算するプログラムを作ろうとしています。

コマンド引数から16進数の値を取りたいのですが、それは可能でしょうか?

プロンプトから下記のように呼び出して計算を行おうとしています。
>***.exe [元の値] [シフト方向] [シフト数]
(ex: >***.exe 0x10 up 1)

現在作成中ですが、第一引数が10進なら問題なくできるのですが、
16進数での表記が多いため、16進数をコマンドから持ってきたいのです。

知っておられる方がいらっしゃいましたら、ご回答よろしくお願いいたしいます。


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


Name:  ..ぴよぴよ(22ポイント)   Date: 2007/06/22(金) 19:18   No:8836     
Title: Re:コマンド引数で16進    
 コマンドライン引数は文字列なので、入力値に10進、16進なんて関係ないかと・・思います。
入力された文字列から、16進に変換する関数なりを作成するしかないのではないでしょうか?


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

Name: YuO  ..初心者(7,708ポイント)   Date: 2007/06/22(金) 19:38   No:8837     
Title: Re:コマンド引数で16進    
strtol関数を使えばよいです。
基数を指定できるので,一応36進数の入力とか,2進数の入力とかも可能にできます。
# 0だと0xを前置で16進数,といった感じになる。


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



Name:  ..初心者(5,239ポイント)   Date: 2007/06/22(金) 00:59   No:8822       
Title: 配列を計算して比較するとエラーが…    


配列を使用して、素数計算をしているのですが、どうしてもエラーになるところがあるので、教えていただけませんか?

前半は配列を使っていない状態です。
赤い個所を緑のように変更します。

そうすると、エラーが青の部分で起こります。
配列を用いて計算をした時比較は出来ないのでしょうか?

よろしくお願いします。

#define PRIME 1
#define NOPRIME 2

#include <stdio.h>

int main()
{
//a=フラグ i=素数用変数 j=割り算判定 x=格納変数 number=格納配列
int a, i, j, x=2, number[100]={1,2};

for(i=3; i<10; i++){ //数の決定
a = PRIME;

for(j=2; j<i && (a == PRIME); j++){ //割る数決定
if( i%j == 0 ){ //割り切れた時=素数でない
a = NOPRIME;
break;
}
}

for(j=2; (number[j])<i && (a == PRIME); j++){ //割る数決定
☆ if( (i%(number[j])) == 0 ){ //割り切れた時=素数でない
a = NOPRIME;
break;
}
}


if(a == PRIME){ //割り切れなかった時実行
number[x] = i;
x++;
printf("確認用:%d\n",i); //確認用
}
printf(" 数字:%d終了\n",i);
}
//最終表示
for(i=0; i<x; i++){
printf("%d,",number[i]);
}



return 0;
}


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


Name: フリオ  ..中級者(11,571ポイント)   Date: 2007/06/22(金) 03:53   No:8823     
Title: Re:配列を計算して比較するとエラーが…    
 
 "a = NOPRIME"の後に"break"しているので、"for(・・・;・・・ && (a == PRIME);・・・)"
の"a == PRIME"は、必要ない。


 配列"number"にどのような値が格納されているか確認しましょう。
 


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

Name:  ..初心者(5,304ポイント)   Date: 2007/06/22(金) 13:11   No:8824     
Title: Re:配列を計算して比較するとエラーが…    
あれは、あったほうが計算量が少なくなるので、付けています。

number[]には0がきちんと入っていたのですが、どうしても比較するところで、エラーが起きているのです。


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

Name: バグ  ..熟練のプログラマー(50,003ポイント)   Date: 2007/06/22(金) 13:30   No:8825     
Title: Re:配列を計算して比較するとエラーが…    
単純にnumber配列の初期化が出来てないからではないですか?

number[100]={1,2};

これだけでは、number[]の添え字が0か1以外の場合に例外が発生するかと思いますよ。


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

Name: バグ  ..熟練のプログラマー(50,109ポイント)   Date: 2007/06/22(金) 13:36   No:8826     
Title: Re:配列を計算して比較するとエラーが…    
if( (i%(number[j])) == 0 )

上記のエラーの出ている箇所ですが、jの初期値が2な訳ですから、最初に参照される値がnumber[2]になりますよね?

初期化されていませんが、たまたま0が入っていたとしても、余り算とはいえ0で割るという行為においては結果は同じです。

0で割る事で例外が発生しているのではないかと思います。


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

Name: Justy  ..ハッカー(126,031ポイント)   Date: 2007/06/22(金) 13:40   No:8827     
Title: Re:配列を計算して比較するとエラーが…    
>初期化されていませんが
 初期化はされてますよ、number[2]以降は0に。
 だから確実に例外が発生します。



Name:  ..初心者(5,367ポイント)   Date: 2007/06/22(金) 13:59   No:8829 解決!     
Title: Re:配列を計算して比較するとエラーが…    
あ、、、参照された次のが決定して無いことに気づけて居ませんでした。
バグ様、Justy様
ありがとうございました。



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



Name: go-  ..ぴよぴよ(15ポイント)   Date: 2007/06/21(木) 14:31   No:8806       
Title: 二分法    
二分法のxの二乗=2の数値解を求めるc言語のプログラミングを教えてください。
明日までなのでなるべく早めにお願いします。


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


Name: box  ..比類無きプログラマー(72,053ポイント)   Date: 2007/06/21(木) 14:40   No:8807     
Title: Re:二分法    
ズバリ「二分法」でググッてみると、考え方やサンプルプログラムを
載せているサイトが見つかります。
まずは、そのあたりから調べてみてください。


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

Name: go-  ..ぴよぴよ(33ポイント)   Date: 2007/06/21(木) 14:45   No:8809     
Title: Re:二分法    
ご親切にありがとうございます。調べてみます。

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

Name: go-  ..ぴよぴよ(95ポイント)   Date: 2007/06/21(木) 15:31   No:8810     
Title: Re:二分法    
すいません、探したんですけど自分の知識が乏しすぎてサイトの解説で理解できなかったのですが、なにかヒントをいただけませんでしょうか?よろしくお願いします。

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

Name: box  ..比類無きプログラマー(71,979ポイント)   Date: 2007/06/21(木) 16:58   No:8813     
Title: Re:二分法    
具体的にどのサイトをごらんになりましたか?
例えば、こちらには、考え方の詳細な説明や
フローチャートが載っています。


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



Name: 徹夜  ..かけだし(1,089ポイント)   Date: 2007/06/20(水) 22:31   No:8792       
Title: またまたすみません。別の配列です    
int main()
{
int i;
int va[5]={15,20,30};
int vb[5];
for(i=0;i<5;i++)
vb[i]=va[i];
puts("va vb");
puts("-------");
for(i=0;i<5;i++)
printf("%3d%3d\n",va[i],vb[i]);
return(0);
}
のプログラムから配列vaの要素の並びを逆順にしたものをvbにコピーせよという課題は、
初期化の部分を置き換えた下記のプログラムで良いんですか?なんかしっくりこないんです。配列が。
int main()
{
int i;
int va[5]={0,0,30,20,15};
int vb[5];
for(i=0;i<5;i++)
vb[i]=va[i];
puts("va vb");
puts("-------");
for(i=0;i<5;i++)
printf("%3d%3d\n",va[i],vb[i]);
return(0);
}
(別問題)

int main()
{
int i;
int vx[5];
for(i=0;i<5;i++){
printf("vx[%d]:",i);
scanf("%d",&vx[i]);
}
for(i=0;i<2;i++){
int temp=vx[i];
vx[i]=vx[4-i];
vx[4-i]=temp;
}
for(i=0;i<5;i++)
printf("vx[%d]=%d\n",i,vx[i]);
return(0);
}
配列の全要素を逆順に並び替えるというプログラムなのですが、
for(i=0;i<2;i++){
int temp=vx[i];
vx[i]=vx[4-i];
vx[4-i]=temp;

の部分で何が行われているのかがよくわかりません。これは、配列の数が偶数の時と、奇数の時で変わってくるのでしょうか?



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


Name: box  ..比類無きプログラマー(72,001ポイント)   Date: 2007/06/20(水) 23:02   No:8794     
Title: Re:またまたすみません。別の配列です    
> のプログラムから配列vaの要素の並びを逆順にしたものをvbにコピーせよという課題は、
> 初期化の部分を置き換えた下記のプログラムで良いんですか?なんかしっくりこないんです。配列が。

va[]の初期化状態を変えずに、並び順を逆にした内容を
vb[]に入れる、ということを出題者は望んでいると思います。

つまり、こういうことです。
・va[0]をvb[4]に入れる
・va[1]をvb[3]に入れる
・va[2]をvb[2]に入れる
・va[3]をvb[1]に入れる
・va[4]をvb[0]に入れる

va[]の添字とvb[]の添字との間に、どういう関係があるでしょうか?


> (別問題)

ご自分がコンピュータになったつもりで、
コードを1行ずつ実行してみてください。
関係する変数の値がどのように変わっていくかを見ていけば、
どのような動きをしているかが体感できるかもしれません。


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

Name: 徹夜  ..かけだし(1,156ポイント)   Date: 2007/06/21(木) 23:13   No:8819 解決!     
Title: Re:またまたすみません。別の配列です    
なんとか解決しました。
ヒントありがとうございます


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



Name:  ..入門者(2,952ポイント)   Date: 2007/06/16(土) 01:23   No:8673       
Title: 皆さんはプログラムどう書きます?    

他の人が読みやすいプログラムを書くのは難しいって聞いたことを思い出して…
********@************
void main(){
printf("…");
}
********************

*********A***********
void main()
{
printf("…");
}
********************
どっちが見やすく思いますか?

コメントはどの位置に付けますか?
どんな風に付けますか?
などなど、あると思いますが…(これだけしか思い浮かばなかったんだけど(^^;Λ

皆さんはどうでしょうか?
自分なりの規則を持っている方はいますか?

因みに僕は、、、、
@なのですが、@だと見にくいと思うときがあったりして、
最近ごちゃごちゃに使ってしまっているので、他の人はどうなんだろ?
って思いスレ立てしました^^

コメントは
**************************
一行の時:
//・・・・・・
printf("・・・・・");

複数行の時:
/*
・・・・・・
・・・・・・
・・・・・・
*/
printf("・・・・・・");

forなどループを使う時:
for ( ; ; ){ //
printf("・・・");
}
***************************
のような感じでやっています。
ただ、その時々によって変わってる感じがしますが・・・w

ご意見よろしくお願いします!!
+α:「これは勘弁!」と言うのがあったら教えていただけると、凄い参考になります^^

***********以下追加事項(6/16)**************************
自作関数と関数の名前の付け方はどうでしょうか?

僕は、長いのは先頭が大文字の英単語の羅列にしていますが、どうでしょうか?
短いのは小文字の
例:)Sample_game();  Sanple_game;
game(); game;


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


Name: 管理人 [URL]  ..伝説のハッカー(374,512ポイント)   Date: 2007/06/16(土) 01:39   No:8676     
Title: Re:皆さんはプログラムどう書きます?    
プログラムの書き方はホントに人それぞれですからねぇ・・。


void main(){
printf("…");
}

void main()
{
printf("…");
}

 
では私は上が見やすいんですが、私が見た中では下の書き方の方が若干多かったです。
あくまで私の周りはです。
if文の書き方も、「1行ならカッコをかかない」という人もいれば「どんな条件文でもカッコをかかないとわかりにくい」と言う人もいます。
私はコメントは大抵「//」で書きます。
というもの、途中に/**/があると、大きな範囲でコメントアウトしたい時に、中に/**/があると、それより大きな範囲から/**/がかけないからです。

>これは勘弁!

勘弁というかやってはいけないことは、トライグラフを混ぜないことです。
これはJustyさんの受け売りなんですが、コメントアウトしたからといってその区間に何でも書いていいわけではないです。
これを実行してみてください。
・・・実行する前に、結果が何になるか想像してからコンパイルしてみてください。


#include <stdio.h>

int main(){
int i,a=0;
for(i=0; i<10; ++i) //aの値は??/
++a;
printf("a=%d",a);
return 0;
}

 
 
あれ?と思う結果になったと思います。googleでトライグラフで検索するとわかります。
とにかく半角のハテナを書くのは避けたほうがよさそうです。

趣旨から離れてしまいました。すみません。

プログラムの書き方は本当に人によって様々だなぁ、、と思います。
逆にそれを逆手にとって、
「友達のプログラムソースをコピーして提出している学生」
を発見するプログラムを現在作っています。類似度を求めて、学生のかくプログラムのくせを見つけ出し、コピーされたものかどうかを判別するシステムです。
そういう試みが出来てしまうくらい見てると人それぞれなんですよね。

コメントアウトの仕方は、1行ずつ全てにコメントアウトで説明つけるような場合は、
タブで全部同じ位置から表示されるようにすると見やすくなると自分では思っています。
例えばこんな感じ。



int cnt(){
int i,a; //iとaを宣言
a=0; //aを初期化
for(i=0; i<10; i++) //10回ループ
++a; //aをカウントアップ
printf("a=%d",a); //aを表示。
return a; //aを返す
}
 
 


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

Name: 管理人 [URL]  ..伝説のハッカー(374,539ポイント)   Date: 2007/06/16(土) 01:44   No:8677     
Title: Re:皆さんはプログラムどう書きます?    
もしかして、「ポインタの扱い方・・・?」トピで書いた私のサンプルのコメントがみにくかったですか?^^;


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

Name: Justy  ..ハッカー(118,630ポイント)   Date: 2007/06/16(土) 04:10   No:8679     
Title: Re:皆さんはプログラムどう書きます?    
どっちが見やすく思いますか?
 私は2です。昔は1でしたが、括弧の対応が判りづらいので2に変えました。
 世の中の括弧の付け方はソース整形ツールなんかのオプションを見ると、
他にもいろいろあるようですね。

 基本的に1人でソースを書く時は

・ 論理構造を正しく表現する
・ 表現に一貫性がある
・ 可読性が高い
・ 保守性が高い

 ような書き方になっていればどんな書き方でもいいかと思います。



自分なりの規則を持っている方はいますか?
 細かくルールを持ってますよ(w
 しかも大体1,2年周期でプロジェクトが終わるタイミングで書き方を改善していっています。
(プロジェクトの途中で書き方を変えると全ソース書き換えが必要になるので、避けています)


「これは勘弁!」と言うのがあったら
 ん〜括弧のつけかたとかコメントの位置とかは常識の範囲内であれば特にないですが、
その他の点ではいっぱいありますよ。

 幾つか挙げると

・ インデントがおかしいソース、或いはインデントにタブとスペースが混在しているソース
 インデントされていないとか、インデントの論理構造が破綻してるのは勘弁です。
 又、タブの数が環境によって変わるので、混在しているとソースの見た目が崩れることがあるので、
これも止めて欲しいですね。

・ 1行に数百文字のコードが書かれている or 関数が長い
 昔は行80文字までとか制限があったこともありました。
 今はそんな制限はないのですが、例えば if文の条件がたくさんある時など
1行にたくさんの条件文を書き連ねてエディタを横スクロールさせないと見えない、
なんてのは論外です。
 逆に横ではなく縦に長いのも勘弁ですね。


・ コメントと処理の内容・目的が違ってる
 混乱の元です。
 違ってるくらいならコメントは要らないです。


 とかとか。



「友達のプログラムソースをコピーして提出している学生」 を発見するプログラム
 これは面白そうですね。
 最近はソース整形・リファクタリングツールも発達していますから単純な方法では
なかなか見破るのは難しいとは思いますが。

 複数の解析方法を使って多角的に解析したり、
各個人の癖もデータベース化すると精度が高められそうです。

 でも課題とかの場合、ある程度のソースが最初から提示されていたりすると
全員似たり寄ったりなプログラムになったりして厄介ですね。


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

Name: 組木紙織  ..中級者(13,609ポイント)   Date: 2007/06/16(土) 08:30   No:8681     
Title: Re:皆さんはプログラムどう書きます?    
括弧の表記表ですが、
自作関数の定義の場合
Aを使い
ifやforループの場合には
@
を使うようにしています。
クラス定義や構造体の定義のときもAですね。

コメントはコメントの意味のレベルに分けて4段階で使い分けています。

括弧の対応やコメントのつけ方だけでなく、変数の命名も読みやすく保守性の高いコードを書くには重要ですよね。
私の場合ハンガリアン記法を少し見習って接頭辞と接尾辞を使って変数の"意味"が分かりやすくなるように
しています。
ポインターやイテレータはp_で始めたりとか、
static変数はs_で始めたりなど。
カウンター用の変数はc_,
フラグはf_で始める
事などです。

一時期ハンガリアン記法を調べて、それにしたがって書いてみたのですが、
変数の型を変更すると書き直しが必要になったり、大文字と小文字が混じっていると読みにくかったので
結局はこの形に落ち着きました。


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

Name: YuO  ..初心者(6,880ポイント)   Date: 2007/06/16(土) 15:56   No:8683     
Title: Re:皆さんはプログラムどう書きます?    
波括弧について,私の場合は

・1行に書かれているif, else, for, whileおよびC++におけるtry, catchに続く複文の先頭は同じ行に書く
・1行に書かれているstruct, union, enumおよびC++におけるclassに続く{は同じ行に書く
・上記以外の{は次の行の行頭に,同一インデントで書く
・do文末尾のwhileはdoに続く複文の末尾の}と同じ行に書く
という感じです。たとえばif文なら,1行であれば
if (isFoo() && ifBar()) {
ですが,条件式をわけると
if (isFoo() &&

isBar())
{
となります。

C#で書く時はこんなに細々したルールを一気に整理して,
・{は常に次の行
・do文末尾のwhileはdoに続く複文の末尾の}と同じ行に書く
になったりしますが……。


> コメントはどの位置に付けますか?

本当はコメントつけなくても意思が伝わるのが良いのですが……。

単一行なら//,複数行なら/* - */を使います。
ただし,C95で書いている場合は//は使いません。
開始位置は,コメントしたい物の直前で,コメントしたい物とインデントをあわせます。
つまり,「この複文全体」であれば複文の開始の{のインデントにあわせますし,
「この式文」であれば,その式文のインデントにあわせます。
ただ,式文につける場合で内容が短いと,式分の後ろに書く場合も多いですが……。


> if文の書き方も、「1行ならカッコをかかない」という人もいれば「どんな条件文でもカッコをかかないとわかりにくい」と言う人もいます。

私の場合,if文に関して,
・基本は複文をつなげる
・ifの条件式が簡易で1行におさまり,続く文も内容が簡易で複文でない場合は,ifと同一行に複文にせずに書く
としています。
if (x == 0) return;



> というもの、途中に/**/があると、大きな範囲でコメントアウトしたい時に、中に/**/があると、それより大きな範囲から/**/がかけないからです。

基本はプリプロセッサ使って削除ですね。
#if 0

...
#endif



> 私の場合ハンガリアン記法を少し見習って接頭辞と接尾辞を使って変数の"意味"が分かりやすくなるように
> しています。

アプリケーションハンガリアンは使おうと思っていますが,「どういうものか」をきっちり識別子に含めるとだいたい必要がなかったり……。
# 副作用として識別子の長大化がありますが……。

私の場合は基本的にprefix/suffixは使わないのですが,唯一,メンバ変数/フィールドに_をつけています。
基本はprefixなのですが,C++のみ末尾です。_ + 大文字だとライブラリの要求に違反しますので。
# _ + 小文字ならglobal namespaceのみ予約なので大丈夫ですが,面倒なので。


> 一時期ハンガリアン記法を調べて、それにしたがって書いてみたのですが、
> 変数の型を変更すると書き直しが必要になったり、大文字と小文字が混じっていると読みにくかったので
> 結局はこの形に落ち着きました。

システムハンガリアンですね。
基本的に,システムハンガリアンに意味は無いです。書くだけ無駄ですのでやめましょう。
# DLLのプロトタイプの名前くらいには使いますが……。

名前は基本的に駱駝式。C/C++は.NETにあわせています。
例外: 1単語の関数は全部小文字


あとは,無意味に実装依存動作に頼らないことですか。


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

Name:  ..入門者(2,917ポイント)   Date: 2007/06/17(日) 00:00   No:8688     
Title: Re:皆さんはプログラムどう書きます?    

>管理人様

>途中に/**/があると、大きな範囲でコメントアウトしたい時に、中に/**/があると、それより大きな範囲から/**/がかけないからです。
なるほど、確かにそうですね…これから注意してみたく思います。

トライグラフの例ですが、a=10 となり、何も問題が無かったのですが、何が起こるのでしょうか?
トライグラフは、三文字で記号を表すものと解釈しました。

>「友達のプログラムソースをコピーして提出している学生」
友達に教えた人がいた時、そのプログラムが機能することが無いと思いますがどうでしょうか?
友達に教える時にそういうのには注意した方がいいのでしょうか?…注意が出来るかどうかわかりませんが^^;

>趣旨から離れてしまいました。すみません。
趣旨の中から全然離れていません。
むしろ、大歓迎です!


>もしかして、「ポインタの扱い方・・・?」トピで書いた私のサンプルのコメントがみにくかったですか?^^;
違います。
先生が、
void main ()
{
printf();
}
で書けと言っていたのに何で
void main() {
printf();
}
で書くの?
って聞かれたからです・・・・・・・・orz
なので、他の人はどうだろう?と思い書いて見ました。

>Justy様
>・ 可読性が高い
とは、どの様なのを指すかが、凄く曖昧な気がするのですが、どうでしょうか?

>・ 保守性が高い
申し訳ないのですが、良く分かりません。
説明お願いできませんか?

>細かくルールを持ってますよ(w
>しかも大体1,2年周期でプロジェクトが終わるタイミングで書き方を改善していっています
Σ(゜Д゜
それは、メモ帳などに記載して、やっているのか、記憶を頼りにしているのかどちらなのでしょうか?
参考までにお願いできますか?

>インデントがおかしいソース
には、
void main(){
printf("・・・・・"); //・・・・・・・・・・。
printf("…"); //・・・・
}
は入ると思われますか?

>if文の条件がたくさんある時など
>1行にたくさんの条件文を書き連ねてエディタを横スクロールさせないと見えない、
>なんてのは論外です。
なんと、出来る限り横に書いていくものだと思っていました。^^;

>組岸紙織様
なるほど、自分なりの関数の名前の付け方を決めておくと言うのも、かなりいいと思います。
ただ、ハンガリアンがあまり良くないそうなので、難しそうですが・・・。

>YuO様
文の長さによって色々と使い分けられているのですね。
凄いです!

>C95
とは、何なのでしょうか?
>基本はプリプロセッサ使って削除ですね。
>
>#if 0
>...
>#endif
これにはどの様な意味があるのでしょうか?
ググったても、使い方すら理解できませんでした。
[プリプロセッサ #if 0][プリプロセッサ]で検索をかけました。


質問文に、関数の名前の付け方も編集して追加させていただきます。
色々と参考になります。


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

Name: Justy  ..ハッカー(123,626ポイント)   Date: 2007/06/17(日) 01:28   No:8691     
Title: Re:皆さんはプログラムどう書きます?    
>>・ 可読性が高い
とは、どの様なのを指すかが、凄く曖昧な気がするのですが、どうでしょうか?
 たしかに曖昧です。
 実際、その判断基準は個々によって異なります。
 
 でも、大まかに複数の人から見て、明らかに読めないとか、ありますよね。
 こんなのとか。

 そういう極端な例はともかくとして、ぱっと見判りづらい、混乱させるようなのとかは
避けましょう、ということです。

 例えば、三項演算子とかなんか旨く使えば便利ですが、それが1つの式の中に10も20も出てきたら
もう読めません・・・。

 あと時々気付かずにやってしまうのが
void sample(void)

{
int n;
if(....)
{
int n;

}
}

 のように異なるスコープで同じ変数名を宣言してしまうと、書いている人はともかく、
読む人は結構混乱します。


>>・ 保守性が高い
説明お願いできませんか?
 保守性とは機能の変更や追加、パフォーマンスの改善、不具合の修正などにおいて
変更の容易さを指します。
 これが高いということは簡単に修正ができることを意味しています。

 これについては書き始めたらもう掲示板では語り尽くせないほど多岐渡る話になるのですが、
よくある話としては「1行修正を入れたらそれに伴って複数の行に手を入れなければならない」ような
コードは保守性が悪い、と言うことができると思います。

 マジックナンバーやマジックストリングなんかは真っ先に潰すべきでしょうし、
同じ処理が何度も現れたら関数化してまとめるとかは基本的な事項となります。

 他にも意外なケースとして例えば、switch-caseで以下のように書く人がいたとしましょう。



switch(mode)
{
case MODE_EXTREAM: a++;
break;
case MODE_ALT: a+=2;
break;
case MODE_DOUBLE_TIMES: a*=4;
break;
}


 ここで、case文に MODE_AAAAAAAAAAAAAAAAAAAAAAAを追加したいと思ったとき、
switch(mode)

{
case MODE_EXTREAM: a++;
break;
case MODE_ALT: a+=2;
break;
case MODE_DOUBLE_TIMES: a*=4;
break;
case MODE_AAAAAAAAAAAAAAAAAAAAAAA: a*=8;
break;
}


 switch-caseの全行に対してスペースなりタブなりを入れて、a++とか breakの位置を
変更しなければなりません。
 見た目はいいんですけど、数が多かったり追加・削除の頻度が高いとこれは結構面倒です。



それは、メモ帳などに記載して、やっているのか、
記憶を頼りにしているのかどちらなのでしょうか?
 記憶というか、習性というか。
 平日は一日だいたい最低4時間、多いときになると十数時間はプログラムしてるので、
細かなルールを意識することなくもう惰性で書いてます。


void main(){

printf("・・・・・"); //・・・・・・・・・・。
printf("…"); //・・・・
}
は入ると思われますか?

 たしかに // の位置が2行目と3行目でずれていますが、
論理構造は合っているので、ここで言っているインデントの問題には該当しません
 
 インデントがおかしいというのはそのプログラムの論理構造に対して
おかしなインデントというものを指します。
 例えば
    for(i=0; i<max; ++i)

count++;
printf("count = %d\n", count);
if(count == max - 1){
printf("abcdef\n");
}

 とか。
 これは printfが count++と同じ階層にあるので、for文の対象になっている、と
勘違いさせやすいインデントになっています。



なんと、出来る限り横に書いていくものだと思っていました。^^;
 見やすさの問題で、例えば、
    if(note == 1 || note == 4 || note == 6 || note == 9 || note == 11 || key == 1 || key == 4 || key == 6 || key == 9 || key == 11)

 とあるよりも

    if(note == 1 || note == 4 || note == 6 || note == 9 || note == 11

|| key == 1 || key == 4 || key == 6 || key == 9 || key == 11)

のように(if文だけに限らず)適度に改行を入れた方が見やすくなるかな、と。

 あとは横に長いと印刷したときに見苦しくなるというのもありますね。


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

Name: Justy  ..ハッカー(123,851ポイント)   Date: 2007/06/17(日) 01:59   No:8692     
Title: Re:皆さんはプログラムどう書きます?    
自作関数と関数の名前の付け方はどうでしょうか?
 C++で書いているときの関数(メンバ関数含む)は SampleGame()な書き方で書いています。

 ただ、Cですと(名前空間などが使えないので)意味を区切るために _ を使うとがあります。
 SampleGame_Start()とか。


とは、どの様なのを指すかが、凄く曖昧な気がするのですが、どうでしょうか?
 追加で補足

 紛らわしい変数名(関数も)とかも危険ですね。
 ll1、l11、l1lとか。

 発音が似ているのとか、意味が似ている別の単語とかも同様です。



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

Name: 組木紙織  ..中級者(14,629ポイント)   Date: 2007/06/19(火) 22:21   No:8760     
Title: Re:皆さんはプログラムどう書きます?    
最近みた変なコードの一部

if(){
/*色々1*/
goto label;
}else{
/*色々2*/
label:
/*色々3*/
}

goto の意味が無いじゃないですか!


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

Name: バグ  ..熟練のプログラマー(48,406ポイント)   Date: 2007/06/19(火) 23:33   No:8761     
Title: Re:皆さんはプログラムどう書きます?    
色々3の部分をif文の外に出してやればいいだけの事ですね〜(爆笑)

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

Name:  ..入門者(4,628ポイント)   Date: 2007/06/19(火) 23:43   No:8762     
Title: Re:皆さんはプログラムどう書きます?    

返信遅れてすみません。

> Justy様

>異なるスコープで同じ変数名を宣言してしまうと、書いている人はともかく、
>読む人は結構混乱します。
 確かに、気おつけなくてはいけないです。
自分でも後で見たら混乱しそうですし…

>保守性…(略)…が高いということは簡単に修正ができることを意味しています。
 関数内でしか使用しないものは、定義する必要は無いと取っても良いのでしょうか?

↓@
int Game(void)
{
int n;

return n;
}

↓A
int Game(int a)
{
int n,i;
i = GameOut(n,a);

return i;
}

 簡単に書いてますが、これが長く長く続く時、@はしても良く、Aはしない方が良い
と解釈しましたがあってますでしょうか?

↓A'
int Game(int RPG)
{
int name,i;
i = GameOut(name,RPG);

return i;
}
A→A’としておけばOK?


>他にも意外なケースとして例えば、switch-caseで以下のように書く人がいたとしましょう。
 では、↓の様な形でもいいのですか?

switch(mode)
{
case MODE_EXTREAM: a++;
break;
case MODE_ALT: a+=2;
break;
case MODE_DOUBLE_TIMES: a*=4;
break;
case MODE_AAAAAAAAAAAAAAAAAAAAAAA: a*=8;
break;
}

また、
{
case MODE_EXTREAM:
a++;
break;
case MODE_ALT:
a+=2;
break;
case MODE_DOUBLE_TIMES:
a*=4;
break;
case MODE_AAAAAAAAAAAAAAAAAAAAAAA:
a*=8;
break;
}
はよくないのでしょうか?

>平日は一日だいたい最低4時間、多いときになると十数時間はプログラムしてるので、
>細かなルールを意識することなくもう惰性で書いてます。
 えっ!…流石にそれだけやると違うんですね…(汗

>あとは横に長いと印刷したときに見苦しくなるというのもありますね。
 確かにそうだと思います。
印刷はあまりしたことが無かったので、考えていませんでした。
しかし、

>if(note == 1 || note == 4 || note == 6 || note == 9 || note == 11
>|| key == 1 || key == 4 || key == 6 || key == 9 || key == 11)

 これは、ifがとても見にくくなっているような気がします。
どうなんでしょうか?多く書くようになると、簡単に判断が出来るようになるのでしょうか?

if(note == 1 || note == 4 || note == 6 || note == 9 || note == 11
|| key == 1 || key == 4 || key == 6 || key == 9 || key == 11)
{

}
と、タブを一つ入れたほうが見やすくなると思うのですが、どうでしょうか?

>ただ、Cですと(名前空間などが使えないので)意味を区切るために _ を使うとがあります。
なるほど、名前空間と言うものがあったんですね。(マテ
思わぬところで良い勉強になります。

>発音が似ているのとか、意味が似ている別の単語とかも同様です。
 日本人なので…じゃ済まないんですよね…orz
ここで、英語が出てくるとは世の中はどこもかしこも英語が必要だと思い知りました。orz



>組木紙織
これから拡張を考えてるとか?w


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

Name: Justy  ..ハッカー(124,939ポイント)   Date: 2007/06/20(水) 01:05   No:8763     
Title: Re:皆さんはプログラムどう書きます?    
> これが長く長く続く時、1はしても良く、2はしない方が良いと解釈しましたがあってますでしょうか?
 いえ、条件付きで2の方がいいです。
 2のケースで、GameOut()が1と同じように長い関数になっているのでしたら
どっちでも意味がなくなります。

 ですが、GameOut()も適切にモジュール化・関数化されているとするならば2の方がいいです。

 やっぱり1つの関数が長くなると覚えておかなければならない変数や細かな処理が
増えるので一般的には保守性が下がります。
 同じ変数に複数の意味を持たせて使い回しなんかされたら、もう最悪になりますね。



>>他にも意外なケースとして例えば、switch-caseで以下のように書く人がいたとしましょう。
> では、↓の様な形でもいいのですか?
 なるほどなるほど(w
 OKですOKです。

 このあたりの部分に関しては「桁を揃える」というその作業の手間を面倒と感じるかどうか、
手間をかけなくても見やすくかけるのではないかというところの問題なので、
結構個人の慣性に左右されます。
 実際には(揃えなければならない)数が少なければさほど問題視はされないかと思います。


> また〜はよくないのでしょうか?
 こちらは特に問題はないと思います。



>これは、ifがとても見にくくなっているような気がします
>タブを一つ入れたほうが見やすくなると思うのですが、どうでしょうか?
 そうですね。
 個人的にはどっちでも有りです。
 まぁ、このあたりは好みの問題なので(^^

 ただ、この例は「横に長い式は途中で改行を入れる」という例だったので、
もっと見やすくするという意味で言えば、こんなにたくさんの判定式を1つの if文に
入れること自体がかなりナンセンスです。
 この判定自体を関数化(関数名が判定の意味・目的を表すように)してしまった方がより見やすくなりますね。

    if(IsSpecialNoteKey(note, key))

{
....
}




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

Name: YuO  ..初心者(7,662ポイント)   Date: 2007/06/20(水) 01:51   No:8767     
Title: Re:皆さんはプログラムどう書きます?    
>> C95
> とは、何なのでしょうか?

ISO/IEC 9899:1990にISO/IEC 9899:1990/Amd.1:1995の改正分を反映させた物のことです。
注)ISO/IEC 9899は標準Cのこと。最新版 (唯一の標準C規格) は,ISO/IEC 9899:1999。

//によるコメントはC99 (ISO/IEC 9899:1999のこと) でC言語に導入されたので,それより前の規格のコンパイラでは本来通らない物として扱うべきなので,使わないようにしています。
# C++言語では昔からありましたが。元をたどるとBCPLにはあった。


>>基本はプリプロセッサ使って削除ですね。
>>#if 0
>>...
>>#endif
>これにはどの様な意味があるのでしょうか?

#ifはプリプロセッサによる条件分岐で,#ifのあとの条件文が真であれば,そのブロック (#elif, #else, #endifのどれかが出るまで) をコンパイルし,そうでなければコンパイルしない,というものです。

#define CODE 1

int printf (const char *, ...);

int main (void)
{
#if CODE == 1
printf("Hello, World!\n");
#elif CODE == 2
printf("Hello, C World!\n");
#else
printf("Hello, Unknown world...\n");
#endif
}
というコードについて,CODEの値を変化させてみると,ある程度挙動が解るかと思います。

他のブロックを含むことができるため,コメントと違ってネストができ,通常コメントよりも推奨される書き方になります。
エキスパートになると,[cppll:12899] <tips> 自己解説型ディレクティブアウトのようになるわけですが……。


> のように異なるスコープで同じ変数名を宣言してしまうと、書いている人はともかく、
> 読む人は結構混乱します。

スコープ中にあるスコープで,ですね。
{

for (int i = 0; i < 10; ++i) { /* 配列をiで列挙していく */ }
/* ... */
for (int i = 0; i < 10; ++i) { /* 配列をiで列挙していく */ }
}
ならば,混乱することはないでしょうし。
# iのスコープについて正しい知識があることが前提ですが…… < VC++6が未だにのさばっているのでちょっと怖い……。



> ただ、この例は「横に長い式は途中で改行を入れる」という例だったので、
> もっと見やすくするという意味で言えば、こんなにたくさんの判定式を1つの if文に
> 入れること自体がかなりナンセンスです。
> この判定自体を関数化(関数名が判定の意味・目的を表すように)してしまった方がより見やすくなりますね。

私の念頭にあったのは,長い名前の関数2つを||で区切るような場合です。
C++/Java/C#では,論理値を返す関数/メソッド名がトータルで30文字とかがざらになってくるので。


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

Name: Justy  ..ハッカー(125,441ポイント)   Date: 2007/06/20(水) 02:15   No:8768     
Title: Re:皆さんはプログラムどう書きます?    
>エキスパートになると,[cppll:12899] <tips> 自己解説型ディレクティブアウトのようになるわけですが……。
 昔の知り合いにいました、そういうふうに書く方が(w


>スコープ中にあるスコープで,ですね
 あ、そうですね。その通りです。


>ならば,混乱することはないでしょうし
 それは全く問題ないです。


>VC++6が未だにのさばっているのでちょっと
 NOMINMAXもそろそろ勘弁してほしいです。


>C++/Java/C#では,論理値を返す関数/メソッド名がトータルで30文字とかがざらになってくるので
 そもそも変数名からして10文字はざらにありますからねぇ。
 それに加えてメソッド名、引数と加えていくと・・・。


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

Name:  ..入門者(4,884ポイント)   Date: 2007/06/21(木) 10:58   No:8800     
Title: Re:皆さんはプログラムどう書きます?    
>Justy様

個人の趣向がかなりバラける可能性があるんですね。

関数内に関数、関数内に関数、…
が多く続きずりると感じるのは何個ぐらい入れたときなんでしょうか?
20〜30入れたらもう多いのでは?
と感じるのは大きなのを作ったことが無い僕の感覚なのでしょうか?


>if(IsSpecialNoteKey(note, key))
>{
> ....
>}

こんなことをしても良かったんですか!?Σ(> <)
if文の中に関数を入れてしまうなんて…
ありだったんですね^^;

>YuO様
#ifは便利そうですが…使いこなせそうに無いorz
コメントのつけ方は難しそうです^^;

>C++/Java/C#では,論理値を返す関数/メソッド名がトータルで30文字とかがざらになってくるので。
なんか、すごい事だと思います。


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

Name: Justy  ..ハッカー(125,698ポイント)   Date: 2007/06/21(木) 14:10   No:8805     
Title: Re:皆さんはプログラムどう書きます?    
>こんなことをしても良かったんですか!?Σ(> <)
 関数の戻り値が、if文で判定できる物なら何でもOKです。


>関数内に関数、関数内に関数、
>が多く続きずりると感じるのは何個ぐらい入れたときなんでしょうか?
 私は特にそういう基準はないですね。
 むしろ、どう関数にまとめた(抽象化)のかが重要なので。


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

Name:  ..初心者(5,370ポイント)   Date: 2007/06/21(木) 22:49   No:8818     
Title: Re:皆さんはプログラムどう書きます?    
なるほど、どうまとめるかを考えることの方が難しいと言うことですね…^^;

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



Name: オス豚  ..ぴよぴよ(820ポイント)   Date: 2007/06/21(木) 16:48   No:8812       
Title: borland c++のアップダウンのincrement    
アップダウンのincrementを小数(0.25)に設定したいのですが、整数値にしろというエラーが出ます。
小数にするにはどうすればいいですか?


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


Name: GPGA  ..プログラマー(33,676ポイント)   Date: 2007/06/21(木) 16:59   No:8814     
Title: Re:borland c++のアップダウンのincrement    
そもそもincrementというのは整数の変数の値に1を加算することです。

0.25足したいのであれば、普通に + や += 等の演算子を使用して加算しましょう。
関数でやりたいのであれば以下のような感じ。

double AddDboule(double val)
{
return val + 0.25;
}
 


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

Name: toyo  ..かけだし(1,897ポイント)   Date: 2007/06/21(木) 17:03   No:8815     
Title: Re:borland c++のアップダウンのincrement    
変数の型をfloatかdoubleにするということかな。
よくわからないのでそのエラーの出る具体的なソースを書いてもらえれば助かります。


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

Name: GPGA  ..プログラマー(33,836ポイント)   Date: 2007/06/21(木) 17:10   No:8816     
Title: Re:borland c++のアップダウンのincrement    
ひょっとしてアップダウンコントロールのことだったりするのでしょうか?

それならば、ボタンが押された後の表示処理を自前で実装すれば可能だと思います。

具体的なやり方がこちらに書かれていましたので
参考にしてください。


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

Name: オス豚  ..ぴよぴよ(883ポイント)   Date: 2007/06/21(木) 18:04   No:8817     
Title: Re:borland c++のアップダウンのincrement    
説明不足ですいません。
アップダウンコントロールのプロパティのincrementのことです。

やはり自前で処理するしかなさそうですね。


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



Name: ビギナー  ..ぴよぴよ(80ポイント)   Date: 2007/06/13(水) 21:37   No:8586       
Title: 雑談ですが・・・    
はじめまして、c言語をはじめたばかりの者ですが
c言語ってなかなか馴染めなくて、くじけそうになってます。

レスを見てみるとすごく詳しく(しかも即答)回答されてますが、皆さん
c言語歴はどのくらいなのですか?

あと、いろんな方法があると思いますが、どうしたらc言語を効率よく学習できるか教えてください。

TO 管理人さん
初めてで良くわからないのですが、こういう質問ってしたらいけなかったらすみません


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


Name: バグ  ..熟練のプログラマー(46,997ポイント)   Date: 2007/06/13(水) 22:38   No:8587     
Title: Re:雑談ですが・・・    
私は去年の4月に今の会社に拾ってもらってからなので、約1年2ヵ月でしょうか…。
C言語は全く未経験でしたので大変でしたが、なんとか食らい付いてます(苦笑)
効率の良い勉強法は、色々な人達のプログラムを見る事と、ひたすら自分で書く事ですね。後は『とりあえずググる』でしょうか?(笑)
この3つと本人のやる気があれば、1ヵ月もあれば簡単なソフトを組めるようになると思います。


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

Name: ビギナー  ..ぴよぴよ(238ポイント)   Date: 2007/06/14(木) 00:05   No:8590     
Title: Re:雑談ですが・・・    
こんにちは。
私はC言語に出会って2ヶ月くらいでしょうか、minamiさんの作成しているプログラムと似ていて
ここに、たどり着きました。
Webも初心者のため、自分がなにを質問したいのやら、調べたいのやらで・・・、
ここは、皆さん回答が早く親切で丁寧なことにおどろきました。

今は、minamiさんの「アルファベットの検定」でフリオさん回答を参考に
アルファベットの出現頻度検定と連検定をして各検定の最大値を求めたところです。


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

Name: YuO  ..初心者(5,454ポイント)   Date: 2007/06/14(木) 00:09   No:8591     
Title: Re:雑談ですが・・・    
> 皆さん c言語歴はどのくらいなのですか?

えーっと,最初に使ったのは中1の頃あたりだからたぶん1992-3年,Quick C 2.0を使ったのが最初だと思います。
ただ,当時はQuick Basic 4.5 + MASM 5に対して利点を感じず,あまり勉強しなかったです。
# far pointerだのnear pointerだのややこしく,アセンブラで書いた方が楽だったし。
次に顔を見せるのが1995年。第二種受けた時に,午後をCASLとCで受けた覚えが。

まじめに使い始めたのは大学2年@1998年,サークルでWin32のプログラムを組んだ時ですね。
VS97を持っていたのでWin32の本買ってきて,1月前後でくみました。
# 今となっては汚点としかいえないような汚いC++ (ほぼC) コードですが。

規格書に手を出したのが2002年頃だったかと。


> あと、いろんな方法があると思いますが、どうしたらc言語を効率よく学習できるか教えてください。

良い本で勉強することと,とにかくプログラムを作ることでしょうか。
あとは結論だけを求めないことです。
なぜそれでできるのかを考えることによって,目の前の問題は確かに結論だけ求めるよりも時間がかかりますが,
その分理解できれば応用がききますから,それ以降の問題について時間の短縮になります。


ある程度なれてきたならば,実装と規格を分離して考えることも重要かなぁ,と。
実際にどのように実装されているかも勉強になりますし,規格上どうなっているのかも勉強になります。

ポインタなどは,実装をまったく勘案せずに理解できて初めてポインタが解ったといえると思っています。


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

Name: ビギナー  ..ぴよぴよ(107ポイント)   Date: 2007/06/14(木) 00:32   No:8592     
Title: Re:雑談ですが・・・    
「良い本で勉強すること」ですか、今は課題提出の期限に追われ課題か課題に近いサンプルが
掲載されている本が「良い本」と思ってしまっています。
課題の合間に、買ってきた本のサンプルは一通り作ってみましたが
まだまだ、タイプ打鍵訓練状態です(「おまじないと思ってください」と書いてあり鵜呑みに)。


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

Name: 管理人 [URL]  ..伝説のハッカー(370,834ポイント)   Date: 2007/06/14(木) 01:53   No:8596     
Title: Re:雑談ですが・・・    
ビギナーさん、全然OKですよ!
どんな投稿でもかまいませんのでご自由に^^

・・・最近忙しくてなかなか掲示板の方お答えが出来ません;
先1週間提出しないといけないものだけで5つもあるし・・(泣

私は大学に入って初めてPCを触った超初心者です。
実質プログラムを勉強して2年程度でしょうか。
情報学科に行きながら全くcになじめず、授業もわからず、全く勉強しませんでした・・。

そんな時、一つのライブラリが私にプログラムの面白さを教えてくれました。
それが「ゲームプログラミングの館」でも紹介しているDXライブラリです。
自分でゲームが作れるということにものすごく感動したのを覚えています。

う、、ちょっと時間が無いので、詳しくお話出来ないのが残念です。
私が一番いいと思った入門書は「新版 明解C言語」です。入門編と実践編があるので、順に読めばよくわかりますよ。
特にこの本でなくても、「自分が読めそうだ」と思う本を見つけることが大事だと思うので、
大きな本屋にいって端から読んでみるのがいいと思います。

一番最短のプログラミングの勉強方は「とにかくプログラムを書いてみる」と言う事だと思います。
プログラミングは数学と同じだと思います。

高校の時、数学の教科書を眺めていた時の事を思い出してください。
数学の教科書や参考書を一通り読んで「あ〜なるほど〜」とか納得したとしましょう。
しかしいざ教科書を閉じて練習問題をしようとしても、「あれ?」と思うでしょう。
プログラムも同じで、とにかく自分で書いてみる、コンパイルしてみる、演習が大事だと思います。

参考書を読んでは、そのつど面倒でも、わかりきっていても、プログラムを自分で書いて実行してみること、これがホントに大事です!


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

Name: ビギナー  ..ぴよぴよ(365ポイント)   Date: 2007/06/14(木) 13:13   No:8605     
Title: Re:雑談ですが・・・    
「ゲームプログラミングの館」見せていただきました。
丁寧な解説つきで、時間ができたら試してみたいです。
で、なにより好きになるきっかけって大事かと思いました。

「新版 明解C言語」今度、本屋で手にとってみます。

みなさん、早い時期にいろいろ作成しているみたいなので
おどろきです、これから興味のあることを探して、いろいろ
試してみようと思います。


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

Name: 管理人 [URL]  ..伝説のハッカー(372,149ポイント)   Date: 2007/06/14(木) 15:36   No:8612     
Title: Re:雑談ですが・・・    
<pre>
もう一つ効率よく勉強するには、一つの解説から自分で10も20も調べてみること、
コンパイルしてみることだと思います。

例えば、scanfの使い方を解説書を読んで勉強したとしましょう。

int a;
scanf("%d",&a);

「%dってprintfで使ったな〜。まぁprintfで使った奴を""の中に書いて、変数の前に&つけときゃいいんだな」

こんな感じでscanfについての勉強はもう終わりにしたAさんがいたとしましょう。
Bさんは違いました。


int型がこうならdoble型はどうなるのか調べてみよう。

double a;
scanf("%lf",&a);

何!%fじゃなくて%lfって書くのかぁ。printfと同じ記号だと思ってちゃいけないんだな。
printfで%lfって書くとどうなるだろう。
じゃ文字列はどうだろう?

char a[10];
scanf("%s",a);

あれ?文字列の時は「&」が変数の前についてないぞ?どうしてだろう。。。
その理由は・・


こんな感じで意欲的に調べていきました。
AさんとBさんのスキルの差は今後歴然となる事はあたりまえですよね。

参考書に書いてあることだけじゃなく、書いてあることを元に、「じゃこのときどうなるんだろう?」と意欲的に調べてみることこそ大事だと思います。

そうしてif文、printf文、scanf文、乱数などが勉強できたら、自分でそれで出来る何かプログラムを作ってみることです。

if文、printf文、scanf文、乱数の使い方さえわかれば「ジャンケン」位の簡単なゲームは作れますよね。
乱数でランダムな数を作り、それを3種類に対応させ、グー、チョキ、パーとする。
scanfで取り込んだ、プレイヤーの意思がグーで、かつ、乱数で出たコンピュータの手がチョキならプレイヤーの勝ち!
こんな感じでゲームが作れます。

私が初めて作ったゲームはジャンケンでした。
「自分で何か作ってみること」にこそ面白さがあり、勉強してばかりで退屈になってしまうこともありません。
面白さがわかれば、「ここ実現したいんだけど、それにはどうするんだろう・・」と、そんな疑問から意欲的に自分で調べるはずです。

勉強だと思ったら限界がありますが、趣味と思えば限界は無いはずです。
楽しみながらプログラミングを頑張ってください☆


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

Name: ビギナー  ..ぴよぴよ(892ポイント)   Date: 2007/06/14(木) 19:13   No:8617     
Title: Re:雑談ですが・・・    
じゃんけんゲームを作ってみました

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

int main(void)
{
int playerH,comH,res;
char ch;

/*乱数生成*/
srand((unsigned)time(NULL));

printf("1:グー 2:チョキ 3:パー\nいずれかを入力せよ: ");
scanf("%d",&playerH);
if(playerH<1 || playerH>3) return -1;/*エラー処理 入力範囲は1〜3*/
playerH--; /*playerHの値を0〜2範囲*/
comH = rand()%3;/*コンピュータの手を生成*/

switch(comH){
case 0:printf("コンピュータはグー\n");
break;
case 1:printf("コンピュータはチョキ\n");
break;
case 2:printf("コンピュータはパー\n");
break;
}

/*結果*/
res=(comH - playerH+3)%3;

if(res==2) res=-1;

switch(res){
case 1:printf("プレーヤーの勝ち\n");
break;
case -1:printf("プレーヤーの負け\n");
break;
case 0:printf("あいこ\n");
break;
}
return 0;
}

一回、一回プログラムが終了してしまうので改良するべき点等あるかとは
思いますが、とりあえず作成してみました。


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

Name: 管理人 [URL]  ..伝説のハッカー(372,640ポイント)   Date: 2007/06/14(木) 20:03   No:8618     
Title: Re:雑談ですが・・・    
お〜キレイなプログラム書いていらっしゃるじゃないですか^^
私は初めてこれを作った時、どうやったら総当りのif文を書かずに済むか結構悩んだ覚えがあります。
何とないプログラムの中にも結構アルゴリズムを考えないといけない要素ってあるものですよね!
ジャンケンの次は「ノット17」を作りました。

これは1人1〜3まで数える事が出来、1から順番に一人3までの数を数え、17を言ってしまった人が負けというゲームです。

システムとの場合、1:1でやる事になるので、結構簡単に最も勝率の高いプログラムを書く事が出来ますよ☆

まず「どうやったら最強になるのかな?」と考えました。一人3まで数えられるのなら3の倍数が関係しそうだな・・とか考えました。
これはjuliusを使って、音声入力で文字列を取り込み、linuxに標準で入っていた音声読み上げ機能を使って出力させました。
つまり音声入力を受け付けて、音声出力するわけですから、キーボードは一切使わず、本当に人と遊んでいるような感じにしました。

その時の様子を動画に納めたのがこれです。

http://dixq.net/movie/not17.3G2
(公開終了)

デフォルトが最強なので、何も考えなかったら絶対負けますw


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

Name: フリオ  ..中級者(10,526ポイント)   Date: 2007/06/14(木) 22:12   No:8619     
Title: Re:雑談ですが・・・    
 
 ちょっと気づいたことを、

"char ch"は使ってないので、消しておいたほうがいいです。

"%"は、"負 % 正"、"正 % 負"の結果は、処理系定義なので、
結果表示は、


switch((comH + 3 - playerH) % 3){
case 0: printf("あいこ\n");
break;
case 1: printf("プレーヤーの勝ち\n");
break;
case 2: printf("プレーヤーの負け\n");
break;
}

 

などとしたほうがいいです。

他に、

char *result[] = {"あいこ", "プレーヤーの勝ち", "プレーヤーの負け",};

を、宣言し、

printf("%s\n", result[(comH + 3 - playerH) % 3]);

とする方法もあります。
 


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

Name: なぎ  ..上級者(24,139ポイント)   Date: 2007/06/14(木) 22:19   No:8620     
Title: Re:雑談ですが・・・    
ちょっと茶々入れますが……

自動車教習所に行くと、自動車の運転技術だけではなく、交通法規も教えてくれます。
それと同じように、C言語の知識だけではなく、プログラミング一般の知識も押さえると、いいと思います。
また、プログラミングにおいて、「試行錯誤」には注意が必要です。
試行錯誤で問題を解決すること自体は悪くないのですが、問題が解決したと思った時点で、それでよしとせず、なぜ解決したのか、本当に解決したのかという、チェックをする習慣は大切です。
その習慣がないと、当てずっぽうでプログラムを直して、なんだか動いたからOKという行動パターンをとりがちになります。実際、そういう行動パターンは、そんなに珍しいことではありません。

具体的に、じゃんけんゲームのプログラムですが、たとえば、

> res=(comH - playerH+3)%3;
> if(res==2) res=-1;

という処理の判断は分かれるところです。
これが正しくじゃんけんの勝ち負けを判断していると、すぐには、わからないからです。
すぐにはわからないところというのは、万一バグが潜んでいると、発見が遅れるもとになります。
また、「if(res==2) res=-1;」というのは、どうも、試行錯誤の残骸に見えてしまいますが、いかがでしょうか。

その後の勝敗判定の swich() で、case ラベルを、0, 1, 2 にすれば、この if() は不要になると思います。
逆に言えば、なぜ、わざわざ res を 2 から -1 に差し替えているのか、わかりにくいところです。

プログラミング技法としては、こういう場合、デシジョンテーブルというものもあります。
こんな表を作ります。


computer gu choki pa
hito
gu aiko hito com
choki com aiko hito
pa hito com aiko


これを、2次元配列で表現して、じゃんけんの手の組み合わせ部分の値を返すと
どちらが勝ったかわかるという仕掛けです。

この方法の利点は、ロジック自体は単純で、表の検証は(プログラムを知らなくても)
誰でもできるということです。また、汎用性は非常に高くて、変則じゃんけんにもそのまま対応します。
ただ、(誰でもできるという一方で)表の作成や検証は結構面倒ではありますね。




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

Name: フリオ  ..中級者(10,588ポイント)   Date: 2007/06/14(木) 22:56   No:8623     
Title: Re:雑談ですが・・・    
 
 何を書いているんだ。

> "%"は、"負 % 正"、"正 % 負"の結果は、処理系定義なので、
> 結果表示は、
> switch((comH + 3 - playerH) % 3){
> case 0: printf("あいこ\n");
> break;
> case 1: printf("プレーヤーの勝ち\n");
> break;
> case 2: printf("プレーヤーの負け\n");
> break;
> }
> などとしたほうがいいです。

これは、勘違いなので、忘れてください。orz

# パスワードを入れてなかったので、編集できない。
 


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

Name: ビギナー  ..ぴよぴよ(111ポイント)   Date: 2007/06/15(金) 09:05   No:8636     
Title: Re:雑談ですが・・・    
皆さん、ご指導ありがとうございます。

・勝ち負けに判定の処理の方法や結果の保存はどうすればよいのか
・「あいこ」でプログラムが終了するのは不自然なのかな
などを思い作成しました。

まだ理解できないことが多いので勉強しながら、いろいろ試したいと思います。


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

Name:  ..入門者(3,320ポイント)   Date: 2007/06/17(日) 00:24   No:8690     
Title: Re:雑談ですが・・・    
>・勝ち負けに判定の処理の方法や結果の保存はどうすればよいのか
ファイルに保存なら:fputsなどを調べて見るといいかな?(難しいところもありますが…w
何回か回して、その結果を最後に表示するなら、配列を使えば良いと思います。(やる回数(三回やるだけとか…)に制限付けないとややこしそうですが・・・(汗

>・「あいこ」でプログラムが終了するのは不自然なのかな
for()やdo{}while();やwhlie()などを使えば、その不自然さはなくなりますよ^^
その時、関数&#defineを覚えてみるといいかもしれません。
特に、関数は作業が楽になりますよ〜(・・;

なんにしても、一つ一つ追加していくと、やりやすいと思います。
で、出来た後に、一から考えながら作り直すと、短くなったりするんですが…w
頑張ってください!


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

Name: ビギナー  ..かけだし(1,265ポイント)   Date: 2007/06/20(水) 01:41   No:8766     
Title: Re:雑談ですが・・・    
デシジョンテーブルはまだ手がつけられませんが、
修正してみました。
c言語以外の課題も多く、めげそうです。

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

int main(void)
{
int playerH,comH,res;

/* 乱数系列の変更 */
srand((unsigned) time(NULL));

do{
printf("1:(グー) 2:(チョキ) 3:(パー)\nいずれかを入力: ");
scanf("%d",&playerH);
if(playerH<1 || playerH>3) return -1;/*エラー処理 入力範囲は1〜3*/
playerH--; /*playerHの値を0〜2範囲*/
comH = rand()%3;/*コンピュータの手を生成*/

switch(comH){
case 0:printf("コンピュータはグー\n");
break;
case 1:printf("コンピュータはチョキ\n");
break;
case 2:printf("コンピュータはパー\n");
break;
}

/*結果*/
if(comH == playerH){
printf("あいこ\n");
}
else if(playerH == 1 && comH == 2){
printf("プレイヤーの勝ち\n");
}
else if(playerH == 2 && comH == 3){
printf("プレイヤーの勝ち\n");
}
else if(playerH == 3 && comH == 1){
printf("プレイヤーの勝ち\n");
}
else{
printf("コンピュータの勝ち\n");
}
}
while(comH == playerH);
return 0;
}


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

Name:  ..初心者(5,340ポイント)   Date: 2007/06/21(木) 12:33   No:8803     
Title: Re:雑談ですが・・・    
>int playerH,comH,res;

int playerH=0,comH=0,res;
…resって使ってないよね?過去の遺産かな??

>if(playerH<1 || playerH>3) return -1;/*エラー処理 入力範囲は1〜3*/

if(playerH>=1 && playerH<=3)
にすると、エラーではなく、再度入力を求めれるようになります。

>playerH--; /*playerHの値を0〜2範囲*/
は初めから0〜2にはなぜしなかったのでしょうか?
それか、

printf("1:(グー) 2:(チョキ) 3:(パー)\nいずれかを入力: ");
scanf("%d",&playerH);
if(playerH<1 || playerH>3) return -1;/*エラー処理 入力範囲は1〜3*/
comH = (rand()%3) + 1;/*コンピュータの手を生成*/
switch(comH){
case 1:printf("コンピュータはグー\n");
break;
case 2:printf("コンピュータはチョキ\n");
break;
case 3:printf("コンピュータはパー\n");
break;


と、してみてはどうでしょうか?


それと、
「再度勝負しますか?」(Yes:1/No:0)
を用いて、何度も対戦できるようにしたほうが面白いのでは?と思います。
どうでしょうか?

#defineや関数などと混ぜて作ったのを添付しておきましたので、良かったら参考に…なるかな?(汗
ミスがあったら教えてください…


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

Name: Justy  ..ハッカー(125,816ポイント)   Date: 2007/06/21(木) 14:40   No:8808     
Title: Re:雑談ですが・・・    
>ミスがあったら教えてください…
 強いて挙げるなら、scanfのところでアルファベットとかが
入力されるとおかしなことになる、くらいでしょうか。


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



Name: 徹夜  ..ぴよぴよ(710ポイント)   Date: 2007/06/20(水) 16:48   No:8785       
Title: 配列の課題    
int main(void)
{
int i;
int vc[5];
for(i=0;i<5;i++)
vc[i]=i+1;

for(i=0;i<5;i++)
printf("vc[%d]=%d\n",i,vc[i]);
return(0);
}
先頭から順に1、2、3、4、5を代入して表示のプログラムですが
先頭から順に5、4、3、2、1を代入して表示するプログラムをつくりたい。
試行錯誤して、変えてはコンパイルしているのですが上手く実行結果になりません。
どこをどう変えたらいいのでしょうか?


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


Name: DORAGON  ..ぴよぴよ(20ポイント)   Date: 2007/06/20(水) 17:02   No:8786     
Title: Re:配列の課題    
for(i=5;i<1;i--);

にすればいいん良いと思います。


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

Name: box  ..比類無きプログラマー(71,921ポイント)   Date: 2007/06/20(水) 17:07   No:8787     
Title: Re:配列の課題    

> for(i=0;i<5;i++)
> printf("vc[%d]=%d\n",i,vc[i]);

出力の際、iは0から4まで1ずつ増やしながら変化しています。
これを、4から0まで1ずつ減らしながら変化するようにしてください。




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

Name: 管理人 [URL]  ..伝説のハッカー(375,666ポイント)   Date: 2007/06/20(水) 19:10   No:8788     
Title: Re:配列の課題    
>for(i=5;i<1;i--);
>にすればいいん良いと思います。

これだとi=5から始まり、iが1より小さい間iを減らしながらループという意味になるので、ループされないでしょう。
そして不等号を逆にしても、1が出力されないので、i>0とするべきでしょう。


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

Name: DRAGON  ..ぴよぴよ(78ポイント)   Date: 2007/06/20(水) 20:28   No:8789     
Title: Re:配列の課題    
>管理人さん
そうでした。

コンパイルもせずに申し訳ありません。



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

Name: フリオ  ..中級者(11,521ポイント)   Date: 2007/06/20(水) 21:11   No:8791     
Title: Re:配列の課題    
 
> for(i=5;i<1;i--);
> にすればいいん良いと思います。

 "i = 5" は、まずいです。


> 先頭から順に5、4、3、2、1を代入して表示するプログラムをつくりたい。

vc[i]=i+1
を、
vc[i] = 5 - i
 


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

Name: 徹夜  ..かけだし(1,143ポイント)   Date: 2007/06/20(水) 22:34   No:8793 解決!     
Title: Re:配列の課題    
大変ありがとうございました。
このサイトは大変ありがたいです。
まだまだはじめたばかりなのでこれからもよろしくお願いします。


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

Name: 管理人 [URL]  ..伝説のハッカー(375,756ポイント)   Date: 2007/06/21(木) 02:09   No:8795     
Title: Re:配列の課題    
あぁ、配列の要素番号に使っていたんですね、DORAGONさんの記述しか見ていませんでした。
i=5を含めると、用意されていない[5]の配列要素まで使ってしまうので、i=4からはじめるか、i=0からカウントアップして、配列要素番号の時のみ引き算を使う方法がいいと思います。
もう解決されていますね。いい加減な回答ですみませんでした。


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



Name: C言語が苦手な人  ..ぴよぴよ(160ポイント)   Date: 2007/06/19(火) 21:09   No:8757       
Title: この問題わかる方・・・    
1.キーボードから数値を入力する。
2.その数値で1を割り逆数を求める
3.その結果が割り切れたら答えを表示する。
  割り切れずに循環したら途中まで表示し、循環節も表示する。
といった内容のプログラムなのですがさっぱり分かりません。構造体を使って余りの値を入れていって、1桁計算するたびに、今まで記憶した値と同じでないか調べ、同じ値になったら循環という風にやるらしいのですが…
どなたか分かる方回答よろしくお願いいたします。


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


Name: 管理人 [URL]  ..伝説のハッカー(375,535ポイント)   Date: 2007/06/19(火) 21:41   No:8758     
Title: Re:この問題わかる方・・・    
1〜3では難易度が違うようですが、どの辺まで今出来ていますか?
どの辺でつまっていますか?


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

Name: C言語が苦手な人  ..ぴよぴよ(229ポイント)   Date: 2007/06/19(火) 22:11   No:8759     
Title: Re:この問題わかる方・・・    
回答ありがとうございます。
値を入力するのと表示するのはできると思うのですが、2と3の計算のところがわからないです。
よろしくお願い致します。


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

Name: Justy  ..ハッカー(125,282ポイント)   Date: 2007/06/20(水) 01:24   No:8765     
Title: Re:この問題わかる方・・・    
>2と3の計算のところがわからないです
 ググルと計算方法は出てきます。
 特に桁数を求める方の直ぐに出てきます。
 
 処理の順番としては、循環しているなら循環の開始と終了の位置を求めます。

 循環していなくても小数点以下何桁(終了位置)になるかを調べます。
 で、次に求めた終了位置の桁まで除算を行います。

 あとはその結果を終了位置まで表示するだけです。
 その際、循環していたのなら、[....]などでその部分が循環していることを表示すれば完成です。


 結果の検証の方はこのサイトを参考にするといいでしょう。

素数大好き
http://homepage2.nifty.com/hiranouchi/prime/circulation.html



 ・・・・って、これ結構難易度高めですよ。
 除算の結果が小数点以下十桁以上になることがほとんどなので
double型では扱いきれず、その為動的をバッファも作らないと
いけないですし、除算自体も自前で計算しないといけません
(といってもその計算のアルゴリズム自体は小学生レベルの計算ですが)。


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

Name: フリオ  ..中級者(10,630ポイント)   Date: 2007/06/20(水) 04:42   No:8769     
Title: Re:この問題わかる方・・・    
 
>  除算の結果が小数点以下十桁以上になることがほとんどなので
> double型では扱いきれず、その為動的をバッファも作らないと

 結果を保存する場合は工夫が必要ですが、表示するだけなら
筆算の要領で、一桁づつ表示していけば、"int"で処理できます。
 


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

Name: C言語が苦手な人  ..ぴよぴよ(271ポイント)   Date: 2007/06/20(水) 05:41   No:8770 解決!     
Title: Re:この問題わかる方・・・    
回答ありがとうございました。
参考にさせていただきたいと思います。
また何か質問させていただくかもしれないのでそのときはよろしくお願い致します。


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

Name: フリオ  ..中級者(11,439ポイント)   Date: 2007/06/20(水) 10:29   No:8772     
Title: Re:この問題わかる方・・・    
 
 どう解決したのか、書いてほしかった。


 入力は、チェックしてません。

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

typedef struct fraction{
int dvnd;
int dvsr;
int sign;
}FRACTION;

int GCD(int num0, int num1)
{
if(!num1) return num0;
return GCD(num1, num0 % num1);
}

int SetFrac(FRACTION *frac)
{
int dvnd, dvsr, gcd;

printf("\n被除数 : ");
scanf("%d", &dvnd);
printf(" 除数 : ");
scanf("%d", &dvsr);
if(!dvsr) return 0;
if(!dvnd) frac->sign = 0;
else frac->sign = (dvnd < 0) ^ (dvsr < 0);
dvnd = abs(dvnd);
dvsr = abs(dvsr);
gcd = GCD(dvnd, dvsr);
frac->dvnd = dvnd / gcd;
frac->dvsr = dvsr / gcd;
return 1;
}

int Fact2or5(int num)
{
int i, j;

for(i = 0; !(num % 2); i ++) num /= 2;
for(j = 0; !(num % 5); j ++) num /= 5;
if(i < j) return j;
return i;
}

int main(void)
{
FRACTION frac;
int dvnd, remain, dplace = 0, unrepeat;

if(!SetFrac(&frac)){
puts("除数は 0 以外の整数を入れて下さい");
return 1;
}
printf("\n商 :: ");
if(frac.sign) putchar('-');
printf("%d", frac.dvnd / frac.dvsr);
if(frac.dvsr == 1) puts("\n (小数部無し)");
else{
dvnd = frac.dvnd % frac.dvsr;
putchar('.');
unrepeat = Fact2or5(frac.dvsr);
do{
if(++ dplace == (unrepeat + 1)){
remain = dvnd;
putchar('[');
}
printf("%d",(dvnd * 10) / frac.dvsr);
dvnd = (dvnd * 10) % frac.dvsr;
}while(dvnd && dvnd != remain);
if(dplace != unrepeat) putchar(']');
printf("\n否循環部 %d 桁、循環部([]内) %d 桁\n", unrepeat, dplace - unrepeat);
}
return 0;
}

 


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

Name: Justy  ..ハッカー(125,598ポイント)   Date: 2007/06/20(水) 12:25   No:8780     
Title: Re:この問題わかる方・・・    
>結果を保存する場合は工夫が必要ですが、表示するだけなら
>筆算の要領で、一桁づつ表示していけば、"int"で処理できます
 ルーチンを思い浮かべたときに、計算と表示を分離していたので、
そう書いたのですが、たしかに計算しながら表示すればバッファは不要ですね。


 あ、で上のプログラムですが、main関数の remain変数が未初期化のまま
whileで参照されるケースがあるのですが、それは意図した通りでしょうか?
 1を 1234で割ったときとか。


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

Name: フリオ  ..中級者(11,481ポイント)   Date: 2007/06/20(水) 21:02   No:8790     
Title: Re:この問題わかる方・・・    
 
>  あ、で上のプログラムですが、main関数の remain変数が未初期化のまま
> whileで参照されるケースがあるのですが、それは意図した通りでしょうか?

 ミスです。

do{
・・・
}while(dvnd && dvnd != remain);

を、

remain = 0;
while(dvnd != remain){
・・・
}

に、訂正。
お粗末でした。_(_ _)_
 


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



Name: kirin  ..ぴよぴよ(41ポイント)   Date: 2007/06/20(水) 13:25   No:8783       
Title: 外部変数    
外部変数 int data[10];
の先頭の要素のアドレスを戻り値として返す関数とはどのようにして作ればよいのでしょうか?


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


Name: asd  ..上級者(16,447ポイント)   Date: 2007/06/20(水) 13:32   No:8784     
Title: Re:外部変数    
この掲示板ではマルチポストは禁止されています。

http://hpcgi3.nifty.com/mmgames/patio/patio.cgi?mode=view&no=1623

そもそも、向こうの掲示板で回答が得られているのにマルチポストをする意味が分かりません。


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



Name: sumomo  ..ぴよぴよ(40ポイント)   Date: 2007/06/20(水) 01:23   No:8764       
Title: 課題;;    
大学で課題が出たのですが、
どのようにコーディングすればよいのか手詰まっています。
どなたか、模範解答を示していただけるとありがたいです。


自分の誕生日の月と日を取得する関数を作成せよ。
ただし、1つの関数で作成すること。
また、関数内で引数となる月、日のポインタ変数に収納されている
アドレスと、月と日の値を表示せよ。


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


Name: バグ  ..熟練のプログラマー(48,562ポイント)   Date: 2007/06/20(水) 10:21   No:8771     
Title: Re:課題;;    
まず、問題の意味が分かりません。

誕生日の月・日を取得と書かれていますが、何をもとにして月・日のデータを取得するのでしょうか?
取得というのは入力の事でしょうか?
それとも、コード内であらかじめ書かれた値を代入するだけでしょうか?

次に、プログラムについてどこまで習っていますか?
課題を見た感じでは、変数、関数、ポインタまでかと思いますが…どうでしょう?

最後に、ここは課題を丸投げする場ではありません。アドバイスを受けたり情報を交換したりする場なので、あくまで課題を解くのは自分だということをお忘れなく…


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

Name: sumomo  ..ぴよぴよ(201ポイント)   Date: 2007/06/20(水) 11:53   No:8774     
Title: Re:課題;;    
返答ありがとうございます。
月・日のデータの取得は自分の誕生日のと書いてあるから、
本当に作成者本人のデータ分が表示されればいいのかと思います。
何分課題についての質問は一切受け付けてくれないもので、、

プログラムの既習範囲につきましては、
ご指摘の通り、ポインタをかじったところまでです。

引き続きご協力をお願いいたします。


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

Name: バグ  ..熟練のプログラマー(48,972ポイント)   Date: 2007/06/20(水) 12:02   No:8776     
Title: Re:課題;;    
例えば、下記のようなプログラムで、main関数の中の最後で、Kotaeという変数の中身を画面に出力していますが、どういった数値が表示されるか分かりますか?


#include <stdio.h>

void Add(int A, int B, int *pAnswer)
{
*pAnswer = A + B;
}

int main(void)
{
int X, Y, Kotae;

X = 10;
Y = 20;

Add(X, Y, &Kotae);
printf("%d\n", Kotae);

return 0;
}


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

Name: sumomo  ..ぴよぴよ(241ポイント)   Date: 2007/06/20(水) 12:07   No:8777     
Title: Re:課題;;    
返答ありがとうございます。
上記プログラムだと、表示される値は30ですよね?


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

Name: バグ  ..熟練のプログラマー(49,082ポイント)   Date: 2007/06/20(水) 12:17   No:8778     
Title: Re:課題;;    
その通りです。
ポインタについては分かっていると考えても良さそうですね(^-^)


void GetValue(int* pValue)
{
*pValue = 100;
printf("pValue = %d\n", *pValue);
}

int main(void)
{
int Atai;

GetValue(&Atai);

return 0;
}


それでは、上記のプログラムで表示される値も分かりますか?


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

Name: sumomo  ..ぴよぴよ(282ポイント)   Date: 2007/06/20(水) 12:27   No:8781     
Title: Re:課題;;    
返答ありがとうございます。
上記プログラムで表示される値は、
pValue = 100 だと思います。。


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

Name: バグ  ..熟練のプログラマー(49,246ポイント)   Date: 2007/06/20(水) 12:55   No:8782     
Title: Re:課題;;    
そこまで分かっていれば、あとは簡単ですよ(^-^)
下記のプログラムの中のGetBirthDay関数の中身を実装してもらえれば完成です♪
頑張って下さい!!


#include <stdio.h>

void GetBirthday(int* pMonth, int* pDay)
{
/* pMonthとpDayに自分の誕生日を代入 */

/* pMonthとpDayを表示 */

/* pMonthとpDayのアドレスを表示 */
}

int main(void)
{
int Month, Day;

GetBirthDay(&Month, &Day);

return 0;
}


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



Name: Ito  ..ぴよぴよ(884ポイント)   Date: 2007/06/20(水) 11:30   No:8773       
Title: 2次元文字配列変数への値の代入法    
 文字列変数への文字定数の代入の方法についてどなたかお教え下さい.

 s[5][10]を宣言し,ある条件を満たす場合にはsの各行に"Aです",そうで
ない場合に"Bです"という文字列を代入する処理を考えます.このような
処理について記載している参考書が全く見当たりません.試しに

char s[5][10]; /* 10文字入る文字列変数を5個宣言 */
for(i=0;i<10;i++) {
 if (...) {
s[i][0]="Aです\0";
}
}

としたところ,当たり前のようにエラーが返って来ました.i行目のトップ
から文字"列"を代入する方法を教えて下さい.


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


Name: バグ  ..熟練のプログラマー(48,744ポイント)   Date: 2007/06/20(水) 11:56   No:8775     
Title: Re:2次元文字配列変数への値の代入法    
strcpy関数や、sprintf関数を使うと分かり易いと思いますよ(^-^)

<使用例>
strcpy(s[i], "Aです\0");

sprintf(s[i], "Aです");

結果は同じです。sprintfの場合は文字列の終端に自動で\0を追加してくれますし、数値の変換なんかもprintf関数のような使い方が出来るので、より分かり易いかもしれません。

それから、for(i = 0; i < 10; i++)となっていますが、[0]〜[5]までしか領域が用意されていないので、これは危険です。for(i = 0;i < 5; i++)に修正した方が良いですよ。


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

Name: box  ..比類無きプログラマー(71,853ポイント)   Date: 2007/06/20(水) 12:22   No:8779     
Title: Re:2次元文字配列変数への値の代入法    

> strcpy(s[i], "Aです\0");

strcpy()は、コピー先の領域が十分な大きさを持っていれば、
コピー元の文字列終端を含めてコピーします。
strcpy(s[i], "Aです");
で十分です。

> sprintf(s[i], "Aです");

sprintf()は、printf()の引数の先頭に格納先の変数を
付け加えた形式です。
sprintf(s[i], "%s", "Aです");
のように、書式文字列が必要です。
書式文字列を書かないでいると、
sprintf(s[i], "A%sです");
のようなケース(出力対象文字列の内容に、書式文字列に相当する内容を含む)で
思った結果を得ません。



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



Name: りぃ  ..ぴよぴよ(77ポイント)   Date: 2007/06/17(日) 22:27   No:8719       
Title: while文について    
はじめて投稿します(><)

あの、すごい初歩的な質問なのですが、

while文って2つの値を使った終了条件ってできるのでしょうか??

今、二つの条件で終わらせたいプログラムを作っているのですが

できなくて、私が間違っているのか、それとも元々できないのかがわからず

困っています。

すごい初歩的な質問だと思いますが

よろしくお願いします!!


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


Name: 管理人 [URL]  ..伝説のハッカー(375,168ポイント)   Date: 2007/06/17(日) 22:48   No:8722     
Title: Re:while文について    
条件式は「2つの式が両方とも真の時」という書き方が出来ます。
「&&」は「〜かつ〜」という意味で、「||」の「〜または〜」と対比して利用できます。
C言語関係の入門サイトは

http://www.google.co.jp/search?hl=ja&q=C%E8%A8%80%E8%AA%9E%E3%80%80%E5%85%A5%E9%96%80&lr=

こういう検索をすればいくらでも出てきますので、参考にしてください。

もし、a==1とb==2という両方の値が真の時にif文を実行させたければ


if(a==1 && b==2){
//ここに処理内容
}
 
 
こういうことです。ですからwhile文の中に書きたければ・・。


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

Name: りぃ  ..ぴよぴよ(161ポイント)   Date: 2007/06/18(月) 20:52   No:8746 解決!     
Title: Re:while文について    
ありがとうございます!!

ということはwhile文の終了条件のところに同じように入力すれば
作動するということでしょうか??

c言語関係の入門サイトもありがとうございます!!
参考にしてまだ初歩の初歩ですが頑張っていきたいと思います

また、機会がありましたら是非よろしくお願いします!!


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

Name: 管理人 [URL]  ..伝説のハッカー(375,491ポイント)   Date: 2007/06/18(月) 21:51   No:8751     
Title: Re:while文について    
while(1)の無限ループを作って終了条件で抜けると言うやり方もありますが、

終了条件というよりも、自然なやり方は

上記のサンプルを使うと、「aか1で、かつ、bが2である間ループ」つまり、どちらかの値が変更されたらループを抜けたいなら


while(a==1 && b==2){
//ここに処理内容
}

 
 
こういうことになります。


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

Name: りぃ  ..ぴよぴよ(227ポイント)   Date: 2007/06/19(火) 20:54   No:8756 解決!     
Title: Re:while文について    
上のwhile(a==1 && b==2)で
できました!!
ありがとうございます!!

なんで&&なのかもわかりました!!

ありがとうございます!!


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



Name: 組木紙織  ..中級者(13,904ポイント)   Date: 2007/06/17(日) 17:33   No:8700       
Title: c以外の言語の経験    
ただいま卒論の関係でfortran77を勉強しているのですが、
プログラムが書きにくくて少しいらいらしながら勉強しています。

古い言語なので仕方が無いとは思うのですが、ループ分がforループしかなかったり、
gotoを絶対に使わないとwhileやdoのループ制御が出来なかったり、などがあり、
cで書いたプログラムをfortranに変換するプログラムを作って、その変換をかけてしてみたい気分です。
(変換プログラムを作るのに時間がかかるからしませんが)

ここの掲示板に来る人はc/c++言語使いだと思いますが、他の言語を使ってどうだったか?
他の言語の経験年数などを聞きたいと思います。

私の場合は
java 半年   単一継承が使いやすい。ライブラリーが大きいのでそれを学ぶのが大変。
perl   1ヶ月   変数の宣言がなれないと難しいな。ラベルつきのループ文は使いやすいけど。
fortran 2週間   色々と制限がきつくて書きにくいです。言語仕様は大きくないのがいいのですけど。

といった感じです。
ちなみにperlはCGIを作るためだけに勉強して、CGIを完成させてからまったく触っていないです。


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


Name: Hermit  ..初心者(8,663ポイント)   Date: 2007/06/17(日) 20:12   No:8707     
Title: Re:c以外の言語の経験    
最初、学校でのプログラムは フォートラン からでしたね、私は。
77 のフォートランは、for 文があるんですか。
私がしてたときのマニュアルを見ると、そんな物ありませんでした(^^;
do 文がそれにあたるみたい。
goto は、かなり強力です。

まあ、マークカードを読ませて実行だったので、でかい物は作ったこと無いけど。


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

Name: バグ  ..熟練のプログラマー(47,926ポイント)   Date: 2007/06/17(日) 20:19   No:8709     
Title: Re:c以外の言語の経験    
私は最初がBASICで、学校でCOBOLとFORTRAN、C言語を少々という感じでした。

ただ、当時の私はBASIC以外はあまり興味が湧かなかったので、あまり記憶に残ってません(^^ゞ

おぼろげながら、FORTRANはBASICに近かったようなイメージがあるので、オブジェクト指向に慣れていると使いにくいでしょうね。
私の場合はBASICでばかり遊んでいたので、逆にC言語に慣れるのに苦労しました(;^_^A


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

Name: 組木紙織  ..中級者(14,196ポイント)   Date: 2007/06/17(日) 20:20   No:8710     
Title: Re:c以外の言語の経験    
>77 のフォートランは、for 文があるんですか。

すみません。説明が悪かったみたいです。
フォートラン77には"for"の予約語は無いです。
"forループ"を表現する予約語に"do"があるというだけです。
なのでfor"文"でなくfor"ループ"という言葉を使いました。

>まあ、マークカードを読ませて実行だったので、でかい物は作ったこと無いけど。

私の母がその時代でした。母はCOBOLを勉強していたようですが。


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

Name: YuO  ..初心者(7,166ポイント)   Date: 2007/06/18(月) 13:04   No:8732     
Title: Re:c以外の言語の経験    
趣味と仕事を一緒くたにして書くと,
Basic,Quick Basic, Visual Basic for MS-DOS, MASM 6, Visual Basic (16bit), Visual Basic (32bit), C, C++, Java, C#, Visual Basic.NET/Visual Basic 2005, PHP 5
といったところでしょうか。
使いやすかったのはQBとC# (IDE込みで)。あと,C++は使っていて面白いなぁ,と。
最悪はPHP。class::instance-methodで$thisにバインドされずにインスタンスメソッドが呼べるあたりが終わっています。
# で,それをやっちゃう上司。面倒なのでそのまま放っておきましたが……。


> java 半年   単一継承が使いやすい。ライブラリーが大きいのでそれを学ぶのが大変。

単一継承って使いやすいですか?私自身は多重継承必須だと思っていますが。
実際,単一継承であるC#で多重継承が使えないために複数箇所に同一コードへの呼び出しが分散したことがあります。
現実的にMix-inレベルの多重継承は必須だと思いますけどね……。
# C#の拡張メソッドで十分かどうかは,でてみないとなんとも。


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

Name: なぎ  ..上級者(24,919ポイント)   Date: 2007/06/18(月) 19:13   No:8745     
Title: Re:c以外の言語の経験    

一部の間では有名な、Ratfor というのが存在しています。
最近は処理系を見たことがないけど。
C言語風の Fortran で、トランスファー使って、FORTAN (77 じゃなくて、もっと前の)に変換するような仕掛けでした。
サンプルも見かけないのでちょっと探したら、
http://pages.stern.nyu.edu/~sbrown/mysub.r
に少しありました。
この頃は、FORTRAN にはブロック IF すらなかったのです。

さて、私は、影響を受けたものとしては、Modula-2 があります。
オブジェクト指向までいってませんでしたが、情報のカプセル化などは充分に実現されていました。
また、構造体とポインタの組み合わせを理解したのは、Modula-2 経由でした。

あとは、SmallTalk。ただ、これはほとんど使えませんでした。(役に立たないというのではなく理解できなかった)
しかし、多分、C++で道を踏み外さなかったのは、SmallTalk で扱った、オブジェクト指向のおかげでしょう。

あと、Forth でちょっと寄り道したり。
これは、「逆ポーランド記法」がベースになっているのですが、このおかげで、括弧無しで演算の優先順序が完全にコントロールできたり、関数(じゃないですが、似たようなものがあって)を並べて書くと、関数の合成ができたりと、一風変わった言語でした。

あとは、よく見かける言語しか使ってないかな。





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

Name: 組木紙織  ..中級者(14,307ポイント)   Date: 2007/06/18(月) 21:20   No:8748     
Title: Re:c以外の言語の経験    

>単一継承って使いやすいですか?私自身は多重継承必須だと思っていますが。

私も多重継承は必要なときがあると思っていますが、
オブジェクト指向がまだ勉強中で、多重継承を使った設計ができないので普段は単一継承しか考えていないのと、c++とjavaで同じ単一継承だけを考えると、c++では仮想関数を考えてコーディングを無いといけないので、
"java"の継承のほうが"c++"の継承より使いやすいと感じたので上記のような書き込みをしました。


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

Name: なぎ  ..上級者(24,965ポイント)   Date: 2007/06/18(月) 21:27   No:8750     
Title: Re:c以外の言語の経験    
C++の多重継承は、本物の多重継承と、インターフェイスの継承があって、適切に設計すれば、インターフェイスの継承で十分じゃないかというのが、Java や C# の立場ですね。
私自身は多重継承は使ったことがないので何ともいえません。


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

Name: YuO  ..初心者(7,599ポイント)   Date: 2007/06/19(火) 01:43   No:8753     
Title: Re:c以外の言語の経験    
> C++の多重継承は、本物の多重継承と、インターフェイスの継承があって、適切に設計すれば、インターフェイスの継承で十分じゃないかというのが、Java や C# の立場ですね。

どちらもルートクラスを用意してしまったが為に,多重継承を許すと菱形継承になってしまうからお茶を濁したのでは,というのが私の感覚です。
実際問題として,実装の多重継承は必要になる場面が実際に存在しますから。
# だからこそmix-inを用意しろと思うわけで。フルセットの多重継承はおそらく必要になることが少ないので。

> c++では仮想関数を考えてコーディングを無いといけないので

これも私とは意見が逆だったり……。
# っていうか,この私の意見は「オブジェクト指向入門 第2版」第14章と真っ向から対立しますが。

経験的な問題として,完全に全体が解析されなかったシステムにおいては,
継承階層上で全く異なる動作を行う同一シグネチャの関数が存在する可能性があります。
そのため,この点ではC#のvirtual/override/newのシステムが便利で,不用意なoverrideによるバグが無くなるのは相当有用です。
# 全部動的束縛に振っておくのが理想なのは理解できるのですが……。


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

Name: 組木紙織  ..中級者(14,551ポイント)   Date: 2007/06/19(火) 20:18   No:8755     
Title: Re:c以外の言語の経験    
>経験的な問題として,完全に全体が解析されなかったシステムにおいては,
>継承階層上で全く異なる動作を行う同一シグネチャの関数が存在する可能性があります。

私は今までに最大で5千行?
/*
cやjavaは文脈自由文法なので行数を言うのは概念として正しくないと思いますが、 
ここではプログラムの大きさを表現するものと見てください。感覚的には理解できると思いま

す。
*/
程度に満たないプログラムを作ったことしかなく、要求分析から設計、コーディング、テスト
全て自分ひとりでやっているので、"完全に全体が解析されなかったシステム"で作成すること


なかったので、この内容は私には理解できない部分です。(想像することは出来ますが)

なので
"継承階層上で全く異なる動作を行う同一シグネチャの関数が存在する可能性"
はまったく考えたことがなかったです。
この内容を基にして考えるなら、なるほどと思う部分はあります。

私が
>c++では仮想関数を考えてコーディングを無いといけないので
といったのは、もっと小さい部分の話で、
c++で継承を使う場合に関数を仮想関数にして動的結合にするか、通常の関数にして静的結合


するかということを考えながら書いており、全て動的結合のjavaは意識して
書かなくてすむので、c++の継承よりはjavaの継承が使いやすいと思ったからです。




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



Name: mt_tm8  ..ぴよぴよ(153ポイント)   Date: 2007/06/15(金) 02:24   No:8629       
Title: プログラミングがわかりません。    
このような問題が出たときどのように解いたらよいのでしょうか

# 次のようにキーボードから4桁の10進数の入力を2回受付ける.
Input the 1st value > 6479
Input the 2nd value > 1497

但し,4桁の各位の数は必ず互いに異なるものが入力されるとする.
# 入力された数値に対して,以下に定義する「ヒット数」と「ホームラン数」を求める.

* ホームラン数: 二つの数字を同じ位ごとに比較した時,何ヶ所の位について一致しているかを表す.
* ヒット数: 二つの数字を異なる位同士で比較した時,一致している組み合わせの数を表す.


1234と1234の場合,0ヒット4ホームラン
1234と4321の場合,4ヒット0ホームラン
6479と1497の場合,2ヒット1ホームラン


# ヒット数とホームラン数を次のように表示する.
2 hit(s) 1 home run(s)


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


Name: asd  ..上級者(16,154ポイント)   Date: 2007/06/15(金) 09:51   No:8639     
Title: Re:プログラミングがわかりません。    
> このような問題が出たときどのように解いたらよいのでしょうか

全く手がつけられないということでいいでしょうか?
まずは問題にもあるように2回入力を受け付けないといけません。

> # 次のようにキーボードから4桁の10進数の入力を2回受付ける.
> Input the 1st value > 6479
> Input the 2nd value > 1497

 1. "Input the 1st value > "と表示して1つ目の数字を入力受付
 2. "Input the 2nd value > "と表示して2つ目の数字を入力受付

次に2つの数字のそれぞれの桁を調べていきます。

 3.2つの数字のそれぞれ同じ桁同士を比較する。同じ数字の場合はホームラン数を+1する

例)1234と1254のとき
   1234 1254
一の位 4  4 同じ
十の位 3  5
百の位 2  2 同じ
千の位 1  1 同じ
*ホームラン数は3


 4.片方の数値のそれぞれの桁についてもう一方の数値に同じ数値があるかを調べる。同じ数字があればヒット数を+1する

例)1234と4321のとき
   1234 4321
一の位 4  4321 
       ~←同じ
十の位 3  4321
       ~←同じ
百の位 2  4321
        ~←同じ
千の位 1  4321
        ~←同じ
*ヒット数は4


 5.ホームラン数とヒット数を出力する

こんな流れになるかなと思います。
何となく雰囲気がつかめたでしょうか?
必要な処理としては、文字の入力、桁毎の数字チェック、結果出力になるかと思います。

よく分からないという場合は遠慮なく聞いてくださいね^^


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

Name: toyo  ..かけだし(1,626ポイント)   Date: 2007/06/15(金) 09:56   No:8640     
Title: Re:プログラミングがわかりません。    
4桁の数字をそれぞれ配列に入れて2重ループで比較すれば良いと思います

hit = 0;
homerun = 0;
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
if (n1[i] == n2[j]) { /* 数字が一致 */
if (i == j) { /* 場所も一致 */
homerun++;
}
else { /* 場所が違う */
hit++;
}
break;
}
}
}
printf("%d hit(s) %d home run(s)\n", hit, homerun);



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

Name: 部長  ..ぴよぴよ(79ポイント)   Date: 2007/06/18(月) 21:10   No:8747     
Title: Re:プログラミングがわかりません。    
もう遅いかも知れませんが↑のプログラムでは正しく動きません
例えば5353と5353の場合1番目の5と2番目の3はホームランになりますが3番目の5は最初の5でヒットになりbreakで抜けてしまいます。4番目の3も同じ理由でヒットになります。このプログラムはバグを完全になくそうと思うと意外と難しいです。私もバグなし作るのにちょっと手間取りましたw
たぶん学校の課題だと思いますが、これがはじめてのプログラムの授業で、これを完全にバグなしで提出しなければならないのなら結構えげつない先生ですねw


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

Name: なぎ  ..上級者(24,875ポイント)   Date: 2007/06/18(月) 21:25   No:8749     
Title: Re:プログラミングがわかりません。    
うむ。

> このプログラムはバグを完全になくそうと思うと意外と難しいです

そのために、「但し,4桁の各位の数は必ず互いに異なるものが入力されるとする」という条件がついている気がしますが。



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

Name: 部長  ..ぴよぴよ(111ポイント)   Date: 2007/06/19(火) 00:35   No:8752     
Title: Re:プログラミングがわかりません。    
あっすみませんそこ見てませんでした。
だとするとちゃっちいプログラムだな...
よく見たら入力2回とも自分がするんですね。答え丸わかり...
なんてアホなプログラムなんだ...
まあそれでもなるべく汎用性の高いプログラムを作ってほしいと思います。
余計なこと言ってすみませんでしたorz


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

Name: toyo  ..かけだし(1,843ポイント)   Date: 2007/06/19(火) 09:30   No:8754     
Title: Re:プログラミングがわかりません。    
最初はフラグ使って

for (i = 0; i < 4; i++) {
if (n1[i] == n2[i]) {
homerun++;
n1[i] = 10; /* チェック済みのフラグとして10以上の数字に変更 */
n2[i] = 20;
}
}
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
if (n1[i] == n2[j]) {
hit++;
break;
}
}
}

みたいにしてたんですよ
同じ数字がないならホームランとヒットを同時に判定できるなということでああなりました


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



Name: ジミさん  ..ぴよぴよ(174ポイント)   Date: 2007/06/17(日) 18:35   No:8702       
Title: 無題    
すみません、
PSDK-x86.exe をダウンロードする際に「インストールパッケージを
開くことができません」と表示されインストールが行えません。
誰か分かる方がいましたら回答のほうよろしくお願いします。


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


Name: サイト  ..かけだし(1,319ポイント)   Date: 2007/06/17(日) 18:41   No:8703     
Title: Re:無題    
OSはなんですか?
ダウンロードするときに実行せずに保存してみてはどうですか?


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

Name: ジミさん  ..ぴよぴよ(228ポイント)   Date: 2007/06/17(日) 19:04   No:8704     
Title: Re:無題    
OSはWindows XP Media Center Edition version2002 Service Pack2 です。
実行せずに保存してから実行しても同じ結果になってしまいます。


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

Name: Justy  ..ハッカー(124,523ポイント)   Date: 2007/06/17(日) 20:17   No:8708     
Title: Re:無題    
 ダウンロードしたファイルが壊れているか、レジストリが壊れているか、
(プロキシとかで)ネットワークがつながらないとかその他諸々の原因があります。

 
 フルインストール版あるいは、ISOイメージを試してみては?



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

Name: ジミさん  ..ぴよぴよ(355ポイント)   Date: 2007/06/17(日) 21:18   No:8711     
Title: Re:無題    
ありがとうございます。解決しました。
それと上の問題は解決しましたが。
次はこのエラーが出ました。誰かよろしくお願いします。
windows.h': No such file or directory


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

Name: サイト  ..かけだし(1,315ポイント)   Date: 2007/06/17(日) 21:38   No:8713     
Title: Re:無題    
それだけだと詳しくはわかりませんので、
include部分を教えてもらえませんか?


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

Name: ジミさん  ..ぴよぴよ(532ポイント)   Date: 2007/06/17(日) 21:47   No:8714     
Title: Re:無題    
失礼しました。
------ ビルド開始: プロジェクト: test1, 構成: Debug Win32 ------
コンパイルしています...
DrawPixel1.cpp
c:\documents and settings\○○○○\my documents\visual studio 2005\projects\test1\dxlib.h(40) : fatal error C1083: include ファイルを開けません。'windows.h': No such file or directory
ビルドログは "file://c:\Documents and Settings\○○○○\My Documents\Visual Studio 2005\Projects\test1\Debug\BuildLog.htm" に保存されました。
test1 - エラー 1、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新、0 スキップ ==========
というエラーがデバック開始をしたら出ました。


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

Name: サイト  ..かけだし(1,356ポイント)   Date: 2007/06/17(日) 21:55   No:8716     
Title: Re:無題    
http://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=view&no=426

ここなんかはどうでしょう?


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

Name: ジミさん  ..ぴよぴよ(592ポイント)   Date: 2007/06/17(日) 22:08   No:8718     
Title: Re:無題    
私はPSDK-x86.exeというのをインストールできなかったのでその下にある、
Windows Server 2003 R2 SDK - March 2006 Edition ISO Downloadというのを
使用したのですがこれが関係しているのでしょうか?


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

Name: サイト  ..かけだし(1,601ポイント)   Date: 2007/06/17(日) 22:48   No:8721     
Title: Re:無題    
>私はPSDK-x86.exeというのをインストールできなかったのでその下にある、

http://www.microsoft.com/downloads/details.aspx?FamilyId=A55B6B43-E24F-4EA3-A93E-40C0EC4F68E5&displaylang=en#filelist

のPSDK-x86.exeがインストールできなかったのですよねぇ・・・。
試してみたところダウンロード・インストール出来たのでこれでいけるはずですが・・・。

>c:\documents and settings\○○○○\my documents\visual studio 2005\projects\test1\dxlib.h(40) : >>fatal error C1083: include ファイルを開けません。'windows.h': No such file or directory
>ビルドログは "file://c:\Documents and Settings\○○○○\My Documents\Visual Studio 2005>>>>>>\Projects\test1\Debug\BuildLog.htm" に保存されました。
>test1 - エラー 1、警告 0

もしかしてパスを通していないのでは?



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

Name: ジミさん  ..かけだし(1,037ポイント)   Date: 2007/06/17(日) 23:15   No:8725     
Title: Re:無題    
>私はPSDK-x86.exeというのをインストールできなかったのでその下にある、

http://www.microsoft.com/downloads/details.aspx?FamilyId=A55B6B43-E24F-4EA3-A93E-40C0EC4F68E5&displaylang=en#filelist

のPSDK-x86.exeがインストールできなかったのですよねぇ・・・。
試してみたところダウンロード・インストール出来たのでこれでいけるはずですが・・・。

Platform SDK をダウンロードしようとするときに、
「インストールパッケージを開くことができませんでした。パッケージが存在し、
アクセスできることを確認してください。またはアプリケーションベンダに問い合わせ
このパッケージが有効なWindowsインストーラパッケージであることを確認してください」
と表示されインストールできません、
OSはWindows XP Media Center Edition version2002 Service Pack2です


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

Name: ジミさん  ..かけだし(1,103ポイント)   Date: 2007/06/18(月) 18:59   No:8744 解決!     
Title: Re:無題    
今までの書き込むやサイトの説明をよく読み返した結果何とか解決することができました。
アドバイスを下さった方々ありがとうございました。


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



Name: きつね  ..ぴよぴよ(353ポイント)   Date: 2007/06/17(日) 23:23   No:8726       
Title: 文字のサイズ変更等について    
ループなどで一つ一つサイズやフォントを変えたい時に

while(ProcessMessage()==0&&CheckHitKey(KEY_INPUT_ESCAPE)==0){//ループ
RefreshTime = GetNowCount();//今の時間を取得
ClsDrawScreen();//画面消去

//フォントサイズ設定
SetFontSize(50);

// 描画する文字列の文字セットを変更します
ChangeFont( "MS 明朝" ) ;

//カウンターの値表示
DrawFormatString(0,0,GetColor(255,255,255),"%d",counter);

//フォントサイズ設定
SetFontSize(10);

// 描画する文字列の文字セットを変更します
ChangeFont( "MS Pゴシック" ) ;

//カウンターの値表示
DrawFormatString(50,0,GetColor(255,255,255),"%d",counter);

ScreenFlip();//画面入れ替え
counter++;//ループ回数カウント
}

このように(この文は説明のために適当に書きました、すいませんm(_ _)m)
DrawFormatStringの前に毎回SetFontSizeを入れて
実行させると、重くなってる気がするのですが
何かいい対処法ありませんか?


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


Name: 管理人 [URL]  ..伝説のハッカー(375,251ポイント)   Date: 2007/06/17(日) 23:34   No:8727     
Title: Re:文字のサイズ変更等について    
SetFontSize  描画する文字列のサイズをセットする
SetFontThickness  描画する文字列の文字の太さをセットする
ChangeFont  描画するフォントを変更する
ChangeFontType  文字列描画に使用するフォントのタイプを変更する

などのフォント変更系の関数は処理が重いので、ループの中で何度もよんでやるのは避けたほうがいいようです。

ですので

http://homepage2.nifty.com/natupaji/DxLib/dxfunc.html#R17N10

こちらの関数で、「フォントデータ」というものを作っておいて、そのフォントデータを使って描画する方法がいいでしょう。
DXライブラリ製作者様もそれを勧めていらっしゃいます。
このデータで書きたいときはDrawString関数ではなく、
上記リンク先でも説明されている通り、

DrawStringToHandle  指定のフォントデータで文字列を描画する
DrawFormatStringToHandle  指定のフォントデータで書式付き文字列を描画する

の関数を使ってください。


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

Name: 管理人 [URL]  ..伝説のハッカー(375,284ポイント)   Date: 2007/06/18(月) 10:17   No:8728     
Title: Re:文字のサイズ変更等について    
CheckHitKeyはもしループ内に2回以上使うのでしたら、こちらの関数を使うことをお勧めします。

http://homepage2.nifty.com/natupaji/DxLib/dxfunc.html#R5N28

短いプログラムならwhileの条件式内に書いておけば便利です。


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

Name: きつね  ..ぴよぴよ(370ポイント)   Date: 2007/06/18(月) 16:19   No:8743 解決!     
Title: Re:文字のサイズ変更等について    
情報ありがとうございます!
さっそくためしてみます!!


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



Name: ぁぃ  ..ぴよぴよ(281ポイント)   Date: 2007/06/18(月) 10:33   No:8729       
Title: 関数を用いるプログラム    
初めまして、大学の課題でC言語が出てましてわからないので質問させてください。

課題
関数factは、整数nを引数として以下のようにnの階乗(n!= 1x2x…xn)
を計算して戻す関数とする。

@nが1以上のとき⇒n!を返す
Anが0のとき  ⇒1を返す(0!は1)
Bnが負の値のとき⇒ー99を返す(エラーを知らせるため)

(関数のプロトタイプ宣言 int fact (int n) ;)

関数factを用いて、以下の(1)〜(3)を実行する@プログラムを作成しなさい。
(1)−5〜10の整数について、階乗を計算して表示する
(2)10個から5個を選ぶ順列の総数(10P5)を計算して表示する
(3)10個から3個を選ぶ組み合わせ総数(10C3)を計算して表示する

C言語が全くわからないのですが、このような課題を出されて困ってます。
もうすぐ提出なのに・・・。
宜しければ教えてください。
フローチャートも書かなくてはいけなくて・・・。


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


Name: 管理人 [URL]  ..伝説のハッカー(375,343ポイント)   Date: 2007/06/18(月) 12:33   No:8730     
Title: Re:関数を用いるプログラム    
C言語が全くわからないと言うことですが、どの辺まで理解してらっしゃいますか?
条件文は解るとか、関数の作り方や返り値の意味は理解しているとか、教えていただかないとどこからお伝えすればいいのかわかりませんので。


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

Name: バグ  ..熟練のプログラマー(48,250ポイント)   Date: 2007/06/18(月) 12:42   No:8731     
Title: Re:関数を用いるプログラム    
授業ではどこまで習っていますか?
また、習っていても分からないというのであれば、どこまで分かっていて、どこからが分からないですか?

課題を見る限りでは、変数、分岐、繰り返し、関数…辺りまでは習っているようですけど…どうでしょう?


それから…

>>(1)−5〜10の整数について、階乗を計算して表示する
>>(2)10個から5個を選ぶ順列の総数(10P5)を計算して表示する
>>(3)10個から3個を選ぶ組み合わせ総数(10C3)を計算して表示する

この3つ、プログラム上ではなくて、自分の頭の中で計算して答えを求めるまでの流れは分かっていますか?
分かるようならば、書き込みしてみてください。もし、分からないようであれば課題を出した人へ質問しに行きましょう。


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

Name: ぁぃ  ..ぴよぴよ(491ポイント)   Date: 2007/06/18(月) 13:54   No:8737     
Title: Re:関数を用いるプログラム    
>>管理人さん

#include<stadio.h>

main()
{

この中に色々と入れる

}

くらいしかわかってません。


唯一わかるのは、【変数a = 10, b = 7のとき、 C = a - bを出力するプログラム】の作成です。

#include<stadio.h>

main(void)
{
int a,b,c;

a = 10;
b = 7;
c = a - b;
printf("%d - %d = %d\n" ,a,b,c);
}
となる事くらいです。


printf("")の""の中には、全角の文字を入れても良い。
main()ろmain(void)は同じ意味。
このような基本的な事しかわかってません・・・。


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

Name: ぁぃ  ..ぴよぴよ(611ポイント)   Date: 2007/06/18(月) 14:03   No:8738     
Title: Re:関数を用いるプログラム    
>>バクさん

はい、変数、分岐、繰り返し、関数…辺りまで・・・その通りです。
(1)はいまいちわかりませんが、
(2)は、10P5 = 10*9*8*7*6 = 30240
(3)は、10C3 =分数計算より、120

こういう事でしょうか?


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

Name: box  ..比類無きプログラマー(71,668ポイント)   Date: 2007/06/18(月) 14:25   No:8739     
Title: Re:関数を用いるプログラム    
順列と組合せの数を求める一般式の中に、
階乗の計算を含みます。
一般式について、ネット上で探したり高校の数学の教科書を
読み返したりしてみてください。

課題(1)で、階乗を計算する関数が出来上がれば、
課題(2)と(3)ではその関数を使うことになります。

というわけで、まずは課題(1)に全力を注いでください。

完成したコードを示すことは簡単ですが、
それではご自身のためにならないので控えておきます。


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

Name: バグ  ..熟練のプログラマー(48,381ポイント)   Date: 2007/06/18(月) 15:00   No:8741     
Title: Re:関数を用いるプログラム    
例えば、ぁぃさんの書かれたプログラムの引き算の部分を関数にすると、こんな感じになります。


#include<stdio.h>

int hikizan(int a, int b)
{
return (a - b);
}

void main(void)
{
int a, b, c;

a = 10;
b = 7;
c = hikizan(a, b);
printf("%d - %d = %d\n", a, b, c);
}


こういう関数の使い方は、なんとなく分かりますか?


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

Name: 管理人 [URL]  ..伝説のハッカー(375,475ポイント)   Date: 2007/06/18(月) 15:07   No:8742     
Title: Re:関数を用いるプログラム    
まず、
http://www5c.biglobe.ne.jp/~ecb/c/c00.html
こちらの7章までの内容を熟読して理解してからの方が早いと思います。
示されたコードなどを見てもわからないまま見ているだけではそちらの方が理解が遅いと思います。
書いてある内容を読んでそのつどコンパイルしながら確認していってください。


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



Name: ひろ  ..ぴよぴよ(61ポイント)   Date: 2007/06/13(水) 18:30   No:8580       
Title: C++でWindowsAPIを使いたい    
久しぶりにお世話になろうと思います。
3ヶ月以上来ていなかったので、ポイントもリセットされてしまったみたいですね。。。

早速ですが

WindowsAPIで作成したウインドウでコマンドボタンを押したら
ディレクトリ配下のファイルの一覧がテキストで表示される

というプログラムをC++のクラスやコンストラクタを使って作成しなければ
ならないのですが、参考になるようなHPなどを教えてください。


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


Name: YuO  ..初心者(5,001ポイント)   Date: 2007/06/13(水) 18:52   No:8581     
Title: Re:C++でWindowsAPIを使いたい    
何が解らないのですか?
WinAPIの知識とC++の知識は基本的に直交しているはずなので,どっちも理解していれば組み合わせるだけですが。


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

Name: asd  ..中級者(14,579ポイント)   Date: 2007/06/13(水) 18:56   No:8582     
Title: Re:C++でWindowsAPIを使いたい    
まずは検索してみたのでしょうか?
分からないことがあったらまずは検索してみるといいですよ^^
Google検索 c++ windowsapi ファイル操作


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

Name: ひろ  ..ぴよぴよ(183ポイント)   Date: 2007/06/14(木) 09:20   No:8598     
Title: Re:C++でWindowsAPIを使いたい    
ありがとうございます。

>YuOさん
どっちの知識も覚えたばかりで、組み合わせ方がわかりません。

>asd
検索してみていろいろなサイトを見たのですが、
C++とAPIの組み合わせについて載っているサイトが見つかりませんでした。


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

Name: バグ  ..熟練のプログラマー(47,472ポイント)   Date: 2007/06/14(木) 09:46   No:8600     
Title: Re:C++でWindowsAPIを使いたい    
画像を拝見した限りではMFCをお使いみたいですね?
それでしたら、CFileFindクラスをMSDNで検索してみると良いかもしれません(^-^)


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

Name: asd  ..中級者(14,804ポイント)   Date: 2007/06/14(木) 09:58   No:8601     
Title: Re:C++でWindowsAPIを使いたい    
> 検索してみていろいろなサイトを見たのですが、
> C++とAPIの組み合わせについて載っているサイトが見つかりませんでした。

コピペしてそのまま動くサンプルが転がっているとは限りませんが、
C/C++でWindowsAPI(Win32API)を使うサンプルならいくつもあるみたいです。

またWindowsAPIだけで検索しても大体C/C++で書かれているので参考になると思います。

まずは具体的にどのAPIが使えそうなのか探しませんか?
ドンピシャリなサンプルがないからと諦めていたら勉強にならない気がします。
作らなければならない状況にあるのならまずはいろいろ探して作ってみませんか?

参考になればどうぞ^^
WindowsAPIによるVisualC++入門
http://www.st.chukyo-u.ac.jp/h104049/VC_0/VC_0.html


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

Name: ひろ  ..ぴよぴよ(750ポイント)   Date: 2007/06/18(月) 13:35   No:8733     
Title: Re:C++でWindowsAPIを使いたい    
バグさん、asdさん、ありがとうございました。
いろいろ調べて、とりあえずC言語で作ってみたのですが、
WM_COMMANDのHWNDに値が継承できません。
何が問題なのでしょうか?

まだ開始ボタンの動作は入れてないのですが、
ラジオボタンにチェックを入れるとチェックボタンを無効にしたり
できるはずなのですが・・・

あと何かアドバイスがあればお願いします。

#include <windows.h>
#include "hdr\Primitive.h"

#define cID_StartBtn 0
#define cID_EndBtn 1
#define cID_DisplayChk 2
#define cID_DaySizeChk 3
#define cID_PassEdt 4
#define cID_TreeRdo 5
#define cID_ListRdo 6

// -----------------------------------------------------------------
// ウィンドウ・クラスの登録
// -----------------------------------------------------------------
BOOL InitApp(HINSTANCE hInstance, WNDPROC fnWndProc){
WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = fnWndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = NULL;
wc.hCursor = LoadCursor(NULL , IDC_ARROW);
wc.hbrBackground = (HBRUSH)COLOR_APPWORKSPACE+1;
wc.lpszMenuName = NULL;
wc.lpszClassName = "TreeClass";
return (RegisterClass(&wc));
}

// -----------------------------------------------------------------
// ウィンドウの生成
// -----------------------------------------------------------------
DEF_BOOL InitInstance(HINSTANCE hInstance, int inCmdShow){
HWND hwnd;
hwnd = CreateWindow("TreeClass",
"ディレクトリ表示ツール(miyata)",
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
0, 0, 600, 250, NULL, NULL,
hInstance, NULL);

return TRUE;
}


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

Name: ひろ  ..入門者(2,647ポイント)   Date: 2007/06/18(月) 13:36   No:8734     
Title: Re:C++でWindowsAPIを使いたい    
ソースの続きです
よろしくお願いします

// -----------------------------------------------------------------
// ウィンドウプロシージャ
// -----------------------------------------------------------------
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp){
HWND hbtnENTER, hbtnEND, hedtDIR, hchkSIZE,
hchkFILE, hrdoTREE, hrdoLIST;

HANDLE hFILE = NULL, hFind = NULL;
HINSTANCE hInst;
// -------------------------------------------------------------
// hInstanceの情報を取得
// -------------------------------------------------------------
hInst = (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE);

switch (msg) {
// ---------------------------------------------------------
// 子ウィンドウの生成
// ---------------------------------------------------------
case WM_CREATE:
hbtnENTER = CreateWindow("BUTTON", "実行",
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
400, 180, 80, 25,
hwnd, (HMENU)cID_StartBtn, hInst, NULL);
hbtnEND = CreateWindow("BUTTON", "終了",
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
490, 180, 80, 25,
hwnd, (HMENU)cID_EndBtn, hInst, NULL);
hchkFILE = CreateWindow("BUTTON", "ファイルを表示する",
WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX ,
250, 120, 170, 20,
hwnd, (HMENU)cID_DisplayChk, hInst, NULL);
hchkSIZE = CreateWindow("BUTTON", "ファイルの日付とサイズを表示する",
WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX ,
250, 140, 275, 20,
hwnd, (HMENU)cID_DaySizeChk, hInst, NULL);
hedtDIR = CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "C:\\Program Files",
WS_CHILD | WS_VISIBLE |WS_BORDER,
170, 20, 400, 23,
hwnd, (HMENU)cID_PassEdt, hInst, NULL);
CreateWindow("STATIC", "ディレクトリ パス",
WS_CHILD | WS_VISIBLE,
20, 20, 150, 20,
hwnd, NULL, hInst, NULL);
CreateWindow("STATIC", "オプション:",
WS_CHILD | WS_VISIBLE,
200, 90, 150, 20,
hwnd, NULL, hInst, NULL);
CreateWindow("BUTTON", "表示モード",
WS_CHILD | WS_VISIBLE | BS_GROUPBOX,
15, 90, 170, 80,
hwnd, NULL, hInst, NULL);
hrdoTREE = CreateWindow("BUTTON", "ツリー構造",
WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON | WS_GROUP ,
30, 120, 100, 20,
hwnd, (HMENU)cID_TreeRdo, hInst, NULL);
hrdoLIST = CreateWindow("BUTTON", "ファイルリスト",
WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON,
30, 140, 130, 20,
hwnd, (HMENU)cID_ListRdo, hInst, NULL);
SendMessage(hrdoTREE, BM_CLICK, 0, 0);
break;


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

Name: ひろ  ..入門者(2,774ポイント)   Date: 2007/06/18(月) 13:37   No:8735     
Title: Re:C++でWindowsAPIを使いたい    
もうひとつ続きです

// ---------------------------------------------------------
// イベント取得
// ---------------------------------------------------------
case WM_COMMAND:
switch (LOWORD(wp)){
case cID_ListRdo:
if(SendMessage(hrdoLIST, BM_GETCHECK, 0, 0) == DEF_TRUE){
SendMessage(hchkFILE, BM_SETCHECK, BST_CHECKED, 0);
EnableWindow(hchkFILE, DEF_FALSE);
EnableWindow(hchkSIZE, DEF_TRUE);
}
break;
case cID_TreeRdo:
if(SendMessage(hrdoTREE, BM_GETCHECK, 0, 0) == DEF_TRUE){
SendMessage(hchkSIZE, BM_SETCHECK, BST_UNCHECKED, 0);
EnableWindow(hchkFILE, DEF_TRUE);
EnableWindow(hchkSIZE, DEF_FALSE);
}
break;
case cID_StartBtn:
DWORD dwWriteSize;
WIN32_FIND_DATA fd;
DEF_INT8 lachDirPass[400];
DEF_INT8 lachSearchPass[400];
memset(lachDirPass, '\0', strlen(lachDirPass));
memset(lachSearchPass, '\0', strlen(lachSearchPass));
if(GetWindowText(hedtDIR, lachDirPass, strlen(lachDirPass)) == 0){
MessageBox(NULL, "ディレクトリパスの取得に失敗しました",
"エラー", MB_OK);
SendMessage(hwnd, BM_CLICK, 0, 0L);
}

memcpy(lachSearchPass + strlen(lachSearchPass), "\\*", 3);

hFILE = CreateFile(
"tree.txt", GENERIC_WRITE, 0, NULL,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFILE == INVALID_HANDLE_VALUE) {
MessageBox(NULL, "ファイルを作成できませんでした",
"エラー", MB_OK);
SendMessage(hwnd, BM_CLICK, 0, 0L);
}
if(SendMessage(hrdoTREE, BM_GETCHECK, 0, 0) == DEF_TRUE){
WriteFile(hFILE, lachDirPass, strlen(lachDirPass), &dwWriteSize, NULL);
WriteFile(hFILE, lachDirPass, strlen(lachDirPass), &dwWriteSize, NULL);
if(SendMessage(hchkSIZE, BM_GETCHECK, 0, 0) == DEF_TRUE){
}
else{
}
}
else{
if(SendMessage(hchkFILE, BM_GETCHECK, 0, 0) == DEF_TRUE){
}
else{
}
}
break;
case cID_EndBtn:
SendMessage(hwnd, WM_CLOSE, 0, 0L);
break;

}
case WM_PAINT: break;

case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProc(hwnd, msg, wp, lp);
}

DEF_INT32 WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR lpCmdLine, int inCmdShow ) {
MSG msg;

if(!InitApp(hInstance, WndProc))
return FALSE;
if(!InitInstance(hInstance, inCmdShow))
return FALSE;
while(GetMessage(&msg, NULL, NULL, NULL)){
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}


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

Name: ひろ  ..入門者(2,794ポイント)   Date: 2007/06/18(月) 13:41   No:8736     
Title: Re:C++でWindowsAPIを使いたい    
すみません。
で囲むの忘れてました。。。



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

Name: YuO  ..初心者(7,293ポイント)   Date: 2007/06/18(月) 14:29   No:8740     
Title: Re:C++でWindowsAPIを使いたい    
> いろいろ調べて、とりあえずC言語で作ってみたのですが、
> WM_COMMANDのHWNDに値が継承できません。
> 何が問題なのでしょうか?

えーっと,継承?

hbtnENTERとかの値が残っていないというのであれば,当たり前の話です。
変数の寿命について調べてみてください。
単に,WM_CREATEの時のhbtnENTERとWM_COMMANDの時のhbtnENTERは名前が同じだけで,別のオブジェクトですよ。

FindWindowで毎回探すか,SetProp/GetPropとかを使ってデータを保存しておくか,などの対策をする必要があります。
# staticはオブジェクト指向へ持って行くのにあまりにもかけ離れると思ったので除外。


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

Name: ひろ   Date: 2007/07/03(火) 11:28   No:85801183429688 解決!     
Title: Re:C++でWindowsAPIを使いたい    
お礼を入れるのを忘れてました(^^;)

おかげさまで解決することができました!
ありがとうございます。




Name: ジミさん  ..ぴよぴよ(45ポイント)   Date: 2007/06/16(土) 21:54   No:8687       
Title: 無題    
DrawPixel.cpp
c:\documents and settings\○○○○\my documents\visual studio 2005\projects\test\test\drawpixel.cpp(1) : fatal error C1083: include ファイルを開けません。'DxLib.h': No such file or directory
ビルドログは "file://c:\Documents and Settings\○○○○\My Documents\Visual Studio 2005\Projects\test\test\Debug\BuildLog.htm" に保存されました。

という文章の意味が分からないのですが、誰か教えてもらえると助かります。(初心者です)


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


Name:  ..入門者(2,987ポイント)   Date: 2007/06/17(日) 00:04   No:8689     
Title: Re:無題    
えっと、多分includeするファイルが見つからないんだと思いますので、ソース内できちんと参照されているか見てみてはどうでしょうか?

わからない時は検索で[参照]とでもしてみれば、出てくるかと思いますが…出てくるかな?w



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

Name: ジミさん  ..ぴよぴよ(69ポイント)   Date: 2007/06/17(日) 17:46   No:8701     
Title: Re:無題    
ありがとうございます。試してみます。


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

Name: 管理人 [URL]  ..伝説のハッカー(374,950ポイント)   Date: 2007/06/17(日) 22:51   No:8723     
Title: Re:無題    
>'DxLib.h': No such file or directory

というのはDXライブラリに必要なヘッダファイルがないという表示です。
サンプルプログラム実行用フォルダで実行されたらこのようなことはおきないと思いますが、
自分でプロジェクトを作ったりすると、同じフォルダにヘッダいファイルもコピーしないといけないのを忘れたりしてこのようなログが出ているのだと思います。
また、ソースファイルを別のフォルダに保存したのなら、そのヘッダファイルがどこにあるか相対パスで書いてやる必要があります。

「プロジェクトに追加すべきファイル_VC用」というフォルダが配布データの中にあるはずですので、プロジェクトを作ったときはそれを追加してください。


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

Name: ジミさん  ..ぴよぴよ(781ポイント)   Date: 2007/06/17(日) 23:14   No:8724     
Title: Re:無題    
ありがとうございます。
あとPlatform SDK をダウンロードしようとするときに、
「インストールパッケージを開くことができませんでした。パッケージが存在し、
アクセスできることを確認してください。またはアプリケーションベンダに問い合わせ
このパッケージが有効なWindowsインストーラパッケージであることを確認してください」
と表示されインストールできません、これについても回答をお願いします。
OSはWindows XP Media Center Edition version2002 Service Pack2です


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



Name:  ..上級者(18,002ポイント)   Date: 2007/06/14(木) 22:49   No:8621       
Title: バックトラックプログラミング    
お久しぶりです。
また、ご指導をもらいに来ました。
よろしくお願いします。

今、『正整数nの分割を全て求めるプログラム』を作っています。
このような実行結果を期待しているんです。

n: 5
1 + 1 + 1 + 1 + 1
1 + 1 + 1 + 2
1 + 1 + 3
1 + 2 + 2
1 + 4
2 + 3
5
total number = 7



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


Name: Hermit  ..初心者(8,371ポイント)   Date: 2007/06/14(木) 22:55   No:8622     
Title: Re:バックトラックプログラミング    
ちょっと違うけど、
http://www.play21.jp/board/formz.cgi?action=res&resno=8255&page=&lognum=26&id=dixq&rln=8331#8255
あたりは参考になりませんか?


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

Name:  ..上級者(17,796ポイント)   Date: 2007/06/14(木) 22:56   No:8624     
Title: Re:バックトラックプログラミング    
今途中なのですが、私が作ったのは以下のプログラムです。。

# include <studio.h>

int part(int total,int min){
/*total をmin以上の数を使って分割する方法の数*/

int sub; /*分割の候補*/
int cnt=0;  /*分割法の数*/

/*1つの解発見*/
if(total==0) cnt=1;
else{
/*total=sub+...と分割する方法の和*/

for(sub=min;sub<=total;sub++){
cnt+=part(total-sub,sub);
}
}
return cnt;
}

int main(void){

int n;
printf("n: ");
scanf("%d",&n);

printf("total number=%d\n",part(n,1));

return 0;
}

これでコンパイルも結果もきちんとできるんですけど・・・
まだ分割方法を全て表示できてないんですよねぇ。。。。


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

Name:  ..上級者(17,831ポイント)   Date: 2007/06/14(木) 23:01   No:8625     
Title: Re:バックトラックプログラミング    
考え方的には・・・・

int part(int total, int min, int divNum)として、、、、
total を min 以上の数を使って分割する方法の数を返す。
divNum 回目の分割で,解を発見した時、ans[0] 〜 ans[divNum-1]
までを出力する。解が見つかっていない時は,ans[divNum] に分割した数(sub) を代入する。

というイメージをしているんですけど・・・
こういう考え方でいいんでしょうか??


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

Name: しっぽ  ..初心者(8,226ポイント)   Date: 2007/06/14(木) 23:55   No:8626     
Title: Re:バックトラックプログラミング    
> これでコンパイルも結果もきちんとできるんですけど・・・
> まだ分割方法を全て表示できてないんですよねぇ。。。。

どんな数値を入力したら、どんな分割の場合が不足しているのでしょうか?


本質には関係ないけど、インデントしてください。
あと scanf は戻り値のチェックが不足してます。


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

Name:  ..上級者(17,946ポイント)   Date: 2007/06/15(金) 09:00   No:8635     
Title: Re:バックトラックプログラミング    
1 + 1 + 1 + 1 + 1
1 + 1 + 1 + 2
1 + 1 + 3
1 + 2 + 2
1 + 4
2 + 3
5

↑の部分が出るプログラムになってなぃんです。

Hermitサン、ありがとうございます★
ちょっと違ったんですが、参考にしてみました。


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

Name: しっぽ  ..初心者(8,490ポイント)   Date: 2007/06/15(金) 22:21   No:8662     
Title: Re:バックトラックプログラミング    
> ↑の部分が出るプログラムになってなぃんです。

インデントがなく読みにくくて、見落としてましたが、
答えを入れておくバッファーさえもないとは!


http://www.play21.jp/board/formz.cgi?action=res&resno=8255&page=&lognum=26&id=dixq&rln=8331#8255
の 2007/06/05(火) 21:40 の記事のコードをちょっと変更すればできますので、
☆さんのものと比較してみてください。



//#define MAXVALUE 39
#define MAXVALUE 20

// static char str[(MAXVALUE + 1) * 2] = {0};
static char str[MAXVALUE * 4] = {0};


// sprintf(str + pos, "%d ", j);
if(pos > 0)
sprintf(str + pos, " + %d", j);
else
sprintf(str, "%d", j);



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

Name:  ..上級者(17,992ポイント)   Date: 2007/06/17(日) 22:29   No:8720     
Title: Re:バックトラックプログラミング    
おそくなりました。

すみません。。。見にくいですよねぇ。。。
申し訳ありません↓↓

はい、今から参考にさせてもらいます。
ありがとうございます。


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



Name: ジミさん  ..ぴよぴよ(308ポイント)   Date: 2007/06/17(日) 19:56   No:8706       
Title: インストラーパッケージが有効ではない    
すみませんが誰かよろしくお願いします。
OSはWindows XP Media Center Edition version2002 Service Pack2を使っています。
インストラーパッケージが有効ではない というのを解決するにはどうすればよいのでしょうか?


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


Name: サイト  ..かけだし(1,304ポイント)   Date: 2007/06/17(日) 21:52   No:8715     
Title: Re:インストラーパッケージが有効ではない    
http://support.citrix.com/article/CTX104624

ここら辺を参考にしてみては?


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

Name: ジミさん  ..ぴよぴよ(542ポイント)   Date: 2007/06/17(日) 21:56   No:8717 解決!     
Title: Re:インストラーパッケージが有効ではない    
ありがとうございます。
早速試してみます。
また何かあったらよろしくお願いします。


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



Name: ビスタ  ..ぴよぴよ(671ポイント)   Date: 2007/06/15(金) 13:21   No:8647       
Title: ソートのフローチャート    
度々すみません;
ちなみにコレも学校の課題です…。

環境はSUSE-Linux9.0 コンパイラ:gcc
C言語です。

クイックソート、バブルソートのフローチャートが分かりません…。
なんとかアルゴリズムは理解してるつもりですが…
どうやって書けばいいのか分からないんです。

ちなみに扱う数はランダムです。

個人的な解釈では
クイックソート:適当な数をピボットに決めて、その前後(左右)で大小に分割することを繰り返す。
バブルソート:隣同士で比べて順番を入れ替えることを繰り返す。

です。

ソートのフローチャートに付随してこっちの質問もお願いします。

配列の大きさが1以下なら何もしない というプログラムがあるのですが
「何もしない」っていうのは終了扱いでいいんですか?


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


Name: 管理人 [URL]  ..伝説のハッカー(372,817ポイント)   Date: 2007/06/15(金) 19:04   No:8656     
Title: Re:ソートのフローチャート    
クイックソートは
http://dixq.net/sort.html
この辺のアプリみてもらったらアルゴリズムがわかっていただけるかもしれません^^
プログラムコードがあればフローチャートは簡単です。
上記URLの最下部にソースも書いてありますので、
それを見ながら1行ずつ書いていけば完成しますよ。

フローチャートの描き方がわからなければ「フローチャート」で検索するとわんさかでてくるので参考にしてみてください。


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

Name: ビスタ  ..ぴよぴよ(854ポイント)   Date: 2007/06/16(土) 02:17   No:8678     
Title: Re:ソートのフローチャート    
回答ありがとうございます。

書き方が分からない、というのは…ソースからの書き起こしが出来ないんです。
検索してはみましたが…記号の使い方とかフローチャートのみでソース無しとかが
見た限りでは殆どでした。

現在の家のNPCが死ぬ寸前(ネットつけただけで落ちることが希にある。立ち上げに20分かかる等)
なのでソースからフローチャートを書き起こすソフトもDLは厳しいです。

情報工学科としてある意味失格ですが…PC知識はかなり低レベルな域なので
不用意にいじれない状態ですが、電気屋が遠いのと初期化に時間がかかるため
夏休みまではこの状態です;

記号と英数字だけではどうにも書けませんでした…。
こういう場合文章的なフローチャートでも
フローチャートとして見なされるものなのでしょうか…


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

Name: 管理人 [URL]  ..伝説のハッカー(374,963ポイント)   Date: 2007/06/17(日) 21:20   No:8712     
Title: Re:ソートのフローチャート    
土日は家にいえなかったもので、回答が遅れましたm(_ _)m

>書き方が分からない、というのは…ソースからの書き起こしが出来ないんです。

つまりソースからフローチャートを作成したいんですよね?
if文はひし形を使った図の中に条件式を書いて、YES,NOで分岐させるとかそういうのはネットで参考になる資料が見つかりますよね?
それをソースの通り組み合わせれば出来ると思いますが、どうでしょうか?
どの辺でつまづいていますか?
フローチャートを書くソフトは何を使うつもりですか?
私はマイクロソフト製のVisioを使っていますが、パワーポイントなんかでも作ろうと思えば作れると思います。
情報工学科なら学校で専門のソフトを貸し出ししているのではないでしょうか?
一度事務や先生に聞いてみるといいと思います。
家のPCがダメなら学校にあるPCを使ってみてはいかがでしょう。きっと専門的なソフトは入っているのではないかと思いますし。

フローチャートにも色々ありますし、色んな解釈があると思いますので、先生の期待するものならいいのではないかと思いますし、どのようにかけばいいか先生に聞いてみるのが一番ではないでしょうか。

>配列の大きさが1以下なら何もしない というプログラムがあるのですが
>「何もしない」っていうのは終了扱いでいいんですか?

何もしないというのは範囲によりますが、もし流れの中で何もしないならif文を実行しないとかそういうことでしょうし、
関数を範囲として何もしないならreturnを、全てを範囲にして何もしないならそのまま終了すればいいものと思います。


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



Name: EL-ZELK  ..ぴよぴよ(247ポイント)   Date: 2007/06/13(水) 23:53   No:8589       
Title: BCCで作ったプログラムに関して    
はじめまして。
最近、無料であるBCC(コンパイラ、デベロッパー等)を使ってゲームを作ろうと
C++を学び始めたのですが、疑問が出てきました。

無料のBCC(コンパイラ、デベロッパー)で自分で作ったゲーム(プログラム)に関して、

1.ダウンロードさせる形式で勝手に無償公開してもいいのか
  (○○してから公開しなきゃいけない、みたいな条件はないか?)

2.同人ゲームのような「有料での販売」はできるのか
  (この環境を使った開発では”有料販売”はできない、みたいなのはないか?)

上記2点に関して様々なサイトを巡っても、付属していたライセンスの事項を見ても
載っていない…及び理解ができなく、気軽に聞けそうな場所が無いかと探していたところ
この場を見つけたので質問させていただきます。

どなたか、教えていただけましたら幸いです。


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


Name: YuO  ..初心者(5,936ポイント)   Date: 2007/06/14(木) 00:32   No:8593     
Title: Re:BCCで作ったプログラムに関して    
----予防線 ここから----
以下は,法律家ではない一般人であるYuOがBorland C++ Compiler 5.5.1の使用許諾契約を読んで,個人の知識と感性の範囲内において記述したものです。
以下の記述についての契約等における正確さに,一切の保証はない物とします。
以下の内容について,YuOおよび管理人他掲示板運営者は一切の責任を負わない物とします。
上記記載条項に同意できない場合は,この記事を読み飛ばしてください。
----予防線 ここまで----


使用許諾契約に則っている限り,問題ないです。

まず,あなたは
・アプリケーションをコンパイルすること
を許諾されています。そして,
・作成したプログラムをコピー,配布すること
も許諾されています。そして,
・有料でコピー・配布すること
は禁じられていません。よって,その他の条項を守る限り,問題は起きないと思います。

他に予期せず使用許諾契約を破ってしまうこととしては,再配布可能でないバージョンのライブラリをリンクすることがあります。
VC++だと,デバッグ版のまま配布しようとするパターンがありがちです。
BCCでも一応-DNDEBUGをつけてコンパイルしたものを配布するのがよいでしょう。
あと,著作権表示を要求しているので,
> (i)お客様が作成するプログラムのすべてのコピーには、有効な 著作権表示があること、これはお客様の著作権表示または本ソフトウェアで表示するインプライズの著作権表示のどちらか。
これを忘れないようにしましょう。


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

Name: EL-ZELK  ..ぴよぴよ(529ポイント)   Date: 2007/06/15(金) 01:05   No:8628     
Title: Re:BCCで作ったプログラムに関して    
お答えいただきありがとうございます。
成る程…自力の理解では限界があったので助かります。
(予防線を了承した上での返信です)

コンパイルには種類がある…という事ですかね。
BCCデベロッパーではプロジェクト→プロジェクト設定→コンパイル3
から、条件に”DNDEBUG”を追加して使用すればいいのでしょうか?

もう一つ、著作権表示は「このプログラムの著作権は××が有しております云々…」
等を配布物などに付属させるReadmeなどに記述しておく事なのでしょうか。
それとも何か特殊な記述をプログラム内に組み込むのでしょうか…?

質問ぜめで申し訳ありませんが、お答えいただければ幸いです。
どうかよろしくお願いいたします。


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

Name: 管理人 [URL]  ..伝説のハッカー(373,724ポイント)   Date: 2007/06/16(土) 01:13   No:8671     
Title: Re:BCCで作ったプログラムに関して    
そういえばDXライブラリも、このライブラリで製作したものを販売する事に問題ないと、書いてありました。
コードも含めて配布する時は著作権表示のみ必要なようです。


>・DXライブラリの著作権は山田 巧が保持します。
>・無料ソフト、有料ソフト問わず、DXライブラリを使用して作成されたソフトウエアに対するライセンス料等は(商用利用・法人利用問わず)一切発生しません。
>・DXライブラリを使用して作成されたソフトウエアにDXライブラリを使用した旨を記載する必要はありません。(記載されれば嬉しいですが)
>・下記の機能を使用した場合は、配布するソフトウエアのドキュメント等に各機能に応じた著作権表示を含めてください。


ただ販売するとなると、それはプログラムうんぬんの問題ではなく、年間10万以上でしたっけ?売り上げると役場に申告する必要が出てきますので、
ちょっとした売れ行きを予想されている場合はそういうところも注意してください。
おそらく、後から見つかった場合は申告漏れとして1.5倍の税金を払わされるのではなかったでしょうか・・。
どこかで見た記事を思い出しながら書いているだけなので、全く責任もてませんし、最終的な判断は自分で調べてからにしてくださいね^^;
ちょっと調べてみます。

著作権表示は義務ではなくて自分の著作権を守るためのものではないでしょうか?
ただネットで販売する時は「特定商取引に基づく表示」というものを良く見かけます。
物を販売する場合は、販売元の情報を明記しないといけないようです。
また、製造物責任法というものもあり、売ったものには責任を持つなど色々かかわってくると思います。
「無償ダウンロード」と「有償ダウンロード」は結構かわってくると思います。

もし本格的に行うなら税理士さんに相談するのも手かと思います。そうすると安心して販売できるのではないでしょうか。


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

Name: 管理人 [URL]  ..伝説のハッカー(373,744ポイント)   Date: 2007/06/16(土) 01:17   No:8672     
Title: Re:BCCで作ったプログラムに関して    
年間20万以上でした。
シゴトを持っているのに、申告するとそれは副業ということになり、ほとんどの会社が禁止していると思いますが、会社ばれると懲戒免職になりかねないので、その辺は注意した方がいいかもしれません。

ただしそれに当たる人と当たらない人がいたり、色々他の法律がからんできたりと結構めんどくさそうです。
よくわからないので、もし本格的になさるのならやはり税理士さんか誰かに聞いてみてください。


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

Name: EL-ZELK  ..ぴよぴよ(422ポイント)   Date: 2007/06/17(日) 19:12   No:8705 解決!     
Title: Re:BCCで作ったプログラムに関して    
管理人様、ありがとうございます。

探れば探るほど複雑な事実が出てきて、中々大変ですね…
ある意味C++を理解するよりも(笑
申告云々は今回初めて知りました。

本格的に売ることはあまり考えていませんが、
今回教えてくださった情報を頭に入れておこうと思います。


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



Name: サイト  ..ぴよぴよ(175ポイント)   Date: 2007/06/15(金) 15:08   No:8649       
Title: キーボード入力について聞きたいのですが・・・    
はじめまして。わからないことがあって検索していたらここにたどり着きました。
早速質問ですが、C++言語を使ってwindow表示で入力した文字を表示するという簡単なプログラムを作っているのですが、ENTERを押すと「ポン」という音が鳴ってしまいます。動作には支障ないのですが、音を消す方法はありませんか?以下に簡略なソースを載せます。

LRESULT CALLBACK EditProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
int re;

if(iMsg == WM_KEYDOWN && wParam == VK_RETURN){
re = GetWindowText(hWndTextIn, buf, BUF_LENGTH);
SendMessage(hWndTextDisp, WM_SETTEXT, SAY_LENGTH, (LPARAM) buf);
InvalidateRect(cons.hWnd, NULL, TRUE);
}
if(iMsg == WM_KEYUP && wParam == VK_RETURN){
SendMessage(cons.hWndTextIn, WM_SETTEXT, BUF_LENGTH, (LPARAM) NULL);
}

return CallWindowProc(cons.fnoldedit, hwnd, iMsg, wParam, lParam);
}


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


Name: サイト  ..ぴよぴよ(550ポイント)   Date: 2007/06/15(金) 15:22   No:8651     
Title: Re:キーボード入力について聞きたいのですが・・・    
すみません。いきなりソースまちがえてました;

//hWndTextIn  入力ハンドル
//hWndTextDisp 出力ハンドル
//hWnd windowハンドル

LRESULT CALLBACK EditProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
int re;

if(iMsg == WM_KEYDOWN && wParam == VK_RETURN){
re = GetWindowText(hWndTextIn, buf, BUF_LENGTH);
SendMessage(hWndTextDisp, WM_SETTEXT, SAY_LENGTH, (LPARAM) buf);
InvalidateRect(hWnd, NULL, TRUE);
}
if(iMsg == WM_KEYUP && wParam == VK_RETURN){
SendMessage(hWndTextIn, WM_SETTEXT, BUF_LENGTH, (LPARAM) NULL);
}

return CallWindowProc(fnoldedit, hwnd, iMsg, wParam, lParam);
}


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

Name: しっぽ  ..初心者(8,521ポイント)   Date: 2007/06/15(金) 22:33   No:8663     
Title: Re:キーボード入力について聞きたいのですが・・・    
「ポン」と関係あるかは知りませんが、

SendMessage(hWndTextIn, WM_SETTEXT, BUF_LENGTH, (LPARAM) NULL);
は変です。第4引数で NULL を渡してます。
あと第3引数は利用できないはずですが、hWndTextIn のウィンドウを
サブクラス化して、WM_SETTEXT メッセージを処理しているという
ことでしょうか?



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

Name: サイト  ..ぴよぴよ(718ポイント)   Date: 2007/06/15(金) 23:55   No:8666     
Title: Re:キーボード入力について聞きたいのですが・・・    
返答ありがとうございます。

>SendMessage(hWndTextIn, WM_SETTEXT, BUF_LENGTH, (LPARAM) NULL);
>は変です。第4引数で NULL を渡してます。

のNULLは入力側のウィンドウの文字を消すためにこのようにしました。

>あと第3引数は利用できないはずですが、hWndTextIn のウィンドウを
>サブクラス化して、WM_SETTEXT メッセージを処理しているという
>ことでしょうか?

はい。そのとおりです。

どこがおかしいんだろう・・・


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

Name: しっぽ  ..初心者(8,537ポイント)   Date: 2007/06/16(土) 07:48   No:8680     
Title: Re:キーボード入力について聞きたいのですが・・・    
> NULLは入力側のウィンドウの文字を消すためにこのようにしました。

ウィンドウの文字を消すのなら、"" でしょう。


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

Name: サイト  ..ぴよぴよ(954ポイント)   Date: 2007/06/16(土) 17:14   No:8685     
Title: Re:キーボード入力について聞きたいのですが・・・    
NULLを""に変えてみたのですが、やはり「ポン」と鳴ってしまいます。
他の部分がおかしいのかもしれないのでソースを添付します。
判る人がおられましたら意見お願いします。

失礼ながら、resource.h・xxx.rc・アイコン等は入れてないのでビルドは通りません。


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

Name: Justy  ..ハッカー(118,704ポイント)   Date: 2007/06/16(土) 20:15   No:8686     
Title: Re:キーボード入力について聞きたいのですが・・・    
 その音はどんな音ですか?
 そのアプリ用に用意した音なのでしょうか?

 もし、そうでないのであればOSのイベントにサウンドが
割り当てられていたりしませんか?


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

Name: サイト  ..かけだし(1,082ポイント)   Date: 2007/06/17(日) 11:49   No:8693     
Title: Re:キーボード入力について聞きたいのですが・・・    
>その音はどんな音ですか?
>そのアプリ用に用意した音なのでしょうか?

いいえ、音は用意していません。

>もし、そうでないのであればOSのイベントにサウンドが
>割り当てられていたりしませんか?

煤@そうだと思います。どうやってサウンド割り当てを解除できるのでしょうか?


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

Name: Justy  ..ハッカー(124,114ポイント)   Date: 2007/06/17(日) 12:00   No:8694     
Title: Re:キーボード入力について聞きたいのですが・・・    
 なるほど。
 であれば、XPを使っているとして、コントロールパネルの「サウンドとオーディオデバイス」を
開いて、さらに「サウンド」タブの中で設定を変えることができます。

 ざっくりと「サウンド設定」をサウンドなしにすれば全部のイベントが
解除されます。


Windows XP ステップ バイ ステップ ガイド : サウンド設定を選択する
http://www.microsoft.com/japan/enable/training/windowsxp/soundscheme.mspx

各種のイベント音を消す:デジタルARENA
http://arena.nikkeibp.co.jp/article/tec/winxp/20070209/120840/


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

Name: サイト  ..かけだし(1,144ポイント)   Date: 2007/06/17(日) 12:11   No:8695     
Title: Re:キーボード入力について聞きたいのですが・・・    
調べてみたところ

一般の警告音
Windows XP Ding.wav

が、鳴ってるみたいです。

これは異常ではないのですか?


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

Name: Justy  ..ハッカー(124,396ポイント)   Date: 2007/06/17(日) 13:43   No:8698     
Title: Re:キーボード入力について聞きたいのですが・・・    
>これは異常ではないのですか?

 そのイベントはちょっとした喚起を促す程度のことでも発生するものなので、
気にしなくてもいいと思います。

 で、コンパネから設定しないのであれば、メッセージの処理(EditProc)で
WM_CHARのとき且つ押されたのが VK_RETURNなら何もしないようにすれば鳴らなくなります。


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

Name: サイト  ..かけだし(1,294ポイント)   Date: 2007/06/17(日) 14:15   No:8699 解決!     
Title: Re:キーボード入力について聞きたいのですが・・・    
ありがとうございました。
EditProcの最後に

if(wParam == VK_RETURN) return 0;

を書くと鳴らなくなりました。
しっぽさん、Justyさん本当にありがとうございました。
また問題にぶつかったときよろしくお願いします。


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



Name: tete  ..ぴよぴよ(172ポイント)   Date: 2007/06/16(土) 16:16   No:8684       
Title: 課題なんですけど・・    
わかりません(汗)OSはLinuxです。
自作シェルプログラム添付しときます。

<課題文>
作成した自作シェルプログラムに対して、実行が成功したコマンド(/bin/psなどです)をすべて保持するように改造する。
ーコマンドリスト保持のためのメモリ領域は1MBとし、動的に確保すること。
ーEOFにより終了が伝えられたら、成功したコマンドリストをすべて表示してから、終了すること。

これと合わせるそうです・・・
malloc(プログラム例)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define BUFSIZE(1*1024*1024)
#define NLINE 256
int main(){
char *buff, *bp;
bp = buff =(char *)malloc( sizeof(char)*BUFSIZE);
printf("> ");
while(fgets(bp,NLINE,stdin)!=NULL){
printf("%s",bp);
bp+=strlen(bp);
printf("> ")
}
printf("\n-------------------------------\n");
printf("%s\n",buff);
free(buff);
return 0;
}





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


Name: tete  ..ぴよぴよ(182ポイント)   Date: 2007/06/17(日) 12:12   No:8696     
Title: Re:課題なんですけど・・    
自力でできました^^:すみません。

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

Name: tete  ..ぴよぴよ(187ポイント)   Date: 2007/06/17(日) 12:19   No:8697 解決!     
Title: Re:課題なんですけど・・    
できました。。

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



Name: プロジェクト  ..ぴよぴよ(21ポイント)   Date: 2007/06/15(金) 21:25   No:8661       
Title: コンパイラについて    
Visual Studio 2005をおそらく正常にインストールしたのですが、

新規作成→プロジェクト

と選んだ後にどれを選んだらいいのかわかりません。
C言語を出来るようになりたいのですが教えてください。


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


Name: 管理人 [URL]  ..伝説のハッカー(373,167ポイント)   Date: 2007/06/15(金) 22:56   No:8664     
Title: Re:コンパイラについて    
お、もしかしてw

VS2005は

新規作成⇒プロジェクトでただのコンソール出力で空のプロジェクトでよければ

VisualC++の「全般」の「空のプロジェクト」を選択し、
「プロジェクト」欄に好きな名前を入力してOKを押します。
左に表示される「ソリューションエクスプローラー」の
「ソースファイル」を右クリックし、⇒「追加」⇒「新しい項目」で
C++ファイルを選択した状態で「ファイル名」を好きな名前で入力します。
OKを押すと完了です。
そこにプログラムを書き、Ctrl + F5を押してください。
コンパイル実行できます。


#include <stdio.h>
void main(){
printf("Hello World!!");
}



 
以上のプログラムをコピー貼り付けして実行してみてください。
コンソール画面に「Hello World!!」と表示されたら成功です。


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

Name: しっぽ  ..初心者(8,521ポイント)   Date: 2007/06/15(金) 23:50   No:8665     
Title: Re:コンパイラについて    
これはまずい。

void main(){


Name: Justy  ..ハッカー(117,549ポイント)   Date: 2007/06/16(土) 00:06   No:8667     
Title: Re:コンパイラについて    
 そういえば前にもそんなことを書いたような。
http://www.play21.jp/board/formz.cgi?action=res&resno=7745&page=&lognum=24&id=dixq&rln=7808#7800


 gcc3.4だと警告が出ますね。

warning: return type of 'main' is not `int'


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

Name: 管理人 [URL]  ..伝説のハッカー(373,250ポイント)   Date: 2007/06/16(土) 00:52   No:8670     
Title: Re:コンパイラについて    
わかってかいてます。わけあって書いています。

また、void mainでもVC++では警告も出ませんし、コンパイルも通ります。
理由は他の理由ですが、入門者、初めてコンパイラを導入した方に特にvoidかintかは問題ではないと思います。


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

Name: プロジェクト  ..ぴよぴよ(99ポイント)   Date: 2007/06/16(土) 10:06   No:8682 解決!     
Title: Re:コンパイラについて    
出来ました!!


”左に表示される「ソリューションエクスプローラー」”

が、表示されてなくて焦りましたが探せばありました。



ありがとうございました。これで目覚めたいとおもいます。


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

Name: プロジェクト   Date: 2007/07/16(月) 23:26   No:86611184595977     
Title: コンパイルについて    
visual studio2005でCtrl+F5と押してコンパイル?をすると、”指定されたファイルは見つかりません。”と出てきます。

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

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




Name:  ..かけだし(2,341ポイント)   Date: 2007/06/14(木) 01:26   No:8595       
Title: ポインタの扱い方・・・?    
test_1.txtに書かれた文字を読み出して、[ ]で囲まれた所だけを取り出し、取り出したものを加工して別のファイルに書き込むプログラムを作っているます。

一文字ずつ取り出して判別し、フラグで管理すれば、出来るかと思い、現在は一文字ずつ取り出すプログラムは作れたのですが、これを塊ごとで管理したいのですが、どうすればいいのかが分かりません。
取り出した、塊は比較して条件判断に使えるようにしたいと思っています。
ご教授願えないでしょうか?


=====出力結果======
あああabc
-123456
fafa
dfafa
===================

=====ファイル名:test_1.txt======
[あああabc][-123456]

[fafa]
[dfafa]

=====================================

=====ファイル名:web.c=============

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

#define READ_SET 3
#define READ_START 2
#define READ_END 1

void FileOpen(FILE *fin, FILE *fout); //ファイル関係の処理する所

int main()
{
FILE *fin, *fout;
char ss[256], name[256];

printf("作成ファイル名を入力してください。");
scanf("%s", name);

if( (fin = fopen("test_1.txt", "r")) == NULL )
{
printf("ファイルが見つかりません。");
exit(1); //return ; でもいいのかな?
}

if( (fout = fopen(name, "w")) == NULL )
{
printf("ファイルへの書き出しに失敗しました。");
exit(1);
}


FileOpen(fin, fout); //ファイル関係の処理する所

fclose(fin);
fclose(fout);

return 0;
}

void FileOpen(FILE *fin, FILE *fout)
{
int Read_1 = READ_END; //読み込み設定
int a;

while ( feof(fin) == 0){
a = fgetc(fin);
if(a != -1) //EOF(-1)がある時は無効化する為の【if】
{
if( a == '[' ){ //読み込み開始
Read_1 = READ_SET;
}else if( a == ']'){ //読み込み解除設定
fprintf(fout, "\n");
Read_1 = READ_END;
}
if( Read_1 == READ_START){ //書き出し
fputc(a, fout);
}
if( Read_1 == READ_SET){
Read_1 = READ_START;
}
}
}
}



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


Name: 管理人 [URL]  ..伝説のハッカー(370,483ポイント)   Date: 2007/06/14(木) 13:14   No:8606     
Title: Re:ポインタの扱い方・・・?    

いったん2次元配列にファイル内容を全部格納する。
[]内の文字列のみ取り出す関数を作る。
メインからその関数へ2次元配列を渡す。

と言う流れではどうでしょうか?

fgetsを使えば、ファイル内容をそのまま2次元配列に入れることが出来ます。

#include <stdio.h>

#define N1 64
#define N2 256

void main(){
int i,j;
FILE *fin;
char ss[N1][N2], name[256];

printf("作成ファイル名を入力してください。");
scanf("%s", name);

if( (fin = fopen(name, "r")) == NULL ){
printf("ファイルが見つかりません。"); return ;
}

while ( fgets(ss[i++],N2,fin) != NULL);

for(j=0;j<i;j++)
printf("%s",ss[j]);

fclose(fin);
}
 
 



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

Name: 管理人 [URL]  ..伝説のハッカー(371,244ポイント)   Date: 2007/06/14(木) 15:15   No:8610     
Title: Re:ポインタの扱い方・・・?    
とりあえずファイルの内容をs1にいれてますね。

s1と、s1の中の[]内の文字列を入れるs2と、s1に入れた文字列の個数を渡し、
s2にs1の[]内の文字列を格納し、格納した個数を返すstrput関数を作ってみました。

ファイル名はtest.txt固定です。サンプル実行してみてください。


#include <stdio.h>

#define N1 64
#define N2 256

int strput(char s1[N1][N2],char s2[N1][N2],int n){
//s1=調査対象文字列 s2=格納先文字列 n=s1に文字列が入っている個数
int i=0,j=0,s=0,t=0;
while(i<n){//文字列の個数分ループ
if(s1[i][j]=='['){
j++;//現在調べている要素が[ならその次から
while(s1[i][j]!=']'){//]になるまでループ
s2[s][t++]=s1[i][j++];//s2に[から]までを格納。
}
s2[s][t]='\0';//終わったら終端記号を入れる
s++;//格納先の文字列を次へ
t=0;//tを0に
}
if(s1[i][j]=='\0'){//調査対象が文字列の最後なら
i++;//次の文字列へ
j=0;//jを0に
continue;//戻る
}
j++;//調査対象を次の要素へ
}
return s;//格納した文字列の個数を返す。つまり[]の個数。
}

int main(){
int i=0,j,s;
FILE *fin;
char s1[N1][N2],s2[N1][N2];

if( (fin = fopen("test.txt", "r")) == NULL ){
printf("ファイルが見つかりません。"); return 1;
}

while ( fgets(s1[i++],N2,fin) != NULL);

s=strput(s1,s2,i);

for(j=0;j<s;j++)//strput関数から返って来たs2に入っている文字列の個数分表示
printf("%s\n",s2[j]);

fclose(fin);
return 0;
}



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

Name: box  ..比類無きプログラマー(71,515ポイント)   Date: 2007/06/14(木) 16:31   No:8614     
Title: Re:ポインタの扱い方・・・?    

お目汚しですが、こんな例もあるってことで…。

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

#define LEN (256)

int main(void)
{
char str[LEN], data[LEN], *p, *q, *r;
int n;

// 標準入力から1行分ずつ読み取れる間、続ける
while (fgets(str, sizeof(str), stdin) != NULL) {

// 文字列終端の'\0'が見つかるまで、その行の処理を続ける
for (p = str; strchr(p, '\0');) {
q = strchr(p, '['); // '['の位置を探す
if (q == NULL) // 見つからなければ
break; // その行の処理をやめる
r = strchr(q + 1, ']'); // '['とペアになるべき']'の位置を探す
if (r == NULL) // 見つからなければ
break; // その行の処理をやめる
n = r - q - 1; // '['と']'で挟まれた部分の長さ
strncpy(data, q + 1, n); // '['の次から、長さの分だけコピーする
data[n] = '\0'; // 文字列終端をセットする
printf("%s\n", data);
p = r + 1; // 次に処理するのは']'の後ろから
}
}
return 0;
}

標準入力から読み取るようになっていますので、
ファイルから読み取る際はリダイレクトしてください。

仕様に合うよう、ご自由に手を加えてください。


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

Name:  ..入門者(2,554ポイント)   Date: 2007/06/16(土) 00:38   No:8668     
Title: Re:ポインタの扱い方・・・?    
>管理人様
コピーして実行するとコンパイルは出来るのですが、実行時にエラーが3個ほど出ます。
何故でしょうか?

やっていることは大体分かったつもりなのですが、何処を見ても間違っている場所が分かりませんでした。
修正お願いできませんか?

>box様
感服しました。
自分に扱えるものの域の上を行っている感じがしますが、凄い参考になりました。
ありがとうございます。


最後になりましたが、管理人様、box様、返信が遅れて申し訳ありませんでした。


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

Name: 管理人 [URL]  ..伝説のハッカー(373,810ポイント)   Date: 2007/06/16(土) 01:24   No:8674     
Title: Re:ポインタの扱い方・・・?    
3つも出てました??
よく見てみるとiを初期化せずに使ってました。
いづれも警告だけだったんで、気づきませんでした。
出ている3つはエラーですか?警告ではなく?
上記コードを編集して新しいものにかえましたので、よければ試してみてください。


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

Name:  ..入門者(3,016ポイント)   Date: 2007/06/16(土) 01:27   No:8675 解決!     
Title: Re:ポインタの扱い方・・・?    
>管理人様
できました!
ありがとうございます。
三回連続で、プログラムのエラーが表示されていました。
これから、このエラーが出たら初期化を疑えそうです!
本当にありがとうございました。


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



Name: オス豚  ..ぴよぴよ(738ポイント)   Date: 2007/06/15(金) 00:25   No:8627       
Title: Visual C++を家でやりたいのですが    
大学の実習でBorland社のVisual C++ Builderを使っているのですが、これがかなり使いやすくて感動しました。というか、これしか使えないのですが…。
家でも作業したいと思っているのですが、Borland社のVisual C++ Builderはかなり高価みたいですね。無料のやつを探したらMicrosoftのがあったんですが、使い方がわかりませんでした。
Borland社のVisual C++ Builderのようなわかりやすいソフトはないですか?


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


Name: なぎ  ..上級者(24,156ポイント)   Date: 2007/06/15(金) 07:03   No:8631     
Title: Re:Visual C++を家でやりたいのですが    
Borland の場合 Turbo C++にフリーのものがあります。この実体は、C++ Builder 2006 です。

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

Name: バグ  ..熟練のプログラマー(47,456ポイント)   Date: 2007/06/15(金) 07:58   No:8632     
Title: Re:Visual C++を家でやりたいのですが    
え?
Visual C++って、MS社以外からも出てるんですか?


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

Name: バグ  ..熟練のプログラマー(47,544ポイント)   Date: 2007/06/15(金) 08:53   No:8634     
Title: Re:Visual C++を家でやりたいのですが    
ひょっとして…

http://www.turboexplorer.com/jp/cpp

これの事でしょうか?
仕事ではVC++6.0、VC++2005、趣味ではBCCデベロッパーを主に使っているので、趣味用にダウンロードしてみようかな?(^-^)


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

Name: なぎ  ..上級者(24,382ポイント)   Date: 2007/06/15(金) 09:08   No:8638     
Title: Re:Visual C++を家でやりたいのですが    
それです>バグさん。

当方では、伝統的に、C++ Builder を使っていました。
(確かに、ご指摘の通り、Visual C++ Builder ではないです、名前は)

少し前まで、Borland のフリーのコンパイラといえば、BCC しかなかったのですが、この、Turbo C++ は、製品版の C++ Builder と同じもの(ただし、自作のコンポーネントは追加できない・それでも、付属のコンポーネントがかなり豊富なので、そうそう、困ることはない)です。

Windows のプログラムをちょっと作るには、とても便利です。
コマンドラインのコンパイラも一緒に付いてきますし。


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

Name: オス豚  ..ぴよぴよ(769ポイント)   Date: 2007/06/16(土) 00:51   No:8669 解決!     
Title: Re:Visual C++を家でやりたいのですが    
なぎさん、バグさん、ありがとうございます。
さっそくダウンロードしてみます。


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



Name: DX  ..ぴよぴよ(259ポイント)   Date: 2007/06/15(金) 20:16   No:8658       
Title: 構造体について    
//フォント構造体
typedef struct _BITMAPFONT
{
//フォントを書き出しのX座標
int offsetFontX;
//フォントを書き出しのY座標
int offsetFontY;
//フォントの横幅
int bitmapFontWidth;
//フォントの縦幅
int bitmapFontHeight;
} BITMAPFONT,*PBITMAPFONT;


void InitGame()
{
//フォントの自作構造体
BITMAPFONT bitmapFont;
PBITMAPFONT pBitmapFont = &bitmapFont;

createBitmapFont(&pBitmapFont);

}

呼び出し元がこうなっていて


void createBitmapFont(PBITMAPFONT *pBitmapFont)
{
//この部分で構造体のメンバにアクセスして代入したいのですが
  //コンパイルエラーがでてしまいます
*(pBitmapFont->offsetFontX) = 0;
}

PBITMAPFONT *pBitmapFontの引数の部分はポインタのポインタだから

*pBitmapFontで構造体のポインタになって

->をつかってアクセスできると思ったんですがなにがだめなのでしょうか??



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


Name: Hermit  ..初心者(8,524ポイント)   Date: 2007/06/15(金) 21:01   No:8659     
Title: Re:構造体について    
void

createBitmapFont (PBITMAPFONT * pBitmapFont)
{
(*pBitmapFont)->offsetFontX = 0;
}

じゃないかな。


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

Name: バグ  ..熟練のプログラマー(47,792ポイント)   Date: 2007/06/15(金) 21:05   No:8660     
Title: Re:構造体について    
代入するだけならば、ポインタでいいのではないでしょうか?
ポインタのポインタでなければいけない理由があるのならば、話は別ですが…?


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



Name: アルエ  ..ぴよぴよ(216ポイント)   Date: 2007/06/15(金) 17:35   No:8653       
Title: 課題のソースについて    
先日、学校で以下のような課題が出たのでプログラムを作ったのですが、
エラーが出てしまい、どうしても実行できません。
ソースを添付しましたので、どこがどう間違っているのか添削していただけないでしょうか?
ちなみにOSはリナックスです。
---------------------------------------------------------------------
下記の補足課題を<仕様>の通りに改変せよ
<仕様>
以下のような5つの関数を定義し,活用する.
(1) set_food_on_road関数
・機能: 道に食べ物をセットする
・引数: 道に残る食べ物の情報を格納する配列
・戻り値: 無し

(2) direction関数
・機能: -1 または +1をランダムに出力する
・引数: 無し
・戻り値: -1 または +1の整数値

(3) boundary関数
・機能: 動物のx座標が境界に達した場合の補正処理
   (もし座標が-1になったら19にする.もし座標が20になったら0にする)
・引数: 補正前の動物のx座標
・戻り値: 補正後のx座標

(4) count_rest_food関数
・機能: 食べ物の残りをカウントする
・引数: 道に残る食べ物の情報を格納する配列
・戻り値: 道に残っている食べ物の総数

(5) disp_road_status関数
・機能: 道の各位置の状態の表示・・・食べ物の有("*")/無("-"),動物"O")
・引数: 道に残る食べ物の情報を格納する配列,及び動物の座標
・戻り値: 無し

※グローバル変数は使わないこと.
--------------------------------------------------------------------
<補足課題>

1本の道に,食べ物が多数落ちている.
ランダムに動く動物が,それらを全て食べ尽くすと終了するようなプログラムを作成せよ.

「道」は要素数20程度の1次元配列で表現する.
「食べ物」は,上記配列の各要素に値1があればその場所に存在し,値0であればその場所には存在しないものとする.
「動物」は,1回の移動で配列中の1つ左または1つ右に移動できる.
「動物」の訪れた場所のエサは食べられたものとする.
「道のうち食べ物のない箇所」,「道のうち食べ物のある箇所」,「動物」は,それぞれ -, *, O で表現する.それらを横一列の文字で表示する.
繰り返し処理中は,毎回数十〜数百ミリ秒程度の時間,実行を一時停止させることで,状態の推移を見やすくする.


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


Name: バグ  ..熟練のプログラマー(47,725ポイント)   Date: 2007/06/15(金) 17:38   No:8654     
Title: Re:課題のソースについて    
過去レスに全く同じ課題のスレがありましたよ。

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

Name: keichan  ..プログラマー(26,904ポイント)   Date: 2007/06/15(金) 18:33   No:8655     
Title: Re:課題のソースについて    
こちらですね。

http://www.play21.jp/board/formz.cgi?action=res&resno=8353&page=&lognum=26&id=dixq&rln=8442


ただ、前回と違うのは関数化について今回明言されているところでしょうか
(前回は関数化については指定されていませんでした)


それと、
>エラーが出てしまい、どうしても実行できません。

エラーが出たのであれば、どの時点でどういったエラーが出たのかを明記していただかないと答えられません。
#回答者がコンパイル/実行をすれば話は別ですが

添付ファイルのソースをざっと見ただけですが、コンパイルエラーが起きるような箇所は見受けられませんでした。

詳細なエラー情報の提示をお願いします。


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

Name: Hermit  ..初心者(8,448ポイント)   Date: 2007/06/15(金) 19:16   No:8657     
Title: Re:課題のソースについて    
エラーは出ないようですが、警告が出てますね。
int の範囲を越えるようです。
RAND_MAX と、INT_MAX の値が同じなので、そのあたりをどうにかしないといけないかもしれません。
(INT_MAX+1が、INT_MIN になる。負数になる)


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



Name: りょう  ..ぴよぴよ(835ポイント)   Date: 2007/06/13(水) 23:21   No:8588       
Title: 課題です    
構造体配列のソート関数なんですが、どこから手をつけていいかまったくわかりません。

・構造体定義
  typedef struct_Human{
short nID; //ID番号
char szName[20]; //名前
short nHeight; //身長
short nWeight; //体重
}HUMAN;

・関数プロトタイプ
void sortStruct(HUMAN stHuman[], short nKey, short nCount);

・仕様
  HUMAN構造体配列に格納させれいる入力値(HUMAN stHuman[])を任意のソート法を用いて昇順ソートし、
 同配列に格納するソートのキーとなるメンバはキーメンバ(HUMAN nKey)で格納されたものとする。
 ※ID番号->1 名前->2 身長->3 体重->4 
 なお、配列の格納件数はunsigned short unCountで格納された件数とする。

・使用例
   HUMAN stHuman[10]

stHuman[0]. unID = 1;
strcpy(stHuman[0]. szName, "山田太郎");
stHuman[0]. nHeight = 180;
stHuman[0]. nWeight = 100;

//
// 同様に計10件のデータをセット
//

sortStruct(stHuman, 3, 10); //身長によるソート
   
 
   sortStruct(stHuman, 2, 10); //体重によるソート

よろしくお願いします。


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


Name: keichan  ..プログラマー(26,683ポイント)   Date: 2007/06/14(木) 10:16   No:8602     
Title: Re:課題です    
void sortID(HUMAN stHuman[], nCount)

{
/* お好きなソートアルゴリズムを実装 */
}

void sortName(HUMAN stHuman[], nCount)
{
/* お好きなソートアルゴリズムを実装 */
}

void sortHeight(HUMAN stHuman[], nCount)
{
/* お好きなソートアルゴリズムを実装 */
}

void sortWeight(HUMAN stHuman[], nCount)
{
/* お好きなソートアルゴリズムを実装 */
}


void sortStruct(HUMAN stHuman[], short nKey, short nCount)
{
switch( nKey ) {
case 1: sortID(stHuman, nCount); break;
case 2: sortName(stHuman, nCount); break;
case 3: sortHeight(stHuman, nCount); break;
case 4: sortWeight(stHuman, nCount); break;
default: printf("キーの値が不正\n"); break;
}
}


こんな感じでいかがかしら?


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

Name: asd  ..上級者(15,514ポイント)   Date: 2007/06/14(木) 10:31   No:8603     
Title: Re:課題です    
何から手をつけていいかわからないとのことですが、

・配列のソート自体はやり方わかりますか?
・構造体配列のソートはわかりますか?
・関数の作り方はわかりますか?

qsort関数を使ってよいなら構造体のソートについて参考になりそうなページがありました。

http://www.gulf.or.jp/~damayan/saru/pointer5.html

あとは関数内で受け取ったパラメータによってソートの基準を変えてあげれば完成かなと思います。

上のページのを参考にIDで昇順に並べかえて表示するサンプルを作ってみました。
qsortとか使っちゃダメだったらその部分をソート処理に置き換えればOKかと思います。
#keichanさんのほうが参考になりそうな予感^^;


#include <stdio.h>
#include <stdlib.h>
//構造体定義
typedef struct{
short nID;
char szName[20];
short nHeight;
short nWeight;
}HUMAN;

//関数のプロトタイプ
void sortStruct(HUMAN stHuman[], short nKey, short nCount);

//IDの比較用関数
int id_cmp(const void *a, const void *b)
{ HUMAN *u, *v;

/*aとbをそれぞれu,vにキャストして入れる*/
/*uとvのnIDを比較してそれぞれ負の数、0、正の数のどれかを返す*/
}

int main()
{ int i;
int N = 4;
HUMAN students[] =
{ {1,"Sudo",60,175},
{3,"Aizawa",80,168},
{4,"Osaki",65,190},
{2,"Takami",76,155}
};

qsort(students, N, sizeof(HUMAN), id_cmp);
printf("IDの昇順\n");
for(i=0; i<N; i++)
printf("ID:%d Name:%s Height:%d Weight:%d\n",students[i].nID, students[i].szName, students[i].nHeight, students[i].nWeight);
putchar('\n');
return 0;
}


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

Name: りょう  ..かけだし(1,791ポイント)   Date: 2007/06/15(金) 14:57   No:8648     
Title: Re:課題です    
返事が遅くなり申し訳ありません。
お二方のを参考に作ってみました。

#define _CRT_SECURE_NO_DEPRECATE 1

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


#define NUMBER 100

/* データの構造体を宣言 */
typedef struct _HUMAN{
short nID; // ID番号
char szName[20]; // 名前
short nHeight; // 身長
short nWeight; // 体重
} HUMAN;

void sortStruct(HUMAN stHuman[], short nKey, short nCount);
// HUMAN stHuman[] 入出力:HUMAN構造体配列
// short nKey 入力:キーメンバ(構造体のメンバの番号を指定)
// short nCount 入力:格納件数


main()
{
int i;
short nCount = 5;

HUMAN stHuman[5];

stHuman[0]. nID = 1;
strcpy(stHuman[0]. szName, "山田");
stHuman[0]. nHeight = 180;
stHuman[0]. nWeight = 100;

stHuman[1]. nID = 2;
strcpy(stHuman[1]. szName, "高橋");
stHuman[1]. nHeight = 145;
stHuman[1]. nWeight = 50;

stHuman[2]. nID = 3;
strcpy(stHuman[2]. szName, "中山");
stHuman[2]. nHeight = 170;
stHuman[2]. nWeight = 60;

stHuman[3]. nID = 4;
strcpy(stHuman[3]. szName, "近藤");
stHuman[3]. nHeight = 150;
stHuman[3]. nWeight = 51;

stHuman[4]. nID = 5;
strcpy(stHuman[4]. szName, "岡田");
stHuman[4]. nHeight = 177;
stHuman[4]. nWeight = 70;




printf("ソート前\n");
for(i = 0; i <= nCount-1; i++)
printf("%02d\t%s\t%d\t%d\n",stHuman[i].nID,stHuman[i].szName,stHuman[i].nHeight,stHuman[i].nWeight);

printf("\n");

printf("身長によるソート\n");
sortStruct(stHuman, 3, 10);
for(i = 0; i <= nCount-1; i++)
printf("%02d\t%s\t%d\t%d\n",stHuman[i].nID,stHuman[i].szName,stHuman[i].nHeight,stHuman[i].nWeight);

printf("\n");

printf("体重によるソート\n");
sortStruct(stHuman, 4, 10);
for(i = 0; i <=nCount-1; i++)
printf("%02d\t%s\t%d\t%d\n",stHuman[i].nID,stHuman[i].szName,stHuman[i].nHeight,stHuman[i].nWeight);
}

void sortStruct(HUMAN stHuman[], short nKey, short nCount)
{

HUMAN a;
int i, q;

switch(nKey){

case 1:
for(i = 0; i <= nCount-1; i++){
for(q = i+1; q <= nCount-1; q++){
if(stHuman[i].nID > stHuman[q].nID){
a = stHuman[i];
stHuman[i] = stHuman[q];
stHuman[q] = a;
}
}
}
break;

case 2:
for(i = 0; i <= nCount-1; i++){
for(q = i+1; q <= nCount-1; q++){
if(strcpy(stHuman[q].szName, stHuma [i].szName) < 0){
a = stHuman[i];
stHuman[i] = stHuman[q];
stHuman[q] = a;
}
}
}
break;

case 3:
for(i = 0; i <= nCount-1; i++){
for(q = i+1; q <= nCount-1; q++){
if(stHuman[i].nHeight > stHuman[q].nHeight){
a = stHuman[i];
stHuman[i] = stHuman[q];
stHuman[q] = a;
}
}
}
break;

case 4:
for(i = 0; i <= nCount-1; i++){
for(q = i+1; q <= nCount-1; q++){
if(stHuman[i].nWeight > stHuman[q].nWeight){
a = stHuman[i];
stHuman[i] = stHuman[q];
stHuman[q] = a;
}
}
}
break;

default:
break;



}
}

しかし、まだ動いてくれません。
どこがおかしいのでしょうか?
教えてください。お願いします。


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

Name: りょう  ..かけだし(1,824ポイント)   Date: 2007/06/15(金) 15:14   No:8650 解決!     
Title: Re:課題です    
先程の質問ですが、できました。
みなさまありがとうございました。
また、よろしくお願いします。


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

Name: asd  ..上級者(16,353ポイント)   Date: 2007/06/15(金) 15:23   No:8652     
Title: Re:課題です    
うまく動いたようでよかったです^^

できれば「どううまく動かなくて、どう直したらうまく動いたのか」を書いておくと
同じような内容で困っている人がいたときに助けになるのかなと思います。


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



Name: ビスタ  ..ぴよぴよ(358ポイント)   Date: 2007/06/15(金) 08:53   No:8633       
Title: バブル、クイックソートの実行時間測定    
初めまして。

学校ので、バブルソートとクイックソートの実行速度の比較が課題になっているのですが
ランダムで同数の配列を用いているのに
クイックソートの測定時間が不安定で、たいていの場合バブルより遅いんです。
配列数をコマンドで変えてるのですがクイックの方は配列が10倍になったのに
測定時間が減っていたりしました。

ソート自体は出来ていたので
実行時間を測定するプログラムがおかしいのは確かなのですが。

以下はクイックソートのプログラムです

#include<stdio.h>

#include<sys/time.h>

#include<stdlib.h>

#include<time.h>

#ifndef MAX

#define MAX 25

#endif



/*外部関数宣言*/

extern void set_data_t3(int data[],int num);

extern void show_data(int data[],int num);

extern void swap_data(int data[],int i,int j);



/*内部関数*/

void quick_sort(int data[],int num);

void quick_sort_f(int data[],int l,int r);

int part(int data[],int l,int r);


int main()
{
int data[MAX];


set_data_t3(data,MAX);

struct timeval start,stop,duration;

struct timezone JPN;

JPN.tz_minuteswest=-9*60;

JPN.tz_dsttime=0;


if(gettimeofday(&start,&JPN)!=0){

fprintf(stderr,"err\n");

return -1;

}


time_t start_sec,stop_sec,dura_sec;


if(time(&start_sec)==(time_t)-1){

fprintf(stderr,"err\n");

return -1;

}

quick_sort(data,MAX);


if(gettimeofday(&stop,&JPN)!=0){

fprintf(stderr,"err\n");

return -1;

}

if(time(&stop_sec)==(time_t)-1){

fprintf(stderr,"err\n");

return -1;

}

dura_sec =stop_sec - start_sec;

duration.tv_usec=stop.tv_usec-start.tv_usec;


fprintf(stdout,"%f \n",dura_sec);

fprintf(stdout,"%x microseconds\n",duration.tv_usec);



return 0;

}



/*他ソートと合わせるための関数*/

void quick_sort(int data[],int num)
{

quick_sort_f(data,0,num-1);

}

/*クイックソート実体↓*/

void quick_sort_f(int data[],int l,int r)
{

int v;

if(l>=r){

return;

}



v=part(data,1,r);

quick_sort_f(data,1,v-1);

quick_sort_f(data,v+1,r);

}



int part(int data[],int l,int r)
{

int i,j,pivot;


i=l;

j=r-1;


pivot=data[r];

for(;;){

while(data[i]<pivot)

i++;

while((i<j)&&(pivot<=data[j]))

j--;

if(i>=j)

break;

swap_data(data,i,j);

}

swap_data(data,i,r);

return i;

}




追記ですが
クイックソートプログラムアプリを起動しようとしましたがexeファイルが見つかりません…


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


Name: バグ  ..熟練のプログラマー(47,705ポイント)   Date: 2007/06/15(金) 09:07   No:8637     
Title: Re:バブル、クイックソートの実行時間測定    
簡単なミリ秒単位での計測サンプルです。ただし、多少の誤差はどうしても出ますので、ご容赦を…。
環境がWindowsで、言語がC++ならば高精度タイマーもありますが、これも完全ではないです…(^_^;)


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

int main(void)
{
clock_t Start, Finish;

/* 開始時の時間を取得 */
Start = clock();



/* ここに何らかの処理を書き込む */



/* 処理終了時の時間と、開始時の時間の差(経過した時間…msec単位)を取得 */
Finish = clock() - Start;

/* 経過時間を表示 */
printf("%d", Finish);

return 0;
}


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

Name: ビスタ  ..ぴよぴよ(430ポイント)   Date: 2007/06/15(金) 12:59   No:8646     
Title: Re:バブル、クイックソートの実行時間測定    
<バグさん

あ〜、環境書くの忘れてたんですね…私。
SUSE-Linux9.0 のC言語で コンパイラがgccなんですけど…

取りあえずそれでやってみます。
一応解決かどうかは保留しておきます…。

(学校のPC使わないとできないので)


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




 
[ 1 , ... ]
 
 
管理者画面   RSS   + Powered By 21style +