Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.12.2015, 13:01   #1
fr0st1k123
Пользователь
 
Регистрация: 28.09.2015
Сообщений: 53
По умолчанию Перевод из одной системы счисления в другую

Объясните как работает программа и что делают функции (желательно подробно)
Код:
#include "stdafx.h"
#include <iostream>
#include <math.h>
#include <cstdio>
using namespace std;
int TMP(int Value, int System) {
    int a = Value, tmp = 0, b;
    while (a > System - 1)
    {
        b = a % System;
        tmp++;
        a /= System;
    }
    tmp++;
    return tmp;
}
int SysConTo10(char str[], int sys) {
    float k, res = 0, st = 0, tmp = strlen(str);
    for (int i = tmp - 1; i >= 0; i--) {
        switch (str[i]) {
        case 'a': k = 10;
            break;
        case 'b': k = 11;
            break;
        case 'c': k = 12;
            break;
        case 'd': k = 13;
            break;
        case 'e': k = 14;
            break;
        case 'f': k = 15;
            break;
        default: k = (int)str[i];
            break;
        }
        if (k >= 48) {
            k -= 48;
        }
        if (k >= sys) {
            cout << "Число " << k << " не может находиться в данной системе счисления.\n";
            break;
            return 0;
        }
        else if (k != sys) {
            res += pow(sys, st) * k;
            st++;
        }
    }
    return res;
}
 
void main()
{
    setlocale(LC_CTYPE, "rus");
    int m, res = 0, st = 0; // m - основание системы счисления, res - результат, st - степень, val - строка в которую введено число;
    char val[100] = " ";
    cout << "Введите число: "; gets_s(val);
    cout << "Введите основание системы счисления: "; 
    cin >> m;
    res = SysConTo10(val, m); // Функиция, переводящая в 10-ную систему счисления;
    int m2 = 0;
    cout << "В какую систему счисления вы хотите перевести число ?" << endl;
    cin >> m2;
    int tmp2 = TMP(res, m2);
    for (int i = 0; i < tmp2; i++) {
        int b = res % m2;
        switch (b)
        {
        case 10: {
            val[i] = 'a';
            res /= m2;
        }
                 break;
        case 11: {
            val[i] = 'b';
            res /= m2;
        }
                 break;
        case 12: {
            val[i] = 'c';
            res /= m2;
        }
                 break;
        case 13: {
            val[i] = 'd';
            res /= m2;
        }
                 break;
        case 14: {
            val[i] = 'e';
            res /= m2;
        }
                 break;
        case 15: {
            val[i] = 'f';
            res /= m2;
        }
                 break;
        default: {
            if (b < 48) {
                b += 48;
            }
            val[i] = b;
            res /= m2;
        }
                 break;
        }
    }
    for (int i = tmp2 - 1; i > -1; i--)
        cout << val[i];
    cout << endl;
}
fr0st1k123 вне форума Ответить с цитированием
Старый 29.12.2015, 13:37   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Тихий ужос... Ты где этот кошмар программиста взял?
Могу я тебе предложить такое?: http://www.programmersforum.ru/showp...4&postcount=36
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.12.2015, 15:10   #3
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Тихий ужос... Ты где этот кошмар программиста взял?
Stilet. Пытаешься его "тихий" поменять на свой - "громкий"? Ну-ну .
К тому-же, "громкий ужас" написан на Дельфах, а челу нужен С++. Предложи ему ещё с Бейсика на С++ перевести. Ха-ха, отпад.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 29.12.2015 в 15:15.
Smitt&Wesson вне форума Ответить с цитированием
Старый 29.12.2015, 15:58   #4
taras-proger
Подтвердите свой е-майл
 
Регистрация: 12.11.2014
Сообщений: 470
По умолчанию

1. Остаток от деления числа x на число o равен цифре в разряде единиц в o-ичной несимметричной записи числа x, где младшая цифра - ноль.
2. Результат деления на цело числа x на число o есть число, чья o-ичная несимметричная запись с младшей цифрой - состоит из всех разрядов числа записи в той же системе числа x, которые старше разряда единиц, с сохранением их порядка.
Отсюда алгоритм перевода целой части числа x в любую не симметричную систему с младшей цифрой-нолём:
1. Вычислить остаток от деления x на основание.
2. Принять его за самую правую цифру.
3. К этой цифре конкатенировать слева перевод результата деления x нацело на основание.
1. Целая часть произведение дробной части числа x на o равно цифре в старшем дробном разряде (сразу после запятой, десятых долей в десятичной, двенадцатых в двенадцатеричной и так далее) o-ичной не симметричной записи числа x, где младшая цифра - ноль.
2. Дробная часть произведения дробной части числа x на o есть число не симметричная o-чиная запись которого с младшей цифрой-нолём состоит из всех разрядов записи числа x в той же системе, которые младше старшего дробного разряда.
Отсюда алгоритм перевода дробной части числа x в любую не симметричную систему с младшей цифрой-нолём:
1. Умножить x на основание.
2. Выделить целую и дробную части произведения.
3. Принять целую часть произведения за самую левую цифру.
4. Конкатенировать к ней справа перевод дробной части.
5. К результату конкатенировать слева дробный разделитель.
Надеюсь учёт знака числа проблем не вызовет?
taras-proger вне форума Ответить с цитированием
Старый 29.12.2015, 16:01   #5
taras-proger
Подтвердите свой е-майл
 
Регистрация: 12.11.2014
Сообщений: 470
По умолчанию

Есть ещё другой способ: считая в целевой системе умножить каждую цифру на вес её разряда, произведения сложить. Вес разряда единиц во всех системах равен единице, от него влево вес каждого следующего разряда больше в основание раз, а вправо в основание раз меньше. В этом случае не страшно, если младшая цифра не равна нолю.

Последний раз редактировалось taras-proger; 29.12.2015 в 16:05.
taras-proger вне форума Ответить с цитированием
Старый 29.12.2015, 17:26   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
"громкий ужас" написан на Дельфах, а челу нужен С++.
Смотри внимательнее - там и Си.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перевод из одной системы счисления в другую колянчик1712 Помощь студентам 0 25.12.2011 15:56
перевод чисел из одной системы счисления в другую GAngelika Паскаль, Turbo Pascal, PascalABC.NET 2 16.12.2010 09:36
Перевод из одной системы счисления в другую на С++ innaa639 Помощь студентам 1 12.04.2010 14:34
перевод чисел из одной системы счисления в другую laponka Помощь студентам 3 18.09.2009 09:20
Перевод из одной системы счисления в другую Sky_VSUH Помощь студентам 1 28.02.2008 20:18