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

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

Восстановить пароль Регистрация
 
inq
1 / 1 / 0
Регистрация: 27.06.2011
Сообщений: 32
09.04.2013, 11:56     Запись в массив #1
Всем привет!
Задача:
Есть сотрудники,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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.04.2013, 11:56     Запись в массив
Посмотрите здесь:

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

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

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

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

Я хочу понять, каким способом правильней добавить новый объект в массив.
ioioioi
 Аватар для ioioioi
96 / 28 / 6
Регистрация: 25.06.2010
Сообщений: 101
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, зачем вам еще?
Кудаив
328 / 405 / 24
Регистрация: 27.05.2012
Сообщений: 1,162
Завершенные тесты: 2
09.04.2013, 13:37     Запись в массив #5
inq, обязателен массив? а если использовать std::vector или самому сделать обертку над массивом
ioioioi
 Аватар для ioioioi
96 / 28 / 6
Регистрация: 25.06.2010
Сообщений: 101
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 код не компилил

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

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

Добавлено через 2 минуты
Кудаив, до такого мой скилл еще не дорос о.о
Кудаив
328 / 405 / 24
Регистрация: 27.05.2012
Сообщений: 1,162
Завершенные тесты: 2
09.04.2013, 13:47     Запись в массив #8
inq, std::vector использовать можно, нет?
ioioioi
 Аватар для ioioioi
96 / 28 / 6
Регистрация: 25.06.2010
Сообщений: 101
09.04.2013, 13:49     Запись в массив #9
Цитата Сообщение от inq Посмотреть сообщение
Значит, мне все время копировать массивы один в другой и на индекс выше добавлять новое значение?
Либо так, либо все-таки списки. Очень рекомендую списки)
Тот метод что я описал затратен с точки зрения памяти и процессорного времени в момент добавления.
Списки позволяют добавлять элементы за константное время без лишних затрат памяти (не считая указателей). Однако доступ к произвольному элементу в них медленнее.
Попробуйте использовать std::vector (обертка над массивом) или std::list (списки).
Сравните их и выберите что вам больше подходит.
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(тут мой объект);
Кудаив
328 / 405 / 24
Регистрация: 27.05.2012
Сообщений: 1,162
Завершенные тесты: 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]
}
inq
1 / 1 / 0
Регистрация: 27.06.2011
Сообщений: 32
09.04.2013, 14:06  [ТС]     Запись в массив #12
Кудаив, спасибо! подскажите, могу ли я здесь -
C++
1
v.push_back(i);
передать свой объект Foo ?Если да, то как мне вывести его поля?
Кудаив
328 / 405 / 24
Регистрация: 27.05.2012
Сообщений: 1,162
Завершенные тесты: 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();
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(), а затем снова добавить новый объект?

Спасибо!
Кудаив
328 / 405 / 24
Регистрация: 27.05.2012
Сообщений: 1,162
Завершенные тесты: 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];
inq
1 / 1 / 0
Регистрация: 27.06.2011
Сообщений: 32
09.04.2013, 15:20  [ТС]     Запись в массив #16
Кудаив,
C++
1
2
3
for(int i = 0; i < v.size(); ++i)
 
test.cpp:14:27: предупреждение: сравнение знакового и беззнакового целых выражений [-Wsign-compare]
Кудаив
328 / 405 / 24
Регистрация: 27.05.2012
Сообщений: 1,162
Завершенные тесты: 2
09.04.2013, 15:23     Запись в массив #17
потому как size() возвращает size_t
C++
1
typedef unsigned int size_t;
заменишь int на unsigned и все здорово
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.04.2013, 20:46     Запись в массив
Еще ссылки по теме:

C++ Запись строки в массив
Запись слов в массив C++
C++ Запись файла в массив С++

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

Или воспользуйтесь поиском по форуму:
inq
1 / 1 / 0
Регистрация: 27.06.2011
Сообщений: 32
09.04.2013, 20:46  [ТС]     Запись в массив #18
Кудаив, Отлично,спасибо, не знал о таком.

Добавлено через 1 час 20 минут
Кудаив,
Компилит, но при сборке такие ошибки:
test.cpp.text+0x29): undefined reference to `People::People()'
test.cpp.text+0x57): undefined reference to `People::People()'

test.cpp
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <string.h>
#include "people.h"
#include <vector>
using namespace std;
 
int main (){
 
vector<People*> v;
v.push_back(new People());
 
v.push_back(new People());
 cout<< v.size()<<endl; 
 
 
for(unsigned i = 0; i < v.size(); ++i)
    cout<<v[i]<<endl;
 
return 0;
 
}


people.h :
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
class People{ 
   public: 
   People();
   ~People();
   int get_pay();
   
   private:
   char name[30];
   int pay;
};


people.cpp :

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
#include "people.h"
#include <iostream>
using namespace std;
 
People::People(){
    cout<<"Run"<<endl;}
People::~People(){
    cout<<"Del"<<endl;}


Добавлено через 3 часа 57 минут
Фуух! Ошибку понял, реализация класса не подтягивалась > <
Yandex
Объявления
09.04.2013, 20:46     Запись в массив
Ответ Создать тему
Опции темы

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