好的我必须对我的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;
}
当我运行我的代码对第一列进行排序时,它会对第一列和第一行进行排序,但其他所有内容都不会按照预期进行排序。该文件是玩家数据,因此所有行都需要相应保留。当我尝试对其他任何东西进行排序时,它根本不会这样做。我已经尝试了所有我知道的解决方案,但没有任何工作。我很感激你能给我的任何帮助。
答案 0 :(得分:1)
在for (i
循环中,当您将元素i<NLines-1
与[i]
进行比较时,条件必须为[i+1]
。
目前,查看您的变量声明(并假设采用英特尔架构),FirstArray[i+1]
的{{1}}将使用i==Nlines-1
的值作为值,甚至可能会被覆盖交换。然后int i, j, k, l,...
不再是i
,任何事情都可能发生,也称为未定义行为。
建议:为什么不使用循环交换元素?更简单,更清晰,更易于阅读和维护。
建议:如果他们是平等的,你不需要交换。条件只是i
。