Ошибка в сортировке массива чисел

170
05 апреля 2019, 21:20

код должен отсеивать все элементы массива не входящие в границы [a b], массив сжимается, все не вошедшие элементы к нулю и вправо, выдает неправильный ответ, не могу найти в чем ошибка.

#include <iostream>
using namespace std;
int main() {
   float mas [10] = {4, 3, 9.4, -0.7, 1, 5, 9, 1.3, 9, 0.66};
   float a = 3;
   float b = 6;
   for(int i = 0; i<10; i++){
       if(mas[i]<a || mas[i]>b){
          for(int j = i++; j < 10; j++){
           mas[j-1] = mas[j];
          }
          mas[9] = 0;
          i--;
        }
}
  for(int i = 0; i<10; i++){
       std::cout<<mas[i]<<std::endl;
   }
    return 0;
}

В итоге получаю ответ 4 9.4 1 9 9 0 0 0 0 0

Answer 1

Думаю, я неправильно понял. Первая программа тоже неплохая, поэтому оставлю ее и напишу новый ответ. Здесь также я присваиваю остальным элементам ноль. Но про "сжимание массива" я так и не понял

#include <iostream>
using namespace std;
int main() {
    /*устанавливаем размер массива*/
    int razmermassiva = 10;
   float mas [razmermassiva] = {4, 3, 9.4, -0.7, 1, 5, 9, 1.3, 9, 0.66};
   float mas2 [razmermassiva];
   float a = 3;
   float b = 6;

   int i, j, k;
   i=j=k=0;
   for(i = 0; i<razmermassiva; i++){
        /*отсеиваем элементы массива*/
       if(mas[i]>=a && mas[i]<=b){
            /*записываем элемент массива в другой массив*/
            mas2[j]=mas[i];
            j++;
        }
        else{
        /*записываем 0 справа налево */
        mas2[razmermassiva-(k+1)]=0;
        k++;
        }
    }
    /*переписываем массив обратно и выводим*/
    for(i = 0; i<razmermassiva; i++){
        mas[i]=mas2[i];
        std::cout <<mas[i]<<" ";
    }
        std::cout <<std::endl;
  }
Answer 2

Промежуток [a,b] с квадратными скобками включает числа 3 и 6, поэтому используем ">=" "<=". Мне пришло в голову только создать второй массив и записывать в него элементы первого. Если хотите, можете дальше просто переписывать все элементы второго в первый. Хотя мне кажется это лишнее. И потом, я не понял что значит "массив сжимается". Куда тогда записывать остальные элементы не входящие от a до b. Если вы сдвигаете элементы вправо, то куда пихать 0? Массив должен расширяться? У нас всего 10 элементов, тогда 0 будем 11-ым. В общем следующая программа выводит сначала элементы входящие в промежуток от a до b, затем справа налево записывает остальные элементы.

#include <iostream>
using namespace std;
int main() {
    /*устанавливаем размер массива*/
    int razmermassiva = 10;
   float mas [razmermassiva] = {4, 3, 9.4, -0.7, 1, 5, 9, 1.3, 9, 0.66};
   float mas2 [razmermassiva];
   float a = 3;
   float b = 6;

   int i, j, k;
   i=j=k=0;
   for(i = 0; i<razmermassiva; i++){
        /*отсеиваем элементы массива*/
       if(mas[i]>=a && mas[i]<=b){
            /*записываем элемент массива в другой массив*/
            mas2[j]=mas[i];
            j++;
        }
        else{
        /*записываем остальные элементы справа налево*/
        mas2[razmermassiva-(k+1)]=mas[i];
        k++;
        }
    }
    for(i = 0; i<razmermassiva; i++){
        std::cout <<mas2[i]<<" ";
    }
        std::cout <<std::endl;
  }

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

Answer 3

Можно так ещё. Работает за O(n), в отличии от вашего O(n^2)

#include <iostream>
#include <algorithm>
using namespace std;
int main() {
    const size_t mas_size = 10;
    float mas[mas_size] = { 4, 3, 9.4, -0.7, 1, 5, 9, 1.3, 9, 0.66 };
    float a = 3;
    float b = 6;
    auto it = remove_if(mas, mas + mas_size, [a, b](float x) {
        return x >= a && x <= b;
    });
    for_each(it, mas + mas_size, [](float &x) { x = 0; });
    for (int i = 0; i < mas_size; i++) {
        std::cout << mas[i] << ' ';
    }
    return 0;
}

Или так, тоже за O(n)

...остальное...
size_t pos;
for (pos = 0; pos < mas_size; ++pos) {
    if (mas[pos] >= a && mas[pos] <= b)
        break;
}
for (size_t i = pos+1; i < mas_size; ++i) {
    if (!(mas[i] >= a && mas[i] <= b)) {
        mas[pos++] = mas[i];
        mas[i] = 0;
    }
}
...остальное...
Answer 4
#include <iostream>
#include <iomanip>
#define str_format \
std::fixed << std::setw(4) << std::setprecision(2) << std::setfill('0')
template <typename T, std::size_t N>
void print_arr(T(&arr)[N]) {
    for (int i = 0; i < N; ++i) {
        std::cout << str_format << arr[i] << " ";
    }
    std::cout << std::endl;
}
int main() {
    float arr[] = { 4, 3, 9.4, 7, 1, 5, 9, 1.3, 9, 0.66 };
    float l_bound = 3,
          h_bound = 6;
    int arr_len = sizeof(arr)/sizeof(*arr);
    float temp_val;
    for (int i = 0, r = 0; (i + r) < arr_len;) {
        if (arr[i] < l_bound || arr[i] > h_bound) {
            arr[i] = 0;
            for (int j = i; j < arr_len - 1; ++j) {
                temp_val = arr[j + 1];
                arr[j + 1] = arr[j];
                arr[j] = temp_val;
            }
            ++r;
        } else {
            ++i;
        }
        print_arr(arr);
    }
    return 0;
}
READ ALSO
Не получается прочитать через i2c eeprom память m24sr04

Не получается прочитать через i2c eeprom память m24sr04

Пытаюсь прочитать через i2c eeprom память m24sr04 (Dynamic NFC/RFID tag IC with 4-Kbit EEPROM)Предварительно записал в тэг с помощью NFC некоторую информацию

153
Различные типы функций

Различные типы функций

Не очень понимаю, почему следующий код выводит 0 1 0Какие типы у foo_1, foo_2 и foo_3?

342
Не меняются иконки C++

Не меняются иконки C++

Вообщем вот фрагмент кода, код себя ведет не очень понятно, все как бы хорошо, но иконка не меняется при наступлении 19 часов(а так должно быть)

198
Как подключить cURL к Visual Studio?

Как подключить cURL к Visual Studio?

Я скачал архив с сайта, к сделал всё как на видео но мне пишет,

192