【发布时间】:2019-03-04 01:45:04
【问题描述】:
这里是新手。
对于我的 C 编程课程,我需要使用冒泡排序来对从输入 .txt 文件中读取的列表进行排序。 .txt 文件中的每一行都有年份、名称和受飓风影响的州 [year] [name] [states]。
例如:
1999 Floyd NC
2003 Isabel NC, VA
2004 Charley FL, SC, NC
2004 Frances FL
...etc.
程序需要按年份对列表进行排序,同时保持所有数据行正确(将相关数组元素保持在一起)。我的整数数组冒泡排序工作正常,除了一个问题 - 一行数据位于列表的一侧。这是此问题的示例输出:
1960 Donna FL, NC
1969 Camille MS 1972 Agnes FL
1983 Alicia TX
2004 Charley FL, SC, NC
1972 Agnes FL 行几乎是正确的,但由于某种原因打印到侧面而不是前一行的正下方。
代码:
#include <stdio.h>
#include <string.h>
#define MAX_HURCS 30
int main() {
FILE *hurricaneData;
int year[MAX_HURCS];
char name[MAX_HURCS][50];
char states[MAX_HURCS][50];
int i = 0, j;
int count = 0;
int sort;
int tempYear;
char tempName[50];
char tempStates[50];
if ((hurricaneData = fopen("hurricanes2.txt", "r")) == NULL) {
printf("Error: Could not open file");
}
while ((fscanf(hurricaneData, "%d %s", &year[i], &name[i]) != EOF)
&& (fgets(states[i], 50, hurricaneData) != NULL)) {
i++;
count++;
}
for (i = 0; i < count - 1; i++) {
for (j = 0; j < count - 1 - i; j++) {
if (year[j] > year[j + 1]) {
tempYear = year[j];
year[j] = year[j+1];
year[j+1] = tempYear;
strcpy(tempName, name[j]);
strcpy(name[j], name[j+1]);
strcpy(name[j+1], tempName);
strcpy(tempStates, states[j]);
strcpy(states[j], states[j+1]);
strcpy(states[j+1], tempStates);
}
}
}
for (i = 0; i < count; i++) {
printf(" \t%d\t%s\t%s ", year[i], name[i], states[i]);
}
return 0;
}
我也尝试过这个排序算法,但我遇到了同样的问题:
for (i = 0; i < count; i++) {
for (j = 0; j < count; j++) {
if (year[j] > year[i]) {
tempYear = year[i];
year[i] = year[j];
year[j] = tempYear;
strcpy(tempName, name[i]);
strcpy(name[i], name[j]);
strcpy(name[j], tempName);
strcpy(tempStates, states[i]);
strcpy(states[i], states[j]);
strcpy(states[j], tempStates);
}
}
}
【问题讨论】:
-
尝试在 printf printf(" \t%d\t%s\t%s\n", year[i], name[i], states[i]) 中手动给出 \n ;
-
有趣。当我这样做时,输出列表会按顺序打印出来,该数据行位于另一行下方,只是没有换行符。所以它在技术上是正确的,但我相信最后一步仍然存在问题。
-
This??,我认为错误是文件中的最后一行没有行尾字符,因此它会读取到文件末尾,并且当它打印同一行时它不会移动到下一行,所以要么转到文本文件的最后一行并在最后一行放置一个 endl,要么为每一行手动打印一个 endl,而你之前的评论我没有看到新的输出
-
@TomKarzes fgets 函数无论如何都会从文本文件中读取新行,因此在每一行之后添加一个额外的新行是没有意义的,问题是文本文件中的最后一行没有新的行。
-
@Anil 是的,当我仔细观察时,我意识到了这一点。排序时携带换行符似乎很奇怪。通常它们会在读取记录时被剥离,因为它们不是数据的一部分,然后在输出结果时插入。这是解决此问题的正确方法。
标签: c arrays sorting integer bubble-sort