0 / 0 / 1
Регистрация: 30.07.2012
Сообщений: 59
1

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

04.11.2016, 18:04. Показов 783. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте!
Помогите, пожалуйста с программой.
Программа: Дан массив с целыми числами. Нужно найти одинаковые по модулю, но разные по знаку элементы массива и поменять их местами.
Программу написал. Работает. Но! Некорректно работает, если массив состоит из нечётного количества элементов.
Прилагаются скриншоты корректной и некорректной работы. Никак не могу понять, в чём моя ошибка.


Корректно:
Поменять местами элементы массива, разные по знаку, но одинаковые по модулю


Некорректно:
Поменять местами элементы массива, разные по знаку, но одинаковые по модулю



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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <cmath>
#include <iostream>
 
 
using std::cout;
using std::cin;
using std::endl;
 
int main(int argc, char* argv[])
{
    
    int size;
    
    cout << "Enter the size of the array:";
    
    cin >> size;
    int *arr = new int[size]; //  объявление динамического массива "arr"
 
    
    for (int cell = 0; cell < size; ++cell)  // объявление элементов массива
      {
        cout << "arr[" << cell << "]=";
        cin >> arr[cell];
      }
 
    
 
    for (int n = 0; n<size; ++n) 
    {
 
       for (int k = (n + 1); !(k == size); ++k) 
         {
 
        if (abs(arr[n]) == abs(arr[k])) // сравнение модулей элементов массива
             {
           int t = arr[n];
           arr[n] = arr[k];
           arr[k] = t;
         }
 
          }
     }
    cout << "New array\n" <<endl;
    cout << "Index\t\telement array"<<endl;
    for (int counter = 0; counter < size; counter++)  
    {
    
      cout << "arr[" << counter << "]" << "\t\t" << arr[counter] << endl;
    }
    
    delete[] arr;
    
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.11.2016, 18:04
Ответы с готовыми решениями:

Поменять местами равные по модулю, но противоположные по знаку элементы.
Ребят, помогите пожалуйста Задан целочисленный массив X = (x1,x2,...,xn). Если в этом массиве ...

Поменять местами наибольший и наименьший по модулю элементы массива
Здравствуйте, нужна помощь специалистов :) Есть программа, которая меняет местами наибольший и...

Поменять местами первый и максимальный по модулю отрицательный элементы массива.
Программирование задач с одномерными массивами Поменять местами первый и максимальный по модулю...

Поменять местами первый и максимальный по модулю отрицательный элементы массива
Ребята,помогите создать прогу: поменять местами первый и максимальный по модулю отрицательный...

14
1494 / 1209 / 821
Регистрация: 29.02.2016
Сообщений: 3,614
04.11.2016, 18:31 2
31 строчка
C++
1
       for (int k = (n + 1); k <size ; ++k)
0
0 / 0 / 1
Регистрация: 30.07.2012
Сообщений: 59
04.11.2016, 18:33  [ТС] 3
Цитата Сообщение от afront Посмотреть сообщение
k <size
Да, у меня так было в изначальном варианте.

Но это не изменяет результат работы программы.
Поменять местами элементы массива, разные по знаку, но одинаковые по модулю
0
1494 / 1209 / 821
Регистрация: 29.02.2016
Сообщений: 3,614
04.11.2016, 18:41 4
тогда так
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
40
41
42
43
44
  int size;
    
    cout << "Enter the size of the array:";
    
    cin >> size;
    int *arr = new int[size]; //  объявление динамического массива "arr"
    int *priz = new int[size];
    
    for (int cell = 0; cell < size; ++cell)  // объявление элементов массива
      {
        cout << "arr[" << cell << "]=";
        cin >> arr[cell];
      }
 
    for (int n = 0; n<size; ++n)
              priz[n]=0;
    for (int n = 0; n<size; ++n) 
    {
 
       for (int k = (n + 1); k <size ; ++k) 
         {
 
        if (abs(arr[n]) == abs(arr[k])&& priz[n]==0) // сравнение модулей элементов массива
             {
           int t = arr[n];
           arr[n] = arr[k];
           arr[k] = t;
           priz[n]=1;
         }
 
          }
     }
    cout << "New array\n" <<endl;
    cout << "Index\t\telement array"<<endl;
    for (int counter = 0; counter < size; counter++)  
    {
    
      cout << "arr[" << counter << "]" << "\t\t" << arr[counter] << endl;
    }
    
    delete[] arr;
    
 
    return 0;
1
0 / 0 / 1
Регистрация: 30.07.2012
Сообщений: 59
04.11.2016, 18:51  [ТС] 5
Это работает! Спасибо большое!
*Только, конечно же, следует потом освободить память(это, если кто-то захочет кодом воспользоваться).
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
04.11.2016, 18:57 6

Не по теме:

Когда создают указатель, а пишут, что это динамический массив, в мире грущу я. :resent:


Лень было разбираться в коде, поэтому написал свой.
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
/////////////////////////////////////////////////////////////////////////////////////////
// Дан массив с целыми числами. Нужно найти одинаковые по модулю, 
// но разные по знаку элементы массива и поменять их местами.
/////////////////////////////////////////////////////////////////////////////////////////
#include <iostream>
/////////////////////////////////////////////////////////////////////////////////////////
int main()
{
    unsigned n{};
    
    std::cin >> n;
    
    int* arr = new int[n];
    
    for( size_t it{}; it < n; ++it )
    {
        std::cin >> arr[it];
        if( it > 0 )
        {
            for( size_t it2{}; it2 < it; ++it2 )
            {
                if( arr[it] == -arr[it2] )
                {
                    arr[it2] = -arr[it2];
                    arr[it] = -arr[it];
                }
            }
        }
    }
    
    for( size_t it{}; it < n; ++it )
    {
        std::cout << arr[it] << ' ';
    }
    delete [] arr;
}
1
1494 / 1209 / 821
Регистрация: 29.02.2016
Сообщений: 3,614
04.11.2016, 19:03 7
может добавить еще
C++
1
 priz[k]=1;
чтобы "зафиксировать" и к-е число на всякий случай
1
0 / 0 / 1
Регистрация: 30.07.2012
Сообщений: 59
05.11.2016, 09:19  [ТС] 8
Подскажите, пожалуйста, где именно нужно фиксировать к-е число?
Локальный аргумент не передаётся(у меня не получается реализовать).
0
1494 / 1209 / 821
Регистрация: 29.02.2016
Сообщений: 3,614
05.11.2016, 09:53 9
вот в этом куске кода добавляем priz[k]=1;
C++
1
2
3
4
5
6
7
8
     if (abs(arr[n]) == abs(arr[k])&& priz[n]==0) // сравнение модулей элементов массива
             {
           int t = arr[n];
           arr[n] = arr[k];
           arr[k] = t;
           priz[n]=1;
           priz[k]=1;
         }
кстати, т.к. элементы равны то их нет смысла переставлять, достаточно поменять знак
1
0 / 0 / 1
Регистрация: 30.07.2012
Сообщений: 59
05.11.2016, 09:57  [ТС] 10
Это я понял.
Но ведь условие (k=1) должно сохраняться там-же, где и priz[n]=0.


*нужно, чтобы число с индексом k больше не менялось(как и число с индексом n), если уже произвели замену.
0
1494 / 1209 / 821
Регистрация: 29.02.2016
Сообщений: 3,614
05.11.2016, 10:01 11
и еще, в это условие попадают и просто равные элементы и не обязательно с разным знаком
C++
1
  if (abs(arr[n]) == abs(arr[k])&& priz[n]==0)
поэтому лучше написать
C++
1
 if (arr[n]) == -arr[k] && priz[n]==0)
а это я не понял
"Но ведь условие (k=1) должно сохраняться там-же, где и priz[n]=0"
1
0 / 0 / 1
Регистрация: 30.07.2012
Сообщений: 59
05.11.2016, 10:05  [ТС] 12
Да, я уже произвёл такие изменения. Спасибо.

Программа:
Нулевой элемент сравнивается с последующими. Если находит число, удовлетворяющее условие, то меняет нулевой элемент с н-ым.
Теперь будет проверяться 1 элемент с последующими. И так далее.
Нужно "зафиксировать" оба числа, которые менялись местами.
Надеюсь, я понятно объяснил.
0
1494 / 1209 / 821
Регистрация: 29.02.2016
Сообщений: 3,614
05.11.2016, 10:13 13
когда вы находите два числа удовлетворяющие условие то меняете знаки и "фиксируете" оба эти числа чтобы в дальнейшем они не участвовали в сравнении
при этом в if достаточно мне кажется указать признак только текущего числа

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <cmath>
#include <iostream>
 
 
using std::cout;
using std::cin;
using std::endl;
 
int main(int argc, char* argv[])
{
    
    int size;
    
    cout << "Enter the size of the array:";
    
    cin >> size;
    int *arr = new int[size]; //  объявление динамического массива "arr"
    int *priz = new int[size];
    
    for (int cell = 0; cell < size; ++cell)  // объявление элементов массива
      {
        cout << "arr[" << cell << "]=";
        cin >> arr[cell];
      }
 
    for (int n = 0; n<size; ++n)
              priz[n]=0;
    for (int n = 0; n<size; ++n) 
    {
      for (int k = (n + 1); k <size ; ++k) 
         {
         if ((arr[n] == -arr[k]) && priz[n]==0)
         {
           arr[n] = -arr[n];
           arr[k] = -arr[k];
           priz[n]=1;
           priz[k]=1;
         }
 
          }
     }
    cout << "New array\n" <<endl;
    cout << "Index\t\telement array"<<endl;
    for (int counter = 0; counter < size; counter++)  
    {
    
      cout << "arr[" << counter << "]" << "\t\t" << arr[counter] << endl;
    }
    
    delete[] arr;
    
 
    return 0;
}
0
0 / 0 / 1
Регистрация: 30.07.2012
Сообщений: 59
05.11.2016, 10:20  [ТС] 14
Цитата Сообщение от afront Посмотреть сообщение
при этом в if достаточно мне кажется указать признак только текущего числа
Нет, недостаточно
Посмотрите пример:

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


1. Нулевой элемент сверяется с первым. Оба удовлетворяют условию и меняются местами.
2. Потом программа будет сравнивать первый элемент массива со 2 и 3. Первый меняется с третьим.
*мы уже меняли местами первый элемент, поэтому его больше не нужно трогать

Как это реализовать?
0
1494 / 1209 / 821
Регистрация: 29.02.2016
Сообщений: 3,614
05.11.2016, 11:00 15
ну да в длинном массиве будет наложение, тогда вставить еще проверку
C++
1
        if ((arr[n] == -arr[k]) && priz[n]==0 && priz[k]==0)
Добавлено через 6 минут
и еще добавить break чтобы после одной перестановки дальше сравнения не шли
0
05.11.2016, 11:00
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.11.2016, 11:00
Помогаю со студенческими работами здесь

Поменять местами первый и максимальный по модулю отрицательный элементы массива
Поменять местами первый и максимальный по модулю отрицательный элементы массива.

В матрице поменять местами максимальный по модулю и минимальный по модулю четные элементы
В прямоугольной целочисленной матрице обменять местами максимальный по модулю и минимальный по...

Поменять местами в одномерном массиве противоположные по знаку элементы (например 7.5 и -7.5), с учетов перестановки каждого элемента не более одного
Не пойму как реализовать чтобы проход по массиву чтобы местами он менял противоположные по знаку...

Поменять местами максимальный и минимальный по модулю элементы
Дана матрица А размера n*n, где n&lt;=15. Элементы матрицы вычисляются по формуле a(i,j)=...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru