0

これまでのプログラムは、ユーザーが宣言したサイズに基づいて配列を作成します。次に、プログラムはその配列を 500 から 600 までの乱数で埋め、それらの数字のうち 4 つを出力し、新しい行を作成してそれらの出力を続けます。この時点まではすべて正常に動作します。番号を昇順に再印刷すると思われる部分で何かがうまくいかず、番号の一部のみを任意の順序で再印刷しません。これを修正する方法についての助けをいただければ幸いです。

int main(){
            int size;
            int j, i;
        int temp;
        int a=0;
        double sum = 0;


        printf("Enter size of array ");
        scanf("%d", &size);


        int* array;
        array=malloc(size * sizeof(*array));
        int *aPtr = array;

        srand(time(NULL));
        for (i = 0; i < size; i++){
             aPtr[i] =(rand() % 101) + 500;
             printf("%d ", aPtr[i]);
             a++;
             if (a == 4){
            printf("\n");
            a = 0;
            }


      }
        printf("\n\n\nIn ascending order\n");
        for (i = 0; i< size; i++){
             for (j = 0; j < size; j++){
            if(aPtr[i] > aPtr[j]);
                temp=aPtr[i];
                aPtr[i]=aPtr[j];
                    aPtr[j]=temp;
                    }
                printf("%d\n", aPtr[i]);
            }
4

2 に答える 2

0

問題は、< 記号の結果であり、if ステートメントが独自の括弧内にありませんでした。印刷用の 2 番目の for ループも、配列を正しく印刷するのに役立ちました

 printf("\n\n\nIn ascending order\n");
        for (i = 0; i < size; i++){
             for (j = i+1; j < size; j++){
            if(aPtr[i] > aPtr[j]){
                temp=aPtr[i];
                aPtr[i]=aPtr[j];
                    aPtr[j]=temp;
            }
            }
            }
            for (j = 0; j<size; j++)                
            printf("%d\n", aPtr[j]);
于 2012-09-23T22:17:43.033 に答える
0

問題は、並べ替えループの if-test です (再フォーマット):

for (i = 0; i< size; i++){
    for (j = 0; j < size; j++){
        if(aPtr[i] > aPtr[j]);
        temp=aPtr[i];
        aPtr[i]=aPtr[j];
        aPtr[j]=temp;
    }
    printf("%d\n", aPtr[i]);
}

if ブロックにコンテンツを入れていないため、関係なくすべての値を交換しています。これにより、最小限の変更でコードが修正されます。

for (i = 0; i< size; i++){
    for (j = 0; j < size; j++){
        if(aPtr[i] > aPtr[j]) {
            temp=aPtr[i];
            aPtr[i]=aPtr[j];
            aPtr[j]=temp;
        }
    }
    printf("%d\n", aPtr[i]);
}

バブル ソートでは、最小要素のインデックスを検索して1 回スワップするだけでよいことに注意してください。毎回交換しているため、かなり冗長です。j前のすべてiが既にソートされているため、内側のループでゼロからループする必要もありません。

int minidx;
for (i = 0; i< size; i++) {
    /* Find index of smallest element in the rest of the array */
    minidx = i;
    for (j = i+1; j < size; j++) {
        if(aPtr[j] < aPtr[minidx]) minidx = j;
    }

    /* Swap if necessary */
    if (minidx != i ) {
        temp = aPtr[i];
        aPtr[i] = aPtr[minidx];
        aPtr[minidx] = temp;
    }

    /* The element at i is now sorted */
    printf("%d\n", aPtr[i]);
}
于 2012-09-23T22:18:21.070 に答える