2015-10-08 138 views
1

我通过引用写了一个简单的排序代码。在这里我传递一个数组来运行,然后执行排序操作。在传递数组之后,我按照用户输入的方式输出整个数组,然后执行排序操作(按降序排列),但排序后,当我打印排序的数组时,我得到的数组索引'0'包含值'41' 。如果我输入的数字小于'41',那么已排序的数组显示为'41',然后以已排序的方式显示其他数字。请解释我为什么得到这样的输出。cpp通过引用传递

#include<iostream> 
using namespace std; 
int sort_array(int *p); 

int main() { 
    int arr[10]; 
    for (int i=0; i<10; i++) { 
     cout << "enter " << (i+1) << " value:"; 
     cin >> arr[i]; 
     cout << "\n"; 
    } 

    sort_array(arr); 
    return 0; 
} 

int sort_array(int *p) { 
    int c=0; 
    for (int i=0; i<10; i++) { 
     cout << p[i]; 
     cout << "\n"; 
    } 
    cout << "arr:"<<p[0]; 
    cout<<"\n"; 

    for (int i=0; i<10; i++) { 
     for (int j=0; j<10; j++) { 
      if (p[j] < p[j+1]) { 
      c=p[j]; 
      p[j]=p[j+1]; 
      p[j+1]=c; 
     } 
    } 

    cout << "\n"; 
    for (int i=0; i<10; i++) { 
     cout << p[i]; 
     cout << "\n"; 
    } 
    cout << p[0]; 
} 
+2

请在代码中包含初始值,而不是从命令行中读取它们,以方便可能需要帮助的人员并确保该部分不会导致问题。此外,请将代码格式保持一致,并在您的问题中包含预期和实际输出。您可能还需要调整主题或代码,因为与“按引用传递”关系不大。 –

回答

0

问题在于您的排序。 j从0到9,并且当您访问p[j+1]j = 9p[10]在您的数组边界之外。

因此请修复您的以下部分以进行正确排序。

for(int i=0;i<10;i++) 
{ 
    for(int j=0;j<10;j++) 
    { 
     if(p[j]<p[j+1]) 
     { 
      c=p[j]; 
      p[j]=p[j+1]; 
      p[j+1]=c; 
     } 
    } 
} 

说明:上面的代码是发布的原始代码的问题部分。这不是固定的排序。这是要修复的部分。

1

看起来你正在尝试在你的数组sort_array()上进行冒泡排序,但逻辑错误。尝试使用此代码来代替:

int sort_array(int *p) { 
    int c=0; 

    for (int i=0; i<10; i++) { 
     cout << p[i]; 
     cout << "\n"; 
    } 
    cout << "arr:" << p[0]; 
    cout << "\n"; 

    for (int i=0; i < 10; i++) { 
     for (int j=1; j < (10-i); j++) { 
      if (p[j-1] > p[j]) { 
       c = p[j-1]; 
       p[j-1] = p[j]; 
       p[j] = c; 
      } 
     } 
    } 

    cout << "\n"; 
    for (int i=0; i<10; i++) { 
     cout << p[i]; 
     cout << "\n"; 
    } 
    cout<<p[0]; 
} 
0
for(int i=0;i<10;i++) 
{ 
    for(int j=0;j<9;j++) 
    { 
     if(p[j]<p[j+1]) 
     { 
      c=p[j]; 
      p[j]=p[j+1]; 
      p[j+1]=c; 
     } 
    } 
} 

排序工作正常,有一次,我改变了内部循环的限制。问题是访问数组索引[10],但我已经宣布它直到索引[9]。