Đây là bt môn ngôn ngữ hình thức của mình.nhưng k hiểu sao sau khi nhập n show ra cứ bị lỗi phông chữ. bạn nào biết sửa giúp mình với ^^
#include<iostream>
using namespace std;
typedef struct otomat
{
char vt, vp, kh;
}OTMA;
bool lap(OTMA [], OTMA gt, int dc);
void nhapdc(OTMA >);
bool timdce(OTMA gt);
bool thuanhan(char p, char *f, int q);
bool thua_nhan(char *f, int q, OTMA gt);
void show(OTMA gt);
OTMA cong(OTMA x, OTMA y);
void thuchien(OTMA *p, int &dc, char *f, int &q);
void show_dc(otomat *p, int dc, char *f, int q);
void nhap(OTMA *p, int &dc, char *f, int &q, char *a, int &n, char *b, int &m, char s);
int main()
{
char a[100];
char b[100];
char f[20];
OTMA p[100];
int q, dc;
int n, m;
char s;
nhap(p, dc, f, q, a, n, b, m, s);
thuchien(p, dc, f, q);
show_dc(p, dc, f, q);
system("pause");
return 0;
}
bool lap(OTMA *p, OTMA gt, int dc)//tim ra n~trang thai den chinh no
{
for (int i = 0; i<dc; i++)
if ((gt.vt == p[i].vt) && (gt.vp == p[i].vp) && (gt.kh == p[i].kh)) return true;
return false;
}
void nhapdc(OTMA >)
{
cout << "Trang thai nguon = ";
fflush(stdin);
cin.get(gt.vt);
gt.vt = toupper(gt.vt);
cout << "Trang thai nguon = " << gt.vt;
cout << endl;
cout << "Ky hieu chuyen = ";
fflush(stdin);
cin.get(gt.kh);
gt.kh = toupper(gt.kh);
cout << "Ky hieu chuyen = " << gt.kh;
cout << endl;
cout << "Trang thai dich = ";
fflush(stdin);
cin.get(gt.vp);
gt.vp = toupper(gt.vp);
cout << "Trang thai dich = " << gt.vp;
cout << endl;
cout << endl;
}
bool timdce(OTMA gt) // tim ra dich chuyen epxilon
{
if ((gt.vt != gt.vp) && (gt.kh == '*')) return true;
return false;
}
bool baccau(OTMA x, OTMA gt)
{
if (gt.vp == x.vt) return true;
return false;
}
bool thuanhan(char p, char *f, int q)// tim xem trang thai thua nhan co thuoc trong dich chuyen hay k
{
for (int i = 0; i<q; i++)
if (f[i] == p) return true;
return false;
}
bool thua_nhan(char *f, int q, OTMA gt)// loai bo truong hop ca ve trai va vp deu la tt thua nhan va gap e
{
for (int i = 0; i<q; i++)
if ((gt.vp == f[i]) && (gt.kh == '*') && (thuanhan(gt.vt, f, q) == false)) return true;
return false;
}
void nhap(OTMA *p, int &dc, char *f, int &q, char *a, int &n, char *b, int &m, char s)
{
cout << "moi ban nhap otomat M=(X, Q, dc, q0, F ) : " << endl;
cout << "quy uoc : " << endl;
cout << "1. bo chu vao la ki hieu chu thuong. " << endl;
cout << "2. tap huu han trang thai la tap cac ki hieu chu hoa." << endl;
cout << " - - - - - - - - - - - - - - - - - - - - - - - - \n";
cout << endl;
cout << "ban muon nhap may ki hieu trong bo chu vao X ? " << endl;
cout << "nhap n = ";
cin >> n;
cout << endl;
for (int i = 0; i<n; i++)
{
cout << endl;
cout << "ki hieu vao thu " << i + 1 << " : ";
cin >> a[i];
a[i] = tolower(a[i]);
cout << "ki hieu vao thu " << i + 1 << " la : " << a[i];
cout << endl;
}
cout << endl;
cout << " - - - - - - - - - - - - - - - - - - - - - - - - \n";
cout << endl;
cout << "ban muon nhap may tap huu han trang thai Q ? " << endl;
cout << "nhap m =";
cin >> m;
cout << endl;
for (int j = 0; j<m; j++)
{
cout << endl;
cout << "trang thai thu " << j + 1 << " : ";
cin >> b[j];
b[j] = toupper(b[j]);
cout << "trang thai thu " << j + 1 << " la : " << b[j];
cout << endl;
}
cout << endl;
cout << " - - - - - - - - - - - - - - - - - - - - - - - - \n";
cout << endl;
cout << "ban muon nhap bao nhieu dich chuyen ? ( epsilon nhap la * ) " << endl;
cout << "So luong dich chuyen : "; cin >> dc;
for (int i = 0; i<dc; i++)
{
cout << "Dich chuyen thu " << i + 1 << " : ";
cout << endl;
nhapdc(p[i]);
}
cout << " - - - - - - - - - - - - - - - - - - - - - - - - \n";
cout << endl;
cout << " nhap ki hieu bat dau q0 ! ";
cin >> s;
s = toupper(s);
cout << " ki hieu bat dau la : " << s;
cout << endl;
cout << " - - - - - - - - - - - - - - - - - - - - - - - - \n";
cout << endl;
cout << " nhap bao nhieu trang thai thua nhan F ? ";
cin >> q;
for (int i = 0; i<q; i++)
{
cout << " trang thai thua nhan thu " << i + 1 << "la : ";
cin >> f[i];
f[i] = toupper(f[i]);
cout << endl;
cout << " trang thai thua nhan thu " << i + 1 << "la : " << f[i];
cout << endl;
}
}
void show_dc(OTMA *p, int dc, char *f, int q)
{
cout << "________________________________________________________" << endl;
cout << "Otomat moi co ham dich chuyen nhu sau:" << endl;
for (int i = 0; i<dc; i++)
if (p[i].kh != '*')
{
show(p[i]);
cout << endl;
}
cout << "Cac trang thai thua nhan la: " << endl << "\t\t\t";
for (int i = 0; i<q; i++) cout << f[i] << ' ';
}
void thuchien(OTMA *p, int &dc, char *f, int &q)
{
OTMA P;
for (int i = 0; i<dc; i++)
{
if (timdce(p[i]) == true)
{
for (int j = 0; j<dc; j++)
if (baccau(p[j], p[i]) == true)
{
P = cong(p[i], p[j]);
if (lap(p, P, dc) == false)
{
p[dc] = P;
dc += 1;
}
}
}
if (thua_nhan(f, q, p[i]) == true)
{
f[q] = p[i].vt;
q += 1;
}
}
}
OTMA cong(OTMA x, OTMA y)
{
OTMA kq;
kq.kh = (x.kh)+(y.kh);
kq.vp = (x.vp)+(y.vp);
kq.vt = x.vt;
return kq;
}
void show(OTMA gt)
{
cout << "\t\t\t dich chuyen : " << gt.vt << ","<<gt.kh << "-> " << gt.vp;
}


83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?