Добрый день всем, самая простая задача но никак не получается определить самый минимальный элемент массива 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++; } }
что такое d и нафига оно нужно. если у вас есть i ? если не ошибаюсь, этот код вам дали в этом форуме полгода назад. Что, полгода не хватило разобраться в 10 строчках7
1. Нужно сравнивать не указатель на начало массива (arr), а текущий элемент массива: Код (C++): if(arr[i] < arrMinVal) 2. Переменная «d» не значит ничего, потому что ничем не инициализирована, может быть любым значением в процессе выполнения программы. 3. Переменаня «с» НЕ содержит минимальное значение (по комментарию) Код (C++): c=d; //минимальный ячейка массива Если бы у «d» было бы корректное значение, то «c» содержала бы индекс элемента с минимальным значнием, но для этого можно использовать обычный индекс «i», как указал @b707. 4. А в рамках какой задачи необходимо находить минимальный элемент?
Добрый день, значение в ячейках массива постоянно меняется минимальное значение может оказаться в 0 - ячейке массива вот по этому поставил знак <=
Код (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; } }
Код (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(){ }
Или так: Код (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(){ }
Во-первых, тут гораздо больше изменений, чем в первоначальном варианте кода, а не только изменение оператора сравнения. Во-вторых, не играет роли, будет ли в нулевом элементе массива минимальное значение или нет. У Вас всё равно «ch» инициализирован тем самым нулём. Если будет в нулевом элементе минимальный элемент, то при операторе « <= » вы только перезапишете ноль в «ch» тем же нулём. Но зачем? Таким образом, изменение оператора сравнения не решает задачу; решение — полное изменение кода. Кстати, на вопрос в четвёртом пункте Вы так и не дали ответ.
А Вы точно ищете минимальный элемент? Далее: если код оформляется в виде функции, то она может выполняться из разных мест (переиспользоваться), то нужна проверка граничных случаев: указатель (arr) не должен быть null-ом и количество элементов должно быть более нуля, иначе в первом случае будет¹ segfault, во втором — некорректный результат. Как возвращать ошибку — зависит от архитектуры программы: 1. выставление кода ошибки (в переменной, переданной через ссылку); 2. структуру, в которой есть места для значения и признак (код) ошибки; 3. минимально (или максимально) возможное значение (например, INT_MIN (или INT_MAX), определённый в limits.h) или иное значение, которое не может появиться при обычном запуске; 4. использование exception-ов (зависит от архитектуры — не везде поддерживается и вообще это довольно вредная штука для возврата подобных ошибок). Также следует иметь в виду, что в общем случае (надо к этому просто привыкнуть и использовать, не задумываясь, везде) для индексов следует использовать тип size_t, а не int (соответственно, и входящий size должен быть того же типа), иначе возможны странные результаты (в лучшем случае — просто падения с segfault-ом) на больших массивах. Это давно проходили при переходе x86⇒x86_64 и в проектах, рассчитанных на запуск на большом количестве архитектур. — ¹ зависит от архитектуры, где запускается программа, поэтому может быть как segfault так и некорректный результат.