【问题标题】:goto problems and for loops problemsgoto 问题和 for 循环问题
【发布时间】:2014-09-30 20:40:49
【问题描述】:

我有这个项目,我需要编写代码来模拟 DFA 以接受 url。我发现的 DFA 部分完全没问题,但我的代码有一些问题。 第一个问题是当我运行代码时,它似乎没有超过 cout

逗号运算符的27个左操作数无效[-Wunused-value]

27 逗号运算符右操作数无效[-Wunused-value]

27 错误:预期为 ';'在')'标记之前

31 错误:“goto”之前的预期主表达式

31 错误:在 'goto' 之前应为 ')'

出于某种原因在每个 for 循环中

#include <iostream>
#include <string.h>
#include <stdlib.h>
using namespace std;
int main() {
    char asdf='y';
    string str;
    int stringlength,state;
    while (asdf=='y'){
        start:
        cout << "Do you want to enter a string?(y/n)\n";
        cin >> asdf;
        cout << "Enter the string:\n";
        cin >> str;
        stringlength=str.size();
        state=0;
        //transition states q0 start
            //w means goto q1,increment state by 1
            if(str[0]=='w'){
                cout << "character:"<<str[state]<<" "<<"state:"<<state<<"\n";
                state++;
                goto q1;
            }
            //. means trap state,loop the rest of the char's and output trap state and output "rejected", then return to start
            if(str[0]=='.'){
                state=stringlength-state;
                for(state,state>0,state--){
                    cout << "character:"<<str[stringlength-state]<<" "<<"state:trap\n";
                }
                cout << "rejected\n";
                goto start;
            }
            //not w and not . means goto q7
            cout << "character:"<<str[state]<<" "<<"state:"<<state<<"\n";
            state++;
            goto q7;

        q1:
            //w means goto q2
            if (str[1]=='w'){
                cout << "character:"<<str[state]<<" "<<"state:"<<state<<"\n";
                state++;
                goto q2;
            }
            //. means go to q6
            if (str[1]=='.'){
                cout << "character:"<<str[state]<<" "<<"state:"<<state<<"\n";
                state++;
                goto q6;
            }
            //not w and not . means goto q7
            cout << "character:"<<str[state]<<" "<<"state:"<<state<<"\n";
            state++;
            goto q7;
        q2:
            //w means goto q3
            if (str[2]=='w'){
                cout << "character:"<<str[state]<<" "<<"state:"<<state<<"\n";
                state++;
                goto q3;
            }
            //. means go to q6
            if (str[2]=='.'){
                cout << "character:"<<str[state]<<" "<<"state:"<<state<<"\n";
                state++;
                goto q6;
            }
            //not w and not . means goto q7
            cout << "character:"<<str[state]<<" "<<"state:"<<state<<"\n";
            state++;
            goto q7;
        q3:
            //w means goto q3
            if (str[3]=='.'){
                cout << "character:"<<str[state]<<" "<<"state:"<<state<<"\n";
                state++;
                goto q4;
            }
            //not . means goto q7
            cout << "character:"<<str[state]<<" "<<"state:"<<state<<"\n";
            state++;
            goto q7;
        q4:
            //. mean trap state
            if (str[4]=='.'){
                state=stringlength-state;
                for(state,state>0,state--){
                    cout << "character:"<<str[stringlength-state]<<" "<<"state:trap\n";
                }
                cout << "rejected\n";
                goto start;
            }
            //everything else goes to q5
            cout << "character:"<<str[state]<<" "<<"state:"<<state<<"\n";
            state++;
            goto q5;
        q5:
            //. means goto q6
            if (str[state]=='.'){
                cout << "character:"<<str[state]<<" "<<"state:"<<state<<"\n";
                state++;
                goto q6;
            }
            //everything else goes back to q5
            cout << "character:"<<str[state]<<" "<<"state:"<<state<<"\n";
            state++;
            goto q5;
        q6:
            //c means goto q8
            if (str[state]=='c'){
                cout << "character:"<<str[state]<<" "<<"state:"<<state<<"\n";
                state++;
                goto q8;
            }
            //everything else goes to trap state
            state=stringlength-state;
            for(state,state>0,state--){
                cout << "character:"<<str[stringlength-state]<<" "<<"state:trap\n";
            }
            cout << "rejected\n";
            goto start;
        q7:
            //. means goto q6
            if (str[state]=='.'){
                cout << "character:"<<str[state]<<" "<<"state:"<<state<<"\n";
                state++;
                goto q6;
            }
            //everything else goes back to q7
            cout << "character:"<<str[state]<<" "<<"state:"<<state<<"\n";
            state++;
            goto q7;
        q8:
            //o means goto q9
            if (str[state]=='o'){
                cout << "character:"<<str[state]<<" "<<"state:"<<state<<"\n";
                state++;
                goto q9;
            }
            //everything else goes to trap state
            state=stringlength-state;
            for(state,state>0,state--){
                    cout << "character:"<<str[stringlength-state]<<" "<<"state:trap\n";
                }
                cout << "rejected\n";
                goto start;
        q9:
            //m means goto q10
            if (str[state]=='m'){
                cout << "character:"<<str[state]<<" "<<"state:"<<state<<"\n";
                state++;
                goto q10;
            }
            //. means goto q11
            if (str[state]=='.'){
                cout << "character:"<<str[state]<<" "<<"state:"<<state<<"\n";
                state++;
                goto q11;
            }
            //everything else goes to trap state
            state=stringlength-state;
            for(state,state>0,state--){
                    cout << "character:"<<str[stringlength-state]<<" "<<"state:trap\n";
                }
                cout << "rejected\n";
                goto start;
        q10:
            //compare length of string to state,if it matches there are no more char in string and is accepted
            if (stringlength==state){
                cout << "character:"<<str[state]<<" "<<"state:"<<state<<"\n";
                cout << "accepted\n";
                goto start;
            }
            //everything else goes to trap state
            state=stringlength-state;
            for(state,state>0,state--){
                    cout << "character:"<<str[stringlength-state]<<" "<<"state:trap\n";
                }
                cout << "rejected\n";
                goto start;
        q11:
            //j means goto q12
            if (str[state]=='j'){
                cout << "character:"<<str[state]<<" "<<"state:"<<state<<"\n";
                state++;
                goto q12;
            }
            //everything else goes to trap state
            state=stringlength-state;
            for(state,state>0,state--){
                    cout << "character:"<<str[stringlength-state]<<" "<<"state:trap\n";
                }
                cout << "rejected\n";
                goto start;
        q12:
            //p means goto q13
            if (str[state]=='p'){
                cout << "character:"<<str[state]<<" "<<"state:"<<state<<"\n";
                state++;
                goto q13;
            }
            //everything else goes to trap state
            state=stringlength-state;
            for(state,state>0,state--){
                    cout << "character:"<<str[stringlength-state]<<" "<<"state:trap\n";
                }
                cout << "rejected\n";
                goto start;
        q13:
            //compare length of string to state,if it matches there are no more char in string and is accepted
            if (stringlength==state){
                cout << "character:"<<str[state]<<" "<<"state:"<<state<<"\n";
                cout << "accepted\n";
                goto start;
            }
            //everything else goes to trap state
            state=stringlength-state;
            for(state,state>0,state--){
                    cout << "character:"<<str[stringlength-state]<<" "<<"state:trap\n";
                }
                cout << "rejected\n";
                goto start;
        }
return 0;
}

【问题讨论】:

  • 如果你使用表格来表示你的状态,你的代码会更容易调试和理解。哇,您可以在特殊情况下使用指向函数的指针。在网上搜索“c++ 状态设计模式”。
  • 我更喜欢带有意大利面条代码的肉丸。 :-)

标签: c++


【解决方案1】:

for 循环中的三个表达式需要使用分号而不是逗号来分隔:

            for(state,state>0,state--){
                     ^-------^ Change these to ;

【讨论】:

  • 同样for-loop的初始化没有意义(那里没有初始化)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-30
  • 1970-01-01
相关资源
最近更新 更多