Как найти из массива минимальное значение исключая ноль

Ivanna13
Offline
Зарегистрирован: 28.01.2021

Добрый день.

Нужна помощь. Подскажите, не могу сделать сортировку- минимум.

Постоянно вылазит ноль, а мне надо все кроме нуля.

 total =0;
  // put your main code here, to run repeatedly:
for (i = 0; i < 10; i = i + 1)  {
  //  total =0;
      if ( i==0 )  {
   max_v = x[0] ;
   max_i = 0;
   min_v = x[0] ;
   min_i = 0;
      }
      if ( x[i] > max_v ) {
   max_v = x[i];
   max_i = i;
      }
      if ( x[i] < min_v && x[i]>0) {  ///ПРОВЕРИТЬ НА НОЛЬ!!!!!!!!!!!!!!!
   min_v = x[i];
   min_i = i;
      }
      total += x[ i ];
}

Буду благодарна за помощь.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Ivanna13 пишет:

Буду благодарна за помощь.

Лучше учебники читай тщательнее. 

b707
Offline
Зарегистрирован: 26.05.2017

Ivanna13- вставьте код правильно и ЦЕЛИКОМ. Где, к примеру, описание массива?

Kakmyc
Offline
Зарегистрирован: 15.01.2018
int myArr[10];
int maxValue=0x7fff;
for(int i=0;i<10;i++){
if(myArr[i]!=0&&maxValue>myArr[i]){
maxValue=myArr[i];
}
}

 

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Для проверки на ноль можно использовать "неравно"->  "!="

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

А можно и так:

if (myArr[i] && (maxValue > myArr[i]))

 

b707
Offline
Зарегистрирован: 26.05.2017

Коллеги, вы не учитываете, что задачка "найти минимальный элемент массива, не равный нулю" - может и не иметь решений

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

b707 пишет:

Коллеги, вы не учитываете, что задачка "найти минимальный элемент массива, не равный нулю" - может и не иметь решений

Тогда все равно нужно 0 возвращать, разве нет? 

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

b707 пишет:

Коллеги, вы не учитываете, что задачка "найти минимальный элемент массива, не равный нулю" - может и не иметь решений

Согласен, тогда нужно использовать флаг, что условие выполнилось хотя бы один раз, если не выполнилось, то вывести, что решения нет. А ещё может быть, что минимальное и есть максимальное значение int. Тогда так:

if (myArr[i] && (maxValue >= myArr[i]))

 

b707
Offline
Зарегистрирован: 26.05.2017

Я к тому, что девушка в заглавном посте не показала, как инициализируется массив... мож у нее там нули одни :) А она мучается, складывает слово "вечность" из четырех букв :)

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

А x[] - чего за массив? int? uint? float?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

В общем, обсуждать что либо бессмысленно, пока код не будет выложен полностью и по правилам форума.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Итак, если бы ТС удосужилась правильно вставить отформатированный код, то это выглядело бы вот так:

total = 0;
// put your main code here, to run repeatedly:
for (i = 0; i < 10; i = i + 1)  {
  //  total =0;
  if ( i == 0 )  {
    max_v = x[0] ;
    max_i = 0;
    min_v = x[0] ;
    min_i = 0;
  }
  if ( x[i] > max_v ) {
    max_v = x[i];
    max_i = i;
  }
  if ( x[i] < min_v && x[i] > 0) { ///ПРОВЕРИТЬ НА НОЛЬ!!!!!!!!!!!!!!!
    min_v = x[i];
    min_i = i;
  }
  total += x[ i ];
}

Что вижу я. Во первых - в массиве "x" имеется (или задумывалось иметься) 10 элементов. Как проинициализирован массив - не известно. Этот код, на сколько я не кодер вообще, вижу что должен найти минимальное и максимальное значение в массиве. Запомнить их в соответствующие переменные min_v и max_v, а их индексы в соответствующие переменные min_i и max_i (причем минимальным не должен быть ноль). Переменная total - ни что иное как сумма всех элементов массива (если предположить, что переменная total и массив "хэ" (ладно-ладно - "икс") одного типа (иначе не понятно зачем это и что будет в результате). Так?

Из всего вышесказанного у меня возникает один вопрос:

Цитата:
не могу сделать сортировку

Где тут сортировка????

Ivanna13
Offline
Зарегистрирован: 28.01.2021

Использовала для проверки код где массив был задан в инициализации элементов.

при этом все работало как надо.

Во второй версии нужно было задать массив уже в void loop

и вот здесь находиться всегда минимальное число,но все время учитываются нули

int x[10];
int i,max_v,min_v,max_i,min_i,total;

void setup() {
  
 Serial.begin(115200);
}

void loop() {
  
     x[0] = 0; //сдвиг по элементам и нумерации   
     x[1] = 1;
     x[2] =  2;
     x[3] = 3;
     x[4] =  4;
     x[5] =  5 ;
     x[6] =  6;
     x[7] = 7;
     x[8] = 8;
         
  total =0;
 
for (i = 0; i < 10; i = i + 1)  {
  
      if ( i==0 )  {
   max_v = x[0] ;
   max_i = 0;
   min_v = x[0] ;
   min_i = 0;
      }
      if ( x[i] > max_v ) {
   max_v = x[i];
   max_i = i;
      }
      if ( x[i] < min_v && x[i] != 0) {  ///ПРОВЕРИТЬ НА НОЛЬ!!!!!!!!!!!!!!!
   min_v = x[i];
   min_i = i;
      }
      total += x[ i ];
}


       Serial.println("************");
     Serial.println(min_v);
     Serial.println(min_i);
       Serial.println("__________");
     Serial.println(max_v);
     Serial.println(max_i);
       Serial.println("__________");
     Serial.println(total);
    Serial.println();
    delay(3000);
}

 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Так у тебя же первый элемент массива равен нулю и ты его присваиваешь в 26 и 28 строках. ))))

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Для сортировки от минимума к максимуму используют "метод всплывающих пузырьков". Для обратного - видимо "тонущего камня". А если чего-то там надо исключить - так его обычно обходят сбоку. Или выкидывают вне зоны опроса.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Ладно, я сегодня добрый, вот тебе решение задачи (как ты говоришь -"чтобы не было нуля"):

int x[10];
int i, max_v, min_v, max_i, min_i, total;

void setup() {

  Serial.begin(115200);
  // инициализация массива
  x[0] = 0;
  x[1] = 1;
  x[2] = 2;
  x[3] = 3;
  x[4] = 4;
  x[5] = 5 ;
  x[6] = 6;
  x[7] = 7;
  x[8] = 8;
  x[9] = 9;

  total = 0;

  max_v = x[0] ;
  max_i = 0;

  // поиск первого элемента в массиве отличного от нуля для минимального значения (согласно условиям)
  for (i = 0; i < 10; i++;)  {
    if ( x[i] != 0 )  {
      min_v = x[i] ;
      min_i = i;
      breake;
    }
  }
}

void loop() {

  // зачем все это в лупе??? Ну да ладно - оставим на твоей совести :-D
  for (i = 0; i < 10; i++;)  {

    if ( i == 0 )  {
      max_v = x[0] ;
      max_i = 0;
      min_v = x[0] ;
      min_i = 0;
    }
    if ( x[i] > max_v ) {
      max_v = x[i];
      max_i = i;
    }
    if ( x[i] < min_v && x[i] != 0) {  ///ПРОВЕРИТЬ НА НОЛЬ!!!!!!!!!!!!!!!
      min_v = x[i];
      min_i = i;
    }
    total += x[ i ];
  }

  Serial.println("************");
  Serial.println(min_v);
  Serial.println(min_i);
  Serial.println("__________");
  Serial.println(max_v);
  Serial.println(max_i);
  Serial.println("__________");
  Serial.println(total);
  Serial.println();
  delay(3000);
}

Проверь, наверное работает. Я не проверял (лень).

Ivanna13
Offline
Зарегистрирован: 28.01.2021

спасибо,но не работает.
также ноль минимальное число

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

Ivanna13 пишет:

спасибо,но не работает.
также ноль минимальное число

Какой ноль? Код BOOM не компилируется. Или вы ошибки исправили?

Ivanna13
Offline
Зарегистрирован: 28.01.2021

AndreyD пишет:

Ivanna13 пишет:

спасибо,но не работает.
также ноль минимальное число

Какой ноль? Код BOOM не компилируется. Или вы ошибки исправили?

исправила.

ошибка в break  и в i++

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Все же загрузил, нельзя так оставлять (забыл убрать вашу инициализацию минимального значения из луп):

int x[10];
int i, max_v, min_v, max_i, min_i, total;

void setup() {

  Serial.begin(115200);
  // инициализация массива
  x[0] = 0;
  x[1] = 1;
  x[2] = 2;
  x[3] = 3;
  x[4] = 4;
  x[5] = 5 ;
  x[6] = 6;
  x[7] = 7;
  x[8] = 8;
  x[9] = 9;

  total = 0;

  max_v = x[0] ;
  max_i = 0;

  // поиск первого элемента в массиве отличного от нуля (согласно условиям)
  for (i = 0; i < 10; i++)  {
    if ( x[i] != 0 )  {
      min_v = x[i] ;
      min_i = i;
      break;
    }
  }
}

void loop() {

  // зачем все это в лупе??? Ну да ладно - оставим на твоей совести :-D
  for (i = 0; i < 10; i++)  {

    if ( x[i] > max_v ) {
      max_v = x[i];
      max_i = i;
    }
    if ( x[i] < min_v && x[i] != 0) {  ///ПРОВЕРИТЬ НА НОЛЬ!!!!!!!!!!!!!!!
      min_v = x[i];
      min_i = i;
    }
    total += x[ i ];
  }

  Serial.println("************");
  Serial.println(min_v);
  Serial.println(min_i);
  Serial.println("__________");
  Serial.println(max_v);
  Serial.println(max_i);
  Serial.println("__________");
  Serial.println(total);
  Serial.println();
  delay(3000);
}

 

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

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

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Этого я тоже не понял, но если хочется и возможно... то почему бы и нет? ))

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

BOOM пишет:

Этого я тоже не понял, но если хочется и возможно... то почему бы и нет? ))

Если маститый учёный говорит - это невозможно, то он скорее всего ошибается....

А если тот же ученый говорит, что это возможно - то он скорее всего прав.

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018
void setup() {
    Serial.begin(115200);
    
    int x[10]{ 0,1,2,3,4,5,6,7,8,9 };
    int max_v= INT16_MIN, min_v = INT16_MAX, max_i = 0, min_i = 0, total = 0;

    for (int i = 0; i < 10; i++) {
        total += x[i];
        if (x[i] && (x[i] <= min_v)) {
            min_v = x[i];
            min_i = i;
        }
        if (x[i] && (x[i] >= max_v)) {
            max_v = x[i];
            max_i = i;
        }

    }

    Serial.println("************");
    Serial.println(min_v);
    Serial.println(min_i);
    Serial.println("__________");
    Serial.println(max_v);
    Serial.println(max_i);
    Serial.println("__________");
    Serial.println(total);
    Serial.println();
}

void loop() {}

Без защиты, что все нули. Ой, обшибся. Поправил.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

А чем не устроил мой метод проверки ?

Ivanna13
Offline
Зарегистрирован: 28.01.2021

AndreyD пишет:

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

планируется получать данные с термопар.

поэтому данные будут изменяться

температура будет всегда больше 10 градусов.

при отсутсвии датчика будет 0.

поэтому надо 0 исключить из проверки

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Ivanna13 пишет:

планируется получать данные с термопар.

А какой сакральный смысл в нуле? Если правильно настроить термопару, то нуля не будет. Никогда!

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

Kakmyc пишет:
А чем не устроил мой метод проверки ?

Ну я сделал по своему.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Ivanna13 пишет:

при отсутсвии датчика будет 0.

Не заметил. Т.е. когда датчик пропадает - его надо исключить? Он может пропасть в ходе работы? Или сразу - при проверке мы его можем исключить?

Прекрасная дама - дайте, пожалуйста, нормальную информацию про Ваш экперимент.

Ivanna13
Offline
Зарегистрирован: 28.01.2021

спасибо ,работает

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

Ivanna13 пишет:

планируется получать данные с термопар.

поэтому данные будут изменяться

температура будет всегда больше 10 градусов.

при отсутсвии датчика будет 0.

поэтому надо 0 исключить из проверки

Тогда мои строчки 05-18 в loop.

Ну всё-таки вариант когда все датчики дадут сбой тоже может произойти.

Ой, чувствую, что старожилы меня сейчас "побьют", что я неправильно совсем новичков воспитываю.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

AndreyD пишет:

Ой, чувствую, что старожилы меня сейчас "побьют", что я неправильно совсем новичков воспитываю.

Не, девушкам можно. Главное, что бы это не мужик переодетый был.