2014-12-13 100 views
0

我想在C編程中使用排序數組。我有三個陣列,ARR1,ARR2,ARR3,被一起使用,使這個:通過排序功能傳遞字符串數組

arr1: arr2: arr3: 

4534 97.5 m4W 
4554 97.4 m5W 
4574 97.6 m6W 
3934 97.1 m1W 
4054 97.2 m2W 
4174 97.3 m3W 

我希望讓他們按照從最小到最大基於第一陣列對這些陣列進行排序, ARR1。

到目前爲止,我有一個函數可以正確排序前兩列。但是,我不知道如何去排序第三列字符串。這是我到目前爲止的代碼:

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

void sortArray(float a[], float b[], char c[], int size){ 
    int i, swap; 
    float temp1, temp2; 
    char temp3; 
    do{ 
     swap = 0; 
     for (i = 0; i < size - 1; i++){//basic sorting for loop 
      if (a[i]>a[i + 1]){ 
       swap = 1; 
       temp1 = a[i]; //temporarily stores value of array cell 
       temp2 = b[i]; 
       temp3 = c[i]; 
       a[i] = a[i + 1]; //swaps the cells 
       b[i] = b[i + 1]; 
       c[i] = c[i + 1]; 
       a[i + 1] = temp1;//stores value in swapped cell 
       b[i + 1] = temp2; 
       c[i + 1] = temp3; 
      } 
     } 
    } while (swap); 

} 

int main() 
{ 
    float arr1[6] = { 4534, 4554, 4574, 3934, 4054, 4174 }; 
    float arr2[6] = { 97.5, 97.4, 97.6, 97.1, 97.2, 97.3 }; 
    char arr3[6][4] = { "m4w", "m5w", "m6w", "m1w", "m2w", "m3w" }; 

    printf("Arrays before sorting:\n"); 
    for (int i = 0; i != 6; i++) 
    { 
     printf("%f ", arr1[i]); 
     printf("%f ", arr2[i]); 
     printf("%s\n", arr3[i]); 
    } 

    sortArray(arr1, arr2, *arr3, 6); ///this is where the sorting function is used 

    printf("\n\nArrays after sorting:\n"); 

    for (int i = 0; i != 6; i++) 
    { 
     printf("%f ", arr1[i]); 
     printf("%f ", arr2[i]); 
     printf("%s\n", arr3[i]); 
    } 


    system("pause"); 
    return 0; 
} 

這是輸出:

Arrays before sorting: 
4534.0 97.5 m4w 
4554.0 97.4 m5w 
4574.0 97.6 m6w 
3934.0 97.1 m1w 
4054.0 97.2 m2w 
4174.0 97.3 m3w 


Arrays after sorting: 
3934.0 97.1 
4054.0 97.2 4ww 
4174.0 97.3 m6w 
4534.0 97.5 m1w 
4554.0 97.4 m2w 
4574.0 97.6 m3w 

顯然,第三列是做錯了。我真的不知道如何將字符串數組傳遞給函數,並讓函數按照前兩列那樣排序。任何幫助,將不勝感激

+0

sortArray()錯誤地訪問字符數組。你可能想要'c [i * 4 + 0],c [i * 4 + 1],c [i * 4 + 2]' – Basilevs 2014-12-13 07:18:51

回答

1

這將解決您的問題。更改下面的函數定義參數和代碼。

void sortArray(float a[], float b[], char c[6][4], int size){ 
    int i, swap; 
    float temp1, temp2; 
    char temp3[4]; 
    int k = 0; 
    do{ 
     swap = 0; 
     for (i = 0; i < size - 1; i++){//basic sorting for loop 
      if (a[i]>a[i + 1]){ 
       swap = 1; 
       temp1 = a[i]; //temporarily stores value of array cell 
       temp2 = b[i]; 
       for (k=0; k < 4 ; k++) { //Copying the c[i] to temp 
        temp3[k] = c[i][k]; 
       } 
       a[i] = a[i + 1]; //swaps the cells 
       b[i] = b[i + 1]; 
       for (k=0; k < 4 ; k++) { //Copying the c[i+1] to c[i] 
        c[i][k] = c[i+1][k]; 
       } 
       a[i + 1] = temp1;//stores value in swapped cell 
       b[i + 1] = temp2; 
       for (k=0; k< 4 ; k++) { //Copying the temp to c[i+1] 
        c[i+1][k] = (char)temp3[k]; 
       } 
      } 
     } 
    } while (swap); 
} 

您可以在Sorting Multiple Arrays

+0

@Basilevs :: char arr3 [6] [4]類似於二維數組對?它有什麼不妥。你能否也請讓我知道投票的理由? – 2014-12-13 07:28:06

+0

謝謝,像一個魅力 – poiuyt 2014-12-13 07:59:50

+0

@poiuyt,不要忘記upvote並接受 – Basilevs 2014-12-13 08:13:58

0

檢查運行中的例子,我想你基本上是交換字符,而不是交換的字符串。

sortArray函數應該是這樣的:void sortArray(float a[], float b[], char c[][], int size),你需要在sortArray函數中逐個交換char,以便交換整個字符串。

+0

試試'char c [] [4]'?當前聲明不會編譯。 – Basilevs 2014-12-13 07:40:52

0

sortArray(arr1, arr2, *arr3, 6); ///this is where the sorting function is used 

傳遞的arr3的第一元件,其爲char[4]和傳遞衰減到char*

因此,排序上的arr3的第1個要素的元素(這是顯而易見的,從temp3是一個charchar[4])進行:

void sortArray(float a[], float b[], char c[], int size){ 
    int i, swap; 
    float temp1, temp2; 
    char temp3; 
    do{ 
    swap = 0; 
    for (i = 0; i < size - 1; i++){//basic sorting for loop 
     if (a[i]>a[i + 1]){ 
      [...] 
      temp3 = c[i]; 
      [...] 
      c[i] = c[i + 1]; 
      [...] 
      c[i + 1] = temp3; 

這只是(壞)運氣的大小工作三個陣列的尺寸接近arr3的元素。

爲了解決這個問題通arr3(未其第一元素),並正確地用於交換arr3的元件鍵入temporay可變temp3char[4]代替char)。最後選擇正確的方法來「加載」和「保存」temp3

0

最好在這個上使用一個結構。因爲如果你將它作爲一個結構體來運行,arr2和arr3將作爲一個聯合體遵循/附加到arr1,因此更容易編碼。

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

struct data 
{ 
    int arr1; 
    float arr2; 
    char arr3[3]; 
}; 

struct data list[4]; 
struct data temp; 



int main() 
{ 
    list[0].arr1=4534; 
    list[0].arr2=97.5; 
    strcpy(list[0].arr3,"m4W"); 
    list[1].arr1=4554; 
    list[1].arr2=97.4; 
    strcpy(list[1].arr3,"m5W"); 
    list[2].arr1=4574; 
    list[2].arr2=97.6; 
    strcpy(list[2].arr3,"m6W"); 
    list[3].arr1=3934; 
    list[3].arr2=97.1; 
    strcpy(list[3].arr3,"m1W"); 

    //sorting 
    int i=0; 
    int j=0; 
    while(i<3) 
    { 
     j=0; 
     while(j<3-i) 
     { 
      if(list[j].arr1>list[j+1].arr1) 
      { 
       temp=list[j]; 
       list[j]=list[j+1]; 
       list[j+1]=temp; 
      } 
      j++; 
     } 
     i++; 
    } 

    //for printing the struct 
    i=0; 
    while(i<4) 
    { 
     printf("%i %.2f %s\n",list[i].arr1,list[i].arr2,list[i].arr3); 
     i++; 
    } 
    return 0; 
} 
+0

謝謝,我也在考慮使用結構。但是,這個小節選是我正在研究的一個更大的程序的一部分,我已經使用數組完成了大部分工作,因此需要使用結構對其進行修改。如果我有時間的話,我可能會這樣做。 – poiuyt 2014-12-13 09:28:01