-3

I made a code to convert nfa to dfa using stl(vectors). In this code isalpha() is not working. The if block below isalpha doesnt do anything. If i enter an alphabet it prints all the cout below it I tried using

if(isaplha(n){
cout<<"Incorrect";
return 0;
}

It's still not working If you could suggest anything that will be great. Also if you feel the code needs any improvement please tell

#include<ctype.h>
#include<bits/stdc++.h>
using namespace std;
void print(vector<vector<vector<int> > > table){
    cout<<setw(10)<<"STATE/INPUT";
    char a='a';
    for(int i=0;i<table[0].size()-1;i++){
        cout<<setw(10)<<a++<<setw(10);
    }
    cout<<"^"<<endl<<endl;
    for(int i=0;i<50;i++)
        cout<<"-";
        cout<<endl;
    for(int i=0;i<table.size();i++){
        cout<<setw(10)<<i;
        for(int j=0;j<table[i].size();j++){
            cout<<setw(10);
            for(int k=0;k<table[i][j].size();k++){
                cout<<table[i][j][k]<<" ";
            }
        }
        cout<<endl;
    }
}
void printdfa(vector<vector<int> > states, vector<vector<vector<int> > > dfa){
    cout<<"  STATE/INPUT  ";
    char a='a';
    for(int i=0;i<dfa[0].size();i++){
        cout<<setw(11)<<a++<<setw(10);
    }
    cout<<endl<<endl;
    for(int i=0;i<50;i++)
        cout<<"-";
        cout<<endl;
    cout<<endl;
    for(int i=0;i<states.size();i++){
        cout<<setw(11)<<"{ ";
        for(int h=0;h<states[i].size();h++)
            cout<<states[i][h];
        if(states[i].empty()){
            cout<<"^";
        }
        cout<<" }";
        for(int j=0;j<dfa[i].size();j++){
            cout<<setw(11);
            for(int k=0;k<dfa[i][j].size();k++){
                cout<<dfa[i][j][k]<<" ";
            }
            if(dfa[i][j].empty()){
                cout<<"^";
            }
        }
        cout<<endl;
    }
}
vector<int> closure(int s,vector<vector<vector<int> > > v){
    vector<int> t;
    queue<int> q;
    t.push_back(s);
    int a=v[s][v[s].size()-1].size();
    for(int i=0;i<a;i++){
        t.push_back(v[s][v[s].size()-1][i]);
        q.push(t[i]);
    }
    while(!q.empty()){
        int f=q.front();
        q.pop();
        if(!v[f][v[f].size()-1].empty()){
            int u=v[f][v[f].size()-1].size();
            for(int i=0;i<u;i++){
                int y=v[f][v[f].size()-1][i];
                if(find(t.begin(),t.end(),y)==t.end()){
                    t.push_back(y);
                    q.push(y);
                }
            }
        }
    }
    return t;
}
int main(){
    int n,alpha;
    cout<<"************************* NFA to DFA *************************"<<endl<<endl;
    cout<<"Enter total number of states in NFA : ";
    cin>>n;
    if(isalpha(n) != 0){
        cout<<"Incorrect";
        return 0;
    }
    cout<<"Enter number of elements in alphabet : ";
    cin>>alpha;
    if(isalpha(alpha) != 0){
        cout<<"Incorrect";
        return 0;
    }
    vector<vector<vector<int> > > table;
    for(int i=0;i<n;i++){
        cout<<"For state "<<i<<endl;
        vector< vector< int > > v;
        char a='a';
        int y,yn;
        for(int j=0;j<alpha;j++){
            vector<int> t;
            cout<<"Enter no. of output states for input "<<a++<<" : ";
            cin>>yn;
            cout<<"Enter output states :"<<endl;
            for(int k=0;k<yn;k++){
                cin>>y;
                t.push_back(y);
            }
            v.push_back(t);
        }
        vector<int> t;
        cout<<"Enter no. of output states for input ^ : ";
        cin>>yn;
        cout<<"Enter output states :"<<endl;
        for(int k=0;k<yn;k++){
            cin>>y;
            t.push_back(y);
        }
        v.push_back(t);
        table.push_back(v);
    }
    cout<<endl<<endl<<"***** TRANSITION TABLE OF NFA *****"<<endl<<endl;
    print(table);
    cout<<endl<<endl<<endl<<"***** TRANSITION TABLE OF DFA *****"<<endl<<endl;
    vector<vector<vector<int>>> dfa;
    vector<vector<int> > states;
    states.push_back(closure(0,table));
    queue<vector<int> > q;
    q.push(states[0]);
    while(!q.empty()){
        vector<int> f=q.front();
        q.pop();
        vector<vector<int> > v;
        for(int i=0;i<alpha;i++){
            vector<int> t;
            set<int> s;
            for(int j=0;j<f.size();j++){
                for(int k=0;k<table[f[j]][i].size();k++){
                    vector<int> cl= closure(table[f[j]][i][k],table);
                    for(int h=0;h<cl.size();h++){
                        if(s.find(cl[h])==s.end())
                        s.insert(cl[h]);
                    }
                }
            }
            for(set<int >::iterator u=s.begin(); u!=s.end();u++)
                t.push_back(*u);
            v.push_back(t);
            if(find(states.begin(),states.end(),t)==states.end())
            {
                states.push_back(t);
                q.push(t);
            }
        }
        dfa.push_back(v);
    }
    printdfa(states,dfa);
}
Priyank
  • 111
  • 1
  • 7
  • 5
    **Recommended reading:** [Why should I not #include ?](https://stackoverflow.com/q/31816095/560648) – Asteroids With Wings Jun 18 '20 at 20:07
  • 1
    @Priyank Could you provide a minimal program that demonstrates the problem without your vectors of vectors? – Vlad from Moscow Jun 18 '20 at 20:08
  • 1
    `int n; cin>>n;` doesn't allow non-number inputs, and you never checked if the operation succeeded or failed. – Mooing Duck Jun 18 '20 at 20:08
  • @Mooing Duck cin>>n allow single char input. How to check if operation succeeded or failed? – Priyank Jun 18 '20 at 20:10
  • No it doesn't. `cin>>n` (when `n` is an `int`) allows a single _integer_ input, between -2000000000ish and +2000000000ish (note: that's up to 11 chars). It doesn't allow any other characters. – Mooing Duck Jun 18 '20 at 20:12
  • 1
    Keep an eye out for misleading indentation. `for(int i=0;i<50;i++) cout<<"-"; cout< – user4581301 Jun 18 '20 at 20:12
  • @bhristov Your answer was almost right. It just needed some more explanation and a small tweak. – user4581301 Jun 18 '20 at 20:13
  • 1
    Can you please provide a [mcve], focus on minimal!? Only a few lines from the start of main are necessary to show what you mean. The rest is unnecessary bloat that makes it harder for everyone to find the relevant stuff to help you. – Werner Henze Jun 18 '20 at 20:15
  • 1
    The `cin >> n` will fail if the input is not an integer. The `isalpha` is for characters, not numbers. – Thomas Matthews Jun 18 '20 at 20:48
  • I recommend being nicer when the program fails. Don't output "incorrect", prefer to tell the User why it is incorrect, e.g. "Invalid input, expected number". – Thomas Matthews Jun 18 '20 at 20:50
  • `isalpha` works, it just doesn't do what you expect it to do. – john Jun 18 '20 at 21:11

1 Answers1

2

The simple method for testing the correct input of numbers is to test the operation:

if (!(cin >> n))
{
  std::cerr << "Invalid input, expected number".
  return 0;
}

However, this does not catch the following cases:
1b683 -- Input stops at "b" and returns the value 1
3.14159 -- Input stops at "." and returns the value 3.

To catch the above exceptions, you'll probably need to implement parsing, or maybe regular expression. Both are more complicated for simple programs.

Thomas Matthews
  • 56,849
  • 17
  • 98
  • 154