-1

私はハーバードのオープンコースウェアに参加していて、宿題の質問を試みています。私は、バブルソートの実装を使用して配列をソートするプログラムをCで作成しました(または作成しようとしました)。終了後、サイズ5、6、3などの配列でテストしました。すべて機能しました。次に、サイズ11の配列でテストしようとしましたが、それがバグアウトを開始したときです。このプログラムは、ユーザーが入力した配列サイズに達した後、配列の数値の取得を停止するように作成されています。しかし、配列サイズ11でテストしたところ、宣言されたサイズを超えて、ユーザーからより多くの値を取得しようとし続けました。それは私に数日間一貫してそれをしました、そして3日目に私は配列サイズ変数を0に初期化しようとしました、そして突然それは4以上の配列サイズで同じ問題を抱え続けるでしょう。初期化を元に戻しましたが、4を超える配列サイズでも同じことを続けています。プログラムが一部の配列サイズで機能し、他のサイズでは機能しない理由がわかりません。mainを使用してキーボードから配列のサイズと値を取得し、それを自分が作成したsortという関数に渡しました。これは宿題や私が単位を取得するために必要なものではないことに注意してください。これは学習のためだけのものです。コメントをいただければ幸いです。ありがとう。

/**************************************************************************** 
 * helpers.c
 *
 * Computer Science 50
 * Problem Set 3
 *
 * Helper functions for Problem Set 3.
 ***************************************************************************/

#include <cs50.h>
#include <stdio.h>

#include "helpers.h"

void 
sort(int values[], int n);

int main(){

    printf("Please enter the size of the array \n");
    int num = GetInt();
    int mystack[num];
    for (int z=0; z < num; z++){
        mystack[z] = GetInt();
    }

    sort(mystack, num);
}


/*
 * Sorts array of n values.
 */

void 
sort(int values[], int n)
{
    // this is a bubble sort implementation
    bool swapped = false; // initialize variable to check if swap was made

    for (int i=0; i < (n-1);){ // loops through all array values

        if (values[i + 1] > values [i]){ // checks the neighbor to see if it's bigger
            i++; // if bigger do nothing except to move to the next value in the array
        }
        else{ // if neighbor is not bigger then out of order and needs sorting
            int temp = values[i]; // store current array value in temp variable for swapping purposes
            values[i] = values[i+1]; //swap with neighbor
            values[i+1] = temp; // swap neighbor to current array value
            swapped = true; // keep track that swap was made
            i++;
       }

       // if we are at the end of array and swap was made then go back to beginning
       // and start process again.
       if((i == (n-1) && (swapped == true))){ 
           i = 0;
           swapped = false;
       }

       // if we are at the end and swap was not made then array must be in order so print it
       if((i == (n-1) && (swapped == false))){
           for (int y =0; y < n; y++){
                printf("%d", values[y]);
           }
           // exit program
           break; 
       }

   } // end for

   // return;
}
4

3 に答える 3

0

これを行っていた理由は、次のようにアレイのネイバーをそれ自体と比較する場合に発生します。

if(values [i + 1]> values [i])

'='であるかどうかをチェックせずに、それがより大きいことをチェックしていたという事実は、それが望ましくない動作を引き起こしていました。したがって、配列がたとえば[1、1、5、2、6、8]の場合、1が1の隣にあるため、私のプログラムはこの動作を考慮せず、そのように動作しました。

于 2012-09-24T01:29:49.417 に答える
0

ネストされた2つのforループを簡単に使用できます。

int i, j, temp ;
for ( i = 0 ; i < n - 1 ; i++ )
{
    for ( j = 0 ; j <= n - 2 - i ; j++ )
    {
        if ( arr[j] > arr[j + 1] )
        {
            temp = arr[j] ;
            arr[j] = arr[j + 1] ;
            arr[j + 1] = temp ;
        }
    }
}

また、cには次のようなものがないため、acではなくc++コードにする必要があります。

int mystack[num];

配列を作成するときに数値を入力する必要があり、変数(コードの「intnum」など)を使用することはできません。これはCですが、C++では正しく実行しています。

于 2012-09-19T04:30:16.987 に答える
0

このような問題をデバッグするときに最初に行うことは、コンピューターが、表示すべきと思われるデータを認識していることを確認することです。入力時にデータを印刷することでこれを行います。入力に問題があります。コンピューターが認識しているものを印刷します。

static void dump_array(FILE *fp, const char *tag, const int *array, int size)
{
    fprintf(fp, "Array %s (%d items)\n", tag, size);
    for (int i = 0; i < size; i++)
        fprintf(fp, "  %d: %d\n", i, array[i]);
}

int main(void)
{
    printf("Please enter the size of the array \n");
    int num = GetInt();
    printf("num = %d\n", num);
    int mystack[num];
    for (int z = 0; z < num; z++)
    {
        mystack[z] = GetInt();
        printf("%d: %d\n", z, mystack[z]);
    }

    dump_array(stdout, "Before", mystack, num);
    sort(mystack, num);
    dump_array(stdout, "After", mystack, num);
}

これにより、入力時に何が入力されているかが直接示され、何が問題になっているのかを認識するのに役立つ可能性があります。入力の印刷は、非常に基本的なデバッグ手法です。

また、スタイル的には、呼び出されるべき関数があるというsort_array_and_print()ことは、正しい分業がないことを示唆しています。ソートコードはソートするdump_array()必要があり、配列の印刷には別の関数(私が示した関数など)を使用する必要があります。

于 2012-09-19T04:48:56.853 に答える