Lập trình giao diện console C++

Console trong C#: Xuất – nhập dữ liệu, lớp System.Console

Đăng bởi

Mai Chi

-

25/07/2019

9

Facebook

Twitter

Pinterest

Linkedin

ReddIt

Hướng dẫn tự học lập trình C# toàn tập Console trong C#: Xuất – nhập dữ liệu, lớp System.Console

Giao diện console (console user interface, CUI), còn gọi là giao diện dòng lệnh (command line interface, CLI), là loại giao diện đơn giản nhất, trong đó dữ liệu xuất nhập đều là văn bản. Mặc dù không có gì hấp dẫn, ứng dụng với giao diện console (thường gọi tắt là ứng dụng console) luôn được sử dụng để dạy ngôn ngữ lập trình. Tương tự, trong khi học lập trình C# căn bản bạn sẽ gắn bó với ứng dụng console. Sự đơn giản của loại ứng dụng này giúp bạn tập trung vào các đặc trưng của ngôn ngữ, thay vì phân tâm cho sự phức tạp của giao diện đồ họa (Graphical User Interface) hay giao diện web.

Bài học này sẽ cung cấp cho bạn đầy đủ các kỹ thuật để làm việc với giao diện console trong C#: nhập, xuất, định dạng. Nắm chắc các kỹ thuật này sẽ giúp đơn giản hóa một phần việc học lập trình C# về sau.

Giới thiệu

Ở thập niên 80, thời điểm máy tính cá nhân vừa xuất hiện, giao diện đồ họa chỉ có trên một số ít máy Macintosh của Apple, giao diện cửa sổ dòng lệnh là phương tiện giao tiếp chính giữa người sử dụng và máy tính. Trong thời điểm này, máy tính cá nhân có giá thành đắt đỏ và gần như chỉ thuần phục vụ cho công việc: nhập liệu văn bản, thống kê với bảng tính, … cũng như lập trình.

IBM PC (Model 5150) chạy hệ điều hành MS-DOS và Macintosh của Apple là hai dòng máy tính tiêu biểu trong giai đoạn này.

IBM PC Model 5051 (Wikipedia)

Macintosh 1984(Wikipedia)

Dẫu vậy, với máy tính cá nhân người dùng vẫn đòi hỏi hơn chỉ là một thiết bị phục vụ công việc. Do đó, các trò chơi lần lượt ra đời phục vụ cho nhu cầu giải trí. Với giới hạn phần cứng hạn hẹp trong giai đoạn này, các trò chơi ra đời hầu hết thuộc nhóm text-based – một dạng như tiểu thuyết cho phép người chơi tương tác trực tiếp vào trong câu chuyện thông qua các lựa chọn xử lý tình huống xuyên suốt câu chuyện, và phần kết của câu chuyện sẽ phụ thuộc vào những quyết định của người chơi trong suốt quá trình chơi.

The Wizzard”s Castle(Wikipedia)

Sáng tạo hơn, một số nhà phát triển đã dựa trên những kí tự ASCII có sẵn, kết hợp với việc điều chỉnh tọa độ khi in kí tự đó ra trên màn hình, và từ đó những game kinh điển dần dần được ra đời cho PC mà ta gọi với tên quen thuộc như rắn săn mồi, xếp gạch, đỡ bóng, …

Xem thêm: Nghĩa Của Từ Jute Là Gì ? Định Nghĩa, Ví Dụ, Giải Thích (Từ Điển Anh

Rogue – 1980s(Wikipedia)

Đứng trên phương diện là một lập trình viên, để biến màn hình giao điện xử lý kí tự trở nên linh động và sặc sỡ thì các kỹ thuật sau cần phải được thực hiện (có thể tự xử lý được hệ điều hành hỗ trợ).

Di chuyển thiết bị vẽ tới một vị trí bất kì trên màn hìnhChọn màu vẽVẽ đối tượng đồ họa

Lặp đi lặp lại quá trình này, màn hình sẽ được lấp đầy theo như quy tắc vẽ quy định từ trước. Với mỗi hệ điều hành, các thao tác để có thể thực hiện những kĩ thuật được đề cập bên trên có thể khác nhau.

Làm việc với console

Bài đăng này đã không được cập nhật trong 3 năm

Các lập trình viên trong quá trình phát triển phần mềm không thể thiếu được công cụ debug, và trong javascript cũng không phải là ngoại lệ. Và console cũng chính là công cụ mà chúng ta nghĩ đến đầu tiên khi muốn debug 1 đoạn code trong javascript, nó đáp ứng được sự nhanh gọn đơn giản và mang lại hiệu quả cao trong quá trình làm việc.

Định nghĩa Console (CON) là gì?

Console (CON)Console (CON). Đây là nghĩa tiếng Việt của thuật ngữ Console (CON) - một thuật ngữ thuộc nhóm Technology Terms - Công nghệ thông tin.

Độ phổ biến(Factor rating): 5/10

Trong công nghệ máy tính, một giao diện điều khiển có thể có nghĩa là những thứ khác nhau tùy thuộc vào ngữ cảnh. Nó thường có nghĩa là một sự kết hợp của một màn hình hiển thị và thiết bị đầu vào, thường là một bàn phím và cặp chuột, cho phép người dùng lệnh đầu vào và nhận ra hình ảnh từ máy tính hoặc máy tính hệ thống. Nó cũng có thể tham khảo các máy tính chuyên chỉ có nghĩa là để chơi trò chơi video.

Xem thêm: Thuật ngữ công nghệ A-Z

Lập trình giao diện console: NCurses Menu

1. App căn bản

(Note: các hướng dẫn này được viết cho Linux, NCurses có thể chạy trên môi trường Windows, tuy không có khác biệt về code, nhưng các bước cài đặt thư viện cũng như biên dịch sẽ khác, nếu có thời gian mình sẽ viết thêm bài hướng dẫn dành cho Windows – MinGW)

Chào các bạn. Đây là bài viết hướng dẫn đầu tiên về lập trình giao diện console với NCurses. Trước tiên chúng ta sẽ học cách viết một ứng dụng NCurses cơ bản và sau đó sẽ tạo một menu để thêm vào app.

Sau khi đã hiểu sơ qua và cài đặt NCurses như trong bài viết mở đầu:

Lập trình giao diện console

Bạn có thể sử dụng IDE/Editor yêu thích của mình để tạo một file/project mới để bắt đầu viết code.

Các bước để viết một app sử dụng NCurses (chỉ áp dụng cho C++, nếu ứng dụng của bạn là ứng dụng viết bằng C, bạn nên tham khảo tài liệu đi kèm Ncurses hơn là những bài viết này :v):

– 1 class bạn chọn để viết App phải được thừa kế từ class NCursesApplication.

– tạo ra một biến toàn cục là instance của class bạn viết ở trên để NCurses truy cập và sử dụng.

(thư viện C++ của NCurses sẽ tự thu hồi vùng nhớ mà bạn cấp phát)

Hàm main đã được viết sẵn nên bạn chỉ cần làm 2 công việc ở trên. Nếu bạn cần thay đổi hàm main này, bạn có thể sửa file cursesmain.cc trong folder c++ (Bạn nhớ build lại lib trước khi biên dịch app của mình).

#include <cursesapp.h>
#include <cstring> // header của C++ để dùng mảng ký tự như là một string (C-String)
 
class FirstNCursesApp : public NCursesApplication {
public:
	// hàm khởi tạo của bạn gọi hàm khởi tạo cha
	// tham số boolean ý nghĩa rằng chương trình của bạn
	// có sử dụng màu hay không
	FirstNCursesApp() : NCursesApplication(true) { }
 
	// implement hàm pure-virtual của class cha
	virtual int run();
 
protected:
	// override hàm xác định độ lớn của tiêu đề
	// tương ứng với số dòng trên console bạn dùng để hiển thị tiêu đề
	virtual int titlesize() const { return 1; }
 
	// override hàm thiết lập tiêu đề
	virtual void title();
};
 
void FirstNCursesApp::title() {
	const char* const titleText = "NCurses Menu Demo";
	const int len = std::strlen(titleText);
 
	// setup background (viết tắt: bkgd)
	// titleWindow là một member có sẵn từ class cha
	// hàm addstr nhận tham số đầu tiên là hàng
	// chúng ta có 1 dòng (titlesize) nên sẽ dùng hàng đầu tiên của console
	// tham số tiếp theo là cột - căn giữa title
	// tham số cuối cùng là string lưu title
	// hàm screen_titles (class cha) trả về thiết lập màu của màn hình tiêu đề
	// noutrefresh cập nhật màn hình như những gì chúng ta cài đặt
	titleWindow->bkgd(screen_titles());
	titleWindow->addstr(0, (titleWindow->cols() - len) / 2, titleText);
	titleWindow->noutrefresh();
}

OK, tiếp theo là code hàm run(). Nhưng trước tiên hãy thử biên dịch xem app của chúng ta hiển thị như thế nào nhé. Vậy nên hàm run() mình sẽ để một vòng lặp vô tận, nếu không app của chúng ta sẽ thoát ngay khi NCurses gọi run().

Bước tiếp theo đó là tạo ra app instance:
 

int FirstNCursesApp::run() {
	while (true) {
 
	}
}
 
static FirstNCursesApp* app = new FirstNCursesApp();

Để biên dịch code này bạn cần những cài đặt sau:

– Include folder: folder include của NCurses.

– Library search folder: folder lib của NCurses.

– Linker settings: -lncurses++ và -lncurses

Mỗi IDE sẽ có cài đặt khác nhau nên mình không tiện hướng dẫn hết ở đây, thay vào đó có một ví dụ về câu lệnh biên dịch và makefile:

g++ -o menu menu.cpp -I/some_path/ncurses-6.0/include/ -L /some_path/ncurses-6.0/lib/ -lncurses++ -lncurses

Makefile:

menu: menu.cpp (xuống dòng và 1 ký tự Tab)
         g++ -o menu menu.cpp -I/some_path/ncurses-6.0/include/ -L /some_path/ncurses-6.0/lib/ -lncurses++ -lncurses

Bạn có thể gõ lệnh biên dịch lên Terminal hoặc viết makefile với nội dung như trên, sau đó gọi lệnh make để biên dịch.

2. Soft Label Key

Sau khi biên dịch xong bạn gọi chương trình từ Terminal. Chương trình đã chạy, nhưng nó không hiển thị gì trên màn hình cả. Vấn đề tiếp theo đó là Soft label key (SLK). Soft label key là những nút điều khiển, bạn có thể đọc thêm ở đây: https://en.wikipedia.org/wiki/Screen-labeled_function_keys

Chúng ta chưa thiết lập Layout cho SLK, vì sau NCurses yêu cầu điều này thì mình cũng … không biết =)) Có thể là thông thường các màn hình đều có những nút điều khiển.

Bạn thêm đoạn code sau vào phần khai báo protected của class:

// trả về bố cục của các nút điều khiển
virtual Soft_Label_Key_Set::Label_Layout useSLKs() const {
	return Soft_Label_Key_Set::PC_Style_With_Index;
}

Biên dịch lại code và gọi chương trình, bạn sẽ thấy hiển thị như sau
(Ứng dụng không có màu và có màu)

Lập trình giao diện console C++

Lập trình giao diện console C++

Các loại SLK layout: (cursslk.h)

typedef enum {
    None                = -1, // mặc định khi bạn không override hàm useSLKs()
    Three_Two_Three     = 0,
    Four_Four           = 1,
    PC_Style            = 2, // layout như hình trên nhưng không có tên phím
    PC_Style_With_Index = 3 // kiểu mình dùng ở ảnh trên
  } Label_Layout;

Kiểu Three_Two_Three và Four_Four tương ứng với bố trí nút điều khiển:
ví dụ: 4 nút – 4 nút

Lập trình giao diện console C++

3. Menu Demo

App cơ bản của chúng ta đã xong, giờ đến phần tạo Menu cho app.

Để tạo ra một menu, bạn cần thừa kế class NcursesMenu

#include <cursesm.h> // curses menu
 
class SimpleMenu : public NCursesMenu {
private:
	NCursesPanel* panel;
	NCursesMenuItem** items;
 
	static const int itemCount = 6;
 
public:
	// hàm khởi tạo cha nhận 4 tham số
	// tham số đầu tiên là số dòng menu, ít nhất là = số entry +2
	// tham số thứ 2 là số cột, là độ dài nội dung text dài nhất +3
	// "Item 6th" có 8 ký tự, thêm 3 = 11
	// quy tắc này là cách trang trí menu của NCurses
	// 2 tham số tiếp theo là số hàng và số cột mà menu bắt đầu được hiển thị
	SimpleMenu() : NCursesMenu(itemCount+2, 11, (lines()-10)/2, (cols()-10)/2),
				   panel(NULL), items(NULL)
	{
		items = new NCursesMenuItem*[itemCount+1];
 
		items[0] = new NCursesMenuItem("Item 1");
		items[1] = new NCursesMenuItem("Item 2");
		items[2] = new NCursesMenuItem("Item 3");
		items[3] = new NCursesMenuItem("Item 4");
		items[4] = new NCursesMenuItem("Item 5");
		items[5] = new NCursesMenuItem("Item 6th");
 
		// tạo ra một item mặc định để đánh dấu kết thúc menu
		items[6] = new NCursesMenuItem();
 
		// tham số boolean thứ nhất: có sử dụng frame (đóng khung) hay ko
		// tham số thứ 2: tự động xóa item
		InitMenu(items, true, true);
 
		// tạo ra một panel
		panel = new NCursesPanel();
 
		// trang trí menu theo kiểu boldframe
		// 2 tham số là tiêu đề trên và tiêu đề dưới
		// ngoài ra còn có các kiểu trang trí frame và label
		boldframe("Menu", "Demo");
 
		panel->show();
	}
};
 
int FirstNCursesApp::run() {
	SimpleMenu m;
	m();
	return 0;
}

Trong makefile hoặc câu lệnh biên dịch bạn link thêm thư viện menu và panel.
Kết quả chương trình của chúng ta sẽ hiển thị như thế này:

Lập trình giao diện console C++

Trong ví dụ này các item của chúng ta chỉ hiển thị nhưng chưa có hoạt động nào ngoài lựa chọn giữa các item, ở bài sau ta sẽ thêm các action vào menu trong NCurses.

Comments

comments