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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 33, средняя оценка - 4.88
Damaks
18 / 10 / 1
Регистрация: 02.09.2010
Сообщений: 235
#1

Сделать статический массив с разными типами данных - C++

14.02.2011, 16:07. Просмотров 4645. Ответов 18
Метки нет (Все метки)

Задача такова, есть ровно 60 магазинов. У каждого магазина по 6 параметров:
1) Адрес типа char[256]
2) Заработок за сутки типа int
3) Персонал в помещении типа int
4) Покупатели в помещении типа int
5) Владелец типа char[256]
6) Номер телефона типа char[256]

Чтобы было проще понять - на php структура должна быть такая:
$mass['магазин1'][1] = 'Москва д10'
$mass['магазин1'][2] = 4000
$mass['магазин1'][3] = 20
$mass['магазин1'][4] = 10
$mass['магазин1'][5] = Алексей
$mass['магазин1'][6] = 777-77-77

$mass['магазин2'][1] = 'СПб д13'
$mass['магазин2'][2] = 16100
$mass['магазин2'][3] = 76
$mass['магазин2'][4] = 14
$mass['магазин2'][5] = Дмитрий
$mass['магазин2'][6] = 888-88-88
....
$mass['магазин60'][1] = 'Москва д43'
....

Нужно построить вот такой статический ассоциативный массив, без использования stl. Возможно ли это?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.02.2011, 16:07
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Сделать статический массив с разными типами данных (C++):

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

Матрица с разными типами данных в ней - C++
Мне нужно создать матрицу, которая содержала бы разные типы данных, содержащиеся, в ней. По сути обыкновенная таблица, только в виде...

Реализация Fifo с разными типами данных - C++
Доброго времени суток! Задача следующая: Есть абстрактный класс CData, от него наследуются классы CByte, CWord, CNumber. Нужно...

Переписать программу с разными типами данных - C++
Тема: Использование указателей для работы со сложными типами данных Вот я хочу чтобы мне помогли переписать эту программу чтобы она...

Массив с разными типами через memcpy() - C++
Здравствуйте! Подскажите пожалуйста, как через memcpy() организовать массив с разными типам? Я пытаюсь так: char * packet; ...

Список с разными типами данных, унаследованным от одного - C++
Доброго времени суток! У меня имеются унаследованные классы от одного , так же имеется vector<общий_тип*> arr. В программе создаются в...

18
From_Tula
40 / 40 / 2
Регистрация: 22.05.2009
Сообщений: 483
14.02.2011, 16:15 #2
Как я понял тебе нужны структуры на C.

C++
1
2
3
4
5
6
7
8
9
struct mag
{
char adr[255];
int zarpl_za_den;
int personal;
int pokup;
char vlad[25];
char tel[25];
}mas[100];
mas[100] и будет статический массив с разными типами данных
доступ к элементам только будет таким:
mas[i].pokup;//доступ к значенияю покупатель и т.д.
1
Damaks
18 / 10 / 1
Регистрация: 02.09.2010
Сообщений: 235
14.02.2011, 16:17  [ТС] #3
Извиняюсь, а можно пожалуйста ещё примерчик заполнения для 1-ого и 2-ого магазина?

Я плохо написал, нужно чтобы все 60 магазинов (их названия) были в массиве. Чтобы по названию магазина можно было вынуть любой параметр, это структуры позволяют сделать?
0
easybudda
Модератор
Эксперт CЭксперт С++
9664 / 5614 / 952
Регистрация: 25.07.2009
Сообщений: 10,778
14.02.2011, 16:20 #4
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#define STR_LEN 256
typedef struct SHOP{
  char address[STR_LEN];
  double incomming;
  int personal;
  int customers;
  char owner[STR_LEN];
  char phone[STR_LEN];
}shop_t;
 
/*...*/
#define NUMBER_OF_SHOPS 10
/*...*/
shop_t shops[NUMBER_OF_SHOPS];
/*...*/
Добавлено через 1 минуту
Damaks, с языком программирования определитесь - С / С++ ?
0
Damaks
18 / 10 / 1
Регистрация: 02.09.2010
Сообщений: 235
14.02.2011, 16:23  [ТС] #5
С++
Я полагал в области статических массивов нет никакой разницы...
0
From_Tula
40 / 40 / 2
Регистрация: 22.05.2009
Сообщений: 483
14.02.2011, 16:32 #6
нужно чтобы все 60 магазинов (их названия) были в массиве
Наверное нет, хотя не уверен, скорее всего тебе придется вводить индексы к каждому магазину, и уже через эти индексы работать.
1
Nameless One
Эксперт С++
5774 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
14.02.2011, 16:37 #7
Damaks,
  1. сделай класс shop;
  2. сделай класс-контейнер типа ассоциативный массив (ассоциативный список), перегружай для него операцию взятия индекса.
В классе-контейнере храни экземпляры класса shop как значения, а std::string (или char*) как ключи. А наподобие php сделать не получится, хотя бы потому, что у данных в C/C++ типизация статическая, а в php - динамическая.
1
Aress0111
12 / 12 / 0
Регистрация: 13.01.2011
Сообщений: 71
14.02.2011, 16:44 #8
Обьявление:
C++
1
2
3
4
5
6
7
8
9
10
struct telefon  {
                char fam[20];
                char name[20];
                char otch[20];
                char n_tel[15];
                char adres[30];
                unsigned int n_sch;
                unsigned int dolg;
                telefon *next;};
telefon *telefonh=NULL;
заполнение
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
telefon *a,*b;
    char ss[30];
    int i=1;
    if(telefonh!=NULL)
      {
      a=telefonh;
      i++;
      for(;a->next!=NULL;i++)
     {
      a=a->next;
     }
      }
     printf("%d. Enter surename -------> ",i);
     scanf("%s",&ss);
     if(ss[0]=='*') {printf("vvod zakonchen!!!");}
     b=(telefon*)malloc(sizeof(telefon));
    strcpy(b->fam,ss);
     printf("%d. Enter name     -------> ",i);
     scanf("%s",&ss);
    strcpy(b->name,ss);
     printf("%d. Enter pat.name--------> ",i);
     scanf("%s",&ss);
    strcpy(b->otch,ss);
     printf("%d. Enter Num of telefon--> ",i);
     scanf("%s",&ss);
    strcpy(b->n_tel,ss);
     printf("%d. Enter adress----------> ",i);
     scanf("%s",&ss);
    strcpy(b->adres,ss);
     printf("%d. Enter number of count-> ",i);
     scanf("%d",&(b->n_sch));
     printf("%d. Enter debt----> ",i);
     scanf("%d",&(b->dolg));
      b->next=NULL;
     if(telefonh==NULL)
    {
    telefonh=b;
    }
     else {a->next=b;}
    return 0;
1
easybudda
Модератор
Эксперт CЭксперт С++
9664 / 5614 / 952
Регистрация: 25.07.2009
Сообщений: 10,778
14.02.2011, 17:03 #9
Особо не заморачиваясь
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
#include <iostream>
#include <string>
#include <map>
    
struct Shop{
    std::string address;
    double incomming;
    /*
    int personal;
    int customers;
    char owner[STR_LEN];
    char phone[STR_LEN];
    */
};
 
int main(){
    std::map<std::string, Shop> shops;
    
    shops["Magaz 1"].address = "ul. Lenina 13";
    shops["Magaz 1"].incomming = 999.9;
    shops["Magaz 2"].address = "pr-t Mira 69";
    shops["Magaz 2"].incomming = 666.0;
    
    /*...*/
    std::cout << "Address: " << shops["Magaz 1"].address << "\nIncomming: " << shops["Magaz 1"].incomming << std::endl;
    std::cout << "Address: " << shops["Magaz 2"].address << "\nIncomming: " << shops["Magaz 2"].incomming << std::endl;
    
    return 0;
}
0
Nameless One
14.02.2011, 17:06
  #10

Не по теме:

easybudda,

Цитата Сообщение от Damaks Посмотреть сообщение
Нужно построить вот такой статический ассоциативный массив, без использования stl

1
easybudda
14.02.2011, 17:24
  #11

Не по теме:

Nameless One, как один еврей-таксист говорил, "Вам таки ехать, или шашечки?" К тому же

Цитата Сообщение от easybudda Посмотреть сообщение
Особо не заморачиваясь
без STL не получится.

0
Damaks
18 / 10 / 1
Регистрация: 02.09.2010
Сообщений: 235
14.02.2011, 17:28  [ТС] #12
Жаль, я думал в с++ со статическими массивами всё легко, если можно так выразиться...
А map - уже динамический, намного медленнее статического. Получается нерационально. Зачем выделять каждый раз память и использовать хеш таблицу, когда мне зараннее известно количество элементов и я знаю что все их буду сразу использовать.
0
easybudda
Модератор
Эксперт CЭксперт С++
9664 / 5614 / 952
Регистрация: 25.07.2009
Сообщений: 10,778
14.02.2011, 17:32 #13
Damaks, во-первых создавать в стеке массив структур - уже не очень разумная затея (стек не резиновый, много не поместится), во-вторых ассоциативные массивы - по определению вещь не быстрая, ну и в-третьих получится быстрее, чем на php...
1
Damaks
18 / 10 / 1
Регистрация: 02.09.2010
Сообщений: 235
14.02.2011, 17:36  [ТС] #14
Пожалуй я воспользуюсь индексами
0
Nameless One
Эксперт С++
5774 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
14.02.2011, 19:10 #15

Не по теме:

Цитата Сообщение от easybudda Посмотреть сообщение
без STL не получится.
Ну почему же, никто не запрещает нам написать собственные велосипеды



Цитата Сообщение от Nameless One Посмотреть сообщение
А наподобие php сделать не получится, хотя бы потому, что у данных в C/C++ типизация статическая, а в php - динамическая.
Можно попытаться обойти ограничения, налагаемые статической типизацией данных, если разработать класс, который может хранить значения разных типов (наподобие Qt'шного QVariant'a). Вот пример для класса, который может хранить либо double, либо char:
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
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
#include <iostream>
#include <stdexcept>
#include <string>
 
enum tag
{
    floating,
    character,
    undefined
};
 
class variant
{
public:
    variant();
    variant(const variant& rhs);
    
    explicit variant(double dval);
    explicit variant(char cval);
    
    double& operator = (double dval);
    char& operator = (char cval);
    operator double() const;
    operator char() const;
 
    double& asDouble();
    char& asChar();
    
    bool isDouble() const;
    bool isChar() const;
    bool isDefined() const;
    
    bool operator == (const variant& val) const;
    bool operator == (char cval) const;
    bool operator == (double dval) const;
 
    bool operator != (const variant& val) const;
    bool operator != (char cval) const;
    bool operator != (double dval) const;
 
    friend std::ostream& operator << (std::ostream& os, const variant& rhs);
    
private:
 
    tag type;
 
    union
    {
    double dvalue;
    char cvalue;
    };
 
    void assertTypes(tag t) const;
    std::string type2string(tag t) const;
};
 
variant::variant()
    : type(undefined)
{
}
 
variant::variant(const variant& rhs)
    : type(rhs.type)
{
    switch(type)
    {
    case floating:
    dvalue = rhs.dvalue;
    break;
 
    case character:
    cvalue = rhs.cvalue;
    break;
 
    case undefined:
    break;
    }
}
 
variant::variant(double dval)
    : type(floating), dvalue(dval)
{
}
 
variant::variant(char cval)
    : type(character), cvalue(cval)
{
}
 
double& variant::operator = (double dval)
{
    type = floating;
    dvalue = dval;
    return dvalue;
}
 
char& variant::operator = (char cval)
{
    type = character;
    cvalue = cval;
    return cvalue;
}
 
variant::operator double () const
{
    assertTypes(floating);
    return dvalue;
}
 
variant::operator char () const
{
    assertTypes(character);
    return cvalue;
}
 
double& variant::asDouble()
{
    assertTypes(floating);
    return dvalue;
}
 
char& variant::asChar()
{
    assertTypes(character);
    return cvalue;
}
 
bool variant::isDouble() const
{
    return type == floating;
}
 
bool variant::isChar() const
{
    return type == character;
}
 
bool variant::isDefined() const
{
    return type != undefined;
}
 
bool variant::operator == (const variant& val) const
{
    if(type == undefined || val.type == undefined)
    throw std::runtime_error("Dynamic type checking error: comparison with undefined variables is forbidden");
 
    if(type != val.type)
    return false;
 
    switch(type)
    {
    case floating:
    return dvalue == val.dvalue;
 
    case character:
    return cvalue == val.cvalue;
 
    case undefined:
    break;
    }
 
    // На всякий случай
    return false;
}
 
bool variant::operator == (double dval) const
{
    if(type == undefined)
    throw std::runtime_error("Dynamic type checking error: comparison with undefined variables is forbidden");
 
    if(type != floating)
    return false;
 
    return dvalue == dval;
}
 
bool variant::operator == (char cval) const
{
    if(type == undefined)
    throw std::runtime_error("Dynamic type checking error: comparison with undefined variables is forbidden");
 
    if(type != character)
    return false;
 
    return cvalue == cval;
}
 
bool variant::operator != (const variant& val) const
{
    return !(*this == val);
}
 
bool variant::operator != (double dval) const
{
    return !(*this == dval);
}
 
bool variant::operator != (char cval) const
{
    return !(*this == cval);
}
 
std::ostream& operator << (std::ostream& os, const variant& rhs)
{
    if(rhs.type == floating)
    os << static_cast<double>(rhs);
    else if(rhs.type == character)
    os << static_cast<char>(rhs);
    else
    throw std::runtime_error("Dynamic type checking error: undefined variable");
 
    return os;
}
 
void variant::assertTypes(tag t) const
{
    if(type == undefined)
    throw std::runtime_error("Dynamic type checking error: undefined variable");
 
    if(type != t)
    throw std::runtime_error("Dynamic type checking error: type " + type2string(t) + " was expected");
}
 
std::string variant::type2string(tag t) const
{
    switch(t)
    {
    case floating:
    return "double";
 
    case character:
    return "character";
 
    case undefined:
    return "undefined";
    }
 
    // На всякий случай
    return "unexpected tag";
}
 
#ifdef DEBUG
#include <iomanip>
 
#define debugPrint(EXPR) std::cout << std::boolalpha << #EXPR << ": " << (EXPR) << std::endl
 
int main() 
{
    const size_t size = 4;
    variant vars[size];
    
    vars[0] = variant();
    vars[1] = variant(5.5);
    vars[2] = variant('c');
    vars[3] = variant(8.0);
 
    debugPrint(vars[0].isDefined());
    vars[0] = 'c';
    debugPrint(vars[0].isDefined());
    
    debugPrint(vars[0]);
    debugPrint(vars[1]);
    debugPrint(vars[2]);
    debugPrint(vars[3]);
 
    debugPrint(vars[1] == vars[3]);
    debugPrint(vars[1] != vars[2]);
    debugPrint(vars[0] == vars[2]);
    debugPrint(vars[0] != '\0');
    debugPrint(vars[2] == 42.0);
    
    return 0;
}
 
#endif
Но описывать все это - уже откровенно попахивает мазохизмом
2
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.02.2011, 19:10
Привет! Вот еще темы с ответами:

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

Шаблонный класс для работы с разными типами данных и объявление методов в main - C++
есть класс шаблонный, но не могу объявить методы в main и сделать длядругих типов :(когда делала через шаблонные функции, то программа...

Нужно создать статический массив строк как статический массив указателей на строки. Условние ниже --> - C++
Слова английского текста рассортировать по возрастанию количества заданной буквы в слове. Слова с одинаковым количеством такой буквы...

создать статический массив строк как статический массив указателей на строки, задание ниже --> - C++
Слова английского текста, начинающиеся с гласных букв, рассортировать в алфавитном порядке по первой согласной букве слова. Остальные слова...


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

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

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