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

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

18.09.2011, 18:57. Просмотров 2752. Ответов 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
15.10.2011, 23:42     Перевод числа с дробной частью между системами счисления
  #21

Не по теме:

Casper-SC, хоть вы и сторонник C#, а я сторонник С++, но по поводу стиля оформления кода и транслита с вами абсолютно согласен

Цитата Сообщение от Casper-SC Посмотреть сообщение
Больше всего не понимаю, то что называют всё с маленькой буквы, ладно ещё так: someMethod() {}, иногда вообще так: somemethod() {} или some_method() {}
Просто привык писать так: SomeMethod() {}
в шарпе да и в .NET вообще, называть с большой буквы рекомендует MS, но в разных компаниях/командах/фреймворках свой code style, вот его и придерживаются

2
softmob
1251 / 701 / 359
Регистрация: 20.02.2010
Сообщений: 1,035
16.10.2011, 11:09  [ТС] 22
какой стиль можно выработать за месяц с небольшим?
в принципе согласен с замечаниями. но вот какой смысл не зная английского пытаться писать названия переменных на нем. за каждым названием лезть в переводчик, а потом каждый раз когда переменная используется искать её по программе и копипастить.

подправил
код
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
#include <iostream>
#include <string>
#include <deque>
#include <locale>
using namespace std;
 
string integer(deque<int>& a ,int q, int p, string u)
{
    string res;
    int demolition, j, lena = a.size();
 
    do
    {
        j = 0;
        demolition = 0;      
 
        for(int i = 0; i < lena; i++)
        {       
            demolition *= q;        
            demolition += a[i];
 
            if (demolition < p && i && j) {a[j] = 0; j++;}
 
            if (demolition >= p) 
            {   
                a[j] = demolition / p;  
                demolition %= p;   
                j++;
            }
        } 
        a.resize(j);
        res = u[demolition] + res;
        lena = j;   
    }
    while(lena);
    return res; 
}
 
deque<int> addition(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 transfer = 0, anumber, bnumber, amount, i = 0;
 
        do 
        {
            if (lena >= i)
                anumber = a[lena-i];
            else
                anumber = 0;
 
            if (lenb >= i) 
                bnumber = b[lenb-i];
            else
                bnumber = 0;
 
            amount = anumber + bnumber + transfer;
 
            if (amount >= q)
            {
                transfer = amount / q;
                amount %= q;
            }
            else
                transfer = 0;
 
            res.push_front(amount);
            i++;
        }
        while(lena >= i || lenb >= i);
 
        if (transfer > 0) res.push_front(transfer);
    }
    return res;
}
 
deque <int> multiplication(deque<int>& aa, deque<int>& bb, int q)
{
    deque<int> r, res, a = aa, b = bb;
    if(a.size() > b.size()) swap(a, b);
    int transfer, product, 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--)
    {
        r.clear(); 
        transfer = 0;       
 
        for (int j = b.size() - 1; j >= 0; j--)
        {           
            product = a[i] * b[j] + transfer;
 
            if (product >= q) 
            {
                transfer = product / q;
                product %= q;
            }
            else
                transfer = 0;         
 
            r.push_front(product);
        }
 
        if (transfer > 0) r.push_front(transfer);
        r.resize(r.size() + k);
        res = addition(res, r, q);
        k++;
    }       
 
    res.resize(res.size() + h);
    return res;
}
 
string fractional(deque<int>& b, int q, deque <int>& p, int l, string u)
{       
    string res;
    int signs,LenInteger, i = 0, sum, SignsFractional = 0;
    deque<int> r;      
    while(!b.empty() && !b.front()) {b.pop_front(); SignsFractional++;}
 
    do  
    {
        i++;
        signs = b.size() + SignsFractional;
 
        r = multiplication(b, p, q);
        b.clear(); 
 
        LenInteger = r.size() - signs;
        sum = 0;
 
        if(LenInteger > 0) 
        {
            for (int t = 0; t < LenInteger; t++)
            { 
                sum *= q;
                sum += r.front();
                r.pop_front();
            }
        }
        else
        {
            sum = 0;
            SignsFractional = (-1) * LenInteger; 
        }
 
        res += u[sum];
 
        while(!r.empty() && !r.front()) 
        {
            r.pop_front();
            SignsFractional++;
        }
 
        b = r;
        r.clear(); 
    }
    while(i < l && !b.empty()); 
    return res;
}
 
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 = integer(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 += "." + fractional(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
Casper-SC
Эксперт .NET
3980 / 1869 / 367
Регистрация: 27.03.2010
Сообщений: 5,219
Записей в блоге: 1
16.10.2011, 12:34 23
Цитата Сообщение от softmob Посмотреть сообщение
но вот какой смысл не зная английского пытаться писать названия переменных на нем. за каждым названием лезть в переводчик, а потом каждый раз когда переменная используется искать её по программе и копипастить.
Ты выучишь эти слова постепенно, так как придётся пользоваться часто, транслит это вообще не тема (имхо). Короче транслит не в почёте.

Цитата Сообщение от softmob Посмотреть сообщение
какой стиль можно выработать за месяц с небольшим?
Можно. Если хотеть его выработать. Мне так кажется.
0
softmob
1251 / 701 / 359
Регистрация: 20.02.2010
Сообщений: 1,035
17.10.2011, 22:06  [ТС] 24
Цитата Сообщение от Casper-SC Посмотреть сообщение
Можно. Если хотеть его выработать. Мне так кажется.
после qbasic где код принудительно форматируется и нет чувствительности к регистру имен переменных как то не особо обращаешь внимание на оформление кода, максимум автоформатирование ctrl + k + f.

Добавлено через 10 минут
Цитата Сообщение от Casper-SC Посмотреть сообщение
Ты выучишь эти слова постепенно, так как придётся пользоваться часто, транслит это вообще не тема (имхо). Короче транслит не в почёте.
вроде как понять свою программу с именами на транслите легче.
конечно изучать английский рано или поздно все равно придется..
0
softmob
1251 / 701 / 359
Регистрация: 20.02.2010
Сообщений: 1,035
17.03.2012, 16:13  [ТС] 25
обновил программу, была ошибка с переводом дробной части, теперь должно правильно переводить.
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
#include <iostream>
#include <string>
#include <deque>
#include <locale>
using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::deque;
 
string integer(deque<int>& a, int q, int p, string u)
{
    string res;
    int demolition;
    deque<int>::size_type i, j;
 
    do
    {
        j = 0;
        demolition = 0;      
 
        for (i = 0; i != a.size(); i++)
        {       
            demolition *= q;        
            demolition += a[i];
 
            if (demolition < p && i && j) 
            {
                a[j] = 0; 
                j++;
            }
 
            if (demolition >= p) 
            {   
                a[j] = demolition / p;  
                demolition %= p;   
                j++;
            }
        } 
 
        a.resize(j);
        res = u[demolition] + res;
    }
    while(!a.empty());
 
    return res; 
}
 
deque<int> multiplication(deque<int>& a, int p, int q)
{
    deque<int> res;
    int transfer = 0, product;  
 
    for (deque<int>::size_type i = a.size(); i != 0; i--)
    {        
        product = a[i - 1] * p + transfer;
 
        if (product >= q) 
        {
            transfer = product / q;
            product %= q;
        }
        else
            transfer = 0;         
 
        res.push_front(product);
    }
 
    while(transfer)
    {
        res.push_front(transfer % q);
        transfer /= q;
    }
 
    return res;
}
 
string fractional(deque<int>& b, int q, int p, const int l, string u)
{       
    string res;
    int lenInteger, sum, signsFractional = b.size();
    deque<int> r;      
 
    while(!b.empty() && !b.front()) 
        b.pop_front(); 
 
    for (int i = 0; i != l && !b.empty(); i++)
    {
        r = multiplication(b, p, q);    
        b.clear();
 
        lenInteger = r.size() - signsFractional;         
        signsFractional = r.size() - lenInteger;
        sum = 0;
 
        if (lenInteger > 0)         
        {
            for (int t = 0; t < lenInteger; t++)
            { 
                sum *= q;
                sum += r.front();
                r.pop_front();
            }
        }
        res += u[sum];
 
        while(!r.empty() && !r.back()) 
        {
            r.pop_back();
            signsFractional--;
        }
 
        b = r;
        r.clear(); 
    }
 
    return res;
}
 
int main(void)
{     
    setlocale(LC_ALL,"Russian");
    string a, b, res, u("0123456789ABCDEF");
    const int l = 30; 
    int q, p;   
    cout << "Введите число: "; cin >> a;  
    cout << "Введите исходную систему счисления: "; cin >> q;
    cout << "Введите конечную систему счисления: "; cin >> p;
 
    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(a.size());
    for (string::size_type i = 0; i != a.size(); i++)
        array[i] = u.find(toupper(a[i]));
 
    res = integer(array, q, p, u);
 
    if (!b.empty())
    {
        deque<int> array2(b.size());
        for (string::size_type i = 0; i != b.size(); i++) 
            array2[i] = u.find(toupper(b[i]));
 
        res += "." + fractional(array2, q, p, l, u);
    }    
 
    cout << string(80, '_') << res << endl;
    return 0;
}
попросил друга прикрутить графическим интерфейсом, результат в прикрепленном файле.
сам с графическим режимом не работал, без понятия как его реализовывать.
1
Вложения
Тип файла: rar transfer.rar (38.7 Кб, 12 просмотров)
17.03.2012, 16:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.03.2012, 16:13

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

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

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


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

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

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