C言語何でも質問掲示板


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

規約と使い方

 
   for文を使って   
     ・[1165] 管理人 
     ・[1166] 管理人 
     ・[1176] 管理人 
     ・[1181] 管理人 
     ・[1190] 管理人 
     ・[1202] すず 
     ・[1210] 管理人 
   プログラマーについて   
     ・[1156] 管理人 
     ・[1191] ダッシュ 
     ・[1192] 管理人 
     ・[1193] ダッシュ 
     ・[1194] 管理人 
   バイナリファイル入出 ....   
     ・[1129] 管理人 
     ・[1154] GPGA 
     ・[1170] こまいぬ 
   シューティングゲーム ....   
     ・[1114] 管理人 
     ・[1115] ダッシュ 
     ・[1116] ナガタ 
     ・[1117] バグ 
     ・[1118] ナガタ 
     ・[1119] バグ 
     ・[1120] ナガタ 
     ・[1121] GPGA 
     ・[1123] 管理人 
     ・[1126] ナガタ 
     ・[1134] 管理人 
     ・[1157] Justy 
     ・[1158] 管理人 
     ・[1161] Justy 
     ・[1162] 管理人 
     ・[1167] Justy 
   移動   
     ・[1055] 管理人 
     ・[1057] Justy 
     ・[1058] GPGA 
     ・[1059] GPGA 
     ・[1061] 管理人 
     ・[1068] Justy 
     ・[1074] meigin 
     ・[1084] GPGA 
     ・[1089] meigin 
     ・[1108] GPGA 
     ・[1112] meigin 
   ズザギコの座標(?) ....   
     ・[1103] 管理人 
     ・[1105] 管理人 
     ・[1109] ダッシュ 
     ・[1110] 管理人 
     ・[1111] GPGA 
   ズザギコ アニメーシ ....   
     ・[1047] Justy 
     ・[1048] 管理人 
     ・[1049] 管理人 
     ・[1050] 管理人 
     ・[1051] バグ 
     ・[1052] バグ 
     ・[1054] Justy 
     ・[1056] 管理人 
     ・[1060] ナガタ 
     ・[1062] 管理人 
     ・[1063] ナガタ 
     ・[1064] バグ 
     ・[1065] Justy 
     ・[1067] 管理人 
     ・[1069] Justy 
     ・[1072] バグ 
     ・[1073] Justy 
     ・[1080] 管理人 
     ・[1085] バグ 
     ・[1086] バグ 
     ・[1087] バグ 
     ・[1088] バグ 
     ・[1107] 管理人 
   フィットのプログラム   
     ・[1102] 管理人 
     ・[1104] 数値計算 
     ・[1106] 管理人 
   画像が表示されません ....   
     ・[1091] 管理人 
     ・[1092] 管理人 
     ・[1093] 管理人 
     ・[1094] レン 
     ・[1095] 管理人 
     ・[1096] 管理人 
     ・[1098] レン 
     ・[1101] 管理人 
   Sleep関数について   
     ・[999] 管理人 
     ・[1000] ダッシュ 
     ・[1001] 管理人 
     ・[1002] 管理人 
     ・[1003] ダッシュ 
     ・[1004] 管理人 
     ・[1005] ダッシュ 
     ・[1006] 管理人 
     ・[1007] 管理人 
     ・[1008] 管理人 
     ・[1009] ダッシュ 
     ・[1011] 管理人 
     ・[1012] バグ 
     ・[1013] 管理人 
     ・[1014] バグ 
     ・[1015] バグ 
     ・[1016] 管理人 
     ・[1017] バグ 
     ・[1018] 管理人 
     ・[1020] ダッシュ 
     ・[1022] 管理人 
     ・[1023] 管理人 
     ・[1024] ダッシュ 
     ・[1025] 管理人 
     ・[1026] 管理人 
     ・[1027] 管理人 
     ・[1028] バグ 
     ・[1029] ダッシュ 
     ・[1030] GPGA 
     ・[1031] 管理人 
     ・[1032] Justy 
     ・[1033] 管理人 
     ・[1034] 管理人 
     ・[1035] バグ 
     ・[1036] 管理人 
     ・[1037] meigin 
     ・[1039] 管理人 
     ・[1040] 管理人 
     ・[1042] 管理人 
     ・[1043] Justy 
     ・[1044] 管理人 
     ・[1046] Justy 
     ・[1097] ダッシュ 
   (雑談)コメントについ ....   
     ・[1070] Justy 
     ・[1071] GPGA 
     ・[1083] Justy 
   イデンデント付の投稿 ....   
     ・[1076] 管理人 
     ・[1077] Justy 
     ・[1078] 管理人 
     ・[1079] バグ 
     ・[1081] Justy 
     ・[1082] 管理人 
   。.:*・゜☆.20万アク ....   
     ・[991] GPGA 
     ・[992] 管理人 
     ・[993] ダッシュ 
     ・[994] ナガタ 
     ・[995] 管理人 
     ・[996] louise 
     ・[997] 管理人 
     ・[1019] louise 
     ・[1021] 管理人 
   ポインタについて   
     ・[900] GPGA 
     ・[905] 管理人 
     ・[906] バグ 
     ・[907] 管理人 
     ・[909] 管理人 
     ・[975] なぎ 
     ・[979] 管理人 
     ・[980] バグ 
     ・[981] 管理人 
     ・[982] バグ 
     ・[984] 管理人 
     ・[987] バグ 
     ・[989] 管理人 
   デバッグについて   
     ・[956] 管理人 
     ・[958] ナガタ 
     ・[960] 管理人 
     ・[961] 管理人 
     ・[962] ナガタ 
     ・[964] 管理人 
     ・[965] ナガタ 
     ・[968] 管理人 
     ・[969] ナガタ 
     ・[970] 管理人 
     ・[971] 管理人 
     ・[972] 管理人 
     ・[976] GPGA 
     ・[977] GPGA 
     ・[983] ナガタ 
     ・[985] GPGA 
     ・[986] ナガタ 
     ・[988] GPGA 
   おもしろ動画ページ作 ....   
   ポインタについての宿 ....   
     ・[896] ふわりん 
     ・[897] 管理人 
     ・[898] 管理人 
     ・[902] ふわりん 
     ・[904] 管理人 
     ・[920] ポインタ 
     ・[924] ふわりん 
     ・[927] 管理人 
     ・[937] ポインタ 
     ・[938] 管理人 
   goto文について   
     ・[855] 管理人 
     ・[857] GPGA 
     ・[859] GPGA 
     ・[860] バグ 
     ・[861] 管理人 
     ・[864] 管理人 
     ・[869] GPGA 
     ・[870] Justy 
     ・[871] 管理人 
     ・[872] GPGA 
     ・[873] 管理人 
     ・[874] GPGA 
     ・[875] 管理人 
     ・[876] 管理人 
     ・[877] GPGA 
     ・[878] 管理人 
     ・[880] GPGA 
     ・[881] 管理人 
     ・[882] GPGA 
     ・[921] 管理人 
     ・[926] GPGA 
     ・[931] GPGA 
     ・[933] 管理人 
   雑談トピ   
     ・[884] バグ 
     ・[885] ダッシュ 
     ・[886] 管理人 
     ・[887] 管理人 
     ・[888] 管理人 
     ・[889] ダッシュ 
     ・[890] 管理人 
     ・[891] バグ 
     ・[892] 管理人 
     ・[917] ダッシュ 
     ・[923] 管理人 
   掲示板に遊び要素導入 ....   
     ・[916] ダッシュ 
     ・[922] 管理人 
   はじめて質問させてい ....   
     ・[894] 管理人 
   本家DXライブラリへリ ....   
   while分、do while分 ....   
     ・[837] バグ 
     ・[845] すず 
     ・[850] 管理人 
     ・[862] すず 
     ・[863] バグ 
     ・[865] 管理人 
     ・[866] 管理人 
     ・[867] 管理人 
     ・[868] GPGA 

Name: すず  ..ぴよぴよ(124ポイント)   Date: 2006/10/17(火) 23:38   No:1163       
Title: for文を使って    
以下の宿題が出てるんですがよく分からない所があるので教えて下さい。

以下に示すような資産運用計算プログラムを作成せよ。定期預金の初期金額と最終的な目標金額、運用利率(%)、運用年数を入力し、1年ごとの講座残高を計算する。さらに、目標金額をこえた場合には何年目で目標達成したかを表示し、目標金額に到達しなかった場合には不足額を表示するようにせよ。
なお、(ある年の残高)×(1+運用利率)=(翌年の残高)として計算する。(このときの運用利率は%ではないので注意)。また1円未満は切り捨てること。


一応出来たのはここまでです。
#include <stdio.h>
int main(void)
{
int syoki,mokuhyo,nensu,i,i2,husoku;
double ritu,zandaka;
printf("初期金額を入力してください(単位:円):");
scanf("%d",&syoki);
printf("目標金額を入力してください(単位:円):");
scanf("%d",&mokuhyo);
printf("利率を入力してください(単位:%):");
scanf("%lf",&ritu);
printf("運用年数を入力してください(単位:年):");
scanf("%d",&nensu);
printf("初期残高 %d\n",syoki);
zandaka=syoki*ritu*0.01+syoki;
printf(" 1年目 %.0f\n",zandaka);

for(i=2;i<=nensu;i++){

zandaka=zandaka*ritu*0.01+zandaka;
printf("%4d年目 %.0f\n",i,zandaka);

}
if(zandaka>=mokuhyo){
i2=i;
printf("目標達成です\n");
printf("%d年目に目標金額に到達しました\n",i2);
}

else{
husoku=mokuhyo-zandaka;
printf("目標達成出来ませんでした\n");
printf("%d円不足しています\n",husoku);
}
return 0;
}
一応表示は出来たんですけど
達成した年の表示がうまく出来ません。


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


Name: 管理人 [URL]  ..プログラマー(29,489ポイント)   Date: 2006/10/17(火) 23:42   No:1165     
Title: Re:for文を使って    
すずさん、お久しぶりです^^

なるほど、意味わかりました。
ちょっと待ってくださいね。


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

Name: 管理人 [URL]  ..プログラマー(29,533ポイント)   Date: 2006/10/17(火) 23:46   No:1166     
Title: Re:for文を使って    
すみません、出かける用事があるので、、ちょっと行ってきます。
1時間ほどで帰りますので><;


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

Name: 管理人 [URL]  ..プログラマー(31,119ポイント)   Date: 2006/10/18(水) 00:51   No:1176     
Title: Re:for文を使って    
アルゴリズムの解説はのちほどするので、
これでいいかどうか、実行して確かめてみてください。

#include <stdio.h>


void main(){
int shoki,mokuhyo,riritu,nensu,i,tassei=0;
double zandaka;
printf("初期金額(円):"); scanf("%d",&shoki);
printf("目標金額(円):"); scanf("%d",&mokuhyo);
printf("運用利率(%):"); scanf("%d",&riritu);
printf("運用年数(年):"); scanf("%d",&nensu);
zandaka=(double)shoki;
for(i=1;i<nensu;i++){
zandaka = zandaka * (1.00 + (double)riritu / 100.00);
printf("%3.d年目:%d円\n",i+1,(int)zandaka);
if(zandaka>=mokuhyo && tassei==0)
tassei=i+1;
}
if(tassei>0)
printf("目標金額に%d年目に到達しました。\n",tassei);
else
printf("目標金額まで後%d円です。\n",mokuhyo-(int)zandaka);
}


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

Name: 管理人 [URL]  ..プログラマー(32,016ポイント)   Date: 2006/10/18(水) 01:09   No:1181     
Title: Re:for文を使って    
以下処理の説明をそえました。

やりたいこと、これであってますか?


#include <stdio.h>


void main(){
int shoki,mokuhyo,riritu,nensu;//入力を受ける各変数
int i,tassei=0;//for文用のiと達成した時の年数を格納する変数。
double zandaka;//現在の残高を格納する変数。小数計算するのでdouble型
printf("初期金額(円):"); scanf("%d",&shoki);
printf("目標金額(円):"); scanf("%d",&mokuhyo);
printf("運用利率(%):"); scanf("%d",&riritu);
printf("運用年数(年):"); scanf("%d",&nensu);
zandaka=(double)shoki;//1年目の最初の残高を初期金額へ。変数はdouble型に変換
for(i=1;i<nensu;i++){//入力された年数の間ループ
zandaka = zandaka * (1.00 + (double)riritu / 100.00);
//小数計算を行うので全てdouble型に合わせます。利率は100で割ります。
printf("%3.d年目:%d円\n",i+1,(int)zandaka);
//現在の残高の表示。iは0から始まるので+1をする。
if(zandaka>=mokuhyo && tassei==0)
tassei=i+1;
//残高が目標金額を超えたら達成した時の年数を格納。ここで注意すべき点は
//1度しかこの処理が行われないようにする事。tassei変数は0で初期化しておく事で
//このような書き方で1回のみの処理が可能。&&は両式が両方ともマッチする時
//にしか真にならないという意味。
}
if(tassei>0)//達成金額が格納されていたら達成されているということ。
printf("目標金額に%d年目に到達しました。\n",tassei);
else//tassei変数が初期化0のままだったら達成していないということ。
printf("目標金額まで後%d円です。\n",mokuhyo-(int)zandaka);
}


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

Name: 管理人 [URL]  ..プログラマー(33,634ポイント)   Date: 2006/10/18(水) 02:23   No:1190     
Title: Re:for文を使って    
お書きになっていた、プログラムですが

for(i=2;i<=nensu;i++){ 


zandaka=zandaka*ritu*0.01+zandaka;
printf("%4d年目 %.0f\n",i,zandaka);

}
if(zandaka>=mokuhyo){
i2=i;
printf("目標達成です\n");
printf("%d年目に目標金額に到達しました\n",i2);
}

else{
husoku=mokuhyo-zandaka;
printf("目標達成出来ませんでした\n");
printf("%d円不足しています\n",husoku);
}
return 0;
}


ここの部分、全部計算が終わった後で、残高が目標より高いか低いか計算しているため、
計算が出来ていません。(判っていらっしゃるとは思いますが。)
ですから計算途中のfor文内で、判定を行う必要があります。

ただし、
if(zandaka>=mokuhyo)
という判定では出来ません。
これは一度目標金額を超えると、その後の年から計算は全部この条件文にマッチしてしまうからです。
breakをかいてしまったら、複利計算がとまってしまいます。
そこで、サンプルのように、tassei変数を用意し、0で初期化しておきます。
やりかたは注釈をみてください。


回答が遅くなってごめんなさい、もうお休みになられましたかね。

また、わからないことがあれば聞いてください(✿ฺ^-^✿ฺ)


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

Name: すず  ..ぴよぴよ(187ポイント)   Date: 2006/10/18(水) 16:20   No:1202     
Title: Re:for文を使って    
出来ました。ありがとうございました。
また、そのうち質問すると思いますがそのときもよろしくお願いします。ありがとうございました。


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

Name: 管理人 [URL]  ..プログラマー(33,957ポイント)   Date: 2006/10/18(水) 17:36   No:1210     
Title: Re:for文を使って    
できてよかったですね^^

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



Name: ダッシュ  ..かけだし(1,688ポイント)   Date: 2006/10/17(火) 22:23   No:1155       
Title: プログラマーについて    
勉強のノルマが終わり、やっとCのお勉強に入れます。やれやれ・・・。

他のトピの話題で思ったのですが、プロブラマーって資格とかないとなれないんですか?それとも能力さえあればどこの会社(?)でも雇ってもらえるもんなんですか?


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


Name: 管理人 [URL]  ..プログラマー(28,683ポイント)   Date: 2006/10/17(火) 23:05   No:1156     
Title: Re:プログラマーについて    
プログラマーというのは何か特別なものじゃなくて会社でプログラム書いてる人ならみんなそう呼ぶんじゃないですか?
(フリーでやってるなら家で書いててもその人はプログラマーでしょう。)
全然プログラムできない人でも会社に入ってから「研修」で、身につけた人も多く聞きますよ。
これは社会人の友達からきいた話とかばかりになりますが、
たいてい会社に入ったら最初に「研修」を受けます。
それに、会社はそこまで特別な知識無くてもみんなが一連の作業が出来るように会社内の研修制度も充実させるはずだと思います。

(以下ある大手会社に実習に行った時、部長から教わった話です)

プログラミングの資格は色々あるようですけど、それを持っていたから採用してもらえるわけでもないですし、
持っていないから採用してもらえないわけじゃないです。

情報技術者でしたら

基本情報技術者試験

ソフトウェア技術者試験

を受けるのが一般的です。

試験に受かってたら確かに、会社の面接の時の印象派いいかもしれませんが、
会社は結局「その人の意欲」を一番重視するみたいです。
能力も大事でしょうけど、会社がほしいのはガッツだそうです。


・・・つまりプログラマーっていうのはプログラムを書く人って意味なんで、何かの称号を与えられた人という意味じゃないですよ。


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

Name: ダッシュ  ..かけだし(1,742ポイント)   Date: 2006/10/18(水) 05:40   No:1191     
Title: Re:プログラマーについて    
なるほど、ということは今まで全く違う道を歩いていた人が、急遽プログラマー!なんてこともあり得ちゃうんですか?

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

Name: 管理人 [URL]  ..プログラマー(33,760ポイント)   Date: 2006/10/18(水) 05:43   No:1192     
Title: Re:プログラマーについて    
そうですよ、35歳まで全然プログラム知らなかった人がプログラマーになったって話しも聞いたことありますし、珍しい話じゃないです。
バグさんも、ついこの前まで、プログラマーじゃなかったのにプログラマーになられたそうですよ^^

「プレイする人」を「プレイヤー」というように
「プログラム書く人」を「プログラマー」というんですから☆


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

Name: ダッシュ  ..かけだし(1,765ポイント)   Date: 2006/10/18(水) 06:43   No:1193 解決!     
Title: Re:プログラマーについて    
なるほど、参考になりました。ありがとうございます。

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

Name: 管理人 [URL]  ..プログラマー(33,776ポイント)   Date: 2006/10/18(水) 06:44   No:1194     
Title: Re:プログラマーについて    
勉強がんばってください^^

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



Name: こまいぬ  ..ぴよぴよ(104ポイント)   Date: 2006/10/17(火) 15:15   No:1125       
Title: バイナリファイル入出力    
こんにちは
C++のことで質問なのですが、よろしいでしょうか?
現在、C++でプログラミングしているのですが、バイナリファイルの入出力について質問があります。
ofstreamやifstreamでファイルを開くときにバイナリモードで開く場合は引数にios::binaryを指定しますが
何も指定しなくてもなぜか問題なく動きます。これはどういうことなのですか?


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


Name: 管理人 [URL]  ..プログラマー(27,774ポイント)   Date: 2006/10/17(火) 16:46   No:1129     
Title: Re:バイナリファイル入出力    
C++はよくわからないのですが・・

何も指定しなかったらバイナリではなくテキストじゃないですか?
すみません、わかりません(_ _|||)

http://www.kumei.ne.jp/c_lang/cpp/cpp_26.htm
http://www.geocities.jp/ky_webid/cpp/library/033.html
http://www5c.biglobe.ne.jp/~ecb/cpp/cpp00.html

この辺が参考になれば・・


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

Name: GPGA  ..初心者(6,127ポイント)   Date: 2006/10/17(火) 21:13   No:1154     
Title: Re:バイナリファイル入出力    
こまいぬさんのどの環境でプログラムをしていますか?

ofstreamの引数にios::binaryを指定しない場合、テキスト出力として扱われます。
テキスト出力の際のバイナリ出力との違いですが

Windowsでプログラムを組まれているなら、0x0Aの値が0x0D,0x0Aになります。
Macでプログラムを組まれているなら、0x0Aの値が0x0Dになります
Unix,Linuxでプログラムを組まれているなら、たぶん何も変わりません。
もし、出力するデータの中に0x0Aの値がないのであれば
テキスト出力とバイナリ出力は同じ動作をします。


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

Name: こまいぬ  ..ぴよぴよ(199ポイント)   Date: 2006/10/18(水) 00:20   No:1170 解決!     
Title: Re:バイナリファイル入出力    
なるほど、バイナリ出力とテキスト出力の違いは改行文字の扱い方が違うだけのようですね。ありがとうございました。
今までバイナリファイルを扱ったプログラムを書いたことがなかったので、その辺の仕組みをよく理解していませんでした。


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



Name: 管理人 [URL]  ..プログラマー(26,771ポイント)   Date: 2006/10/17(火) 05:14   No:1113       
Title: シューティングゲームの館追加    
本当はRPGの方が好きなんですが、あんなの解説してたら、日が暮れてしまうので、シューティングの館を作りました^^
(途中まで作ってたんですが、RPGはほとんどストーリー関係になってしまいます。。。基本的な事は入門編で紹介しましたし。)

Justyさん、結局シューティング作っていたソースは全部削除してしまいました^^;
また1から書いています;


今回は単純にCで書いてあります。
あくまでもプログラミング入門者対象のサイトなので、
「わかりやすく」に重点を置くつもりです☆
次に解説するページではC++の解説もしていこうかなと思っています。
見ている人の中でCで書いてあるソースを望む人とC++で書いてあるソースを望む人とどちらが多いのかと言えばCじゃないかと思うんですが、私だけでしょうか?
実際どうなんでしょうかね?

「いつも来ても飽きないサイト作り」がんばります!
おかしな点あったらご報告お願いいたします^^

ダッシュさん、アクションゲームの館はもうちょっと先になるかもしれません^^;
最終的には「○○の館」シリーズ全カテゴリ制覇するつもりです^^


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


Name: 管理人 [URL]  ..プログラマー(26,743ポイント)   Date: 2006/10/17(火) 05:28   No:1114     
Title: Re:シューティングゲームの館追加    
前のソース消さなくても。。。おいときゃよかった・・▄█▀█●

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

Name: ダッシュ  ..かけだし(1,661ポイント)   Date: 2006/10/17(火) 06:37   No:1115     
Title: Re:シューティングゲームの館追加    
僕もアクションゲームは後にしようと思ってます。友達と進行させている例の計画ではRPGが主体になっているのでまずそちらから・・・。いくらなんでも今月中には基礎固めとかないと計画進まないんで、今月忙しすぎです(泣)読まなきゃいけない本3冊、終わらさなくちゃいけない勉強も多数残ってるし。。。さて、お勉強に戻らなくては・・・。いそいそ。。。

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

Name: ナガタ  ..ぴよぴよ(549ポイント)   Date: 2006/10/17(火) 08:38   No:1116     
Title: Re:シューティングゲームの館追加    
C++わかりません.
C言語とC++ってやっぱり別物って感じなんでしょうか?

会社とかに入ったら,どちらで書くのが一般的なんですかねー?


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

Name: バグ  ..初心者(8,170ポイント)   Date: 2006/10/17(火) 08:59   No:1117     
Title: Re:シューティングゲームの館追加    
C++は基本的に、Cに機能追加したものですから、Cを勉強しておいて得する事はあっても、損する事は無いと思いますよ(^-^)

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

Name: ナガタ  ..ぴよぴよ(583ポイント)   Date: 2006/10/17(火) 09:06   No:1118     
Title: Re:シューティングゲームの館追加    
バグさんありがとうございます.
バグさんはもう仕事されてる方ですか?


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

Name: バグ  ..初心者(8,218ポイント)   Date: 2006/10/17(火) 09:44   No:1119     
Title: Re:シューティングゲームの館追加    
はい、今年の4月から全く未経験の状態で、プログラマー始めました。28才なので、かなり遅いスタートですけどね…(;^_^A

職場の環境がVC++6.0だったので、自然とC++を勉強する事になったんですよ。

ちなみに、ここの掲示板に書き込みしたり、自宅で趣味のプログラムを書く時はBCCを使ってます。

いきなりC++から始めたせいか、正直、2つの厳密な違いがよく分かってない部分もあります(;´д`)

そんな私でも分かる位に一番大きな違いはクラスの有無でしょうか?

クラスに慣れると便利ですよ(^-^)


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

Name: ナガタ  ..ぴよぴよ(620ポイント)   Date: 2006/10/17(火) 09:58   No:1120     
Title: Re:シューティングゲームの館追加    
自分は来年から就職です.
今は大学でCを使って研究をやってます.
うちの研究室はみんなCをやってて,C++を使う機会がないんですよね.自分で勉強すればいいんですけどね・・・


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

Name: GPGA  ..入門者(3,849ポイント)   Date: 2006/10/17(火) 10:34   No:1121     
Title: Re:シューティングゲームの館追加    
私は、学生時代はCを使い続け、仕事をするようになってからC++を使い始めました。
言語の機能として、C++はCにクラス機能を拡張させたものと認識して問題ないでしょう。

ただ、クラスが追加されたことによって、プログラミングの手法が変わります。
Cは「構造化プログラムミング」という手法で組み
C++は「オブジェクト指向プログラミング」という手法で組みます。

この違いは、私が説明するより、ネット上で調べたほうが詳しく書かれていると思います。


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

Name: 管理人 [URL]  ..プログラマー(27,516ポイント)   Date: 2006/10/17(火) 14:57   No:1123     
Title: Re:シューティングゲームの館追加    
>ダッシュさん

>友達と進行させている例の計画ではRPGが主体になっているのでまずそちらから・・・。

それがいいと思いますよ^^
私もRPGを最初に作りました。
私はゲームプログラム用の本を読んだことありません。ゲームって作っていくうちに自分で「こういう書き方がいいんじゃないかな?」と思って得たものばかりです。つまりガリュウ。
だから最善の作り方である保障は微塵もありません^^;

>読まなきゃいけない本3冊、終わらさなくちゃいけない勉強も多数残ってるし。。。さて、お勉強に戻らなくては・・・。いそいそ。。。

忙しそうですね;
しかしあの時間に起きていらっしゃるとは^^;


>ナガタさん、

会社はどうなのかわかりませんけど、私が聞いた範囲では、ソフト開発している会社でC++を使わないのは聞いたこと無いです。
あくまで少ない私の聞いた範囲ですよ^^;
私の研究室の教授がオブジェクト指向プログラムの専門家なので、余計にそう思うのかもしれませんが。
オブジェクト指向っていうのは、、、たとえば

テレビがありますよね。
テレビの中身はすごく複雑な電子回路が集結していて、とても素人にはわかりません。
しかし私たちは東芝のテレビでもSONYのテレビでも、ブラウン管でもプラズマでも、複雑な全く違う構造のメカであるにもかかわらず
私たちは説明書読むことなしにリモコンで
テレビの電源をつけ、操作することが出来ます。
それは、だいたいリモコンの左上のあたりに電源ボタンがあって、数字のボタンを押せば、チャンネルがかわるという共通の規格があるからで、
その規格のおかげで簡単に操作が出来ます。
テレビの構造は複雑でも、操作する人間はその電子回路を知る必要はありません。
複雑なのはテレビというオブジェクトの中身だけでいいんです。
それを利用するには簡単なメッセージを送るだけでいい。
つまりこのデータと手続きであるメソッドの組み合わせがオブジェクトで、それぞれの操作に対してその操作方法を設定することで、内部で、どのような複雑な処理が行われようと関係なく、メッセージを与えるだけで、利用しやすくしようとする考え方をもったプログラミングがオブジェクト指向プログラミングです。

C++はこれを実現させるためのものと言えるでしょう^^
とはいえ私もC++ははじめのちょろっとしか判っていないと思います^^;


やっぱり考えたんですが、C++がガリガリにかける人は、プロであるか、自分が好きで極めた人間であって、
そういう人はネットでこんなちっこいHP参考にしたり、DXライブラリを使ったりしないでしょうね^^;
DirectXをやろうとして挫折しましたけど、そういうのに挑戦しそう^^;
OpenGLで一度ロボット作ったことありますけど、何から何まで手続きがややこしすぎ!


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

Name: ナガタ  ..ぴよぴよ(699ポイント)   Date: 2006/10/17(火) 15:20   No:1126     
Title: Re:シューティングゲームの館追加    
やっぱりC++勉強必須ですね.

オブジェクト指向っていうのはWindowsのソフト見たなものですか?
アクセサリの電卓とかボタンを押すだけで答えだしてくれるみたいな


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

Name: 管理人 [URL]  ..プログラマー(28,062ポイント)   Date: 2006/10/17(火) 16:58   No:1134     
Title: Re:シューティングゲームの館追加    
プロジェクト思考プログラミングというのは、そういう概念を用いたプログラミング手法という事で、この名前が出てきました。ですから先ほど例はただの例で、概念的なものはどういう解釈をするかで、どんなものでもオブジェクト指向になります。考え方の話ですからね。
今うっているキーボードもいってみれば、中身のわからない処理を簡単にさせているわけですからそういうことになるでしょう。

例えば、オブジェクト指向プログラミングを行うとき、ユースケース図という図を一番最初に書きます。
参考:http://www.atmarkit.co.jp/im/carc/serial/renew_uml08/renew_uml08.html
誰が何をするかを明確にしていき、
どういう流れで処理がすすむか
アクティビティ図という図を作って流れをつかみ
各クラスのつながりをクラス図で示し・・

このようにソフトの構造を図で表していくと最終的にメッセージを渡すとメッセージがかえってくる対応になります。
このような処理をプログラムにしたもののことでしょう。


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

Name: Justy  ..中級者(13,675ポイント)   Date: 2006/10/17(火) 23:15   No:1157     
Title: Re:シューティングゲームの館追加    
>本当はRPGの方が好きなんですが、あんなの解説してたら、日が暮れてしまうので
 RPGは語るべきことが多そうですね。
 スクリプトの部分だけでも相当量なのに、フィールド・バトル・イベントの3パートに分かれていますし、根本的にデータ量が多いからデータ管理方法も重要ですし、それをどうやって調整していくか、なんて考え始めたらもう・・・。


>結局シューティング作っていたソースは全部削除してしまいました^^;
 け、消してしまったんですか。バックアップもないですか。
 いや、どんなソースでも後々見たくなるときがくるかもしれません。
 分類してログをつけた上で保管しておくと、後から「そういえばあのときあの処理どう書いたっけ?」と思ったときの最高のリファレンスになりますよ。


>どちらが多いのかと言えばCじゃないかと思うんですが、私だけでしょうか?
 うーん、C言語だと思いますよ。一応C言語のサイトですし。


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

Name: 管理人 [URL]  ..プログラマー(29,210ポイント)   Date: 2006/10/17(火) 23:24   No:1158     
Title: Re:シューティングゲームの館追加    
先日パソコンを新しくしたんですが、要るデータだけ全部データうつしたんです。
古いパソコンはヤフオクででも売ろうと思ってデータ全部消したんですよね。
新しいパソコン作るとき色々ややこしいことになって疲れてたせいか、
データ移すとき「も〜いいや!あたらしいのつくろう!」と思って移しませんでしたw

新しく作っていると「あれ、あの時この処理どうやって書いてたんだっけ?」と思っても参考に出来ないんで、ちょっと後悔^^;

>RPGは語るべきことが多そうですね。

そうなんですよね〜、データベースを作るのも大変ですし、何より一番問題なのが大量に「絵」が必要になってくるんですよ。
個人で配布しないゲームを作るときは、その辺の画像勝手に使えますけど、
公開しようとするとウェブのフリーの素材を使わなくちゃならなくなって、
ちょうどいい絵がなかなか見つからないんです。
顔グラフィック一つとっても、フリーのを探すのは大変です。
自分が書けない分際で言うのも悪いですけど、自分の希望する質以上の素材がなかなか^^;

一方シューティングはガンガン同じ絵の敵が現れ、自分のたいしたモーションもなく、発射する玉だけ書いてればだいたい素材はそろいます。

配布できるゲームを作るには「素材」に一番気を使います;

どこかにそういう配布できるゲーム素材まとめてあるものないんでしょうか・・。


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

Name: Justy  ..中級者(13,816ポイント)   Date: 2006/10/17(火) 23:33   No:1161     
Title: Re:シューティングゲームの館追加    
>どこかにそういう配布できるゲーム素材まとめてあるものないんでしょうか・・。

 買ってくるか、ネット中を探して回るしかない・・・かなぁ。

【特集】ゲーム開発者のための素材集 第1回 〜キャラクタ編〜
ttp://www.activebasic.com/article/game_material/index.php?page=1

 とか。


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

Name: 管理人 [URL]  ..プログラマー(29,293ポイント)   Date: 2006/10/17(火) 23:35   No:1162     
Title: Re:シューティングゲームの館追加    
なるほど、、もうありとあらゆる素材のサイトを見まくりました^^;

本屋にいったらCDロム付で素材集みたいなんうってるんですかね〜?


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

Name: Justy  ..中級者(13,900ポイント)   Date: 2006/10/17(火) 23:46   No:1167     
Title: Re:シューティングゲームの館追加    
>本屋にいったらCDロム付で素材集みたいなんうってるんですかね〜?
 本屋では見かけたことはないですね。
 どっちかというとPCソフトとかを売ってる店で以前みかけました。
 結構種類あるみたいです。画像・音、それぞれ用途別で。



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



Name: meigin  ..ぴよぴよ(707ポイント)   Date: 2006/10/15(日) 11:46   No:1053       
Title: 移動    
こんにちは

座標で考えてみました。

可読性って重要ですね。
でも、自分の書いたのが他の人が見ても可読性があるのか
心配なんですよ。

改善した方が良いよって指摘して下さると嬉しいです。


#include <windows.h>
#include <stdio.h>
#define MAX 20

//空白の挿入
void kouran(int i){
for(int ix = 0; ix < i; ix++){
::printf(" ");
}
}

//改行
void jyouge(int i){
for(int iy = 0; iy < i; iy++){
::printf("\n");
}
}
//向き
enum direction{
top = 0, //上
bottom = 1, //下
right = 2, //右
left = 3, //左
};
//キャラクター
void kyara(int x, int y, direction z){
char ckya[4][3][8] = {
{" ↑ \n", "↑↑↑\n"," ↑ \n"},
{" ↓ \n", "↓↓↓\n"," ↓ \n"},
{" → \n", "→→→\n"," → \n"},
{" ← \n", "←←←\n"," ← \n"},
};

//表示出来る範囲内か?
const int Y_SIZE = 3;
if(y + Y_SIZE < 0 || y - Y_SIZE > MAX){
return;
}
const int X_SIZE = 6;
if(x + X_SIZE < 0 || x - X_SIZE > MAX){
return;
}

//キャラの表示範囲を決定する
int icy = 0;
int i_end_y = Y_SIZE;
if(y < 0){
icy = ::abs(y);
}else if(y > MAX){
i_end_y = Y_SIZE - (y - MAX);
}

int icx = 0;
int i_end_x = X_SIZE;
if(x < 0){
icx = ::abs(x);
if(icx % 2){
icx--;
}
}else if(x > MAX){
i_end_x = X_SIZE - (x - MAX);
if(i_end_x % 2){
i_end_x--;
}
}

::jyouge(y);


for(int iy = icy; iy < i_end_y; iy++){
::kouran(x);
for(int ix = icx; ix < i_end_x; ix+=2){
char c[3];
c[0] = ckya[z][iy][ix];
c[1] = ckya[z][iy][ix + 1];
c[2] = '\0';
::printf(c);
}
::printf("\n");
}

}
int main(void){
//座標と向き
int x = 0, y = 0;
direction z = ::bottom;

//入力されたコード
int i = 0;

//見本として表示
::kyara(x, y, z);

while(::printf("上:8 下:2 左:4 右:6 終:0\n"), ::scanf("%d", &i), i != 0){
::system("cls");
if(i == 8){
y--;
z = ::top;
}
if(i == 2){
y++;
z = ::bottom;
}
if(i == 4){
x--;
z = ::left;
}
if(i == 6){
x++;
z = ::right;
}
::kyara(x, y, z);
}
return 0;
}


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


Name: 管理人 [URL]  ..上級者(22,563ポイント)   Date: 2006/10/15(日) 15:55   No:1055     
Title: Re:移動    
特に読みにくいことは無かったですよ。
しかし、3次元配列を使用するとちょっとパッと見ではわかりにくくなりますね。2次元配列にすると条件文が増えるので、どっちがいいということはないと思いますけど。

http://dixq.net/g/#22

こんなアニメーションに似てますね。


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

Name: Justy  ..中級者(11,271ポイント)   Date: 2006/10/15(日) 17:02   No:1057     
Title: Re:移動    
>可読性って重要ですね。
 重要ですね。
 でも難しいです。自分にとって読みやすいのと他人にとって読みやすいのは大きく違うことが多々ありますから。
 シンプルに書くのが読みやすいという人もいればシンプルすぎて判らないという人もいますし、関数化して処理の流れを追いやすくしたら、今度はデバッガで追いにくいという人もいたりして・・・。
 
 それに、ソースコードの品質としてその他の要素・・・保守性、柔軟性、移植性、再利用性、理解性・・・とかと時にはぶつかってしまい、可読性を捨てなければならないこともあったりして。


>改善した方が良いよって指摘して下さると嬉しいです。
 可読性という観点から見た場合、適宜関数化もされていますし概ね処理もシンプルで流れはとてもわかりやすいです。
 定数にきちんと constつけているあたりも素晴らしいです。

 強いて難点を上げるとすれば関数名や変数名の命名でしょうか。
 このあたりは好みとかあるので一概には言えないのですが、もう少し判りやすい名前にした方がいいかと思います。
 例えば「jyouge(上下)」とかは何をする関数なのか今ひとつ見えてこない名前である気がします。
 kyara()をざっと上から見ていくと
  表示範囲のチェックをして、範囲を決定して、上下・・・上下? ってかんじになりません?
 コメントで明確に意図を書くという手でてもいいのですが、関数名を「改行を追加する・表示する、カーソル行を設定する」とかそういう類の意味の関数名をつけるとぐっと良くなります。

 変数名の方は iの使われ方と direction型を zとしているのが気になりました。
 iは一定回数繰り返すループ内のどーでもいいような局所変数として利用するような場合はともかく、関数の引数だったりとか、mian()で疲れているような「入力された数値」というような意味を持っているものならば、その意味に合った名前を付けた方がいいと思います。

 マクロ MAXも同様で、今はいいのですがこのプログラムを今後拡張するにあたって、何かの最大値というのが複数登場した場合に困る名前です。
 SCREEN_WIDTH_MAXとか、DISP_X_MAXとか何か別の単語と組み合わせておくといいかと思います。


 さて、以下蛇足です。
 今は ENTERキーもって入力が終わった、として処理をしていますが、これをキーが入力された即座に反応するようにしてみてはどうでしょうか。

#include <conio.h>

 とした上で


    do
    {
        printf("上:8 下:2 左:4 右:6 終:0\n");
        while (!kbhit())
            Sleep(10);
        
        i = getch();
        
        if(i == '8'){
            ....
        if(i == '2'){
            ....
    }while(i != '0');


 とするとキーボードの入力があった時だけ反応するようになるので、レスポンスが良くなりますし、scanfを使った場合の独特のエラー処理の面倒さ(例えば "2d"と入力された場合とか)に悩まされずに済むかと思います。


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

Name: GPGA  ..ぴよぴよ(659ポイント)   Date: 2006/10/15(日) 17:03   No:1058     
Title: Re:移動    
指摘しても良いといわれておりますので、指摘させさせていただきます。
実は私、プログラムを添削するのがと〜ても好きなんです。

ただし、私の添削には独断と偏見がかなり入るらしいので、私の考えに疑問を
持つことがあったらどんどんいってください。


まず、可読性ですが
while(::printf("上:8 下:2 左:4 右:6 終:0\n"), ::scanf("%d", &i), i != 0){
  ・・・
}

さすがにこれは読みにくいですね。
私なら、以下のように記述します。
while (true) {
  ::printf("上:8 下:2 左:4 右:6 終:0\n");
  i = getch() - '0';
  if (i == 0) {
    break;
  }

  ・・・
}

getchはconio.hをインクルードすることにより、使用することができます。
今回のプログラムで使用すると、ちょっと幸せになれるかもしれません。


#define MAX 20
についてですが

他の部分で、定数を
const int Y_SIZE = 3;
のように const を使用しているのに、MAXだけdefineなのは一貫性がありませんね。

static const int MAX = 20;

と置き換えたほうが良いと思います。



//向き
enum direction{
  top = 0,   //上
  bottom = 1, //下
  right = 2,  //右
  left = 3,  //左
};
明示的な初期化というのは、わからなくもないのですが
enumのすべてメンバに対して、値を入れるというのは、やりすぎではないかと思います。
ただ、今回のプログラムの使用方法を見ると賛否両論に分かれると思いますので、強くは言いません。


最後にC++で記述していることなので、言うことなのですが
関数の引数がない場合、voidをつけないほうがC++的な記述らしいです。

余談ですが、C++の場合、関数の引数に何も書かないとvoidとしてコンパイルされますが
Cの場合、関数の引数に何も書かないと int としてコンパイルされます。
以下のプログラムをコンパイルした場合、C++だとエラーがでますが、Cだとエラーになりません。

void sub();

int main()
{
  sub(1);
  return 0;
}

void sub(int a)
{
}




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

Name: GPGA  ..ぴよぴよ(686ポイント)   Date: 2006/10/15(日) 17:06   No:1059     
Title: Re:移動    
ぐは、getch先に言われてしまった。
ついでに、ポイントを落としてしまった。


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

Name: 管理人 [URL]  ..上級者(23,194ポイント)   Date: 2006/10/15(日) 17:13   No:1061     
Title: Re:移動    
>ぐは、getch先に言われてしまった。

ほぼ同時でしたね^^;

>ついでに、ポイントを落としてしまった。

3倍ゲットする時もあるので…


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

Name: Justy  ..中級者(11,896ポイント)   Date: 2006/10/15(日) 18:31   No:1068     
Title: Re:移動    
>ぐは、getch先に言われてしまった
 すごい僅差な時間差ですね。
 しかも考えることも同じ(w

>ついでに、ポイントを落としてしまった。
 これだけの分量書いて落ちるとは・・・・。


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

Name: meigin  ..ぴよぴよ(892ポイント)   Date: 2006/10/15(日) 23:25   No:1074     
Title: Re:移動    
Justyさん GPGAさん 管理人さん 

ありがとう

getch();
知りませんでした。
返す値が数値だと思っていたら、文字だったんですね。
動かないと思っていたら''が必要だとわかり
すぐに動くようになりました。
Enterを押す面倒が無くなって楽になりました。


変数名とか関数名とかちゃんと考えた方が良いですよね。
今度からもうちょっと考えることにします。


while (true)はfor(;;)の方が好きなんで使ったことがないんです
今回はdo{}while (式);の方が良さそうなので、
こちらを使うことにしました。
無限ループはifを1つ無駄にしているような気がするんですよ

定数とマクロの混在はダメですか。
これに代入とかしないので、統一する必要がないと思うのです。

マクロはグローバルな時に使って、
定数はローカルな時に使うようにしているのです。

マクロを安易に定数へ書き替えると
#if defined (MAX)
#endif
が存在すると、この中身が無視されてしまいます。

今回はたまたま、一部の関数でしか使いませんでしたが、
mainでも使うかも知れないと思ってマクロにしたのです。

voidは書かないのが一派的ですか。
いちいち書く必要があるのかと思っていました。
参考になりました。


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

Name: GPGA  ..入門者(2,576ポイント)   Date: 2006/10/16(月) 11:39   No:1084     
Title: Re:移動    
> while (true)はfor(;;)の方が好きなんで使ったことがないんです
> 今回は do{}while (式);の方が良さそうなので、
> こちらを使うことにしました。
私も、最初do whileにしたのですが、そうしてしまうと
0で終了した際の挙動が、変わってしまうんですよね。
どちらにしても、if文を使用しないと同じ挙動にならなかったので
あえて、while (true) を使用しました。


> 定数とマクロの混在はダメですか。
> これに代入とかしないので、統一する必要がないと思うのです。

> マクロはグローバルな時に使って、
> 定数はローカルな時に使うようにしているのです。
そもそも定数とマクロを同じものとして考えてはいけません。
C++でこそ、const int定 数 なりますが、Cの時代 const int
値を変更できない 変 数 でした。
以下のプログラムを見てください。

const int MAX = 10;

int main()
{
int ary[MAX];

return 0;
};


上記のプログラムはC++ではコンパイルが通りますが、Cではエラーが出ます。
Cでは、上記のことがあったため し か た な く 定数に#defineを用いていたのです。

#defineはそもそも使用するべきではありません。その効力が強力すぎるからです。
#defineは名前空間の壁を越えて、全てを置き換えてしまいます。

以下はその一例となります。あ、この例では名前空間は関係ないです。

#define ChangeMode 20

void ChangeMode(int mode)
{
}


これをビルドした場合、プリプロセッサが関数名が置き換え

void 20(int mode)
{
}


この、記述になった後にコンパイルが行われエラーが起こります。
なお、VC++6.0では「C2059: 構文エラー : 'constant'」とでました。 エラーが出ている行に飛んでみると

void ChangeMode(int mode)


と記述されています。何のエラーだかさっぱりわかりません。
次に、ChangeModeを#defineではなくconst intに置き換えてコンパイルしたところ
「error C2373: 'ChangeMode' : 再定義されています。」とでました。
どこかでChangeModeを定義されていることが一発でわかります。

もちろん、名前を大文字で統一するなど、自分なりの何か規約を決めれば回避できないとはいえません。
しかし、それはあくまで自分ひとりでプログラムを組む場合で、さらに規模が小さいプロジェクトでしょう。
ある程度の規模になってしまうと、このようなことが起こりえないとはいえません。
結論としては、このような問題が発生する可能性を残すこと自体が、間違っているということです。

ただし、わたしとしてもまったく#defineを使用しないわけではありません。
Debug時とRelease時での_DEBUGマクロでプログラムを区切ったりすることは多々あります。
引数つきマクロも、本当は良くありませんが、時々使用します。(個人プロジェクトもしくは、ライブラリ内で使用するもののみ)
_DEBUGマクロくらいでしたら、誰でも知っている範囲ですので使用しても問題ないと思っています。


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

Name: meigin  ..かけだし(1,210ポイント)   Date: 2006/10/16(月) 15:42   No:1089     
Title: Re:移動    
>私も、最初do whileにしたのですが、そうしてしまうと
>0で終了した際の挙動が、変わってしまうんですよね。

違いが解らないのですが、宜しければ教えて下さい。


定数では同じ名前を使えないと思うのです。
広範囲に渡って変更してしまうのが
嫌なら制限すれば良いと思います

#define MAX 100
int Max_a(){
return MAX;
}
int Max_b(){
return MAX + MAX;
}
#undef MAX

#define MAX 200
int Max_c(){
return MAX;
}
#undef MAX

間違える可能性があるのなら、
コメントで補足しておけばいいと思います。

全く確認もせずに使うというとは無いと思います。

全て大文字で関数を書くのは少ないと思います。
なので、そんなエラーを見かけるのは珍しいと思います。



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

Name: GPGA  ..入門者(3,491ポイント)   Date: 2006/10/16(月) 20:28   No:1108     
Title: Re:移動    
> 違いが解らないのですが、宜しければ教えて下さい。
meiginさんや私が提示した while を使用したプログラムでは0を押した瞬間、ループから抜けるため
main関数内の ::system("cls"); 〜 ::kyara(x, y, z);が実行されませんが
do whileを使用したプログラムでは、0を押した後に、上記の範囲のプログラムが実行されます。


> 定数では同じ名前を使えないと思うのです。
グローバル領域の定数に同じ名前を使ってはいけないと思いますが。
meiginさんのプログラムは、最初に#defineでMAXを100と定義した後
一度#undefをして再び、MAXに200を入れていますが、つまりこれを行った時点で
MAXの値が変更されているわけですから、値が変更されて瞬間、MAXは定数ではなく変数ということになりますよね?

異なるオブジェクト間で、同じ名前の定数を使用する場合は、クラス別に分ければ問題ありません。

class A
{
public :
static const int MAX = 100; // クラスAの、ある値の最大値
};

class B
{
public :
static const int MAX = 200; // クラスBの、ある値の最大値
};

int main()
{
int a = A::MAX;
int b = B::MAX;

return 0;
}

上の書き込みで言いました、名前空間の壁を越えずに、定数を使用できるというのは、上記のようなことを示します。
しかし、グローバル領域にある定数が完全に悪いとはいいません。
私のゲームプログラムの話になりますが、画面の幅と高さなどそのプログラム全体の
基底にあるものは、グローバル領域に定数を定義しています。


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

Name: meigin  ..かけだし(1,551ポイント)   Date: 2006/10/16(月) 22:17   No:1112     
Title: Re:移動    
>do whileを使用したプログラムでは、0を押した後に、上記の範囲のプログラムが実行されます。

そう言うことですか、書き方を変えたら中身も変えるのが普通だと思います。
なので、無限ループ&&ifを使わなくても同じように作動しましたよ。


普段はマクロとか定数は殆ど使ってなかったです。

ライブラリとか、付属してあるhファイルとかには、
マクロが使われていて、その方が良いのかなと思いこんでいました

私は動けばどちらでも構わないのですが……。

クラスにするぐらいなら、名前空間の方が分かり易く良さそう。
namespace A{
const int MAX = 100;
}
これでもA::MAX;で使えますよね。

クラスは好きではないのです。
メンバ変数を持たないクラスは
ただの関数でいいやと思っているほどです


信用してマクロは使わない。
定数は名前空間で。

参考になりました。
ありがとう御座います。


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



Name: ダッシュ  ..かけだし(1,331ポイント)   Date: 2006/10/16(月) 19:29   No:1100       
Title: ズザギコの座標(?)を使った移動    
友達から教えてもらったconstを使ってズザギコをやってみようと思います。で、早速エラーなんですが、何がまずいんでしょう?警告みても初期化子が多すぎるとか出ててさっぱりです。

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

const char ZUZA[3][49]={
" ∧∧ ",
" ⊂(゜Д゜⊂⌒`つ≡≡≡"
};

int main()
{
int i=0;
while(1){
puts(ZUZA[3][i]);
Sleep(80);
i++;
if(i==20)i-=20;
}
}


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


Name: 管理人 [URL]  ..プログラマー(25,565ポイント)   Date: 2006/10/16(月) 19:45   No:1103     
Title: Re:ズザギコの座標(?)を使った移動    
見た感じ初期化の数が多すぎることは無いですけど、
投稿の時に、半角スペースが省略されてるのかもしれませんね。
一度、ソースを
<pre>

</pre>
で囲んで投稿してもらえませんか?
<>は半角で入力してください。
後、配列は2行しかないのに3行分宣言されています。
そして、puts関数の引数がおかしいです。ここはポインタでなければいけません。
書くのは
puts(ZUZA[0]);
puts(ZUZA[1]);
puts(ZUZA[2]);
しか指定できません。
数字の部分を変数にしてもOKです。
配列のポインタの話は次に説明します。


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

Name: 管理人 [URL]  ..プログラマー(25,957ポイント)   Date: 2006/10/16(月) 19:53   No:1105     
Title: Re:ズザギコの座標(?)を使った移動    
int a[5];

と宣言すると
a[0]
a[1]
a[2]
a[3]
a[4]
という名前の5つの変数が用意されます。
で、この配列はaという名前で総称することが出来ます。
a[0]と具体的な配列の中の一つをさすと、一つの変数をさすことになりますが、
その総称であるaと示すと、配列のポインタを示すものです。
つまり配列のある場所、住所ですね。
putsにはその住所を引数として渡す必要があります。
ですから、具体的な配列要素を示してはいけません。

2次元配列の場合は、その上位の要素を示します。つまり

int a[5][10];

と宣言すると、たとえばa[0][0]は変数ですが、a[0]は
a[0][0],a[0][1]....a[0][9]
を総称する名前、ポインタになります。


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

Name: ダッシュ  ..かけだし(1,586ポイント)   Date: 2006/10/16(月) 20:49   No:1109     
Title: Re:ズザギコの座標(?)を使った移動    
うぉぉ・・・。ポインタですか・・・。ちょうど行き詰ってたとこです。ポインタ勉強しなおしてからまた来ます。(どれくらいかかるか分かりませんが・・・。)

ついでにソースです。


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

const char ZUZA[3][49]={
" ∧∧ ",
" ⊂(゜Д゜⊂⌒`つ≡≡≡"
};

int main()
{
int i=0;
while(1){
puts(ZUZA[3][i]);
Sleep(80);
i++;
if(i==20)i-=20;
}
}


psうわ・・・。アイコン変えずに投稿したから、最初の投稿のとこ「お礼」になってる・・・。


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

Name: 管理人 [URL]  ..プログラマー(26,352ポイント)   Date: 2006/10/16(月) 21:00   No:1110     
Title: Re:ズザギコの座標(?)を使った移動    
これは初期化子多すぎですよ^^;
49バイト分のスペースを確保せよ
と配列を宣言しているのに
59バイト分も中身に格納しようとしています。

「お礼」を「質問」に変更しておきましたよ^^

ポインタは、難しいと思わなくても、putsで使う概念くらい簡単ですから、大丈夫ですよ^^

さっきの説明じゃわかりにくかったかな?

とりえあえず、自分で

int a[10];

と宣言して配列を作ったとき、
a

a[0]
では、どう意味が違うのか、抑えることが重要です!


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

Name: GPGA  ..入門者(3,628ポイント)   Date: 2006/10/16(月) 21:15   No:1111     
Title: Re:ズザギコの座標(?)を使った移動    

> const char ZUZA[3][49]={
> " ∧∧ ",
> " ⊂(゜Д゜⊂⌒`つ≡≡≡"
> };


初期化子がわかりにくい配列を扱う場合には、以下のようにすると勝手に初期化してくれますよ〜
なお、ZUZAの使い方は二次元配列の時と何も変わりません。

const char* ZUZA[3] = {
" ∧∧ ",
" ⊂(゜Д゜⊂⌒`つ≡≡≡"
};


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



Name: 管理人 [URL]  ..上級者(17,888ポイント)   Date: 2006/10/15(日) 02:31   No:1045       
Title: ズザギコ アニメーション    
最初に比べたらだいぶマシになりました。

これで、バグは・・・ないはずです^^;(きっと)

ちなみにスリープ関数を使っていないので、モニタのリフレッシュレートを高く設定している人の
実行環境ではめちゃ早くスライドしてしまうかも。


#include <windows.h>
#include <stdio.h>
#define CH_LENGTH 25

void disp(char ch[2][3][CH_LENGTH],int n,int s,int t){
    int i,a=0,j;  char disp_ch[CH_LENGTH];
    for(i=0;i<n;i++)
        printf(" ");
    if(n>=60-(CH_LENGTH-1)){
        j=n;
        if(n%2)
            j=n-1;
        strncpy(disp_ch,ch[t][s],60-j);
        disp_ch[60-j]='\0';
    }
    else if(n<0){
        j=-n;
        if(n%2){
            j=-n+1; printf(" ");
        }
        for(i=j;i<CH_LENGTH;i++){
            disp_ch[a]=ch[t][s][i]; a++;
        }
    }
    else
        strcpy(disp_ch,ch[t][s]);
    printf("%s\n",disp_ch);
}

void main(){
    int i,j,t=1,n=60;
    char ch[2][3][CH_LENGTH]
    ={{"    ∧∧      ","  ⊂(゜Д゜)    ","⊆⊂´ ̄⊂二ソ 2ゲトー"},
      {"   ∧∧ 2ゲトー  ","⊂(゜Д゜⊂⌒`つ≡≡≡","        ズザー "}};
    while(1){
        while(1){
            for(i=0;i<3;i++)
                disp(ch,n,i,t);
            if(t==1){
                n--;
                if(n==-CH_LENGTH){
                    t=0; n++; break;
                }
            }
            else{
                n++;
                if(n==60){
                    t=1; break;
                }
            }
            system("cls");
        }
    }
}


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


Name: Justy  ..中級者(9,728ポイント)   Date: 2006/10/15(日) 04:04   No:1047     
Title: Re:ズザギコ アニメーション    
>最初に比べたらだいぶマシになりました。
 見たカンジ大丈夫そうです。お疲れ様です。
 と、思ったら。

 void main()はマズイっす。一応 intを返さないと。
 (単独で使われることが多いので)結構この戻り値ってのは軽視されがちなんですが、プログラム同士が連携するときとかで、処理が成功したかどうかをこの値で見ることがあったりします。


>何かtabインデントが使える掲示板ないんでしょうかね。
 うーん、多分投稿されたときの文字処理で、tabがあったら自動的に &nbsp;に変換するようになっているか、preタグ内は改行を brタグにしないようにすればいいと思うのですが・・・。
 21Styleさんのサポート掲示板で訊いてみて可能なら修正してもらうってのはどうでしょう?(お問い合わせフォームで不具合として報告してしまってもいいかもしれません)


※ さっきの改行問題ですが、結局全角変換で対応しました。
 &nbsp;方式で試したら文字数制限に引っかかってしまったので(w


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

Name: 管理人 [URL]  ..上級者(22,318ポイント)   Date: 2006/10/15(日) 04:44   No:1048     
Title: Re:ズザギコ アニメーション    
ちょ、Justyさん、別な意味ですごいですよw

3倍のポイントゲットは10回投稿したら1回の割合で行われるように設定してあるんですけど、
Justyさん3回投稿全部ゲット成功してますよw
確率的には10の3乗分の1、つまり千分の一^^;
少ない投稿数で、すでにポイント単独2位w

>void main()はマズイっす。

なるほど、組み合わせるときにはそういうことがあるんですね。
こんな単体のプログラムでもint型にする意味があるんですか?

>21Styleさんのサポート掲示板で訊いてみて可能なら修正してもらうってのはどうでしょう?

あぁ、そういう希望も聞いてもらえる可能性あるんですか?
一回聞いてみる価値ありですね!

>結局全角変換で対応しました。

私も最初それでやってたんですけど、初心者の人だと「認識されない文字のエラー」みたいなエラーが出たとき対処ができないかと
思っていちいちプログラムをウェブにアップロードしていました。
全角は後で置換したらいいんし、見やすいし、使いやすいんでいいですね。

ちょっと21スタイルさんのほうに聞いてみます!


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

Name: 管理人 [URL]  ..上級者(22,428ポイント)   Date: 2006/10/15(日) 06:45   No:1049     
Title: Re:ズザギコ アニメーション    
あれ!なんでwhile(1)2個も使ってるんだろう^^;
あ、そういえば、右に移動するループ文と、左に移動するループ文分けて書いててあとでくっつけたからそうなっってしまったんですね。
こうみたらwhile2つ使わずにbreakをcontinueで書けばよかったですね。


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

Name: 管理人 [URL]  ..上級者(22,544ポイント)   Date: 2006/10/15(日) 07:54   No:1050     
Title: Re:ズザギコ アニメーション    
インデントの件ですが、やはりcgiの機能を変更していただくことは出来なかったようです。
しかし<pre>タグで書いた文章はテキストエディタにコピーすると改行されませんが、
ワードにコピーすると改行されるようです。
なのでワードにいったんコピーしてから任意のエディタにコピーしてくださいという事でした。

初めて訪問された方とかには判りにくいですね・・。

何かいい方法はないんでしょうか。いまさら掲示板を変更することはしたくないんですけど・・。


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

Name: バグ  ..入門者(4,083ポイント)   Date: 2006/10/15(日) 09:33   No:1051     
Title: Re:ズザギコ アニメーション    
次にメインプログラムを…

#include "CONSOLE.h"

struct NEKO
{
int X;
int Y;
int Color;
BOOL RorL;
BOOL DispFlag;
};

class ZUZANEKO
{
public:
NEKO Neko;
char Right[2][30] , Left[2][30];
public:
void Initial();
void NekoSetting();
void NekoDisp();
void NekoMove();
};

void ZUZANEKO::Initial()
{
Neko.X = 0;
Neko.Y = 0;
Neko.RorL = FALSE;
Neko.DispFlag = FALSE;

memset( Right , 0 , sizeof( char ) * 2 * 30 );
memset( Left , 0 , sizeof( char ) * 2 * 30 );

sprintf( Right[0] , "   ∧∧  " );
sprintf( Right[1] , "⊂(゜ Д゜ ⊂⌒`⊃≡≡≡ " );
sprintf( Left[0] , " ∧∧ " );
sprintf( Left[1] , " ≡≡≡⊂´⌒⊃ ゜Д ゜)⊃" );
}

void ZUZANEKO::NekoSetting()
{
Neko.DispFlag = TRUE;
Neko.Y = RND( 11 ) * 2;
Neko.Color = RND( 7 ) + 8;
Neko.RorL = RND( 2 );

if( Neko.RorL )
{
Neko.X = 78;
}
else
{
Neko.X = -24;
}
}

void ZUZANEKO::NekoDisp()
{
int i , len , x;
char str[2][30];

memset( str , 0 , sizeof( char ) * 2 * 30 );

if( Neko.X > 54 )
{
x = Neko.X;
len = 80 - Neko.X;

for( i = 0 ; i < len ; i++ )
{
if( Neko.RorL )
{
str[0][i] = Right[0][i];
str[1][i] = Right[1][i];
}
else
{
str[0][i] = Left[0][i];
str[1][i] = Left[1][i];
}
}

if( str[0][0] == '\0' )
{
Neko.DispFlag = FALSE;
return;
}
}
else if( Neko.X < 0 )
{
x = 0;
len = -1 * Neko.X;

if( Neko.RorL )
{
sprintf( str[0] , "%s" , &Right[0][len] );
sprintf( str[1] , "%s" , &Right[1][len] );
}
else
{
sprintf( str[0] , "%s" , &Left[0][len] );
sprintf( str[1] , "%s" , &Left[1][len] );
}

if( str[0][0] == '\0' )
{
Neko.DispFlag = FALSE;
return;
}
}
else
{
x = Neko.X;

if( Neko.RorL )
{
sprintf( str[0] , "%s" , Right[0] );
sprintf( str[1] , "%s" , Right[1] );
}
else
{
sprintf( str[0] , "%s" , Left[0] );
sprintf( str[1] , "%s" , Left[1] );
}
}

TextColor( Neko.Color );
Locate( x , Neko.Y );
printf( "%s\n" , str[0] );
Locate( x , Neko.Y + 1 );
printf( "%s\n" , str[1] );
}

void ZUZANEKO::NekoMove()
{
if( Neko.RorL )
{
Neko.X -= 2;
}
else
{
Neko.X += 2;
}
}

void main()
{
srand( ( unsigned )time( NULL ) );

int i , j;
BOOL flag;
ZUZANEKO zuza[10];

for( i = 0 ; i < 10 ; i++ )
{
zuza[i].Initial();
}

while( 1 )
{
for( i = 0 ; i < 10 ; i++ )
{
if( zuza[i].Neko.DispFlag )
{
zuza[i].NekoDisp();
zuza[i].NekoMove();
}

if( ( !zuza[i].Neko.DispFlag ) && ( RND( 10 ) == 0 ) )
{
flag = TRUE;
while( flag )
{
flag = FALSE;
zuza[i].NekoSetting();
for( j = 0 ; j < 10 ; j++ )
{
if( i == j )
{
continue;
}

if( zuza[i].Neko.Y == zuza[j].Neko.Y )
{
flag = TRUE;
}
}
}
}
}

Sleep(17);
}
}


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

Name: バグ  ..初心者(5,526ポイント)   Date: 2006/10/15(日) 09:36   No:1052     
Title: Re:ズザギコ アニメーション    
すみません、順番が逆になりましたが、これがCONSOLE.hです。

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

/******************************************************************/
/* ☆☆☆ 構造体 ☆☆☆ */
/******************************************************************/
struct TIMER
{
long Start;
long End;
long Now;
long Count;
};

/******************************************************************/
/* ☆☆☆ グローバル変数 ☆☆☆ */
/******************************************************************/
HANDLE hOut = GetStdHandle( STD_OUTPUT_HANDLE );
TIMER mSec;
LARGE_INTEGER Counter;

/******************************************************************/
/* ☆☆☆ DOS窓の大きさ設定 ☆☆☆ */
/* */
/* 引 数 : int Left = Windowの左端X座標 */
/* int Top = Windowの上端Y座標 */
/* int Right = Windowの右端X座標 */
/* int Bottom = Windowの下端Y座標 */
/* */
/* 戻り値 : な  し */
/******************************************************************/
void SetWindowSize( int Left , int Top , int Right , int Bottom )
{
SMALL_RECT Sr;
Sr.Left = Left;
Sr.Top = Top;
Sr.Right = Right;
Sr.Bottom = Bottom;
SetConsoleWindowInfo( hOut , TRUE , &Sr );
}

/******************************************************************/
/* ☆☆☆ カーソル表示・非表示設定 ☆☆☆ */
/* */
/* 引 数 : BOOL Flag = TRUE / カーソル表示 */
/* = FALSE / カーソル消去 */
/* */
/* 戻り値 : な  し */
/******************************************************************/
void CursolSet( BOOL Flag )
{
CONSOLE_CURSOR_INFO Cci;
GetConsoleCursorInfo( hOut , &Cci );
Cci.bVisible = Flag;
SetConsoleCursorInfo( hOut , &Cci );
}

/******************************************************************/
/* ☆☆☆ テキストの色指定 ☆☆☆ */
/* */
/* 引 数 : int color = テキストの色 */
/* 1:青 / 2:緑 / 4:赤 / 8:強調 */
/* 16:背景 青 / 32:背景 緑 / 64:背景 赤 / 128:背景 強調 */
/* */
/* 戻り値 : な  し */
/******************************************************************/
void TextColor( int Color )
{
SetConsoleTextAttribute( hOut , Color );
}

/******************************************************************/
/* ☆☆☆ テキスト表示座標指定 ☆☆☆ */
/* */
/* 引 数 : int x = x座標 */
/* int y = y座標 */
/* */
/* 戻り値 : な  し */
/******************************************************************/
void Locate( int x , int y )
{
COORD Coord;
Coord.X = x;
Coord.Y = y;
SetConsoleCursorPosition( hOut , Coord );
}

/******************************************************************/
/* ☆☆☆ 疑似ClearScreen ☆☆☆ */
/* */
/* 引 数 : な  し */
/* */
/* 戻り値 : な し */
/******************************************************************/
void CLS()
{
int i , j;

CONSOLE_SCREEN_BUFFER_INFO Csbi;
GetConsoleScreenBufferInfo( hOut , &Csbi );

for( i = 0 ; i <= Csbi.srWindow.Right ; i++ )
{
for( j = 0 ; j <= Csbi.srWindow.Bottom ; j++ )
{
TextColor( 0 );
Locate( i , j );
printf( " " );
}
}

Locate( Csbi.srWindow.Left , Csbi.srWindow.Top );
TextColor( 7 );
}

/******************************************************************/
/* ☆☆☆ 乱数発生 ☆☆☆ */
/* */
/* 引 数 : int rnd = 乱数の幅 */
/* */
/* 戻り値 : 乱数 */
/******************************************************************/
int RND( int rnd )
{
return( rand() % rnd );
/*
乱数をバラけさせたい場合はmain関数の最初かコンストラクタで下記を追加する。

srand( ( unsigned )time( NULL ) );
*/

}


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

Name: Justy  ..中級者(10,162ポイント)   Date: 2006/10/15(日) 15:25   No:1054     
Title: Re:ズザギコ アニメーション    
>3倍のポイントゲットは10回投稿したら1回の割合で行われるように設定してあるんですけど、
Justyさん3回投稿全部ゲット成功してますよw

 はい、気付いてました(w
 投稿前に「みんなもう1000点台だよ、追いつくのは無理だなぁ」と思ってたらあっという間に・・・。


>インデントの件ですが、やはりcgiの機能を変更していただくことは出来なかったようです。
 無理でしたか。


>しかし<pre>タグで書いた文章はテキストエディタにコピーすると改行されませんが、ワードにコピーすると改行されるようです。
 なんと!
 って、うちのマシンにはワードが入ってない・・・(;д;)

 
>何かいい方法はないんでしょうか。
 そうですねぇ・・・当面は&nbsp;で対処、文字数制限に引っかかりそうなら、コードをいろいろ縮めてなんとか納める、ダメなら分割投稿するか添付する。
 ってところではないでしょうか。


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

Name: 管理人 [URL]  ..上級者(23,143ポイント)   Date: 2006/10/15(日) 16:06   No:1056     
Title: Re:ズザギコ アニメーション    
お〜〜バグさん、カラフルですね!!
すごいです^^
色つけるのとかやったこと無いんで新鮮でした^^

左でとまってしまうのがちょっとおしいですね^^;
さすがコンソールならバグさんですね!

コンソールって画像を表示することも出来るんですか?
たかがコンソール、されどコンソールですねw


>Justyさん

もうダントツですね^^;

>って、うちのマシンにはワードが入ってない・・・(;д;)

マジですか;
ワードただの書類作るほかにも積分の公式とか特別な式がかけて便利ですよね。
表作ったり、プレゼン作ったりすることあるんでオフィス重宝してます。
単に他のよいソフトを知らないだけですがw

そうですね〜当面は空白文字で対処しましょう。
せっかくここまで書いてきた掲示板変更するのはもったいないですし。
オプションもかなり申し込んだのでかれこれ6000円くらいこの掲示板にはらってますし^^;
全ログ保存オプションつけたんで、永久にログが消えることがありません。
うちのHPはプログラムのソースコード投稿があるので、特にログ多くなるでしょうね^^;


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

Name: ナガタ  ..ぴよぴよ(522ポイント)   Date: 2006/10/15(日) 17:06   No:1060     
Title: Re:ズザギコ アニメーション    
バグさんがかかれたプログラムきれいですねー☆
これってC++ですか?見たことのない言葉がいっぱいあるので.


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

Name: 管理人 [URL]  ..上級者(23,232ポイント)   Date: 2006/10/15(日) 17:15   No:1062     
Title: Re:ズザギコ アニメーション    
これはC++ですね^^

コンソール画面でも色をつけるだけで、こんなに華やかさがちがうんですね〜☆


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

Name: ナガタ  ..ぴよぴよ(535ポイント)   Date: 2006/10/15(日) 17:48   No:1063     
Title: Re:ズザギコ アニメーション    
C++ですか.Cでも色はつけれるんですか?

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

Name: バグ  ..初心者(5,629ポイント)   Date: 2006/10/15(日) 18:10   No:1064     
Title: Re:ズザギコ アニメーション    
>>管理人さん
え?左で止まりますか?
うちでは、ちゃんと通り過ぎて行くんですが…あれ?(@_@;)

>>ナガタさん
Cでも色を着ける事できますよ(^-^)
WINDOWS上のDOS窓アプリならば、前に書き込みしたCONSOLE.hの中にTextColorという関数で色を変えているので、その中を見てみて下さい。


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

Name: Justy  ..中級者(11,787ポイント)   Date: 2006/10/15(日) 18:13   No:1065     
Title: Re:ズザギコ アニメーション    
>もうダントツですね^^;
 管理人さんこそ(w

>ワードただの書類作るほかにも積分の公式とか特別な式がかけて便利ですよね。
>表作ったり、プレゼン作ったりすることあるんでオフィス重宝してます。

 便利なんですけどね。今はビューアだけは入れています。
 元々 DTP系のソフトが好きなんで、いつもそっち方面のソフトを使っています。
 配布するときは txt/html/chm/pdfのどれかになるので、書くソフトはどれもいいんですよ、結局。

 とはいえ、オリジナルドキュメントを他人と共有しなければならない時はワードという選択肢もあるかもしれませんが・・・。


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

Name: 管理人 [URL]  ..上級者(23,433ポイント)   Date: 2006/10/15(日) 18:28   No:1067     
Title: Re:ズザギコ アニメーション    
↑クリックで拡大↑

>バグさん、

私が実行すると、こんな感じになります。
左側に来たとき、胴体だけが止まった状態になります。
まだプログラムの詳細を見てないんで、原因はわかりませんけど、、。

>Justyさん、

私は文書作成は報告書や論文書く時には他にラテックス使いいます。
あれ、かなり綺麗にかけますよね。
ただラテックスで表を書くのはかなり面倒なんで、なかなかリナックス使わないときには手を出しませんが^^;

ちょっと急激にポイントが上がりすぎたなと思ったので密かに獲得ポイントを3倍→2倍にして、獲得確率も1/10→1/15にしたんですけど、
それでも獲得してしまう強運!すごいですねw


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

Name: Justy  ..中級者(11,995ポイント)   Date: 2006/10/15(日) 19:08   No:1069     
Title: Re:ズザギコ アニメーション    
>うちでは、ちゃんと通り過ぎて行くんですが…あれ?(@_@;)

 うちも左端で止まります。
 ひょっとしてOSのバージョンとかがバグさんのと違ってて、コンソールの挙動が変わってしまっているのでしょうか。

 察するに Neko.DispFlag = FALSE する条件が str[0][0] == '\0' だけなので、耳の絵の部分が画面の端から消えた瞬間に条件が満たされてしまって移動・更新しなくなるからだと思います。


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

Name: バグ  ..初心者(5,480ポイント)   Date: 2006/10/15(日) 21:03   No:1072     
Title: Re:ズザギコ アニメーション    
>>Justyさん
>>察するに Neko.DispFlag = FALSE する条件が str[0][0] == '\0' だけなので、耳の絵の部分が画面の端から消えた瞬間に条件が満たされてしまって移動・更新しなくなるからだと思います。

いえ、それも見越していたので、スペースを入れて耳と胴体の文字列を同じ長さにしておいたのですが…
たしかに、掲示板に書き込みしたソースは耳が短くなってますね…何故だろう(;^_^A


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

Name: Justy  ..中級者(12,419ポイント)   Date: 2006/10/15(日) 21:20   No:1073     
Title: Re:ズザギコ アニメーション    
>いえ、それも見越していたので、スペースを入れて耳と胴体の文字列を同じ長さにしておいたのですが…
>たしかに、掲示板に書き込みしたソースは耳が短くなってますね…何故だろう(;^_^A

 あー、なるほど。
 全角スペースではなく、半角スペースだったんですね。
 htmlの仕様上、タブとか半角スペースが複数連続していても半角スペース1つにまとめられてしまうんです。
 なので、""内の半角スペースが投稿の段階で消えてしまったのでしょう。

 半角スペースの部分を全部半角で&nbsp;と書くときちんと半角スペースになります。


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

Name: 管理人 [URL]  ..上級者(24,032ポイント)   Date: 2006/10/16(月) 00:51   No:1080     
Title: Re:ズザギコ アニメーション    
あ〜それでですか。
ソースの投稿方法は別トピで新しく紹介したので、そちらをご覧ください^^


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

Name: バグ  ..初心者(6,967ポイント)   Date: 2006/10/16(月) 12:11   No:1085     
Title: Re:ズザギコ アニメーション    
ちょっと修正しました(^_^;)


#include "CONSOLE.h"

struct NEKO
{
int X;
int Y;
int Color;
BOOL RorL;
BOOL DispFlag;
};

class ZUZANEKO
{
public:
NEKO Neko;
char Right[2][30] , Left[2][30];
public:
void Initial();
void NekoSetting();
void NekoDisp();
void NekoMove();
};

void ZUZANEKO::Initial()
{
Neko.X = 0;
Neko.Y = 0;
Neko.RorL = FALSE;
Neko.DispFlag = FALSE;

memset( Right , 0 , sizeof( char ) * 2 * 30 );
memset( Left , 0 , sizeof( char ) * 2 * 30 );

sprintf( Right[0] , "   ∧∧        " );
sprintf( Right[1] , "⊂(゜Д゜⊂⌒`⊃≡≡≡ " );
sprintf( Left[0] , "        ∧∧   " );
sprintf( Left[1] , " ≡≡≡⊂´⌒⊃゜Д゜)⊃" );
}

void ZUZANEKO::NekoSetting()
{
Neko.DispFlag = TRUE;
Neko.Y = RND( 11 ) * 2;
Neko.Color = RND( 7 ) + 9;
Neko.RorL = RND( 2 );

if( Neko.RorL )
{
Neko.X = 76;
}
else
{
Neko.X = -24;
}
}

void ZUZANEKO::NekoDisp()
{
int i , len , x;
char str[2][30];

memset( str , 0 , sizeof( char ) * 2 * 30 );

if( Neko.X > 54 )
{
x = Neko.X;
len = 80 - Neko.X;

for( i = 0 ; i < len ; i++ )
{
if( Neko.RorL )
{
str[0][i] = Right[0][i];
str[1][i] = Right[1][i];
}
else
{
str[0][i] = Left[0][i];
str[1][i] = Left[1][i];
}
}

if( str[0][0] == '\0' && str[1][0] == '\0' )
{
Neko.DispFlag = FALSE;
return;
}
}
else if( Neko.X < 0 )
{
x = 0;
len = -1 * Neko.X;

if( Neko.RorL )
{
sprintf( str[0] , "%s" , &Right[0][len] );
sprintf( str[1] , "%s" , &Right[1][len] );
}
else
{
sprintf( str[0] , "%s" , &Left[0][len] );
sprintf( str[1] , "%s" , &Left[1][len] );
}

if( str[0][0] == '\0' && str[1][0] == '\0' )
{
Neko.DispFlag = FALSE;
return;
}
}
else
{
x = Neko.X;

if( Neko.RorL )
{
sprintf( str[0] , "%s" , Right[0] );
sprintf( str[1] , "%s" , Right[1] );
}
else
{
sprintf( str[0] , "%s" , Left[0] );
sprintf( str[1] , "%s" , Left[1] );
}
}

TextColor( Neko.Color );
Locate( x , Neko.Y );
printf( "%s\n" , str[0] );
Locate( x , Neko.Y + 1 );
printf( "%s\n" , str[1] );
}

void ZUZANEKO::NekoMove()
{
if( Neko.RorL )
{
Neko.X -= 2;
}
else
{
Neko.X += 2;
}
}

void main()
{
srand( ( unsigned )time( NULL ) );

int i , j;
BOOL flag;
ZUZANEKO zuza[10];

SetCursol( FALSE );

for( i = 0 ; i < 10 ; i++ )
{
zuza[i].Initial();
}

while( 1 )
{
for( i = 0 ; i < 10 ; i++ )
{
if( zuza[i].Neko.DispFlag )
{
zuza[i].NekoDisp();
zuza[i].NekoMove();
}

if( ( !zuza[i].Neko.DispFlag ) && ( RND( 10 ) == 0 ) )
{
flag = TRUE;
while( flag )
{
flag = FALSE;
zuza[i].NekoSetting();
for( j = 0 ; j < 10 ; j++ )
{
if( i == j )
{
continue;
}

if( zuza[i].Neko.Y == zuza[j].Neko.Y )
{
flag = TRUE;
}
}
}
}
}

Sleep(17);
}
}


多分、これでちゃんと通り過ぎてくれるはずです(^-^)


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

Name: バグ  ..初心者(7,735ポイント)   Date: 2006/10/16(月) 12:19   No:1086     
Title: Re:ズザギコ アニメーション    
あ、CONSOLE.hも古いVerだったので、新しいのを貼っておきますね。


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

/******************************************************************/
/* ☆☆☆ グローバル変数 ☆☆☆ */
/******************************************************************/
HANDLE hOut = GetStdHandle( STD_OUTPUT_HANDLE );

/******************************************************************/
/* ☆☆☆ カーソル表示・非表示設定 ☆☆☆ */
/* */
/* 引 数 : BOOL Flag = TRUE / カーソル表示 */
/* = FALSE / カーソル消去 */
/* */
/* 戻り値 : な  し */
/******************************************************************/
void SetCursol( BOOL Flag )
{
CONSOLE_CURSOR_INFO Cci;

GetConsoleCursorInfo( hOut , &Cci );
Cci.bVisible = Flag;

SetConsoleCursorInfo( hOut , &Cci );
}

/******************************************************************/
/* ☆☆☆ テキストの色指定 ☆☆☆ */
/* */
/* 引 数 : int CharColor = テキストの色 */
/* 1:青 / 2:緑 / 4:赤 / 8:強調 */
/* */
/* 戻り値 : TRUE = 成功 */
/* FALSE = 失敗 */
/******************************************************************/
BOOL TextColor( int Text )
{
if( Text < 0 || Text > 15 )
{
return( FALSE );
}

int Color , Back;
CONSOLE_SCREEN_BUFFER_INFO Csbi;
GetConsoleScreenBufferInfo( hOut , &Csbi );

Back = Csbi.wAttributes & 0xf0;
Text &= 0x0f;
Color = Text + Back;

SetConsoleTextAttribute( hOut , Color );

return( TRUE );
}

/******************************************************************/
/* ☆☆☆ 背景の色指定 ☆☆☆ */
/* */
/* 引 数 : int BgColor = 背景の色 */
/* 1:青 / 2:緑 / 4:赤 / 8:強調 */
/* */
/* 戻り値 : TRUE = 成功 */
/* FALSE = 失敗 */
/******************************************************************/
BOOL BackColor( int Back )
{
if( Back < 0 || Back > 15 )
{
return( FALSE );
}

int Color , Text;
CONSOLE_SCREEN_BUFFER_INFO Csbi;
GetConsoleScreenBufferInfo( hOut , &Csbi );

Text = Csbi.wAttributes & 0x0f;
Back = ( Back << 4 ) & 0xf0;
Color = Text + Back;

SetConsoleTextAttribute( hOut , Color );

return( TRUE );
}

/******************************************************************/
/* ☆☆☆ テキスト表示座標指定 ☆☆☆ */
/* */
/* 引 数 : int x = x座標 */
/* int y = y座標 */
/* */
/* 戻り値 : な  し */
/******************************************************************/
void Locate( int x , int y )
{
COORD Coord;
Coord.X = x;
Coord.Y = y;
SetConsoleCursorPosition( hOut , Coord );
}

/******************************************************************/
/* ☆☆☆ 疑似ClearScreen ☆☆☆ */
/* */
/* 引 数 : な  し */
/* */
/* 戻り値 : な し */
/******************************************************************/
void CLS()
{
int i , j;
CONSOLE_SCREEN_BUFFER_INFO Csbi;

GetConsoleScreenBufferInfo( hOut , &Csbi );

for( i = 0 ; i <= Csbi.srWindow.Right ; i++ )
{
for( j = 0 ; j <= Csbi.srWindow.Bottom ; j++ )
{
BackColor( 0 );
Locate( i , j );
printf( " " );
}
}

Locate( Csbi.srWindow.Left , Csbi.srWindow.Top );
TextColor( 7 );
}

/******************************************************************/
/* ☆☆☆ 乱数発生 ☆☆☆ */
/* */
/* 引 数 : int rnd = 乱数の幅 */
/* */
/* 戻り値 : 乱数 */
/******************************************************************/
int RND( int rnd )
{
return( rand() % rnd );
/*
乱数をバラけさせたい場合はmain関数の最初かコンストラクタで下記を追加する。

srand( ( unsigned )time( NULL ) );
*/

}



まだ、いくつかの関数があるのですが、文字数オーバーなので、必要な分だけ、載せておきます(^_^;)


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

Name: バグ  ..初心者(7,986ポイント)   Date: 2006/10/16(月) 12:58   No:1087     
Title: Re:ズザギコ アニメーション    
そうそう、昔作ったので、こんなのもありました。ずっと見ていると、なんとなく癒される気がします(笑)


#include "CONSOLE.h"

void main()
{
srand( ( unsigned )time( NULL ) );
int x , y , xx , yy;
CONSOLE_SCREEN_BUFFER_INFO CSBI;


TextColor( RND( 7 ) + 9 );
x = 0;
y = 0;
xx = 2;
yy = 1;


while( 1 )
{
GetConsoleScreenBufferInfo( hOut , &CSBI );
Locate( x , y );
printf( "●" );
Sleep( 20 );
Locate( x , y );
printf( " " );

if( x + xx < 0 || x + xx > CSBI.srWindow.Right )
{
if( xx < 0 )
xx = ( RND( 2 ) + 1 );
else
xx = ( RND( 2 ) + 1 ) * - 1;

TextColor( RND( 7 ) + 9 );
}

if( y + yy < 0 || y + yy > CSBI.srWindow.Bottom )
{
yy *= -1;
TextColor( RND( 7 ) + 9 );
}

x += xx;
y += yy;
}
}


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

Name: バグ  ..初心者(8,052ポイント)   Date: 2006/10/16(月) 13:00   No:1088     
Title: Re:ズザギコ アニメーション    
あ、そうだ。↑のプログラム、動いている時に、Windowの大きさを変えてみて下さい。どうでも良い部分に妙にこだわってみました(^_^;)


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

Name: 管理人 [URL]  ..プログラマー(26,151ポイント)   Date: 2006/10/16(月) 20:12   No:1107     
Title: Re:ズザギコ アニメーション    
おぉ〜、画面の端っこって判定できるんですね^^

コレ応用したらブロック崩しできそう^^
コンソールといえどもあなどれませんねぇw
きっと
y=x;の次は
y=2x
しかあらわせないんでしょうね^^;
しかしコンソールでこれだけできるとは驚きです^^


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



Name: 数値計算  ..ぴよぴよ(62ポイント)   Date: 2006/10/16(月) 19:24   No:1099       
Title: フィットのプログラム    
コーシー分布
a/(a^2+x^2)
のフィッティングをするプログラムの方法をお教えいただけますか。
一次関数の最小二乗法のフィットは分かります。
お願いします。


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


Name: 管理人 [URL]  ..プログラマー(25,306ポイント)   Date: 2006/10/16(月) 19:40   No:1102     
Title: Re:フィットのプログラム    
フィッティングですか?

フィッティング=
実験などで得られた曲線を多項式などの数式で近似すること

と書いてありましたが、聞いたこと無い単語です…、フィッティングって何ですか?詳しく教えてもらえたら、何かアドバイスできることがあるかもしれません。

グラフにしたいんだったらできますが。


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

Name: 数値計算  ..ぴよぴよ(0ポイント)   Date: 2006/10/16(月) 19:47   No:1104     
Title: Re:フィットのプログラム    
2次元空間の点が例えば1000個あったとします。
(x,y)=(1,2),(2,3),....等
このとき、1000個の点から最も近い
曲線を求めたいという問題です。
求めたい曲線が、直線の場合
y=a*x+b
のaとbを求める問題になります。
多項式の場合は一般論がありますが、
分数の場合はどうしたらいいのかなと思いまして。