C Bubble Sort Integer Array - Выходная проблема - PullRequest
0 голосов
/ 04 марта 2019

Newbie Here.

Для моего класса программирования на C мне необходимо использовать сортировку по пузырькам для сортировки списка, который читается из входного файла .txt.Каждая строка в файле .txt содержит год, имя и штаты, затронутые ураганом [год] [имя] [штаты].

Пример:

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);
        }
    }
}

1 Ответ

0 голосов
/ 04 марта 2019

Я думаю, что ошибка в том, что ваша последняя строка в вашем файле не имеет символа конца строки, поэтому он читает до конца файла, и когда он печатает ту же строку, он не перемещается на следующую строку, поэтому либо переходите на последнюю строкув текстовом файле и поместите endl в последнюю строку или напечатайте endl вручную для каждой строки.Другим или более общим способом было бы удалить новую строку из вашего ввода, что можно сделать следующим образом, при чтении текста сделайте это

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

, это удалит все новые строки, а затем вы сможете распечатать их вручную вPrintf

...