код должен отсеивать все элементы массива не входящие в границы [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
Думаю, я неправильно понял. Первая программа тоже неплохая, поэтому оставлю ее и напишу новый ответ. Здесь также я присваиваю остальным элементам ноль. Но про "сжимание массива" я так и не понял
#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;
}
Промежуток [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;
}
Если хотите изменять динамически размер массивов, то лучше использовать векторы... Прежде чем, как получить ответ, сначала задайте правильно вопрос, и будет вам решение.
Можно так ещё. Работает за 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;
}
}
...остальное...
#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;
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
Пытаюсь прочитать через i2c eeprom память m24sr04 (Dynamic NFC/RFID tag IC with 4-Kbit EEPROM)Предварительно записал в тэг с помощью NFC некоторую информацию
Не очень понимаю, почему следующий код выводит 0 1 0Какие типы у foo_1, foo_2 и foo_3?
Вообщем вот фрагмент кода, код себя ведет не очень понятно, все как бы хорошо, но иконка не меняется при наступлении 19 часов(а так должно быть)
Я скачал архив с сайта, к сделал всё как на видео но мне пишет,