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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.09.2018, 14:50   #1
Artem_856
Пользователь
 
Регистрация: 20.09.2018
Сообщений: 11
По умолчанию Перевод из C++ в С

Помогите пожалуйста перевести программу из C++ в С
Код:
#include <iostream>
#include <string>

bool is_real(const std::string& num)
{
    return num.find('.')<num.size();
}

template<unsigned Base>
int to_int(const std::string& str)
{
   int mult = 1, result = 0;
   for(size_t i = str.size(); i>0; --i)
   {
       if(str[i-1]>='0' && str[i-1]<='9')
           result += mult*(str[i-1]-'0');
       else
           result += mult*(std::toupper(str[i-1])-'A');
       mult*=Base;
   }
   return result;
}


template<size_t Base>
std::pair<int,int> to_real(const std::string& str)
{
    const size_t dot_pos = str.find('.');
    const int first_part = to_int<Base>(str.substr(0, dot_pos));
    const int second_part = to_int<Base>(str.substr(dot_pos+1));
    return std::make_pair(first_part, second_part);
}

int main()
{
    std::string in;
    std::cin>>in;
    std::cout << "Answer is ";
    if(!is_real(in))
        std::cout<<to_int<11>(in);
    else
    {
        std::pair<int,int> real = to_real<11>(in);
        std::cout<<real.first<<'.'<<real.second;
    }
}
Artem_856 вне форума Ответить с цитированием
Старый 27.09.2018, 18:20   #2
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Вы серьёзно? Вот так, "с листа", не зная задачи, без единого комментария?
Да проще с нуля на С написать, чем этот код разбирать

И, кстати, программа ни разу не правильная. Аффтар знает С++, но не знает математики, увы..

Последний раз редактировалось Black Fregat; 27.09.2018 в 18:26.
Black Fregat вне форума Ответить с цитированием
Старый 27.09.2018, 18:57   #3
Artem_856
Пользователь
 
Регистрация: 20.09.2018
Сообщений: 11
По умолчанию

Цитата:
Сообщение от Black Fregat Посмотреть сообщение
Вы серьёзно? Вот так, "с листа", не зная задачи, без единого комментария?
Да проще с нуля на С написать, чем этот код разбирать

И, кстати, программа ни разу не правильная. Аффтар знает С++, но не знает математики, увы..
Тут перевод одинадцатиричной системы в десятичную. А в чём ошибки?
Artem_856 вне форума Ответить с цитированием
Старый 28.09.2018, 01:25   #4
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Цитата:
Сообщение от Artem_856 Посмотреть сообщение
А в чём ошибки?
Дробные числа таким образом перевести нельзя. Целая часть - да, а дробная часть переводится совсем по-другому.
Black Fregat вне форума Ответить с цитированием
Старый 30.09.2018, 03:21   #5
New man
Форумчанин
 
Регистрация: 24.01.2011
Сообщений: 774
По умолчанию

Артём, зачем ты плодишь темы с моим ответом?
http://www.programmersforum.ru/showthread.php?t=322797
a.k.a. Angelicos Phosphoros
Мой сайт
New man вне форума Ответить с цитированием
Старый 30.09.2018, 03:28   #6
New man
Форумчанин
 
Регистрация: 24.01.2011
Сообщений: 774
По умолчанию

Black Fregat, я его писал в два часа ночи человеку, который неудосужился за две недели перевести с плюсов на C :D
Я знаю, что перевод некорректный, но задача этого кода натолкнуть в правильную сторону.

Artem_856, почитайте это и поправьте.
https://moodle.ivkhk.ee/mod/page/view.php?id=2830
a.k.a. Angelicos Phosphoros
Мой сайт
New man вне форума Ответить с цитированием
Старый 30.09.2018, 03:38   #7
New man
Форумчанин
 
Регистрация: 24.01.2011
Сообщений: 774
По умолчанию

Таки поправлю по доброте душевной.
А C учить надо, тут же элементарные изменения!
Код:
template<size_t Base>
double to_real(const std::string& str)
{
    const size_t dot_pos = str.find('.');
    const int first_part = to_int<Base>(str.substr(0, dot_pos));
    const int second_part = to_int<Base>(str.substr(dot_pos+1));
    double res = first_part;
    double mult = 0.1, change = 0;
    double tail = pow(10, str.size() - dot_pos - 1) * second_part;
    do
    {
       tail *= 10;
       change = mult * int(tail);
       tail = tail - int(tail);
       mult *= 0.1;
       res += change;
    }while(res + change != res);
    return res;
}
a.k.a. Angelicos Phosphoros
Мой сайт
New man вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перевод С# - C++ Robeeert Помощь студентам 1 18.05.2017 21:13
ПЕРЕВОД НА C# kostan3 C# (си шарп) 2 10.04.2015 17:45
перевод sid1868 Общие вопросы Delphi 2 07.12.2012 20:07
перевод sid1868 Помощь студентам 2 07.12.2012 20:07
Перевод из Кб в Мб и т.д. okgo Паскаль, Turbo Pascal, PascalABC.NET 8 18.11.2008 21:03