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

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

Войти
Регистрация
Восстановить пароль
 
newb_programmer
237 / 237 / 19
Регистрация: 03.09.2011
Сообщений: 555
#1

Добавление записей в массив - C++

29.09.2013, 13:42. Просмотров 325. Ответов 5
Метки нет (Все метки)

Дан массив целых чисел размером 10 элементов. Пользователь вводит новые элементы с клавиатуры, которые необходимо добавлять в конец исходного массива. Реализовать нужно через функцию добавления одного элемента, которая циклично вызывается. Код:
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
#include <iostream>
using namespace std;
void push(int*, int, int&);
void main() {
    int size=10,n;
    int& rsize=size;
    int* arr=new int[size];
    for (int i=0;i<size;i++) //заполнение массива
        arr[i]=i*i;
    for (int i=0;i<size;i++) 
        cout<<arr[i]<<"\n";
    do {                    //пока пользователь не введет 0, нужно записывать значения в массив по одному
        cout<<"enter n:\n";
        cin>>n;
        push(arr,n,rsize);  //ф-ция добавления элемента
        cout<<"Size is"<<size<<"\n";
        for (int i=0;i<size;i++) 
            cout<<arr[i]<<"\n";
    } while (n!=0);
    delete [] arr;
    system("pause");
}
 
void push(int* arr, int n,int& size) {
    size++;
    int* arr2=new int[size];        //создание копии исходного массива
    for (int i=0;i<size-1;i++)      //копирвоание элементов
        arr2[i]=arr[i]; 
    arr2[size-1]=n;                 //добавление нового элемента в конец
    delete [] arr;                  //удаляем исходный массив
    arr=new int[size];              //выделяем память под новый размер исходного массива
    for (int i=0;i<size;i++)        //копирвоание элементов
        arr[i]=arr2[i];
    delete [] arr2;                 //удаление вспомогательного массива
}
Проблемы:
1-Если вызывать функцию один раз (без цикла) получим на экран мусор, ХОТЯ через дебагер пошагово все нормально выводиться!! (картинка 2)
2-При следующем вызове функции вылетает окно с ошибкой... (картинка 1)
0
Миниатюры
Добавление записей в массив  
Изображения
 
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.09.2013, 13:42
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Добавление записей в массив (C++):

Добавление записей в файл. (Исправить ошибку) - C++
Приветствую всех. Такая проблема: Не добавляется запись в конец файла. Вот код: void addknigi(knigi sx, int n) { knigi p, *k; ...

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

Телефонная книга: просмотр, поиск, добавление записей - C++
Доброго вечера. Такая проблема. Завтра в универ нужно сдать программу, с которой вышла полная запара, т.к. не имею представления как...

Структуры. Дан массив записей, содержащих дату и время. Упорядочить этот массив в порядке «возрастания» - C++
Дан массив записей, содержащих дату (число, месяц, год) и время (час, минута, секунда). Упорядочить этот массив в порядке «возрастания».

Добавление в файл и удаление из файла записей о объектах структуры "Фильм" - C++
#include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;string.h&gt; #include &lt;stdlib.h&gt; using namespace std ; int const col=4; struct...

Создать массив записей - C++
Создать массив записей A(n),n&lt;=20, каждая запись содержит сведения о книгах: автор, название и год издания. Распечатать массив на экране....

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Fyret
184 / 170 / 13
Регистрация: 30.07.2013
Сообщений: 359
29.09.2013, 14:02 #2
Указатель передается по значению, arr в main и в push - разные указатели, хотя изначально указывают на одну и ту же область памяти. Исправить можно так:
C++
1
2
3
4
void push(int*&, int, int&);
...
void push(int*& arr, int n,int& size)
...

Не по теме:

И саму функцию push можно оптимизировать: memcpy, однократное выделение и освобождение памяти.

1
newb_programmer
237 / 237 / 19
Регистрация: 03.09.2011
Сообщений: 555
29.09.2013, 14:23  [ТС] #3
Цитата Сообщение от Fyret Посмотреть сообщение
Указатель передается по значению, arr в main и в push - разные указатели, хотя изначально указывают на одну и ту же область памяти. Исправить можно так:
C++
1
2
3
4
void push(int*&, int, int&);
...
void push(int*& arr, int n,int& size)
...

Не по теме:

И саму функцию push можно оптимизировать: memcpy, однократное выделение и освобождение памяти.

можете для тех кто в танке пояснить про эту ситуацию с указателями. если "почему не работало" кое как может и было понятно, то "почему заработало" вообще не ясно=)))

и по memcpy-попробовал впихнуть, опять на экране мусор...если я правильно понял смысл функции memcpy.
C++
1
2
3
4
5
6
7
8
9
10
void push(int*& arr, int n,int& size) {
    size++;
    int* arr2=new int[size];
    memcpy(arr2,arr,sizeof(arr));
    arr2[size-1]=n;                 
    delete [] arr;
    arr=new int[size];
    memcpy(arr,arr2,sizeof(arr2));
    delete [] arr2;
}
0
Fyret
184 / 170 / 13
Регистрация: 30.07.2013
Сообщений: 359
29.09.2013, 14:37 #4
Передача данных по значению и по ссылке.

C++
1
2
3
4
5
6
7
8
9
void push( int*& arr, int n,int& size )
{
    int* arr2=new int[++size];
    memcpy( arr2, arr, (size-1)*sizeof(int) );
    arr2[size-1]=n;     
 
    delete[] arr;
    arr = arr2;
}
Смысл memcpy понят правильно, но sizeof(arr) - это размер указателя, т.е. 4 или 8 байт.
1
newb_programmer
237 / 237 / 19
Регистрация: 03.09.2011
Сообщений: 555
29.09.2013, 14:51  [ТС] #5
Цитата Сообщение от Fyret Посмотреть сообщение
C++
1
void push( int*& arr  ...)
тоесть это мы передаем в ф-цию ссылку на указатель?
0
Fyret
184 / 170 / 13
Регистрация: 30.07.2013
Сообщений: 359
29.09.2013, 14:56 #6
Цитата Сообщение от newb_programmer Посмотреть сообщение
мы передаем в ф-цию ссылку на указатель?
Да.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.09.2013, 14:56
Привет! Вот еще темы с ответами:

Массив записей.Имитационное моделирование - C++
Всем привет,такая проблема , я не знаю как добавить массив записей в класс а потом его вызывать из класса и присваивать элементы массива к...

Создать массив записей размером N с информацией о студенте - C++
Создать массив записей размером N с информацией о студенте: ФИО (string), Пол (char), год рождения (Integer), стипендия (real), адрес....

Отсортировать массив записей по содержимому поля surname - C++
Нужно сделать сортировку! Чтобы выведенные фамилии были в алфавитном порядке! Не понимаю как её впихнуть сюда #include &lt;iostream&gt; using...

Добавление элемента в массив - C++
Добавление элемента с номеров К в массив из рандомных чисел! Я что то не могу понять! Застопорилась на этом задании и все! Дальше не...


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

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

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