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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Ilya123
0 / 0 / 0
Регистрация: 15.12.2010
Сообщений: 45
#1

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

08.05.2013, 14:51. Просмотров 293. Ответов 6
Метки нет (Все метки)

Здравствуйте, программа не правильно выводит на экран обработанный массив. Пункт 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;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.05.2013, 14:51
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибка в одноиерном динамическом массиве (C++):

Ошибка в динамическом массиве - C++
Проблема при добавлении сотрудника. Первый сотрудник добавляется просто прекрасно, а вот при записи второго сотрудника выдает ошибку и...

Ошибка присваивания в динамическом массиве структур - C++
Доброго времени суток! Я новичок в программировании, прошу не пинать сильно :) Изучаю С++ по книге С.Прата &quot;Язык программирования С++....

В динамическом массиве удалить N элементов, начиная с номера K (ошибка) - C++
Помогите, как исправить ошибку? Нужно из массива arr , который перед этим формируется рандомно. удалить N элементов начиная с номера K. у...

Функция для удаления элемента в двумерном динамическом массиве. В чем ошибка? - C++
функция для удаления элемента в двум дин массиве (пока только часть в которой указывается какой надо удалить элемент). пишет IntelliSense:...

Ошибка в программе. Нужно добавить строку в динамическом массиве в указанную пользователем позицию - C++
Вот то , что у меня есть. Выводит массив до pos и выкидывает. #include &lt;iostream&gt; #include &lt;time.h&gt; #include &lt;string&gt; ...

Хочу чтобы в динамическом массиве вводились мои значения, вылазит ошибка об отправлении отчёта - C++
Работаю на visual c++ 6.0 ,прогу мне нужно писать через source file. Суть такова: динамический массив размером n на k,и хочу ввести в него...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Genn55
367 / 214 / 41
Регистрация: 26.12.2012
Сообщений: 708
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
 ;
не проверял ,но возможно это и есть ошибка.
1
Ilya123
0 / 0 / 0
Регистрация: 15.12.2010
Сообщений: 45
08.05.2013, 17:34  [ТС] #3
Не думаю что ошибка сдесь, потому что до шага 4 не доходит. А выводе массива newArr [m+n] очень малые и очень большие числа, которых не должно быть. Но всё равно спасибо за найденные ошибки.
Кликните здесь для просмотра всего текста
0
Genn55
367 / 214 / 41
Регистрация: 26.12.2012
Сообщений: 708
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[]
1
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");
}
0
Genn55
367 / 214 / 41
Регистрация: 26.12.2012
Сообщений: 708
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;
1
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;
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.05.2013, 10:28
Привет! Вот еще темы с ответами:

Не могу найти ошибку с подсчетом суммы элементов в интервале[a,b] в динамическом одномерном массиве массиве. - C++
#include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;stdlib.h&gt; #include &lt;time.h&gt; #include &lt;iomanip&gt; #include &lt;stdio.h&gt; #include...

Сдвиг в динамическом массиве - C++
Добрый день) Сразу оговорюсь что честно пользовался поиском. Если у меня проблемы со зрением - прошу указать соответствующую тему. Спасибо....

Реализация стека в динамическом массиве - C++
Условие такое: Помогите для начала хотя бы разобраться, как реализуется стек в динамическом массиве, а то чет совсем не могу въехать с...

Преобразование типов в динамическом массиве - C++
Имеется динамический массив unsigned char * buffer = new unsigned char ; size - это размер массива вычисляется отдельно ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
09.05.2013, 10:28
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru