扫描声明后C程序没有响应

时间:2017-07-15 06:43:53

标签: c

我的代码编译并运行。但是在输入之后它不会执行程序的下一个语句。

它接受数组的所有输入元素然后它不做任何事情。我认为在scanf循环内的第二个for语句之后存在问题。

我不确定代码是否正确但是在编译和运行之后,我预计它应该给出最终输出,即使它不是预期的(或不正确的)。

我使用Code::Blocks(16.01)作为IDE。 我的操作系统是Windows 8.1(64位)。

我的代码:

#include <stdio.h>

void quick(int *, int, int);

int main() {
    int n, i, pivot, j, k, l, u;

    printf("Give size\n");
    scanf("%d", &n);

    int a[n];
    printf("Enter the list\n");
    for (i = 1; i <= n; i++)
        scanf("%d", &a[i]);

    quick(a, 1, n - 1);
    printf("\nSorted numbers are\n");
    for (i = 1; i <=n; i++)
        printf("%d ", a[i]);
    printf("\n");

    return 0;
}

void quick(int a[], int l, int u) {
    int pivot, j, temp, i;
    pivot = a[l];
    i = l;
    j = u;

    while (i <= j) {
        if (a[i] > pivot && a[j] < pivot) {
            temp = a[i];
            a[i] = a[j];
            a[j] = temp;
        } 
        else if (a[i] < pivot)
            i++;
        else if (a[j] > pivot)
            j--;
    }
    quick(a, l, j - 1);
    quick(a, j + 1, u);
}

Output of the program

5 个答案:

答案 0 :(得分:1)

正如其他人在评论中指出的那样,你犯了一些错误:

  1. 您已将您的数组声明为int a[n];并且数组索引从0开始,那么为什么要传递数组,因为它的索引从1开始?您需要将for循环更改为:for(i=0;i<n;i++)并快速拨出以下呼叫:quick(a,0,n-1);
  2. 你快速的逻辑似乎有缺陷。您选择a[l]作为您的支点,但您可以在分区逻辑中包含它。您还没有检查递归的基本条件,即l < u
  3. 在对阵列进行分区之后,您应该将分段与分区的中间元素交换(即前半部分的最后一个元素或后半部分的第一个元素,具体取决于您的选择)。我改变了你的快速排序功能,如this。我能够看到所需的输出。
  4. 我希望这会有所帮助。

答案 1 :(得分:0)

纠正你的for循环,从0开始,因为C是0原点。

for(i=0;i<n;i++){ 
  scanf("%d",&a[i]);
}

C函数参数始终是“按值传递”,这意味着函数scanf只能看到您指定为参数表达式的当前值的副本。

数组名称返回数组的第一个元素的指针(存储数组的内存位置),标量变量的名称返回标量的值,因此您需要使用&amp; operator用于获取需要写入值的标量的内存位置。

请检查您的快速排序逻辑并致电

答案 2 :(得分:0)

这是您的程序的工作版本,稍作修改:

1)第一个元素被选为pivot

2)检查递归函数的停止条件,即if (lo >= hi) { return; }

3)在i-1循环

之后,使用索引while处的元素交换pivot元素

4)在else if (a[i] <= pivot)else if (a[j] >= pivot)中包含相等性,以防止元素与pivot具有相同值时的不定式循环,例如1 1 3 5

#include <stdio.h>


void quick(int a[], int lo, int hi)
{
    if (lo >= hi)
    {
        return;
    }

    int pivot, j, temp, i;
    pivot = a[lo];
    i = lo + 1;
    j = hi;

    while (i <= j)
    {
        if (a[i] > pivot && a[j] < pivot)
        {
            temp = a[i];
            a[i] = a[j];
            a[j] = temp;
            i++;
            j--;
        }
        else if (a[i] <= pivot)
            i++;
        else if (a[j] >= pivot)
            j--;
    }

    int l = i - 1;
    temp = a[l];
    a[l] = a[lo];
    a[lo] = temp;

    quick(a, lo, l-1);
    quick(a, l+1, hi);
}

int main()
{
    const int MAX_NUM = 100;
    int arr[MAX_NUM];

    int n = 0;
    printf("How many numbers? n = ");
    scanf("%d", &n);

    if (n < 1 || n > 100)
    {
        printf("Invalid input. Nothing to do\n");
        return 0;
    }

    for (int i = 0; i < n; i++)
    {
        printf("a[%d] = ", i);
        scanf("%d", &arr[i]);
    }

    printf("Sorting...\n");
    quick(arr, 0, n-1);

    for (int i = 0; i < n; i++)
    {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

答案 3 :(得分:0)

试试这个,您甚至可以根据自己的选择进行修改:

private void button_Click(object sender, EventArgs e)
{
    var button = (Button)sender;
    textBox1.Text += button.Tag.ToString();
    counter++;
    again();
}

public Form1()
{
    InitializeComponent();

    button1.Tag = 1;
    button1.Click += button_Click;

    button2.Tag = 2;
    button2.Click += button_Click;

    // and so on for other buttons
}

答案 4 :(得分:0)

您的代码存在问题:

  • 您不会检查scanf()
  • 的返回值
  • 数组是基于C的0。循环逻辑应该读取

    for (i = 0; i < n; i++) {
        ...
    }
    
  • 类似地,如果边界包含在函数quick中,这不是在C中执行操作的经典方法,则函数调用应为:

    quick(a, 0, n - 1);
    
  • 避免命名变量l,它看起来与1类似。

  • 函数quick中的QuickSort算法似乎不正确。以下是一个广泛的参考:http://en.wikipedia.org/wiki/Quicksort

以下是修改后的版本:

#include <stdio.h>

void quick(int *, int, int);

int main(void) {
    int n, i;

    printf("Give size\n");
    if (scanf("%d", &n) != 1)
        return 1;

    int a[n];
    printf("Enter the list\n");
    for (i = 0; i < n; i++) {
        if (scanf("%d", &a[i]) != 1)
            return 1;
    }
    quick(a, 0, n - 1);
    printf("\nSorted numbers are\n");
    for (i = 0; i < n; i++)
        printf("%d ", a[i]);
    printf("\n");

    return 0;
}

void quick(int a[], int lo, int hi) {
    if (lo < hi) {
        int pivot = a[lo];
        int i = lo - 1;
        int j = hi + 1;
        int temp;

        for (;;) {
            while (a[++i] < pivot)
                continue;
            while (a[--j] > pivot)
                continue;
            if (i >= j)
                break;
            temp = a[i];
            a[i] = a[j];
            a[j] = temp;
        }
        quick(a, lo, j);
        quick(a, j + 1, hi);
    }
}