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

Расширить динамический массив - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
o33ik
138 / 5 / 1
Регистрация: 25.03.2013
Сообщений: 228
12.05.2013, 18:32     Расширить динамический массив #1
Есть програмка в которой можно внести даные про оформленые заявки на оренду машин. Каждая заявка ето обьект класа tz, Масив заявок создаеться динамично в обьекте класса prokat. Ввод и вывод информации я сделал. но надо сделать еще ф-цию добавления новой заявки. Когда я задаю размер массива то создаеться массив со стольких елементов, и потом массив полностью заполняеться. Можно увеличить размер етого массива во время работы программы не теряя введеные даные, чтоб можно было дописать в конец разшириного масива новые даные? Через файлы не хочу делать, так как ето очень долго и запутано для меня.

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
#include <iostream>
#include <string>
#include <conio.h>
 
using namespace std;
 
enum CATEGORY{family, sport, cabrio, jeep};
 
const int num = 5;
 
class DATE
 
{
private:
    
    int day, month, year;
public:
 
    DATE(void){};
    DATE(int _day, int _month, int _year) { day = _day; month = _month; year = _year; };
    ~DATE(){};
 
    int GetDay(){return day;}
    int GetMonth(){return month;}
    int GetYear(){return year;}
 
    DATE& SetDay (int _day){day=_day; return *this;};
    DATE& SetMonth (int _month){month=_month; return *this;};
    DATE& SetYear (int _year){year=_year; return *this;};
 
    void inputD(){cout<<"Enter date dd/mm/yy: ";cin>>day>>month>>year;};
    void showD(){cout<<endl; cout<<day<<"."<<month<<"."<<year;};
};
 
class CAR
{
    char corporation[15];
    char car_name[15];
    int price;
    int made_date;
public:
    void INP()
    {
        cout << "Enter car_name: ";
        cin >> corporation; 
        cout << "Enter car_model: ";
        cin >> car_name;
        cout << "Enter price: ";
        cin >> price;
        cout << "Enter made date: ";
        cin >> made_date;
    }
    void OUT()
    {
        cout << "\nCar name: " << corporation; 
        cout << "\nCar model: " << car_name;
        cout << "\nCar price: " <<price;
        cout << "\nCar made year: " <<made_date;
    }
};
 
class tz
{
    CATEGORY category;
    CAR car;
    DATE date;
    int rent_price;
    int rent_time;
    char car_regnumber[10];
public:
    void tz_data_inp(int counter)
    {
        cout << "\t\tStatement # " << counter+1 << endl;
        car.INP();
        cout << "Enter category of transport(family, sport, cabrio or jeep): ";
        while(true)
        {
            string str;
            cin >> str;
            if (str == "family") 
                {category = family; break;}
            if (str == "sport") 
                {category = sport; break;} 
            if (str == "cabrio") 
                {category = cabrio; break;}
            if (str == "jeep") 
                {category = jeep; break;}
            else {cout << "Incorrect word. Try again: "; 
            continue;}
        }
        date.inputD();
        cout << "Enter rent price: ";
        cin >> rent_price;
        cout << "Enter retn time: ";
        cin >> rent_time;
        cout << "Enter reg_number: ";
        cin >> car_regnumber;
    }
    void tz_data_out()
    {
        car.OUT();
        char* category_arr[]={"family", "sport", "cabrio", "jeep"};
        cout << "\nCar category: " << category_arr[category];
        date.showD();
        cout << "\nRent price: " << rent_price;
        cout << "\nRent time: " << rent_time;
        cout << "\nCar reg_number: " << car_regnumber << endl;
    }
};
 
class prokat
{ 
    char prokat_name[15];
public:
    tz* arr;
    prokat(int size)
    {
       arr = new tz[size];
    }
    void inp_data(int size)
    {
        cout << "Enter name of rent agency: ";
        cin >> prokat_name;
        for(int i=0;i<size;i++)
        {
            arr[i].tz_data_inp(i);
        }
    }
    void out_data(int size)
    {
        cout << "\nName of rent company: "<< prokat_name;
        for(int i=0;i<size;i++)
        {
            arr[i].tz_data_out();
        }
    }
};
 
int main()
{
    cout << "Enter array size: ";
    int size;
    cin >> size;
    cout << endl << endl;
    prokat obj(size);
    obj.inp_data(size);
    obj.out_data(size);
    getch();
    return 0;
}
Добавлено через 2 минуты
и еще одно, писал програму в VS2010, потом чтото случилось(незнаю что) и в визуалке програма перестала компилироваться. В деве все работает. в чем причина? ошибка, которую выдает визуалка:
Кликните здесь для просмотра всего текста
1>------ Build started: Project: LW4, Configuration: Debug Win32 ------
1> main.cpp
1>d:\інститут\ооп\лр2\lw4\lw4\main.cpp(148): warning C4996: 'getch': The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _getch. See online help for details.
1> c:\program files\microsoft visual studio 10.0\vc\include\conio.h(128) : see declaration of 'getch'
1>LINK : fatal error LNK1123: failure during conversion to COFF: file invalid or corrupt
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.05.2013, 18:32     Расширить динамический массив
Посмотрите здесь:

как расширить массив C++
Можно ли в классе создавать массив переменной длинны. Например динамический массив? C++
Массив: передать динамический массив в функцию и записать в каждый элемент строку из файла C++
динамический массив (Целое число разложить на массив простых множителей) C++
C++ Динамический массив строк (считать с файла строки и поместить их в динамический массив строк)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5948 / 5553 / 1785
Регистрация: 18.12.2011
Сообщений: 14,191
Завершенные тесты: 1
12.05.2013, 18:48     Расширить динамический массив #2
Цитата Сообщение от o33ik Посмотреть сообщение
Можно увеличить размер етого массива
Стандартный способ:
1. Создаем новый массив нужной длины.
2. копируем в него все из старого.
3. удаляем старый.
o33ik
138 / 5 / 1
Регистрация: 25.03.2013
Сообщений: 228
12.05.2013, 18:53  [ТС]     Расширить динамический массив #3
zss, ну я немного сам помозговал и сделал похожое. но поскольку добавление новых значений будет многократно, то мне надо из нового массива перенести все обратно в старый. для етого надо удалить старый и создать его наново, с новым размером. Но как ето делать через класы я не очень понимаю. мне наверное придеться создать еще один обьект етого класса или надо както по другому? вот что я пока написал:
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
#include <iostream>
#include <string>
#include <conio.h>
 
using namespace std;
 
enum CATEGORY{family, sport, cabrio, jeep};
 
class DATE
 
{
private:
    
    int day, month, year;
public:
 
    DATE(void){};
    DATE(int _day, int _month, int _year) { day = _day; month = _month; year = _year; };
    ~DATE(){};
 
    int GetDay(){return day;}
    int GetMonth(){return month;}
    int GetYear(){return year;}
 
    DATE& SetDay (int _day){day=_day; return *this;};
    DATE& SetMonth (int _month){month=_month; return *this;};
    DATE& SetYear (int _year){year=_year; return *this;};
 
    void inputD(){cout<<"Enter date dd/mm/yy: ";cin>>day>>month>>year;};
    void showD(){cout<<endl; cout<<day<<"."<<month<<"."<<year;};
};
 
class CAR
{
    char corporation[15];
    char car_name[15];
    int price;
    int made_date;
public:
    void INP()
    {
        cout << "Enter car_name: ";
        cin >> corporation; 
        cout << "Enter car_model: ";
        cin >> car_name;
        cout << "Enter price: ";
        cin >> price;
        cout << "Enter made date: ";
        cin >> made_date;
    }
    void OUT()
    {
        cout << "\nCar name: " << corporation; 
        cout << "\nCar model: " << car_name;
        cout << "\nCar price: " <<price;
        cout << "\nCar made year: " <<made_date;
    }
};
 
class tz
{
    CATEGORY category;
    CAR car;
    DATE date;
    int rent_price;
    int rent_time;
    char car_regnumber[10];
public:
    void tz_data_inp(int counter)
    {
        cout << "\t\tStatement # " << counter+1 << endl;
        car.INP();
        cout << "Enter category of transport(family, sport, cabrio or jeep): ";
        while(true)
        {
            string str;
            cin >> str;
            if (str == "family") 
                {category = family; break;}
            if (str == "sport") 
                {category = sport; break;} 
            if (str == "cabrio") 
                {category = cabrio; break;}
            if (str == "jeep") 
                {category = jeep; break;}
            else {cout << "Incorrect word. Try again: "; 
            continue;}
        }
        date.inputD();
        cout << "Enter rent price: ";
        cin >> rent_price;
        cout << "Enter retn time: ";
        cin >> rent_time;
        cout << "Enter reg_number: ";
        cin >> car_regnumber;
    }
    void tz_data_out()
    {
        car.OUT();
        char* category_arr[]={"family", "sport", "cabrio", "jeep"};
        cout << "\nCar category: " << category_arr[category];
        date.showD();
        cout << "\nRent price: " << rent_price;
        cout << "\nRent time: " << rent_time;
        cout << "\nCar reg_number: " << car_regnumber << endl;
    }
};
 
class prokat
{ 
    char prokat_name[15];
public:
    tz* arr;
    prokat(int size)
    {
       arr = new tz[size];
    }
    tz* ex_arr;
         prokat(int size, int add_size)
         {
             ex_arr = new tz[size+add_size];
         }
    void inp_data(int size)
    {
        cout << "Enter name of rent agency: ";
        cin >> prokat_name;
        for(int i=0;i<size;i++)
        {
            arr[i].tz_data_inp(i);
        }
    }
    void out_data(int size)
    {
        cout << "\nName of rent company: "<< prokat_name;
        for(int i=0;i<size;i++)
        {
            arr[i].tz_data_out();
        }
    }
    void add_data(int size, int add_size)
    {
        for(int i=0; i<size; i++)
        {
            ex_arr[i]=arr[i];        
        }
        for(int i=size;i<add_size;i++)
        {
                ex_arr[i].tz_data_inp(i);
        }
        
    }
};
 
int main()
{
    cout << "Enter array size: ";
    int size;
    cin >> size;
    cout << endl << endl;
    prokat obj(size);
    obj.inp_data(size);
    obj.out_data(size);
    getch();
    return 0;
}
zss
Модератор
Эксперт С++
 Аватар для zss
5948 / 5553 / 1785
Регистрация: 18.12.2011
Сообщений: 14,191
Завершенные тесты: 1
12.05.2013, 19:19     Расширить динамический массив #4
Второй массив совершенно ни к чему.
В принципе, сделано не совсем корректно.
Почитайте на досуге, как организуют контейнерные классы
(в библиотеке STL в первую очередь).
Ну, поскольку уж сделано так, то рассмотрим функцию
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void inp_data(int n) // n - кво объектов, которые надо добавить.
 {
        cout << "Enter name of rent agency: ";
        cin >> prokat_name;
        if(sizecurrent+n>size) 
// size (макс. размер тек. массива) и sizecurrent(сколько туда записано) сделайте защищенными членами класса 
       {
               tz* temp;
              size+=n; // длина нового массива
              temp = new tz[size];// новый массив нужной длины
              for(int i=0;i<sizecurrent;i++)// копируем старый
                    temp[i]= arr[i];
               delete[] arr; // удаляем старый
               arr=temp;  // переставляем указатель на новый
       }
       for(int i=0;i<n;i++) // добавляем n элементов
                arr[sizecurrent++].tz_data_inp(i);
    }
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
12.05.2013, 19:24     Расширить динамический массив #5
Насколько я понял, тут не массив нужен, а список. И вообще, раз уж пишете в коде:
C++
1
using namespace std;
не поленитесь изучить содержимое этого пространства имен. Найдете много полезного, вместо того, чтобы изобретать велосипеды.
o33ik
138 / 5 / 1
Регистрация: 25.03.2013
Сообщений: 228
12.05.2013, 19:41  [ТС]     Расширить динамический массив #6
Tulosba, да не, в условии задания четко написано - "список оформленых заявок реализовать через дин.массив".
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,585
Записей в блоге: 12
12.05.2013, 19:45     Расширить динамический массив #7
o33ik, http://www.codenet.ru/progr/cpp/spru/realloc.php? ток я не знаю можно ли его на new адреес ставить, и будет ли delete нормально освобождать память
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
12.05.2013, 19:55     Расширить динамический массив #8
Цитата Сообщение от Van111 Посмотреть сообщение
ток я не знаю можно ли его на new адреес ставить, и будет ли delete нормально освобождать память
Не стоит мешать в одной программе malloc и new. Результат может быть непредсказуемым.
Цитата Сообщение от o33ik Посмотреть сообщение
в условии задания четко написано - "список оформленых заявок реализовать через дин.массив".
Тогда std::vector. Или стандартные контейнеры тоже нельзя использовать?
o33ik
138 / 5 / 1
Регистрация: 25.03.2013
Сообщений: 228
12.05.2013, 19:58  [ТС]     Расширить динамический массив #9
Tulosba, я в stl не разбираюсь пока, если буду использовать вектор, то препод начнет меня пресировать по всему stl, и не примет лабу.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
12.05.2013, 20:04     Расширить динамический массив #10
o33ik, ну для начала можно разобраться с std::vector. А преподу нефиг спрашивать по тому, чего в коде нет
o33ik
138 / 5 / 1
Регистрация: 25.03.2013
Сообщений: 228
12.05.2013, 20:06  [ТС]     Расширить динамический массив #11
короче, я упрощу себе жизнь. создам динамично массив, елементов на 100. и ф-цию которая будет добавлять по одной заявке в етот массив. условию задания ето не противоречит
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
12.05.2013, 20:12     Расширить динамический массив #12
Цитата Сообщение от o33ik Посмотреть сообщение
создам динамично массив, елементов на 100. и ф-цию которая будет добавлять по одной заявке в етот массив.
Что будет при добавлении 101 заявки? На самом деле, если Вы реализуете свой динамически расширяемый массив, то и std::vector проще будет понять.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.05.2013, 20:17     Расширить динамический массив
Еще ссылки по теме:

Создать динамический массив (Если чётных чисел больше, то массив должен быть укорочен на 2 элемента) C++
Написать функцию принимающую массив и возвращающую указатель на динамический массив C++
Заполнить динамический массив из файла и записать массив обратно в файл C++

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

Или воспользуйтесь поиском по форуму:
o33ik
138 / 5 / 1
Регистрация: 25.03.2013
Сообщений: 228
12.05.2013, 20:17  [ТС]     Расширить динамический массив #13
Tulosba, переполнение массива)) лаба по абстракции и инкапсе из ООП. поетому сильно долбать за ети массивы препод не будет)) а так согласен, можно и через вектор. но мне лень сегодня чтото делать. есть еще другие дела.
Yandex
Объявления
12.05.2013, 20:17     Расширить динамический массив
Ответ Создать тему
Опции темы

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