Как вывести минимум значения из данных? - PullRequest
0 голосов
/ 21 июня 2019

/ * Test Average Problem Revision # 1: написать программу, которая читает в том же файл, как указано выше, но также рассчитывает минимальные и максимальные результаты тестов, как а также, какой номер теста оба из них были. (Например, если результаты тестов в файле было 70, 85, 99, 67 и 83, тогда минимальный балл теста был 67 на тесте № 4, а максимальный балл теста был 99 на тесте № 3.) Попросите вашу программу распечатать это информация на экран. * /

#include <stdio.h>

int main(int argc, char const *argv[])
{   

    int num, start;

    int num_test, score, max=0, min=0, maxi, mini;

    FILE*ifp, *ofp;

    ifp = fopen("test.in.txt", "r");

    ofp = fopen("test.max.txt", "w");

    fscanf(ifp,"%d", &num);

    for ( start = 1; start <= num; start++)
    {
        fscanf(ifp,"%d %d", &num_test, &score);

        fprintf(ofp,"Test: %d    score: %d  \n", num_test, score);


        if (score > max)

        {
            max = score;  

            maxi = num_test;

        }


        if (score < min)

        {
            min = score;

            mini = num_test;
        }

    }
        fprintf(ofp,"\n\nMax = Test:%d Score: %d\n",maxi, max);

        fprintf(ofp,"\nMin = Test:%d Score: %d\n",mini, min);

    fclose(ifp);

    fclose(ofp);

    return 0;

}

Ответы [ 2 ]

1 голос
/ 21 июня 2019

Это проблема инициализации. Вам нужно инициализировать max с наименьшим возможным значением в соответствии с алгоритмом (по чистой вероятности, что вы это сделали) и min с максимально возможным значением (вы не смогли это сделать).

Безопасная ставка для инициализации min идентифицирует максимально возможное значение для соответствующего типа данных.

Для int это значение может быть 2 ^ 32-1 (если int представлено в 32 битах).

Если вы не хотите обрабатывать огромные числа, вам следует проанализировать свою проблему, чтобы понять максимально возможное значение. Это более опасно, потому что номер проблемы может измениться, и тогда алгоритм может потерпеть неудачу.


Альтернативой может быть поиск значений в 2 этапа - это, вероятно, займет больше времени, но все еще будет безопасным.

Шаг 1: найдите максимум.

Шаг 2: инициализируйте min = max, а затем найдите минимум.

0 голосов
/ 21 июня 2019

Алгоритм обязывает инициализировать min, max крайними противоположными значениями int, а не 0 - что находится в середине диапазона int.

Полезные пределы в limits.h. @ Pascal Cuoq

// max=0, min=0
max=INT_MIN, min=INT_MAX

Примечание. Код правильно выполняет if, а не else if, так как последним будет отказано, если все значения теста одинаковы.

if (score < min)
// else if (score < min)

Надежный код проверяет возвращаемое значение fscanf(), чтобы гарантировать успешное чтение.(2 места)

// fscanf(ifp,"%d %d", &num_test, &score);
if (fscanf(ifp,"%d %d", &num_test, &score) != 2) {
  fprintf(stderr, "Unexpected input\n");
  return EXIT_FAILURE; 
}

Также проверьте fopen() успех (2 места)

ifp = fopen("test.in.txt", "r");
if (ifp == NULL) {
  fprintf(stderr, "Unable to open read file\n");
  return EXIT_FAILURE; 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...