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

Динамический массив, исправить ошибку - C++

Восстановить пароль Регистрация
 
flock
3 / 1 / 1
Регистрация: 23.09.2011
Сообщений: 66
21.06.2012, 16:17     Динамический массив, исправить ошибку #1
Здравствуйте, помогите найти ошибку:
Все четные элементы целочисленного массива К(п) поместить в массив L(n), а нечетные — в массив М(п). Подсчитать количество тех и других.

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
#include <iostream.h>
#include <iomanip.h>
#include <conio.h>
main()
{
    int n,ch,nech;
    system("chcp 1251");                 
    system("cls");
    cout<<"Кол-во элементов массива: ";
    cin>>n;
    int *p=new int[n];          // выделение памяти под n элементов
    cout<<endl<<"\tВведите элементы массива\n";
    for (int i = 0; i < n; i++)
    {
        cin>>p[i];cout<<setw(2);
    }
 
    ch=0;nech=0;
    for (int i = 0; i < n; i++)
    {
        if (p[i]%2)                // проверка на нечетность элемента
        {
            nech++;                // подсчитывание кол-ва нечетных элементов
        }
        if (!(p[i]%2) && p[i]!=0)  // проверка на четность элемента
        {
            ch++;                  // подсчитывание кол-ва четных элментов
        }
    }
 
    int *p1=new int[nech];      // выделение памяти для нечетных элементов
    int *p2=new int[ch];       // выделение памяти для четных элементов
    ch=0;nech=0;
 
    for (int i = 0; i < n; i++)
    {
        if (p[i]%2)             // проверка на нечетность элемента
        {
            p1[nech]=p[i];
            nech++;              // подсчитывание кол-ва нечетных элментов
        }
        if (!(p[i]%2) && p[i]!=0)        // проверка на четность элемента
        {
            p2[ch]=p[i];
            ch++;              // подсчитывание кол-ва четных элментов
        }
        
    }
    
    cout<<"\nКол-во нечетных элементов : "<<nech;
    cout<<"\nМассив из нечетных элементов: ";
    for (int i = 0; i <= nech-1; i++)
    {
        cout<<setw(3)<<p1[i];     
    }
 
    cout<<"\n\nКол-во четных элементов : "<<ch;
    cout<<"\nМассив из четных элементов: ";
    for (int i = 0; i <= ch-1; i++)
    {
        cout<<setw(3)<<p2[i];
    }
    cout<<"\n\n";
    system("pause");
    delete(p); delete(p1); delete(p2);
}

После того, как p[i] заменил на *(p+i) (для динамического массива), программа перестала запускаться


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
#include <iostream.h>
#include <iomanip.h>
#include <conio.h>
main() 
{
    int n,ch,nech;
    system("chcp 1251");                 
    system("cls");
    cout<<"Кол-во элементов массива: ";
    cin>>n;
    int *p=new int[n];          // выделение памяти под n элементов
    cout<<endl<<"\tВведите элементы массива\n";
    for (int i = 0; i < n; i++)
    {
        cin>>*(p+i);cout<<setw(2);
    }
 
    ch=0;nech=0;
    for (int i = 0; i < n; i++)
    {
        if (*(p+i)%2)                // проверка на нечетность элемента
        {
            nech++;                // подсчитывание кол-ва нечетных элементов
        }
        if (!*(p+i)%2) && p[i]!=0)  // проверка на четность элемента
        {
            ch++;                  // подсчитывание кол-ва четных элментов
        }
    }
 
    int *p1=new int[nech];      // выделение памяти для нечетных элементов
    int *p2=new int[ch];       // выделение памяти для четных элементов
    ch=0;nech=0;
 
    for (int i = 0; i < n; i++)
    {
        if (*(p+i)%2)             // проверка на нечетность элемента
        {
            *(p1+nech)=*(p+i);
            nech++;              // подсчитывание кол-ва нечетных элментов
        }
        if (!(*(p+i)%2) && *(p+i)!=0)        // проверка на четность элемента
        {
            *(p2+ch)=*(p+i);
            ch++;              // подсчитывание кол-ва четных элментов
        }
        
    }
    
    cout<<"\nКол-во нечетных элементов : "<<nech;
    cout<<"\nМассив из нечетных элементов: ";
    for (int i = 0; i <= nech-1; i++)
    {
        cout<<setw(3)<<*(p1+i);     
    }
 
    cout<<"\n\nКол-во четных элементов : "<<ch;
    cout<<"\nМассив из четных элементов: ";
    for (int i = 0; i <= ch-1; i++)
    {
        cout<<setw(3)<<*(p2+i);
    }
    cout<<"\n\n";
    system("pause");
    delete(p); delete(p1); delete(p2);
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
21.06.2012, 16:21     Динамический массив, исправить ошибку #2
строка 39 (в обоих вариантах) - выход за границу массива. Дальше даже не смотрю.
flock
3 / 1 / 1
Регистрация: 23.09.2011
Сообщений: 66
21.06.2012, 16:46  [ТС]     Динамический массив, исправить ошибку #3
Цитата Сообщение от Deviaphan Посмотреть сообщение
строка 39 (в обоих вариантах) - выход за границу массива. Дальше даже не смотрю.
А как можно исправить?

В первой программе проблем с запуском не было
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
21.06.2012, 17:15     Динамический массив, исправить ошибку #4
Цитата Сообщение от flock Посмотреть сообщение
В первой программе проблем с запуском не было
Это тебе просто не повезло. p[nech] при размере массива равном nech, это выход за границы его.

Цитата Сообщение от flock Посмотреть сообщение
А как можно исправить?
Чтобы исправить, просто не выходи за границы.

Добавлено через 1 минуту
Ой! Ты одни и те же переменные для разных целей использовал и я твой код не правильно понял... Но проблема всё равно с выходом за границы массива, так что в отладчике по шагам пробегай и ищи, где за границы выходишь.
flock
3 / 1 / 1
Регистрация: 23.09.2011
Сообщений: 66
21.06.2012, 17:25  [ТС]     Динамический массив, исправить ошибку #5
Цитата Сообщение от Deviaphan Посмотреть сообщение
Чтобы исправить, просто не выходи за границы.
Я не знаю как((
David Sylva
 Аватар для David Sylva
1280 / 942 / 51
Регистрация: 17.05.2012
Сообщений: 2,686
21.06.2012, 22:02     Динамический массив, исправить ошибку #6
Предлагаю свой вариант

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
#include <iostream> 
#include <ctime> 
#include <cstdlib> 
using namespace std; 
 
int main() 
{   
    setlocale(0, "rus");
    srand((unsigned) time(0));  
    int* array;  // основной массив
    int* array_ch; // массив чётных
    int* array_nch; // массив нечётных
    int size;       // размер массива
    int i;  
    int n = 0, k = 0;  // счётчики для вывода на экран
    int count_ch = 0; // счётчики элементов 
    int count_nch = 0;
    cout << "Введите размер массива" << endl; 
    cin >> size; 
 
    array = new int [size]; // динамически выделяем память
 
    for ( i = 0; i < size; i++) array[i] = rand() % 100; // заполняем случайными числами
 
    for ( i = 0; i < size; i++) cout << array[i] << " ";  // выводим на экран
 
    cout << endl << endl;
 
    for ( i = 0; i < size; i++) 
        if(array[i] % 2 == 0) // считаем количество чётных и нечётных
            count_nch++; 
        else 
            count_ch++;  
 
    array_ch = new int [count_ch+1]; // динамически выделяем память
    array_nch = new int [count_nch+1]; 
 
    for ( i = 0; i < size; i++) 
        if(array[i] % 2 == 0) 
            array_nch[n++] = array[i]; // сортируем по массивам
        else 
            array_ch[k++] = array[i];  
 
    for ( i = 0; i < count_ch; i++) // выводи массив чётных
        cout << array_ch[i] << " "; 
 
     cout << endl; 
 
     for ( i = 0; i < count_nch; i++) // выводм массив нечётных
         cout << array_nch[i] << " ";  
 
     system("Pause");
}
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.06.2012, 23:18     Динамический массив, исправить ошибку #7
В 25 строке одной скобки не хватает. Нужно так: if (!(*(p+i)%2) && p[i]!=0)
А так всё работает. Никаких выходов за границы массива нет.
flock
3 / 1 / 1
Регистрация: 23.09.2011
Сообщений: 66
22.06.2012, 00:07  [ТС]     Динамический массив, исправить ошибку #8
David Sylva, alsav22, ,большое спасибо)
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.06.2012, 02:21     Динамический массив, исправить ошибку #9
Ещё добавлю. Ноль является чётным числом, поэтому не следует его исключать при проверке на чётность.

Добавлено через 44 минуты
David Sylva, не понял, зачем в 35 и 36 строках выделяется памяти на 1 больше, чем количество чётных или нечётных?
David Sylva
 Аватар для David Sylva
1280 / 942 / 51
Регистрация: 17.05.2012
Сообщений: 2,686
22.06.2012, 09:54     Динамический массив, исправить ошибку #10
aslan22 ты правильно подметил, на 1 больше не надо.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.06.2012, 16:51     Динамический массив, исправить ошибку
Еще ссылки по теме:

C++ Динамический массив выдаёт ошибку
C++ Динамический массив - найти ошибку в коде
Динамический массив: программа выдает ошибку памяти C++

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

Или воспользуйтесь поиском по форуму:
flock
3 / 1 / 1
Регистрация: 23.09.2011
Сообщений: 66
22.06.2012, 16:51  [ТС]     Динамический массив, исправить ошибку #11
Ребят, а не поможете в этой же программе
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
#include <iostream.h>
#include <iomanip.h>
#include <conio.h>
main() 
{
    int n,ch,nech;
    system("chcp 1251");                 
    system("cls");
    cout<<"Кол-во элементов массива: ";
    cin>>n;
    int *p=new int[n];          // выделение памяти под n элементов
    cout<<endl<<"\tВведите элементы массива\n";
    for (int i = 0; i < n; i++)
    {
        cin>>*(p+i);cout<<setw(2);
    }
 
    ch=0;nech=0;
    for (int i = 0; i < n; i++)
    {
        if (*(p+i)%2)                // проверка на нечетность элемента
        {
            nech++;                // подсчитывание кол-ва нечетных элементов
        }
        if (!(*(p+i)%2) && p[i]!=0)  // проверка на четность элемента
        {
            ch++;                  // подсчитывание кол-ва четных элментов
        }
    }
 
    int *p1=new int[nech];      // выделение памяти для нечетных элементов
    int *p2=new int[ch];       // выделение памяти для четных элементов
    ch=0;nech=0;
 
    for (int i = 0; i < n; i++)
    {
        if (*(p+i)%2)             // проверка на нечетность элемента
        {
            *(p1+nech)=*(p+i);
            nech++;              // подсчитывание кол-ва нечетных элментов
        }
        if (!(*(p+i)%2) && *(p+i)!=0)        // проверка на четность элемента
        {
            *(p2+ch)=*(p+i);
            ch++;              // подсчитывание кол-ва четных элментов
        }
        
    }
    
    cout<<"\nКол-во нечетных элементов : "<<nech;
    cout<<"\nМассив из нечетных элементов: ";
    for (int i = 0; i <= nech-1; i++)
    {
        cout<<setw(3)<<*(p1+i);     
    }
 
    cout<<"\n\nКол-во четных элементов : "<<ch;
    cout<<"\nМассив из четных элементов: ";
    for (int i = 0; i <= ch-1; i++)
    {
        cout<<setw(3)<<*(p2+i);
    }
    cout<<"\n\n";
    system("pause");
    delete(p); delete(p1); delete(p2);
}
Разработать программу с использованием внешнего интерфейса.

Входные данные должны вводиться из файла.
Выходные данные должны выводиться в файл.
Входной и выходной файлы - текстовые.
С клавиатуры вводится только имена файлов.
Обеспечить в программе многовариантную обработку данных, т.е. во входном файле должны находиться не один вариант данных, а любое количество вариантов данных.
В выходном файле должны находиться все варианты данных в соответствии с входным файлом.Выходной файл должен быть оформлен в виде протокола, т.е. в нем должны быть представлены:
- наименование программы;
- дата и время запуска программы;
- входные данные;
- промежуточные данные (в случае необходимости);
- выходные данные в формализованном виде;
- время работы программы (в крайнем случае, время окончании работы программы);
- каждый вариант данных должен быть разделен от другого варианта разделителем.
Yandex
Объявления
22.06.2012, 16:51     Динамический массив, исправить ошибку
Ответ Создать тему
Опции темы

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