Cài đặt Máy Turing

Một phần của tài liệu (LUẬN văn THẠC sĩ) cài đặt máy turing và ứng dụng máy turing đánh giá độ phức tạp thuật toán (Trang 31 - 36)

Để mô phỏng máy Turing học viên đã sử dụng ngôn ngữ lập trình C++. Sau đây học viên xin giới thiệu các thành phần chính của chương trình.

- Hàm chính để khởi động máy Turing:

main(){ cout << " T H E T U R I N G M A C H I N E "; Run(); cout << "\n T H E E N D."; cin.get(); return 0; }

- Hàm Run () được sử dụng để điều khiển chọn tệp chứa lệnh máy đưa vào máy Turing. Hàm này nhận lệnh từ bàn phím để nạp dữ liệu vào máy.

void Run(){ char fn[100];

cout << "\n File [Bam ENTER de nhan file mac dinh Prog.tr]: ";

gets(fn);

if (CorrectTest(fn,0) == '\0') strcpy(fn,fname); Test(fn);

}

Sau khi hàm Run () được gọi trong chương trình, chương trình dừng lại để người dùng nhập đường dẫn đến tệp chứa lệnh máy hoặc dùng tệp mặc định Prog.tr.

Các hàm thành phần:

Hàm Test (): được dùng để kiểm tra sự đúng đắn của chương trình. Ngoài ra hàm Test () còn điều khiển một số tác năng khác của máy Turing như: hiển thị các bước trung gian của thuật giải, tín hiệu nhập dữ liệu từ bàn phím, mở Help để xem chỉ dẫn. Một số chỉ dẫn điển khiển chương trình như:

+ Dấu chấm “.” để dừng chương trình đang chạy (ngắt chương trình bắt buộc). + Dấu hỏi chấm “?” đặt trước input để chạy chương trình máy Turing…

void Test(const char * fn){ YY; if (!ReadProg(fn)) { Err(4); return; } WW; while(1){

cout << "\n Input [Bam (.) de dung, (?) de nap test]: \n ";

GetComm(u); CorrectTest(u,0); switch(toupper(u[0])){

case 'H': Help(); break;

case '.': return; break;

case 'L': YY; ReadProg(fn); WW; break;

case '$': show = !show; break;

case '?': CorrectTest(u,1); Exe(u);

} // switch

// else Exe(u); // Go();

} }

Hàm GetComm () có tác dụng lấy từng câu lệnh trong tệp mã lệnh (tệp mặc định là tệp Prog.tr) sau đó hàm CorrectTest () kiểm tra tính đúng của từng câu lệnh:

void GetComm(char * s, const char * msg = ""){ int i = 0; cout << msg; while(cin.good()){ s[i] = cin.get(); if (s[i] == NL) break; // NL = 10 = '\n' ++i; } s[i] = '\0'; }

char CorrectTest(char * s, int d = 0){ // cout << "\n|" << s << "| -> |"; int i, j, n = strlen(s);

// Bo cac dau cach dau s for (i = d; i < n ; ++i){ if (s[i] != SPACE) break; }

// Bo cac dau cach cuoi s for (j = n-1; j >= i; --j) if (s[j] != SPACE) break; if (i > j) {

s[0] = EOL; return EOL; }

for (n = 0 ; i <= j; ++i)

if (s[i] != TAB) s[n++] = s[i]; s[n] = EOL;

// cout << "\n |" << s << "|"; Go(); return s[0];

}

Một số hàm khác để chuẩn hóa câu lệnh:

+ Hàm Correct () loại bỏ các phần chú thích trong đoạn mã lệnh máy Turing.

char Correct(char * s, int d = 0){

// cout << "\n|" << s << "| -> |";

int i, j, n = strlen(s); char * p;

// Bo cac dau cach dau s for (i = d; i < n ; ++i){

if (s[i] == SLASH && s[i+1] == SLASH) { s[0] = EOL; return s[0]; } if (GOODCHAR(s[i])) break; } p = lstrstr(s,"//"); j = (p != NULL) ? j = p-s-1 : n-1; // Bo cac dau cach cuoi s

for (; j >= i; --j)

if (GOODCHAR(s[i])) break; if (i > j) {

s[0] = EOL; return EOL; }

for (n = 0 ; i <= j; ++i)

s[n++] = (s[i] == TAB) ? SPACE : s[i]; s[n] = EOL;

// cout << "\n |" << s << "|"; Go(); return s[0];

+ Hàm ReadLine () đọc từng dòng trong tệp chứa lệnh Prog.tr hoặc tệp mã lệnh do người dùng tạo ra.

char ReadLine(char * s){ memset(s,0,sizeof(s)); if (f.eof()) {

strcpy(s,"F");

// cout << "\n EXIT with " << s; } else f.getline(s,100,'\n'); return Correct(s);

}

+ Hàm GetNum () có tác dụng chuyển định dạng từ dạng kí tự thành dạng số.

int GetNum(char * s, int & i){ int v = 0;

for (; !Num(s[i]); ++i);

for (; Num(s[i]); ++i) v = v*10+Toint(s[i]); --i;

return v; }

+ Hàm Space () dùng để bỏ qua các dấu cách trống vô nghĩa.

inline void Space(char * s, int & i){ while(s[i] == SPACE) ++i;

}

+ Hàm GetChar () có tác dụng lấy các lí tự có nghĩa.

inline char GetChar(char * s, int & i){ Space(s,i);

return s[i]; }

// Nhan cac chu cai trong day {...}

inline void XuLiSet(const char *s, int i, int state, Com & cm){

if (GOODCHAR(s[i]) && s[i] != ',') p[state][s[i]] = cm;

}

Các hàm trên sau khi hoạt động sẽ loại bỏ các các thành phần không cần thiết như các dấu cách, phần chú thích trong mã lệnh ở tệp Prog.tr hoặc tệp người dùng chỉ định để đơn giản hóa các câu lệnh khi chạy trên máy Turing.

Một phần của tài liệu (LUẬN văn THẠC sĩ) cài đặt máy turing và ứng dụng máy turing đánh giá độ phức tạp thuật toán (Trang 31 - 36)