C言語何でも質問掲示板


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

規約と使い方

 
   制御文 ループ   
     ・[12690] フリオ 
     ・[12691] なな 
     ・[12692] Hermit 
     ・[12693] box 
     ・[12695] Lbfuvab 
     ・[12696] なな 
     ・[12697] Hermit 
     ・[12702] なな 
     ・[12703] なな 
     ・[12704] 組木紙織 
     ・[12731] やそ 
     ・[12737] chip 
     ・[12738] Hermit 
     ・[12739] Lbfuvab 
     ・[12740] やそ 
     ・[12741] やそ 
     ・[12742] GPGA 
     ・[12743] Hermit 
     ・[12744] なな 
     ・[12745] GPGA 
     ・[12746] なな 
     ・[12747] Hermit 
     ・[12748] chip 
     ・[12784] なな 
   なぜ動かないのか。。 ....   
     ・[12760] バグ 
     ・[12761] カピバラ 
     ・[12762] バグ 
     ・[12765] カピバラ 
   ダイアログボックスの ....   
   放物線   
     ・[12757] しりうす〜 
   至急   
     ・[12719] バグ 
     ・[12720] Lbfuvab 
     ・[12721] Lbfuvab 
     ・[12723] しゅう 
     ・[12724] バグ 
     ・[12725] しゅう 
     ・[12727] バグ 
     ・[12728] しゅう 
     ・[12729] やそ 
     ・[12730] box 
     ・[12732] やそ 
     ・[12733] バグ 
     ・[12736] chip 
   カーソルの非表示   
     ・[12706] バグ 
     ・[12718] Lbfuvab 
     ・[12726] バグ 
   検索するプログラムに ....   
     ・[12713] バグ 
     ・[12722] Lbfuvab 
   クイックソートについ ....   
     ・[12714] 管理人 
     ・[12715] parapara 
     ・[12716] parapara 
   画面に数字を表示した ....   
     ・[12506] keichan 
     ・[12508] リク 
     ・[12525] tkmakwins15 
     ・[12526] リク 
     ・[12528] tkmakwins15 
     ・[12560] リク 
     ・[12564] tkmakwins15 
     ・[12570] リク 
     ・[12571] tkmakwins15 
     ・[12576] 管理人 
     ・[12577] tkmakwins15 
     ・[12578] リク 
     ・[12580] リク 
     ・[12581] tkmakwins15 
     ・[12582] tkmakwins15 
     ・[12583] リク 
     ・[12584] tkmakwins15 
     ・[12586] リク 
     ・[12596] tkmakwins15 
     ・[12600] リク 
     ・[12601] tkmakwins15 
     ・[12605] リク 
     ・[12611] tkmakwins15 
     ・[12613] tkmakwins15 
     ・[12618] やそ 
     ・[12711] リク 
   無題   
     ・[12681] YuO 
     ・[12688] 御三家 
     ・[12707] VOW 
     ・[12710] 御三家 
   無題   
     ・[12568] 組木紙織 
     ・[12573] 御三家 
     ・[12574] 管理人 
     ・[12575] 御三家 
     ・[12705] 組木紙織 
   ファイルを用いた平均 ....   
     ・[12661] box 
     ・[12663] 幻 
     ・[12664] たかぎ 
     ・[12666] 幻 
     ・[12667] たかぎ 
     ・[12698] 幻 
   無題   
     ・[12598] toyo 
     ・[12599] C 
     ・[12602] box 
     ・[12686] chip 
     ・[12694] box 
   無題   
     ・[12682] Lbfuvab 
     ・[12684] 通りすがり 
     ・[12687] 自由の天使 
   キー入力とマウス取得 ....   
     ・[12669] バグ 
     ・[12676] dy 
     ・[12677] バグ 
   ランダムダンジョンの ....   
     ・[12674] バグ 
   スコアを画像で表示   
     ・[12665] アルル 
   何が間違え?   
     ・[12637] box 
     ・[12638] なな 
     ・[12639] box 
     ・[12640] はな 
     ・[12642] Hermit 
     ・[12643] box 
     ・[12651] なな 
     ・[12652] box 
     ・[12653] なな 
     ・[12654] なな 
   無題   
     ・[12644] box 
   文字・配列・制御文   
     ・[12608] フリオ 
     ・[12610] りな 
     ・[12614] りな 
     ・[12615] りな 
     ・[12616] box 
     ・[12617] りな 
     ・[12619] box 
     ・[12620] りな 
     ・[12632] りな 
     ・[12635] box 
   文字列を昇順ソートす ....   
     ・[12593] box 
     ・[12595] フリオ 
     ・[12623] ぽん 
     ・[12626] box 
     ・[12631] フリオ 
   ランダム&個数   
     ・[12609] 雷 
     ・[12621] 龍生 
     ・[12625] バグ 
     ・[12627] 龍生 
     ・[12628] \n 
     ・[12629] バグ 
   配列が分かりません・ ....   
     ・[12572] keichan 
     ・[12594] フリオ 
   直角三角形の斜辺の計 ....   
     ・[12589] box 
     ・[12591] 幻 
   構造体   
     ・[12588] box 
     ・[12590] 名無し 
   素数を求める   
     ・[12494] tkmakwins15 
     ・[12495] うしくん 
     ・[12496] box 
     ・[12497] 組木紙織 
     ・[12498] hum-king 
     ・[12499] フリオ 
     ・[12501] うしくん 
     ・[12502] うしくん 
     ・[12563] うしくん 
   プログラムの謎   
     ・[12557] YuO 
     ・[12559] tkmakwins15 
     ・[12561] parapara 
   X座標を更新するには? ....   
     ・[12547] 管理人 
     ・[12558] 藍 
   プログラムの謎2   
   ウインドウ作成。   
     ・[12511] やそ 
     ・[12554] C.P.P 
   サイコロを動かすプロ ....   
     ・[12513] box 
     ・[12515] ココ 
     ・[12517] box 
     ・[12523] ココ 
     ・[12524] box 
     ・[12532] ココ 
     ・[12533] toyo 
     ・[12534] box 
     ・[12535] ココ 
     ・[12537] box 
     ・[12538] ココ 
     ・[12539] box 
     ・[12540] ココ 
     ・[12541] box 
     ・[12542] ココ 
     ・[12552] 管理人 
     ・[12553] ココ 
   プログラムの課題   
     ・[12544] keichan 
     ・[12549] 管理人 
     ・[12551] やそ 
   木を用いた集合族   
     ・[12550] 管理人 
   スクロールについて   
     ・[12548] 管理人 
   改行文字   
     ・[12488] Blue 
     ・[12489] Blue 
     ・[12490] ひろ 
     ・[12491] Blue 
     ・[12545] ひろ 
     ・[12546] Blue 
   Winsockについて   
     ・[12531] toyo 
     ・[12543] りょうちん 
   構造体で…   
     ・[12518] box 
     ・[12519] D.A 
     ・[12522] box 
     ・[12536] やそ 
   C言語の関数の課題   
     ・[12504] box 
     ・[12507] たかぎ 
     ・[12527] YK 
   画像が表示されません   
     ・[12521] reaf 
   デバッグ   
   ソートの課題   
     ・[12372] フリオ 
     ・[12378] hum-king 
     ・[12385] box 
     ・[12391] hum-king 
     ・[12414] box 
     ・[12416] やそ 
     ・[12417] フリオ 
     ・[12500] hum-king 
   是非お教えください   
     ・[12353] 管理人 
     ・[12492] SLGファン 
   C言語プログラムについ ....   
     ・[11900] F 
     ・[11902] box 
     ・[11903] フリオ 
     ・[11904] box 
     ・[11905] F 
     ・[11906] box 
     ・[11913] ぽん 
     ・[11914] 組木紙織 
     ・[11915] 組木紙織 
     ・[11943] ぽん 
     ・[11944] 組木紙織 
     ・[11947] F 
     ・[11959] ぽん 
     ・[11966] 組木紙織 
     ・[12272] ぽん 
     ・[12286] 組木紙織 
     ・[12287] 組木紙織 
     ・[12296] ぽん 
     ・[12297] 組木紙織 
     ・[12298] フリオ 
     ・[12485] ぽん 
   ダブルバッファ   
     ・[12463] Hermit 
     ・[12484] Lbfuvab 
   構造体を指すポインタ ....   
     ・[12440] へろり 
     ・[12441] parapara 
     ・[12442] parapara 
     ・[12445] box 
     ・[12446] parapara 
     ・[12447] box 
     ・[12449] parapara 
     ・[12467] parapara 
     ・[12468] box 
     ・[12470] parapara 
     ・[12471] parapara 
     ・[12472] box 
     ・[12473] 組木紙織 
     ・[12483] parapara 
   main(int argc, c ....   
     ・[12481] tkmakwins15 
     ・[12482] box 
   画像の表示に関して質 ....   
     ・[12465] 管理人 
     ・[12478] 入門者 
   値が変!!!   
     ・[11969] box 
     ・[11970] はな 
     ・[11971] box 
     ・[11974] F 
     ・[12049] はな 
     ・[12145] はな 
     ・[12146] box 
     ・[12147] はな 
     ・[12148] box 
     ・[12149] はな 
     ・[12156] フリオ 
     ・[12474] はな 
     ・[12475] はな 
     ・[12476] はな 
     ・[12477] はな 

Name: なな  ..かけだし(1,059ポイント)   Date: 2007/12/17(月) 21:13   No:12689       
Title: 制御文 ループ    
お疲れ様です!!昨日はアドバイスありがとうございました!!本日も悩んでいます・・・・


/*
読み込んだ整数を逆から表示するプログラムですが、うまく動作しません。
1234と入力すると、4321と出力させたいのですが、4endと出てしまいます。
num=num%10;当たりが間違っているのでしょうか?
*/

#include <stdio.h>

int main(void) {
int num;

do{
puts("整数入力");
scanf("%d",&num);
}while(num<0);

do{
num=num%10;
printf("%d",num);
num=num/10;
}while(num>0);

puts("end");
return 0;
}



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


Name: フリオ  ..上級者(20,009ポイント)   Date: 2007/12/17(月) 21:17   No:12690     
Title: Re:制御文 ループ    
 
 "num"の値がどう変化しているか確認しましょう。
 


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

Name: なな  ..かけだし(1,076ポイント)   Date: 2007/12/17(月) 22:04   No:12691     
Title: Re:制御文 ループ    
まったくだめです・・・・・・

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

Name: Hermit  ..上級者(17,007ポイント)   Date: 2007/12/17(月) 22:15   No:12692     
Title: Re:制御文 ループ    
だめですか・・・そんなにあっさり答えるのね・・・

num = 1234 % 10 -----> num は、4
num = 4 / 10 --------> num は、0

と動作します。


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

Name: box  ..ハッカー(100,228ポイント)   Date: 2007/12/17(月) 22:17   No:12693     
Title: Re:制御文 ループ    

> "num"の値がどう変化しているか確認しましょう。

という回答に対して

> まったくだめです・・・・・・

と返すのではなく、例えば、

> num=num/10;

の後に

printf("%d",num);

を追加するだけでも、解決へ近づくはずです。


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

Name: Lbfuvab  ..初心者(6,038ポイント)   Date: 2007/12/17(月) 22:46   No:12695     
Title: Re:制御文 ループ    
%演算子の意味はあくまで「剰余」つまり割った余りですよ。

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

Name: なな  ..かけだし(1,175ポイント)   Date: 2007/12/17(月) 22:55   No:12696     
Title: Re:制御文 ループ    
みなさんアドバイスありがとうございます。


do{
printf("%d",num%10);

num=num/10;
}while(num>0);


としたらできました!でもなんとなく処理がりかいできていないです。


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

Name: Hermit  ..上級者(17,087ポイント)   Date: 2007/12/17(月) 23:11   No:12697     
Title: Re:制御文 ループ    
>でもなんとなく処理がりかいできていないです。

何となく理解できていないところは、どこの部分ですか?
どういう動作をさせたくて、その部分を書いていますか?
その部分で、どういう動作をすると思いますか?

それくらいの情報が書けるようになりましょう。


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

Name: なな  ..かけだし(1,208ポイント)   Date: 2007/12/18(火) 06:30   No:12702 解決!     
Title: Re:制御文 ループ    
> >でもなんとなく処理がりかいできていないです。

紙と鉛筆で書き出して行ったら処理内容がようやく理解できました。


>
> 何となく理解できていないところは、どこの部分ですか?
> どういう動作をさせたくて、その部分を書いていますか?
> その部分で、どういう動作をすると思いますか?
>
> それくらいの情報が書けるようになりましょう。
>



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

Name: なな  ..かけだし(1,495ポイント)   Date: 2007/12/18(火) 06:54   No:12703     
Title: Re:制御文 ループ    
おはようございます!!



/*
読み込まれた整数値以下である2のベキ乗の数を昇順に出力するというプログラム
ですが、なにか微妙に動きが違います・・・。
19を読み込ませると、2 4 8 16と出力されるはずなのに、1 4 9 16と出てしまう。
2のベキ乗がミソかな〜??
*/

#include <stdio.h>

int main(void) {
int i,j,num;

do{
puts("数値入力");
scanf("%d",&i);
if(i<=0){
puts("負の数は入力不可");
}
}while(i<=0);

j=1;
while(j<=i){
num=j*j;
if(num<=i){
printf("%d ",num);
}
j++;
}

return 0;
}




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

Name: 組木紙織  ..プログラマー(29,617ポイント)   Date: 2007/12/18(火) 07:58   No:12704     
Title: Re:制御文 ループ    
確かに2のべき乗のところが問題ですね。

pow()という関数があるので、それを使いましょう。
但しそのままでは使えません。使い方は自分で調べてください。


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

Name: やそ  ..入門者(4,023ポイント)   Date: 2007/12/18(火) 16:41   No:12731     
Title: Re:制御文 ループ    
 ・
 ・
 ・
 ・
iを入力後のロジック

num=1;
while(num<=i){ //iは2以上の数で入力されて欲しいな。
num=2*num; //2のべき乗
printf("%d ",num);
}
return 0;
}

pow関数もイイっすけど、iが2以上を前提と出来るならコレで十分な気がします。


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

Name: chip  ..ぴよぴよ(762ポイント)   Date: 2007/12/18(火) 19:23   No:12737     
Title: Re:制御文 ループ    
どうしてうまくいかないかというと、

j=1;
while(j<=i){
num=j*j;
if(num<=i){
printf("%d ",num);
}
j++;
}

jには初め1が入ってます。それをj*jで二乗するのだから出力は1です。
その後、jに1追加して、2にしています。なので2が二乗されて出力は4。
同様にして 9, 16, 25, ... となって出力されてしまうのです。


他の方が回答されてるように、

num = j*j; が諸悪の根源であり、2の累乗なのだから、
2を重ねてかける必要があるので、
j = j*2; が正しい。 j++ は必要ありません。


思い通りに動かないときは、プログラムがどう動いているか一つずつ追って行くと
いいと思います。
あと、初めのうちはprintfを要所要所に入れて、変数がどう変わっているかを表示させると
バグが見つかりやすいです。


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

Name: Hermit  ..上級者(17,178ポイント)   Date: 2007/12/18(火) 19:31   No:12738     
Title: Re:制御文 ループ    
やそさんへ
	num=2;

while(num<=i){
printf("%d ",num);
num=2*num;
}
でしょう。

ななさんへ
	if(i<=0){

puts("負の数は入力不可");
}
0 は、負の数ではないのですが・・・言葉がちょっと変ですね。

あと、2 の 0 乗は 1 なので、それを含めるなら、 num=2; のところを、num=1; にしてもいい。


もうひとつ・・・違うプログラムでの質問なのだから、新規書き込みの方がいい気がします。


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

Name: Lbfuvab  ..初心者(6,384ポイント)   Date: 2007/12/18(火) 19:48   No:12739     
Title: Re:制御文 ループ    

int mypow(int num){ //2のべき乗を返す
int ret=1;
while(num--)
ret*=2;
return ret;
}

int main(){
int i=0,num;

while(1){
printf("正の数を入力せよ\n");
scanf("%d",num);
if(num>0)
break;
}
while(mypow(i)<=num)
printf("2の%d乗は%d\n",i,mypow(i++);
return 0;

でいいかと


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

Name: やそ  ..入門者(4,425ポイント)   Date: 2007/12/18(火) 20:42   No:12740     
Title: Re:制御文 ループ    
Lbfuvabさん、お疲れ様です。

>19を読み込ませると、2 4 8 16と出力されるはずなのに、1 4 9 16と出てしまう。

と言う要件定義がありますので、Lbfuvabさんのロジックでは最初に呼ばれるmypow(i)ではi=0なので
結果が違ってしまいませんか?
出力結果は2^1(2の1乗)から始まるようです。


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

Name: やそ  ..入門者(4,688ポイント)   Date: 2007/12/18(火) 20:56   No:12741     
Title: Re:制御文 ループ    
Hermitさん お疲れ様です。

 

num=2;
while(num<=i){
printf("%d ",num);
num=2*num;
}

ですが、i=1だった場合どうでしょう?
1も立派な正の数です。
while判定でいきなりはじかれて、1回もprintf("%d ",num);
を実行しないで終わります。
それはちょっとさびしい感じです。
私の提示したロジックのコメントでは
//iは2以上の数で入力されて欲しいな。
と書いていますが、実際には1の時も考慮しています。
(1じゃ余りに味気ないからコメントしただけですばい)
で、0は入力段階で弾かれますから考慮外。
まあ、確かに文言は違和感を感じますが^^;
要件定義にも
>19を読み込ませると、2 4 8 16と出力されるはずなのに、1 4 9 16と出てしまう。
と有りますのでね。

>もうひとつ・・・違うプログラムでの質問なのだから、新規書き込みの方がいい気がします。
わたしも同感です。途中から「あれ?」って思いましたから。




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

Name: GPGA  ..熟練のプログラマー(41,102ポイント)   Date: 2007/12/18(火) 20:59   No:12742     
Title: Re:制御文 ループ    
>printf("2の%d乗は%d\n",i,mypow(i++);
関数内の引数の評価の順番は不定だったと思うので、この一行でiが++されるタイミングは環境依存に
なるのではないでしょうか。

後、2のべき乗計算ならループを使わず、シフト演算子を使用したほうが高速です。

int mypow(int num)
{
return num == 0 ? 1 : 2 << (num - 1);
}
 


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

Name: Hermit  ..上級者(17,236ポイント)   Date: 2007/12/18(火) 21:01   No:12743     
Title: Re:制御文 ループ    
やそさんへ

>19を読み込ませると、2 4 8 16と出力されるはずなのに、1 4 9 16と出てしまう。
とあるのに、32 まで出てくるのはいいのでしょうか?


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

Name: なな  ..かけだし(1,507ポイント)   Date: 2007/12/18(火) 21:08   No:12744 解決!     
Title: Re:制御文 ループ    
皆さんアドバイス&解説ありがとうございます。
無事正常に動作しました。本当にありがとうございます!


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

Name: GPGA  ..熟練のプログラマー(41,175ポイント)   Date: 2007/12/18(火) 21:53   No:12745     
Title: Re:制御文 ループ    

>int mypow(int num)
>{
> return num == 0 ? 1 : 2 << (num - 1);
>}
すごくへんな書き方をしてしまいました。

int mypow(int num)
{
return 1 << num;
}
 


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

Name: なな  ..かけだし(1,203ポイント)   Date: 2007/12/18(火) 22:02   No:12746     
Title: Re:制御文 ループ    
新規書き込みを行おうと思いましたが、短いプログラムなので同じところに投稿(質問)させて頂きます。
ご了承下さい。


/*
1234567890を繰り返し表示するプログラムを作成。なお、表示
する数字は読み込まれた数値の個数とする。
例)整数を入力して下さい:25
1234567890123456789012345
  と実行結果になるそうです。

私のプログラムを実行すると
整数を入力して下さい:25
→無限ループ状態・・・・になってしまいます。。

if文のところがおかしいとは分かっています。アドバイス
よろしくお願いします。

*/
#include <stdio.h>

int main(void) {
int i,num;

scanf("%d",&num);
i=0;
while(i<num){
printf("%d",i);
if(!(i%10)){
i=0;
}
i++;
}
return 0;
}


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

Name: Hermit  ..上級者(17,254ポイント)   Date: 2007/12/18(火) 22:15   No:12747     
Title: Re:制御文 ループ    
短くても、新規にしてもらえませんか?



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

Name: chip  ..ぴよぴよ(922ポイント)   Date: 2007/12/18(火) 22:22   No:12748     
Title: Re:制御文 ループ    
printfで表示してるのは変数iの値でしょ?
たぶんこれだと0から9を表示しますね。
iはnum(25)を超えることは永遠にありません。

if文のところでiが10になるたびに0を代入しているからいつまでたっても終わらない。

表示するのはiではなく、iを10で割った余りです。

ほとんどできてるんだから、ここで質問するのはもったいないです。


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

Name: なな  ..かけだし(1,221ポイント)   Date: 2007/12/19(水) 20:38   No:12784 解決!     
Title: Re:制御文 ループ    
できました!ありがとうございます!

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



Name: カピバラ  ..ぴよぴよ(225ポイント)   Date: 2007/12/19(水) 14:38   No:12759       
Title: なぜ動かないのか。。。    
aとbのdouble型の数字を読み込み、
2つの数字の和と差と積と商を関数を使ってやりたいのですがうまくできません。
何が間違っているのか教えてください。

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

void calc(double a, double b, double *sum,double *sub,double *mul,double *div);
int main(void){
double *a,*b,sum,sub,mul,div;
printf("a=");
scanf("%f",&a);
a=(double *)malloc(sizeof(double));

printf("b=");
scanf("%f",&b);
b=(double *)malloc(sizeof(double));

calc(a,b,&sum,&sub,&mul,&div);
printf("sum=%f,sub=%f,mul=%f,div=%f\n",sum,sub,mul,div);
free(a);
free(b);
return 0;
}

void calc(double a, double b, double *sum,double *sub,double *mul,double *div){
*sum=a+b;
*sub=a-b;
*mul=a*b;
*div=a/b;
}






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


Name: バグ  ..比類無きプログラマー(67,919ポイント)   Date: 2007/12/19(水) 15:25   No:12760     
Title: Re:なぜ動かないのか。。。    
@:mallocで領域を確保する前にaを使用しています。(当然ながらbに関する部分も同様です)

A:scanf("%f",&a)の部分ですが、double型の場合は【%lf】ではないでしょうか?あとaはポインタなので、この記述ではポインタのアドレスを渡す事になってしまいます。scanf("%lf", a)とするべきではないかと思います。(当然ながらbに関する部分も同様です)

B:calc(a,b,&sum,&sub,&mul,&div)の部分ですが、関数の宣言部では第1引数と第2引数はdouble型を実体で渡すように宣言されていますが、実際に渡されているのはポインタになっています。


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

Name: カピバラ  ..ぴよぴよ(249ポイント)   Date: 2007/12/19(水) 15:33   No:12761     
Title: Re:なぜ動かないのか。。。    
回答ありがとうございます!!
@とAはわかったのですがBの部分をもう少し詳しく教えてください。


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

Name: バグ  ..比類無きプログラマー(68,167ポイント)   Date: 2007/12/19(水) 15:43   No:12762     
Title: Re:なぜ動かないのか。。。    
void calc(double a, double b, double *sum,double *sub,double *mul,double *div);

関数の宣言部での記述はこうなっていますね?引数部分を見てみると、aとbはdouble型の変数、sumとsubとmulとdivはdouble型のポインタとなっています。


次にmain関数の下記の部分を見て下さい。

double *a,*b,sum,sub,mul,div;

変数のaとbはdouble型のポインタとして、sumとsubとmulとdivはdouble型の変数として定義されています。
しかし、main関数内でcalc関数を呼び出す際の記述を見てみると…

calc(a,b,&sum,&sub,&mul,&div);

こうなっています。aとbはポインタですから、この記述ではaとbの実体ではなく、それぞれに割り当てられたアドレスを渡す事になってしまいます。

今回の場合は先に記述したとおり、渡すべきはaとbのアドレスではなく実体でなければけませんので、この部分を書き換える必要があります。


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

Name: カピバラ  ..ぴよぴよ(272ポイント)   Date: 2007/12/19(水) 15:58   No:12765 解決!     
Title: Re:なぜ動かないのか。。。    
わかりました!
ありがとうございました。


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



Name: 加藤風月  ..ぴよぴよ(720ポイント)   Date: 2007/12/19(水) 13:34   No:12758       
Title: ダイアログボックスの文字入力について    
現在、ダイアログボックスを用いて文字入力を行い、入力された文字をDrawFormatString関数で描画したいと考えておりますが、上手く出来ません。何か方法はございませんが?

念のため現在作っているプログラムの一部を添付させていただきます。
一応コンパイルまでは出来るんですが、ダイアログボックスに文字、数字を入力し、OKをクリックするとアプリケーションエラーになってしまいます。

おそらく、***で囲まれた部分の定義がおかしいと思い調べましたが、事故解決には至りませんでした。

コンパイラはBCC Developerを使っています。
よろしくお願いいたします。

↓これが、リソースファイルです。

#include <windows.h>
#include "dlgbox.h"

DLGBOX DIALOGEX 300, 300, 100, 70
STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "名前と大きさの入力"
FONT 12, "MS 明朝"
BEGIN
  EDITTEXT IDC_FAIL1,60,12,20,15,ES_AUTOHSCROLL
EDITTEXT IDC_FAIL2,60,30,20,15,ES_AUTOHSCROLL
LTEXT "名前",IDC_STATIC,18,12,17,8
LTEXT "大きさ",IDC_STATIC,17,30,17,8

DEFPUSHBUTTON "OK",IDOK,7,49,50,14
PUSHBUTTON "終了",IDCANCEL,129,49,50,14
END

※ファイル名はdlgbox.rc

↓次にヘッダファイルです。

#define IDC_FAIL1 1001
#define IDC_FAIL2 1002

※ファイル名はdlgbox.h

そして、本体です。

#include <windows.h>
#include "dlgbox.h"

BOOL CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM , Boy *boy);

int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst,
LPSTR lpsCmdLine, int nCmdShow)
{
DialogBox(hCurInst, "DLGBOX", NULL, (DLGPROC)DlgProc);
return 0;
}

BOOL CALLBACK MyDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam , Boy *boy)
{
char boy[256],ookisa[128],namae[128];

switch (msg )
{
case WM_INITDIALOG: //ダイアログボックスの初期化
return TRUE;
case WM_COMMAND:
switch (LOWORD(wParam)) {
case IDOK://OKボタンが押されたら

GetDlgItemText(hDlg, IDC_FAIL1, namae, (int)sizeof(namae));
//hDlgで指されるバッファにテキストをコピーし、コピーしたバイト数を返します
GetDlgItemText(hDlg, IDC_FAIL2, ookisa, (int)sizeof(ookisa));

wsprintf(boy, "名前を%sに、大きさを%sに変更しました", namae, ookisa);

MessageBox(hDlg, boys, "変更したぷぃ(>o<)b", MB_OK);

************************************************
* strcpy(boy->name,namae); *
* boy->value[64] = ookisa[64]; *
************************************************

       DrawFormatString(8,7,Yellow,"name : %s",boy->name);
DrawFormatString(8,15,Yellow,"value : %d",boy->value);   


EndDialog(hDlg, IDOK); //ダイアログボックスの破棄
return TRUE;
}
return FALSE;
}
return FALSE;
}

 ※ファイル名はdlgbox.cppです。



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




Name:  ..かけだし(1,628ポイント)   Date: 2007/12/18(火) 22:56   No:12751       
Title: 放物線    
28. ジャンプの考え方2でx = 500 * t;の値を変えると、放物線の飛ぶ高さが変わりますが、飛んでいく速度も変わってしまうので、x = 500 * t;の値を変えて飛ぶ高さだけ変わり、飛んでいく速度はそのままにする方法ってありますかね?

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


Name: しりうす〜  ..かけだし(1,405ポイント)   Date: 2007/12/19(水) 11:58   No:12757     
Title: Re:放物線    
元記事詳しく見てないので勘だけで答えますと、移動量Xを固定してしまえばいいのでは?

元記事を見た感じ、移動量に関わらずジャンプの時間を一定にする処理のようでしたので。
上記の処理の"* t"を省けば良いかと思われます。


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



Name: しゅう  ..ぴよぴよ(646ポイント)   Date: 2007/12/18(火) 14:59   No:12717       
Title: 至急    
課題4
キーボードからファイル名を読み込み、そのファイルの中の行数(改行文字の個数)をカウントして画面に表示するプログラムを作成したいんですけど、よくわからないのでプログラム考えてもらえますか?

あとファイルを読み込むってどーゆうことですか?
そのファイルに何を書き込めばいいのですか?

お願いします。


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


Name: バグ  ..比類無きプログラマー(67,395ポイント)   Date: 2007/12/18(火) 15:13   No:12719     
Title: Re:至急    
@ファイルをオープンする
A1文字ずつ文字を読み込む
B読み込んだ文字が改行文字だったら、カウント用の変数をインクリメントする
Cファイルの終端だったら、カウントを画面に表示する。そうでなければAに戻る
Dファイルをクローズする

最初の質問のプログラムの流れはこんな感じです。
ファイルを読み込むとは、ファイルの中に書かれているデータを取り出すという意味です。
今回は改行文字の個数をカウントするだけですから、ファイルへ書き込む必要はありません。

質問は以上ですね?頑張って下さい(^-^)


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

Name: Lbfuvab  ..初心者(6,220ポイント)   Date: 2007/12/18(火) 15:14   No:12720     
Title: Re:至急    
ファイル読み書きは
FILE型のポインタを使います。(猫Cでも見てください
行数はあなた自身が言われたように改行文字の個数をカウントして下さい。


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

Name: Lbfuvab  ..初心者(6,238ポイント)   Date: 2007/12/18(火) 15:15   No:12721     
Title: Re:至急    
かぶってしまいすいませんでした。

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

Name: しゅう  ..ぴよぴよ(607ポイント)   Date: 2007/12/18(火) 15:22   No:12723     
Title: Re:至急    
カキありがとうございます。
できたら簡単なプログラム考えてもらえると助かります。><


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

Name: バグ  ..比類無きプログラマー(67,423ポイント)   Date: 2007/12/18(火) 15:25   No:12724     
Title: Re:至急    
簡単なプログラムとは何ですか?具体的に何が分かりませんか?
全く分からないというのは無しでお願いします。


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

Name: しゅう  ..ぴよぴよ(653ポイント)   Date: 2007/12/18(火) 15:27   No:12725     
Title: Re:至急    
ある程度参考書を読んでわかったのですが、行数をカウントするにはどのようなプログラムになるのかがわかりません。

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

Name: バグ  ..比類無きプログラマー(67,698ポイント)   Date: 2007/12/18(火) 15:32   No:12727     
Title: Re:至急    
printf関数は分かりますよね?
この関数で改行をさせたい時に何を使うかは分かりますか?

ファイルから読み込んだ文字がその改行文字であるかどうかをif文を使って判断して、改行文字ならばカウントを1つ増やせばいいのです。

後は、この説明をC言語に書き換えるだけですよ♪(^-^)


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

Name: しゅう  ..ぴよぴよ(666ポイント)   Date: 2007/12/18(火) 15:54   No:12728     
Title: Re:至急    
ありがとうございます。やってみます。

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

Name: やそ  ..入門者(3,867ポイント)   Date: 2007/12/18(火) 15:57   No:12729     
Title: Re:至急    
あとはデータの構造次第でしょうか?
1行(1レコード)の最大文字数は(可変?固定?)
データ内にスペースは存在するか?
レコードの終端文字は復改(CRLF)?
ファイルの終端は?

一文字づつ読み込むのもよし、1行いっぺんに読むのもよし。
1レコードの区切り文字が見つかったらカウントすれば出来るはずです。

標準入出力関数を良く調べてみましょう。
きっとやりたいことが実現できそうな関数があるはずです。


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

Name: box  ..ハッカー(100,372ポイント)   Date: 2007/12/18(火) 16:16   No:12730     
Title: Re:至急    
> あとはデータの構造次第でしょうか?
> 1行(1レコード)の最大文字数は(可変?固定?)
> データ内にスペースは存在するか?

取り扱うファイルはおそらくテキストで、
単に改行文字の数を勘定すればよいだけですから、
ファイルの中身には全く依存しないです。

各行の何バイト目に改行文字を含んでいても、
データの中に空白があってもなくても、
今回のプログラムの仕様には影響しません。


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

Name: やそ  ..入門者(4,351ポイント)   Date: 2007/12/18(火) 17:02   No:12732     
Title: Re:至急    
回答者はみんな分かっていると思います。
が、やりとりを拝見するとしゅうさんはファイルを読み込む為の関数を理解していないのではないかと思います。
バグさんが提示した
@ファイルをオープンする
A1文字ずつ文字を読み込む
B読み込んだ文字が改行文字だったら、カウント用の変数をインクリメントする
Cファイルの終端だったら、カウントを画面に表示する。そうでなければAに戻る
Dファイルをクローズする

をC言語でイメージできていないのではないでしょうか?
お勉強のために、いろんな入出力関数があることを知ってもらい、その上で今回の要件にマッチする関数が見つけられれば良いなと思い、書かせていただいた次第です。
いろんな関数を試してガッテンしてちょうだい^^

添付されていたPDFファイルはあまり役に立ってないねぇ^^;


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

Name: バグ  ..比類無きプログラマー(67,747ポイント)   Date: 2007/12/18(火) 17:14   No:12733     
Title: Re:至急    
>>添付されていたPDFファイルはあまり役に立ってないねぇ^^;

これは私も思いました。『テキストってどこ?』と思わず探してしまいました(苦笑)


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

Name: chip  ..ぴよぴよ(691ポイント)   Date: 2007/12/18(火) 19:05   No:12736     
Title: Re:至急    
fopenとかfclose,fscanfあたりを中心にあれこれ調べればいいですよ。

ネット上にいくらでも解説サイトがありますので、参考書がややこしそうであれば、
解説サイトをいくつか回って調べるといいと思います。

はっきりいって、サンプルプログラムを示すほどの課題ではありません。
@ファイル開いて、A読み込んで、B行数をカウントする
これだけです。


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



Name: Lbfuvab  ..初心者(6,154ポイント)   Date: 2007/12/18(火) 01:37   No:12700       
Title: カーソルの非表示    
Windows XP SP2の環境でエスケープシーケンスを使わずに
コンソール画面のカーソルを非表示にするにはどうすればいいですか?
調べても分かりませんでした。


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


Name: バグ  ..比類無きプログラマー(67,129ポイント)   Date: 2007/12/18(火) 09:06   No:12706     
Title: Re:カーソルの非表示    
カーソルを非表示にするだけのサンプルを載せておきます。
添付したファイルはコンソールアプリで文字や背景の色を変更したり、Windowのサイズを変更したりといった機能を実装してあるクラスです。このクラスのSetCursorVisibleという関数内で同じ処理を行っています。良かったら、ご覧下さい。


#include <windows.h>

void main()
{
HANDLE hOut;
CONSOLE_CURSOR_INFO cci;

// 出力用ハンドルの取得
hOut = GetStdHandle(STD_OUTPUT_HANDLE);

// CONSOLE_CURSOR_INFO構造体の現在の状態を取得する
GetConsoleCursorInfo(hOut, &cci);

// メンバ変数であるbVisibleがカーソルの表示・非表示を制御する変数なので、これをFALSEにする事でカーソルを非表示にできる
cci.bVisible = FALSE;

// 変更した構造体情報をコンソールWindowにセットする
SetConsoleCursorInfo(hOut, &cci);
}


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

Name: Lbfuvab  ..初心者(6,182ポイント)   Date: 2007/12/18(火) 15:11   No:12718 解決!     
Title: Re:カーソルの非表示    
有難うございました。
探してもCONSOLE_SCREEN_BUFFER_INFOは載ってても
CONSOLE_CURSOR_INFOはなかったんです。


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

Name: バグ  ..比類無きプログラマー(67,599ポイント)   Date: 2007/12/18(火) 15:29   No:12726     
Title: Re:カーソルの非表示    
確かにコンソール関係って、MSDNでも日本語で解説してない物が多いので、結構調べにくいですよね(^_^;)

もう必要ないかもしれませんが、コンソール関係の構造体のページを載せておきます。

http://msdn2.microsoft.com/en-us/library/ms682101.aspx


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



Name: あゆみ  ..ぴよぴよ(194ポイント)   Date: 2007/12/18(火) 11:39   No:12712       
Title: 検索するプログラムについて    
曲名、アーティスト名、発売年などが何10曲ほど保存されたファイルから
検索して検索結果を出力する機能のプログラムを作りたいのですがまったくわかりません(;´д`)ゞ
どなたかアドバイスだけでもいいので教えてください。

ファイルの内容は
1. タイトル1(日本語表記,邦題)
2. タイトル2(英語表記,原題,ローマ字表記)
3. アーティスト名1(日本語表記)
4. アーティスト名2(ローマ字表記)
5. CDの発売年
6. レーベル
7. 国内(D)/海外(F)
8. ジャンル

ラッドウィンプス4;RADWIMPS4;ラッドウィンプス;RADWIMPS;2006;EMIミュージック・ジャパン;D;J-Pop
例としてはこんな感じです↑


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


Name: バグ  ..比類無きプログラマー(67,217ポイント)   Date: 2007/12/18(火) 12:08   No:12713     
Title: Re:検索するプログラムについて    
1:ファイルをオープンする
2:データを読み込む
3:読み込んだデータを画面へ表示する
4:ファイルの終端でなければ、2へ戻る
5:ファイルをクローズする

この流れでいけると思います。頑張って下さい!!


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

Name: Lbfuvab  ..初心者(6,263ポイント)   Date: 2007/12/18(火) 15:17   No:12722     
Title: Re:検索するプログラムについて    
構造体を使ってデータを纏めてはいかがでしょうか?

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



Name: parapara  ..中級者(10,739ポイント)   Date: 2007/12/18(火) 11:00   No:12709       
Title: クイックソートについて質問    
本に以下のように書いてありました。

実際に正しく動きます。ですが、下記のような疑問が沸きました。
#include<stdio.h>
void quick(int *,int ,int);
#define N 10
int main(void){
static int a[]={41,24,76,11,45,64,21,69,19,36};
int k;
quick(a,0,N-1);
for(k=0;k<N;k++){
printf("%4d",a[k]);
}
puts("");
return(0);
}
void quick(int *a,int hajime,int owari){
int jiku=hajime,i=hajime,j=owari+1;
int temp;
if(hajime>=owari)return;
while(1){
while(a[++i]<a[jiku]);//************************
while(a[--j]>a[jiku]);//************************
if(i>=j)break;
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
temp=a[jiku];
a[jiku]=a[j];
a[j]=temp;
quick(a,hajime,j-1);
quick(a,j+1,owari);
}
*印の所でjが負の値に成ってしまったり、iがowariを超えることは無いんでしょうか?。


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


Name: 管理人 [URL]  ..伝説のハッカー(467,753ポイント)   Date: 2007/12/18(火) 13:11   No:12714     
Title: Re:クイックソートについて質問    
クイックソートは左から調べているiの値と右から調べているjの値がぶつかったらそこで探索は終了するので、owariを越える事はありません。
「ピポッド以上を探索、ピポッド以下を探索」するということは、探索範囲で少なくともピポッド自身で一回とまるはずです。
どこにも探索がヒットしなければ、少なくともお互いが探索時にピポッドでとまるはずですから、
ぶつかったことが判定出来ます。

・・と言ってもわかりにくいので、動的な解説つきで見てもらったほうが解りやすいと思いますので、
http://dixq.net/sort.html
よかったら、クイックソートの解説用アプリを作っておりますので、こちらで確認してください。


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

Name: parapara  ..中級者(10,762ポイント)   Date: 2007/12/18(火) 13:23   No:12715     
Title: Re:クイックソートについて質問    
Dixq様ありがとうございます。アプリもみて再度考えて見ます。

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

Name: parapara  ..中級者(10,976ポイント)   Date: 2007/12/18(火) 14:04   No:12716     
Title: Re:クイックソートについて質問    
アプリ見てみました。凄くよく分かったのですが、一回勉強してみて、つまづいた人が見るのが、
最も効果的だと思いました。本で言うところのポインタ完全制覇www。
そして本に書いてあったクイックソートの基本を知るための基本の上記プログラム
ピボットを常に調べる部分配列の先頭にする上記プログラム
ではiがowariを超えることはありそうです。
たまたま、この配列ではうまく言ったに過ぎないように感じました。
iがowariを超えることは在りえますでしょうか?

*******数分後↓********

配列の先頭を99にして、ステップデバッグしたら、iがowariを超えて、
3個ぐらい超えたところで配列の添字オーバー(初期化されてない)適当な数字67824で止まっていたことが分かりました。でも、結果i>=jなので、要素交換しないので、正しくなっていますが、
本来こういうプログラムは書かないほうが良いのではないでしょうか?
エラーの原因になりそうですし・・・。


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



Name: リク  ..かけだし(1,038ポイント)   Date: 2007/12/11(火) 15:15   No:12505       
Title: 画面に数字を表示したとき    
DXライブラリのDrawFormatStringをつかって、画面に文字と数字を表示したときに、
たまに文字化けみたいなのが起こるのですが、原因が分かりません。
文字化けが起こる原因を教えていただけませんか?
たまにしか起こらないのでどこが悪いのかが分からないのです。
こう書くと文字化けが起こるみたいなのを教えていただけたら幸いです。


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


Name: keichan  ..プログラマー(28,358ポイント)   Date: 2007/12/11(火) 15:48   No:12506     
Title: Re:画面に数字を表示したとき    
開発環境を教えてください。
それと具体的にどんな文字を表示して文字化けしたのかも教えてください。


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

Name: リク  ..かけだし(1,076ポイント)   Date: 2007/12/11(火) 17:25   No:12508     
Title: Re:画面に数字を表示したとき    
開発環境はVisual Studio .NET 2003です。
FPSを表示したときに文字化けみたいになりました。
文字化けというよりか、文字がなくなるみたいな感じです。


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

Name: tkmakwins15 [URL]  ..熟練のプログラマー(42,610ポイント)   Date: 2007/12/11(火) 23:14   No:12525     
Title: Re:画面に数字を表示したとき    
できればその文字化け的なことが起こるソースコードを見せてくれませんでしょうか?
そうすると速く解決するかもしれません。


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

Name: リク  ..かけだし(1,135ポイント)   Date: 2007/12/11(火) 23:37   No:12526     
Title: Re:画面に数字を表示したとき    
あるゲームを真似てつくっているので、見せることができないんです。
こう書いたら文字化けが起こるというのを教えていただけませんか?


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

Name: tkmakwins15 [URL]  ..熟練のプログラマー(42,875ポイント)   Date: 2007/12/11(火) 23:57   No:12528     
Title: Re:画面に数字を表示したとき    
極端な例で言うと

char str[81]={0};
int i,ch;
for(i=0;i<80;i++){
ch=GetRand(255);
if(CHAR_MAX<UCHAR_MAX)ch-=128;
str[i]=ch;
}

DrawFormatString(0,0,GetColor(255,255,255),"%s%s",str,"文字化けする");

とか…


wchar_t wstr[21]={L"あいうえおかきくけこ"};

setlocale(LC_ALL,"");

DrawFormatString(0,0,GetColor(255,255,255),"%s",wstr);

とか…
たぶん「ダメ文字」が関わるとは思えませんし、可能性があるとすると…
・機種依存文字(98系統はUnicodeは弱い)
・Shift_JISの範囲外の文字を使用している(通常ないと思います)

文字が無くなるのだとしたら、背景色とカメレオンになっていませんか?


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

Name: リク  ..かけだし(1,184ポイント)   Date: 2007/12/13(木) 17:17   No:12560     
Title: Re:画面に数字を表示したとき    
回答ありがとうございます。

背景色は黒が主体になっています。
文字化けしたときの画像をコピーしたので添付します。
回答よろしくお願いします。


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

Name: tkmakwins15 [URL]  ..熟練のプログラマー(42,861ポイント)   Date: 2007/12/13(木) 22:54   No:12564     
Title: Re:画面に数字を表示したとき    
59の周りが文字化けしているということだとすると、何か出力できない文字を出力していませんか??

何か文字列のところに数値を指定しているとか…


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

Name: リク  ..かけだし(1,250ポイント)   Date: 2007/12/14(金) 10:52   No:12570     
Title: Re:画面に数字を表示したとき    
回答ありがとうございます。

int形で数値を指定しています。
DrawFormatString(0,0,white,"%5d",suuji);
suujiには適当な数字をいれています。
これが原因ですか?


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

Name: tkmakwins15 [URL]  ..熟練のプログラマー(42,885ポイント)   Date: 2007/12/14(金) 14:25   No:12571     
Title: Re:画面に数字を表示したとき    
うーん、書式指定を%dのみにしたらどうなりますか?

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

Name: 管理人 [URL]  ..伝説のハッカー(466,071ポイント)   Date: 2007/12/14(金) 16:35   No:12576     
Title: Re:画面に数字を表示したとき    
あるゲームの真似なのでということですが、問題となっている部分のソースコード公開では著作権の問題にならないと思います。

そのプログラムで特許が申請されているようなシステムが実現出来たり著作権のある画像や音楽を含めてアップするというのなら問題かもしれませんが・・。

なので、問題となっている部分だけでいいので公開してもらえませんか?
その変数が関係している部分だけでも結構です。
もしも、その変数にあきらかに以上が無い場合、オーバーフローなどによって値が変わっている可能性があります。

以下、入れた覚えの無い値が出てきてしまう例の一つです。

構造体の中は連続したアドレスが入るはずだと思いますので、以下のような事が起こることがあります。
tag_t型を作って、pという構造体を作っています。


#include <stdio.h>

typedef struct{
int a[2];
int b;
}tag_t;
tag_t p;

int main(){
p.a[2]=5;
printf("%d",p.b);
}

実行結果
5

 
 
p.bには何も代入していないので、0が入っているはずです。ですから0が表示されるはずですが、なぜか5が表示されます。
これはaの配列は要素が[1]までしかないのに、[2]に5を入れてしまっているので、[1]のアドレスよりひとつ分先に用意されたbに入ってしまっているのです。
このように、p.bに値を入れた覚えが無くても、他で入れた値が思わぬところで入ってしまったと言うことがあります。

よくfor文などを使って配列に値を代入したとき、上限値を間違って、オーバーフローすることがありますので、
その辺をチェックしてみてはいかがでしょうか。

たとえば上記の例ですと、以下のような場合オーバーフローします。
VC++などではオーバーフローしたよ、とコンパイラが教えてくれないので自分でチェックしないといけないです
(指示してくれるオプションがあるのかもしれませんが、当方は存じません)


for(i=0;i<=2;i++)
p.a[i]=5;
 


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

Name: tkmakwins15 [URL]  ..熟練のプログラマー(42,930ポイント)   Date: 2007/12/14(金) 16:53   No:12577     
Title: Re:画面に数字を表示したとき    
その問題の出力をファイルに出力するとどうなりますか?
できれば出力してその結果を見せてください。


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

Name: リク  ..かけだし(1,389ポイント)   Date: 2007/12/14(金) 18:04   No:12578     
Title: Re:画面に数字を表示したとき    
デバッグのところに

作成できるフォントハンドル数 40 の限界を超えました
フォントハンドル値が異常です

↑のようにでています。
今実行したら文字が消えました。文字化けではありませんが・・・

また、
シンボルが読み込まれていません。
というのがたくさんあります。

何か関係ありますか?


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

Name: リク  ..かけだし(1,555ポイント)   Date: 2007/12/14(金) 20:10   No:12580     
Title: Re:画面に数字を表示したとき    
文字化けする理由分かったかも知れません。

あの"ファイルから読み込む"というのをDXライブラリのやり方が
分からなかったので、普通のやり方を使っていました。
そのときにstdio.hを読み込むのを忘れていました。
これも原因の一つだと思うのですがどうですか?

でもこれだけではFPSを表示したときのが説明できませんが・・・


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

Name: tkmakwins15 [URL]  ..熟練のプログラマー(42,960ポイント)   Date: 2007/12/14(金) 21:10   No:12581     
Title: Re:画面に数字を表示したとき    
ループのたびにフォントハンドルを生成していませんか?

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

Name: tkmakwins15 [URL]  ..熟練のプログラマー(42,970ポイント)   Date: 2007/12/14(金) 21:12   No:12582     
Title: Re:画面に数字を表示したとき    
C言語でファイルを開く方法は大丈夫ですよね?

ファイルに同じ要領で同じ内容を書き込むとどうなりますか?


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

Name: リク  ..かけだし(1,618ポイント)   Date: 2007/12/14(金) 21:44   No:12583     
Title: Re:画面に数字を表示したとき    
フォントハンドルとは何ですか?

ファイルに書き込むのは問題ないと思います。
ちゃんと数値が書き込まれているので。


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

Name: tkmakwins15 [URL]  ..熟練のプログラマー(43,031ポイント)   Date: 2007/12/14(金) 22:20   No:12584     
Title: Re:画面に数字を表示したとき    
Dxライブラリでは、標準で使われるフォントのほかに、新たなフォントデータを作成する事ができるのです。
そのハンドル値がフォントハンドルです。


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

Name: リク  ..かけだし(1,693ポイント)   Date: 2007/12/14(金) 22:40   No:12586     
Title: Re:画面に数字を表示したとき    
回答ありがとうございます。

ループのたびにフォントハンドルは生成していません。

でも、初期化するときにフォントハンドルを生成してると思います。
フォントハンドルを生成するのは最初だけでいいですか?
それと、効果音や画像を読み込むのも1回だけでいいですか?


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

Name: tkmakwins15 [URL]  ..熟練のプログラマー(43,158ポイント)   Date: 2007/12/15(土) 09:09   No:12596     
Title: Re:画面に数字を表示したとき    
いったんメモリ上に作成したデータはそのまま使えますから別に何度も読み込む必要はありません。

その他考えられるのが、数字以外のところが化けるのであれば、日本語に全く対応していないフォントを使っているとか…

それと、書き込んだファイルを見せてくれませんか?それで何とかなるかもしれませんので。


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

Name: リク  ..かけだし(1,731ポイント)   Date: 2007/12/15(土) 11:52   No:12600     
Title: Re:画面に数字を表示したとき    
文字化けするところのデータをテキストファイルに書き込みしたのでいいのですか?


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

Name: tkmakwins15 [URL]  ..熟練のプログラマー(43,334ポイント)   Date: 2007/12/15(土) 12:04   No:12601     
Title: Re:画面に数字を表示したとき    
はい、そうです。
テキストの内容によってはその原因が分かるかもしれません。

その他、できれば、出力した時のフォントの名前があるといいでしょう。そうすればある程度の環境は、僕のほうで再現できるかもしれません。
Dxライブラリのデフォルトフォントで出力した場合はデフォルトと教えてください。


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

Name: リク  ..かけだし(1,856ポイント)   Date: 2007/12/15(土) 13:49   No:12605     
Title: Re:画面に数字を表示したとき    
font = CreateFontToHandle("MS ゴシック", 55, 1, DX_FONTTYPE_ANTIALIASING);

DrawFormatStringToHandle(0, 0, white, font, "%7d", suuji);

C言語でsuuji.txtファイルをライトモードでオープンして、
fprintf(fp, "%d", suuji);

画面に表示するときのフォントサイズが55というのが悪いのかもしれません。


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

Name: tkmakwins15 [URL]  ..熟練のプログラマー(43,395ポイント)   Date: 2007/12/15(土) 15:06   No:12611     
Title: Re:画面に数字を表示したとき    
ループに入る前に
if(font==-1)MessageBox(NULL,"フォントの作成に失敗しています","警告",MB_OK);
といれて実行してみてください。


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

Name: tkmakwins15 [URL]  ..熟練のプログラマー(43,715ポイント)   Date: 2007/12/15(土) 15:29   No:12613     
Title: Re:画面に数字を表示したとき    
このプログラムをコンパイルして実行してください。(新プロジェクトでもかまいません)

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

int WINAPI WinMain(HINSTANCE hInst,HINSTANCE,char*,int)
{
int font,num;
int count=0;
FILE* file;

ChangeWindowMode(TRUE);

if(DxLib_Init()==-1)abort();

file=fopen("Data_TkLog.txt","w");

SetDrawScreen(DX_SCREEN_BACK);

font=CreateFontToHandle("MS ゴシック", 55, 1, DX_FONTTYPE_ANTIALIASING);
if(font==-1)fputs("フォントの作成に失敗しました。\n",file);
else fputs("フォントの初期化には成功しています。\n",file);

num=0;

while(ProcessMessage()!=-1&&CheckHitKey(KEY_INPUT_E)!=1){

DrawFormatStringToHandle(0,0,GetColor(255,255,255),font,"乱数 %5d",num);
if(count==0)fprintf(file,"乱数 %5d\n",num);

ScreenFlip();
ClearDrawScreen();
if(count%30==0){
num=GetRand(1000);
}
count++;
}
fclose(file);
DxLib_End();
return 0;
}

このプログラムの意味は知らなくてもかまいません。
実行後、「Data_TkLog.txt」という名前のファイルができているはずなので、それを見せてください。
それと、Dxライブラリのログファイルがあるはずなのでそれもできれば見せてください。


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

Name: やそ  ..入門者(3,665ポイント)   Date: 2007/12/15(土) 21:02   No:12618     
Title: Re:画面に数字を表示したとき    
管理人様、tkmakwins15様お疲れ様です。

お二方の丁寧で優しい回答をされているのを見ているとただの閲覧者のわたしの気分も良くなってきます^^

リクさん、エラーと格闘されているようですね。お疲れ様です。

ただ、管理人様の回答をスルーされていますよね・・・。
わたしも、管理人様と同様、プログラムの開示はよほどのことがない限り著作権に引っかかることはないと思っています。疑わしいなら変数名とかを全く別のものに変えてしまい、出来るだけその固有名詞っぽいものを排除してはどうでしょう?

tkさんが突っ込んだ回答をされていて少し道が開けたかも知れませんが、
満足のいく回答を出来るだけ早く得たいとお考えであれば、
「再現性のある」ソースの開示をオススメします。

以上、横槍でした。


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

Name: リク  ..かけだし(1,884ポイント)   Date: 2007/12/18(火) 11:35   No:12711 解決!     
Title: Re:画面に数字を表示したとき    
みなさんに迷惑かけているようなのでこれで投稿を終わらせていただきます。

今まで親切に回答してくださったみなさんありがとうございました。

ソースを開示しなかったのは、文字化けが起こるのが1箇所ではなく複数あったことと、
ソースの書き方がへたくそで分かりにくいと思ったことと、ソースの量が多いことです。

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


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



Name: 御三家  ..ぴよぴよ(956ポイント)   Date: 2007/12/17(月) 16:59   No:12679       
Title: 無題    
以前Visual c++の使いかた聞いたものです。

なんとか実行したいので

Linuxでやってみました。

すると
/tmp/ccW4i71F.o(.text+0x1a6): In function `main':
: undefined reference to `sqrt'
/tmp/ccW4i71F.o(.text+0x348): In function `dft':
: undefined reference to `cos'
/tmp/ccW4i71F.o(.text+0x382): In function `dft':
: undefined reference to `sin'
・・・
collect2: ld はステータス 1 で終了しました

と出てきました。

Visualのときはビルドはできてましたし、#include <math.h>も
プログラムに入っているのでこの理由がわかりません。

誰か教えてください。お願いします。


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


Name: YuO  ..上級者(15,772ポイント)   Date: 2007/12/17(月) 18:30   No:12681     
Title: Re:無題    
えーっと,コンパイラは何ですか?
確か,ccだと数学用ライブラリの使用には-lmオプションが必要だった記憶があるのですが。


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

Name: 御三家  ..かけだし(1,005ポイント)   Date: 2007/12/17(月) 20:40   No:12688     
Title: Re:無題    
C言語(text.cとなる)ですね。

授業で使用していたものをそのまま使用しています。

コンパイラは
GNOME端末で

% gcc text.c

で読み込めれば

./a.out で実行します。


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

Name: VOW  ..ぴよぴよ(10ポイント)   Date: 2007/12/18(火) 09:15   No:12707     
Title: Re:無題    
でしたら、YuOさんのおっしゃるとおり-lmオプションがたりないんですよ。

gcc -lm text.c


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

Name: 御三家  ..かけだし(1,009ポイント)   Date: 2007/12/18(火) 11:17   No:12710     
Title: Re:無題    
回答ありがとうございます。

では

% gcc -lm text.c

./a.out

として一度試してみます。


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



Name: 御三家  ..ぴよぴよ(289ポイント)   Date: 2007/12/13(木) 22:58   No:12565       
Title: 無題    
Microsoft Visual Studio .NET 2003 というソフトでVisual C++ を使って、数値の入ったファイルを読み込んでプログラムを実行したいのですが、如何せん初心者なんで「どうやったら実行できるのか?」が解りません。というのも、Visual C++には、.NET MFL Win32 など様々なものがあって何がなんやらさっぱりです。いろいろ試してみて、プログラムを「ビルド」して「デバッグ」したりしましたが、「シンボルが・・・」やら別のウィンドウが開いても何も書かれていないとかで惨めな気持ちになってしまいます。こんな質問はこのサイトで聞くようなことではないかもしれませんが、何か一つでも手がかりがあればと思い投稿しました。ご協力お願いします。

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


Name: 組木紙織  ..プログラマー(29,562ポイント)   Date: 2007/12/14(金) 10:17   No:12568     
Title: Re:無題    
目的にもよりますが、
何も書かれていないウインドウが出る。
で実行は出来ているはずです。
文字が書かれているウインドウが表示される場合などもありますが、
全ては目的次第です。


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

Name: 御三家  ..かけだし(1,045ポイント)   Date: 2007/12/14(金) 15:53   No:12573     
Title: Re:無題    
実行してみると「出力」にこんなことが書かれました。

'dft.exe': 'C:\Documents and Settings\TAG3\My Documents\Visual Studio Projects\dft\Debug\dft.exe' を読み込みました。シンボルが読み込まれました。
'dft.exe': 'C:\WINDOWS\system32\ntdll.dll' を読み込みました。シンボルが読み込まれていません。
'dft.exe': 'C:\WINDOWS\system32\mscoree.dll' を読み込みました。シンボルが読み込まれていません。
'dft.exe': 'C:\WINDOWS\system32\kernel32.dll' を読み込みました。シンボルが読み込まれていません。
'dft.exe': 'C:\WINDOWS\system32\advapi32.dll' を読み込みました。シンボルが読み込まれていません。

・・・

'dft.exe': 'C:\WINDOWS\system32\EntAPI.dll' をアンロード
'dft.exe': 'C:\WINDOWS\system32\netapi32.dll' をアンロード
'dft.exe': 'C:\WINDOWS\system32\psapi.dll' をアンロード
'dft.exe': 'C:\WINDOWS\system32\shlwapi.dll' を読み込みました。シンボルが読み込まれていません。
'dft.exe': 'C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\mscorwks.dll' を読み込みました。シンボルが読み込まれていません。

・・・

'dft.exe': 'C:\WINDOWS\assembly\NativeImages1_v1.1.4322\mscorlib\1.0.5000.0__b77a5c561934e089_64f24755\mscorlib.dll' を読み込みました。シンボルが読み込まれていません。
'dft.exe': 'C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\diasymreader.dll' を読み込みました。シンボルが読み込まれていません。
'dft.exe': 'C:\WINDOWS\system32\ole32.dll' を読み込みました。シンボルが読み込まれていません。
'DefaultDomain': 'c:\windows\microsoft.net\framework\v1.1.4322\mscorlib.dll' が読み込まれました。シンボルは読み込まれませんでした。

・・・

スレッド 'Win32 スレッド' (0xfc0) はコード -1 (0xffffffff) で終了しました。
プログラム '[4008] dft.exe' はコード 0 (0x0) で終了しました。
プログラム '[4008] dft.exe: ネイティブ' はコード -1 (0xffffffff) で終了しました。


どうも「シンボル」というのが重要な気がします。

これを実行した際に一瞬実行用のウィンドウ(黒い背景の)が開き、一瞬で消えたことも気がかりです。


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

Name: 管理人 [URL]  ..伝説のハッカー(465,495ポイント)   Date: 2007/12/14(金) 16:04   No:12574     
Title: Re:無題    
コンソールプログラムでいいのでしょうか?
黒い画面に数値が出るだけのプログラムでよければ、コンソール出力用のプロジェクトでいいと思います。
.NETでは微妙に操作が違うかもしれませんが、VS2005の方法でお伝えします。

スタート>新規作成>プロジェクト

Win32>Win32コンソールアプリケーション>(プロジェクト名に好きな名前を入力)

[Win32アプリケーションウィザードの画面で]
アプリケーションの設定>「空のプロジェクト」にチェックを入れる>完了

[ソリューションエクスプローラーの]
「ソースファイル」右クリック>追加>新しい項目

[新しい項目の追加の画面で]
C++ファイル(.cpp)を選択>(ファイル名に好きな名前を入力)

これで準備OKです。後はプログラムを書いてCtrl + F5を押せば普通に実行できます。

どうでしょうか?


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

Name: 御三家  ..かけだし(1,205ポイント)   Date: 2007/12/14(金) 16:24   No:12575     
Title: Re:無題    
「ビルド」まで行えて実行しました。

すると

Press any key to continue

というものが黒いウィンドウで表れて

押した瞬間に消えてしまいました。。。ちなみに下の部分に「読み込み専用です」といったことが書かれていました。

自分の作ったプログラムは

別のファイルで数値だけたくさん表示されているものを

プログラムで読み込み

別のファイルで表示するというものなのですが、やはりもっと複雑にしなければいけないのでしょうか・・・?

ちなみにプログラムとしては

if(argc!=3){
printf("Usage is ...\n");
printf("trans.exe <input file> <output file>\n");
return(-1);
}

/* ファイル読込み */
if((fp = fopen(argv[1],"r"))
== NULL){
return(-1);
}
if((fp2=fopen(argv[2],"w")) == NULL){
return(-1);
}


としています。

直接組み込もうとすればargv[]の部分をファイル名に換えればうまくいくと考えています。


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

Name: 組木紙織  ..プログラマー(29,820ポイント)   Date: 2007/12/18(火) 08:24   No:12705     
Title: Re:無題    
もしかして
main()に引数がついていませんか?

この場合は作ったプログラムに引数を渡してあげることが出来ます。

VC++ 2005ではプロジェクト->プロパティ->構成プロパティ->デバッグ->コマンド引数
を変更することで引数を渡すことが出来ます。

以下のプログラムは引数がないときは1、引数の数に応じて2以上が表示されるサンプルプログラムです。

#include<stdio.h>

int main(int argc,char* argv[])
{
printf("%d\n",argc);

}


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



Name:  ..かけだし(2,333ポイント)   Date: 2007/12/16(日) 22:41   No:12660       
Title: ファイルを用いた平均値の計算    
こんばんは、幻です。
また質問させていただきますm(_ _)m

Cの方もようやく「ファイル入出力」の分野まで進んできました。
そこでまた課題が出ました。

『整数が書かれたファイル(添付ファイルのような感じです)を読み込み、その平均値を画面に出力するプログラムを書け。ただし、ファイルから入力データを読み込む部分、平均値を計算する部分、結果を出力する部分のそれぞれを関数にせよ。』

main関数の中に全て書き込むプログラムなら出来たのですが、それぞれを関数に分けるとなると急に分からなくなります。
↓は自分なりに上記のプログラムを崩しながら作ってみたプログラムです。

/* ファイルから読み込んだ整数値の平均を求める */

#include<stdio.h>

/* ファイルを読み込む関数 */
void r_file(FILE *fp)
{
fp = fopen("file02.txt", "r");
fclose(fp);
}

/* ファイル内の整数値の平均を求める関数 */
double average(FILE *fp, int *sum, int *i)
{
int n; /* ファイル内の整数を格納する変数 */
double ave;

while (fscanf(fp, "%d", &n) != EOF) {
sum = sum + n; /* ファイル内の整数の和を求める */
i = i + 1; /* ファイル内の整数の個数を求める */
}
ave = sum / i;

return ave;
}

/* 結果を出力する関数 */
void output(double ave)
{
printf("ファイル内の整数値の平均--> %5.2lf\n", ave);
}

int main()
{
FILE *fp;
int sum = 0, i = 0;
double ave;

r_file(fp);
ave = average(fp, &sum, &i);
output(ave);

return 0;
}



特にr_file関数で読み込んだファイルを、どうすればaverage関数で計算処理できるのか(?)がよく分からない状態です。
(すみません、上手く言えなくて・・・
添削していただいて、ここはこう書くんだよとか、こうするべきところを教えていただければと思います。
宜しくお願いします。


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


Name: box  ..ハッカー(100,159ポイント)   Date: 2007/12/16(日) 22:52   No:12661     
Title: Re:ファイルを用いた平均値の計算    
> main関数の中に全て書き込むプログラムなら出来た

そのコードを提示していただけますか?


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

Name:  ..入門者(2,544ポイント)   Date: 2007/12/16(日) 23:36   No:12663     
Title: Re:ファイルを用いた平均値の計算    

↓がコードになります。

#include<stdio.h>

int main(void)
{
FILE *fp;
int n, i = 0, sum = 0;
double ave;

fp = fopen("file02.txt", "r");

while (fscanf(fp, "%d", &n) != EOF) {
sum = sum + n;
i = i + 1;
}
fclose(fp);

ave = (double)sum / (double)i;

printf("ファイル内の整数値の平均-->%5.2lf\n", ave);

return 0;
}


よろしくお願いします。


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

Name: たかぎ [URL]  ..上級者(19,686ポイント)   Date: 2007/12/16(日) 23:59   No:12664     
Title: Re:ファイルを用いた平均値の計算    
質問の中のプログラムがまともに動かないことも問題ですが、それ以前に、

> ファイルから入力データを読み込む部分、平均値を計算する部分、結果を出力する部分

の3つを関数にすることでどのような効果が期待できるかをまず考えましょう。
例えば、入力データを読み込む部分を関数にすることで、

・ファイルから読む場合
・標準入力から読む場合
・ダイアログなどを使って入力す場合

のように仕様が変わっても、本体を変更することなく、その関数だけを変更すれば対応できるようになります。
このように、関数を分割することで、後々どんな利点があるかを考えてみると、関数の仕様が見えてくると思います。


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

Name:  ..入門者(3,006ポイント)   Date: 2007/12/17(月) 01:22   No:12666     
Title: Re:ファイルを用いた平均値の計算    
>boxさん
>たかぎさん

ご返答ありがとうございました。
なんとかコンパイル&実行が出来ました!

以下のソースなのですが、「こうした方がもっと良い」「こうすべき」というものがあれば、アドバイスのほどお願いします。


/* ファイルから読み込んだ整数値の平均を求める */

#include<stdio.h>

/* ファイルを読み込む関数 */
void r_file(FILE *fp, int *sum, int *i)
{
int n; //ファイル内の整数値を格納するための変数
fp = fopen("file02.txt", "r");

while (fscanf(fp, "%d", &n) != EOF) {
*sum = *sum + n;
*i = *i + 1;
}
fclose(fp);
}

/* ファイル内の整数値の平均を求める関数 */
double average(int sum, int i)
{
double ave;

ave = sum / i;

return ave;
}

/* 結果を出力する関数 */
void output(double ave)
{
printf("ファイル内の整数値の平均--> %5.2lf\n", ave);
}

int main()
{
FILE *fp;
int sum = 0, i = 0;
double ave;

r_file(fp, &sum, &i);
ave = average(sum, i);
output(ave);

return 0;
}



汚いソースでスミマセン(汗


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

Name: たかぎ [URL]  ..上級者(19,832ポイント)   Date: 2007/12/17(月) 01:47   No:12667     
Title: Re:ファイルを用いた平均値の計算    
> /* ファイルを読み込む関数 */
> void r_file(FILE *fp, int *sum, int *i)

これはファイルを読み込む関数ではなく、ファイルから値を読み込んで合計と個数を返す関数ですよね。
要求されている仕様とは異なると思います。

> ave = sum / i;

これでは、小数点以下が失われてしまいます。

> printf("ファイル内の整数値の平均--> %5.2lf\n", ave);

C99でなければ、double型の書式指定は %lf ではなく %f です。
http://www.kijineko.co.jp/tech/superstitions/printf-format-for-double.html

まずはこれぐらいにしておきましょう。


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

Name:  ..入門者(3,464ポイント)   Date: 2007/12/17(月) 23:16   No:12698     
Title: Re:ファイルを用いた平均値の計算    
返信が遅れてしまいました、すみません;

>たかぎさん
ご返信ありがとうございますm(_ _)m
リンク先拝見させていただきました、お気に入りに追加させていただきました^^


/* ファイルから読み込んだ整数値の平均を求める */

#include<stdio.h>

/* ファイルから入力データを読み込む関数 */
void r_file(FILE *fp)
{
fp = fopen("file02.txt", "r");
fclose(fp);
}

/* ファイル内の整数値の平均を求める関数 */
double average(FILE *fp, int *sum, int *i)
{
int n;
double ave;
while (fscanf(fp, "%d", &n) != EOF) {
*sum = *sum + n;
*i = *i + 1;
}

ave = (double)*sum / *i;

return ave;
}

/* 結果を出力する関数 */
void output(double ave)
{
printf("ファイル内の整数値の平均--> %5.2f\n", ave);
}

int main()
{
FILE *fp;
int sum = 0, i = 0;
double ave;

r_file(fp);
ave = average(fp, &sum, &i);
output(ave);

return 0;
}


ご指示のあった箇所で今の自分に訂正できるものはしました。
ただコンパイルは通るのですが、実行時に何も表示されません。

r_file関数内で、
1.ファイルを読み込み用としてオープン
2.何かの処理
3.ファイルをクローズ

上のソースでは1と3しか書けておらず2がないのが原因だと思うのですが、どういった処理を記述すれば良いのか分かりません。そこについてアドバイスを頂けないでしょうか?
またソースで普通に使っていながら「fp = fopen("file02.txt", "r");」の記述で、fpに代入されているものがいまいち分かりません。
fpにオープンされたファイルの中身が代入されているのかなぁ…とあやふやに解釈している感じです。

説明が上手く出来ず、本当にごめんなさい…。


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



Name:  ..ぴよぴよ(354ポイント)   Date: 2007/12/15(土) 10:00   No:12597       
Title: 無題    
大学の演習です。
まだ初心者で構造体を習っているところなのですがわからないので質問させてください。
問1
現在の時刻を表示する関数
void put_time(void){/*…*/}
を作成せよ。

問2
日付(年,月,日)を入力し,その日付を西暦と元号(明治,大正,昭和,平成)で表
示するプログラムを作成せよ.
ただし,元号は以下の日付から始まるとし,明治より前は西暦で表示せよ.
明治:1868年1月25日〜 大正:1912年7月30日〜
昭和:1926年12月25日〜 平成:1989年1月8日〜

(実行例)
日付を入力してください。
年:1893
月:8
日:25
西暦:1893年8月25日
元号:明治26年8月25日

問3四角形の左下と右上の座標を入力し,面積を求めるプログラムを作成せよ。

(実行例)
左下:(0.0)
右上:(0.0)
面積:0
座標を変更しますか?「Yes…1、NO…0」:1
左下
x座標:1
y座標:5
右上
x座標:10
y座標:20
左下:(1.5)
右上:(10.20)
面積135





この3問はどうしても解けません。
わかる方よろしくお願いします。


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


Name: toyo  ..初心者(5,895ポイント)   Date: 2007/12/15(土) 11:37   No:12598     
Title: Re:無題    
手も足もでないのでしょうか
そうでなければ
「どこがわからないのか」
「自分はどこまでやったのか」
をお願いします。
また自分の書いたコードをコピーして貼り付けすれば100%回答がきますよ


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

Name:  ..ぴよぴよ(33ポイント)   Date: 2007/12/15(土) 11:43   No:12599     
Title: Re:無題    
1,2はどうにかできそうなんですけど
問3が手がつきません。。。


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

Name: box  ..比類無きプログラマー(98,621ポイント)   Date: 2007/12/15(土) 12:23   No:12602     
Title: Re:無題    
> 左下
> x座標:1
> y座標:5
> 右上
> x座標:10
> y座標:20
> 左下:(1.5)
> 右上:(10.20)
> 面積135

この例題を手で計算する場合、どういう風にしますか?


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

Name: chip  ..ぴよぴよ(480ポイント)   Date: 2007/12/17(月) 19:45   No:12686     
Title: Re:無題    
四角形って、長方形のことだよね。
左上と右下の座標が入力してもらったらそこから縦と横の長さ出せるでしょ?
あとは面積の公式でおしまい

時刻関連はCのライブラリとか調べれば時刻に関する関数があった気がする。
time.hだったかな? なかったらごめんね。
元号は西暦から一定数引けばいいじゃない。

つか、どれも構造体とは関係ないと思うよ。


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

Name: box  ..ハッカー(100,251ポイント)   Date: 2007/12/17(月) 22:44   No:12694     
Title: Re:無題    
問3については、X座標とY座標をメンバーとする
構造体を定義する、という手があります。


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



Name: 自由の天使  ..ぴよぴよ(563ポイント)   Date: 2007/12/17(月) 17:22   No:12680       
Title: 無題    
こんにちは!
またまた質問なんですが、爆発アクションを作るときのプログラムのヒントをいただけると嬉しいです。

よろしくお願いします。


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


Name: Lbfuvab  ..初心者(6,024ポイント)   Date: 2007/12/17(月) 18:33   No:12682     
Title: Re:無題    
詳しく言っていただけませんか?
どんな開発環境でどんな風に実現したいかなどを。


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

Name: 通りすがり  ..初心者(5,620ポイント)   Date: 2007/12/17(月) 19:26   No:12684     
Title: Re:無題    
前にも言われましたよね、環境記述や情報がたらなすぎでみんな解らないと思います。
使ってるコンパイラや使っているライブラリは最低限かきましょう。
Cの標準関数だけで表現したいのなら別ですが、DirectXかOpenglかDXライブラリか何か使うのだと思います。
また、どのような爆発をさせたいのか、具体的な記述がないと回答のしようがないと思います。


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

Name: 自由の天使  ..ぴよぴよ(645ポイント)   Date: 2007/12/17(月) 20:18   No:12687     
Title: Re:無題    
申し訳ありません。

開発環境は『Visual C++2005 Express Edition』です。
ライブラリは、『DXライブラリ』を使用しています。

爆発アクションは、敵が爆発するものを作りたいのですが。



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



Name: dy  ..ぴよぴよ(61ポイント)   Date: 2007/12/17(月) 01:56   No:12668       
Title: キー入力とマウス取得について    
はじめまして。
いつもココで勉強させていただいています。

今回は“指定されたキーを押している状態”で“指定した場所をマウスでドラッグすると中の処理をする”といった機能を付けようと思ったのですが、行き詰ってしまったので相談させて頂きました。
開発環境はVisual Studio 2005です。

現在はキーの取得が

case WM_KEYDOWN:
  if(GetAsyncKeyState (VK_DOWN)){ //下キーが押されている時
    if(wParam=='M') //Mキーが押されている時
    {
      PlaySound(0);
    }
  }
  return 0;

で、マウスのドラッグ処理が

case WM_LBUTTONDOWN:
  MousePress=1;
  return 0;

case WM_LBUTTONUP:
  MousePress=0;
  return 0;

case WM_MOUSEMOVE:
  if(LOWORD(lParam)>490&&LOWORD(lParam)<500)
  {
    if(MousePress==1)
    {
      PlaySound(1);
    }
  }
  return 0;

というソースで、それぞれ動いております。
そして、これに追加して上記のMキーを押した状態で指定座標をドラッグしたときにまた違う音を出したくて
考え付くことはやったのですが中々うまくいきません。

まだ初心者で質問にも至らない点が多いかもしれませんが
よろしければ知恵をお貸しください。


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


Name: バグ  ..比類無きプログラマー(66,782ポイント)   Date: 2007/12/17(月) 08:58   No:12669     
Title: Re:キー入力とマウス取得について    
指定座標上でクリックされているという状態管理用の変数を1つ追加されてはいかがでしょう?

case WM_KEYDOWN:
  if(GetAsyncKeyState (VK_DOWN)){ //下キーが押されている時
    if(wParam=='M') //Mキーが押されている時
    {
if (MouseMove == TRUE)
{
/* 違う曲の演奏処理 */
}
else
{
      PlaySound(0);
}
    }
  }
  return 0;

case WM_MOUSEMOVE:
  if(LOWORD(lParam)>490&&LOWORD(lParam)<500)
  {
MouseMove = TRUE;

    if(MousePress==1)
    {
      PlaySound(1);
    }
  }
else
{
MouseMove = FALSE;
}
  return 0;


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

Name: dy  ..ぴよぴよ(121ポイント)   Date: 2007/12/17(月) 14:23   No:12676 解決!     
Title: Re:キー入力とマウス取得について    
バグさん、ありがとうございました!
今の段階で結構IF文がぐちゃぐちゃしていたので頭の中を整理するのに時間がかかりましたが
よく考えてMouseMove変数を作ったらできるようになりました。
感謝です。また何かあったらよろしくおねがいします。


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

Name: バグ  ..比類無きプログラマー(66,869ポイント)   Date: 2007/12/17(月) 14:25   No:12677     
Title: Re:キー入力とマウス取得について    
プロシージャの中に全部記述するのではなく、メッセージ毎に専用の関数を作成すると管理が楽になりますよ。頑張ってください(^-^)

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



Name: yama  ..かけだし(2,024ポイント)   Date: 2007/12/14(金) 19:35   No:12579       
Title: ランダムダンジョンの生成方法について・・・    
はじめまして、yamaっていいます。
ここで、質問するのは初めてなんですがよろしくお願いします。
いま、学校の課題で、テキストRPG(DOS窓上での)を作っているのですが、そのダンジョン部分を不思議のダンジョンみたいなランダムダンジョンにしようと思ってがんばっていたのですが、通路生成の部分がうまくいきません。
使用言語はCのみでC++はダメなようです。

以下ソースです。

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

#define W 35
#define H 20

#define MH 4
#define MW 4

#define MAXROOM 4

int main(void)
{
int i, j, k, l, roomvalue, miti, door;
int map[H][W];
RECT *room;

srand((unsigned int)time(NULL));

roomvalue = rand() % MAXROOM + 4;

room = (RECT *)malloc(sizeof(RECT) * roomvalue);

for(i = 0; i < H; i++)
{
for(j = 0; j < W; j++)
map[i][j] = 0;
}

for(i = 0; i < roomvalue; i++)
{
room[i].left = rand() % 28;
room[i].top = rand() % 13;
room[i].right = room[i].left + rand() % MW + 3;
room[i].bottom = room[i].top + rand() % MH + 3;

for(j = 0; j < i; j++)
{
if(room[i].left <= room[j].right + 1 && room[i].right >= room[j].left -            1 && room[i].top <= room[j].bottom + 1 && room[i].bottom >= room[j].top - 1 )
{
i--;
break;
}
}
}

for(i = 0; i < roomvalue; i++)
{
for(j = room[i].top; j <= room[i].bottom; j++)
{
for(k = room[i].left; k <= room[i].right; k++)
{
map[j][k] = i + 1;
}
}
}

for(i = 0; i < roomvalue; i++)
{
for(l = 0; l < 5; l++)
{
miti = rand() % 4;

if(miti == 0)
{
door = rand() % (room[i].bottom - room[i].top) + room[i].top;
for(j = door, k = room[i].left - 1; k >= 0 && !(map[j][k] >= 1                     && map[j][k] <= 10); k--)
{
map[j][k] = 10;
}
}
else if(miti == 1)
{
door = rand() % (room[i].right - room[i].left) + room[i].left;
for(j = room[i].top - 1, k = door; j >= 0 && !(map[j][k] >= 1                      && map[j][k] <= 10); j--)
{
map[j][k] = 10;
}
}
else if(miti == 2)
{
door = rand() % (room[i].bottom - room[i].top) + room[i].top;
for(j = door, k = room[i].right + 1; k < 35 && !(map[j][k] >=                     1 && map[j][k] <= 10); k++)
{
map[j][k] = 10;
}
}
else if(miti == 3)
{
door = rand() % (room[i].right - room[i].left) + room[i].left;
for(j = room[i].bottom + 1, k = door; j < 20 && !(map[j][k] >=                    1 && map[j][k] <= 10); j++)
{
map[j][k] = 10;
}
}
}
}

for(i = 0; i < H; i++)
{
for(j = 0; j < W; j++)
{
switch(map[i][j])
{
case 0:
printf("#");//通路
break;
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
printf("?");//部屋
break;
case 10:
printf("+");//壁
break;
}
}
putchar('\n');
}

return 0;
}

部屋の生成はシューティングの当たり判定を利用して、重ならないようにずらして配置できます。
ですが、通路は画面外の壁にぶつかる、ほかの通路とぶつかる等でないと止まりません。
サイトを参考にがんばってみたのですが、やはり、難しいです。
参考サイトは
http://cat.zero.ad.jp/~zau37982/wwa/doja/005.htm
http://www.asahi-net.or.jp/~kh4s-smz/midp/roguelike/random.html
http://racanhack.sourceforge.jp/rhdoc/index.html
です。このうち、三番目のサイトのglibはCに変換しようとがんばっていたのですが、途中で挫折してしまいました。

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


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


Name: バグ  ..比類無きプログラマー(66,824ポイント)   Date: 2007/12/17(月) 11:08   No:12674     
Title: Re:ランダムダンジョンの生成方法について・・・    
良い方法かどうかは分からないので例えば…ですが、部屋の出入口となる座標を先に決めてやって、そこへ向かって通路を伸ばしてやる…なんていう方法はいかがでしょうか?

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



Name: アルル  ..ぴよぴよ(678ポイント)   Date: 2007/12/16(日) 10:15   No:12633       
Title: スコアを画像で表示    
こんにちは。ゲームの館のおかげでかなり目指しているものに近づくことができました。
ただ、分からないことがあります。
管理人さんサンプルのぷよぷよゲームなどで使われているような、スコア「00001250」点などを画像で表示させる方法を教えていただけないでしょうか?
配列に千の位の数字、百の位の数字、のように1桁1桁数字を格納していく方法を考えたのですが上手くいきませんでした。それができれば、「0なら0の画像を表示」のように作成できるのですが・・・
回答可能でしたら宜しくお願いします。


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


Name: アルル  ..ぴよぴよ(692ポイント)   Date: 2007/12/17(月) 00:29   No:12665 解決!     
Title: Re:スコアを画像で表示    
自力で一つづつ配列に格納できました。お騒がせしました。

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



Name: なな  ..ぴよぴよ(269ポイント)   Date: 2007/12/16(日) 12:02   No:12636       
Title: 何が間違え?    
はじめまして。
プログラムの勉強をはじめたのですが、以下のコードに問題があるようです。

#include <stdio.h>

int main(void) {
int i,j,sum,avg;

puts("第一数値入力");
scanf("%d",&i);
puts("第二数値入力");
scanf("%d",&j);

sum=0;
sum=i+j;

avg=0;
avg=sum/2;

printf("合計:%d\n",sum);
printf("平均:%d\n",avg);

return 0;
}

コンパイルすると警告が出てしまいます。
avgに代入した値は使われていない。
sumに代入した値は使われていない。と・・・なぜでしょうか?


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


Name: box  ..比類無きプログラマー(99,748ポイント)   Date: 2007/12/16(日) 12:12   No:12637     
Title: Re:何が間違え?    

> sum=0;

ここで0を代入しても、

> sum=i+j;

i + jの値で上書きしています。
そのため、「0という、sumに代入した値を使っていない」という警告が出ます。
というわけで、

> sum=0;

この文は不要です。avgについても同じです。


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

Name: なな  ..ぴよぴよ(531ポイント)   Date: 2007/12/16(日) 13:16   No:12638     
Title: Re:何が間違え?    

#include <stdio.h>

int main(void) {
int i,j,k,max;

puts("整数入力");
scanf("%d",&i);
puts("整数入力");
scanf("%d",&j);
puts("整数入力");
scanf("%d",&k);

max=i;

if(max<j){
max=j;
}else if(max<k){
max=k;
}

printf("最大値は%d:",max);

return 0;
}


正常に動きません。if文のブロックが微妙ですよね?

本では、
if(max<j) max=j;
if(max<k) max=k;
となっているのですが、ブロックを使って書くとどうなるのかと思ってやってみました。
どこがおかしいのかご指摘下さい。


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

Name: box  ..比類無きプログラマー(99,815ポイント)   Date: 2007/12/16(日) 13:22   No:12639     
Title: Re:何が間違え?    
> 正常に動きません。

どういう風に、正常に動きませんか?


先ほどの問題は解決しましたか?
先ほどの問題とは全く別の話ですので、
新しいトピックを立てられた方がよかったと思います。


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

Name: はな  ..かけだし(1,204ポイント)   Date: 2007/12/16(日) 13:28   No:12640     
Title: Re:何が間違え?    
boxさん先ほどはありがとうございました。

> > 正常に動きません。
>
> どういう風に、正常に動きませんか?
数値をiに1、jに2、kに3を入れたのですが、最大値が2になってしまいます。
>
>
> 先ほどの問題は解決しましたか?
はい!解決しました!
> 先ほどの問題とは全く別の話ですので、
> 新しいトピックを立てられた方がよかったと思います。
そうですね。申し訳ありませんでした。



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

Name: Hermit  ..上級者(16,936ポイント)   Date: 2007/12/16(日) 13:31   No:12642     
Title: Re:何が間違え?    
	if(max<j){       // ここが TRUE で、

max=j; // ここに来たら、
}else if(max<k){ // else なので、次の if(max<k) は評価されない
max=k; // だからここに来ることはない
}

if(max<j) が FALSE だったら if(max<k) は、評価されますが


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

Name: box  ..比類無きプログラマー(99,956ポイント)   Date: 2007/12/16(日) 13:36   No:12643     
Title: Re:何が間違え?    

>ななさん


if (max < j) max = j;
if (max < k) max = k;

と、

if (max < j) {
max = j;
}
if (max < k) {
max = k;
}

とは等価です。しかし、

if (max < j) {
max = j;
}
else if (max < k) {
max = k;
}

とは等価ではありません。



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

Name: なな  ..ぴよぴよ(772ポイント)   Date: 2007/12/16(日) 16:48   No:12651     
Title: Re:何が間違え?    
Hermit、boxさんありがとうございます。無事解決しました。

今他のプログラムでまた悩んでいます・・・・。

三つの整数を読み込んで、三つとも等しいとき、「全て等しい」
二つの値が等しいとき「二つ等しい」、全て等しいとき「全て違う」
と表示するプログラムですが、if文のところがなんか違うような気がします。
一応プログラムは動いているのですが、どこかおかしいでしょうか?又、
もっとこうした方がいいというアドバイスがありましたら宜しくお願いします。

#include <stdio.h>

int main(void) {
int i,j,k;

puts("数値入力");
scanf("%d",&i);
puts("数値入力");
scanf("%d",&j);
puts("数値入力");
scanf("%d",&k);

if(i==j && j==k && j==i){
puts("全て等しい");
}else if(i==j || j==k){
puts("二つ等しい");
}else{
puts("全て違う");
}

return 0;
}



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

Name: box  ..ハッカー(100,121ポイント)   Date: 2007/12/16(日) 17:11   No:12652     
Title: Re:何が間違え?    

> 一応プログラムは動いているのですが、どこかおかしいでしょうか?

例えば、iが1, jが0, kが1のとき、本来は「二つ等しい」と
出力すべきところ、「全て違う」と出力してしまいます。

> }else if(i==j || j==k){

ここを修正する必要がありそうです。
それから、

> if(i==j && j==k && j==i){

最後の j==i は不要ですね。
最初の i==j と同じですから。


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

Name: なな  ..ぴよぴよ(812ポイント)   Date: 2007/12/16(日) 17:23   No:12653     
Title: Re:何が間違え?    
ず〜と考えていますが、
}else if(i==j || j==k){
の部分が分かりません・・・・・。


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

Name: なな  ..ぴよぴよ(841ポイント)   Date: 2007/12/16(日) 17:27   No:12654 解決!     
Title: Re:何が間違え?    
ひらめきました!!
boxさんありがとうございます!!


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



Name: ココ  ..かけだし(2,172ポイント)   Date: 2007/12/16(日) 13:30   No:12641       
Title: 無題    
1000円払ったときおつりに含まれる硬貨の数を出力したいのですが
よくわからないので教えていただけませんか・・。

#include <stdio.h>

int main()
{

int a,i,j;
int s500,s100,s50,s10,s5,s1,sum;

scanf("%d",&a);
i = 1000 - a;

j = i / 500;
s500 = j;

i = i - 500 * j;

j = i / 100;
s100 = j;
i = i - 100 * j;

j = i / 10;
s10 = j;
i = i - 10* j;

j = i / 5;
s5 = j;
i = i - 5*j;

j = i / 1;
s1 = j;


sum = s500+s100+s10+s5+s1;
printf("%d\n",sum);
}


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


Name: box  ..比類無きプログラマー(99,988ポイント)   Date: 2007/12/16(日) 13:41   No:12644     
Title: Re:無題    
> よくわからない

どういった点がわからないですか?
50円玉の枚数は求めなくてよいですか?


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



Name: りな  ..ぴよぴよ(341ポイント)   Date: 2007/12/15(土) 13:52   No:12606       
Title: 文字・配列・制御文    

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

int main(void) {

char str_1[256],str_2[256];
int i;

printf("第一の文字列入力\n");
gets(str_1);
printf("第二の文字列入力\n");
gets(str_2);

/*文字列の長さを求める*/

printf("第一の文字列の長さは%dです\n",strlen(str_1));
printf("第二の文字列の長さは%dです\n",strlen(str_2));

/*文字列の比較をする*/

i=strcmp(str_1,str_2);
if(!i){
printf("文字列は等しい\n");
}else if(i<0){
printf("%sは%sより小さい\n",str_1,str_2);
}else if(i>0){
printf("%sは%sより大きい\n",str_1,str_2);
}

/*文字列連結*/

if(strlen(str_1)+strlen(str_2)<256){
strcat(str_1,str_2);
printf("%s\n",str_1);
}
printf("終了\n");


return 0;
}



質問させて頂きます。
主に、文字列比較のところの処理です。
1、strcmp()は文字列が等しいときは0をかえしますよね?
2、0は偽ですよね?
3、すると、if(!i)で0でないときだけループするわけですよね?
4、逆に文字列が等しくiが0のときはループしないとなると、「文字列は等しい」と出力されないのではないでしょうか?
・・・・いまいち理解ができません。ご教授お願いします。