Моя программа многомерного массива заполнена неправильно, что мне не хватает? - PullRequest
0 голосов
/ 15 апреля 2020

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

Работает, в основном , Но у меня проблема с программой, которая выводит правильное количество дюймов и второй по величине снегопад.

этот файл .txt содержит это внутри него

2017   180.00
2016   176.50
2015   181.50
2014   208.75
2013   225.75
2012   132.00
2011   178.50
2010    150.50
2009    217.00
2008    185.25
2007    162.75
2006    219.50
2005    164.71
2004    232.00
2003    228.00
2002    254.00
2001    303.60
2000    155.00
1999    231.00
1998    131.50
1997    253.10
1996    328.20
1995    175.90
1994    185.30
1993    159.60
1992    166.20
1991    165.80

//Block comment with name, date, program description

#include <stdlib.h>
#include <stdio.h>

// include other header files that you need

#define MAX_SIZE 100 //can go back 100 years if necessary
#define t 1
#define num 20

int ReadFile (int data1[], double data2[]);
int HighestSnow(double data[], int size);
int NextHighestSnow (double data[], int size, int Highest);
double Range (double data[], int size);

int main (void)

{
    int Year[MAX_SIZE];
    double Snow[MAX_SIZE],SnowfallRange;
    int FileLength, IndexHighest, IndexNextHighest;
    int i;

//Describe code
//Read file using function

    FileLength = ReadFile(Year,Snow);

    for(i = 0; i < FileLength; i++)
        printf("The year for the highest snowfall is: [%d] at %lg\n", Year[IndexHighest], Snow[IndexHighest]);

//Print out data in two columns with first being year and second
//being snowfall in inches

    IndexHighest = HighestSnow(Snow,FileLength);

        printf("The year for the highest snowfall is: [%d] at %lg\n", Year[IndexHighest], Snow[IndexHighest]);

//Print out the year and amount of the highest snowfall

    IndexNextHighest = NextHighestSnow(Snow, FileLength, IndexHighest);

        printf("The year for the second highest snowfall is: [%d] at %lg\n", Year[IndexNextHighest], Snow[IndexNextHighest]);

//Print out the year and amount of the next highest snowfall

    SnowfallRange = Range(Snow,FileLength);

        printf("The snow range is: %lg\n", SnowfallRange);

//Print out the range of snowfall (Max-Min) in inches.

    return 0;

}

//Code for part 1 goes here, include ALL error checks.
int ReadFile (int data1[], double data2[])
{
    FILE *f; //Step 1: Declaring a file pointer

    f = fopen("snowfall.txt", "r"); //Step 2: opening a file

    if(f == NULL) //Step 3: checking to see if the file exists
    {
        printf("File does not exit\n");
        exit(1);
    }

    int i;

    for(i = 0; fscanf(f,"%d %lf ", &data1[i], &data2[i]) == 2; i++); //Step 4: read the values

    fclose(f);

    return i;
}

// Code for part 2 goes here
int HighestSnow(double data[], int size)
{
    int i, index;
    double max = data [0];

    for (i = 1; i < size; i++)
    {
        if (data[i] > max)
        {
            max = data[i];
            index = i;
        }
    }
    return index;
}


/* Code for part 3 goes here*/
int NextHighestSnow(double data[], int size, int Highest)
{
    int i;
    double secmax = -1;
    int arrayindex;

        for(i = 0; i > size; i++)
    {
        if(data[i] > secmax && data[i] < Highest) {
            secmax = data[i];
            arrayindex = i;
        }

    }
    return arrayindex;
}

/* Code for part 4 goes here*/

double Range (double data[], int size)
{
    double maxval = data[HighestSnow(data, size)];
    double min = data[0];

    int i;

    for(i = 1; i < size; i++)
    {
        if(min > data[i])
            min = data[i];
    }

    return maxval - min;
}



Проблема: Общее количество снегопадов (в дюймах) в штате Мичиган за последние 20 лет указано в файле «snowfall.txt». Файл отформатирован так, что первый столбец - это год, а второй - снегопад в дюймах для этого года. Напишите программу для получения следующей информации: 1. В каком году выпало наибольшее количество снегопадов и сколько выпало в этом году (в дюймах)? 2. В каком году было 2-е место по количеству снегопадов и сколько выпало в этом году (в дюймах)? 3. Каков диапазон общего количества снегопадов за последние 20 лет? ВСЕ операторы printf ДОЛЖНЫ быть в main (), если не указано иное. ПРИМЕЧАНИЕ: помните, что вы можете проверить свои результаты с EXCEL. Следуйте этим подробным инструкциям: 1. Сначала прочтите этот документ полностью. 2. Включите обычный (подробный) блок комментариев, включающий название программы, автора, дату, входные данные, выходные данные и описание, а также директивы препроцессора. 3. Схема (скелет-код) исходного кода показана ниже, и вам НЕОБХОДИМО следовать этой схеме. Вы можете написать другие вспомогательные функции, но вы ДОЛЖНЫ иметь как минимум 4 функции. Вставьте соответствующие операторы printf, где это необходимо, чтобы получить желаемый результат. Схема состоит из четырех разделов, где вы должны ввести свой код и завершить программу. а. Часть 1: Вы должны написать функцию ReadFile, чтобы открыть «snowfall.txt» для ввода и прочитать данные в этом файле в 2 массива. Не забудьте проверить, существует ли файл и не читается ли он после EOF. Сообщение об ошибке, если файл не существует, может быть в функции. Функция вернет количество точек данных в файле. ПРИМЕЧАНИЕ. Помните, что данные приведены в парах: первое число - год, а второе - количество снега в дюймах. Распечатайте данные в двух столбцах из main (). б. Часть 2. Вам необходимо написать функцию HighestSnow, которая принимает массив сумм снегопада, и параметр с именем size, который указывает размер массива. Эта функция возвращает целое число, указывающее номер индекса массива, который соответствует наибольшему снегопаду. Распечатайте год и количество наибольшего снегопада от main (). c. Часть 3: Вам необходимо написать вызов функции NextHighestSnow, который принимает массив сумм снегопада, параметр с именем size, который указывает размер массива, и целое число с именем Highest, указывающее индекс, соответствующий наибольшему снегопаду. Эта функция возвращает целое число, указывающее номер индекса массива, который соответствует 2-му наибольшему снегопаду. Распечатайте год и количество второго по величине снегопада от main (). д. Часть 4. Вам необходимо написать вызов функции Range, которая принимает массив сумм снегопада, и параметр с именем size, который указывает размер массива. Эта функция возвращает разницу между максимальным и минимальным снегопадами за последние 20 лет. Помните, что вы можете вызвать функцию HighestSnow из функции Range. Распечатайте диапазон снегопада в дюймах от основного (). е. Часть 5 (Дополнительные кредиты): Сделайте ваше имя файла вводимым пользователем, т.е. попросите пользователя ввести имя файла ввода.

OUTLINE OF THE SOURCE CODE:
//Block comment with name, date, program description
#include <stdio.h>
// include other header files that you need
#define MAX_SIZE 100 //can go back 100 years if necessary
int ReadFile (int data1[], double data2[]);
int HighestSnow (double data[], int size);
int NextHighestSnow (double data[], int size, int Highest);
double Range (double data[], int size);
int main (void) {
int Year[MAX_SIZE];
double Snow[MAX_SIZE],SnowfallRange;
int FileLength, IndexHighest, IndexNextHighest;
//Describe code
//Read file using function
FileLength = ReadFile(Year,Snow);
//Print out data in two columns with first being year and second
//being snowfall in inches
IndexHighest = HighestSnow(Snow,FileLength);
//Print out the year and amount of the highest snowfall
IndexNextHighest = NextHighestSnow(Snow, FileLength,IndexHighest);
//Print out the year and amount of the next highest snowfall
SnowfallRange = Range(Snow,FileLength);
//Print out the range of snowfall (Max-Min) in inches.
return 0;
}
//Code for part 1 goes here, include ALL error checks.
// Code for part 2 goes here
// Code for part 3 goes here
// Code for part 4 goes here

1 Ответ

0 голосов
/ 15 апреля 2020

Я прошел и указал на найденные ошибки.

// Missing 3rd parameter
int NextHighestSnow (double data[], int size, int Highest);
// There is no 3rd parameter to range
double Range (double data[], int size);

int main (void)

{
    // This should not be 2d
    int Year[MAX_SIZE];
    ...
    // Don't use %d to print a double. Use %lf, %le, %lg
    printf("The year for the highest snowfall is: [%d] at %lg\n", Year[IndexHighest], Snow[IndexHighest]);
    ....
}

// Changed for 1d array
// Also, this should take a 3rd parameter for size....
int ReadFile (int data1[], double data2[])
{
    ....
    // Changed test to == 2. fscanf returns # of items successfully scanned
    // or EOF 
    for(i = 0; fscanf(f,"%d %lf ", &data1[i], &data2[i]) == 2; i++);
    ....
}

int HighestSnow(double data[], int size)
{
    ...
    double max = data [0];
    // Since you set max = data[0], loop can start at 1
    for (i = 1; i < size; i++)
    ....
}
// Added 3rd param
int NextHighestSnow(double data[], int size, int Highest)
{
    ...
    // Why search for min?

    // Can't initialize to data[0] in case data[0] is max
    // Use -1 since can't have negative snowfall
    double secmax = -1;  
    int arrayindex;

    for(i = 0; i > size; i++)
    {
        if(data[i] > secmax && data[i] < Highest) {
            secmax = data[i];
            arrayindex = i;
        }
    }

    return arrayindex;
}


double Range (double data[], int size)
{
    // Already have code to find max
    double maxval = data[HighestSnow(data, size)];
    double min = data[0];

    int i;

    for(i = 1; i < size; i++)
    {
        if(min > data[i])
            min = data[i];
    }

    return maxval - min;
}
...