C言語関係掲示板

過去ログ

No.1339 2つの整数を入力し、差を絶対値表示

[戻る] [ホームページ]
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"ぐらい入力するとエラーになると思います。
#未確認です。ご自分でおためし下さい。