Как извлечь строку из массива строк и поместить ее в собственный массив? - PullRequest
0 голосов
/ 24 марта 2020

Я пытаюсь получить одномерный массив, равный указанной строке c из двумерного массива строк. Я приложил свой код и не могу понять, как правильно использовать strncpy или strcpy. В моем примере я пытаюсь получить в ColdestLake название озера, средняя годовая температура которого самая холодная. Я пытаюсь извлечь это из массива названий озер, Lakes[6][12]. Исходя из математики, это должно быть Озеро Верхнее, поэтому я хочу, чтобы значение «Улучшенное» стало значением ColdestLake. Я пытаюсь выполнить ту же задачу с WarmestLake. Я уже написал правильный код для отображения температуры. Я приложил фотографию возвращенного значения (для этого кода c)

Here

Я ценю время, так как я новичок в C программирование.

Обновление: Спасибо всем за помощь! Я новичок в C (учусь в университете), и, к сожалению, мы узнали, что (! Feof (файл)) нужно использовать, и это то, что мне нужно было использовать для этого конкретного проекта. Я обновил свой код, чтобы гарантировать, что значения не являются неопределенными, и определил 365 как Дни. Пожалуйста, дайте мне знать, если есть что-то еще, что я могу улучшить. Спасибо!

Код ниже:

#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <float.h>
#define Days 365

int main ()
{
    //Variable Declaration
    char Lakes[6][12] = {"Superior", "Michigan", "Huron", "Erie", "Ontario", "St. Claire"};
    char ColdestLake[12] = {""};
    char WarmestLake[12] = {""};
    char AboveAverageLakes[6][12] = {"","","","","",""};
    char BelowAverageLakes[6][12] = {"","","","","",""};
    double Sums[7] = {0,0,0,0,0,0,0};
    double Averages[7] = {0,0,0,0,0,0,0};
    double Superior[Days];
    double Michigan[Days];
    double Huron[Days];
    double Erie[Days];
    double Ontario[Days];
    double St_Claire[Days];
    double ColdestTemperature;
    double WarmestTemperature;
    FILE *input;
    int i;
    int j;
    int AboveAverageCount = 0;
    int BelowAverageCount = 0;

    //Initializing The Input Data File
    input = fopen("Lake Data.txt", "r");

    //Assigning Data From File To Array's Of Each Lake
    while (!feof(input))
    {
        for (i = 0; i < 365; i++)
        {
            fscanf(input, "%*lf %*lf %lf %lf %lf %lf %lf %lf", &Superior[i], &Michigan[i], &Huron[i], &Erie[i], &Ontario[i], &St_Claire[i]);
        }
    }

    //Getting Sum Of Each Lake's Temperature
    for (i = 0; i < Days; i++)
    {
        Sums[0] += Superior[i];
        Sums[1] += Michigan[i];
        Sums[2] += Huron[i];
        Sums[3] += Erie[i];
        Sums[4] += Ontario[i];
        Sums[5] += St_Claire[i];

        for (j = 0; j < 6; j++)
        {
            Sums[6] += Sums[j];
        }
    }

    //Getting Average Of Each Lake's Temperature
    Averages[0] = Sums[0]/Days;
    Averages[1] = Sums[1]/Days;
    Averages[2] = Sums[2]/Days;
    Averages[3] = Sums[3]/Days;
    Averages[4] = Sums[4]/Days;
    Averages[5] = Sums[5]/Days;

    //Getting Average Of All Lakes
    for (i = 0; i < 6; i++)
    {
        Averages[6] += Averages[i]/6;
    }

    //Printing Average Of Each Lake's Temperature
    for (i = 0; i < 6; i++)
    {
        printf("The Average For Lake %s Was %.2lf Degrees Celsius.\n",Lakes[i], Averages[i]);
    }


    //Printing The Average Of All The Lakes
    printf("\nThe Average Of All The Lakes Was %.2lf Degrees Celsius.\n", Averages[6]);

    //Calculating Warmest And Coldest Lakes
    ColdestTemperature = DBL_MAX;
    WarmestTemperature = DBL_MIN;

    for (i = 0; i < 6; i++)
    {
        //Getting Coldest Temperature & Lake
        if (Averages[i] < ColdestTemperature)
        {
            ColdestTemperature = Averages[i];
            strcpy(ColdestLake, Lakes[i]);
        }

        //Getting Warmest Temperature & Lake
        if (Averages[i] > WarmestTemperature)
        {
            WarmestTemperature = Averages[i];
            strncpy(WarmestLake, Lakes[i], 12);
        }

        //Counting Lakes Above Average Temperature
        if (Averages[i] > Averages[6])
        {
            AboveAverageCount++;
            strncpy(AboveAverageLakes[i], Lakes[i], 12);
        }

        //Counting Lakes Below Average Temperature
        if (Averages[i] < Averages[6])
        {
            BelowAverageCount++;
            strncpy(BelowAverageLakes[i], Lakes[i], 12);
        }
    }

    //Printing Warmest And Coldest Lakes
    printf("\nThe Coldest Lake Was %s With A Temperature Of %.2lf Degrees Celsius.\n", ColdestLake, ColdestTemperature);
    printf("The Warmest Lake Was %s With A Temperature Of %.2lf Degrees Celsius.\n", WarmestLake, WarmestTemperature);

    //Printing How Many Lakes Are Below Average Temperature
    printf("\nThere Are %d Lakes Below The Average Of All The Lakes. They Are:\n", BelowAverageCount);
    for (i = 0; i < 6; i++)
    {
        if (strcmp(BelowAverageLakes[i],"") == 0)
        {
            continue;
        }
        printf("Lake %s\n", BelowAverageLakes[i]);
    }

    //Printing How Many Lakes Are Above Average Temperature
    printf("\nThere Are %d Lakes Above The Average Of All The Lakes. They Are:\n", AboveAverageCount);
    for (i = 0; i < 6; i++)
    {
        if (strcmp(AboveAverageLakes[i],"") == 0)
        {
            continue;
        }
        printf("Lake %s\n", AboveAverageLakes[i]);
    }
    return(0);
}

Ответы [ 3 ]

1 голос
/ 24 марта 2020

относительно:

Sums[0] += Superior[i];

и аналогичных операторов ...

Массив Sums[] не был инициализирован, поэтому он использует неинициализированные значения в качестве «источника» в математическом операторе. Это приводит к неопределенному поведению.

Предложить изменение:

double Sums[7],...

на:

double Sums[7] = {0}, ...

OT: для простоты восприятия и понимания: следуйте аксиоме: только один оператор на строку и (самое большее) одно объявление переменной на оператор.

в опубликованном коде содержится «magi c» число 365. «числа magi c» являются числами без оснований. числа 'magi c' делают код более сложным для понимания, отладки и т. д. c. Предложите использовать оператор #define или enum, чтобы присвоить этому номеру 'magi c' значащее имя, а затем использовать это значимое имя во всем коде.

Пожалуйста, прочитайте: почему пока (! feof (файл)) всегда неверен

относительно:

Averages[6] += Averages[i]/6;

При этом используется источник Averages[6] Однако это значение никогда не инициализируется, что приводит к неопределенному поведению. Предложите изменить:

 ..., Averages[7],

на:

 ..., Averages[7] = {0},

относительно:

ColdestTemperature = Averages[0];
WarmestTemperature = Averages[0];

for (i = 0; i < 6; i++)
{
    if (Averages[i] < ColdestTemperature)
    {
        ColdestTemperature = Averages[i];
        strcpy(ColdestLake, Lakes[i]);
    }

Выше никогда не будет обновлять ColdestLake с "Superior", потому что средние значения будут никогда не будет меньше начального значения ColdestTemperature Аналогичные соображения для расчета WarmestTemperature.

Предложить заменить:

ColdestTemperature = Averages[0];
WarmestTemperature = Averages[0];

на:

ColdestTemperature = DBL_MAX;
WarmestTemperature = DBL_MIN;

как определено в заголовочном файле: limits.h

0 голосов
/ 24 марта 2020

Как предполагает Бармар, coldestlake не соответствует действительности, потому что вы скопировали значение first (которое оказывается самым холодным), поэтому причина if никогда не достигается, за исключением копирования строки в первый, Вы можете сделать что-то вроде этого.

#define INF 0x3f3f3f3f
    ...Your code...
    ColdestTemperature = INF;
    WarmestTemperature = -INF;
    for (i = 0; i < 6; i++)
    {
        if (Averages[i] < ColdestTemperature)
        {
            ColdestTemperature = Averages[i];
            strcpy(ColdestLake, Lakes[i]);
        }

        if (Averages[i] > WarmestTemperature)
        {
            WarmestTemperature = Averages[i];
            strcpy(WarmestLake, Lakes[i]);
        }
    }
0 голосов
/ 24 марта 2020

Если самое холодное озеро - Озеро Верхнее, тест if (Averages[i] < ColdestTemperature) не будет верным, потому что вы инициализировали ColdestTemperature до Averages[0]. Простое решение - также инициализировать ColdestLake до Lakes[0]. Сделайте то же самое для WarmestLake.

. И как только вы это сделаете, вам не нужно проверять Averages[0] в l oop, чтобы вы могли запустить l oop в i = 1 .

    //Calculating Warmest And Coldest Lakes
    ColdestTemperature = Averages[0];
    strcpy(ColdestLake, Lakes[0]);
    WarmestTemperature = Averages[0];
    strcpy(WarmestLake, Lakes[0]);

    for (i = 1; i < 6; i++)
    {
        if (Averages[i] < ColdestTemperature)
        {
            ColdestTemperature = Averages[i];
            strcpy(ColdestLake, Lakes[i]);
        }

        if (Averages[i] > WarmestTemperature)
        {
            WarmestTemperature = Averages[i];
            strcpy(WarmestLake, Lakes[i]);
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...