Search code examples
c++vectorctypeisalpha

isalpha in c++ not working correctly for single integer


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);
}

Solution

  • 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.