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

Двоичное представление типов данных - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Не могу решить на C++ http://www.cyberforum.ru/cpp-beginners/thread104478.html
Задание: Программа должна работать следующим образом. Сначала пользователь вводит количество обрабатываемых чисел (значение n). Затем, он вводит n чи-сел в одномерный массив. После этого программа должна обработать эти числа и вывести результат согласно варианту задания. Сама задачка: Найти число, которое «дальше всех» от среднего арифметического, если таких чисел несколько, то в...
C++ Поменять минимальный и максимальный элементы массива Помогите пожалуйста, нужно поменять минимальный и максимальный элементы массива. http://www.cyberforum.ru/cpp-beginners/thread104470.html
C++ Указатель на указатель - разница способов
int a =5; int *b = &a; int **e =&b; //первый способ //Нужно писать столько * скока указателей.. int *f = b; //Втрой способ
Строки + файлы C++
Всем, привет!Ребят, не поможете написать програмку? А то я совсем чайник в Си...Учусь в МИФИ, преподы звери, ничего не объяснили, сразу задали писать прогу... Задача такая - Из входного потока вводится произвольное число сторк. Каждая строка представляет собой последовательность слов, разделенных пробелами и/или знаками табуляции. Длина каждой строки не превышает 80 символов. Конец ввода...
C++ Вычислить произведение матрицы на вектор http://www.cyberforum.ru/cpp-beginners/thread104382.html
Дана матрица A(5,5) и вектор X(5). Вычислить произведение матрицы на вектор.
C++ Зеркальное отображение массива Всем привет!не могу сообразить как переписать старый массив в новый, отобразить значения массива в обратном порядке у меня получилось,а вот сохранить порядок значений в новом массиве не могу придумать как это сделать: #include <iostream> #include <iomanip> using namespace std; int main() { int mass={1,2,3,4,5,6,7,8,9,10}; for(int i=0;i<10;i++) { подробнее

Показать сообщение отдельно
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
14.03.2010, 15:37     Двоичное представление типов данных
a_in_b.cpp
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
#include "my.hpp"
 
using namespace std;
 
//опис констант-----------------------------------------------------------------
const int base = 1000*1000;         //база числа в довгій арифметиці
 
//опис функцій------------------------------------------------------------------
void Menu();
void Notation(string &, int &, int &);
vector <int> NotationFrom(string, int &);
vector <int> NotationTo(vector <int>, int &);
string NotationDiv(string, int &, int &);
vector <int> Div(vector <int>, int, int &);
vector <int> Mult(vector <int>, int);
vector <int> Sum(vector <int>, vector <int>);
 
//MAIN()------------------------------------------------------------------------
int main()
{
    Menu();
    return 0;
}
 
//меню програми----------------------------------------------------------------
void Menu()
{
    while (1)
    {
        int from, to;
        string s;
        cout << "Введiть початкову систему числення [2..36]: ";
        while( !(from = Check()) ) cout << "помилка введення\n\nспробуйте ще раз: ";
        cout << "\nВведiть кiнцеву систему числення [2..36]:   ";
        while( !(to = Check()) ) cout << "помилка введення\n\nспробуйте ще раз: ";
        cout << "\nВведiть число:                              ";
        cin >> s;
        cout << endl;
 
        Notation(s, from, to);
            
        if (my::exit()) break;
    }
}
 
//основна функція---------------------------------------------------------------
void Notation(string &s, int &from, int &to)
{
    //переводимо цілу частину в десяткову систему числення
    vector <int> res;
    Up(s);
    int count = 0;
    FOR(i,0,s.size()) 
        if ( !IsPoint(s[i]) ) ++count;
        else break;
    res = NotationFrom(s.substr(0,count), from);
    cout << "Десяткове представлення:\n";
    for (int i(res.size()-1); i > -1; --i)
        cout << res[i];
 
    //переводимо дробову частину в десяткову систему числення
    double dd = 0,
        base = 1;
    int ok = (s[0] == '0'); //перевірка на наявність цілої частини
    string ds = "", d = "";
    if (count < s.size())
    {
        s = s.substr(count+1, s.size()-count);
        FOR(i,0,s.size())
            dd += (base /= from) * (s[i] - '0');
        FOR(i,0,10)
        {
            ds += int(dd *= 10) + '0';
            dd -= int(dd);
        }
        Normalization(ds);
        if(ds.size()) cout << "." << ds << endl;
        d = NotationDiv(s, from, to);
    }
    
    //переводимо число в бажану систему числення
    cout << "\n\nПредставлення числа в системi з основою " << to << ":" << endl;
    res = NotationTo(res, to);
    s.clear();
    for (int i(res.size()-1); i > -1; --i)
        s += ( (res[i]/10) ? (res[i] - 10 + 'A') : (res[i] + '0') );
    s += "." + d;
    Normalization(s);
 
    cout << (s[0] == '.' ? "0" : "") << s << endl << endl;
}
 
//функція для переведення числа в 10-ву систему числення------------------------
vector <int> NotationFrom(string s, int &from)
{
    vector <int> res, d, b;
    res.push_back(0);
    b.push_back(1);
    for (int i(s.size()-1); i > -1; --i)
    {
        d.clear();
        d = Mult(b, (isalpha(s[i])) ? (int(s[i] - 'A') + 10) : (int(s[i] - '0')));
        res = Sum(res, d);
        b = Mult(b, from);
    }
    return res;
}
 
//функція для переведення числа в систему числення з основою 2..36--------------
vector <int> NotationTo(vector <int> a, int &to)
{
    vector <int> res;
    int carry = 0;
    while (a.size() != 1 || (a.back() != 0 && a.size() == 1) )
    {
        a = Div(a, to, carry);
        res.push_back(carry);
    }
    return res;
}
 
//переведення дробової частини числа
string NotationDiv(string s, int &from, int &to)
{
    string res = "";
    double d = 0, base = 1;
    FOR(i,0,s.size())   
        d += (base /= from) * (s[i] - '0');
    FOR(i,0,10)
    {
        res += int(d *= to) + '0';
        d -= int(d);
    }
    return res;
}
 
//ділення довгого на коротке, повернення результуючого вектора на остачі--------
vector <int> Div(vector <int> a, int b, int &carry)
{
    carry = 0;
    for (int i = (a.size()-1); i > -1; --i)
    {
        long long cur = carry * base + a[i];
        a[i] = int (cur / b);
        carry = int (cur % b);
    }
    while (a.size() > 1 && a.back() == 0)
        a.pop_back();
    return a;
}
 
//множення довгого на коротке, повернення результуючого вектора-----------------
vector <int> Mult(vector <int> a, int n)
{
    int carry = 0;
    for (int i = 0, _n(a.size()); i < _n || carry; ++i)
    {
        if (i == a.size()) a.push_back(0);
        long long cur = carry + a[i] * n;
        a[i] = (int) cur % base;
        carry = (int) cur / base;
    }
    return a;
}
 
//додавання 2-ох довгих, повернення результуючого вектора-----------------------
vector <int> Sum(vector <int> a, vector <int> b)
{
    if (a.size() < b.size()) swap(a,b);
    int carry = 0;
    for (int i = 0, _n(a.size()); i < _n || carry; ++i)
    {
        if (i == a.size())
            a.push_back(0);
        if (i == b.size())
            b.push_back(0);
        long long cur = a[i] + b[i] + carry;
        a[i] = (int) cur % base;
        carry = (int) cur / base;
    }
    return a;
}

my.hpp
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
#include <iostream>
#include <sstream>
#include <vector>
#include <string>
#include <cstring>
#include <algorithm>
#include <windows.h>
#include <conio.h>
 
#define FOR(i,a,b) for (int i = a, _n(b); i < _n; ++i)
#define ABS(a) ( (a) < 0 ? -(a) : a )
 
//оголошення констант ----------------------------------------------------------
const int tSleep = 1500;        //час затримки
 
//перевантаження операторів введення -------------------------------------------
std::ostream &operator << (std::ostream &cout, const char text[])
{
    char *s = new char [strlen(text)+1];
    CharToOem(text, s);
    cout.write(s,strlen(s));
    return cout;
}
 
std::ostream &operator << (std::ostream &cout, const char text)
{
    const char s[] = {text,'\0'};
    char *ds = new char [2];
    CharToOem(s, ds);
    cout.write(ds,strlen(ds));
    return cout;
}
 
//меня виходу ------------------------------------------------------------------
namespace my
{
    int exit()
    {
        int exit = 0;
        while (exit != '2')
        {
            std::cin.clear();
            std::cout << "Виберiть дiю:\n\n"
                     "1 - вийти\t"
                     "2 - продовжити\n";
            exit = getch();
            if (exit == '1')
            {
                system("cls");
                std::cout << "завершення..";
                Sleep(tSleep);
                return 1;
            }
            if (exit != '2')
            {
                system("cls");
                std::cout << "\nПомилка введення\t"
                         "спробуйте ще раз ";
                Sleep(tSleep);
            }
            system("cls");
        }
        return 0;
    }
}
 
//==============================================================================
 
//                            додаткові функції
 
//==============================================================================
 
//перевірка символа на належність "." ------------------------------------------
inline int IsPoint(char &s) { return s == '.'; }
 
//перевірка чи являеться стрічка цілим числом-----------------------------------
int IsDigit(std::string &s)
{
    FOR(i,0,s.size()) if (s[i] < '0' || s[i] > '9') return 0;
    return 1;
}
 
//перевірка на допустимий діапазон значень для систем числення -----------------
int Check()
{
    std::string s;
    std::cin >> s;
    std::stringstream tmp;
    tmp << s;
    int res;
    tmp >> res;
    return (res <= 36 && res >= 2 && IsDigit(s)) ? (res) : (0);
}
 
//переведення стрічки у верхній регістр-----------------------------------------
void Up(std::string &s) { FOR(i,0,s.size()) if (isalpha(s[i])) s[i] += (s[i] >= 'a') ? ('A'-'a') : (0); }
 
//нормалізація стрічки
void Normalization(std::string &s)
{
    int count = 0;
    while (s[s.size()-count-1] == '0') ++count;
    if ( s[s.size()-count-1] == '.') ++count;
    s = s.substr(0, s.size() - count);
}
 
Текущее время: 14:22. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru