[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 2chのread.cgiへ]
Update time : 05/09 17:25 / Filesize : 118 KB / Number-of Response : 502
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C言語なら俺に聞け(入門篇) Part 38



1 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 20:15:31 ]
C言語の入門者向け解説スレです。

教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
  C/C++の宿題を片付けます 117代目
  pc11.2ch.net/test/read.cgi/tech/1225320579/

・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
  # サイズが大きい場合は宿題スレのアップローダ等を利用してください
・開発環境や動作環境も晒すと答えが早いかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
  C言語なら俺に聞け(入門篇) Part 37
  pc11.2ch.net/test/read.cgi/tech/1224000127/
過去スレ
  makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000

129 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 10:17:02 ]
いや、間違った。別に構造体である必要は無いか。
規格でそこまでは決められてないな。
構造体以外で実装されている処理系は見たこと無いが。

Q.なぜ構造体ではなくオブジェクト型なのか?
A.構造体です。

Q.なぜオブジェクト型なのか。
A.規格でそう決められてるから。


130 名前:デフォルトの名無しさん [2008/11/02(日) 10:18:58 ]
>>129
、別に構造体型じゃなくても構わないッスw適当にやっちゃってよw、
って事?

131 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 10:21:37 ]
規格に書かれていないことは実装者の自由。
もっとも規格に沿ってない実装だってあるわけだから、
目指すものによって守るべきルールも決まってくる。
規格に無くても、世の中にはデファクトスタンダートと言うものもあるしな。

132 名前:デフォルトの名無しさん [2008/11/02(日) 10:21:57 ]

ポインティンガーから構造体にアクセスするときだけ -> で

いいのですか

133 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 10:25:09 ]
>>131
なるほど、ありがとうございます。

134 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 13:00:04 ]
っていうか、Cの規格のオブジェクトってのは、オブジェクト指向のオブジェクトとは別物だろ。


135 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 14:27:09 ]
perlの処理系をC言語で作る事はできますか?

136 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 14:28:18 ]
できますというかできてます

137 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 14:30:26 ]
Perlの処理系はLarryの優しさから出来ています
とりあえずこちらをご覧下さい
ttp://www.cpan.org/src/README.html



138 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 14:36:02 ]
他にもC言語でできてる、代表的なソフトを教えて下さい。

139 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 14:39:41 ]
Unix系OS

140 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 14:51:23 ]
Cの処理系

141 名前:デフォルトの名無しさん [2008/11/02(日) 14:57:40 ]




YO YO エビバーデー








142 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 15:29:45 ]
フィンガー5じゃないが、リンリンしなくて良いからw

143 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 16:02:55 ]
>>115
scanf("%f",&y);
↓ ^^
scanf("%lf",&y);
^^

printf("その電化製品で掛かる月の電気代は%e¥で、基本料金は%d¥です\n",ene,x);
↓ ^^^
printf("その電化製品で掛かる月の電気代は%.3f¥で、基本料金は%d¥です\n",ene,x);
^^^

これでいかがでしょう?(printfのほうは自分の好みで変更しました)
ただ、xが使われていないような・・・

144 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 16:08:18 ]
>>143です
思いきりずれました
つまり、scanfのフォーマット指定を"%f"→"%lf"
pritnfのフォーマット指定を"%e"→"%.3f"(この3は小数点以下桁数なのでお好みで)
でいかがでしょう?


145 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 17:49:25 ]
いまひとつ有り得ない桁数というのが分からないのと
それであってるのか分からないのだが
eneは電気代じゃなくて一ヶ月分の消費電力しか計算して無くないか?

146 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 17:51:19 ]
普通、¥は接頭です。

147 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 17:55:35 ]
計算するときは、常に単位を意識するといい。
y * z * 30は、即ち y[W] * z[h/day] * 30[days/month]だからつまり、ene[Wh/month]となる。
つまり、月当たりの電力量と言うことだ。



148 名前:デフォルトの名無しさん [2008/11/02(日) 18:10:45 ]
unsigned charの変数は初期化をしなくても問題は無いのですか?
大学の課題のサンプルプログラムの中に初期化も代入もせずに
値を参照している部分を見つけたもので気になって質問しました
試したところ確かに初期値?として0が格納されているみたいなんですが
これをそのまま利用していいんでしょうか?
自分の知識や習慣だと変数を初期化等をしないまま参照するのは
おかしい気がするのですが何かこうすることで問題が発生したりはしますか?

149 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 18:14:53 ]
グローバルスコープやstaticな変数なら0で初期化される。
ローカル変数ならゴミが入ってる。

150 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 18:15:40 ]
型の問題ではなく、定義されている場所の問題。
関数内のローカル変数でstaticでないなら、初期化しないと不定値になる。

151 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 18:16:34 ]
グローバル変数なら0で初期化される

152 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 18:19:43 ]
>>149
あれ?関数内のstaticな変数は0初期化されないんじゃなかったっけ?

153 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 18:22:04 ]
されます。

154 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 18:26:30 ]
>>149->>151
おお、ありがとうございます!
なるほど、型ではなくスコープの問題だったんですね
確かにそのプログラムではグローバル変数でした
今までそんなこと全く知らずに使ってました^^;
勉強になりました

155 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 18:32:39 ]
スコープっていうか静的か動的かの話じゃないかな
コンパイル時なら0で初期化とかやっても遅くならないし

156 名前:152 mailto:sage [2008/11/02(日) 18:36:12 ]
>>153
確かにそうみたい。なんか勘違いしてた

157 名前:デフォルトの名無しさん [2008/11/02(日) 18:40:33 ]
テキストファイルから1行ずつ読み込んで、
それをスペースを間に入れて表示したいです。
例えばテキストファイルの中身が
a
b
だったら「a b」という感じに表示したいのですが、
以下のコーディングで正しいでしょうか?
環境はWindowsXP、VisualC++2008 ExpressEditionです。

  char buf[1024];
  FILE *fp = fopen("test.txt", "r");
  while(fgets(buf, sizeof(buf), fp) != NULL){
    buf[strlen(buf)-1] = '\0';
    printf("%s ", buf);
  }




158 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 18:49:43 ]
>>157
だいたいそれでいいんじゃないの?

一行が1024文字以上だったらどうするとか、細かいことは考えないで。

159 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 18:56:06 ]
>>158
大丈夫そうですか?
あ、でもこれだとテキストファイルの最後に空白行
入れないと駄目っぽいですね。

160 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 19:09:00 ]
聞く前に試せよ

161 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 19:24:35 ]
俺に聞けスレで試せで終わらすなんて。

162 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 19:33:25 ]
何故ダメなのか聞くためのスレだろ

163 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 19:35:35 ]
>>159
fgetc()とfputc()で、一文字単位でしょりして、\nだったら空白に置き換えるってほうが、
簡単なんじゃね?

164 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 19:36:01 ]
できることできるだけやってから質問するのは当たり前だろ

165 名前:デフォルトの名無しさん [2008/11/02(日) 19:38:22 ]



一番ダメな考え方

「動くからこれでいい」


動くからと言って、CPUの演算処理を独占するようなコードはクソである。
だから動くからいいと言うものではない

166 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 19:38:39 ]
>143です

>>145-146さん
皆さん指摘の通り、中途半端な回答になっていました。
>>115さん
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7916.txt
に修正版をうpしたので許してください

167 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 19:45:17 ]
>>163
その方が簡単ですね。効率性も考えるとfgetsですかね?



168 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 19:50:27 ]
>>167
たぶん、大差ないんじゃないの?

昔、setvbuf()ってので、バッファのサイズを増やしたら速度が向上してたけど、
Windowsの時代になってから、同じようなことをやってもあんまり変わらなかった。
OSレベルでのバッファリングされてるからだと思うけど。


169 名前:デフォルトの名無しさん [2008/11/02(日) 20:19:51 ]
仮に、CPUの処理速度が無限大あって
ビットシフトなんか使っても速くならないとしても
常に最適化を忘れてはいけない

コンパイラが最適化してくれるとしても
自分の手で最適なコードを書くことを忘れてはいけない


これが出来ない奴はルータも携帯電話も作れない

170 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 20:21:34 ]
携帯やルータってCで出来てるの?

171 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 20:29:30 ]
基本は読みやすさ。
要件をみたせないときに、最適化。

172 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 20:32:53 ]
Cではありません。スパゲッティーで出来てます。

。。。ごめん

173 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 20:35:12 ]
またド忘れしちゃった。。
左シフト演算って、常に論理シフトするんだっけ。
signed でも unsigned でも正値でも負値でも。

右シフト演算がちょっとめんどくさいことになってることは
覚えてるんだけど。

174 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 20:37:28 ]
なぜコードを最適化するのですか?

175 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 20:40:24 ]
めんどくさいものは使わない。

176 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 20:48:13 ]
組み込みは未だに、CとASMで出来ている

177 名前:デフォルトの名無しさん [2008/11/02(日) 20:59:00 ]
>>172
ざる蕎麦ではできていないのか



178 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 20:59:47 ]
>>173
#include <stdio.h>
#include <limits.h>
#define UPPER_BIT (1 << (sizeof(int) * CHAR_BIT - 1))
void print_bit_s(int n){
  unsigned int mask = UPPER_BIT;
  for(;mask; mask >>=1) putchar(mask & n ? '1' : '0');
  putchar('\n');
}
void print_bit_u(unsigned int n){
  unsigned int mask = UPPER_BIT;
  for(;mask; mask >>=1) putchar(mask & n ? '1' : '0');
  putchar('\n');
}
int main(){
  int n1 = (-1);
  int n2 = n1 & ~UPPER_BIT;
  unsigned int m1 = n1;
  unsigned int m2 = n2;
  print_bit_s(n1 >> 1);
  print_bit_u(m1 >> 1);
  print_bit_s(n2 << 1);
  print_bit_u(m2 << 1);
  return 0;
}
// output
11111111111111111111111111111111
01111111111111111111111111111111
11111111111111111111111111111110
11111111111111111111111111111110


179 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 21:25:30 ]
>>174
そこにコードがあるから

180 名前:173 mailto:sage [2008/11/02(日) 21:44:14 ]
んー、たとえば右シフト演算について言えば、符号付き整数型の負値に対して演算を
適用した結果は処理系に依存しますよね。output の1行目でいうと、算術シフトするか
論理シフトするかは処理系に依存すると。。
上の2行は
01111111111111111111111111111111
01111111111111111111111111111111
こうなる可能性があるわけですよね。下の2行に関しては同様に処理系依存の問題は
大丈夫なのでしょうか。コードを解読し切れてないので結論が良く見えないのですが。

181 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 21:50:37 ]
>>173
っMSDN
と思ったけど、検索しても見つけにくかったので、ローカルから。
Shift Operators: >> and << (ごめん、英語なんだ)
とりあえず適当訳。

左シフトは0埋め。論理シフト。

右シフトはunsignedは0埋め。signedは符号ビットで埋める。
unsignedは論理シフト。signedは算術シフト。

・Microsoft Specific
signed の負の数の右シフトは、実装によります。
MicrosoftのC++の場合は、MSBで空いたビットを埋めます。
MSのC++以外の場合は知らん。

だそうです。


182 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 21:53:03 ]
なんでこういう細かいところ統一しないの?

183 名前:173 mailto:sage [2008/11/02(日) 22:12:18 ]
わざわざ和訳までしてもらってすいません。Cの規格的な部分ではどうなんでしょうね。。
Microsoft仕様ではCとC++とでまた違うんですか。こちらでももうちっとしらべてみます。
あふん。。

184 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 22:20:14 ]
>>182
なんでOSは統一しないの?なんで通貨も、言語も。
所詮、こんなものは、規格化した集団が幅広い用途を考慮して
決めるか、一部の団体の意見の押し付けでしかないってことだよ。
そして俺らはそれを使うだけ。開発、発案、研究するわけでもない・・・
まぁ、俺はとある有名大学で研究、実験はしたがな。

185 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 22:28:45 ]
>>182
効率を重視するから

186 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 22:32:34 ]
>>183
MSの場合Cでも>>181と同じ。
そこに書いてある「MSのC++以外」とは、MS以外のC++という意味。

規格上は、負の値の左シフトは未定義。
正の数なら符号付き・符号無しいずれの型でも0埋めで定義されている。

CはJIS X3010、C++はJIS X 3014が国際規格の翻訳として存在する。
www.jisc.go.jp/

187 名前:173 mailto:sage [2008/11/02(日) 22:57:15 ]
おお!そのものズバリのご回答ありがとうございます。
負値の左シフトは未定義でしたか。
正値ならば符号付き・無しに関わらず論理シフトすると、こういうことですね。
ややこしいなあ。。
ともかくこれでスッキリしました。
ありがとうございました。



188 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 23:05:13 ]
左シフト?

189 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 23:06:46 ]
「右も左も分かりません」

190 名前:デフォルトの名無しさん [2008/11/02(日) 23:14:23 ]
アホか

191 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 23:16:59 ]
↑うん、お前アホ。

192 名前:デフォルトの名無しさん [2008/11/02(日) 23:27:23 ]
肝心のシフト演算子について話せない奴はすっこんでろ

193 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 23:28:34 ]
>>187
算術左シフトという言葉があったとしても、負の値のそれはやっぱり0埋めだよ。
論理左シフトと全く同じだから、わざわざ算術と言わないだけ。

算術右シフトが負値で1埋めするのは符号を維持するための結果であって、
1埋めするから算術というわけではない。

194 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 23:29:41 ]
自分の論理を自分に適用できない奴はすっこんでろ

195 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 23:49:20 ]
そんなに符号のことが気になるなら、unsignedをしっかり指定しとけ、な?

196 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 23:53:00 ]
>>177
ざる蕎麦ではだめです。 もり蕎麦に、のりを盛るところから始めなくては。
きしめんでも可。 たぶん、時期的に、そうめんはだめだと思う。

(って何の話だっけ


197 名前:187 mailto:sage [2008/11/02(日) 23:55:37 ]
言葉の定義って難しいですね。。ややこしくて頭がパンクしそうです。
単純に 0埋め=論理シフト、1埋め=算術シフトと覚えてました。
算術(右シフト)だから符号を維持する必要がある→結果として1埋めになる
論理(右シフト)だから符号を維持する必要がない→結果として0埋めになる
こういうことなのかな。考えたことも無かった。



198 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 00:00:01 ]
そんなに心配なら shl, sal, shr, sar を直に使えよ

199 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 00:04:35 ]
算術シフトは
左にnビットシフトすると,元の数の2^n  倍
右にnビットシフトすると,元の数の1/2^n倍

これを保障するシフト演算。だから算術という。

200 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 00:10:33 ]
RCL、RCR、ROL、RORとか混ぜると、さらにパンク。


201 名前:187 mailto:sage [2008/11/03(月) 00:20:29 ]
なんで知らなかったんだろう今まで。。恥ずかしい。
算術って言うのは単に符号を維持するっていうことじゃなくて、そういうことなのね。。
それを保証するために符号の維持も当然必要で、その結果1埋めになる(右シフトの
場合)ということかな。

202 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 11:49:20 ]
>>184
多様性のもつ可能性を吟味しなければなりません。

203 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 13:53:42 ]
scanfで入力してもらった数字、例えば1234を合計した数字を変数に入れる方法を教えて下さい。(入門者にも理解できる範囲でお願いします)

204 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 13:59:03 ]
数字は1 2 3 4とバラバラに入力するのかそれとも連続で1234と入れるのか?

205 名前:203 mailto:sage [2008/11/03(月) 14:02:37 ]
連続で入力するほうでお願いします。

206 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 14:06:53 ]
文字列で受け取って、一文字づつバラして、数値に変換して、全部足す

207 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 14:16:20 ]
>205
まず、%d指定子を使って1234という数字をまるごとあるint変数(仮にt)に読み込む
次に、合計を得る変数(仮にs)をゼロに初期化する
そして、以後tが0より大きい間、tを10で割った余り(%演算子を使うこと)をsに加算してからtを10で割るということを繰り返す

※Cでは、正の整数の割り算は端数を切り捨てる

流れ:
 s:0 t:1234(読み込み)
 s:4 t:123(1234を10で割った余り4をsに足しtを123に)
 s:7 t:12(123を10で割った余り3をsに足しtを12に)
 s:9 t:1(12を10で割った余り2をsに足しtを1に)
 s:10 t:0(1を10で割った余り1をsに足しtを0に)
 (tが0になったので終了)





208 名前:デフォルトの名無しさん [2008/11/03(月) 14:21:45 ]
int a;
scanf("%d", &a);
printf("%dの合計を暗算して入力してください");
scanf("%d", &a);
printf("はい、ご名算!");

209 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 14:50:08 ]
宿題は宿題スレへ じゃないのか?

210 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 15:04:53 ]
そういうのって、getchar() ループの方が楽じゃね?
#include <stdio.h>

void main( void )
{
 int loop = TRUE;
 int sum = 0;
 char c;

 while ( loop ) {
  c = (char)getchar();  // 1文字入力
  switch ( c ) {
   case '0':   // 0〜9が入力された場合、sumに足しこむ
   case '1':
   case '2':
   case '3':
   case '4':
   case '5':
   case '6':
   case '7':
   case '8':
   case '9':
    sum += (int)( c - '0' );
    break;

   case EOF:
    loop = FALSE;
    break;
  }
  printf( "合計値は %d \nです。", sum );
 }
}

211 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 15:08:52 ]
'0'-'9'は連続が保障されてるから、そんなことしなくても

212 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 15:22:36 ]
int c, sum = 0;
while (isdigit(c = getchar())) sum += c - '0';
printf("%d\n", sum);

これだけでいいじゃん

213 名前:>212 mailto:sage [2008/11/03(月) 15:25:30 ]
0〜9以外を無視していないから却下

214 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 15:27:06 ]
え?

215 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 15:29:13 ]
123x4 と入力したら 10 が返ってくる仕様が求められてるのか?

216 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 15:30:18 ]
>>209
丸投げでなければわからないことを聞くのは一向にかまわない

>>210-212
scanfでって言ってるのにgetcharはないだろ

217 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 15:41:17 ]
こういうので、質問者にscanf()が必須条件なのか、それ以外でもいいのかって質問してもめったに返事が返ってこないよな。




218 名前:210 mailto:sage [2008/11/03(月) 15:43:37 ]
>>216
こういうのはふつうキーイベントループ制御だべよー。
WindowsのようなGUIでもテキストボックスに「1234」なんて連続して入力させるかぁ?

219 名前:203 mailto:sage [2008/11/03(月) 15:49:26 ]
みなさん、お答えいただきありがとうございます。
アドバイスを受け、色々と試してはいるのですが、一向にうまくいきません。

ここで質問なんですが、1234を

char str[5];

scanf("%s",str);

で文字列として受け取って

atoi(str)で整数値に変換

その後に1234を一文字ずつにバラす方法がさっぱりわかりません

アドバイスお願いします。


220 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 15:52:30 ]
>>219
4 = 1234 % 10;
123 = 1234 / 10;

221 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 16:07:33 ]
文字列入力ってテーマを見ると、すぐにgetchar()で一文字ずつ判断するロジック書く奴っているよね。
そういう奴に限ってろくでもないバグを仕込むから笑えない。

222 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 16:09:19 ]
例えば、>212はまぁ無難な方で、>210なんてわざわざバグを埋め込むための無駄な努力の跡さえ見えてしまう事実。

223 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 16:23:58 ]
>>221
本番では2バイト文字に気を付ければいいだけだろ
>>222
レビューでデバッグしてくれ

224 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 16:35:49 ]
標準入力から0xffを入力すると、EOFと誤解釈して終了してしまうね。
この程度のサンプルならどうでもいいけど、ファイルをリダイレクトして使うようなツールだと恐怖だね。

225 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 16:42:38 ]
>219
ソースはれ

あと、ほかに制約がないのなら、%sからatoi()なんかしないで素直に%dで読みなさい

226 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 17:00:30 ]
>>224
それ、0xffイコールEOFだから誤解釈じゃないよ。それも正常系の解釈と処理。
まあサンプルプログラムだし、EOFは入力の終了条件のために設けた
だけだから、そこは削除して他の方法に置き換えても構わないし。

227 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 17:06:47 ]
違います
EOFは決して0xffではありません



228 名前:203 mailto:sage [2008/11/03(月) 17:07:34 ]
#include<stdio.h>

int main()
{
int w,x,y,z,goukei;
int w2,x2,y2,z2,goukei2;
int yosou[4];
int yosou2;
printf("前回の当選数字を入力:\n");
scanf("%d,%d,%d,%d",&w,&x,&y,&z);
goukei = w + x + y + z;
printf("前々回の当選数字を入力:\n");
scanf("%d,%d,%d,%d",&w2,&x2,&y2,&z2);
goukei2 = w2 + x2 + y2 + z2;
printf("今回予想した数字を入力:\n");
scanf("%d,%d,%d,%d",&yosou[0],&yosou[1],&yosou[2],&yosou[3]);
yosou2 = yosou[0] + yosou[1] + yosou[2] + yosou[3];
if(goukei == yosou2 || goukei2 == yosou2){
printf("%d Is a NG\n",yosou2);
}else if(yosou2 > 9 || yosou2 < 27){
printf("%d NG",yosou2);
}else{
printf("%d OK\n",yosou2);
}
return 0;
}

ナンバー4の当たり数字過去2回の合計値と一致した場合、NGと出力するプログラムです。
また、予想した数字の合計値が9〜27に入ってなくてもNGと出力します。
ほんとくだらなくてすいません。

229 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 17:13:14 ]
>>226
いや、大誤解だと思いますね。>>224 ではなくて、>>>226 が。
>>210 は getchar() の戻り値を char でうけているのが、センスがないというか、そもそも本質を理解していない、というべきか。
もしかして、いつものあなたですか?これはつり?






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<118KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef