Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Перевод с PHP на С++

20K
05 октября 2008 года
Xen0n
3 / / 07.09.2006
Есть задание - в большой проге понадобилось переводить из одной системы исчисления (СИ) в другую, нашел хороший класс, но он на PHP, которого я к сожалению не знаю, если есть добрые переводчики )) помогите пжл, вот код на PHP:

Код:
class Renumeric {

   //Полный вариант набора цифр
   var $NumSet ='';
   
   //Входящий и исходящий набор цифр
   var $InputSet      ='';
   var $OutputSet      ='';

   //Буфер временного хранения. Содержит массив целых чисел.
   var $Buffer         =array();

   //Максимальное число в элементе буфера (основание вывода)
   var $MaxBufElement   =10;

   //Код ошибки
   /*
    *-------------------------------
    * 0 - нет ошибки
    * 1 - символа нет в наборе
    * 2 - символов в наборе больше 1
    *-------------------------------
    */
   var $Error         =0;

   /*** Конструктор ***/
   function Renumeric(){
      $this->NumSet=
         '0123456789'.   //10
         'abcdef'.   //16
         'ghijklmnopqrstuvwxyz'.   //36
         'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.   //62
         'абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ'; //128
      $this->InputSet      =substr($this->NumSet, 0, 16);
      $this->OutputSet   =substr($this->NumSet, 0, 10);
      $this->MaxBufElement=10;
   }
   
   /*** Устанавливает входящий и исходящих набор
   и оставляет его, пока существует класс ***/
   function Preset($InSet, $OutSet){
      $this->InputSet=$InSet;
      $this->OutputSet=$OutSet;
      $this->MaxBufElement=strlen($OutSet);
   }

   function ADD($n){
      $pos=0;
      $buf=$n;
      do{
         if(isset($this->Buffer[$pos])){
            $buf+=$this->Buffer[$pos];
         }
         $this->Buffer[$pos]=$buf % $this->MaxBufElement;
         $buf=intval($buf / $this->MaxBufElement);
         $pos++;
      }while ($buf>0);
   }

   function MUL($n){
      $tmp_buf=array();
      $res_len=count($this->Buffer);
      if ($res_len==0){
         return;
      }
      $cur_pos=0;
      $buf=0;
      do{
         $a=0;
         if ($cur_pos<$res_len){
            $a=$this->Buffer[$cur_pos]*$n;
         }
         $a+=$buf;
         $tmp_buf[$cur_pos]=$a % $this->MaxBufElement;
         $buf=intval($a / $this->MaxBufElement);
         $cur_pos++;
      } while(($res_len>$cur_pos)||($buf!=0));
      $this->Buffer=$tmp_buf;
   }

   /*** Переводит из одной системы в другую ***/
   function Go($input, $inset=0, $outset=0){
      $result=true;
      /*** Временное сохранение глобальных наборов ***/
      if ($inset!=0 && $outset!=0){
         $tmp_in=$this->InputSet;
         $tmp_out=$this->OutputSet;
         $this->InputSet=substr($this->NumSet, 0, $inset);
         $this->OutputSet=substr($this->NumSet, 0, $outset);
         $this->MaxBufElement=$outset;
      }
      /*** Чтение входящего числа ***/
      $this->Buffer=array();
      $base_in=strlen($this->InputSet);
      $count_in=strlen($input);
      for ($i=0; $i<$count_in; $i++){
         $a=$input[$i];
         $present=substr_count($this->InputSet, $a);
         if($present==0){
            $result=false;
            $this->Error=1;
            break;
         }
         if($present>1){
            $result=false;
            $this->Error=2;
            break;
         }
         if ($i!=0){
            $this->MUL($base_in);
         }
         $this->ADD(strpos($this->InputSet, $a));
      }
      if ($result){
         $result='';
         $count_out=count($this->Buffer);
         for ($i=0; $i<$count_out; $i++){
            $result=$this->OutputSet[$this->Buffer[$i]].$result;
         }
      }
      /*** Восстановление прежних наборов ***/
      if (isset($tmp_in)){
         $this->InputSet=$tmp_in;
         $this->OutputSet=$tmp_out;
         $this->MaxBufElement=strlen($tmp_out);
      }
      return $result;
   }
}
20K
06 октября 2008 года
Xen0n
3 / / 07.09.2006
Так, худо-бедно с PHP разобрался, но видно не совсем - код на С++ не работает, скорее всего ошибка именно в моем понимании исходного алгоритма, вот код на С++:
Код:
#include <string>
#include <conio.h>
#include <stdio.h>
#include <vector>

using namespace std;

static const char NumSet[]="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";

class Rebase
    {
    private:
        vector<int> Buffer;
        unsigned short int MaxBuf;
        unsigned short int Error;
    public:
        Rebase()
            {
            Buffer.push_back(0);
            MaxBuf = 0;
            Error = 0;
            }
        ~Rebase()
            {
            }
        void ADD(unsigned int n)
            {
            unsigned int pos = 0;
            unsigned int buf = n;
            do
                {
                if (Buffer[pos])        buf += Buffer[pos];
                Buffer[pos] = buf % MaxBuf;
                buf /= MaxBuf;
                pos++;
                } while (buf>0);
            }
        void MUL(unsigned int n)
            {
            unsigned int BufSize = Buffer.size();
            if (!BufSize) return;
            vector<int> tmpBuffer;
            tmpBuffer.clear();
            int cur_pos=0;
            int buf=0;
            do{
                int a=0;
                if (cur_pos<BufSize)
                    {
                    a=Buffer[cur_pos]*n;
                    }
                a+=buf;
                tmpBuffer.push_back(a % MaxBuf);
                buf=a / MaxBuf;
                cur_pos++;
                } while((BufSize>cur_pos)||(buf!=0));
            Buffer.clear();
            for (int k=0; k<Buffer.size(); k++)
                Buffer.push_back(tmpBuffer[k]);
            }
        string * Do(char * input, unsigned int inset=0, unsigned int outset=0)
            {
            string InputSet="";
            string OutputSet="";
            for (int in=0; in<inset; in++) InputSet.push_back(NumSet[in]);
            for (int out=0; out<outset; out++) OutputSet.push_back(NumSet[out]);
            MaxBuf = outset;
            unsigned int base_in = InputSet.length();
            unsigned int count_in = strlen(input);
            for (int inc=0; inc < count_in; inc++)
                {
                char a = input[inc];
                if (inc) MUL(base_in);
                ADD((int)(strchr(InputSet.c_str(), a) - InputSet.c_str() + 1));    
                }
            string * res = new string();
            res->clear();
            int BufSize = Buffer.size();
            for (int j=0; j < BufSize; j++)
                res->push_back(OutputSet[Buffer[j]]);
            return res;
            }
    };
int main()
    {
    Rebase r = Rebase();
    string * x;
    //x = r.Do("3", 10, 4); Error
    x = r.Do("3", 10, 5);
    printf("%s", x->c_str());
    getch();
    return 0;
    }

Народ, знающий где ошибка, укажите в чем неточность, пожалуйста...
p.s. К слову сказать этот код легко работает с большими числами, как, например, в теме Перевод HEX -> DEC (которую до решения так и не довели) и будет полезен многим потомкам )))
5
06 октября 2008 года
hardcase
4.5K / / 09.08.2005
Товарищ Xen0n, сдается мне, задача стояла не найти класс на PHP, а написать самому, подобную программу на C++!
Тем более, что это ниразу не трудно, стоит только немного разобраться с тем, что такое система счисления, которую вы почему-то называете системой исчисления.
20K
06 октября 2008 года
Xen0n
3 / / 07.09.2006
Товарищ hardcase! Сдается мне вы ответили совсем не по теме, ибо ничего, кроме критики, я не увидел в вашем сообщении (попросту это был флуд). Поясняю еще раз - задача не написать самому все - я только студент и учусь, т.е. смотрю и, разбирая алгоритмы, учусь программировать, это лишь небольшая часть большой программы и перевел я ее на С++, не поняв какую то часть алгоритма, в чем и прошу помощи...
p.s. Я сильно сомневаюсь, что все пишут абсолютно свои алгоритмы - часто полезно изучать и чужие, "мотать на ус"...
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог