Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
0 / 0 / 1
Регистрация: 30.07.2012
Сообщений: 59

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

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

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


Корректно:


Некорректно:



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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.11.2016, 18:04
Ответы с готовыми решениями:

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

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

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

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

Но это не изменяет результат работы программы.
0
1498 / 1213 / 821
Регистрация: 29.02.2016
Сообщений: 3,630
04.11.2016, 18:41
тогда так
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  [ТС]
Это работает! Спасибо большое!
*Только, конечно же, следует потом освободить память(это, если кто-то захочет кодом воспользоваться).
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
04.11.2016, 18:57

Не по теме:

Когда создают указатель, а пишут, что это динамический массив, в мире грущу я. :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
1498 / 1213 / 821
Регистрация: 29.02.2016
Сообщений: 3,630
04.11.2016, 19:03
может добавить еще
C++
1
 priz[k]=1;
чтобы "зафиксировать" и к-е число на всякий случай
1
0 / 0 / 1
Регистрация: 30.07.2012
Сообщений: 59
05.11.2016, 09:19  [ТС]
Подскажите, пожалуйста, где именно нужно фиксировать к-е число?
Локальный аргумент не передаётся(у меня не получается реализовать).
0
1498 / 1213 / 821
Регистрация: 29.02.2016
Сообщений: 3,630
05.11.2016, 09:53
вот в этом куске кода добавляем 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  [ТС]
Это я понял.
Но ведь условие (k=1) должно сохраняться там-же, где и priz[n]=0.


*нужно, чтобы число с индексом k больше не менялось(как и число с индексом n), если уже произвели замену.
0
1498 / 1213 / 821
Регистрация: 29.02.2016
Сообщений: 3,630
05.11.2016, 10:01
и еще, в это условие попадают и просто равные элементы и не обязательно с разным знаком
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  [ТС]
Да, я уже произвёл такие изменения. Спасибо.

Программа:
Нулевой элемент сравнивается с последующими. Если находит число, удовлетворяющее условие, то меняет нулевой элемент с н-ым.
Теперь будет проверяться 1 элемент с последующими. И так далее.
Нужно "зафиксировать" оба числа, которые менялись местами.
Надеюсь, я понятно объяснил.
0
1498 / 1213 / 821
Регистрация: 29.02.2016
Сообщений: 3,630
05.11.2016, 10: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  [ТС]
Цитата Сообщение от afront Посмотреть сообщение
при этом в if достаточно мне кажется указать признак только текущего числа
Нет, недостаточно
Посмотрите пример:



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

Как это реализовать?
0
1498 / 1213 / 821
Регистрация: 29.02.2016
Сообщений: 3,630
05.11.2016, 11:00
ну да в длинном массиве будет наложение, тогда вставить еще проверку
C++
1
        if ((arr[n] == -arr[k]) && priz[n]==0 && priz[k]==0)
Добавлено через 6 минут
и еще добавить break чтобы после одной перестановки дальше сравнения не шли
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.11.2016, 11:00
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru