[Game Maker Adventure] Chương 007: Nhập dữ liệu – ReadLine() và Convert

Các chương trình được tạo ra để có thể tương tác với người dùng. Trong Console App, việc tương tác không thể không kể tới method Console.ReadLine() và class Convert.

Tóm tắt chương trước

Thế giới rộng lớn và nguy hiểm khiến bạn phải tìm cách sinh tồn và tìm ra sự thật về thế giới này.

Chắc chắn là như vậy!

Kiến thức chương này

  • Có thể nhập dữ liệu người dùng bằng method Console.ReadLine().
  • Console.ReadLine() return string.
  • Red Squiggly là các lỗi bắt buộc phải sửa. Green Squiggly là các lỗi ưu tiên thấp, chỉ mang tính cảnh báo.
  • Class Convert có thể đổi kiểu dữ liệu từ kiểu này sang kiểu khác miễn là nó hợp lệ.

Cốt truyện

Thế giới luôn trao đổi dữ liệu với nhau, cũng như các variable có thể sử dụng dữ liệu của nhau để tạo ra các giá trị mới.

Trong đó bao gồm cả bạn.

Việc nhập xuất dữ liệu rất quan trọng vì cuối cùng thì một chương trình được tạo ra để tương tác với người dùng.

Bạn ấn nút nhảy, nhân vật sẽ nhảy.

Bạn nhập tên và mật khẩu, bạn sẽ truy cập vào được một trang web.

Hay chỉ đơn giản bạn di chuột thì trỏ chuột trên màn hình sẽ chạy.

Nhập dữ liệu với Console.ReadLine()

Bạn cũng có thể tương tác với Console App thông qua bàn phím bằng method Console.ReadLine().

Nếu miêu tả một cách phức tạp thì Console.ReadLine() sẽ nhận dữ liệu dạng string từ người dùng. Dữ liệu này có thể sử dụng ngay hoặc được gán vào một biến khác để dùng sau này.

Nhưng bạn cũng có thể hiểu đơn giản Console.ReadLine() giống như cách chúng ta gửi tin nhắn vậy. Chương trình sẽ sử dụng tin nhắn đó để biến đổi, xử lí và có thể reply lại chúng ta.

Chẳng hạn ta có một đoạn code dưới đây:

Console.WriteLine("Hello stranger, what' your name?");
string message = Console.ReadLine();
Console.WriteLine("Hello " + message);

Khi chương trình chạy đến dòng chứa Console.ReadLine(), nó sẽ chờ người dùng nhập dữ liệu. Dữ liệu nhập vào sẽ được xác nhận nếu người đó nhấn enter (hoặc return).

Chương trình sẽ chờ người dùng nhập dữ liệu mới tiếp tục chạy.
Bạn có thể gõ tuỳ ý, nhấn enter để xác nhận.

Ngoài ra, bạn có thể sử dụng trực tiếp dữ liệu từ Console.ReadLine() mà không cần gán vào biến. Đoạn code trên có thể được viết lại như sau:

Console.WriteLine("Hello stranger, what' your name?");
Console.WriteLine("Hello " + Console.ReadLine());

Method Console.ReadLine() có thể được hiểu như một đoạn dữ liệu kiểu string. Vì thế ta có thể gán nó vào biến string khác. VD: string message = Console.ReadLine();

Ta nói: Console.ReadLine() return lại string type.

Ta không thể gán Console.ReadLine() cho một biến kiểu int, hoặc float, hoặc double được. Hành động gán như dưới đây sẽ ngay lập tức gây lỗi chương trình:

Nguyên nhân của việc lỗi này là do chúng ta đang cố gắng gán một kiểu string vào một kiểu int. Việc này trong C# là không hợp lệ (C# là một ngôn ngữ lập trình mạnh, dễ dùng nhưng nó không dễ tính.)

Cảnh báo lỗi

Khi viết dòng lệnh string message = Console.ReadLine(); Visual Studio đã green squiggly cảnh báo cho chúng ta: “chú ý, phần này có thể gây lỗi nhé“.

Ta có thể đổi sang tab warning bên dưới để xem chi tiết cảnh báo.

Warning CS8600: Converting null literal or possible null value to non-nullable type.

Cảnh báo này nghĩa là khi người dùng không gõ gì mà ấn enter luôn thì Console.ReadLine() sẽ nhận giá trị null.

Chúng ta sẽ tìm hiểu sâu hơn về null ở các chương sau. Dù không thể sửa chúng ngay lúc này nhưng hãy bắt đầu chú ý nhiều hơn tới các thông báo lỗi nhé.

  1. Red Squiggly: Các lỗi bắt buộc phải sửa.
  2. Green Squiggly: Các lỗi ưu tiên thấp. Miễn chương trình chạy được thì không cần phải xử lí hết các lỗi này.

Biến đổi dữ liệu với Convert

Trong một số trường hợp, ta cần đổi kiểu dữ liệu từ dạng A sang dạng B.

Có nhiều cách để biến đổi các kiểu dữ liệu này nhưng mình sẽ giới thiệu các bạn cách dùng class Convert.

Class Convert rất mạnh, nó có thể biến đổi hầu hết các kiểu dữ liệu: byte, short, int, long, char, float, decimal, bool, double, string…

Để sử dụng, hãy gọi class Convert, thêm dấu . để gọi ra method tương ứng và cuối cùng đưa biến vào giữa ngoặc đơn (giống như cách chúng ta gọi class Console, thêm dấu . để gọi ra method WriteLine() vậy).

Ta có thể xem các method khác của class Convert và cách dùng nó với biến target trong bảng dưới đây:

Cách gọiĐổi kiểu của biến target thành
Convert.ToInt32(target);int
Convert.ToSingle(target);float
Convert.ToString(target);string
Convert.ToDouble(target);double
Convert.ToBoolean(target);bool
Các kiểu convert hay dùng

Code thí dụ:

int yourAge;
Console.WriteLine("This application calculates how many months you have lived. Please provide your age:");
string yourAgeInput = Console.ReadLine();
yourAge = Convert.ToInt32(yourAgeInput);
Console.WriteLine("So you lived " + yourAge * 12 + " months.");

Đây là chương trình nhận vào số tuổi của bạn để tính ra số tháng bạn đã sống.

Ngoài Convert, còn rất nhiều cách biến đổi kiểu dữ liệu khác trong C# bạn có thể tuỳ ý sử dụng nếu muốn. Nhưng nếu bạn là người mới và tình cờ biết đến chúng thì hãy… quên chúng đi. Ở những chương đầu của series này, chúng ta sẽ chỉ sử dụng Convert để đổi kiểu dữ liệu.

Khi Convert, hãy chắc chắn rằng kiểu dữ liệu có thể convert được. Chẳng hạn nếu bạn nhập string yourAgeInput là “tam”, thì máy sẽ không thể convert được chúng sang int và crash chương trình.

Bonus Console.Read(), Console.ReadKey()

Nếu bạn không thể hiểu hết phần bonus này thì đừng lo. Phần này chỉ mang tính giới thiệu trước.

Bên cạnh Console.ReadLine(), người ta còn sử dụng Console.Read() và Console.ReadKey(). Ba method này khác nhau rất nhiều nhưng cơ bản thì:

  • Read() – nhận kí tự đầu tiên và return int.
  • ReadLine() – nhận string và return string.
  • ReadKey() – nhận phím đầu tiên và return ConsoleKeyInfo.

Read() và ReadLine() thì khá đơn giản, nhưng ReadKey() sẽ hơi khác một chút. Method này return ConsoleKeyInfo – đây là một struct có tác dụng xem phím nào vừa được bấm.

Thí dụ:

Console.WriteLine(Console.ReadKey().Key.ToString());

Khi chạy đoạn code này, bất kì phím nào được bấm sẽ hiển thị lên màn hình kể cả các phím function.

Quest: ?????? kì lạ

Đây là một chương quan trọng, hãy sẵn sàng cho thử thách nào!

*ọt ọttttttttt*

Bụng bạn bắt đầu réo lên những tiếng kêu thân thuộc. Phải rồi, từ hôm qua tới giờ bạn đã kịp ăn gì đâu.

Không còn cách nào khác, bạn chỉ còn cách chậm rãi đi tìm cây quả trông có vẻ ăn được.

Bạn vừa đi, vừa quan sát xung quanh, mong rằng sẽ bắt gặp một thứ gì đó ngon mắt.

+1 nấm không rõ.

+1 bó cỏ không rõ.

+4 quả mọng không rõ.

+1 nguồn nước.

Cuối cùng, bạn tìm thấy một ít thức ăn không rõ nguồn gốc và một con suối nhỏ. Dù thức ăn có thể không an toàn nhưng nước suối thì chắc chắn có thể sử dụng!

Bạn nhìn về hướng suối chảy và bắt đầu đi xuống hạ lưu.

Xét về logic thì việc xuống hạ lưu sẽ có tỉ lệ gặp khu dân cư, hoặc nếu không, thì ít nhất nguồn nước sẽ không còn là vấn đề lớn.

Đi được một đoạn, bạn bắt gặp một phế tích nhỏ.

Đây chắc chắn sẽ là một nơi để bạn có thể trú ẩn.

Bên ngoài phế tích, một ?????? đang bay là là giữa đống gạch đá.

Bạn tiến lại gần và bắt chuyện với nó…

Quest ✦✧✧✧✧

?????? đột nhiên vang lên những tiếng động kì lạ. Dường như nó đang… bị lỗi!?

Hãy viết chương trình để khôi phục cho ??????.

Điều kiện hoàn thành:

  • Viết một chương trình có thể tương tác đơn giản, nội dung theo mẫu bên dưới.
Hello stranger.
What do you think is more important, knowledge or strength?
<Your Input>
Oh, you prefer <Your Input> huh? Interesting...
If I can give you <Your Input>, how much golds would you like to offer me?
<Your Next Input>
Let's see: 0, 1, 2, 3, 4,... <Your Next Input - 1>, <Your Next Input> golds.
Gyahaha, you're an honest human. I mean... I just wanted to ask a random question. Sorry, I can't give <Your Input> for you.
It's just me lying here, a broken machine.

Với <Your Input> <Your Next Input> là nội dung nhập từ Console.ReadLine(), với <Your Next Input> có thể convert sang int.

***

Xem đáp án

Premium Content

Kể từ phần này, bạn cần đăng nhập và một lượng Point để tiếp tục xem 🙁

Chương Trước | Tổng quan | Chương Kế

Kurrwo

Công nhân👷gõ 💬 văn bản ⌨️ trò chơi 🎮 điện tử 📱 👏👏👏

Post navigation

Subscribe
Notify of
0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments