0
printf("\n\tHow many integers: ");
    scanf("%d", &num);

    iPtr = (int*) malloc(num * sizeof(int));

    for(i = 0; i < num; i++) {
        printf("Enter integer # %d ", i + 1);
        scanf("%d", (iPtr + i));

        temp = *(iPtr + i);
        while(temp != 0) {

            if(i == temp % 10) {
                ary[i]++;
            }
            temp /= 10;
        }
    }

    for(i = 0; i < 10; i++) {
        if(ary[i] > 0) {
            printf("digit %d : %d\n", i, ary[i]);
        }
    }

整数からの数字の出現を保存するプログラムを書いていますが、プログラムを実行すると、配列が機能していないことがわかります

整数から数字を格納できない理由を知りたいですか?そしてそれを修正する方法は?

もう1つの質問、if(x = y)とif(x == y)の違いは何ですか

4

4 に答える 4

1

あなたの問題はこの行です:

if(i == temp % 10)

演算子の優先順位により、== は % の前に評価されます。% を括弧で囲んで修正します。

if(i == (temp % 10))

また、他の質問といくつかのちょっとした質問に答えるには(事前にお詫びします):

  • = は割り当て、== は等価テストです。
  • あなたがやろうとしていると言ったことによると、内側の while ループが i を誤用しているようです。
于 2013-02-06T01:41:20.437 に答える
1

次のループは再検討が必要です

while(temp != 0) {

            if(i == temp % 10) {
                ary[i]++;
            }
            temp /= 10;
        }

ここで何をしようとしているのかわかりません。

まず考え直すif(i == temp % 10)

あなたはここであまりにも多くのことをしています。ここで i は 10 モジュラスの temp と比較され、それらが等しい場合はそれらを配列に格納します。

このループの実行を開始したとします。したがって、私は = 0 です。最初に入力する数字が 1023 だとします。そう

i = 0
temp = 1023

これで 1023%10 は 3 になります。

したがって、あなたの if ループはif(0 == 3 )// Its an equality check になります。0 が 3 に等しいかどうか。

明らかにこれは false になるため、内部配列ループは実行されません。

于 2013-02-06T02:51:09.803 に答える
1

わかりましたので、ほとんど正しいと思いますが、最大の問題は、最初から配列にガベージが含まれていることだと思います(宣言されたとき)。

 int i, temp, num, *iPtr;
int ary[10] = {0};            //I can only assume you did *not* do this

//printf("\n\tHow many integers: ");
//scanf("%d", &num);
num = 2;

iPtr = malloc(num * sizeof(int));



for(i = 0; i < num; i++) 
{
    printf("Enter integer # %d ", i+1);
    scanf("%d", (iPtr +1));

    temp = *(iPtr+1);
    while(temp != 0) 
    {

        if( (i) == temp % 10)     
        {
            ary[i]++;             
        }

        temp /= 10;
    }
}

for(i = 0; i < 10; i++) 
{
    if(ary[i] > 0) 
    {
        printf("digit %d : %d\n", i, ary[i]);
    }
}

このプログラムも不完全です。一致するのに十分な桁数をチェックする前にループが終了する可能性があるからです。つまり、 temp にまだ数値が含まれているかどうかを確認していますが、それをiと比較しているだけで、変化しません (したがって、temp の桁が 9 で i が 1 の場合、トリガーされることはありませんカウントする 9 があることを確認します)。

だから私は修正しました

if( (i) == temp % 10)     
{
    ary[i]++;             
}

        for (int zz = 0; zz < 10; zz++)
        {
            if( (zz) == temp % 10) 
            {
               ary[zz]++;            
            }
        }

これで、プログラムはすべての桁を数えます。出力:ここに画像の説明を入力

これはすべて、私があなたのプログラムを正しく理解していることを前提としています。通常、私はコードを直接投稿するのは好きではありませんが、他の方法で要点を理解する方法が本当にわかりませんでした。疲れた気圧。:/

于 2013-02-06T03:45:52.467 に答える
0

if(x=y) -> これは代入演算子です。つまり、y の値を x に代入しています。これにより、常に y が x に割り当てられ、その中のステートメントが実行されます。

if(x==y) -> これは比較演算子です。ここでは、x の値が y と等しいかどうかを比較しています。true の場合、{} 内のステートメントを実行します。それ以外の場合は実行しません。

于 2013-02-06T01:54:38.543 に答える