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

Связь списков - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Простой ввод строки с пробелами через string http://www.cyberforum.ru/cpp-beginners/thread820321.html
Visual studio 2012, никак не могу ввести строку через string. У меня не работает вот этот фрагмент кода: #include "stdafx.h" #include "iostream" #include <string.h> #include "stdio.h" using namespace::std; using namespace::System; void main() {
C++ Определить число вхождений символа в предложение Суть задачи: Дано предложение. Определить число вхождений в него некоторого символа. Вот мой код: #include "stdafx.h" #include <iostream> using namespace std; int _tmain() http://www.cyberforum.ru/cpp-beginners/thread820318.html
C++ Получить b1,…,bn, где bi – это сумма элементов, расположенных за первым отрицательным элементом в i-й строки
пусть дано натуральное число n и целочисленная квадратная матрица порядка n. Получите b1,…,bn, где bi – это сумма элементов, расположенных за первым отрицательным элементом в i-й строки (если все строки неотрицательные, то принять bi=100)
Множества. Вычислить количество элементов множества Q, связанного c исходными множествами C++
В общем задание звучит так : Заданы 3 упорядоченных множества F, G и H, представленные файлами f, g и h соответственно. Вычислить количество элементов множества Q, связанного c исходными множествами F, G и H следующим образом:Q = (F объединение G) пересечение H. Вот мой код но он вобще не оптимизирован да и работает не правильно помогите доработать. #include <iostream> #include <fstream>...
C++ Перевести на C++ Basic http://www.cyberforum.ru/cpp-beginners/thread820241.html
Условие задачи такое: В одномерном массиве найти сумму чисел,расположенных между первым минимальным и последним максимальным элементами массива. uses crt; const n=20; var a:array of integer; i,imax,imin:byte; max,min,sum:integer; begin clrscr; randomize; writeln('Massiv:');
C++ Тип unsigned long long Добрый день. У меня возник вопрос: Почему в результате выполнения программы выводится число: -1? А должно: 18446744073709551615 #include <stdio.h> #include <conio.h> #include <stdlib.h> int main() { unsigned long long a; подробнее

Показать сообщение отдельно
awpe
2 / 2 / 0
Регистрация: 23.11.2011
Сообщений: 87
28.03.2013, 11:59  [ТС]     Связь списков
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
#include <iostream>
#include <iomanip>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cstdio>
 
class CCompanyIndex
 {
   public:
                             CCompanyIndex ( void );
                            ~CCompanyIndex ( void );
    bool                     Add           ( const string & oName,
                                             const string & oAddr,
                                             const string & cName,
                                             const string & cAddr );
    bool                     Del           ( const string & oName,
                                             const string & oAddr );
    bool                     Search        ( const string & oName,
                                             const string & oAddr,
                                             string       & cName,
                                             string       & cAddr ) const;
    // todo
 };
 
int main(){
bool   status;
string cName, cAddress;
CCompanyIndex  b1;
status = b1 . Add ( "Smith", "Oak road", "ACME, Ltd.", "One ACME road" );
// status = true
status = b1 . Add ( "Brown", "Second street", "MakroHard, Inc.", "Soft street" );
// status = true
status = b1 . Add ( "Hacker", "5-th avenue", "Forks and Knives, Ltd.", "Cutlery avenue" );
// status = true
status = b1 . Add ( "Hacker", "7-th avenue", "Child toys, Inc.", "Red light district" );
// status = true
status = b1 . Search ( "Brown", "Second street", cName, cAddress );
// status = true, cName = "MakroHard, Inc.", cAddress="Soft street"
status = b1 . Search ( "Hacker", "Oak road", cName, cAddress );
// status = false
status = b1 . Search ( "Smith", "Oak road", cName, cAddress );
// status = true, cName = "ACME, Ltd.", cAddress="One ACME road"
status = b1 . Del ( "Smith", "Oak road" );
// status = true
status = b1 . Search ( "Smith", "Oak road", cName, cAddress );
// status = false
 
CCompanyIndex  b2;
status = b2 . Add ( "Smith", "Michigan avenue", "ACME, Ltd.", "One ACME road" );
// status = true
status = b2 . Search ( "Smith", "Michigan avenue", cName, cAddress );
// status = true, cName = "ACME, Ltd.", cAddress="One ACME road"
status = b2 . Del ( "Smith", "Michigan avenue" );
// status = true
status = b2 . Search ( "Smith", "Michigan avenue", cName, cAddress );
// status = false
status = b2 . Del ( "Smith", "Michigan avenue" );
// status = false
status = b2 . Add ( "Smith", "Michigan avenue", "Forks and Knives, Ltd.", "Cutlery avenue" );
// status = true
status = b2 . Search ( "Smith", "Michigan avenue", cName, cAddress );
// status = true, cName = "Forks and Knives, Ltd.", cAddress="Cutlery avenue"
status = b2 . Add ( "Smith", "Michigan avenue", "Child toys, Inc.", "Red light district" );
// status = false
status = b2 . Add ( "Smith", "Michigan avenue", "MakroHard, Inc.", "Soft street" );
// status = false
status = b2 . Del ( "Smith", "Michigan avenue" );
// status = true
status = b2 . Search ( "Smith", "Michigan avenue", cName, cAddress );
// status = false
return 0;
}
Организовать реестр фирм, где пара имя владельца - его адрес уникальные, фирмы напротив могут иметь дубликаты - одна фирма может иметь несколько хозяев.

конструктор класса без параметров
деструктор освобождает память
метод Add(oName, oAddr, cName, cAddr) добавляет запись в БД, если там нет пары имя-адрес владельца, иначе возвращает ложь
метод Del(oName, oAddr) удаляет запись и возвращает истину, или ложь, если не была найдена запись или еще какие ошибки
метод Search (oName, oAddr, cName, cAddr ) ищет фирму по oName, oAddr, если есть то возвращает истину и по ссыкам cName, cAddr записывает ее(фирмы) данные

Не использовать STL кроме данных библиотек
Не использовать копирующий конструктор
Не использовать перегрузку оператора =
Имплементация должна быть эффективной с точки зрения памяти и времени
Массив строк должен быть сортирован и просматриваться (search) с помощью алгоритмов с логарифмической сложностью
Рекомендовано сразу выделить массив на 1000 записей, по его заполнении же не выделять еще одно место а изменять размер в геометрическоф прогрегресии со знаменателем ~1.5 до 2.0

Добавлено через 6 минут
начал с того что пишу вспомогательный класс CStrTbl для управления строками с методами типа addstr() getstr() findstr() delstr() isinarr() operator[]... потом в базовом классе буду выделять объекты типа CStrTbl * Companies, CStrTbl * OwnerNames CStrTbl * Addresses, и структуры struct Owner{CStrTbl * m_OwnerName; CStrTbl * m_OwnerAddress; Company* m_Company;} struct Company... Везде только указатели, строки хранятся только во вспомогательном классе в единственном экземпляре... пока так:

Кликните здесь для просмотра всего текста
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
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
#include <iostream>
#include <iomanip>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#define bIfUnique_dflt true // sets is object will store unique elements
 
//Provides base functionality for strings databaze, by default it will react to calls
//using unsorted strings array, where strings are in the same order
//flags bSrtRtrnAutoFalse and bSrtRtrn are used to kontrol output order of strings
//bErrFlag is set to true value if error aquired
//bSpecFlag only used for special functions.
//Has 2 constructors, default creates object storing only unique strings
//Using CStrTbl(bool bIfUnique) it is possible to create object which stores
//non-unique strings.
 
class CStrTbl {
public:
    CStrTbl();
    CStrTbl(bool bIfUnique);
    ~CStrTbl();
    std::string * pStrAdd(std::string& sInsStr); //adds string and returns pointer to it
    std::string * operator[](unsigned int iX); // access to strings using [] opearator, depends on bSrtRtrn flag
    std::string * pStrFind(const std::string& sInsStr); // returns pointer if sInsStr exists in object
    bool bStrDel(const std::string& sInsStr); //deletes sInsStr string if exists;
    bool bStrDel(const unsigned int& iNdx); //deletes string iX if Exists
    unsigned int nStrFind(const std::string& sInsStr); //returns index of sInsStr if exists
    unsigned int iGetSize() const; //returns number of elements
    bool bIfExists(const std::string& sInsStr);
    bool bErrFlag; //if error happened in last operation
    bool bSpecFlag; // special flag for temp purposes
    bool bSrtRtrnAutoFalse; // if set then every timy you call method which depends on bSrtRtrn, 
    //bSrtRtrn sets to false, by default is true
    bool bSrtRtrn; // WARNING USE IT FOR OUTPUT ONLY!!! if Object should be used as been sorted or unsorted, 
    //by default everytime after call automatically changes to false
private:
    void vChngHAddr(std::string* sFind, std::string* sReplace);
    unsigned int nFindInsPos(const std::string& sInsStr); //returns propriate index for sInsStr insertion in dynamic arr
    unsigned int nFindHardPos(const std::string* sFndStr); //returns propriate index for sFndStr insertion in hard arr
    bool bIsUnique; // if Object consists of unique values
    bool ThereIsEmpty; //if string was deleted and it is place in the array for new string;
    unsigned int * iDelIndexes; //array of deleted indexes for adding and removing strings;
    unsigned int iDynSize; //size of the strings array
    std::string ** sHAddr; // hard addresses to the rest of the world, never sorted
    std::string ** aStrings; // sorted strings array for speed
};
 
CStrTbl::CStrTbl() {
    bIsUnique = bIfUnique_dflt;
    aStrings = NULL;
    sHAddr = NULL;
    iDynSize = 0;
    bErrFlag = false;
    bSpecFlag = false;
    bSrtRtrn = false;
    bSrtRtrnAutoFalse = true;
}
 
CStrTbl::CStrTbl(bool bIfUnique) {
    bIsUnique = bIfUnique;
    aStrings = NULL;
    sHAddr = NULL;
    iDynSize = 0;
    bErrFlag = false;
    bSpecFlag = false;
    bSrtRtrn = false;
    bSrtRtrnAutoFalse = true;
}
 
CStrTbl::~CStrTbl() {
    for (unsigned int i = 0; i < iDynSize; i++) {
        delete aStrings[i];
    }
    free(aStrings);
    free(sHAddr);
}
 
unsigned int CStrTbl::iGetSize() const {
    return iDynSize;
}
 
std::string * CStrTbl::operator[](unsigned int iX) {
    if ((iX > iDynSize) || (iX < 0)) {
        bErrFlag = true;
        return NULL;
    }
    if (bSrtRtrn) {
        if (bSrtRtrnAutoFalse) {
            bSrtRtrn = false;
        }
        return aStrings[iX];
    } else {
        bErrFlag = false;
        if(!sHAddr[iX]){
            bErrFlag = true;
            return NULL;
        }
        return sHAddr[iX];
    }
}
 
unsigned int CStrTbl::nFindHardPos(const std::string* sFndStr) {
    for (unsigned int i = 0; i < iDynSize; i++) {
        if (sHAddr[i] == sFndStr) {
            bSpecFlag = false;
            return i;
        }
    }
    bSpecFlag = true;
    return 0;
}
 
unsigned int CStrTbl::nFindInsPos(const std::string& sInsStr) {
    unsigned int start = 0, end = iDynSize;
    if (end == 0) {
        bSpecFlag = false;
        return 0;
    }
    if (sInsStr.std::string::compare(*aStrings[start]) < 0) {
        bSpecFlag = false;
        return 0;
    }
    if (sInsStr.compare(*aStrings[end - 1]) > 0) {
        bSpecFlag = false;
        return end;
    }
    unsigned int uiMid;
    int siCmpMidRes;
    while (start < end) {
        uiMid = start + (end - start) / 2;
        siCmpMidRes = sInsStr.compare(*aStrings[uiMid]);
        if ((siCmpMidRes < 0) || (!siCmpMidRes)) {
            end = uiMid;
        } else {
            start = uiMid + 1;
        }
    }
    int bCmpRes = sInsStr.compare(*aStrings[end]);
    if (bCmpRes < 0) {
        bSpecFlag = false;
        return end;
    }
    if (!bCmpRes) {
        bSpecFlag = true;
        return end;
    }
    return 0;
}
 
std::string * CStrTbl::pStrFind(const std::string& sInsStr) {
    unsigned int iX = nFindInsPos(sInsStr);
    if (!bSpecFlag) {
        return NULL;
    }
    return aStrings[iX];
}
 
unsigned int CStrTbl::nStrFind(const std::string& sInsStr) {
    unsigned int iX = nFindInsPos(sInsStr);
    if (!bSpecFlag) {
        bSpecFlag = true;
        return 0;
    }
    return iX;
}
 
bool CStrTbl::bIfExists(const std::string& sInsStr) {
    return ((bool)pStrFind(sInsStr)) && (bSpecFlag);
}
 
void CStrTbl::vChngHAddr(std::string* sFind, std::string* sReplace) {
    for (unsigned int i = 0; i < iDynSize; i++) {
        if (sHAddr[i] == sFind) {
            sHAddr[i] = sReplace;
            break;
        }
    }
}
 
std::string * CStrTbl::pStrAdd(std::string& sInsStr) {
    unsigned int iX = nFindInsPos(sInsStr);
    if ((bIsUnique) && (!iX)&&(bSpecFlag)) {
        bSpecFlag = false;
        return NULL;
    }
    aStrings = (std::string**)realloc(aStrings, sizeof (std::string*)*(iDynSize + 1));
    if (!aStrings) {
        bErrFlag = true;
        return NULL;
    }
 
    aStrings[iDynSize] = new std::string;
    if (!aStrings[iDynSize]) {
        bErrFlag = true;
        return NULL;
    }
 
    sHAddr = (std::string**)realloc(sHAddr, sizeof (std::string*)*(iDynSize + 1));
    if (!aStrings) {
        bErrFlag = true;
        return NULL;
    }
 
    for (unsigned int i = iDynSize; i > iX; i--) {
        vChngHAddr(aStrings[i - 1], aStrings[i]);
        *aStrings[i] = *aStrings[i - 1];
    }
    *aStrings[iX] = sInsStr;
    sHAddr[iDynSize++] = aStrings[iX];
 
    return aStrings[iX];
}
 
bool CStrTbl::bStrDel(const std::string& sInsStr) {
    unsigned int iX = nFindInsPos(sInsStr);
    if ((!iX) || (!bSpecFlag)) {
        return false;
    }
    unsigned int tmp=nFindHardPos(aStrings[iX]);
    sHAddr[tmp] = NULL;
    for (unsigned int i = iX; i < iDynSize - 1; i++) {
        vChngHAddr(aStrings[i + 1], aStrings[i]);
        *aStrings[i] = *aStrings[i + 1];
    }
    iDynSize--;
    std::cout << "!" << aStrings[iDynSize-1] << std::endl;
    
    delete aStrings[iDynSize]; //aStrings[iDynSize] = NULL;
        aStrings[iDynSize] = NULL;
    //delete sHAddr[iDynSize];    //sHAddr[iDynSize] = NULL;
    //std::cout<<"!"<<sHAddr[iDynSize-1]<<std::endl;
 
    aStrings = (std::string**)realloc(aStrings, sizeof (std::string*)*(iDynSize));
    //;
    if (!aStrings) {
        bErrFlag = true;
        return false;
    }
    //sHAddr[iDynSize + 1] = NULL;
    return true;
}
 
bool CStrTbl::bStrDel(const unsigned int& iNdx) {
    if (!sHAddr[iNdx]) {
        return false;
    }
    unsigned int iX = nFindInsPos(*sHAddr[iNdx]);
    const std::string *sInsStr = aStrings[iX];
    return bStrDel(*sInsStr);
}
 
int main(void) {
    CStrTbl arr_CompanyNames;
    std::string str = "0";
    std::cout << *arr_CompanyNames.pStrAdd(str) << std::endl;
    str = "4";
    std::cout << *arr_CompanyNames.pStrAdd(str) << std::endl;
    str = "1";
    std::cout << *arr_CompanyNames.pStrAdd(str) << std::endl;
    str = "3";
    std::cout << *arr_CompanyNames.pStrAdd(str) << std::endl;
    str = "2";
    std::cout << *arr_CompanyNames.pStrAdd(str) << std::endl;
    str = "5";
    std::cout << *arr_CompanyNames.pStrAdd(str) << std::endl;
    std::cout << std::endl;
 
    for (unsigned int i = 0; i < arr_CompanyNames.iGetSize(); i++) {
        arr_CompanyNames.bSrtRtrn = true;
        std::cout << *arr_CompanyNames[i] << std::endl;
    }
    std::cout << std::endl;
    for (unsigned int i = 0; i < arr_CompanyNames.iGetSize(); i++) {
        std::cout << *arr_CompanyNames[i] << std::endl;
    }
    std::cout << std::endl;
 
    std::cout << "!=" << *arr_CompanyNames[5] << std::endl;
    std::cout << std::endl;
    std::cout << arr_CompanyNames.bStrDel("4") << std::endl;
    std::cout << std::endl;
    std::cout << "!=" << *arr_CompanyNames[4] << std::endl;
    std::cout << std::endl;
    for (unsigned int i = 0; i < arr_CompanyNames.iGetSize(); i++) {
        arr_CompanyNames.bSrtRtrn = true;
        std::cout << *arr_CompanyNames[i] << std::endl;
    }
    std::cout << std::endl;
    for (unsigned int i = 0; i < arr_CompanyNames.iGetSize(); i++) {
 
        std::cout << *arr_CompanyNames[i] << std::endl;
    }
 
    return 0;
}


Добавлено через 1 минуту
Может у меня подход вообще не правильный...?)
 
Текущее время: 00:12. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru