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

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

Войти
Регистрация
Восстановить пароль
 
ZaLiZo
0 / 0 / 0
Регистрация: 24.05.2011
Сообщений: 3
#1

Перевод вещественных из системы в систему, сравнение вещественных - C++

24.05.2011, 10:47. Просмотров 831. Ответов 4
Метки нет (Все метки)

Есть задача: задаются в восьмеричной системе число а, число b, число h, нужно отобразить все числа от a до b с шагом h в восьмеричном и двоичном виде. Задача осложняется тем, что число дробное, т.е. вещественное с модулем меньше 1.
а теперь что я сообразил+следы моих извращений:
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
#include <iostream.h>
#include <fstream.h>
#include <stdio.h>
#include <math.h>
 
int fractoint(double x)
{
    double r=x;
    int p;
    while (r-(int)r>0.0)
    {
        r*=10;
    }
    p=(int)r;
    return p;
}
 
int octtodec(int x)
{
    int dec=0, k=0, n=x;
    while (n!=0)
    {
        dec+=(n%10)*pow(8, (float)k);
        k++;
        n/=10;
    }
    return dec;
}
 
int dectooct(int x)
{
    int dec=0, k=0, n=x;
    while (n!=0)
    {
        dec+=(n%8)*pow(10, (float)k);
        k++;
        n/=8;
    }
    return dec;
}
 
int dectobin(int x)
{
    int dec=0, k=0, n=x;
    while (n!=0)
    {
        dec+=(n%2)*pow(10, (float)k);
        k++;
        n/=2;
    }
    return dec;
}
 
int zeroscount(double x)
{
    int n=0;
    float z=x;
    bool digenc=true;
    while (digenc)
    {
        z*=10;
        if ((int)z==0)
        {
            n++;
        }
        if((int)z!=0)
        {
            digenc=false;
        }
    }
    return n;
}
 
void main()
{
    float a, b, h, xd, ad, bd, hd;
    cout<<"a = ";
    cin>>a;
    if (abs(a)>=1) {cout<<"slishkom bolshoe chislo"; return;}
    cout<<"b = ";
    cin>>b;
    if (abs(b)>=1) {cout<<"slishkom bolshoe chislo"; return;}
    cout<<"shag h = ";
    cin>>h;
    if (abs(h)>=1) {cout<<"slishkom bolshoe chislo"; return;}
 
    char strnda[12]="0.", strndb[12]="0.", strndh[12]="0.", strnpd[10];
    int xdd, hdd, bdd;
    for (int i=0; i<zeroscount(a); i++) strcat(strnda, "0");
    for (int i=0; i<zeroscount(b); i++) strcat(strndb, "0");
    for (int i=0; i<zeroscount(h); i++) strcat(strndh, "0");
    strcat(strnda, itoa(octtodec(fractoint(a)), strnpd, 10));
    strcat(strndb, itoa(octtodec(fractoint(b)), strnpd, 10));
    strcat(strndh, itoa(octtodec(fractoint(h)), strnpd, 10));
    ad=atof(strnda);
    bd=atof(strndb);
    hd=atof(strndh);
    xd=ad;
 
 
    int n=0;
 
    while (xd<bd)
    {
        cout<<n<<endl;
        char strng[12]="0.", strnb[32]="0.", strnp[30];
        for (int i=0; i<zeroscount(xd); i++) {strcat(strng, "0"); strcat(strnb,"0");};
        strcat(strng, itoa(dectooct(fractoint(xd)), strnp, 10));
        cout<<strng<<endl;
        strcat(strnb, itoa(dectobin(fractoint(xd)), strnp, 10));
        cout<<strnb<<endl;
        n++;
        xd+=hd;
    }
 
    cin.get();
    cin.get();
}
где fractoint извлекает из числа дробную часть в инт (причем r-(int)r - слабое место программы вообще, часто падает), три функции переводят числа из системы в систему, zeroscount считает количество нулей между точкой и числом отличным от нуля, потому что при выводе дробного хвоста в инт нули спереди теряются.
Дальше, собственно, сама программа:
Ввожу a, b, h, перевожу их в десятичный вид через строки (так компактнее показалось и нули не теряю), получаю соответственно ad, bd, hd, xd. Десятичный вид мне нужен чтобы правильно шаг считать.
А вот дальше - затык. Естественно такое сравнение вещественных ничего не дает, в цикл, соответственно, не заходит. Пытался преобразовать ad, bd, hd, xd в целые (извлечь дробную часть, в смысле), но тут прога ломается на fractoint. В общем что делать чтобы оно хотя бы заработало и хотя бы приблизительно считало?
Пишу под 2009 билдер.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.05.2011, 10:47
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перевод вещественных из системы в систему, сравнение вещественных (C++):

Перевод вещественных чисел из двоичной системы счисления в десятичную - C++
Перевод вещественных чисел из двоичной системы счисления в десятичную По такой схеме

Сравнение вещественных чисел - C++
Привет, ребят! Нужна ваша мудрость. На днях думал о реализации класса complex&lt;class scalar&gt; из std и о реализации класса 3D-точек,...

Сравнение двух вещественных чисел - C++
Почему не работает сравнение при числах: 2.85730505 2.85729861 bool isEqual( float x, float y ) { return std :: fabs( x -...

Перевод вещественных чисел в двоичные - C++
Помогите пожалуйста! Вот , например есть число 99.57 сначала переводим в двоичный код целую часть , то есть 99. Получается 0,1100011(...

Перевод символьной строки в массив вещественных чисел - C++
Помогите написать программу перевода введенной с клавиатуры строки в массив вещ-ых чисел, не используя scanf. Чем больше пишу, тем больше...

Разработать программу перевода вещественных чисел из десятичной системы счисления в двоичную - C++
Помогите пожалуйста написать программу.Разработать программу перевода вещественных чисел из десятичной системы счисления в двоичную.

4
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
24.05.2011, 11:20 #2
Дробная часть тоже переводится, только наоборот. При переводе целой части надо делить и за цифру берётся остаток. А при переводе дробной чати надо умножать и за цифру берётся целая часть произведения. И целая часть переводится справа на лево, а дробная слева направо. А вот зачем это надо - тот ещё вопрос.
0
ZaLiZo
0 / 0 / 0
Регистрация: 24.05.2011
Сообщений: 3
24.05.2011, 11:35  [ТС] #3
Цитата Сообщение от taras atavin Посмотреть сообщение
Дробная часть тоже переводится, только наоборот. При переводе целой части надо делить и за цифру берётся остаток. А при переводе дробной чати надо умножать и за цифру берётся целая часть произведения. И целая часть переводится справа на лево, а дробная слева направо. А вот зачем это надо - тот ещё вопрос.
На перевод плевать, пущай работает как работает, принципиальный вопрос - запустить цикл и сделать так чтобы он дошел до конца выдавая корректные промежуточные значения. Самое большое чего я мог добиться - подбирал такие значения а, б и х, чтобы цикл запускался, но прога выпадала с ошибкой и результаты далеки от правильных были.
А зачем надо - не знаю и сам. Так поставлена задача. С целыми значениями-то там работы на две минуты.
Если вы имеете ввиду что можно было не переводя в целые значения считать, то тут всё равно не обошлось бы без съема у вещественного целой части в цикле, а как показала практика - прямое r-(int)r к ошибкам неустойчиво. Да и в строку стандартными методами можно только инт перевести, если я не ошибаюсь.
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
24.05.2011, 11:39 #4
Цитата Сообщение от ZaLiZo Посмотреть сообщение
Да и в строку стандартными методами можно только инт перевести, если я не ошибаюсь.
C++
1
std::cout<<a;
работает со всеми встроенными типами без исключений и со всеми классами, для каких опеределишь оператор, а
C++
1
FloatToStr
вообще предназначен только для вещественных.
0
ZaLiZo
0 / 0 / 0
Регистрация: 24.05.2011
Сообщений: 3
24.05.2011, 11:58  [ТС] #5
Цитата Сообщение от taras atavin Посмотреть сообщение
C++
1
std::cout<<a;
работает со всеми встроенными типами без исключений и со всеми классами, для каких опеределишь оператор, а
C++
1
FloatToStr
вообще предназначен только для вещественных.
Это всё, конечно, чудесно, но что мне с циклом-то делать?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.05.2011, 11:58
Привет! Вот еще темы с ответами:

Перевод чисел из системы в систему - C++
Подскажите пожалуйста, как переводить числа из одной степени счисления в другую? Очень нужно.

Перевод числа из 10-ой системы счислени в систему счисления от 2 до 9 - C++
Задача: С клавиатуры вводится дсятичное число М и основание системы счисления от 2 до 9. Составте программу, которая переводит число М в...

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

Перевод натурального числа из десятичной системы счисления в систему счисления по основанию - C++
Здравствуйте. Я хотела бы попросить у вас помощи. Я понимаю, что это не очень красиво, но вдруг кто-нибудь откликнется. Я не очень...


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

Или воспользуйтесь поиском по форуму:
5
Yandex
Объявления
24.05.2011, 11:58
Ответ Создать тему
Опции темы

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