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

Изменение значения переменной во время исполнения - C++

Восстановить пароль Регистрация
 
Vultaron
 Аватар для Vultaron
1 / 1 / 0
Регистрация: 27.03.2011
Сообщений: 31
22.07.2011, 17:04     Изменение значения переменной во время исполнения #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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include <iostream>
using namespace std;
 
int main(int argc, char **argv)
{
    int n;
    cout<<"Введите кол-во элементов массива "<<endl;
    cin>>n;
    int* a = new int [n];
    for (int i = 0; i < n; i++)
    {
        cout<<"Введите "<<i<<"Элемент массива"<<endl;
        cin>>a[i]; 
    }
    cout<<"Введенный массив "<<endl;
    for (int i = 0; i < n; i++)
    {
        cout<<a[i]<<" ";
    }
    cout<<endl;
    
    int maxNumber = a[0], iMaxNumber = 0, sumOfElements = 0;
    for (int i = 0; i < n; i++)
    {
        if (maxNumber < a[i])
        {
           maxNumber = a[i];
           iMaxNumber = i;
        }
    }
    cout<<"Индекс наибольшего элемента "<<iMaxNumber<<endl;
    
    
    int iFirstZero,iSecondZero;
    for (int i = 0; i < n; i++)
    {
        if (a[i] == 0)
        {
           iFirstZero = i;
           break;
       }
    }
    
    for (int i = 0; i < n; i++)
    {
        if (i == iFirstZero)
           continue;
        else
           if (a[i] == 0)
              iSecondZero = i;
    }
    
    for (int i = iFirstZero; i < iSecondZero; i++)
        sumOfElements += a[i];
    
    cout<<"Сумма элементов между первым и вторым нулевыми элементами равна "<<sumOfElements<<endl;
    
        //Начало решения вышеизложенной задачи
 
    for (int k = 0; k < (n + 1) / 2; k++)
    {
        if (k % 2 == 0)
        {
           for (int i = 0; i < n; i++)
           {
              if (i % 2 == 0 && (i + 1) % 2 != 0)
              {
                 int temp;
                 temp = a[i];
                 a[i] = a[i+1];
                 a[i+1] = temp;
              }
           }
        }
        else
        {
            for (int i = 0 ; i < n; i++)
            {
               if (i % 2 != 0 && (i + 1) % 2 == 0)
               {
                  int temp;
                  temp = a[i];
                  a[i] = a[i+1];
                  a[i+1] = temp;
               }
            }
        
        }
    }
        
   
    cout<<"Массив с нечетными индексами в первой части: "<<endl;
    for (int i = 0; i < n; i++)
    {
        cout<<a[i]<<" ";
    }
    cout<<endl;
    
    return 0;
        
}
Проблема заключается в том, что программа делает то что нужно, но по каким-то причинам при некоторых значениях меняет значение одной из переменных массива. Например, при вводе массива 1 2 3 4 5 6, оно выдает 4 2 6 1 0 3 , т.е. 5 почему то меняется на 0.
Компилятор gcc
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
22.07.2011, 17:26     Изменение значения переменной во время исполнения #2
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
        for (int k = 0; k < (n + 1) / 2; k++)
        {
                if (k % 2 == 0)
                {
           for (int i = 0; i < n; i++)
           {
                  if (i % 2 == 0 && (i + 1) % 2 != 0)
                  {
                     int temp;
                         temp = a[i];
                         a[i] = a[i+1];
                         a[i+1] = temp;
                      }
               }
        }
        else
                {
                        for (int i = 0 ; i < n; i++)
                        {
                       if (i % 2 != 0 && (i + 1) % 2 == 0)
                   {
                      int temp;
                          temp = a[i];
                          a[i] = a[i+1];
                          a[i+1] = temp;
                       }
                }
                
            }
        }
о боже что это?
используй временные массивы и жизнь будет гораздо проще!

вообще удобно для решения данной задачи использовать stable_partition:
C++
1
2
3
4
5
6
7
8
9
        std::stable_partition(a,a+n, [] (int i) -> bool {
 
            static int cnt=0;
 
            if ((cnt++)&1) return true;
 
            return false;
            
        });
вопрос к понимающим людям кстати:
вот уже не 1-ый раз юзаю такую форму предиката. но приходится иметь на содержании статическую переменную cnt, а не хотелось бы.
можно ли сделать какую нибудть форму предиката, чтобы передавать и инкрементировать cnt как параметр?? и если да - то как?

Добавлено через 2 минуты
вот решение твоей задачи через временный массив:
C++
1
2
3
4
5
6
7
8
        int * new_a = new int[n];
 
        int cur=0;
 
        for (int i=1; i<n; i+=2)
            new_a[cur++]=a[i];
        for (int i=0; i<n; i+=2)
            new_a[cur++]=a[i];
всё!
Vultaron
 Аватар для Vultaron
1 / 1 / 0
Регистрация: 27.03.2011
Сообщений: 31
22.07.2011, 17:29  [ТС]     Изменение значения переменной во время исполнения #3
Мой код решает задачу. Вопрос не в этом, а в том почему одна из переменных меняет значение
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
22.07.2011, 17:33     Изменение значения переменной во время исполнения #4
Цитата Сообщение от Vultaron Посмотреть сообщение
Вопрос не в этом, а в том почему одна из переменных меняет значение
Потому, что в цикле из строки 77 допускается выход за границу массива
castaway
Эксперт С++
4837 / 2976 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
22.07.2011, 17:33     Изменение значения переменной во время исполнения #5
Цитата Сообщение от Vultaron Посмотреть сообщение
Мой код решает задачу. Вопрос не в этом, а в том почему одна из переменных меняет значение
Слишком уж замудренный у тебя код. Может все-таки как-нибудь попроще его оформить, скажем:
C
1
2
3
4
5
6
7
    n = strlen( src );
    nn = n / 2;
    for ( i = 0, j = 0; i < nn; i++, j += 2 ) {
        dst[i] = src[j + 1];
        dst[i+nn] = src[j];
    }
    dst[n] = 0;
* размер dst должен быть strlen( src ) + 1, в общем такой же.
Vultaron
 Аватар для Vultaron
1 / 1 / 0
Регистрация: 27.03.2011
Сообщений: 31
22.07.2011, 17:48  [ТС]     Изменение значения переменной во время исполнения #6
Цитата Сообщение от grizlik78 Посмотреть сообщение
Потому, что в цикле из строки 77 допускается выход за границу массива
Да, проблема именно в этом, спасибо.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
22.07.2011, 17:52     Изменение значения переменной во время исполнения #7
Если количество элементов в массиве заведомо чётное, то вот
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
#include <stdio.h>
    
#define SIZE 10
#define swap(a, b) ({ int tmp = *(a); *(a) = *(b); *(b) = tmp; })
    
void dump(int * arr, size_t size){
    while ( size-- )
        printf("%2d%c", *arr++, ( size ) ? ' ' : '\n');
}
    
int main(void){
    int arr[SIZE], i, j;
    
    for ( i = 0; i < SIZE; ++i )
        arr[i] = i + 1;
    
    printf("Before:\n");
    dump(arr, SIZE);
    
    for ( i = 0; i < SIZE / 2; ++i )
        for ( j = i; j < SIZE - i; j += 2 )
            swap(arr+j, arr+j+1);
    
    printf("After:\n");
    dump(arr, SIZE);
    
    return 0;
}
Если может быть и нечётным, чуть додумать нужно...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.07.2011, 18:55     Изменение значения переменной во время исполнения
Еще ссылки по теме:

Ошибка во время исполнения C++
Ошибка во время исполнения runtime-error C++
C++ Время исполнения операций и циклов

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

Или воспользуйтесь поиском по форуму:
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
22.07.2011, 18:55     Изменение значения переменной во время исполнения #8
Цитата Сообщение от OstapBender Посмотреть сообщение
вот уже не 1-ый раз юзаю такую форму предиката. но приходится иметь на содержании статическую переменную cnt, а не хотелось бы.
можно ли сделать какую нибудть форму предиката, чтобы передавать и инкрементировать cnt как параметр?? и если да - то как?
Квадратаные скобочки зачем ?
Код
[] // без захвата переменных из внешней области видимости
[=] // все переменные захватываются по значению
[&] // все переменные захватываются по ссылке
[x, y] // захват x и y по значению
[&x, &y] // захват x и y по ссылке
[in, &out] // захват in по значению, а out — по ссылке
[=, &out1, &out2] // захват всех переменных по значению, кроме out1 и out2, 
// которые захватываются по ссылке
[&, x, &y] // захват всех переменных по ссылке, кроме x…
Yandex
Объявления
22.07.2011, 18:55     Изменение значения переменной во время исполнения
Ответ Создать тему
Опции темы

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