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

Паттерн Interpreter и грамматика - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Чтение непосредственного значения из памяти http://www.cyberforum.ru/cpp-beginners/thread1106550.html
Здравствуйте. Мне необходимо представить числа с плавающей точкой двойной точности в hex формате. есть ли возможность использовать значение из памяти в том виде, в котором оно там и представлено? самому не хочется совсем писать функцию перевода, и в стандартных библиотеках нет вроде такого
C++ Теория графики Вобщем в кратце. Кто может подсказать литературу по теории графики? Если проще построение маленькой 2D игры и разные поведения главного объекта игры с другими.(к примеру как обойти препятствие?). За ранее спасибо!!! http://www.cyberforum.ru/cpp-beginners/thread1106514.html
Вычисления в цикле, нахождение ежедневного прироста C++
Здравствуйте, при решении задачи, столкнулся с проблемой задания цикла для нахождения ежедневного прироста и выделения в последующем максимального значения. Кода программы как такового нет, #include "stdafx.h" #include <math.h> #include <conio.h> #include <stdio.h> int main() {
C++ Корректировка кода Хаффмана
Приветствую друзья, появились затруднения с кодом Хаффмана, здесь представил исходник . Суть в том, что он работает только с целочисленными вероятностями, а хотелось бы, чтобы была возможность использовать дробные. Допустим, чтобы он смог реализовать пример: На входе: символы 2 4 6 a b их вероятности 0.4 0.4 0 0 0.2 соответственно. В данном случаи, создаётся впечатление, что код...
C++ мужики!выручите пожалуйста! задан одномерный массив B состоящем из n вещественных элементов, http://www.cyberforum.ru/cpp-beginners/thread1106501.html
задан одномерный массив B состоящем из n вещественных элементов,определить позиции,в которых находятся отрицательные элементы,сосчитать их количество отрицательных элементов и вычислить их сумму, надо написать в визуал си++
C++ Реализовать класс больших чисел с функциями сложения, вычитания, записи и вывода Надо реализовать класс, что будет содержать массив с 40 элементов. Предусмотреть функции сложения/вычитания, записи/вывода. Я уже на сложении 3 дня застряг, вычитание вообще не знаю, как сделать. вот мой код: #include <iostream> using namespace std; class HugeInteger { private: int num; подробнее

Показать сообщение отдельно
fuzzytoozy
8 / 8 / 1
Регистрация: 23.11.2012
Сообщений: 94
27.02.2014, 07:19     Паттерн Interpreter и грамматика
Может не особо по теме C++, но все же. Столкнулся с некоторой трудностью. Читал про паттерн Interpreter, который, вроде как , служит для описания какого-либо языка. Как пример взяты римские числа, с которыми я , по правде говоря, не очень знаком. Перед кодом описана грамматика языка, вот чтобы понять код мне бы понять сперва грамматику, а я совершенно не понимаю на каком языке написаны эти выражения и что они значат. Интуитивно догадаться не очень получается.Можете пожалуйста растолковать что к чему?
Вот такого рода выражения:

C++
1
2
3
4
5
6
romanNumeral ::= {thousands} {hundreds} {tens} {ones}
thousands,hundreds,tens,ones ::= nine | four | {five} {one} {one} {one}
nine ::= "CM" | "XC" | "IX"
four ::= "CD" | "XL" | "IV"
five ::= 'D' | 'L' | 'V'
one  ::= 'M' | 'C' | 'X' | 'I'
Вот код следующий за ними:
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
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
#include <iostream.h>
#include <string.h>
 
class Thousand;
class Hundred;
class Ten;
class One;
 
class RNInterpreter
{
  public:
    RNInterpreter(); // ctor for client
    RNInterpreter(int){}
    // ctor for subclasses, avoids infinite loop
    int interpret(char*); // interpret() for client
    virtual void interpret(char *input, int &total)
    {
        // for internal use
        int index;
        index = 0;
        if (!strncmp(input, nine(), 2))
        {
            total += 9 * multiplier();
            index += 2;
        }
        else if (!strncmp(input, four(), 2))
        {
            total += 4 * multiplier();
            index += 2;
        }
        else
        {
            if (input[0] == five())
            {
                total += 5 * multiplier();
                index = 1;
            }
            else
              index = 0;
            for (int end = index + 3; index < end; index++)
              if (input[index] == one())
                total += 1 * multiplier();
              else
                break;
        }
        strcpy(input, &(input[index]));
    } // remove leading chars processed
  protected:
    // cannot be pure virtual because client asks for instance
    virtual char one(){}
    virtual char *four(){}
    virtual char five(){}
    virtual char *nine(){}
    virtual int multiplier(){}
  private:
    RNInterpreter *thousands;
    RNInterpreter *hundreds;
    RNInterpreter *tens;
    RNInterpreter *ones;
};
 
class Thousand: public RNInterpreter
{
  public:
    // provide 1-arg ctor to avoid infinite loop in base class ctor
    Thousand(int): RNInterpreter(1){}
  protected:
    char one()
    {
        return 'M';
    }
    char *four()
    {
        return "";
    }
    char five()
    {
        return '\0';
    }
    char *nine()
    {
        return "";
    }
    int multiplier()
    {
        return 1000;
    }
};
 
class Hundred: public RNInterpreter
{
  public:
    Hundred(int): RNInterpreter(1){}
  protected:
    char one()
    {
        return 'C';
    }
    char *four()
    {
        return "CD";
    }
    char five()
    {
        return 'D';
    }
    char *nine()
    {
        return "CM";
    }
    int multiplier()
    {
        return 100;
    }
};
 
class Ten: public RNInterpreter
{
  public:
    Ten(int): RNInterpreter(1){}
  protected:
    char one()
    {
        return 'X';
    }
    char *four()
    {
        return "XL";
    }
    char five()
    {
        return 'L';
    }
    char *nine()
    {
        return "XC";
    }
    int multiplier()
    {
        return 10;
    }
};
 
class One: public RNInterpreter
{
  public:
    One(int): RNInterpreter(1){}
  protected:
    char one()
    {
        return 'I';
    }
    char *four()
    {
        return "IV";
    }
    char five()
    {
        return 'V';
    }
    char *nine()
    {
        return "IX";
    }
    int multiplier()
    {
        return 1;
    }
};
 
RNInterpreter::RNInterpreter()
{
  // use 1-arg ctor to avoid infinite loop
  thousands = new Thousand(1);
  hundreds = new Hundred(1);
  tens = new Ten(1);
  ones = new One(1);
}
 
int RNInterpreter::interpret(char *input)
{
  int total;
  total = 0;
  thousands->interpret(input, total);
  hundreds->interpret(input, total);
  tens->interpret(input, total);
  ones->interpret(input, total);
  if (strcmp(input, ""))
  // if input was invalid, return 0
    return 0;
  return total;
}
 
int main()
{
  RNInterpreter interpreter;
  char input[20];
  cout << "Enter Roman Numeral: ";
  while (cin >> input)
  {
    cout << "   interpretation is "
         << interpreter.interpret(input) << endl;
    cout << "Enter Roman Numeral: ";
  }
}
Вывод программы:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Enter Roman Numeral: MCMXCVI
   interpretation is 1996
Enter Roman Numeral: MMMCMXCIX
   interpretation is 3999
Enter Roman Numeral: MMMM
   interpretation is 0
Enter Roman Numeral: MDCLXVIIII
   interpretation is 0
Enter Roman Numeral: CXCX
   interpretation is 0
Enter Roman Numeral: MDCLXVI
   interpretation is 1666
Enter Roman Numeral: DCCCLXXXVIII
   interpretation is 888
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 21:36. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru