2016-01-11 3 views
0

Я пытаюсь написать рекурсивную функцию, которая проверяет, отсортирован ли данный массив вверх по четным индексам. например, у меня есть массив size 5. и цифры 1 , 2 , 3 , 4 ,5. Это будет return 1, потому что arr[0] < arr[2] < arr[4].Проверьте рекурсивно, если массив отсортирован по четным индексам

Проблема в этой строке:

if (i >= arr[isEven]) return 1; //Sorted 

Вот код:

#include <stdio.h> 
#include <conio.h> 

int SortedUpDown(int arr, int num); 

int main() 
{ 
    int sizeOfArr = 0, i = 0,*arr, num = 0, checkIfSorted = -1; 
    printf("Enter the size of the array : \n"); 
    scanf("%d", &sizeOfArr); 
    printf("Enter %d numbers to the array \n: ", sizeOfArr); 
    arr = (int *)malloc(sizeOfArr * sizeof(int)); 
    for (i = 0; i < sizeOfArr; i++) 
    { 
     scanf("%d", &num); 
     *(arr + i) = num; 
     printf("%d ", arr[i]); 
    } 
    checkIfSorted = SortedUpDown(*arr,sizeOfArr); 
    getch(); 

    return 0; 
} 

int SortedUpDown(int *arr, int num) 
{ 
    int i = 0, isEven = 0; 
    if (num % 2 == 0) isEven = num - 2; //if The array is even, (for example arr[6] then check 0,1,2,3,4,5 only 0,2,4) 
    else isEven = num - 1; //if the array is odd, (for example arr[7] then check 0,1,2,3,4,5,6 only 0,2,4,6) 
    if (i >= arr[isEven]) return 1; //Sorted 
    if (arr[i] > arr[i + 2]) return 0; //Not sorted 
    return i += 2, SortedUpDown(arr, num); //Advance i by 2. 
} 

Ошибка брошено:

Exception thrown at 0x00AE18BC in ConsoleApplication1.exe: 0xC0000005: Access violation reading location 0x00000011. 

If there is a handler for this exception, the program may be safely continued. 

Edit: Я хочу проверить сейчас, если это идет вниз для нечетных индексов, и это не работает, вот мой код:

У меня 2 вопроса:

  1. Почему это не работает?

    1. Можете ли вы помочь мне написать эти 2 функции в одной функции, что означает, что он будет проверять четность и вниз на нечетных индексах одновременно?
#include <stdio.h> 
#include <stdlib.h> 
#include <conio.h> 

int SortedDown(int *arr, int num); 
int SortedUp(int *arr, int num); 

int main(void) 
{ 
    int sizeOfArr = 0, i = 0, *arr, num = 0, checkIfSortedDown = -1, checkIfSortedUp = -1; 
    printf("Enter the size of the array : \n"); 
    scanf("%d", &sizeOfArr); 
    printf("Enter %d numbers to the array \n: ", sizeOfArr); 
    arr = (int *)malloc(sizeOfArr * sizeof(int)); 
    for (i = 0; i < sizeOfArr; i++) 
    { 
     scanf("%d", arr + i); 
     printf("%d ", arr[i]); 
    } 
    puts(""); 
    checkIfSortedDown = SortedDown(arr, sizeOfArr); 
    checkIfSortedUp = SortedUp(arr, sizeOfArr); 
    if (checkIfSortedDown && checkIfSortedUp) 
     puts("Sorted"); 
    else 
     puts("Not Sorted"); 
    free(arr); 
    getch(); 

    return 0; 
} 

int SortedDown(int *arr, int num) { 
    --num;//size to last index 
    if (num % 2 != 0) //if index is not even 
     --num; 
    if (num <= 0) 
     return 1;//Sorted 
    else if (arr[num - 2] > arr[num]) 
     return 0;//Not sorted 
    else 
     return SortedDown(arr, num - 2 + 1);//+1 : last index to size 
} 

int SortedUp(int *arr, int num) { 
    --num;//size to last index 
    if (num % 2 == 0) 
     --num; 
    if (num <= 0) 
     return 1;//Sorted 
    else if (arr[num - 2] < arr[num]) 
     return 0;//Not sorted 
    else 
     return SortedUp(arr, num - 2 + 1);//+1 : last index to size 
} 
+0

Похоже, один из ваших случаев читает мимо конца массива: 'if (arr [i]> arr [i + 2]) return 0; // Не отсортировано' –

+0

@ KristopherMicinski И я думаю, что строка до этого должна быть изменена на if (i> = isEven) return 1; // Отсортировано –

+0

@KristopherMicinski Что вы думаете о редактировании? –

ответ

1

Похоже, вы бежите в бесконечный цикл при вызове SortedUpDown() из SortedUpDown(), так как я установлен в ноль при каждом вызове.

Попробуйте использовать static для сохранения значения 'i';

static int i = 0; 

EDIT:

Кроме того, я исправил несколько вопросов, начиная с декларации Fn в качестве указателя.

int SortedUpDown(int *arr, int num); 

И называть его так:

checkIfSorted = SortedUpDown(arr,sizeOfArr); 

Ниже приведен полный код:

#include <stdio.h> 
#include <stdlib.h> 

int SortedUpDown(int *arr, int num); 

int main() 
{ 
    int sizeOfArr = 0, i = 0,*arr, num = 0, checkIfSorted = -1; 
    printf("Enter the size of the array : \n"); 
    scanf("%d", &sizeOfArr); 
    printf("Enter %d numbers to the array \n: ", sizeOfArr); 
    arr = (int *)malloc(sizeOfArr * sizeof(int)); 
    for (i = 0; i < sizeOfArr; i++) 
    { 
     scanf("%d", &num); 
     *(arr + i) = num; 
     printf("%d ", arr[i]); 
    } 
    checkIfSorted = SortedUpDown(arr,sizeOfArr); 
    printf("\ndone %d\n",checkIfSorted); 
    //getch(); 

    return 0; 
} 

int SortedUpDown(int *arr, int num)  
{ 
    static int i = 0; 
    if (i >= num - 1) return 1; 
    if (arr[i] > arr[i + 1]) return 0; 
    return i++, SortedUpDown(arr, num); 
} 
+0

Все еще не работает, даже для кода в разделе «edit:». –

+0

работает для меня, но я сделал кое-какие другие очистки, которые, как я думал, не требовались. позвольте мне опубликовать все изменения –

+0

@IlanAizelmanWS: Вы уверены? Я не хочу оскорблять вас, но вы уверены, что применили 'static' вправо' i'? Если да, попробуйте подготовить [минимальный полный пример] (http://stackoverflow.com/help/mcve) и опубликовать это. – Beta

2
#include <stdio.h> 
#include <stdlib.h> //need this header 
#include <conio.h> //not standard 

int SortedUpDown(int *arr, int num);//prototype to match implementation 

int main(void) 
{ 
    int sizeOfArr = 0, i = 0, *arr, num = 0, checkIfSorted = -1; 
    printf("Enter the size of the array : \n"); 
    scanf("%d", &sizeOfArr); 
    printf("Enter %d numbers to the array \n: ", sizeOfArr); 
    arr = (int *)malloc(sizeOfArr * sizeof(int)); 
    for (i = 0; i < sizeOfArr; i++) 
    { 
     scanf("%d", arr + i); 
     printf("%d ", arr[i]); 
    } 
    puts(""); 
    checkIfSorted = SortedUpDown(arr, sizeOfArr);//pass arr, not *arr 
    if(checkIfSorted) 
     puts("Sorted"); 
    else 
     puts("Not Sorted"); 
    free(arr); 
    getch(); 

    return 0; 
} 

int SortedUpDown(int *arr, int num){ 
    --num;//size to last index 
    if (num % 2 != 0) 
     --num; 
    if(num <= 0) 
     return 1;//Sorted 
    else if (arr[num-2] > arr[num]) 
     return 0;//Not sorted 
    else 
     return SortedUpDown(arr, num-2+1);//+1 : last index to size 
} 
+0

Просто незначительная * предупреждающая * коррекция, 'неиспользуемая переменная 'num'' в' main() '. Отлично сработано. –

+0

Ах! да. Это моя ошибка (уменьшить код). Он/она может вернуться. – BLUEPIXY

+0

@BLUEPIXY Я проверю код как можно скорее. Спасибо огромное! Постскриптум от быстрого взгляда у меня много фонда. ошибки мне нужно отсортировать. спасибо за дополнение «\\». –