Форум программистов, компьютерный форум CyberForum.ru

Одномерный массив более 3-х подряд идущих отрицательных элементов, заменить на максимальный элемент - C++

Восстановить пароль Регистрация
 
Valera1984
1 / 1 / 0
Регистрация: 02.02.2014
Сообщений: 104
10.02.2014, 14:36     Одномерный массив более 3-х подряд идущих отрицательных элементов, заменить на максимальный элемент #1
В одномерном массиве A=(a1, а2, ..., аn) все группы элементов, содержащие более 3-х подряд идущих отрицательных элементов, заменить на максимальный элемент.
Помогите разобраться ... Если в массиве попадается больше трех подряд отрицательных их надо убрать и вместо них записать один максимальный элемент..
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
cout<<endl<<endl<<"MAXSIMALNII ILEMENT:";
for (int i=0; i<x; i++)
    if(a[i]>a[i_max])
        i_max=i;
        cout<< "a["<<i_max<<"] ="<<a[i_max]<<endl<<endl;
 
 
int k=0,n=0,ik=0;
for (int i=0;i<x-n;i++)
       {
        if(a[i]<0)
            {
               k++;
               ik=i;
               if (k>3) 
               {            
                      for ( int i=ik-2;a[i]<0;i++)
                                {                                   
                          for(int j=i; j<11-n;j++ )
                               
                          { a[j]=a[j+1];}
                              
                          k=0;i--;n++;
                    
                    
                              }
                a[ik-3]=a[i_max];                   
                           
               }                                      
        
        }
        
        
    if(a[i]>0){k=0;}
    }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.02.2014, 14:36     Одномерный массив более 3-х подряд идущих отрицательных элементов, заменить на максимальный элемент
Посмотрите здесь:

Подсчитать максимальное количество подряд идущих отрицательных элементов. C++
C++ Двумерные массивы. Найти новый одномерный массив, максимальный элемент, заменить третий элемент
Одномерный массив (максимальный из отрицательных элементов и поменять его местами с последним) C++
C++ Заменить максимальный элемент в матрице, средним арифметическим элементов строки, в которой находится максимальный элемент
C++ Подсчет подряд идущих отрицательных элементов
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ikol
 Аватар для Ikol
7 / 7 / 3
Регистрация: 11.02.2012
Сообщений: 21
10.02.2014, 15:11     Одномерный массив более 3-х подряд идущих отрицательных элементов, заменить на максимальный элемент #2
Цитата Сообщение от Valera1984 Посмотреть сообщение
В одномерном массиве A=(a1, а2, ..., аn) все группы элементов, содержащие более 3-х подряд идущих отрицательных элементов, заменить на максимальный элемент.
Помогите разобраться ... Если в массиве попадается больше трех подряд отрицательных их надо убрать и вместо них записать один максимальный элемент..
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
cout<<endl<<endl<<"MAXSIMALNII ILEMENT:";
for (int i=0; i<x; i++)
    if(a[i]>a[i_max])
        i_max=i;
        cout<< "a["<<i_max<<"] ="<<a[i_max]<<endl<<endl;
 
 
int k=0,n=0,ik=0;
for (int i=0;i<x-n;i++)
       {
        if(a[i]<0)
            {
               k++;
               ik=i;
               if (k>3) 
               {            
                      for ( int i=ik-2;a[i]<0;i++)
                                {                                   
                          for(int j=i; j<11-n;j++ )
                               
                          { a[j]=a[j+1];}
                              
                          k=0;i--;n++;
                    
                    
                              }
                a[ik-3]=a[i_max];                   
                           
               }                                      
        
        }
        
        
    if(a[i]>0){k=0;}
    }
Не совсем понял, что вы пытаетесь сделать тут, но если вы ищете максимальный элемент массива, то это будет выглядеть как-то так:

C++
1
2
3
4
5
6
cout<<endl<<endl<<"MAXSIMALNII ILEMENT:";
int max=0; //в этой переменной будет содержаться максимальное значение
for (int i=0; i<x; i++)
    if(a[i]>max)    //сравнивать нужно именно с этой переменной
        max=a[i];   //И присваивать нужно именно значение, а не индекс
        cout<< "Max = "<<max]<<endl<<endl;
Ну а сама замена примерно так(самый простой вариант)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int k=0;
for (int i=0;i<x;i++) 
       {
        if(a[i]<0)
            {
               k++;
               if (k>=3) 
               {     
                      a[j]=max;
                      x-=2;
                      for (int j=i-1;a<x;i++)
                          a[j]=a[j+2];
               }                                      
             }
        else k=0;\\В случае положительных чисел счётчик необходимо обнулять, чтобы он мог заново считать подряд идущие отрицательные числа                                   
        }
Valera1984
1 / 1 / 0
Регистрация: 02.02.2014
Сообщений: 104
10.02.2014, 15:32  [ТС]     Одномерный массив более 3-х подряд идущих отрицательных элементов, заменить на максимальный элемент #3
Ikol, Спасибо ... но вот эта строчка for (int j=i-1;a<x;i++) не понятна...

Добавлено через 6 минут
Ikol, Этот код не работает
Ikol
 Аватар для Ikol
7 / 7 / 3
Регистрация: 11.02.2012
Сообщений: 21
10.02.2014, 16:04     Одномерный массив более 3-х подряд идущих отрицательных элементов, заменить на максимальный элемент #4
Цитата Сообщение от Valera1984 Посмотреть сообщение
Ikol, Спасибо ... но вот эта строчка for (int j=i-1;a<x;i++) не понятна...
Ну всё просто. В месте массива, где был найден третий подряд идущий элемент мы начинаем менять массив.(Только косяк у себя нашёл, там где a[j]=max; нужно написать a[i-2]=max. Так вот, здесь мы перед циклом обхода массива присваиваем максимальное значение элементу, который был на 2 элемента раньше(чем последний, третий подряд идущий отрицательный элемент). Затем мы начинаем цикл с элемента, который был перед текущим, элементом (то есть 2й подряд идущий отрицательный элемент), и уже начиная с него, начинаем присваивать текущему элементу массива(от второго подряд идущего отрицательного элемента и далее), элемент, индекс которого на 2 больше(от следующего элемента, после последнего подряд идущего отрицательного и далее).

И я вот тут немного додумал цикл. Насколько я понимаю, подряд идущих отрицательных чисел может быть не ровно 3, поэтому нужна ещё проверка именно на длину этой отрицательной серии элементов, с заменой всей серии на 1 элемент. В общем вот.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int k=0;
for (int i=0;i<x;i++) 
       {
        k=0;
        if(a[i]<0)
           while ((a[i]<0)&&(i<x))   //Будет проходить массив, пока встречаются отрицательные элементы И не достигнут конец массива
               {
                    k++;   //Считает длину серии отрицательных элементов
                    i++;   //Увеличивает индекс массива на 1, таким образом обрабатывая следующий элемент массива
               }
 
               if (k>=3) 
               {     
                      a[i-k]=max;   //замена первого элемента серии на максимальный
                      x-=(k-1);      //изменение размера массива в соответствии с длинной серии
                      for (int j=i-k+1;j<x;j++)   //цикл изменения массива, начинается от второго элемента серии
                          a[j]=a[j+k-1];    //сама замена элементов, на элементы, идущие после последнего элемента серии
                i=0;  //обнуление индекса до 0, чтобы пройти массив сначала в поисках серии отрицательных элементов. Если не будет серии отрицательных элементов, удовлетврояющих условию(>3), то индекс обнуляться не будет
               }                                      
        }
Добавлено через 1 минуту
Полностью рабочий код, проверял через онлайн компилятор

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
 
using namespace std;
 
int main()
{
    int a[10] = {1, -2, -3, -4, 5, -6, -7, -8, -9, 10};
    int x=10;
    cout<<endl<<endl<<"MAXSIMALNII ILEMENT:";
int max=0; //в этой переменной будет содержаться максимальное значение
for (int i=0; i<x; i++)
    if(a[i]>max)    //сравнивать нужно именно с этой переменной
        max=a[i];   //И присваивать нужно именно значение, а не индекс
        cout<< "Max = "<<max<<endl<<endl;
int k=0;
for (int i=0;i<x;i++) 
       {
        k=0;
        if(a[i]<0)
           while ((a[i]<0)&&(i<x))   //Будет проходить массив, пока встречаются отрицательные элементы И не достигнут конец массива
               {
                    k++;   //Считает длину серии отрицательных элементов
                    i++;   //Увеличивает индекс массива на 1, таким образом обрабатывая следующий элемент массива
               }
 
               if (k>=3) 
               {     
                      a[i-k]=max;   //замена первого элемента серии на максимальный
                      x-=(k-1);      //изменение размера массива в соответствии с длинной серии
                      for (int j=i-k+1;j<x;j++)   //цикл изменения массива, начинается от второго элемента серии
                          a[j]=a[j+k-1];    //сама замена элементов, на элементы, идущие после последнего элемента серии
                i=0;  //обнуление индекса до 0, чтобы пройти массив сначала в поисках серии отрицательных элементов. Если не будет серии отрицательных элементов, удовлетврояющих условию(>3), то индекс обнуляться не будет
               }                                      
        }    
        
for (int i=0;i<x;i++)
cout<<a[i]<<" ";
   return 0;
}
Valera1984
1 / 1 / 0
Регистрация: 02.02.2014
Сообщений: 104
10.02.2014, 16:30  [ТС]     Одномерный массив более 3-х подряд идущих отрицательных элементов, заменить на максимальный элемент #5
Ikol, Есть небольшой нюанс... массив должен уменьшиться... допустим
int x =12;
int a[12]={40,-12,-3,-5,-1,17,-8,-1,-65,-1,-6,4}
Должно выводиться a[]={40,40,17,40,4}^)

Добавлено через 13 минут
Ikol, Спасибо большое все работает...
Yandex
Объявления
10.02.2014, 16:30     Одномерный массив более 3-х подряд идущих отрицательных элементов, заменить на максимальный элемент
Ответ Создать тему
Опции темы

Текущее время: 03:21. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru