-1

我正在参加哈佛的公开课件并尝试做作业题。我用 C 编写(或试图)编写一个程序来使用冒泡排序实现对数组进行排序。完成后,我用大小为 5、6、3 等的数组对其进行了测试。一切正常。然后,我尝试使用大小为 11 的数组对其进行测试,然后它就开始出现问题。该程序被编写为在达到用户输入的数组大小后停止获取数组的数字。但是,当我使用数组大小​​ 11 对其进行测试时,它会不断尝试从用户那里获取更多值,超过声明的大小。它对我持续了几天,然后第三天我尝试将数组大小变量初始化为 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

您可以轻松使用 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];

并且您应该在创建数组时输入一个数字并且不能使用变量(例如代码中的“int num”)。这是在 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 回答
0

事实证明,这样做的原因是因为在将数组的邻居与自身进行比较时,如下所示:

如果(值 [i + 1] > 值 [i])

事实上,我只是检查它是否大于,而没有检查它是否是 '=' 那么它导致它的行为不受欢迎。因此,如果数组是例如 [1, 1, 5, 2, 6, 8],那么 1 就在 1 旁边,我的程序没有考虑到这种行为,而是按照它的方式行事。

于 2012-09-24T01:29:49.417 回答