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

Brainf**k - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Рекурсия, ошибка http://www.cyberforum.ru/cpp-beginners/thread239332.html
Здраствуйте! У меня есть одна классическая задачка про Лесенку. Лесенка Лесенкой называется набор кубиков, в котором каждый более верхний слой содержит кубиков меньше, чем предыдущий. Требуется написать программу, вычисляющую число лесенок, которое можно построить из N кубиков. Входные данные Во входном файле input.txt записано натуральное число N (1 ≤ N ≤ 225) – количество кубиков в...
C++ Рекурсия Здраствуйте! У меня есть одна классическая задачка про Лесенку. Лесенка Лесенкой называется набор кубиков, в котором каждый более верхний слой содержит кубиков меньше, чем предыдущий. Требуется написать программу, вычисляющую число лесенок, которое можно построить из N кубиков. Входные данные Во входном файле input.txt записано натуральное число N (1 ≤ N ≤ 225) – количество кубиков в... http://www.cyberforum.ru/cpp-beginners/thread239329.html
C++ Шаблонные функции
Чет не получается написать шаблонную функцию. func.h template <class T> T strnstr (T str, T substr, unsigned int count) { T* str1; T* str2 = substr;
Даны действительные числа C++
1. Даны действительные числа x, y, z Вычислить: а)max(x+y+z, xyz) б)min^2(x+y+z/2,xyz)+1 2) даны x,y,z. вычислить a,b если a=(1+y)*((x+y)/(x^2+4))/e^-x-2 + 1/(x^2+4) b=(1+cos(y-2))/x^4 / 2+sin^2 Z помогите решить пожалуйста.
Visual C++ MFC Picture Control http://www.cyberforum.ru/cpp-beginners/thread239282.html
как сделать что бы Picture Control появлялся только после нажатия кнопки ?
C++ Вычислить арифметическое выражение пожалуйста помогите : Дано натуральное число n. Вычислить подробнее

Показать сообщение отдельно
perimetral
1 / 1 / 0
Регистрация: 17.12.2010
Сообщений: 16
08.02.2011, 23:47  [ТС]     Brainf**k
Недавно вот тут: http://www.cyberforum.ru/cpp-beginners/thread239337 я просил вас о помощи в реализации интерпретатора Brainf**ck с процедурами. Предложенный вариант не подошел тем, что присутствует ограничение области видимости процедуры. А тем временем я дописал свой интерпретатор, но возникла новая проблема - неизвестная ересь при работе с процедурами. Я сделал парсер отдельной функцией, которую и вызываю при старте программы; при встрече процедуры я вызываю парсер на текст внутри процедуры. Проблема в том, что текст в процедурах не парсится, не знаю, почему. Я бы и сам нашел ошибку, если бы мог ходить отладкой (F10) по коду, но не могу, ибо нужно вводить аргумент в cmd, чего при отладке по F10 нельзя. Кстати, VS2010. Вот код:
Код
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
#include "stdafx.h"
#include <iostream>
#include <fstream>
using namespace std;
 
const int MAX = 32767;
 
void parse(char * txt, int pos, int now, int * inf, bool isproc) {
    int len = strlen(txt); int i=0, i3=0, i2=0, toreturn=0; char ** procZ = new char *, * tmp = new char; bool * isp = new bool;
    while (pos<len) {
        switch (txt[pos]) {
        case '<': {
            now++; if (now == MAX) now = 0; pos++;
            break; }
        case '>': {
            now--; if (now == 0) now = MAX; pos++;
            break; }
        case '+': {
            inf[now]++; pos++;
            break; }
        case '-': {
            inf[now]--; pos++;
            break; }
        case ',': {
            inf[now] = getchar(); pos++;
            break; }
        case '.': {
            putchar(inf[now]); pos++;
            break; }
        case '[': {
            if (inf[now] != 0) {
                pos++;
            } else if (inf[now] == 0) {
                i = pos;
                while (txt[i] != ']') { pos++; i++; } }
            break; }
        case ']': {
            if (inf[now] == 0) {
                pos++;
            } else if (inf[now] != 0) {
                i = pos;
                while (txt[i] != '[') { pos--; i--; } }
            break; }
        case ')': {
            if (isproc) {
                pos=len;
            } break; }
        case '(': {
            if (isproc) {
                cout<<"Синтаксическая ошибка на "<<pos+1<<"м символе"; pos=len; break; } else {
            i3 = inf[now];
            procZ[i3] = new char;
            tmp = procZ[i3];
            i = pos; i2 = 0;
            while (txt[i] != ')') {
                tmp[i2] = txt[i]; i2++; i++;
            }
            procZ[i3] = tmp;
            isp[i3] = true;
            pos = i+1;
            break; } }
        case ':': {
            i3 = inf[now];
            tmp = procZ[i3];
            if (isp[i3]) {
                parse(tmp, pos, now, inf, true); } else { cout<<"Попытка вызвать несуществующую процедуру на "<<pos+1<<"м символе";
                pos=len; }
            pos++;
            break; }
        default: {
            pos++; break; }
        } }
}
 
void work(char * txt) {
    int len = strlen(txt), i=0, pos=0, now=100, inf[MAX];
    char ** procZ = new char *; char * tmp = new char;
    while (i<MAX) {
        inf[i] = 0; i++; } i=0;
    parse(txt, pos, now, inf, false);
}
 
int main(int argc, char * argv[])
{
    fstream f = fstream(); setlocale(LC_ALL, "Russian");
    bool towork = true; char * txt = new char;
    if (argc < 2) {
        cout<<"Вы не ввели имя файла";
        towork = false; }
    else if (argc > 2) {
        cout<<"Вы ввели лишний параметр";
        towork = false; }
    if (towork) {
        f.open(argv[1], ios::in);
        f >> txt;
        work(txt);
        cout<<endl<<"Программа завершилась";
        f.close();
    }
    return 0;
}


 Комментарий модератора 
Не нужно плодить темы про одно и то же. Да и ссылку Вы неправильную дали...
 
Текущее время: 16:02. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru