Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 按照3条规则(奇数、偶数、排序)显示输出_C_Arrays_Sorting - Fatal编程技术网

C 按照3条规则(奇数、偶数、排序)显示输出

C 按照3条规则(奇数、偶数、排序)显示输出,c,arrays,sorting,C,Arrays,Sorting,我试图按照以下规范编写: 我从用户那里读取了一个数组 开始时必须输入奇数 偶数必须位于数组的末尾 按奇数和偶数升序排序 这是我的代码: 更新代码 #include <stdio.h> #include <stdlib.h> int n; int j; int main(void){ scanf("%d", &n); int arr[n], aux[n], count = 0; for(int i = 0; i < n; i++){

我试图按照以下规范编写:

  • 我从用户那里读取了一个数组
  • 开始时必须输入奇数
  • 偶数必须位于数组的末尾
  • 按奇数和偶数升序排序
  • 这是我的代码:

    更新代码

    #include <stdio.h>
    #include <stdlib.h>
    
    int n;
    int j;
    
    int main(void){
        scanf("%d", &n);
        int arr[n], aux[n], count = 0;
        for(int i = 0; i < n; i++){
            scanf("%d", &arr[i]);
        }
    
        for(int i = 0; i < n; i++){
            if(arr[i] % 2 != 0){
                aux[i] = arr[i];
                count = i;
            }
            else
            {
                aux[n - j - 1] = arr[i];
                j++;
            }
        }   
    
        for(int i = 0; i < count; i++){
            if( aux[i] > aux[i+1])
            {
                aux[i]   = aux[i] + aux[i+1];
                aux[i+1] = aux[i] - aux[i+1];
                aux[i]   = aux[i] - aux[i+1];
    
            }
        }
    
        for(int i = count; i < n; i++){
            if( aux[i] > aux[i+1])
            {
                aux[i]   = aux[i] + aux[i+1];
                aux[i+1] = aux[i] - aux[i+1];
                aux[i]   = aux[i] - aux[i+1];
            }
        }
    
        for(int i = 0; i < n; i++){
            printf("%d ", aux[i]);
        }
    
        printf("\n");
    
        return 0;
    }
    
    #包括
    #包括
    int n;
    int j;
    内部主(空){
    scanf(“%d”和“&n”);
    int arr[n],aux[n],计数=0;
    对于(int i=0;i辅助[i+1])
    {
    辅助[i]=辅助[i]+辅助[i+1];
    辅助[i+1]=辅助[i]-辅助[i+1];
    aux[i]=aux[i]-aux[i+1];
    }
    }
    for(int i=计数;i辅助[i+1])
    {
    辅助[i]=辅助[i]+辅助[i+1];
    辅助[i+1]=辅助[i]-辅助[i+1];
    aux[i]=aux[i]-aux[i+1];
    }
    }
    对于(int i=0;i
    但是,输出是错误的。例如,如果我输入数组的维度
    4
    ,数组的元素是
    4 3 2 1
    ,则输出是:
    3 2 1 4196848
    ,但我希望是
    1 3 2 4
    。你能帮助我吗?
    谢谢大家!

    您有未定义的行为:

    int main(){
        int n, arr[n], aux[n] = {}, count = 0;
        scanf("%d", &n);
    
    您希望这些阵列的大小是多少?
    n
    在使用
    scanf
    读取之前不会初始化


    除此之外,您还应该为
    main
    提供一个有效的原型,因为您有未定义的行为:

    int main(){
        int n, arr[n], aux[n] = {}, count = 0;
        scanf("%d", &n);
    
    您希望这些阵列的大小是多少?
    n
    在使用
    scanf
    读取之前不会初始化


    此外,如果要动态初始化数组,则应该为
    main

    提供有效的原型,而不是使用malloc和指针

    int main(){
      int n, count = 0;
      int *arr, *aux;
    
      scanf("%d", &n);
      arr = malloc(n*sizeof(int));
      aux = malloc(n*sizeof(int));
    

    如果要动态初始化数组,请改用malloc和指针

    int main(){
      int n, count = 0;
      int *arr, *aux;
    
      scanf("%d", &n);
      arr = malloc(n*sizeof(int));
      aux = malloc(n*sizeof(int));
    

    整个程序以
    main
    的声明开头是错误的,C中的声明如下

    int main( void )
    
    在数组声明中使用具有不确定值的对象

    int n, arr[n], aux[n] = {}, count = 0;
       ^^^    ^^^     ^^^   
    
    (此外,可变长度数组可能不会被初始化),并以三个循环结束,表示它们对某些内容进行排序,而实际上什么也不排序,并且尝试访问数组之外的内存

    使用标准C函数
    qsort
    可以轻松完成此任务

    比如说

    #include <stdio.h>
    #include <stdlib.h>
    
    int odd_even(const void *lhs, const void *rhs)
    {
        int a = *(const int *)lhs;
        int b = *(const int *)rhs;
    
        return (a % 2 == b % 2) ? (b < a) - (a < b) : b % 2 - a % 2;
    }
    
    
    int main(void) 
    {
        size_t n = 1;   //  1 is minimum acceptable array size
    
        scanf( "%zu", &n );
    
        int a[n];
    
        for ( size_t i = 0; i < n; i++ ) scanf( "%d", &a[i] );
    
        qsort(a, n, sizeof(int), odd_even);
    
        for (size_t i = 0; i < n; i++) printf("%d ", a[i]);
        putchar('\n');
    
        return 0;
    }
    
    然后,将显示阵列输出

    1 3 2 4
    

    整个程序以
    main
    的声明开头是错误的,C中的声明如下

    int main( void )
    
    在数组声明中使用具有不确定值的对象

    int n, arr[n], aux[n] = {}, count = 0;
       ^^^    ^^^     ^^^   
    
    (此外,可变长度数组可能不会被初始化),并以三个循环结束,表示它们对某些内容进行排序,而实际上什么也不排序,并且尝试访问数组之外的内存

    使用标准C函数
    qsort
    可以轻松完成此任务

    比如说

    #include <stdio.h>
    #include <stdlib.h>
    
    int odd_even(const void *lhs, const void *rhs)
    {
        int a = *(const int *)lhs;
        int b = *(const int *)rhs;
    
        return (a % 2 == b % 2) ? (b < a) - (a < b) : b % 2 - a % 2;
    }
    
    
    int main(void) 
    {
        size_t n = 1;   //  1 is minimum acceptable array size
    
        scanf( "%zu", &n );
    
        int a[n];
    
        for ( size_t i = 0; i < n; i++ ) scanf( "%d", &a[i] );
    
        qsort(a, n, sizeof(int), odd_even);
    
        for (size_t i = 0; i < n; i++) printf("%d ", a[i]);
        putchar('\n');
    
        return 0;
    }
    
    然后,将显示阵列输出

    1 3 2 4
    
    像这样修复(对于当前代码)

    #包括
    //#包括//未使用的此
    /*它不必是全局变量。
    int n;
    int j;
    */
    内部主(空){
    int n;
    scanf(“%d”和“&n”);
    int arr[n],aux[n],count_奇数=0;
    对于(int i=0;iaux:[1,3,3],但您需要aux:[1,3,4]
    //count=i;这是错误的。因为count应该是奇数元素的数量,所以它不仅仅是arr的索引。
    aux[count_odd++]=arr[i];
    }否则{
    aux[偶_i--]=arr[i];
    }
    }   
    //(气泡)排序
    //为每个回路确定一个元件的位置
    //因此,在交换相邻元素的方法中,有必要进行双环。
    //当N个元素时,外环可以是N-1倍。
    //因为两个元素的位置是在最后一个循环中确定的。
    //由于每个循环确定一个元素,
    //内环可以一次减少每个外环的次数。
    对于(int j=0,no=count_奇数;j辅助[i+1]){
    /*由于A+B的结果可能溢出,因此不应使用这种方法。
    辅助[i]=辅助[i]+辅助[i+1];
    辅助[i+1]=辅助[i]-辅助[i+1];
    aux[i]=aux[i]-aux[i+1];
    */
    内部温度=辅助温度[i];
    aux[i]=aux[i+1];
    辅助[i+1]=温度;
    }
    }
    }
    //由于它执行相同的处理,因此最好将其概括为一个函数。
    对于(int j=0,ne=n-count_奇数;j辅助[i+1]){
    内部温度=辅助温度[i];
    aux[i]=aux[i+1];
    辅助[i+1]=温度;
    }
    }
    }
    对于(int i=0;i
    像这样修复(对于当前代码)

    #包括
    //#包括//未使用的此
    /*它不必是全局变量。
    int n;
    int j;
    */
    内部主(空){
    int n;
    scanf(“%d”和“&n”);
    int arr[n],aux[n],count_奇数=0;
    对于(int i=0;iaux:[1,?,