Mo phong mach logic so
Trang 1Trờng đại học Bách khoa hà nộiKhoa điện tử viễn thông
Trang 2hµ néi 6/2000
Trang 3Trờng đại học Bách khoa hà nộiKhoa điện tử viễn thông
Trang 4Hµ Néi - 6/2000
Trang 5I.Đặt vấn đề:
Máy tính hiện nay là một công cụ rất mạnh để giải quyết những bài toán về kĩ thuật đòi hỏi khả năng tính toán cao.
Với khả năng đồ hoạ của mình máy tính cho phép không chỉ thể hiện u điểm của mình ở khả năng tihns toán nhanh mà nó còn cho phép chúng ta biểu thị các đối t-ợng các hoạt động, các sự kiện một cách sinh động bằng hình ảnh.Đây là nguyên nhân vì sao hiện nay cùng với sự phát triển nhanh về tốc độ ,su hớng làm phần mềm về đồ hoạ mô phỏng ,hoặc những phần mềm đồ hoạ 3D phát triển rất mạnh.
Để bắt kịp với sự phát triển của thế giới chúngta cần phải khai thác một cách triệt để khả năng của máy tính.
Với sự hớng dẫn của thầy giáo Vũ Song Tùng chúng tôi thiết kế phần mềm Mô phỏng Mạch Logic số vơí mục đích:
•Khai thác khả năng về đồ hoạ của máy tính
•Bớc đầu làm quen với lập trình hớng đối tợng
•Tăng dần khả năng lập trình với việc giải quyết các vấn đề nảy sinh trong kĩ thuật lập trình mô phỏng(cha phải theo thời gian thực)
Chúng tôi chọn ngôn ngữ C++ để thực hiện chơng trình của mình
bởi vì hiện nay C++ đang đợc dạy trong các trờng đại học và khả năng lập trình hớng đối tợng của nó rất mạnh rất thích hợp với các bài toán về đối tợng.
Tuy nhiên do thời gian có hạn nên một số ý tởng của tác giả cũng nh một số kĩ thuật lập trình cha đợc đa vào.Vì thế chơng trình còn nhiều vấn đề cha đợc hoàn thiện.Phần mềm này chỉ thích hợp với khuôn khổ một bài tập lớn.Chơng trình chỉ dừng ở mức hớng đối tợng một nửa,cho nên rất thích hợp với những ngời mới học lập trình h-ớng đối tợng.Chơng trình đợc trình bày một cách dõ dàng ,dễ đọc dễ hiểu,có thể là tài liệu tham khảo của những ngời mới học lập trình hớng đối tợng.
Cuối cùng thay mặt cả nhóm xin chân thành cám ơn thầy :Vũ Song Tùng đã nhiệt tình giúp đỡ chúng em hoàn thành chơng trình này
Nhóm trởng: Đặng Hiếu Nhơn
II.Cơ sở lý thuyết:
Các phần tử logic cơ bản là AND,OR,NOT,XOR,NAND,NOR.Các cổng logic hoạt động theo một bảng gọi là bảng chân lí(True Table).Tong ứng với 6 cổng logic ta
Trang 7Ta chia các đối tợng ra làm 2 loại:
• Đối tợng nguyên tố : đối tợng này là nhỏ nhất không thể chia nhỏ đợc nữa
• Đối tợng nhóm(Group): đối tợng này gồm nhiều đối tợng con ghép lại.
Chơng trình đợc thiết kế theo kiểu giao diện của Windows bao gồm hệ thống Menu(Bảng chọn), ToolBar(Thanh công cụ), Các nút bấm (Button), Hộp thoại (MessageBox), Hộp nhập liệu (InputBox), các đối tợng lựa chọn(Option), Các đối tợng ảnh(Image).
Hoạt động của mỗi mạch logic đợc thiết kế ở những của sổ riêng gọi là các FORM.Thể hiện hoạt động theo thời gian ta dùng đối tợng Osilo,Bảng chân lý ta dùng đối tợng TrueTable,để thay đổi các đầu vào ta dùng các nút chuyển mạch(SwitchButton)
3.2.Các hàm và các đối tợng:
Các hàm và các đối tợng đợc khai báo trong file logic.h nh sau: #ifndef_LOGIC_H_
Trang 9extern int TextHeight();
Trả về chiều cao của phông chữ sử dụng extern int TextWidth(char ch);
Trả về độ rộng của kí tự ch extern int Strlen(char *s);
Trả về độ dài sâu s theo pixel
extern void ShowString(int x,int y,const char* s,byte color); Vẽ sâu s tai vị trí (x,y) có màu là color
extern void ShowChar(int x,int y,byte ch,byte color); Vẽ kí tự có mã ch tại vị trí (x,y) màu là color extern void Load_fnt();
Đọc phông tiếng việt đa vào bộ nhớ extern void Load_Bmp(int l,int t,char *fname);
Đọc một file ảnh từ tệp có tên *fname ,sau đó đa ra man hình ở vị trí(l,t)
extern void ShowText(int l,int t,int w,int h,char *s,int c);
Vẽ một sâu kí tự s ở giữa hình chữ nhật có góc trái trên(l,t) độ rộng w,cao h có màu c
extern void DrawBar(int l,int t,int w,int h,int type);
Vẽ hình chữ nhật có góc tría trên(l,t),rộng w,cao h,với kiểu là type extern void Drawcaption(int l,int t,int w,int h,char *s);
Vẽ tiêu đề trong một hình chữ nhật extern void Dohoa();
Khởi tạo đồ hoạ
extern void Linec(int x1,int y1,int x2,int y2,byte c); Vẽ đờng thẳng với màu c
extern void Lineh3d(int x1,int x2,int y,int st);
Vẽ đờng thẳng 3d theo chiều ngang kiểu st(nổi hay chìm) extern void Linev3d(int y1,int y2,int x,char st);
Vẽ đờng thẳng 3d theo chiều dọc kiểu st(nổi hay chìm) extern void Bound(int x1,int y1,int x2,int y2,char tborder);
Vẽ đờng viền hình chữ nhật có kiểu tborder extern void Bbar(int x1,int y1,int x2,int y2,byte c);
Điền màu c vào một hình chữ nhật
extern void Rectangle(int x1,int y1,int x2,int y2,byte c);
Trang 10Vẽ hình chữ nhật với màu c void WaitforVR();
Chờ tín hiệu đồng bộ 4.2.Các hàm về Mouse: extern bool Msmoved();
Kiểm tra xem chuột có di chuyển không extern void Msmove(word x, word y);
Di chuyển chuột đến vị trí(x,y) extern void Ms_shape(word x);
extern void mouse(word *ax, word *bx, word *cx, word *dx); extern bool Mscheck(void);
extern bool Msinit(void); extern word Msreset(void);
extern void Mslimit(word left,word top,word right,word bottom); extern void Msshow(void);
extern void Mshide(void);
extern void Mshidebox(word left,word top,word right,word bottom); extern word MsXpos(void);
extern word MsYpos(void); extern void Msgetpos(int *,int *);
extern bool Msinbox(word left,word top,word right,word bottom); extern int Msbpress(word b);
extern int Msbreles(word b); extern int Msbstate(void);
extern int Mslastmove(bool dir);
extern void SetPointerShape(word Horiz,word Vert); extern int Msleftpress();
extern void MsSpeed(); extern int Msrightpress();
BITMAP(int l,int t){left=l,top=t;}; void ReadBMP (char *FileName );
Trang 11byte down;//biến trạng thái chỉ nút nổi hay chìm byte hint;//biến trạng thái xác định đã Showhint cha int hintx,hinty;//vị trí của hint
void *Img;//con trỏ lu ảnh khi Showhint
void Init(int l,int t,int w,int h);//Hàm tạo void Show();//Hàm hiển thị đối tợng void Showhint();//Hiện hint
void Hidehint();//ẩn hint int GetEvent();//Nhận sự kiện void Hide();//ẩn đối tợng
int Click();//trả về 1 nếu chuột trái kích vào đối tợng void Move(int,int);//Di chuyển đối tợng
void DoEvent();//thi hành sự kiện void Init( int l,int t,int w,int h) { left=l; top=t; width=w; height=h;
Trang 12void Init( int l,int t,int w,int h) { left=l; top=t; width=w; height=h;
Trang 13MessageBox(){ left=200; top=160; width=240; height=160; strcpy(caption," Logic Gate"); hide=move=1; } void Show();
void Init( int l, int t, int w, int h ); void Hide();
Trang 14void Move( int dx, int dy );
char out[15];//Lu dãy tín hiệu ra char fname[30];//tên file ảnh
byte type;//Kiểu mạch AND,OR ,NOT, byte show, event;//biến trạng thái
void Setvalue();//hàm đặt giá trị
void Black_Box(int,int,int,int);//Vẽ một hộp đen
Trang 15byte show,active,event;//Các biến trạng thái BmButton button[8];//8 nút của thanh công cụ
int And_Click();//trả về 1 naếu kích chuột vào nút AND int Or_CLick();//trả về 1 naếu kích chuột vào nút OR int Nand_Click();//trả về 1 naếu kích chuột vào nút NAND
void InsertPop(int,int,byte,int,char *);//Thêm một node vào MenuPop void InsertMenu(int, int,int,int,char *);//Thêm một node vào Menu void DelMenu();//
void Init();//Khởi tạo Menu int ManageBar();
void Draw_Bar(node *p);//Vẽ một node ở menubar void Draw_Pop(node *p);//Vẽ một node ở menupop void ShowBar();//Hiển thị menubar
void Show();//Hiển thị Menu void HidePop();//ẩn menupop void ShowPop();//Hiện menupop int DoEvent();//Thi hành sự kiện
byte scrup,scrdown;//biến trạng thái
int curpos,oldpos;//vị trí cũ và mới của thanh phân cách int indicatorsize;//độ dài thanh phân cách
Trang 16int minvalue,maxvalue;//giá trị lớn nhất và bé nhất mà thanh phân con
int Getpos();//Nhận vị trí của con chạy int GetEvent();//Nhận sự kiện
void Draw_scrollbar();//Vẽ thanh cuộn void Draw_indicator();//Vẽ con chạy void DoEvent();//Thi hành sự kiện void Show();//Hiện thanh cuộn byte show;//Biến trạng thái char fname[30];//tên file ảnh
Image (){left=top=width=height=show=0;}; void Init(int,int,int,int);//Khởi tạo
void ChangeIcon(char *s);/Thay đổi file ảnh
int N;//Số đầu vào
char X[4][17];//Mảng chứa đầu vào char Y[17];//Mảng ra
ScrollBar scrbar;//thanh cuộn int value,show;//Biến trạng thái
int type;//Kiểu mạch gì AND,OR,NOT
Trang 17void Init(int l,int t,int n);//Khởi tạo void Set_type(int);//Đặt kiểu mạch void Change_in(int);//Thay đổi đầu vào
void Draw_invisible();//vẽ phần không nhìn thấy ở trang màn hanình khác
void Draw_visible();//Vẽ phần thấy void Show();//Hiện đối tuợng void Hide();//ẩn đối tợng
void Setvalue();//Đặt giá trị cho đầu vào void Redraw(int);//Vẽ lại đối tợng
int GetEvent();//Nhận sự kiện
int left,top,width,height;//Vị trí đối tợng trên màn hình SwitchButton in[4];//4 nút chuyển mạch
BiButton out;//Nút thể hiện đầu ra byte show;
int N;//số đầu vào
char fname[30];//tên file ảnh
Trang 20Tuy chơng trình đã giải quyết đợc một số vấn đề trong việc xử lý sự kiện của các đối tợng nhng do việc xây dựng cơ sở ban đầu là những đối t-ợng rời rạc không có liên hệ gì với nhau cho nên khi một sự kiện phát sinh ta phải duyệt hết tất cả các đối tợng xem sự kiện này rơi vào đối tợng nào thì để cho đối tợng đó sử lí.Do vậy thời gian cho việc duyệt sẽ lâu hơn.
Ta có thể giải quyết vấn đề này bằng cách xây dựng một cấu trúc theo dạng cây nhiều nhánh kết hợp với danh sách liên kết đơn nh sau:
Một đối tợng lớn nhất chính là ứng dụng của ta.Ta gọi nó là MainApplication(đối tợng cha).Trong đối tợng cha gồm nhiều đối tợng con,mỗi đối tợng con là một nhóm các đối tợng nguyên tố (Group Object) Đối tợng nguyên tố là đối tợng bé nhất chỉ gồm một đối tợng Hệ thống này đợc hoạt động theo nguyên tắc sau:
Trong một đối tợng nhóm: Các đối tợng nguyên tố gồm một con trỏ (next) trỏ đến phần tử tiếp theo,một con trỏ (parent) trỏ đến cha nó Tơng tự nh vậy ,mỗi đối tợng nhóm cũng có một con trỏ next và một con trỏ parent trỏ đến đối tợng MainApplication.
Khi xảy ra một sự kiện bất kì(Sự kiện chuột,bàn phím,hay sự kiện do các đối tợng khác sinh ra) thì đối tợng MainApplication nhận sự kiện này( GetEvent()),sau đó nó sẽ sử lý sự kiện để loại ra là sự kiện gì (Mouse,Key,Common) ,tuỳ loại sự kiện mà nó sẽ gửi các sự kiện này đến các đối tợng con.Một sự kiện nếu không có phản ứng với đối twongj con srx đợc gửi đến cho phần tử kế tiếp.Khi tìm thấy một đối tợng có phản ứng với sự kiện thì đối tợng đó sẽ xử lý sự kiện sau đó phản hồi về cho đối tợng cha nó,đối tợng cha lại phản hồi về cho đối tợng MainApplication.Lúc đó đối tợng MainApplication mới cho phép nhận vào sự kiện mới hay không.
Để xử lí các sự kiện một cách linh hoạt phải tổ chức cấu trúc các sự kiện theo kiểu hàng đợi,sự kiện nào xảy ra trớc thì phải đợc sử lý trớc,sau khi xử lí song sự kiện này mới sử lí sự kiện tiếp theo,nh vậy các sự kiện sẽ không bị chồng nhau Với cách xử lí nh vậy mới có thể đáp ứng cho việc phát triển chơng trình thành một ứng dụng lớn.
Chơng trình này tuy còn khuyết điểm là khó phát triển ra lớn hơn nh-ng với khuôn khổ một bài tập lớn ,tôi nh-nghĩ nó hoàn toàn phù hợp.Chơnh-ng trình chỉ sử dụng những kĩ thuật lập trình đơn giản ,Trình bày sáng sủa, dễ đọc dễ hiểu,có thể làm tài liệu tham khảo cho những ngời lập trình nghiệp d.
Cuối cùng xin chân thành cảm ơn thầy giáo Vũ Song Tùng đã nhiệt tình giúp đỡ chúng em hoàn thành chơng trình này.
Trang 21Nhãm 3: §TVT12-K42 Hµ Néi 30-6-2000