void setup() {
  
  Serial.begin(9600);                                      //инициализация последовательного порта       
  
  while(!Serial);                                          //ожидание открытия порта, здесь вроде нет необходимости, просто как пример while  

  int hw_arr[] = {10, 7, 0, 13, 1, 24, 17, 19, 44, 3};     //инициализация целочисленного массива с элементами 
  int arr_len = sizeof(hw_arr) / sizeof(hw_arr[0]);        //вычисление длины массива (числа элементов)
 
  Serial.println("Содержание массива:");                   //вывод в терминал сообщения с содержимым массива 
  for (int i = 0; i < arr_len; i++) {                      //используется цикл for с приращением ограниченным длиной массива                           
        Serial.print(hw_arr[i]);                           //последовательный вывод элементов массива 
        Serial.print("\t");                                //через табуляцию 
  }                                                           
  Serial.println();                                                     
  Serial.println();                                                              
  
  Serial.print("Минимальное значение среди ");             //после пояснения через табуляцию выводится
  Serial.print("элементов массива:\t\t");                  //возвращаемое целочисленное значение функции fMin 
  Serial.println(fMin(hw_arr, arr_len));                   //минимальное значение среди элементов массива     

  delay(300);                                              //задержка выполнения на 0,3 сек для наглядности    
  
  Serial.print("Максимальное значение среди ");            //после пояснения через табуляцию выводится  
  Serial.print("элементов массива:\t\t");                  //возвращаемое целочисленное значение функции fMax  
  Serial.println(fMax(hw_arr, arr_len));                   //максимальное значение среди элементов массива               

  delay(300);                                              //задержка выполнения на 0,3 сек для наглядности
  
  Serial.print("Среднее арифметическое значение ");        //после пояснения через табуляцию выводится
  Serial.print("элементов массива:\t");                    //возвращаемое вещественное значение функции fAvg
  Serial.println(float(fAvg(hw_arr, arr_len)));            //среднее арифметическое значение элементов массива             

//                                                         //в каждую функции при вызове передается два аргумента:          
//                                                         //hw_arr   - адрес первого элемента массива hw_arr[]  
//                                                         //arr_len  - длина массива hw_arr[] (значение переменной arr_len)

}

void loop() {

}

int fMin(int a[], int ln) {           //инициализация целочисленной функции fMin() с аргументами "a[]" - первый элемент массива и "ln" - длина массива  
  int arr_min = 32767;                //для определения мин. значения присваиваем переменной arr_min максимальное значение для типа integer                       
  for (int i = 0; i < ln; i++) {      //используем цикл for с приращением ограниченным длиной массива     
    arr_min = min(arr_min, a[i]);     //записываем в arr_min возвращаемое значение функции min(), последовательно сравнивая    
  }                                   //сначала максимально возможное значение с первым элементом массива,   
  return arr_min;                     //затем каждый последующий элемент сравнивается с результатом предыдущего сравнения  
}                                     //когда условие перебора становится ложным функция возвращает результат последнего выбора 

int fMax(int a[], int ln) {           //инициализация целочисленной функции fMax() с аргументами "a[]" - первый элемент массива и "ln" - длина массива 
  int arr_max = -32768;               //для определения макс. значения присваиваем переменной arr_max минимальное значение для типа integer 
  for (int i = 0; i < ln; i++) {      //используем цикл for с приращением ограниченным длиной массива
    arr_max = max(arr_max, a[i]);     //записываем в arr_min возвращаемое значение функции max(), последовательно сравнивая
  }                                   //сначала минимально возможное значение с первым элементом массива,
  return arr_max;                     //затем каждый последующий элемент сравнивается с результатом предыдущего сравнения  
}                                     //когда условие перебора становится ложным функция возвращает результат последнего выбора 

float fAvg(int a[], int ln) {         //инициализация вещественной функции fAvg() с аргументами "a[]" - первый элемент массива и "ln" - длина массива   
  int arr_sum = 0;                    //инициализация целочисленной переменной arr_sum для предварительного суммирования элементов массива
  float arr_avg = 0;                  //инициализация вещественной переменной arr_avg для записи среднего арифметического значения
  for (int i = 0; i < ln; i++) {      //для суммирования используем цикл for с приращением ограниченным длиной массива
    arr_sum += a[i];                  //в ходе перебора суммируем каждый последующий элемент массива с имеющимся значением arr_sum
  }                                   //для сокращения используется составной оператор "+=" фактически повторяющий конструкцию вида arr_sum = arr_sum + a[i] 
  arr_avg = float(arr_sum) / ln;      //когда условие перебора становится ложным значение переменной arr_summ представляется вещественным и делится на длину массива
  return arr_avg;                     //функция возвращает полученное значение arr_avg
}                                     //конец сказки