- 1 名前:('A`) mailto:sage [2008/01/23(水) 19:12:56 ]
- C言語の入門者向け解説スレです。
・C++言語はスレ違いです。 ・分からない事をなるべく詳しく書いて下さい。 ・ソースコードを晒すと答えやすくなるかもしれません。 ・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。 前スレ C言語なら俺に聞け(入門篇) Part 23 pc11.2ch.net/test/read.cgi/tech/1198295362/ 教えて欲しいのではなく丸投げしたいならこちらへ C/C++の宿題を片付けます 103代目 pc11.2ch.net/test/read.cgi/tech/1200318925/
- 6 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 21:03:28 ]
- while(1){
scanf("%c",&command); switch(command){ {case'a'〜'c'} case'd': {exit(0);}←?? default{} }}} a〜cはプロトタイプ宣言した関数の呼び出しです。 dのときだけreturn 0;に飛ばしてループを終了させたいんですけどbreak使うんですかね? このexit(0)を使うやり方だとどうもループさせた時に入力エラーが一回余分に出てしまいます;
- 7 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 21:05:38 ]
- return 0; はどこですか
- 8 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 21:17:48 ]
- 入れるとしたら
default{…;} }(1)}(2)} (1)だと繰り返さず終わってしまうので(2)の方を考えてます。
- 9 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 21:23:55 ]
- やりたいことがよく分からない。
直接 return 0; したらだめなのか?
- 10 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 21:30:30 ]
- >>6
何をしたいのか整理してくれないか? ついでに、擬似コードをやめてC言語で書いてくれ
- 11 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 21:41:06 ]
- うーん、擬似コードがよくわかりません。そのまま書いたつもりなのですが…
あと一番上のscanf(%c,command)の%cを%xに、 case(a~d)を1~4に変えることで正常に作動させることができました;
- 12 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 21:43:20 ]
- ・・・お前の持っているCコンパイラは
case'a'〜'c'} こんなコードもコンパイルしてくれんの?
- 13 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 21:44:08 ]
- KY
- 14 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 21:44:28 ]
- 1~4って5だけどいいの?w
- 15 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 21:53:27 ]
- それは 1^4 。
1~4 はコンパイルエラー。
- 16 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 21:55:37 ]
- ついでに文句いうなら無限ループはwhile(1)よりfor(;;)のがいいよ
優秀なコンパイラたんだと警告だす
- 17 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 21:57:34 ]
- それはむしろ無能だろ。
while(1) のみ定型句と見なしてエラー出さないくらいしてくれ。
- 18 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 21:59:49 ]
- それはもう数年後に出る人工知能つきコンパイラたんにご期待ください
- 19 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 22:08:10 ]
- int flg = 1;
while(flg){ scanf("%c",&command); switch(command){ case 'a': case 'b': case 'c': break; case 'd': flg = 0; break; default: } } だせぇ・・・ while(command!='d')やらwhile(command)も考えたがダサい。 なんか上手いやり方ないか?
- 20 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 22:09:39 ]
- まず何をやりたいのかをまとめてくれ。
- 21 名前:デフォルトの名無しさん [2008/01/23(水) 22:12:07 ]
- float f;
scanf("%f", &f); printf("%f",f); で、実行して、fに100.1とか入力すると、 100.09998とか表示されてしまうんですが、何故なのでしょうか?
- 22 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 22:12:36 ]
- 打ち切り誤差
- 23 名前:デフォルトの名無しさん [2008/01/23(水) 22:14:35 ]
- >>22
直す方法は何かなっいですか?
- 24 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 22:15:37 ]
- double ならある程度マシにはなる。
それもいやなら固定小数点でググれ。
- 25 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 22:16:10 ]
- printf("%.1f",f); でごまかす
- 26 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 22:16:25 ]
- 固定小数点でも同じだろ。
- 27 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 22:17:07 ]
- 10進固定小数点なら大丈夫だろ。
100.1 に関しては。
- 28 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 22:18:23 ]
- 「10進固定小数点」とか新語を作るなよ。
- 29 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 22:19:58 ]
- BCDと固定小数点がごっちゃになってるやつ多いな。
- 30 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 22:22:11 ]
- 例えば10倍の下駄をはかせばいいだけだろ?
- 31 名前:デフォルトの名無しさん [2008/01/23(水) 22:30:58 ]
- すみません、21ですが、
誤差はしょうがないということでおkですね。
- 32 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 22:33:55 ]
- 常に値を 10 倍した形で int 型で扱えば大丈夫。
- 33 名前:デフォルトの名無しさん [2008/01/23(水) 22:37:39 ]
- 質問です。
#include <stdio.h> int main(void) { static char *month[] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"}; int i; char *p; for(i = 0; i < sizeof(month)/sizeof(month[0]); i++){ for(p = month[i]; *p != '\0'; p++) if(*p == 'r') break; if(*p != '\0') puts(month[i]);} return 0; } これを小文字のrだけじゃなく大文字のRも大丈夫なようにするにはどうすればいいのでしょうか?
- 34 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 22:38:44 ]
- 'R' とも比較する
- 35 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 22:39:09 ]
- toupper((unsigned char)*p) == 'R'
- 36 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 22:39:38 ]
- >>33
if((*p == 'r') || (*p == 'R')) tolower()
- 37 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 22:39:41 ]
- if(*p == 'r' || *p == 'R')
- 38 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 22:43:00 ]
- あぁ成る程。||を使えばよかったんですね。
どうもありがとうございました。
- 39 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 23:28:02 ]
- scanf()で文字を読み込むときに\nが残るってはなしじゃねーの?
- 40 名前:デフォルトの名無しさん [2008/01/24(木) 06:17:38 ]
- void wall(int p,int q)
{if (meiro[p][q]!=1) {int dir; meiro[p][q]=3; dir = rand()%4+1; if (dir==1&&meiro[p+2][q]!=3) {meiro[p+1][q]=3; wall(p+2,q);} if (dir==2&&meiro[p-2][q]!=3) {meiro[p-1][q]=3; wall(p-2,q);} if (dir==3&&meiro[p][q+2]!=3) {meiro[p][q+1]=3; wall(p,q+2);} if (dir==4&&meiro[p][q-2]!=3) {meiro[p][q-1]=3; wall(p,q-2); }}} p,qはmeiro[p][q]に対応していて、meiro[偶数][偶数]の点です。 迷路を自動生成するプログラム作ってます。 色々調べて壁伸ばし法で作ることにして、wall関数なるものを自作しました。 0:道 1:壁 3:作りかけの壁 一応、迷路っぽいものはできるのですが、なんというかすかすかのものができてしまいます。
- 41 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 10:09:40 ]
- 続きは?
- 42 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 18:13:59 ]
- >>40
C言語っつーよりアルゴリズムの問題だと思うけど、 どのみちそこだけ出されてもなんとも言えない wallをどういう風に呼んでるかとか、 どのタイミングと条件でmeiro[x][y]を1にセットするのかとか わからないと
- 43 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 20:39:20 ]
- しかしみずれえソースだな
- 44 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 20:45:25 ]
- >>40
伸ばす方向に壁ができてたらそれで終わりにしないで、空いている方向を選ぶようにしてみたら?
|

|