No.18092![]() |
負の数の入力処理 投稿者---霧雨(2004/11/15 00:10:55) |
||
こんばんわ。 2つの整数を入力し、その2つの整数の差の絶対値を表示するプログラムを作成しています。 が、どうにも負の数を入力しても稼動するようになりません。 下にソースを張ります。 #include <stdio.h> int absolute(int n1, int n2); main() { int c, n1, n2; int sum = 0, j= 0, count = 0, number = 0; int num[2] = {0}; while ((c = getchar()) != EOF) { if (c >= '0' && c <= '9'){ c = c - '0'; number = number * 10 + c; while(number >= 100000000){ number = number / 10; } } else if (c == 10 && number > 0){ num[j] = number; printf("n%d = %d\n", j+1, num[j]); j = j + 1; number = 0; count = count + 1; if (count == 2) break; } else { printf("error!!\n"); break ; } } if (j == 2){ for (j = 0; j < 2; j ++){ n1 = num[0]; n2 = num[1]; } printf("absolute(n1, n2) = %d\n", absolute(n1, n2)); } } int absolute(int n1, int n2) { if (n1 > n2) { return n1 - n2; } else { return n2 - n1; } } エラー的な仕様は 「整数以外」、「改行」、「{-}(マイナス)のみ」が入力された際にエラーを発するというものですが、上のソースでは負の数でもエラー処理になってしまいます。 どう処理すればいいかご存知の方、教えていただけると幸いです。 |
No.18097![]() |
Re:負の数の入力処理 投稿者---RAPT(2004/11/15 00:43:22) |
||
INT_MAX == 2147483647 (32bit)(処理系依存) だったりするので、 number >= 100000000 が成立する事はありえません。 > 上のソースでは負の数でもエラー処理になってしまいます。 そりゃ、そーでしょ。'0'〜'9'以外は、はじいているんだもの。 最初の1文字のみ、'-'の入力を許可し、マイナスが入力されたら、 とりあえず、マイナスが入力された事だけ覚えておいて、次に数字を取得。 そして「後で」-1 をかけるようにすればOK。 |
No.18099![]() |
Re:負の数の入力処理 投稿者---霧雨(2004/11/15 01:02:27) |
||
><pre>INT_MAX == 2147483647 (32bit)(処理系依存) だったりするので、 number >= 100000000 が成立する事はありえません。 > 上のソースでは負の数でもエラー処理になってしまいます。 そりゃ、そーでしょ。'0'〜'9'以外は、はじいているんだもの。 最初の1文字のみ、'-'の入力を許可し、マイナスが入力されたら、 とりあえず、マイナスが入力された事だけ覚えておいて、次に数字を取得。 そして「後で」-1 をかけるようにすればOK。 </pre> なるほど……確かに言われてみれば。 ……ですが、どうやって書き込んだらいいのか見当がつきません……。 教えていただけないでしょうか。 |
No.18144![]() |
Re:負の数の入力処理 投稿者---RAPT(2004/11/15 22:29:29) |
||
> INT_MAX == 2147483647 (32bit)(処理系依存) > だったりするので、 > number > = 100000000 > が成立する事はありえません。 すみません、数え間違えました。上記の場合はOKでした。 |
No.18098![]() |
Re:負の数の入力処理 投稿者---RiSK(2004/11/15 01:00:20) |
||
/* 直接の答えではないですが, 論理構造をスッキリさせれば自然とバグも減ると思います。 RiSK 案: */ int GetNum(void); int GetAbsolute(n); int main(void) { int n1, n2, diff, absolute; n1 = GetNum(); n2 = GetNum(); diff = n1 - n2; absolute = GetAbsolute(diff); return 0; } // getchar などで数字を入力してもらう // それを数値に変換して返す // もちろん '-' もサポート int GetNum(void) { int n; // 処理 return n; } // n の絶対値を返す int GetAbsolute(int n) { return (n > 0) ? n : -n; } /* GetNum でつまずいたら,また質問ですね。 */ |
No.18100![]() |
Re:負の数の入力処理 投稿者---霧雨(2004/11/15 01:09:13) |
||
リロードせずに上の文章を書き込んでしまってすいません。 これはとある人から出された一種の問題なのですが、解答の条件に int absolute(int n1, int n2); というプロトタイプ宣言を持たせる必要があるのです。 教えてくださったGetabsolute〜ではちょっと形が違ってきますので……何とか前のソースからの発展系で教えてもらえないでしょうか……。 |
No.18102![]() |
Re:負の数の入力処理 投稿者---RiSK(2004/11/15 01:20:12) |
||
>int absolute(int n1, int n2); > >というプロトタイプ宣言を持たせる必要があるのです。 >教えてくださったGetabsolute〜ではちょっと形が違ってきますので…… >何とか前のソースからの発展系で教えてもらえないでしょうか……。 急いでレスする必要はないですよ。 10分も考えずにこんなことも言われるとちょっと…ネ。 int absolute(int n1, int n2) { int diff = n1 - n2; return (diff > 0) diff : -diff; }重要なのは私の言う GetNum の部分ですよ。 # 関係ないところにつっこんだ私も悪いですが… |
No.18104![]() |
Re:負の数の入力処理 投稿者---霧雨(2004/11/15 09:25:51) |
||
すいません_| ̄|○よく読まなかったのは私の方でした 教えてくださったプログラムから考えていたのですが、どうにも「一文字目に-が入力された」という処理が思いつきません。 「-のみ」ではエラーで終了させるようにしたいので……どうすればよろしいでしょうか。 |
No.18105![]() |
Re:負の数の入力処理 投稿者---秘密(2004/11/15 10:18:03) |
||
>すいません_| ̄|○よく読まなかったのは私の方でした >教えてくださったプログラムから考えていたのですが、どうにも「一文字目に-が入力された」という処理が思いつきません。 >「-のみ」ではエラーで終了させるようにしたいので……どうすればよろしいでしょうか。 現在何文字目を入力しているのかをわかるようにすれば何とかなる気がします。 |
No.18119![]() |
Re:負の数の入力処理 投稿者---霧雨(2004/11/15 15:57:37) |
||
>現在何文字目を入力しているのかをわかるようにすれば何とかなる気がします。 結局そこなんですよね……。 でも、何をすればわかるんでしょうか? |
No.18123![]() |
Re:負の数の入力処理 投稿者---REE(2004/11/15 16:59:41) |
||
>>現在何文字目を入力しているのかをわかるようにすれば何とかなる気がします。 > >結局そこなんですよね……。 >でも、何をすればわかるんでしょうか? 数えれば分かります。 |
No.18168![]() |
Re:負の数の入力処理 投稿者---霧雨(2004/11/16 19:08:28) |
||
> >数えれば分かります。 > 数え方がよく分からないのですが……。 何を使えばいいのでしょう? |
No.18184![]() |
Re:負の数の入力処理 投稿者---REE(2004/11/17 10:13:48) |
||
>> >>数えれば分かります。 >> >数え方がよく分からないのですが……。 >何を使えばいいのでしょう? このプログラムでは、既に入力した数字の数を数える機能がありますよね。 それと同じ方法で数えてください。 |
No.18108![]() |
Re:負の数の入力処理 投稿者---nop(2004/11/15 12:47:41) |
||
>2つの整数を入力し、その2つの整数の差の絶対値を表示するプログラムを作成しています。 >が、どうにも負の数を入力しても稼動するようになりません。 strtol()。 |
No.18127![]() |
Re:負の数の入力処理 投稿者---かずま(2004/11/15 18:07:59) |
||
#include <stdio.h> #include <stdlib.h> int get_int(void) { char buf[256], c; int n; if (!fgets(buf, sizeof buf, stdin) || sscanf(buf, "%d %c", &n, &c) != 1) puts("error"), exit(1); return n; } int absolute(int n1, int n2) { return (n1 > n2) ? (n1 - n2) : (n2 - n1); } int main(void) { int n1 = get_int(); int n2 = get_int(); printf("absolute(n1, n2) = %d\n", absolute(n1, n2)); return 0; } |
No.18132![]() |
Re:負の数の入力処理 投稿者---かずま(2004/11/15 20:20:53) |
||
1億以上の数が入力されたら、下の桁を捨てて、1億未満にする処理が 抜けていました。でも、なぜ、こんな処理が必要なのですか? get_int() の return n; の前に、 while (abs(n) >= 100000000) n /= 10; を追加。 |
No.18146![]() |
Re:負の数の入力処理 投稿者---霧雨(2004/11/16 00:08:16) |
||
><pre> 1億以上の数が入力されたら、下の桁を捨てて、1億未満にする処理が 抜けていました。でも、なぜ、こんな処理が必要なのですか? get_int() の return n; の前に、 while (abs(n) >= 100000000) n /= 10; を追加。 </pre> 参考プログラムありがとうございます。 1億未満の処理に関してですが、9桁以上の数値の場合は8桁までに抑える処理を施さなければならなかったのでその処理がくっついていたわけです。 説明不足ですみませんでした。 |
No.18166![]() |
Re:負の数の入力処理 投稿者---霧雨(2004/11/16 18:21:01) |
||
> if (!fgets(buf, sizeof buf, stdin) || sscanf(buf, "%d %c", &n, &c) != 1) puts("error"), exit(1); return n; すいません、この部分は文章的にどんな処理になっているのでしょうか? 結果はわかるのですが、何をすれば(入力)errorとなるのかよく分からなくて……。 ご教授のほどよろしくお願いします。 |
No.18177![]() |
Re:負の数の入力処理 投稿者---KING・王(2004/11/17 01:13:38) |
||
>すいません、この部分は文章的にどんな処理になっているのでしょうか? (1)fgets(buf, sizeof buf, stdin)の戻り値が0の場合 (2)sscanf(buf, "%d %c", &n, &c)の戻り値が1以外の場合 上記(1)(2)いずれかを満たした場合に、"error"を出力して、プログラムを抜けます。 ということで、あとは、それぞれの関数(特にその戻り値)の仕様を確認して下さい。 #かずま様、(2)の部分の記述は、非常に参考になりました。 #このような記述方法があるとは。。。 > 何をすれば(入力)errorとなるのかよく分からなくて……。 とりあえず、(2)の部分は、"XXXX XXXX"ぐらい入力するとエラーになると思います。 #未確認です。ご自分でおためし下さい。 |