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

Ошибка в одноиерном динамическом массиве - C++

Восстановить пароль Регистрация
 
Ilya123
0 / 0 / 0
Регистрация: 15.12.2010
Сообщений: 45
08.05.2013, 14:51     Ошибка в одноиерном динамическом массиве #1
Здравствуйте, программа не правильно выводит на экран обработанный массив. Пункт 1 выполняется, пункт 2 выполняется, пункт 3 выполняется, при повторном пукте 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
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
#include "stdafx.h"
#include <iostream>
#include <stdlib.h>
 
using namespace std;
 
// Определение функции формирования одномерного динамического массива
int *form_arr (int m)
{
    int *arr; arr=new int[m]; cout << endl;
    return arr;
}
// Определение функции заполнения массива (псевдослучайными числами в диапазоне)
void init_arr (int *arr, int m)
{
    for (int i = 0; i < m; i++) {arr[i] = rand()%100; }
cout << endl;
}
// Функция создания 2 массива
int add_elem (int n,int m, int*arr,int k)
{
    // Создание временного массива для хранения новых елементов 
        int *Arr = new int[n];
        // Ввод значений новых елементов
        cout << "Элементы К:\n";
        
     for (int i = 0; i<n; i++)  
{
Arr[i]=rand()%100;
cout<< Arr[i] <<" ";}
     cout<<endl<<endl;
        // Создание нового массива, который будет 
 
        // содержать елементы начального массива и 
 
        // новые елементы массива новых елементов
 
        int* newArr = new int[m + n];
 
        // Для прохода по массиве новых елементов
 
        int count = 0;
 
 
 
        for(int i = 0; i < m + n; i++) {
 
                // Вставляем елементы старого массива в новый
 
                if(i < k) {
 
                        newArr[i] = arr[i];
 
                }
 
                // Вставляем новые елементы из массива новых елементов
 
                else if(i >= k && i < k + n) {
 
                        newArr[i] = Arr[count];
 
                        count++;
 
                }
 
                // Вставляем елементы старого массива в новый
 
                else {
 
                        newArr[i] = arr[i - count];
 
                }
                
        }
        
       return 0;
}
 
// Функция вывода массива на экран
void print_arr (int *Arr, int m)
{
    cout << "Массив имеет вид: " << endl << endl;
    for (int i=0; i<m; i++)
    {
        cout << Arr[i] << " ";
    }
        cout << endl << endl;
}
// Функция вывода массива на экран
int print_arr2 (int m, int n)
        {   int *newArr=NULL;
            newArr = new int[]; 
    for(int i =0 ; i < m + n; i++) {
             cout << "[" << i << "] -> " << newArr[i];
             cout << "\n";      
}
 cout << endl << endl;
 return 0;
}
 
// Функция удаления массива 
void del_arr (int *Arr,int *arr)
{
    delete[] arr;
    delete[] Arr;
}
// Определение функции main()
int main()
{
    setlocale (0,"");
    int m=0,n=0,k=0,x=0, action;
    int act_point=0;
    int *Arr=NULL;
    int *arr=NULL;
    int *newArr=NULL;
    do
    {
    cout << "1. Формирование массива." << endl;
    cout << "2. Печать массива." << endl;
    cout << "3. Добавление в массив." << endl;
    cout << "4. Выход." << endl;
    cout << "-------------------------------" << endl;
    cout << "Выбирите действие из меню: ";
    cin >> action;
        if ((action < 1) || (action > 4))
        {
            cout << endl << "Нет такого действия в меню!" << endl;
        }
    cout << endl;
    switch (action)
    {
    case 1: if (act_point == 0)
                {
                    cout << "Введите количество элементов массива: ";
                    cin >> m;
            arr = form_arr (m);
            init_arr (arr, m);          
            act_point =1;
            break;}
            else {
                cout << "Массив уже был создан!" << endl << endl; break;
            }
    case 2: if (act_point == 0)
                           {
                cout << "Ошибка! Нет массива! Пожалуйста, создайте его." << endl << endl;
                break;
            }
            if (act_point == 1)
            {
                print_arr (arr, m); break;
            }
            else
            {print_arr2 (m,n);
                break;
          } 
    case 3: if (act_point == 0)
            {
                cout << "Нет массива. Пожалуйста, создайте его!" << endl << endl; break;
            }
            if (act_point == 1)
            {
      cout << "Введите индекс с которого начинаеться вставка (от 1 до "<<m-1<<"): ";
    cin >> k; 
    while ((k>m-1))
    {
        cout << "Вы ввели не корректное число "<<k<<". \nВведите индекс с которого начинаеться вставка (от 1 до "<<m-1<<"): ";
        cin >> k;   
    }
    x=m+n;
    cout << endl;
    cout << "Введите кол-во елементов для добавления: ";
    cin >> n;
    cout << endl;
                int r = add_elem (n, m, arr, k);
                
                    if (r!=0) 
                    {   
                        cout << endl;  
                    }                
                act_point=2;
             
                break;
            }       
            if (act_point == 2)
         {
              cout << "Массив уже обработан!" << endl << endl; break;
          }
    case 4: if (act_point != 0)
                {
                   del_arr (Arr,arr);
                    cout << "Завершение работы... Память очищена!" << endl << endl;
                }
            else
                {
                    cout << "Завершение работы..." << endl << endl;
                }
    } 
    } 
    while (action != 4);
    system ("pause");
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Genn55
341 / 188 / 37
Регистрация: 26.12.2012
Сообщений: 658
08.05.2013, 15:31     Ошибка в одноиерном динамическом массиве #2
Первое что бросилось в глаза
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
   case 4: if (act_point != 0)
                {
                   del_arr (Arr,arr);
                    cout << "Завершение работы... Память очищена!" << endl << endl;
                }
            else
                {
                    cout << "Завершение работы..." << endl << endl;
                }
    } 
    } 
    while (action != 4);
    system ("pause");
    return 0;
}
отсутствие оператора
C++
1
break
и
C++
1
 case 4:
будет выполняться до оператора
C++
1
 ;
не проверял ,но возможно это и есть ошибка.
Ilya123
0 / 0 / 0
Регистрация: 15.12.2010
Сообщений: 45
08.05.2013, 17:34  [ТС]     Ошибка в одноиерном динамическом массиве #3
Не думаю что ошибка сдесь, потому что до шага 4 не доходит. А выводе массива newArr [m+n] очень малые и очень большие числа, которых не должно быть. Но всё равно спасибо за найденные ошибки.
Кликните здесь для просмотра всего текста
Genn55
341 / 188 / 37
Регистрация: 26.12.2012
Сообщений: 658
08.05.2013, 19:28     Ошибка в одноиерном динамическом массиве #4
Мне не понятно что может делать это
C++
1
2
3
4
5
6
7
 else if(i >= k && i < k + n) {
 
                        newArr[i] = Arr[count];
 
                        count++;
 
                }
count у вас =0 ну и дальше я не понял.

Добавлено через 38 минут
Что то вся конструкция не понятна
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
    // Создание временного массива для хранения новых елементов 
        int *Arr = new int[n];
        // Ввод значений новых елементов
        cout << "Элементы К:\n";
        
     for (int i = 0; i<n; i++)  
{
Arr[i]=rand()%100;
cout<< Arr[i] <<" ";}
     cout<<endl<<endl;
        // Создание нового массива, который будет 
 
        // содержать елементы начального массива и 
 
        // новые елементы массива новых елементов
 
        int* newArr = new int[m + n];
 
        // Для прохода по массиве новых елементов
 
        int count = 0;
 
 
 
        for(int i = 0; i < m + n; i++) {
 
                // Вставляем елементы старого массива в новый
 
                if(i < k) {
 
                       
 
                }
 
                // Вставляем новые елементы из массива новых елементов
 
                else if(i >= k && i < k + n) {
 
                        newArr[i] = Arr[count];
 
                        count++;
 
                }
 
                // Вставляем елементы старого массива в новый
 
                else {
 
                        newArr[i] = arr[i - count];
 
                }
                
        }
C++
1
newArr[i] = Arr[count];
будет равен
C++
1
Arr[i]=rand()%100;
получается что временный массив уже заполнен и
C++
1
 newArr[i] = arr[i];
не понятно что куда пойдет.Если вы хотите переписать одно в другое надо сделать что то типа
C++
1
2
3
new=A[];
                             A[]= a[];
                             a[]=new;
в этом случае содержимое A[]перепишется в a[]
Ilya123
0 / 0 / 0
Регистрация: 15.12.2010
Сообщений: 45
08.05.2013, 19:50  [ТС]     Ошибка в одноиерном динамическом массиве #5
Цитата Сообщение от Genn55 Посмотреть сообщение
Мне не понятно что может делать это
C++
1
2
3
4
5
6
7
 else if(i >= k && i < k + n) {
 
                        newArr[i] = Arr[count];
 
                        count++;
 
                }
count у вас =0 ну и дальше я не понял.

Добавлено через 38 минут
Что то вся конструкция не понятна
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
    // Создание временного массива для хранения новых елементов 
        int *Arr = new int[n];
        // Ввод значений новых елементов
        cout << "Элементы К:\n";
        
     for (int i = 0; i<n; i++)  
{
Arr[i]=rand()%100;
cout<< Arr[i] <<" ";}
     cout<<endl<<endl;
        // Создание нового массива, который будет 
 
        // содержать елементы начального массива и 
 
        // новые елементы массива новых елементов
 
        int* newArr = new int[m + n];
 
        // Для прохода по массиве новых елементов
 
        int count = 0;
 
 
 
        for(int i = 0; i < m + n; i++) {
 
                // Вставляем елементы старого массива в новый
 
                if(i < k) {
 
                       
 
                }
 
                // Вставляем новые елементы из массива новых елементов
 
                else if(i >= k && i < k + n) {
 
                        newArr[i] = Arr[count];
 
                        count++;
 
                }
 
                // Вставляем елементы старого массива в новый
 
                else {
 
                        newArr[i] = arr[i - count];
 
                }
                
        }
C++
1
newArr[i] = Arr[count];
будет равен
C++
1
Arr[i]=rand()%100;
получается что временный массив уже заполнен и
C++
1
 newArr[i] = arr[i];
не понятно что куда пойдет.Если вы хотите переписать одно в другое надо сделать что то типа
C++
1
2
3
new=A[];
                             A[]= a[];
                             a[]=new;
в этом случае содержимое A[]перепишется в a[]
Эту всю конструкцию использовал от готовой программы (рабочей),Попробую переделать по вашим данным. Спасибо
Кликните здесь для просмотра всего текста
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <ctime>
 
using namespace std;
 
 
 
int main(){
 
        setlocale(0, "Rus");
 
        // Ввод параметров начального массива
 
        int m;
 
        cout << "Введите размер массива: ";
 
        cin >> m;
int *arr; arr=new int[m]; cout << endl;
srand(time(0));
cout<<"Массив: "<<endl;
for (int i = 0; i < m; i++) {arr[i] = rand()%100; cout<< arr[i]  <<  " ";}
cout << endl;
 
        // Ввод кол-ва новых елементов
 
        int n;
 
        cout << "Введите кол-во елементов для добавления: ";
 
        cin >> n;
 
        // Ввод индекса с которого начинаеться вставка
 
        int k;
 
        cout << "Введите индекс с которого начинаеться вставка (от 0 до "<<m<<"): ";
 
        cin >> k;
                while (abs(k)>m)
    {
        cout<<"Введите индекс с которого начинаеться вставка (от 0 до "<<m<<"):  ";
        cin >> k;
        
    }
 
 
        // Создание временного массива для хранения новых елементов
 
        int* Arr = new int[n];
 
        // Ввод значений новых елементов
 
        cout << "Элементы К:\n";
        cout<<endl;
     for (int i = 0; i<n; i++)  
{
Arr[i]=rand()%100;
cout<< Arr[i] <<" ";}       
        
        
 
        // Создание нового массива, который будет 
 
        // содержать елементы начального массива и 
 
        // новые елементы массива новых елементов
 
        int* newArr = new int[m + n];
 
        // Для прохода по массиве новых елементов
 
        int count = 0;
 
 
 
        for(int i = 0; i < m + n; i++) {
 
                // Вставляем елементы старого массива в новый
 
                if(i < abs(k)) {
 
                        newArr[i] = arr[i];
 
                }
 
                // Вставляем новые елементы из массива новых елементов
 
                else if(i >= k && i < k + n) {
 
                        newArr[i] = Arr[count];
 
                        count++;
 
                }
 
                // Вставляем елементы старого массива в новый
 
                else {
 
                        newArr[i] = arr[i - count];
 
                }
 
        }
 
        // Удаляем начальный массив
 
        delete[] arr;
 
        // Удаляем временный массив новых елементов
 
        delete[]  Arr;
 
        // Выводим новый массив после вставки новых елементов в консоль
        cout<<endl;
        cout<<endl;
        cout << "Массив после добавления новых елементов: \n";
 
        for(int j = 0; j < m + n; j++) {
 
                cout << "[" << j << "] -> " << newArr[j];
 
                cout << "\n";       
 
}
system("pause");
}
Genn55
341 / 188 / 37
Регистрация: 26.12.2012
Сообщений: 658
08.05.2013, 20:33     Ошибка в одноиерном динамическом массиве #6
С функциями не все понятно.У вас функция заполнения массива ничего не передает только лишь печатает. Функция Создание временного массива для хранения новых элементов должно передавать
C++
1
 int
,а стоит
C++
1
return 0;
и в этой же функции по моему нужно добавить
C++
1
2
3
4
5
6
7
8
// Удаляем начальный массив
 
        delete[] arr;
 
        // Удаляем временный массив новых елементов
 
        delete[]  Arr;
count = 0;
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.05.2013, 10:28     Ошибка в одноиерном динамическом массиве
Еще ссылки по теме:

C++ Функция для удаления элемента в двумерном динамическом массиве. В чем ошибка?
C++ Хочу чтобы в динамическом массиве вводились мои значения, вылазит ошибка об отправлении отчёта
C++ В динамическом массиве удалить N элементов, начиная с номера K (ошибка)

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

Или воспользуйтесь поиском по форуму:
Ilya123
0 / 0 / 0
Регистрация: 15.12.2010
Сообщений: 45
09.05.2013, 10:28  [ТС]     Ошибка в одноиерном динамическом массиве #7
Кликните здесь для просмотра всего текста
Цитата Сообщение от Genn55 Посмотреть сообщение
С функциями не все понятно.У вас функция заполнения массива ничего не передает только лишь печатает. Функция Создание временного массива для хранения новых элементов должно передавать
C++
1
 int
,а стоит
C++
1
return 0;
и в этой же функции по моему нужно добавить
C++
1
2
3
4
5
6
7
8
// Удаляем начальный массив
 
        delete[] arr;
 
        // Удаляем временный массив новых елементов
 
        delete[]  Arr;
count = 0;

Нашёл ещё одну похожую программу, можно её переделать для моей?
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
//Функция добавления элементов в массив
int* addelements(int *mas_p,int sz,int nn,int kk)
{
    int s;
    //создание временного массива
    int* tmpm = crmassive(n+nn);
    //запись исходного массива во временный (чтобы не "сбить" указатель)
    for (int i=0;i<sz;i++)
    {
        tmpm[i]=mas_p[i];
    }
    //добавление элементов во временный массив
    for (s=sz+nn-1;s>kk;s--)
    {
        tmpm[s]=tmpm[s-nn];
    }
    for (s=kk;s<kk+nn;s++)
    {
        cout<<"Введите элемент №"<<s<<": ";
        cin>>tmpm[s];
    }
    modified=true;
    return tmpm;
}
Yandex
Объявления
09.05.2013, 10:28     Ошибка в одноиерном динамическом массиве
Ответ Создать тему
Опции темы

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