2015-04-03 66 views
0

我必須編寫一個程序,其中向量按從小到大排序。我使用帶交換的泡泡函數交換兩個向量。交換和氣泡代碼給出了,但問題是它不交換向量。賦值語句表示使用這個交換函數,並用向量的地址「調用它」。在C中交換兩個向量

void swap (double **p, double **q) 
{ 
double *temp; 

temp=*p;  
*p=*q;  
*q=temp; 
} 





int main (void) 
{ 
int dim, num; 
int i, j; 
double **w, a[100]; 
double size; 

scanf ("%d %d", &dim, &num);   /* read N and M */ 
w = calloc (num, sizeof (double *)); /* allocate array of M pointers */ 
for (i = 0; i < num; i++) 
{ 
    /* allocate space for N dimensional vector */ 
    w[i] = calloc (dim, sizeof (double)); 
    /* read the vector */ 
    for (j = 0; j < dim; j++) 
    { 
     scanf ("%le", &w[i][j]); 
    } 
} 

/*Length*/ 
for(i=0; i<num; ++i) 
{ 
    size=0.0; 
    for(j=0; j<dim; ++j) 
    { 
     size+=pow(w[i][j],2); 
    } 
    a[i]=sqrt(size); 
} 

    i=0; 
    for (j = num - 1; j > i; --j) 
    { 
     if (a[j-1] > a[j]) 
     { 
      swap(&w[j-1], &w[j]); 
     } 
     i++; 
    } 
return 0; 
} 
+3

你忘了問一個問題輸入一個值。 – 2015-04-03 15:50:40

+1

我認爲問題在於,當您交換兩個向量時,您不會交換'a'中的值,並且之後'a'與'w'中的值不正確對應。 – IronMensan 2015-04-03 15:50:57

+0

謝謝! – 2015-04-03 17:18:08

回答

0

談到我的意見爲答案...

當你在交換w兩個項目還需要在a交換兩個對應的值,使得兩個陣列相互匹配。

if (a[j-1] > a[j]) 
{ 
    swap(&w[j-1], &w[j]); 
    double temp = a[j-1]; 
    a[j-1] = a[j]; 
    a[j] = temp; 
} 

此外,你應該動態分配a因爲用戶可以爲num大於100

double **w; 
double * a; 
double size; 

scanf ("%d %d", &dim, &num);   /* read N and M */ 
w = calloc (num, sizeof (double *)); /* allocate array of M pointers */ 
a = calloc (num, sizeof (double));