Форум программистов, компьютерный форум, киберфорум
Наши страницы
Бета-тестирование
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
softmob
1251 / 701 / 359
Регистрация: 20.02.2010
Сообщений: 1,035
1

Перевод числа с дробной частью между системами счисления

18.09.2011, 18:57. Просмотров 2750. Ответов 24
Метки нет (Все метки)

нужна помощь в тестирование программы(в прикрепленном файле прога в exe)
ну и какие замечания по коду

программа переводит числа с дробной частью из любой системы счисления в любую. т.к. операции происходят в строковом виде отсутствует ограничение на длину исходного числа.
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
#include <iostream>
#include <ostream>
#include <string>
#include <algorithm>
#include <locale>
#include <math.h>
#include <sstream> 
using namespace std;
 
int perevod(string u,string a,int q)
{               
        int z=0;
        for (unsigned int len=0; len<a.size();len++)
        {          
              z*=q;
              z += u.find(toupper(a[len]));        
        }    
        return z;
} 
 
string perevod2(string u,int z,int p)
{  
     string s="";
     for (; z ; z /= p) s += u[z % p];                     
     reverse(s.begin(), s.end()); 
     return s;  
} 
 
string zel(string u,string a,int q,int p)
{
        string c="",snos,rezultat;
        int snos2,j;
        bool x=true;
        unsigned int k=perevod2(u,p,q).size();   
        do
        {
           snos=""; rezultat="";                 
        for(string::size_type i=0;i<a.size();i++)
        {       
        snos += a[i];
        if (snos =="0") {snos = "";}
        if (snos!="")
        {
                snos2=perevod(u,snos,q);
        }
        else 
        {snos2=0;}
        if ((snos2<p) && (i) && (rezultat!="")) {rezultat=rezultat+"0";}
        if (snos2>=p) 
        {               
        j=snos2/p;
                rezultat +=  perevod2(u,j,q);           
                ostringstream ost;
        ost << perevod2(u, snos2%p,q);
                snos = ost.str();                               
        }
}       
        if (snos == "") 
                {
            c+="0";
                }
                else
                {
                   c+= perevod2(u,perevod(u,snos,q),p); 
                }
                a=rezultat;
                if (a.size()<=k)
                {
                        if (perevod(u,a,q)<p){x=false;}
                }
   }while(x==true);  
               
   c+=perevod2(u,perevod(u,a,q),p);
   reverse(c.begin(), c.end()); 
   return c;
}
 
string slozhenie(string u,string a,string b,int q)
{   
    int lena = a.size()-1,lenb = b.size()-1;
    int perenos = 0, achislo=0, bchislo=0, summa=0, i=0;
    string rezultat = "";
 do 
 {
    if (lena >= i)  
    {achislo = u.find(toupper(a[lena - i]));}
    else
    {achislo = 0;}
    
    if (lenb  >= i) 
    {bchislo = u.find(toupper(b[lenb - i]));}
    else
    {bchislo = 0;}
 
    summa = achislo + bchislo + perenos;
    if (summa >= q )
    {
        perenos = summa / q;
        summa = summa % q;
    }
    else
    {perenos = 0;}
     
        rezultat = u[summa]  + rezultat;
        i++;
}while( i <=lena || i <= lenb);
 
if (perenos > 0)
{rezultat =  u[perenos]+ rezultat;}
return rezultat;
}
 
string umnozenie(string u,string a,string b,int q)
{
 
int lena3 = a.size()-1, lenb3 = b.size()-1,perenos3,bchislo3,achislo3,proizvedenie;
string proizv,rezultat3="";
if( lenb3 > lena3) 
{
    swap(a, b);
    swap (lena3, lenb3);
}
 
for(int i = 0; i<=lenb3; i++)
{   
    proizv = "";
    perenos3 = 0;   
    if (lenb3 >= i) 
    {bchislo3 = u.find(toupper(b[lenb3 - i]));}
    else
    {bchislo3 = 0;}
    
    for (int j = 0; j<=lena3; j++)
       {
           if (lena3 >= j) 
        {achislo3 = u.find(toupper(a[lena3 - j]));}
        else
        {achislo3 = 0;}
         
        proizvedenie = achislo3 * bchislo3 + perenos3;
 
        if (proizvedenie >= q) 
           {
           perenos3 = proizvedenie / q;
           proizvedenie = proizvedenie % q;
           }
        else
        {perenos3 = 0;}
                 
        proizv =u[proizvedenie]+proizv;
        }
    if (perenos3 > 0) 
    {proizv = u[perenos3] + proizv;}
        
  rezultat3 = slozhenie(u,rezultat3, proizv + string(i, '0'),q);
  }
     
if (rezultat3.substr(0,1)=="0")
{rezultat3 = "0";}
return rezultat3;
}
 
string drob(string u,string b,int q,int p,int l)
{   
        string di="",w="",pp=perevod2(u,p,q);
        int i=0,znak,kcdz3=0,kvn3=0,len;    
        do  
        {
        i++;
        if ( i>l ){break;}
        znak=b.size()-1;    
        b=b.substr(1);
        for(int h=0;h<znak;h++)
       {          
       if (b[0]=='0') 
       { b=b.substr(1);}
       else
       {break;} 
       }          
        b = umnozenie(u,b,pp,q);
        if (b=="0") {break;}
        len=b.size();
   if((len- znak )> 0)
   {
       b=b.substr(0,b.size()-znak)+"."+b.substr(b.size()-znak);
   }
   else
   {
        kvn3 = (-1)*(b.size() -  znak); 
        b="."+string(kvn3,48)+b;
   }
 
       len=b.size()-1;
 
    for(int y = len; y>=0; y--)
    {
        if (b[b.size()-1]=='0') 
       { b=b.erase(b.size()-1,1);
        }
       else
       {break;}
    }       
    
    di=b.substr(0,b.find('.'));
    if (di=="") {di="0";}
        w+=u[perevod(u,di,q)];
        b=b.erase(0, b.find('.'));
        if (b=="."){break;}
        }while(true); 
        return w;
}
 
int main(void)
{       
   string u("0123456789ABCDEF"),a,b,f1,f2="";
   int q,p;
   int l=30; //знаков после запятой
   cout << "vvedite chislo: "; cin >> a;   
   cout << "vvedite q: "; cin >> q;
   cout << "vvedite p: "; cin >> p; 
   if (a.find(',')!=-1) a[a.find(',')]='.';
   if (a.find('.')!=string::npos) 
   {
   b=a.substr(a.find('.'));
   a=a.substr(0,a.find('.'));  
   }
   f1= zel(u,a,q,p);
   if (b!="")
   {f2="."+drob(u,b,q,p,l);}   
   cout <<string(80,196)<<f1<<f2<<endl;
   system("pause");
}
0
Вложения
Тип файла: rar 2.rar (14.9 Кб, 26 просмотров)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.09.2011, 18:57
Ответы с готовыми решениями:

Перевод чисел из двоичной в десятичную систему счисления с дробной частью
Нужно написать программу которая бы переводила числа с дробной частью из 2ичной системы в 10ричную...

Перевод между Системами счисления
Входящие даные: Любое десятичное число(положительное); Основа системы счисления р (2..16)....

Перевод между системами счисления
Кто знает, как перевести число, заданное в виде массива цифр, из одной системы счисления с...

Перевод между системами счисления
Написать функцию num2dig(n), преобразующую целое число n от 0 до 35 в соответствующий по порядку...

Перевод между системами счисления
Есть ли в adnroid встроенная функция перевода из одной системы счисления в другую?

24
Jupiter
Каратель
Эксперт С++
6573 / 3994 / 400
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
18.09.2011, 19:05 2
softmob, ваша программа не интересна, зачем нам её тестировать?

Цитата Сообщение от softmob Посмотреть сообщение
ну и какие замечания по коду
то что сразу бросается в глаза(и режет глаз!) без компиляции и разбора логики программы:
- использование транслита
- бессмысленные названия переменных
- отсутстве какого дибо форматирования/стиля кода
1
softmob
1251 / 701 / 359
Регистрация: 20.02.2010
Сообщений: 1,035
19.09.2011, 17:36  [ТС] 3
А что плохого в использование транслита?
Про бессмысленные названия переменных эт да, но не все же.
После копирования из MVS строки "разбежались", ну и еще мало с C++ работал..
0
ForEveR
В астрале
Эксперт С++
8003 / 4761 / 653
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
19.09.2011, 17:43 4
softmob, Может быть то, что С++ не поддерживает русский язык (переменные, функции etc.)? Зачем тогда пытаться писать транслитом?
0
co6ak
Кошковед
516 / 504 / 63
Регистрация: 12.04.2010
Сообщений: 1,392
19.09.2011, 17:46 5
это как меня на работе заставили переводить все комменты к коду с английского в транслитерацию. это вобще зверство. какого хрена им вобще копошиться в моем коде, не понятно
0
Kastaneda
19.09.2011, 17:48
  #6

Не по теме:

Когда я только начинал программировать, тоже грешил транслитом. Однажды наткнулся на статью про быдлокодеров, где сказанно, что они (быдлокодеры) любят называть переменные и ф-ции русскими словами, используя транслит. После этого как отрезало! :D

1
softmob
1251 / 701 / 359
Регистрация: 20.02.2010
Сообщений: 1,035
19.09.2011, 21:30  [ТС] 7
Цитата Сообщение от ForEveR Посмотреть сообщение
softmob, Может быть то, что С++ не поддерживает русский язык (переменные, функции etc.)? Зачем тогда пытаться писать транслитом?
как тогда писать? английский не изучал..
0
Alligieri
CEO
Эксперт С++
2254 / 1244 / 57
Регистрация: 16.03.2009
Сообщений: 3,588
19.09.2011, 22:12 8
Цитата Сообщение от softmob Посмотреть сообщение
английский не изучал..
И это якобы намекает что пора изучить
0
softmob
1251 / 701 / 359
Регистрация: 20.02.2010
Сообщений: 1,035
20.09.2011, 10:22  [ТС] 9
Ну учить английский придется в любом случае.
0
anonimus
2156 / 1246 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
20.09.2011, 11:27 10
да что вы гоните, какая разница как он называет переменные и использует транслит или нет, конечно в таком коде разбираться не охота, но это ж раздел тестирования программ.
ТС а зачем ты вообще исходник выложил?
0
softmob
1251 / 701 / 359
Регистрация: 20.02.2010
Сообщений: 1,035
21.09.2011, 07:37  [ТС] 11
Тему переместили из раздела с++, выкладывал чтоб дали советы по коду. Ну и может кому нибудь пригодится

Добавлено через 14 часов 45 минут
Надо найти при каких значения ответ не верный, возникает ошибка или еще что. Если ли задержка при переводе длинных чисел и насколько она критична. Посоветуйте что можно изменить для более быстрой работы?
0
Jupiter
Каратель
Эксперт С++
6573 / 3994 / 400
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
21.09.2011, 23:24 12
Цитата Сообщение от softmob Посмотреть сообщение
Посоветуйте что можно изменить для более быстрой работы?
не использовать std::string, а напрямую работатьс массивом int-ов
1
softmob
1251 / 701 / 359
Регистрация: 20.02.2010
Сообщений: 1,035
24.09.2011, 18:36  [ТС] 13
переделал на работу с vector.
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
#include <iostream>
#include <string>
#include <locale>
#include <vector>
using namespace std;
 
string zel(vector<int>& a,int q,int p,string u)
{
    string c;
    int snos,j,la=a.size();
 
    do
    {
        j=0;
        snos=0;      
 
        for(int i=0;i<la;i++)
        {       
            snos*=q;        
            snos += a[i];
            if ((snos<p) && (i) && (j) ) {a[j]=0;j++;}
 
            if (snos>=p) 
            {   
                a[j] = snos/p;  
                snos=snos%p;   
                j++;
            }
        } 
        a.resize(j);
        c = u[snos]+c;
        la=j;   
    }while(la);  
    return c;
}
 
vector<int> slozhenie(vector<int>& a,vector<int>& b,int x,int q,string u)
{   
    int lres=b.size(), len=a.size();
    int perenos = 0, achislo, bchislo, summa, i=0;
    vector<int> res;
 
    do 
    {
        if ((len+x > i)&& (i>=x))
        {
            achislo = a[i-x];
        }
        else
        {achislo = 0;}
 
        if (lres > i) 
        {bchislo = b[i];}
        else
        {bchislo = 0;}
 
        summa = achislo + bchislo + perenos;
 
        if (summa >= q )
        {
            perenos = summa / q;
            summa = summa % q;
        }
        else
        {perenos = 0;}
 
        res.push_back(summa);
        i++;
    }while((len+x>i)||(lres>i));
 
    if (perenos > 0)
    {
        res .push_back( perenos);
    }
    return res;
}
 
vector <int> umnozenie(vector<int>& a,vector<int>& p,int q,string u)
{
    vector <int> b=p;
    int perenos,achislo,bchislo,proizvedenie;
    int la=a.size(), lb=b.size();
    if( la > lb) 
    {
        swap(a, b);
        swap (la, lb);
    }
    vector<int> proizv;
    vector<int> res;
    for(int i = 0; i<lb; i++)
    {
        proizv.clear(); 
        perenos = 0;       
 
        if (lb >= i) 
        {bchislo = b[lb - i-1];}
        else
        {bchislo = 0;}
 
        for (int j = 0; j<la; j++)
        {
            if (la >= j) 
            {achislo = a[la - j-1];}
            else
            {achislo = 0;}
 
            proizvedenie = achislo * bchislo+ perenos;
 
            if (proizvedenie >= q) 
            {
                perenos = proizvedenie / q;
                proizvedenie = proizvedenie % q;
            }
            else
            {perenos = 0;}      
 
            proizv.push_back(proizvedenie);
        }
        if (perenos > 0) {proizv.push_back( perenos);}
 
        res=slozhenie(proizv,res,i,q,u);
    }   
    return res;
}
 
string drob(vector<int>& b,int q,vector <int>& p,int l,string u)
{       
    string w;
    int znak,lzel,i=0,sum,kvn3=0;
    vector<int> umnoz;      
    do  
    {
        sum=0;
        i++;
        znak=b.size()+kvn3;
 
        while((!b[0]) && (b.size()>0)) {b.erase(b.begin());}
 
        umnoz=umnozenie(b,p,q,u);
        lzel=umnoz.size()-znak;
 
        if( lzel >0) 
        {
            for (int t=0;t<lzel;t++)
            { 
                sum*=q;
                sum+=umnoz[umnoz.size()-1];
                umnoz.pop_back();
            }
        }
        else
        {
            sum=0;
            kvn3 = (-1)*lzel; 
        }
 
        w+=u[sum];
        b.clear(); 
 
        for (unsigned int t=0;t<umnoz.size();t++) 
        {b.push_back(umnoz[umnoz.size()-t-1]);} 
        while((!b[b.size()-1]) && (b.size()>0))  {b.pop_back();}
 
    }while((i<l) && (!b.empty())); 
    return w;
}
 
void output(string a,int q,int p,int l)
{
    string u("0123456789ABCDEF"),b,f1,f2;
 
    if (a.find(',')!=-1) a[a.find(',')]='.';
 
    if (a.find('.')!=string::npos) 
    {
        b=a.substr(a.find('.')+1);
        a=a.substr(0,a.find('.'));  
    }
    vector<int> array;
    for (unsigned int i=0;i<a.size();i++) array.push_back(u.find(toupper(a[i])));
 
    f1=zel(array,q,p,u);
 
    if (b!="")
    {
        vector<int> array2;
        for (unsigned int i=0;i<b.size();i++) 
        {array2.push_back(u.find(toupper(b[i])));}
        vector <int> pp2,pp;
        int p2=p;
 
        for (; p2 ; p2 /= q) {pp2.push_back(p2 % q);} 
 
        for (unsigned int t=0;t<pp2.size();t++)
        {   
            pp.push_back(pp2[pp2.size()-t-1]); 
        } 
 
        f2="."+drob(array2,q,pp,l,u);
    }   
    cout << string(80,'_') << f1 << f2 << endl;
}
 
void main(void)
{       
    setlocale(LC_ALL,"Russian");
    string a;       
    int q,p;
    cout << "Введите число: "; cin >> a;  
    cout << "Введите исходную систему счисления: "; cin >> q;
    cout << "Введите конечную систему счисления: "; cin >> p;
    int l=30; //знаков после запятой
    output(a,q,p,l);
    system("pause");
}
0
StoneSoul
14 / 5 / 0
Регистрация: 29.09.2011
Сообщений: 19
29.09.2011, 23:50 14
softmob, на вин7 програма при запуске выдает ошибку, что не может запуститься из-за отсутсвия MSVCP100.dll
0
softmob
1251 / 701 / 359
Регистрация: 20.02.2010
Сообщений: 1,035
03.10.2011, 21:34  [ТС] 15
StoneSoul, установите Microsoft Visual C++ 2010 Redistributable Package или скомпилируйте на своем компе из исходника.
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
#include <iostream>
#include <string>
#include <locale>
#include <vector>
using namespace std;
 
string zel(vector<int>& a,int q,int p,string u)
{
    string c;
    int snos,j,la=a.size();
 
    do
    {
        j=0;
        snos=0;      
 
        for(int i=0;i<la;i++)
        {       
            snos*=q;        
            snos += a[i];
            if ((snos<p) && (i) && (j) ) {a[j]=0;j++;}
 
            if (snos>=p) 
            {   
                a[j] = snos/p;  
                snos=snos%p;   
                j++;
            }
        } 
        a.resize(j);
        c = u[snos]+c;
        la=j;   
    }while(la);  
    return c;
}
 
vector<int> slozhenie(vector<int>& a,vector<int>& b,int x,int q,string u)
{       
    int lres=b.size(), len=a.size();
    int perenos = 0, achislo, bchislo, summa, i=0;
    vector<int> res;
 
    do 
    {
        if ((len+x > i)&& (i>=x))
        {
            achislo = a[i-x];
        }
        else
        {achislo = 0;}
 
        if (lres > i) 
        {bchislo = b[i];}
        else
        {bchislo = 0;}
 
        summa = achislo + bchislo + perenos;
 
        if (summa >= q )
        {
            perenos = summa / q;
            summa = summa % q;
        }
        else
        {perenos = 0;}
 
        res.push_back(summa);
        i++;
    }while((len+x>i)||(lres>i));
 
    if (perenos > 0)
    {
        res .push_back( perenos);
    }
    return res;
}
 
vector <int> umnozenie(vector<int>& a,vector<int>& p,int q,string u)
{
    vector <int> b=p;
    int perenos,achislo,bchislo,proizvedenie;
    int la=a.size(), lb=b.size();
    if( la > lb) 
    {
        swap(a, b);
        swap (la, lb);
    }
    vector<int> proizv;
    vector<int> res;
    for(int i = 0; i<lb; i++)
    {
        proizv.clear(); 
        perenos = 0;       
 
        if (lb >= i) 
        {bchislo = b[lb - i-1];}
        else
        {bchislo = 0;}
 
        for (int j = 0; j<la; j++)
        {
            if (la >= j) 
            {achislo = a[la - j-1];}
            else
            {achislo = 0;}
 
            proizvedenie = achislo * bchislo+ perenos;
 
            if (proizvedenie >= q) 
            {
                perenos = proizvedenie / q;
                proizvedenie = proizvedenie % q;
            }
            else
            {perenos = 0;}          
 
            proizv.push_back(proizvedenie);
        }
        if (perenos > 0) {proizv.push_back( perenos);}
 
        res=slozhenie(proizv,res,i,q,u);
    }       
    return res;
}
 
string drob(vector<int>& b,int q,vector <int>& p,int l,string u)
{       
    string w;
    int znak,lzel,i=0,sum,kvn=0;
    vector<int> umnoz;              
    do  
    {
        sum=0;
        i++;
        znak=b.size()+kvn;
 
        while((!b[0]) && (b.size()>0)) {b.erase(b.begin());}
 
        umnoz=umnozenie(b,p,q,u);
        lzel=umnoz.size()-znak;
 
        if( lzel >0) 
        {
            for (int t=0;t<lzel;t++)
            { 
                sum*=q;
                sum+=umnoz[umnoz.size()-1];
                umnoz.pop_back();
            }
        }
        else
        {
            sum=0;
            kvn = (-1)*lzel; 
        }
 
        w+=u[sum];
        b.clear(); 
 
        for (unsigned int t=0;t<umnoz.size();t++) 
        {b.push_back(umnoz[umnoz.size()-t-1]);} 
        while((!b[b.size()-1]) && (b.size()>0))  {b.pop_back();}
 
    }while((i<l) && (!b.empty())); 
    return w;
}
 
string output(string a,int q,int p,int l)
{
    string u("0123456789ABCDEF"),b,f1,f2;
 
    if (a.find(',')!=-1) a[a.find(',')]='.';
 
    if (a.find('.')!=string::npos) 
    {
        b=a.substr(a.find('.')+1);
        a=a.substr(0,a.find('.'));  
    }
    vector<int> array;
    for (unsigned int i=0;i<a.size();i++) array.push_back(u.find(toupper(a[i])));
 
    f1=zel(array,q,p,u);
 
    if (b!="")
    {
        vector<int> array2;
        for (unsigned int i=0;i<b.size();i++) 
        {array2.push_back(u.find(toupper(b[i])));}
        vector <int> pp2,pp;
        int p2=p;
 
        for (; p2 ; p2 /= q) {pp2.push_back(p2 % q);} 
 
        for (unsigned int t=0;t<pp2.size();t++)
        {   
            pp.push_back(pp2[pp2.size()-t-1]); 
        } 
 
        f2="."+drob(array2,q,pp,l,u);
    }   
    return f1+f2;
}
 
int main(void)
{       
    setlocale(LC_ALL,"Russian");
    string a;               
    int q,p;
    cout << "Введите число: "; cin >> a;  
    cout << "Введите исходную систему счисления: "; cin >> q;
    cout << "Введите конечную систему счисления: "; cin >> p;
    int l=30; //знаков после запятой
    cout << string(80,'_') << output(a,q,p,l) << endl;
    system("pause");
}
0
Casper-SC
Эксперт .NET
3980 / 1869 / 367
Регистрация: 27.03.2010
Сообщений: 5,219
Записей в блоге: 1
03.10.2011, 22:02 16
Цитата Сообщение от softmob Посмотреть сообщение
StoneSoul, установите Microsoft Visual C++ 2010 Redistributable Package или скомпилируйте на своем компе из исходника.
простое решение. Подозреваю ради этого устанавливать себе что-то не будут. Ну как минимум лень и нехватка времени (у кого как).
0
softmob
1251 / 701 / 359
Регистрация: 20.02.2010
Сообщений: 1,035
15.10.2011, 14:57  [ТС] 17
теперь должно запускаться на других компах норм.
код
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
#include <iostream>
#include <string>
#include <deque>
#include <locale>
using namespace std;
 
string zel(deque<int>& a,int q,int p,string u)
{
    string c;
    int snos,j,la=a.size();
 
    do
    {
        j=0;
        snos=0;      
 
        for(int i=0;i<la;i++)
        {       
            snos*=q;        
            snos += a[i];
            if (snos<p && i && j) {a[j]=0;j++;}
 
            if (snos>=p) 
            {   
                a[j] = snos/p;  
                snos=snos%p;   
                j++;
            }
        } 
        a.resize(j);
        c = u[snos]+c;
        la=j;   
    }while(la);  
    return c; 
}
 
deque<int> slozhenie(deque<int>& a,deque<int>& b,int q)
{ 
    deque<int> res;
    if (a.empty()) 
        res=b;
    else
    {
        int lena=a.size()-1,lenb=b.size()-1;
        int perenos = 0, achislo, bchislo, summa, i=0;
 
        do 
        {
            if (lena>=i)
                achislo = a[lena-i];
            else
                achislo = 0;
 
            if (lenb >= i) 
                bchislo = b[lenb-i];
            else
                bchislo = 0;
 
            summa = achislo + bchislo + perenos;
 
            if (summa >= q )
            {
                perenos = summa / q;
                summa = summa % q;
            }
            else
                perenos = 0;
 
            res.push_front(summa);
            i++;
        }while(lena>=i||lenb>=i);
 
        if (perenos > 0)    res.push_front( perenos);
    }
    return res;
}
 
deque <int> umnozenie(deque<int>& aa,deque<int>& bb,int q)
{
    deque<int> proizv,res,a=aa,b=bb;
    if(a.size()>b.size()) swap(a,b);
    int perenos,proizvedenie,h=0,k=0;
 
    while(!a.empty() && !a.back())  {a.pop_back(); h++;}    
    while(!b.empty() && !b.back())  {b.pop_back(); h++;}
 
    for(int i = a.size()-1; i>=0; i--)
    {
        proizv.clear(); 
        perenos = 0;       
 
        for (int j = b.size()-1; j>=0; j--)
        {           
            proizvedenie = a[i] * b[j] + perenos;
 
            if (proizvedenie >= q) 
            {
                perenos = proizvedenie / q;
                proizvedenie = proizvedenie % q;
            }
            else
                perenos = 0;         
 
            proizv.push_front(proizvedenie);
        }
 
        if (perenos > 0) proizv.push_front(perenos);
        proizv.resize(proizv.size()+k);
        res=slozhenie(res,proizv,q);
        k++;
    }       
 
    res.resize(res.size()+h);
    return res;
}
 
string drob(deque<int>& b,int q,deque <int>& p,int l,string u)
{       
    string w;
    int znak,lzel,i=0,sum,kvn=0;
    deque<int> umnoz;      
    while(!b.empty() && !b.front()) {b.pop_front();kvn++;}
 
    do  
    {
        i++;
        znak=b.size()+kvn;
 
        umnoz=umnozenie(b,p,q);
        b.clear(); 
 
        lzel=umnoz.size()-znak;
        sum=0;
 
        if( lzel >0) 
        {
            for (int t=0;t<lzel;t++)
            { 
                sum*=q;
                sum+=umnoz.front();
                umnoz.pop_front();
            }
        }
        else
        {
            sum=0;
            kvn = (-1)*lzel; 
        }
 
        w+=u[sum];
 
        while(!umnoz.empty() && !umnoz.front()) {umnoz.pop_front(); kvn++;}
        b=umnoz;
        umnoz.clear(); 
    }while((i<l) && !b.empty()); 
    return w;
}
 
string output(string a,int q,int p,int l)
{
    string u("0123456789ABCDEF"),b,res;
 
    if (a.find(',')!=string::npos) a[a.find(',')]='.';
 
    if (a.find('.')!=string::npos) 
    {
        b=a.substr(a.find('.')+1);
        a=a.substr(0,a.find('.'));  
    }
 
    deque<int> array;
    for (unsigned int i=0;i<a.size();i++) array.push_back(u.find(toupper(a[i])));
 
    res=zel(array,q,p,u);
 
    if (b.size())
    {
        deque<int> array2,pp;
        for (unsigned int i=0;i<b.size();i++) 
            array2.push_back(u.find(toupper(b[i])));
 
        for (int p2=p; p2; p2 /= q) pp.push_front(p2 % q);
 
        res+="."+drob(array2,q,pp,l,u);
    }    
    return res;
}
 
int main(void)
{     
    setlocale(LC_ALL,"Russian");
    string a;               
    int q,p;
    cout << "Введите число: "; cin >> a;  
    cout << "Введите исходную систему счисления: "; cin >> q;
    cout << "Введите конечную систему счисления: "; cin >> p;
    int l=30; 
    cout << string(80,'_') << output(a,q,p,l) << endl;
    system("pause");
}
0
Вложения
Тип файла: rar Projects.rar (72.6 Кб, 12 просмотров)
Casper-SC
Эксперт .NET
3980 / 1869 / 367
Регистрация: 27.03.2010
Сообщений: 5,219
Записей в блоге: 1
15.10.2011, 16:30 18
Что должно происходить при запуске эксешника? Окно консольное появляться? Я запускал, у меня 5 процессов висело в памяти и никаких окон. Видимо что-то заглючило...

Не по теме:

Почему у большинства (может я просто видел исключительно такой код???) пишущих на С++ такой ппц в коде? Может я просто привык, к нормальному форматированию и стилю именования в C#, но после него самого смотрю на С++ код и офигеваю.

0
Kastaneda
15.10.2011, 18:24
  #19

Не по теме:

Цитата Сообщение от Casper-SC Посмотреть сообщение
Почему у большинства (может я просто видел исключительно такой код???) пишущих на С++ такой ппц в коде?
Что именно?

0
Casper-SC
Эксперт .NET
3980 / 1869 / 367
Регистрация: 27.03.2010
Сообщений: 5,219
Записей в блоге: 1
15.10.2011, 18:55 20
Цитата Сообщение от Kastaneda Посмотреть сообщение
Что именно?
Ну начнём:
C++
1
deque<int> slozhenie(deque<int>& a,deque<int>& b,int q)
Что это за названия: a, b, q? Как будто обфускатором прошлись. То есть это уже минус, который вижу часто.

Нельзя открыть хотя-бы гугл транслэйт и перевести: "Сложение", на английский: "Addition"?

Я бы как минимум сделал так:
C++
1
deque<int> Addition(deque<int>& someBlaBlaA, deque<int>& someBlaBlaB, int someBlaBlaQ)
someBlaBla.. я просто не вникал в код, так что не скажу что это вообще за переменные. Просто я хотел этим сказать, что я бы более менее нормально попытался бы назвать их, чтобы название отражало суть переменной. Как можно было заметить я ещё и пробелы поставил после запятых в параметрах.

Про пробелы. Сейчас в коде так:
C++
1
int snos,j,la=a.size();
Я бы сделал так:
C++
1
int snos, j, la = a.size();
Или вообще так (вероятнее всего, так как всегда так и делаю):
C++
1
2
3
int snos; //= a.size();
int j; //= a.size(); //не знаю, вроде в С++ это можно развернуть в это (что закомментировано)
int la = a.size();
Я не проинициализировал (в примере) с помощью = a.size(); каждую строку, так как в C# выше приведённый пример был бы равен примеру ещё выше, потому-что в одну строку нужно писать = a.size(); напротив каждой переменной, как в С++ я точно не в курсе пока, то есть:
C#
1
    int snos = a.size(), j = a.size(), la = a.size();
Короче это небольшое отступление от темы.

Вот момент:
C++
1
2
3
4
do 
{
    //------
}while(lena>=i||lenb>=i);
Я бы написал:
C++
1
2
3
4
5
do 
{
    //------
}
while(lena >= i || lenb >= i); //на имена переменных внимание не обращаем конечно же.
Вообще в C# есть комбинация клавишь: Ctrl + E, D после её нажатия весь код автоматически форматируется, появляются все отступы, переносы и т.д. Может из-за этого мне так привычно, чтобы везде всё было красиво в одном стиле.

Ну и ещё бывало, что-то удивляло, сейчас не вспомню.

Больше всего не понимаю, то что называют всё с маленькой буквы, ладно ещё так: someMethod() {}, иногда вообще так: somemethod() {} или some_method() {}
Просто привык писать так: SomeMethod() {}

P.S. Я никого тут не учу и не пытаюсь оскорбить автора темы. Меня спросили, я высказал мнение. Надеюсь на понимание.
0
15.10.2011, 18:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.10.2011, 18:55

Перевод чисел между различными системами счисления
о Делфи: нужно создать кнопки: для перевода чисел из восьмеричной системы счисления в десятичную,...

Перевод чисел между системами счисления в Делфи
Помогите написать программу которая переводит вещественные числа из десятичной в любую другую...

Перевод между системами счисления (нужно дополнить программку).
Ребята, есть программа, для перевода чисел из одной системы счисления в другую. Всё работает,...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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