排序2d数组c程序

时间:2016-12-11 18:54:16

标签: c arrays sorting

好的我必须对我的2D数组进行排序,用户可以选择要排序的列,也可以按升序或降序排序。所有这些都来自文本文件。到目前为止,这是我的代码:

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

#define NLines 13

int main() {
    FILE *readfile;
    int FirstArray[NLines][7];
    int i, j, k, l, n1, n2, n3, n4, n5, n6, n7, n8, n9;
    char choice;
    if ((readfile = fopen("cubs-batting-ws-more-names.txt", "r")) == NULL) {
        printf("The file failed to open, sorry.");
    }
    printf("Statistics chart of some of the Cubs players from game 7 of the World Series.\n\n");
    printf("Definition of symbols. player (1), games played (2), at-bats (3),\n");
    printf("runs scored(4), hits collected (5), home runs hit (6), runs batted in (7),");
    printf("batting average(8)and on-base-percentage-plus-slugging (9)\n\n");
    do {
        printf(" (1) (2) (3) (4) (5) (6) (7)\n");
        printf("__________________________________________________________________\n");
        for (i = 0; i < NLines; i++) {
            for (j = 0; j < 7; j++) {
                fscanf(readfile, "%d", &FirstArray[i][j]);
                printf("%3d ", FirstArray[i][j]);
            }
            printf("\n");
        }
        printf("\nPlease enter a number (in the parenthesis) \n"
               "for the column you would like to sort, or 0 to exit. ");
        scanf("%d", &k);
        printf("\nWould you like to sort in ascending or descending order? ");
        scanf(" %c", &choice);
        l = k - 1;
        switch (choice) {
        case 'a':
        case 'b':
            for (j = 0; j < 7; j++) {
                for (i = 0; i < NLines; i++) {
                    if (FirstArray[i][l] >= FirstArray[i + 1][l]) {
                        n1 = FirstArray[i][0];
                        FirstArray[i][0] = FirstArray[i + 1][0];
                        FirstArray[i + 1][0] = n1;

                        n2 = FirstArray[i][1];
                        FirstArray[i][1] = FirstArray[i + 1][1];
                        FirstArray[i + 1][1] = n2;

                        n3 = FirstArray[i][2];
                        FirstArray[i][2] = FirstArray[i + 1][2];
                        FirstArray[i + 1][2] = n3;

                        n4 = FirstArray[i][3];
                        FirstArray[i][3] = FirstArray[i + 1][3];
                        FirstArray[i + 1][3] = n4;

                        n5 = FirstArray[i][4];
                        FirstArray[i][4] = FirstArray[i + 1][4];
                        FirstArray[i + 1][4] = n5;

                        n6 = FirstArray[i][5];
                        FirstArray[i][5] = FirstArray[i + 1][5];
                        FirstArray[i + 1][5] = n6;

                        n7 = FirstArray[i][6];
                        FirstArray[i][6] = FirstArray[i + 1][6];
                        FirstArray[i + 1][6] = n7;

                        n8 = FirstArray[i][7];
                        FirstArray[i][7] = FirstArray[i + 1][7];
                        FirstArray[i + 1][7] = n8;
                    }
                }
            }
            break;
        case 'D':
        case 'd':
            for (i = 0; i < NLines; i++) {
                if (FirstArray[i][l] <= FirstArray[i + 1][l]) {
                    n1 = FirstArray[i][0];
                    FirstArray[i][0] = FirstArray[i + 1][0];
                    FirstArray[i + 1][0] = n1;

                    n2 = FirstArray[i][1];
                    FirstArray[i][1] = FirstArray[i + 1][1];
                    FirstArray[i + 1][1] = n2;

                    n3 = FirstArray[i][2];
                    FirstArray[i][2] = FirstArray[i + 1][2];
                    FirstArray[i + 1][2] = n3;

                    n4 = FirstArray[i][3];
                    FirstArray[i][3] = FirstArray[i + 1][3];
                    FirstArray[i + 1][3] = n4;

                    n5 = FirstArray[i][4];
                    FirstArray[i][4] = FirstArray[i + 1][4];
                    FirstArray[i + 1][4] = n5;

                    n6 = FirstArray[i][5];
                    FirstArray[i][5] = FirstArray[i + 1][5];
                    FirstArray[i + 1][5] = n6;

                    n7 = FirstArray[i][6];
                    FirstArray[i][6] = FirstArray[i + 1][6];
                    FirstArray[i + 1][6] = n7;

                    n8 = FirstArray[i][7];
                    FirstArray[i][7] = FirstArray[i + 1][7];
                    FirstArray[i + 1][7] = n8;
                }
            }
            break;
        default:
            printf("invalid choice.\n");
        }
    }

    while (k != 0);
    if (fclose(readfile) == EOF) {
        printf("The file failed to Close!! Sorry!!");
    }
    return 0;
}

当我运行我的代码对第一列进行排序时,它会对第一列和第一行进行排序,但其他所有内容都不会按照预期进行排序。该文件是玩家数据,因此所有行都需要相应保留。当我尝试对其他任何东西进行排序时,它根本不会这样做。我已经尝试了所有我知道的解决方案,但没有任何工作。我很感激你能给我的任何帮助。

我附上截图。 Text File output

1 个答案:

答案 0 :(得分:1)

for (i循环中,当您将元素i<NLines-1[i]进行比较时,条件必须为[i+1]

目前,查看您的变量声明(并假设采用英特尔架构),FirstArray[i+1]的{​​{1}}将使用i==Nlines-1的值作为值,甚至可能会被覆盖交换。然后int i, j, k, l,...不再是i,任何事情都可能发生,也称为未定义行为。

建议:为什么不使用循环交换元素?更简单,更清晰,更易于阅读和维护。

建议:如果他们是平等的,你不需要交换。条件只是i