ABA
@ABA (A)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

正しくない出力結果

Q&A

Closed

解決したいこと

C言語でプログラミングを作成しています。
コンパイルはできましたが、思い通りの結果が出力されません。
解決方法を教えてください。

発生している問題・エラー

正の整数値を読み込んで、その整数値の逆順の数値が同じであれば y を、異なれば n と出力したいが、全て n と出力されてしまう

入力 1303031
出力 n

入力 5
出力 n

該当するソースコード

#include <stdio.h>

int main(void)
{
    int number, reverse = 0;
    do {
       scanf("%d", &number);
    } while (number <= 0);  

     while (number > 0){
         reverse = number % 10;
         number /= 10;
}   
    if (number ==reverse){
       printf("y\n");

    }else {
       printf("n\n");   
    }

    return 0;
}

自分で試したこと

ここに問題・エラーに対して試したことを記載してください。

0

1Answer

入力値を入れた number を、逆順を求めるときに変更してしまっているためです。

例えば、別の変数にコピーしてから使用するなどしてください。

また、reverse の計算も間違えています。
今のコードだと、最後の1桁しか残っていないと思います。


追記です。

numberが変更になっている認識が持てないのですが。
具体的に教えていただけますでしょうか。

例えば、デバッグ用に printf を入れてみます。★印の位置です。

#include <stdio.h>
  
int main(void)
{
    int number, reverse = 0, bkup;
    do {
       scanf("%d", &number);
    } while (number <= 0);
    bkup = number;

     while (number > 0){
         reverse = number % 10;
         number /= 10;
         printf("r=%d, n=%d\n", reverse, number); /* ★ */
    }

    if (number ==reverse){
       printf("y\n");

    }else {
       printf("n\n");
    }

    return 0;
}

実行結果はこうなります

$ cc a.c
$ echo 1303031 | ./a.out
r=1, n=130303
r=3, n=13030
r=0, n=1303
r=3, n=130
r=0, n=13
r=3, n=1
r=1, n=0
n

number は最後に 0 に変更されていますよね?

また reverse も 1 になっています。

number /= 10; というのは、ほぼ number = number / 10; と同じ意味です。


(略)にすると計算が正しいでしょうか。

そうですね。

#include <stdio.h>
  
int main(void)
{
    int number, reverse = 0, bkup;
    do {
       scanf("%d", &number);
    } while (number <= 0);
    bkup = number;

     while (number > 0){
         reverse = reverse*10 + number % 10;
         number /= 10;
         printf("r=%d, n=%d\n", reverse, number); /* ★ */
    }

    if (number ==reverse){
       printf("y\n");

    }else {
       printf("n\n");
    }

    return 0;
}
$ cc a.c
$ echo 1303031 | ./a.out
r=1, n=130303
r=13, n=13030
r=130, n=1303
r=1303, n=130
r=13030, n=13
r=130303, n=1
r=1303031, n=0
n

最後の判定以外 は問題無いように思います。
number を別の変数にコピーしてから使用するなどして対策をしてください。


上記を使うと下記の出力のみにならないため使用不可です

printf()はデバッグ用(number が変更されていることの確認用)にいれたものです。
動作を確認して、問題がなくなったら、削除してもよいものです。

もしかしたら、手元ではコンパイル・実行環境がないということでしょうか?
(動作確認をしないで、何かのシステムに直接ソースコードを提出しているってことですかね?)

慣れないうちは、手元でコンパイル・実行環境を作って動作を確認してみるとよいと思います。

もし、どうしても手元でコンパイル環境が構築できない場合には、以下のようなサイトを使ってみてもよいと思います。

「コード作成を試してみる」をクリックして、言語を選ぶところで C を選んで、ソースを入力し、下にある「入力」ところに入力データ(今回だと 1303031 など)を入れて、実行ボタンを押せば動かせます。

image.png

まずは、いろいろ試して思った通りに n/y が出せるようになったら(デバッグ用の printf などを削除してから)、提出するとよいと思います。

1Like

Comments

  1. @ABA

    Questioner

    ありがとうございます。
    while (number > 0){
    reverse = number % 10;
    number /= 10
    の部分でしょうか。
    もう1つ変数を用意する必要があるということでしょうか。
    }
  2. @ABA

    Questioner

    numberが変更になっている認識が持てないのですが。
    具体的に教えていただけますでしょうか。
  3. @ABA

    Questioner

    while (number > 0){
    reverse = reverse*10 + number % 10;
    number /= 10;
    にすると計算が正しいでしょうか。
  4. 回答の方に追記しました。

    number /= 10; が更新している箇所です。
  5. @ABA

    Questioner

    printf("r=%d, n=%d\n", reverse, number); /* ★ */
    上記を使うと下記の出力のみにならないため使用不可です。出力はyかnのみにしないといけないのです。上記以外の方法はありますでしょうか。

    入力 1303031
    出力 n

    入力 5
    出力 n
  6. 詳細は、回答に追記しました。

    printf()はデバッグ用(number が変更されていることの確認用)にいれたものです。
    動作を確認して、問題がなくなったら、削除してもよいものです。
  7. @ABA

    Questioner

    ex_04_04.c: In function 'main':
    ex_04_04.c:5:17: warning: variable 'bkup' set but not used [-Wunused-but-set-variable]
    int number, bkup, reverse = 0 ;

    以上のようにコンパイルで警告になってしまいました。
    結果も
    入力   5
    に対しても出力がnとなってしまいます。
  8. どのようにしたのかわかりませんが、おそらく number の値を bkup にコピーしたんですよね?

    ということは、reverse ができた後の状態で

    number == 0
    bkup == 5
    reverse = 5

    という状態ですよね?

    そこで if (number == reverse) とすれば当然、NG になると思います。

  9. @ABA

    Questioner

    ありがとうございました。
    理解できました。

Your answer might help someone💌