Найти минимальный элемент массива

Тема в разделе "Микроконтроллеры AVR", создана пользователем Yerabdi, 28 июн 2020.

  1. Yerabdi

    Yerabdi Гик

    • 5.10. Запрещено публиковать исходный код без BB-кода — CODE.
    Добрый день всем, самая простая задача но никак не получается определить самый минимальный элемент массива
    int arr[]={12, 15, 5, 6, 7};
    int arrMinVal,d,c;
    arrMinVal=arr[0];
    for(int i=0; i<sizeof(arr)/sizeof(int); i++)
    {
    if(arr< arrMinVal)
    {
    arrMinVal = arr;
    c=d;//минимальный ячейка массива
    }
    d++;
    }
    }
     
  2. b707

    b707 Гуру

    что такое d и нафига оно нужно. если у вас есть i ?


    если не ошибаюсь, этот код вам дали в этом форуме полгода назад. Что, полгода не хватило разобраться в 10 строчках7
     
    Последнее редактирование: 28 июн 2020
    Vovka и NikitOS нравится это.
  3. Yerabdi

    Yerabdi Гик

    Спасибо решил задачу нужно поставить знак <=
     
  4. Asper Daffy

    Asper Daffy Иксперд

    [​IMG]
     
    vvr, SergeiL и Vitaliy.20 нравится это.
  5. Vitaliy.20

    Vitaliy.20 Нуб

    1. Нужно сравнивать не указатель на начало массива (arr), а текущий элемент массива:
    Код (C++):
    if(arr[i] < arrMinVal)
    2. Переменная «d» не значит ничего, потому что ничем не инициализирована, может быть любым значением в процессе выполнения программы.
    3. Переменаня «с» НЕ содержит минимальное значение (по комментарию)
    Код (C++):
    c=d; //минимальный ячейка массива
    Если бы у «d» было бы корректное значение, то «c» содержала бы индекс элемента с минимальным значнием, но для этого можно использовать обычный индекс «i», как указал @b707.
    4. А в рамках какой задачи необходимо находить минимальный элемент?
     
  6. Yerabdi

    Yerabdi Гик

    Добрый день, значение в ячейках массива постоянно меняется минимальное значение может оказаться в 0 - ячейке массива вот по этому поставил
    знак <=
     
  7. Yerabdi

    Yerabdi Гик

    Код (C++):
    min=map_ar[0];
      ch=0;
      for (int z=0;z<5;z++)
      {
         if (map_ar[z] <= min)
           {
             min=map_ar[z];
             ch=z;  
            }

      }
     
  8. Kakmyc

    Kakmyc Нерд

    Код (C++):

    int my_arr[5]={1,2,3,4,5};

    int min_arr(int arr[]){
        int val=arr[0];
        for(int i=1;i<sizeof(arr)/sizeof(arr[0]);i++){
            if(val<arr[i])val=arr[i];
        }
        return val;
    }

    void setup(){
      Serial.begin(9600)  ;
         int val=min_arr(my_arr);
        Serial.print(val);
    }

    void loop(){    
    }
     
    Последнее редактирование: 30 июн 2020
  9. Kakmyc

    Kakmyc Нерд

    Или так:
    Код (C++):

    int my_arr[5]={1,2,3,4,5};

    int min_arr(int *arr,int size){
        int val=arr[0];
        for(int i=1;i<size;i++){
            if(val<arr[i])val=arr[i];
        }
        return val;
    }

    void setup(){
      Serial.begin(9600)  ;
         int val=min_arr(my_arr,sizeof(my_arr)/sizeof(my_arr[0]));
        Serial.print(val);
    }

    void loop(){    
    }
     
  10. Vitaliy.20

    Vitaliy.20 Нуб

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

    Во-вторых, не играет роли, будет ли в нулевом элементе массива минимальное значение или нет. У Вас всё равно «ch» инициализирован тем самым нулём. Если будет в нулевом элементе минимальный элемент, то при операторе « <= » вы только перезапишете ноль в «ch» тем же нулём. Но зачем?

    Таким образом, изменение оператора сравнения не решает задачу; решение — полное изменение кода.

    Кстати, на вопрос в четвёртом пункте Вы так и не дали ответ.
     
  11. Vitaliy.20

    Vitaliy.20 Нуб

    А Вы точно ищете минимальный элемент?

    Далее: если код оформляется в виде функции, то она может выполняться из разных мест (переиспользоваться), то нужна проверка граничных случаев: указатель (arr) не должен быть null-ом и количество элементов должно быть более нуля, иначе в первом случае будет¹ segfault, во втором — некорректный результат. Как возвращать ошибку — зависит от архитектуры программы:
    1. выставление кода ошибки (в переменной, переданной через ссылку);
    2. структуру, в которой есть места для значения и признак (код) ошибки;
    3. минимально (или максимально) возможное значение (например, INT_MIN (или INT_MAX), определённый в limits.h) или иное значение, которое не может появиться при обычном запуске;
    4. использование exception-ов (зависит от архитектуры — не везде поддерживается и вообще это довольно вредная штука для возврата подобных ошибок).

    Также следует иметь в виду, что в общем случае (надо к этому просто привыкнуть и использовать, не задумываясь, везде) для индексов следует использовать тип size_t, а не int (соответственно, и входящий size должен быть того же типа), иначе возможны странные результаты (в лучшем случае — просто падения с segfault-ом) на больших массивах.

    Это давно проходили при переходе x86⇒x86_64 и в проектах, рассчитанных на запуск на большом количестве архитектур.


    ¹ зависит от архитектуры, где запускается программа, поэтому может быть как segfault так и некорректный результат.