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

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

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

Запись в массив - C++

09.04.2013, 11:56. Просмотров 1291. Ответов 17
Метки нет (Все метки)

Всем привет!
Задача:
Есть сотрудники,id каждого надо запихнуть в массив. Сколько сотрудников заранее не известно.

После добавления нового id будет предложение добавить еще одного сотрудника.
Верно ли и можно ли делать так:

Привожу зачаток программы, который добавляет новый элемент
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <string.h>
using namespace std;
 
int main ()
{
int b = 1;  
int a[b];
    for(int i=0; i<b; i++){
        a[i] = i;
    cout<<a[i]<<endl;   
    }
int r = sizeof(a)/sizeof(b); // КОл-во элем массива
cout<<r<<endl;
a[r+1] = 33; // Тут я к кол-ву элементов массива добавляю еще один
cout<<a[r+1]<<endl;
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.04.2013, 11:56
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Запись в массив (C++):

Запись в массив - C++
Добрый день , как записать в массив типа char &quot;user_pref(&quot;intl.charsetmenu.mailview.cache&quot;, &quot;UTF-8&quot;);&quot; при компиляции ошибки вылазят , я...

Запись в массив - C++
int Count = 0; scanf_s(&quot;%d&quot;, &amp;Count); int *arrayUch = new int; for (int i = 0; i &lt; Count; i++) { scanf_s(&quot;%d&quot;,...

Запись в массив - C++
Здравствуйте. Задан одномерный массив double P; Есть цикл while, в котором под разными if рассчитывается значение РР1. ...

Запись в массив - C++
Дана строка &quot;tre,yt&quot; Как записать в один массив {tre,yt} и в другой {,}

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

Запись времени в массив - C++
Задача: В течении одной минуты с интервалом в 10 секунд программа должна записывать текущее время с компьютера в массив. А по истечению...

17
ioioioi
96 / 28 / 6
Регистрация: 25.06.2010
Сообщений: 104
09.04.2013, 13:07 #2
нет, так делать нельзя)
Тут вам помогут или динамический массив или списки.
К примеру вот дурацкий, но зато очевидный способ (привожу этот пример, потому что в вашем задании сказано "массив")
есть массив длиной n, требуется занести в него еще одно значение.
создаем новый массив длиной n+1, копируем в него старый массив, старый массив удаляем, заносим в новый массив значение n+1.
медленно и просто.

Со списками в данном случае будет правильнее.
1
inq
1 / 1 / 0
Регистрация: 27.06.2011
Сообщений: 32
09.04.2013, 13:16  [ТС] #3
Цитата Сообщение от ioioioi Посмотреть сообщение
нет, так делать нельзя)
Тут вам помогут или динамический массив или списки.
К примеру вот дурацкий, но зато очевидный способ (привожу этот пример, потому что в вашем задании сказано "массив")
есть массив длиной n, требуется занести в него еще одно значение.
создаем новый массив длиной n+1, копируем в него старый массив, старый массив удаляем, заносим в новый массив значение n+1.
медленно и просто.

Со списками в данном случае будет правильнее.
Почему нельзя?

Списки, вы имеете ввиду структуры? Если да, то я поясню:
Операции будут производится с объектами(работники) т.е используются классы.

Я хочу понять, каким способом правильней добавить новый объект в массив.
0
ioioioi
96 / 28 / 6
Регистрация: 25.06.2010
Сообщений: 104
09.04.2013, 13:36 #4
структуры, классы... какая разница? Это почти одно и тоже.
Нельзя, потому что массив вы задаете заранее определенного размера.
int r = sizeof(a)/sizeof(b);
эта строка вернет вам по сути размер вашего массива.
Другими словами, если массив имеет размер 1, единственный индекс по которому можно будет записать значение в массив, будет 0.
a[0] = x;
Нельзя записать в первую позицию какое то значение:
a[1] = x; - ошибка по сегфолту, т.к. выход за пределы массива.

Если b изменить на 4, например, то r так же станет равно 4. Но ведь индексы массива могут быть только такими: {0, 1, 2, 3}. Нет четвертого и тем более пятого (r+1) индекса.

Таким образом, если вы не хотите пользоваться списками, используйте динамические массивы.

Кстати, строка
int r = sizeof(a)/sizeof(b); // КОл-во элем массива
бесполезная. При изменении типов, она уже будет давать не верный результат. К тому же количество элементов массива у вас уже хранится в переменной b, зачем вам еще?
0
Кудаив
331 / 408 / 24
Регистрация: 27.05.2012
Сообщений: 1,168
Завершенные тесты: 2
09.04.2013, 13:37 #5
inq, обязателен массив? а если использовать std::vector или самому сделать обертку над массивом
0
ioioioi
96 / 28 / 6
Регистрация: 25.06.2010
Сообщений: 104
09.04.2013, 13:39 #6
Ваш код можно модернизировать следующим образом, введя временный указатель aa:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int *a = new int[b];
    for(int i=0; i<b; i++){
        a[i] = i;
    cout<<a[i]<<endl;   
    }
    int r = sizeof(a)/sizeof(b); // КОл-во элем массива
    cout<<r<<endl;
    int *aa = new int [r+2];
    for(int i=0; i<b; i++){
        aa[i] = a[i];
    delete[] a;
    a = aa;
    a[r+1] = 33; // Тут я к кол-ву элементов массива добавляю еще один
    cout<<a[r+1]<<endl;
PS код не компилил

Вообще в вашем случае правильнее всего использовать списки. Или вектор, как посоветовали выше.
0
inq
1 / 1 / 0
Регистрация: 27.06.2011
Сообщений: 32
09.04.2013, 13:42  [ТС] #7
Цитата Сообщение от ioioioi Посмотреть сообщение
Нельзя, потому что массив вы задаете заранее определенного размера.
Да вот дело в том, что я не знаю заранее его размер!

Значит, мне все время копировать массивы один в другой и на индекс выше добавлять новое значение?

Добавлено через 2 минуты
Кудаив, до такого мой скилл еще не дорос о.о
0
Кудаив
331 / 408 / 24
Регистрация: 27.05.2012
Сообщений: 1,168
Завершенные тесты: 2
09.04.2013, 13:47 #8
inq, std::vector использовать можно, нет?
0
ioioioi
96 / 28 / 6
Регистрация: 25.06.2010
Сообщений: 104
09.04.2013, 13:49 #9
Цитата Сообщение от inq Посмотреть сообщение
Значит, мне все время копировать массивы один в другой и на индекс выше добавлять новое значение?
Либо так, либо все-таки списки. Очень рекомендую списки)
Тот метод что я описал затратен с точки зрения памяти и процессорного времени в момент добавления.
Списки позволяют добавлять элементы за константное время без лишних затрат памяти (не считая указателей). Однако доступ к произвольному элементу в них медленнее.
Попробуйте использовать std::vector (обертка над массивом) или std::list (списки).
Сравните их и выберите что вам больше подходит.
1
inq
1 / 1 / 0
Регистрация: 27.06.2011
Сообщений: 32
09.04.2013, 13:59  [ТС] #10
Кудаив, никаких ограничений на задачу не было.
почитал про вектор, правильно ли я понял, что ответом на мой вопрос будет что-то типо этого:

C++
1
2
3
4
5
 int arr[];
  // Инициализирование вектора с использованием массива
  vector<int> numbers(arr, arr+1);
  // Добавляем числа в вектор
  numbers.push_back(тут мой объект);
Добавлено через 8 минут
подправил код:

Кликните здесь для просмотра всего текста
C++
1
2
3
4
  // Инициализирование вектора с использованием массива
  vector<int> numbers;
  // Добавляем числа в вектор
  numbers.push_back(тут мой объект);
0
Кудаив
331 / 408 / 24
Регистрация: 27.05.2012
Сообщений: 1,168
Завершенные тесты: 2
09.04.2013, 14:02 #11
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <string.h>
#include <vector>
using namespace std;
 
int main ()
{
int b = 1;  
vector<int> v;
    for(int i=0; i<b; i++){
        v.push_back(i);
    cout<<v[i]<<endl;   
    }
 
v.push_back(33); // Тут я к кол-ву элементов массива добавляю еще один
cout<<v.at(v.size() - 1)<<endl;// тоже что v[v.size - 1]
}
1
inq
1 / 1 / 0
Регистрация: 27.06.2011
Сообщений: 32
09.04.2013, 14:06  [ТС] #12
Кудаив, спасибо! подскажите, могу ли я здесь -
C++
1
v.push_back(i);
передать свой объект Foo ?Если да, то как мне вывести его поля?
0
Кудаив
331 / 408 / 24
Регистрация: 27.05.2012
Сообщений: 1,168
Завершенные тесты: 2
09.04.2013, 14:19 #13
C++
1
2
3
4
vector<Foo> v;
Foo bar;
v.push_back(bar);
v[0].some_method();
1
inq
1 / 1 / 0
Регистрация: 27.06.2011
Сообщений: 32
09.04.2013, 14:30  [ТС] #14
Кудаив,

Извините, можно еще немного подробней:

Вот набросок класса:
C++
1
2
3
4
5
6
7
8
9
10
class Man{ 
   public: 
   Man();
   ~Man();
   int get_pay();
   
   private:
   char name[30];
   int pay;
};
Как создать новый объект и записать его в вектор, а затем обратится к функции get_pay(), а затем снова добавить новый объект?

Спасибо!
0
Кудаив
331 / 408 / 24
Регистрация: 27.05.2012
Сообщений: 1,168
Завершенные тесты: 2
09.04.2013, 14:47 #15
inq, удобнее тогда наверно так...
C++
1
2
3
4
5
6
7
8
9
...
vector<Man*> v;
v.push_back(new Man());
v[0]->get_pay();
v.push_back(new Man());
...
//и не забыть
for(int i = 0; i < v.size(); ++i)
    delete v[i];
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.04.2013, 14:47
Привет! Вот еще темы с ответами:

Запись из файла в массив - C++
Есть программа которая создает базу данных, состоящая из структур struct info { char phone; // Телефон char email; // Емайл }; ...

Запись из файла в массив - C++
как записать слова из файла в массив,чтобы потом с ними работать?

Запись числа в массив - C++
Есть массив ac; Нужно записать число интовое число в массив, как это сделать? :wall:

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


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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