C++ 中的 isalpha 对于单个整数不能正常工作
isalpha in c++ not working correctly for single integer
我编写了一个代码,使用 stl(向量)将 nfa 转换为 dfa。
在此代码中,isalpha() 不起作用。
isalpha 下面的 if 块 不做任何事情。
如果我输入一个字母表,它会在其下方打印所有 cout
我尝试使用
if(isaplha(n){
cout<<"Incorrect";
return 0;
}
还是不行
如果您能提出任何建议,那就太好了。另外,如果您觉得代码需要任何改进,请告诉
#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);
}
测试数字输入正确的简单方法是测试操作:
if (!(cin >> n))
{
std::cerr << "Invalid input, expected number".
return 0;
}
但是,这不包括以下情况:
1b683 -- 输入停止在 "b" 和 returns 值 1
3.14159 -- 输入在“.”处停止和 returns 值 3。
要捕获上述异常,您可能需要执行解析,或者可能需要执行正则表达式。对于简单的程序,两者都比较复杂。
我编写了一个代码,使用 stl(向量)将 nfa 转换为 dfa。 在此代码中,isalpha() 不起作用。 isalpha 下面的 if 块 不做任何事情。 如果我输入一个字母表,它会在其下方打印所有 cout 我尝试使用
if(isaplha(n){
cout<<"Incorrect";
return 0;
}
还是不行 如果您能提出任何建议,那就太好了。另外,如果您觉得代码需要任何改进,请告诉
#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);
}
测试数字输入正确的简单方法是测试操作:
if (!(cin >> n))
{
std::cerr << "Invalid input, expected number".
return 0;
}
但是,这不包括以下情况:
1b683 -- 输入停止在 "b" 和 returns 值 1
3.14159 -- 输入在“.”处停止和 returns 值 3。
要捕获上述异常,您可能需要执行解析,或者可能需要执行正则表达式。对于简单的程序,两者都比较复杂。