繁体   English   中英

C冒泡排序整数数组-输出问题

[英]C Bubble Sort Integer Array - Output Issue

新手在这里。

对于我的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);
        }
    }
}

我认为错误是您文件中的最后一行没有行尾字符,因此它读取到文件末尾,并且当它打印同一行时,它不会移动到下一行,因此请转到文本的最后一行文件并将endl放在最后一行,或手动为每行打印一个endl。 另一种或更通用的方法是从输入中删除新行,可以像这样在阅读文本时这样做

int len = strlen(states[i]);
if(len>0 && states[i][len-1] == '\n')
{
    states[i][len-1] = '\0';
}

这将删除所有新行,然后您可以在printf中手动打印它们

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM