Что-то не так с тем, как я передаю аргументы указателя? - PullRequest
0 голосов
/ 19 июня 2019

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

Это часть задания, где я должен использовать указатели.

Я получил комментарий от моего инструктора относительно фрагмента кода для функции returnfunc, где используются указатели.

Комментарии гласят: «Какой ввод / вывод есть у функции? Единственное, что приходит, это судейские очки!»

Я бы попросил дальнейших разъяснений, но преподаватель недоступен в течение следующих 1-2 дней.

Так что вместо ожидания я надеялся, что кто-нибудь сможет взглянуть и, возможно, определить, что имеется в виду?

Подсвеченные части кода показаны ниже:

//function declaration
void returnfunc(float *low, float *average, float *high,  float array[],int judges);

//calling function in the main function
returnfunc(&low, &average, &high, pointArray,judges);


//code for returnfunc function
void returnfunc(float *low, float *average, float *high, float pointArray[],int judges){

    float small =pointArray[0];
    float large =pointArray[0];
    float total;

    for(int i =0;i<judges;i++){
        if(small>pointArray[i]){
            small = pointArray[i];
        }
        if(large<pointArray[i]){
            large = pointArray[i];
        }
    }


    for(int i = 0;i<judges;i++){
        total += pointArray[i];
    }

    *average = (total-(large+small))/(judges-2); //average without largest and smallest value
    *high=large;
    *low=small;

}

judges - количество судей, выбранных пользователем.

pointArray - массив с точками, заданными каждым судьей.

Моя интерпретация кода заключается в том, что входные данные являются адресами low, high и average, а также pointArray и judges.

Выходными данными будут обновленные переменные average, high и low

Вы бы сказали, что это правильно?

Ответы [ 2 ]

3 голосов
/ 19 июня 2019

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

void returnfunc(float *low, float *average, float *high, float pointArray[],int judges)
{
    float small =pointArray[0];
    float large =pointArray[0];
    float total;

    for(int i =0;i<judges;i++){
        if(small>pointArray[i]){
            small = pointArray[i];
        }
        if(large<pointArray[i]){
            large = pointArray[i];
        }
    }


    for(int i = 0;i<judges;i++){
        total += pointArray[i];
    }

    *average = (total-(large+small))/(judges-2); //average without largest and smallest value
    *high=large;
    *low=small;
}

Один придира: почему вы повторяете дважды по pointArray с двумя циклами for, когда вы можете делать все в одном цикле?

Еще один придурок: хотя small>pointArray[i] означает то же самое, что и pointArray[i] < small, я думаю, что последний лучше передает смысл кода.

И еще одна ошибка: вы не устанавливаетеtotal до нуля, прежде чем начать добавлять вещи к нему.Вы также можете установить total на pointArray[0] в начале, а затем начать цикл с единицы.

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

Конструктор, по-видимому, отмечает, что неясно, что является вводом и выводом функции. Это можно улучшить следующими способами:

  • Широко распространено соглашение, что в объявлении функции сначала указываются входные параметры, а затем выходные параметры. В вашем примере этот порядок обратный.
  • При использовании указателей в качестве параметров они могут быть как входным параметром типа указателя (или массива), так и выходным параметром. Поскольку синтаксис C не может сделать это различение однозначно, другой хорошей практикой является добавление комментариев над объявлением функции, объясняющих роль и назначение всех параметров.

Дэвид Шварц отвечает, что, по его мнению, ваш инструктор мог ожидать нескольких функций: одна для средней, одна для низкой и одна для высокой. С точки зрения производительности это не кажется привлекательным, поскольку это будет означать, что все эти функции должны выполнять итерацию по массиву точек, в то время как одна функция может делать это за одну итерацию. Как уже указывалось другими: ваша функция может быть улучшена путем объединения двух циклов for в один.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...