【问题标题】:Making arrays user input specific for bubble sort?使数组用户输入特定于冒泡排序?
【发布时间】:2016-11-16 07:11:12
【问题描述】:

我正在学习如何使用命令行参数来获取一个数字来决定数组中有多少元素要组织。随机数生成器应该获取用户的数字并生成那么多随机数,然后用冒泡排序对它们进行排序。 但数量不能小于 2 或大于 10,000。 我不断收到分段错误(核心转储)或者我能够输入任何数字(包括小于 2 或大于 10,000 的数字)但它什么也不做。 我确定这是错误的代码的第一部分,而不是子程序和定义,但我不知道如何修复它。

#include <stdio.h>


int randu(void);
void bubble(int *, int);
void swap(int *, int *);
int main(int argc, char *argv[]) {

   int num1;

   if (argc<2) {
    printf("Number must be between 2 and 10000.\n");
    printf("Enter a number to sort.\n");
    scanf("%d", &num1);
   }
   if (argc>10000) {
    printf("Number must be between 2 and 10000.\n");
    printf("Enter a number to sort.\n");
    scanf("%d", &num1);
   }
    sscanf(argv[1], "%d", &num1);


   int main(void) {
   int x[num1], i;
   for(i=0;i<num1;i++)
    x[i]=randu();
   printf("Here are %d numbers\n", num1);
   for (i=0;i<num1;i++)
    printf("%d\n",x[i]);
   }

   }
   int randu(void) {
   static int seed=17;
   seed=(25179*seed+13849)%65536;
   return seed;
   }
   void bubble(int a[], int num1){
   int i,j;
   for (i=0;i<num1-1;i++)
    for(j=num1-1;i<j;j--)
    if(a[j-1]>a[j])
    swap(&a[j-1],&a[j]);
   }
   void swap(int *a, int *b){
   int temp;
   temp=*a;
   *a=*b;
   *b=temp;
   }

【问题讨论】:

  • 你有一个嵌套的main()...哇?
  • 我怀疑您的代码是否可以编译...您有 2 个 main 函数嵌套到另一个...
  • 缩进很难看。
  • 有关命令行参数的信息,请参阅stackoverflow.com/documentation/c/1285/…。您当前使用的argc 是错误的。

标签: c arrays sorting command-line


【解决方案1】:

您的代码存在许多问题

1) argc 的使用是错误的。 argc 不是参数的值。它是参数的数量(包括程序名称)。

2) 在main 内有一个嵌套的main。不要那样做。

3) 你永远不会调用冒泡排序函数。添加它。

所以对你的程序稍作改写:

int randu(void);
void bubble(int *, int);
void swap(int *, int *);

int main(int argc, char *argv[]) {

  int num1;

  if ((argc < 2) ||
      (sscanf(argv[1], "%d", &num1) != 1) ||
      (num1 < 2) ||
      (num1 > 10000)) {
    printf("You must give a number in range 2-10.000 as input\n");
    return 0;
  }

  int x[num1], i;
  for(i=0;i<num1;i++) {
    x[i]=randu();
  }

  printf("Here are %d numbers\n", num1);
  for (i=0;i<num1;i++) {
    printf("%d\n",x[i]);
  }

  // Call the sort function    
  bubble(x, num1);

  printf("Here are %d numbers sorted\n", num1);
  for (i=0;i<num1;i++) {
    printf("%d\n",x[i]);
  }
  return 0;
}

int randu(void) {
  static int seed=17;
  seed=(25179*seed+13849)%65536;
  return seed;
}

void bubble(int a[], int num1){
  int i,j;
  for (i=0;i<num1-1;i++)
    for(j=num1-1;i<j;j--)
      if(a[j-1]>a[j])
        swap(&a[j-1],&a[j]);
}

void swap(int *a, int *b){
  int temp;
  temp=*a;
  *a=*b;
  *b=temp;
}

“prog 5”给出输出:

Here are 5 numbers
48676
38117
52608
17049
29820
Here are 5 numbers sorted
17049
29820
38117
48676
52608

【讨论】:

  • 如果用户在运行代码时没有输入数字,它会停止程序。我将如何使它不断地要求一个数字,直到用户给出一个数字?我会将第一个 if 语句更改为 while 循环吗?
  • @MasoCB - 不,不要将第一个 if 更改为 while。您可以将else 添加到第一个if,然后在else 部分内创建while。在while 中,您将使用scanf 并检查返回值是否为1。
猜你喜欢
  • 2019-01-19
  • 1970-01-01
  • 1970-01-01
  • 2018-03-29
  • 2016-02-10
  • 1970-01-01
  • 2013-09-28
  • 1970-01-01
相关资源
最近更新 更多