如何在已修改的函数外部打印数组值

时间:2018-01-20 18:02:58

标签: c arrays function

void sort(int values[], int n);  

void modify_all_aray_values_to_0(int value[], int array_size);

int main(void)
{
    int aray[] = {4,2,56,2,1,7,20,9,3,5,6,4,3,2,44,57};
    int size_of_aray = sizeof(aray)/sizeof(aray[0]);
    sort(aray, size_of_aray);
    printf("\n");
}

void sort(int values[], int n)
{
    // TODO: implement a sorting algorithm
    int temporary;
    //assumes temporary array size will not exceed 1000
    int temporary_array[1000];
    int size_of_tmp_array = sizeof(temporary_array)/sizeof(temporary_array[0]);
    //set all values in temporary array to 0
    modify_all_aray_values_to_0(temporary_array, size_of_tmp_array);
    for(int i = 0; i < n; i++)
    {
        //store the values of values[] i'th in temporary variable
        //at this stage, temporary = 4, because first element in values[] is 4
        temporary = values[i];
        //store result of temporary_array[4]+1 in temporary_array[4]
        //at this stage temporary_array[4],s values is 0
        //when i assigned it, it gets the value (0) and increament it with 1
        //this means so far i have seen value 4 once in values[]
        /*so if this loops again and it found value 4, it will
        modify and increament temporary_array value to 2*/
        temporary_array[temporary] = temporary_array[temporary]+1;
        //so at the end of the loop
        //temporary_array[1] = 1
        //temporary_array[2] = 3
        //temporary_array[3] = 2
        //temporary_array[4] = 2 and so on...
    }
    int tu;
    //print all values in values[] before it get modified
    for(int i = 0; i < n; i++)
    {
        printf("%i-", values[i]);
    }
    printf("\n");
    //assumes it wont loop more than 100 times
    for(int i = 0; i < 100; i++)
    {
        if(temporary_array[i] > 0)
        {
            for(tu = 0; 0 < temporary_array[i]; tu++ )
            {
                //modify valeus[] by assigning i'th value
                //at this stage if when temporary_array[1] is greater than 0
                //store 1 in values[0]
                values[tu] = i;
                //immediately decrease temporary_array[1] by 1
                //now temporary_array[1] is now 0
                //next time the loop will check if its greater than 0
                //if so it will modify values[] and store the value
                //else it wont bother and that means 1 doesnt appear in array again
                temporary_array[i] = temporary_array[i]-1;
                //print values[0] inside loop after modification
                printf("%i,", values[tu]);
                //printed 1
                //will print 1,2,2,2,3,3... and so on after compilation
            }
        }
    }
    printf("\n");
    for(int i = 0; i < n; i++)
    {
        //print values[0] outside the previous loop
        printf("%i-", values[i]);
        //this time around it printed 57 instead of 1
        //prints 57-4-2-2-1-7-20... and so on
        //what could have happend?
    }
    printf("\n");
    return;
}

void modify_all_aray_values_to_0(int value[], int array_size)
{
    for(int i = 0; i < array_size; i++)
    {
        value[i] = 0;
    }
}

请帮我解决这个问题。 我之前发布过这个问题,但这不是可以理解的,所以我决定删除这个问题并研究用户评论只是为了从错误中吸取教训,以便我能够提出我们会理解的问题。 / p>

我已经练习了代码格式化,感谢上帝,因为它比我发布的上一篇文章更好。

1 个答案:

答案 0 :(得分:0)

我能够发现您的代码存在很多问题。首先,你必须阅读How to Ask。为了给你几点:

  1. 不要在代码中添加太多注释,这会让人难以理解
  2. 按名称使用众所周知的概念,以便其他人更容易理解您在做什么。就像这里一样,从它的外观来看,你正试图实现Counting Sort
  3. 至于代码,您面临的主要错误是由此代码块引起的

    for(int i = 0; i < 100; i++)
        if(temporary_array[i] > 0)//If the count of a number is > 0
            for(tu = 0; 0 < temporary_array[i]; tu++ ){ //<- ERROR HERE 
                values[tu] = i;
                temporary_array[i] = temporary_array[i]-1;
                printf("%i,", values[tu]);
            }
    

    问题在于您每次都将values[tu]设置为temporary_array中新发现的非零项目。那么首先,你做values[0]=1然后再改变values[0]=2等等......

    我没有指出问题的确切解决方案,或者您为什么要面对它。因为鼓励你自己解决这个问题。所以继续看看那个代码块并尝试修复它。如果有更多问题,你可以问:)

    PS :这是我编辑的代码版本,这使我更容易理解

    #include <stdio.h>
    
    void sort(int values[], int n);  
    
    void modify_all_aray_values_to_0(int value[], int array_size);
    
    int main(void){
        int aray[] = {4,2,56,2,1,7,20,9,3,5,6,4,3,2,44,57};
        int size_of_aray = sizeof(aray)/sizeof(aray[0]);
        sort(aray, size_of_aray);
    }
    
    void sort(int values[], int n){
        int temporary;
    
        int temporary_array[1000];
        int size_of_tmp_array = sizeof(temporary_array)/sizeof(temporary_array[0]);
    
        modify_all_aray_values_to_0(temporary_array, size_of_tmp_array);
        for(int i = 0; i < n; i++){
            temporary = values[i];
            temporary_array[temporary] = temporary_array[temporary]+1;
        }
        int tu;
    
        printf("Before getting modified: ");
        for(int i = 0; i < n; i++)
            printf("%i ", values[i]);
    
        printf("\n\n");
    
    
        printf("temporary_array: ");
        for(int i = 0; i < size_of_tmp_array; i++){
            if(temporary_array[i]>0) printf("%d-%i ", i,temporary_array[i]);
        }
        printf("\n\n");
    
        for(int i = 0; i < 100; i++)
            if(temporary_array[i] > 0)//If the count of a number is > 0
                for(tu = 0; 0 < temporary_array[i]; tu++ ){
                    values[tu] = i;
                    temporary_array[i] = temporary_array[i]-1;
                    printf("%i,", values[tu]);
                }
    
        printf("\n\nShould be 1 2 2 2 3 3 4 4 5 6 7 9 20 44 56 57");
        printf("\n\nAfter Sorting: ");
        for(int i = 0; i < n; i++)
            printf("%i ", values[i]);
    
        printf("\n");
        return;
    }
    
    void modify_all_aray_values_to_0(int value[], int array_size){
        for(int i = 0; i < array_size; i++) value[i] = 0;
    }