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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.11.2013, 20:44   #1
РоРоРоЛоЛоЛо
Пользователь
 
Регистрация: 21.10.2013
Сообщений: 21
По умолчанию Помогите найти ошибку, пожалуйста!

C++ Builder Мне нужно написать функцию, которая переводит число(функция обязательно должна уметь работать с вещественными числами, так и целыми) взятого из Edit в число с системой с основанием хранящимся в переменной aSys(Тоже берется из другого Edit'a). Я уже третий день голову ломаю над этой функцией, а она не работает(возвращает 0).

Код:
float hex2int(AnsiString str, int aSys) //функция преобразование из Q системы счисления в P систему счисления
{
  int i = 0, j = 0, StrInt, k = 0, celoe, ostatok;
  float StrFloat, InputF;
  string Hex, TurnStr, stri, strf, sFloat;
  AnsiString fAnsi;
  bool point;


 strf = str.c_str();
  for(i = 0; i < strf.size(); i++)
     {
      if(strf[i] == '.')
       {
        point = true; //Является
        break;
       }
       else point = false; // Не является
     }
  //Проверяем число и в соответствии какое оно, выполнием определеные действия
  if(point == false) //Если число целое
    {       //перевод целого числа из 10-ой системы в систему счисления по основанию a
       for (i = str.Length(),j = 0; i > 0; i--,j++)
          {
           if (str[i]>='0' && str[i]<='9') StrInt += (str[i]-'0')*pow(aSys, j);
              else
           if (str[i]>='a' && str[i]<='f') StrInt += (str[i]-'a'+10)*pow(aSys, j);
              else
           if (str[i]>='A' && str[i]<='F') StrInt += (str[i]-'A'+10)*pow(aSys, j);
          }
    }
         i = 0;
         while(strf[i] != '.')
            {
             stri[i] = strf[i];
             i++;
            }
         for(i = stri.size()-1, j = 0; i >= 0; i--, j++)
           {
            if (stri[i]>='0' && stri[i]<='9') StrInt += (stri[i]-'0')*pow(aSys, j);
               else
            if (stri[i]>='a' && stri[i]<='f') StrInt += (stri[i]-'a'+10)*pow(aSys, j);
               else
            if (stri[i]>='A' && stri[i]<='F') StrInt += (stri[i]-'A'+10)*pow(aSys, j);
           }
         i = strf.size();
         j = 0;
         stri.clear();
         while(strf[i] != '.')  //Отделяем дробную часть без "0."
            {
             stri[j] = strf[i];  //переписываем символы после точки в другую строку
             j++;     // Так как они запишуться в обратно морядке, то мы используем
             i--;         // Функцию, переписывающую строку в обратном порядке.
            }
         strf.clear();
         for(i = 1, j = stri.size()-1; i < stri.size(); i++, j--)
            {
             str[i] = stri[j];  //переписываем входящую строку в другу в обратном порядке
            }
         for(i = 0, j = 1; i < strf.size(); i++, j++)
            {  // Переводим нашу дробную часть в систему счисления по основанию a
             if (strf[i]>='0' && strf[i]<='9') StrFloat += (strf[i]-'0')*1/pow(aSys, j);
                else
             if (strf[i]>='a' && strf[i]<='z') StrFloat += (strf[i]-'a'+10)*1/pow(aSys, j);
                else
             if (strf[i]>='A' && strf[i]<='Z') StrFloat += (strf[i]-'A'+10)*1/pow(aSys, j);
            }  // На выходе получаеться вещественное чило в 10-ой системе счисления
  return StrInt + StrFloat;
}
Помогите пожалуйста!) Заранее благодарен)

Последний раз редактировалось РоРоРоЛоЛоЛо; 20.11.2013 в 20:49.
РоРоРоЛоЛоЛо вне форума Ответить с цитированием
Старый 20.11.2013, 20:54   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Обязательно функу с нуля писать? Может воспользовать чем-нибудь вроде atoi()?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.11.2013, 08:45   #3
РоРоРоЛоЛоЛо
Пользователь
 
Регистрация: 21.10.2013
Сообщений: 21
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Обязательно функу с нуля писать? Может воспользовать чем-нибудь вроде atoi()?
atoi() перевидит в int. А мне нужно, чтобы еще и вещественные числа переводились.
РоРоРоЛоЛоЛо вне форума Ответить с цитированием
Старый 21.11.2013, 13:38   #4
FataLL
Форумчанин
 
Аватар для FataLL
 
Регистрация: 29.01.2013
Сообщений: 319
По умолчанию

РоРоРоЛоЛоЛо
Переводи всегда в вещественное. Если дробная часть нулевая - значит целое.

P.S. И я слабо представляю, как можно перевести вещественное число в другую систему счисления...
FataLL вне форума Ответить с цитированием
Старый 21.11.2013, 14:27   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
как можно перевести вещественное число в другую систему счисления...
берём дробную часть отдельно, умножаем на основание системы счисления, целую часть записываем в результат и отбрасываем. повторяем до тех пор, пока не получим нолик, либо пока не достигнем нужной точности.
например, возьмём число 0.376 и запишем в двоичной СС:
0. (целая часть у нас равна нулю. если не равна - переводим целую часть отдельно - это понятно, не рассматриваем)
0.376 * 2 = 0.752
0.752 * 2 = 1.504
0.504 * 2 = 1.008
0.008 * 2 = 0.016
0.016 * 2 = 0.032
и т.д.
т.е. исходное число (примерно) в двоичной СС будет записано как:
0.01100
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.11.2013, 14:33   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
как можно перевести вещественное число в другую систему счисления...
До определенной точности можно. Целую часть отдельно, вещественную отдельно.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.11.2013, 22:07   #7
РоРоРоЛоЛоЛо
Пользователь
 
Регистрация: 21.10.2013
Сообщений: 21
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
берём дробную часть отдельно, умножаем на основание системы счисления, целую часть записываем в результат и отбрасываем. повторяем до тех пор, пока не получим нолик, либо пока не достигнем нужной точности.
например, возьмём число 0.376 и запишем в двоичной СС:
0. (целая часть у нас равна нулю. если не равна - переводим целую часть отдельно - это понятно, не рассматриваем)
0.376 * 2 = 0.752
0.752 * 2 = 1.504
0.504 * 2 = 1.008
0.008 * 2 = 0.016
0.016 * 2 = 0.032
и т.д.
т.е. исходное число (примерно) в двоичной СС будет записано как:
0.01100
Я и по такому алгорифу пытался реализовать функцию, но не получилось...
Код:
/*InputF = StrToFloat(str); //Переводим нащу строку в вещественное число
  StrInt = int(InputF); // Отделяем целую часть от дробной
  StrFloat = InputF - StrInt; // Отделяем дробную часть вычитая из нее целую
  k = 1;
  while(StrInt /= 10)
     {
      k++; // Считаем сколько цыфр в целой части
     }
  //str.Delete(1,str.Length()-1); // Очищаем строку для дольнейшего использования
  StrInt = int(InputF); // Опять запоминаем целую часть так, как в цыкле
                        //  изменили значение переменной StrInt
  do
    {
     ostatok = StrInt%aSys; // Находим остаток от деления
     StrInt =  StrInt / aSys;  // Частное
     switch(ostatok)  // Заполяем строку остатками от деления
       {
        case 0: Hex[i] = ostatok; break;
        case 10: Hex[i] = 'A'; break; // Далее, если переводи в системы
        case 11: Hex[i] = 'B'; break; // больше системы с основанием 10
        case 12: Hex[i] = 'C'; break;
        case 13: Hex[i] = 'D'; break;
        case 14: Hex[i] = 'E'; break;
        case 15: Hex[i] = 'F'; break;
       }
     i++;
    }
  while(StrInt >= aSys); // Пока частное не станет меньше основания системы
  for(i = 0, j = Hex.size()-1; i < Hex.size(); i++, j--)
    { // Переворачиваем строку, целая часть должна быть записана в обратном порядке
     TurnStr[i] = Hex[j];  //переписываем входящую строку в другу в обратном порядке
    }
  Hex.clear();  // Очищаем строку для дольнейшего использования
  ostatok = 0;  // Очищаем переменную для дольнейшего использования
  //TurnStr.push_back('.');

// В строке strf у нас храниться целая часть уже переведенная в систему счисления
// с основанием aSys.
// Теперь переведем в туже систему с основанием aSys дробную часть(StrFloat)

  if(StrFloat != 0) // Если есть дробная часть, то и ее тоже переводим
    {               // в систему с основанием aSys
     fAnsi = FloatToStrF(StrFloat, ffFixed, 10, 10);
     Hex = fAnsi.c_str();
     i = Hex.size()-1;
     k = 1;
     while(Hex[i] != '.') // Считаем сколько знаков после точки
       {     // И конечно, идем от конца до точки
        k++;
        i--;
       }
     Hex.clear(); // Очищаем строку для дольнейшего использования
     for(i = 0; i <= k; i++)
       {
        StrFloat = StrFloat * aSys; // Умножаем дробную часть на основание системы
        ostatok = int(StrFloat); // Забираем целую часть
        StrFloat = StrFloat - ostatok; // И вычитаем, чтобы получить дробную часть
        switch(ostatok) // Записываем целые части по очереди в строку
          {
           case 0: Hex[i] = ostatok; break;
           case 10: Hex[i] = 'A'; break;
           case 11: Hex[i] = 'B'; break;
           case 12: Hex[i] = 'C'; break;
           case 13: Hex[i] = 'D'; break;
           case 14: Hex[i] = 'E'; break;
           case 15: Hex[i] = 'F'; break;
          }
       }
    }
  fAnsi.Delete(1,str.Length()-1); // Очищаем строку типа AnsiString
  fAnsi = TurnStr.c_str();
  AnsiString str1 = Hex.c_str();      // Склеиваем строки(целую и дробную части)

  return StrToFloat(fAnsi+str1); // Ну тут и так понятно :D
}    */
Эта функция висит в коде закомментировано, так как выдает ошибку. В сообщение ошибки, примерно написано, что вводимая строка не является вещественным числом. и строка, которая указывается в ошибке состоит из непонятных иероглифов.
(Возможно код был немного искаверкан после неудачного тестирования, а потом я этот кусок закоментил)

P.S. в case там перечисление должно быть, типа case от 0 до 9:

Последний раз редактировалось РоРоРоЛоЛоЛо; 21.11.2013 в 22:13.
РоРоРоЛоЛоЛо вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
помогите пожалуйста найти ошибку. ksu25 Паскаль, Turbo Pascal, PascalABC.NET 2 07.10.2009 20:38
Помогите пожалуйста найти ошибку (С\С++) Nina+ Помощь студентам 6 19.02.2009 22:30