2014-12-13 42 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