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

Реализация расширенного класса Integer - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Объявление в структуре http://www.cyberforum.ru/cpp-beginners/thread634769.html
ругается на объявление батона struct StructurClientData { Button^ button; unsigned int data_ip4; DWORD system_id; HANDLE system_handle; SOCKET socket_client; State_Client_Connect client_state; sockaddr_in sockaddr_client;
C++ SEHException при заполнении вектора тут такое дело... если в кратце, есть вектор summa, заполняю его нулями и вылезает SEHException. Я так понимаю, ему не хватает памяти, или я выхожу куда то за пределы? vector <double> summa; double MaxValue=78643199; ... summa.clear(); summa.resize(MaxValue,0); //заполняю нулями Неужели что то банальное и глупое? http://www.cyberforum.ru/cpp-beginners/thread634760.html
Влияет ли на производительность C++
Влияет ли на производительность определение(тоесть реализация) функций внутри класса, а также использование вложенных классов?
удаление слова из строки C++
Написать программу, которая удаляет слово из некоторого количества слов в строке, в котором гласных букв меньше чем согласных.Заранее благодарен
C++ Логирование работы программы http://www.cyberforum.ru/cpp-beginners/thread634715.html
Всем доброго времени суток! Столкнулся с проблемой - мне дали программу и сказали разбирайся. Там полно различных функций и комментариев целых 0. Чтоб понять, что и какая функция делает, я подумал о логе. Как мне реализовать этот самый лог вызова функций? Саму концепцию я вроде как понимаю: нужно сделать отдельный .срр в котором будет прописана функция записи в файл строки формата: ...
C++ Глобальный HDC и имя переменной 1) Почему глобальный HDC невозможен? Точнее, если обработать WM_CREATE с добавлением : hdc = BeginPaint(hWnd, &ps); или hdc = GetDC(hWnd); То после выхода из WM_CREATE нарисовать что-то в этом hdc уже не выйдет. Во всяком случае на экране ничего не будет. Почему? Разве hWnd меняется? 2) Можно ли как-то имя переменной получить в виде строки? Допустим : int abc = 10, x; string b =... подробнее

Показать сообщение отдельно
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
08.08.2012, 15:49     Реализация расширенного класса Integer
Всем привет. Хочу реализовать аналог класса Integer в котором можно буде проводить операции с числами любой разрядности. Начал пока с написания функции сложения и вычитания.
Возникли вопросы:
1)Можно ли числа хранить в строках?
2)В моей программе происходит ошибка в функции ReadStr(), когда происходит перевыделение памяти 2 раз. С перегрузкой оператор new пока незнаком и пытаюсь сделать перевыделение вручную. Почему может возникать эта ошибка? Как этого избежать?
3)Может кто-нибудь посмотреть насколько корректно реализованы функции Add (сложение чисел) и Sub (вычитание чисел). Может быть где-то что-то в этих функциях и вообще в программе следует сделать как-то иначе.
За любые комментарии буду благодарен.
Вот код (если что-то непонятно, спрашивайте) :

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
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
#include <iostream>
#include <conio.h>
using namespace std;
 
int MAX_NUMBER = 10;    
int MIN_NUMBER = 0;
 
//убирает лишние нули впереди строки
char * DeleteNull(char *str);
 
//возвращает минимальную из строк
char *MinStr(char *str1, char *str2);
 
//возвращает максимальную из строк
char *MaxStr(char *str1, char *str2);
 
//Проверка знака числа-строки
bool Sgn(char *str);
 
//изменить знак числа-строки
char * ChangeSgn(char *str);
 
//считывает строку
void ReadStr(char *str);
 
//обращение строки
void RevStr(char *str);
 
//Выравнивание строки нулями
void ExpStr(char *str, int exp);
 
//Проверка является ли символ числом от 0 до 9
bool isNumber(char ch);
 
//преобразовнаие 1 char в int
int CharToInt(char ch);
 
//сумма 2 символов чисел с учётом переноса разряда
bool SumChar(char ch1,char ch2,char &result, bool flag);
 
//разность 2 символов с учётом переноса разряда
bool SubChar(char ch1,char ch2,char &result, bool flag);
 
//Сумма чисел-строк
char * Add(const char *num1,const char *num2);
 
//Разность чисел-строк
char *Sub(const char *num1,const char *num2);
 
void main(){
    char *str1 = new char[80]; 
    char *str2 = new char[80];
 
    for(;;){
        system("cls");
    
    cout << "str2: ";
    ReadStr(str2);
    
    cout << str2;
    
    getch();
    }
}
 
//*************************************************
//реализация функций
 
void RevStr(char *str){
    char *start = &str[0];
    
    char *end = &str[strlen (str)-1];
    char t;
 
    while(end > start){
        t = *start;
        *start = *end;
        *end = t;
        end--; start++;
    }
}
 
void ExpStr(char *str, int exp){
    int i = strlen(str);
 
    if(!Sgn(str)){
        ExpStr(str+1,exp);
    }else{
        RevStr(str);
        
        while(strlen(str) != exp){
            str[i++] = '0';
            str[i] = 0;
        }
        RevStr(str);
    }
}
 
bool Sgn(char *str){
    if(*str == '-') return false;
    return true;
}
 
bool isNumber(char ch){
    if(ch >= '0' && ch <= '9') return true;
    return false;
}
 
int CharToInt(char ch){
    if(isNumber(ch)) return ch-'0';
    return -1;
}
 
bool SumChar(char ch1,char ch2,char &result, bool flag){
    int i = (flag)? CharToInt(ch1) + CharToInt(ch2) + 1:
        CharToInt(ch1) + CharToInt(ch2);
 
    if(i < MAX_NUMBER){
        result = i + '0';
        return false;
    }else{
        result = (i % 10) +'0';
        return true;
    }
}
 
char *MinStr(char *str1, char *str2){
    if(strlen(str1) > strlen(str2)) return str2;
    else if(strlen(str1) < strlen(str2)) return str1;
    else return 0;
}
 
char *MaxStr(char *str1, char *str2){
    if(strlen(str1) > strlen(str2)) return str1;
    else if(strlen(str1) < strlen(str2)) return str2;
    else return 0;
}
 
char * Add(const char *str1, const char *str2){
    char *num1 = new char[strlen(str1)+1];
    char *num2 = new char[strlen(str2)+1];
 
    
    strcpy(num1,str1);
    strcpy(num2,str2);
 
    bool flag = false;
    bool sgn1 = Sgn(num1);
    bool sgn2 = Sgn(num2);
 
    if(!sgn1 && sgn2){  
        num1++;
        return DeleteNull(Sub(num2,num1));
    }else if(sgn1 && !sgn2){
        num2++;
        return DeleteNull(Sub(num1,num2));
    }else if(!sgn1 && !sgn2) {
        num1++;
        num2++;
        return DeleteNull(ChangeSgn(Add(num1,num2)));
    }
    
    if(MinStr(num1,num2))
        ExpStr(MinStr(num1,num2),strlen(MaxStr(num1,num2)));
    ExpStr(num1,strlen(num1)+1);
    ExpStr(num2,strlen(num2)+1);
        
    int i;
    char *result = new char[strlen(num1) + 1];
        
    RevStr(num1);
    RevStr(num2);
 
    for(i=0; i < strlen(num1); i++)
        flag = SumChar(num1[i],num2[i],result[i],flag);
 
    result[i] = 0;
    RevStr(result);
    
    DeleteNull(result);
    
    return result;
}
 
bool SubChar(char ch1,char ch2,char &result, bool flag){
    int i = (flag)? CharToInt(ch1) - CharToInt(ch2) -1:
        CharToInt(ch1) - CharToInt(ch2);
 
        if(i < MIN_NUMBER){
        result = MAX_NUMBER + i + '0';
        return true;
    }else{
        result = i +'0';
        return false;
    }
}
 
char * Sub(const char *str1,const char *str2){
    char *num1 = new char[strlen(str1)+1];
    char *num2 = new char[strlen(str2)+1];
    strcpy(num1,str1);
    strcpy(num2,str2);
 
    bool sgn1= Sgn(num1);
    bool sgn2 = Sgn(num2);
    bool flag = false;
    bool flag_max;
 
    if(!sgn1  && sgn2){
        num1++;
        return DeleteNull(ChangeSgn(Add(num2,num1)));
    }else if(sgn1 && !sgn2){
        num2++;
        return DeleteNull(Add(num1,num2));
    }else if(!sgn1 && !sgn2){
        num1++;
        num2++;
        return DeleteNull(Sub(num2,num1));
    }
    
    if(MinStr(num1,num2))
        ExpStr(MinStr(num1,num2),strlen(MaxStr(num1,num2)));
 
    flag_max = (*num1 >= *num2)? true:false;
    
    int i;
    char *result = new char[strlen(num1) + 1];
    
    RevStr(num1);
    RevStr(num2);
 
    if(flag_max){
        for(i=0; i < strlen(num1); i++)
            flag = SubChar(num1[i],num2[i],result[i],flag);
    }else{
        for(i=0; i < strlen(num1); i++)
            flag = SubChar(num2[i],num1[i],result[i],flag);
        result[i++] = '-';
    }
    
    result[i] = 0;
    RevStr(result);
    
    DeleteNull(result);
    
    return result;
}
 
 
 
char * ChangeSgn(char *str){
    char *result = new char[strlen(str) + 2];
 
    if(Sgn(str)){
        result[0] = '-';
        result[1] = 0;
        strcat(result,str); 
 
 
        return result;
    }
    else
        return str + 1;
}
 
 
char * DeleteNull(char *str){
    int i;
    char *result = new char[strlen(str) + 2];
    
    i=0;
 
    if(!Sgn(str)){
        i++;
        strcpy(result,"-");
    }
 
    while(str[i] == '0' && strlen(str + i) > 1)
        i++;
    
    if(!Sgn(str))
        strcpy(result + 1, str+i);
    else
        strcpy(result,str+i);
    strcpy(str,result);
    return str;
}
 
void ReadStr(char *result){
    
    int max_size = 10;
    char ch;
    int memory_size = 0;
 
    delete []result;
    result = new char[max_size + 1]; 
 
    while((ch = getchar())!='\n'){
        result[memory_size] = ch;
        
        memory_size++;
        if(memory_size == max_size){
            char *new_str = new char[memory_size];
            strcpy(new_str,result);
            
            delete []result;
            
            max_size*=2;
            result= new char[max_size];
            strcpy(result,new_str);
        }
 
    }
 
    result[memory_size] = 0;
}
Добавлено через 1 минуту
Вот ещё вопрос (не по теме): если, какая-то функция довольно громоздкая и её можно разбить на подфункцию, стоит ли делать такое разбиение, если подфункций может получится много?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 21:25. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru