Bài giảng Nhập môn lập trình - Chương 2: Giới thiệu ngôn ngữ C# - Trần Minh Thái

.Net FramWork, các khái niệm cơ bản về ngôn ngữ C# Cấu trúc của một chương trình và cách trình bày chương trình Công cụ lập trình và các chức năng liên quan Lệnh nhập/ xuất trong C# .NET Framework Framework là một tập hợp các thư viện để hỗ trợ cho người lập trình. Mỗi Framework được tạo ra có một kiến trúc khác nhau  LTV phải tuân theo kiến trúc đó .NET Framework là thư viện tài nguyên của Microsoft, hỗ trợ cho các lập trình viên trong nhiều yêu cầu khác nhau.

pptx86 trang | Chia sẻ: candy98 | Lượt xem: 592 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Bài giảng Nhập môn lập trình - Chương 2: Giới thiệu ngôn ngữ C# - Trần Minh Thái, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
CHƯƠNG 2 GIỚI THIỆU NGÔN NGỮ C#1TRẦN MINH THÁIEmail: minhthai@huflit.edu.vnWebsite: www.minhthai.edu.vn Mục tiêuGiới thiệu .Net FramWork, các khái niệm cơ bản về ngôn ngữ C#Cấu trúc của một chương trình và cách trình bày chương trìnhGiới thiệu công cụ lập trình và các chức năng liên quanLệnh nhập/ xuất trong C#2.NET FrameworkFramework là một tập hợp các thư viện để hỗ trợ cho người lập trình.Mỗi Framework được tạo ra có một kiến trúc khác nhau  LTV phải tuân theo kiến trúc đó.NET Framework là thư viện tài nguyên của Microsoft, hỗ trợ cho các lập trình viên trong nhiều yêu cầu khác nhau.3.NET Framework4.NET Framework5.Net Framework6.NET FrameworkCác ngôn ngữ : C#, VB.Net, J#, F#, VC++Công cụ phát triển Visual StudioLớp đặc tả ngôn ngữ dùng chung (CLS)Các thư viện đê phát triển ứng dụngBộ thực thi ngôn ngữ dùng chung (CLR)7.NET FrameworkChương trình được biên dịch thành ngôn ngữ trung gian (MSIL - Microsoft Intermediate Language), sau đó chúng được CLR thực thi.Common Language Runtime - CLR, nền tảng hướng đối tượng cho phát triển ứng dụng Windows và Web mà các ngôn ngữ có thể chia sẻ sử dụng. Bộ thư viện Framework Class Library - FCL.Trần Minh Thái8.NET FrameworkCommon Language Runtime - CLR, nền tảng hướng đối tượng cho phát triển ứng dụng Windows và Web mà các ngôn ngữ có thể chia sẻ sử dụng. Bộ thư viện Framework Class Library - FCL.Trần Minh Thái9.NET FrameworkTrần Minh Thái10.NET Framework11Ngôn ngữ C#Ngôn ngữ lập trình được xây dựng dựa trên nền tảng những ngôn ngữ tương tự C (C, C++, Java) Hoạt động trên .NET FrameworkTrần Minh Thái12Ngôn ngữ C#Dựa trên phương pháp thiết kế hướng đối tượngỨng dụng : Console, WinForm, WebFormCó tính diễn đạt ngữ nghĩa caoPhân biệt chữ hoa thườngTrần Minh Thái1314Khởi Tạo ProjectB1. ChọnB2. ChọnConsole ApplicationB3. Đặt tên ProjectB4. Vị trí lưuB4. Đặt tên SolutionKhởi Tạo ProjectFile Program.cs là file mặc định chứa hàm Main của chương trình15Compile & chạy chương trìnhTrình biên dịch (compiler) sẽ biên dịch các tập tin chứa ngôn ngữ C# thường là các file .cs trong project thành một tập tin chạy chương trình .exeCó 2 cách biên dịch :Tại cửa sổ cmd, gõ : csc.exe tenfile.csNhấn Build / Compile (hoặc Build / Build Solution)  Biên dịch cả project.16Compile & chạy chương trìnhChạy chương trìnhSử dụng file tenfile.exe trong thư mục Bin\DebugHoặc click Debug\ Start (Ctrl + F5)17Từ khoá – Keywordsabstractadd*asbaseboolbreakbytecasecatchcharcheckedclassconstcontinuedecimaldefaultdelegatedodoubleelseenumeventexplicitexternfalsefinallyfixedfloatforforeachget*gotoifimplicitinintinterfaceinternalislocklongnamespacenew nullobjectoperatoroutoverrideparamspartial*privateprotectedpublicreadonlyrefremovereturnsbytesealedset*shortsizeofstackallocstaticstringstructswitchthisthrowtruetrytypeofuintulonguncheckedunsafeushortusingvalue*virtualvoidvolatilewhere*whileyield18Khởi Tạo ProjectCấu trúc một project :using System; //khai báo không gian tên sử dụngnamespace BaiTapVD{class Program //tên lớp, tên file = tên lớp{ static void Main(string[] args) { //Các lệnh viết tại đây } }}19Namespace (không gian tên)Namespace là một khái niệm được sử dụng để phân nhóm các lớp đối tượng trong .Net Framework, tránh việc trùng tên giữa các lớp đối tượngTrần Minh Thái20Namespace (không gian tên)Ví dụ:System.Drawing2D.Penvà System.Drawing3D.Penđều đề cập đến một lớp đối tượng Pen nhưng thuộc hai namespace khác nhau, do đó chúng là hai lớp đối tượng khác nhau.Trần Minh Thái21Sử dụng NamespaceKhai báo trực tiếp bằng cách ghi đầy đủ namespace. VD: System.Media.SoundPlayer spStart=new System.Media.SoundPlayer(“start.wav”);Trần Minh Thái22Sử dụng NamespaceSử dụng từ khóa using để khai báo trước namespace sẽ được tham chiếu đến.VD: using System.Media; SoundPlayer spStart = new SoundPlayer();Trần Minh Thái23Comments (ghi chú)24Trần Minh TháiKiểu CommentsÝ nghĩaVí dụDelimited commentsChú thích có thể mở rộng cho nhiều dòng mã nguồn/*comment*/Single-line commentsChú thích sử dụng cho một dòng mã nguồn//commentXML delimited commentsChú thích sử dụng cho nhiều dòng mã nguồn chuẩn của XML/**comment**/XML single-line commentsChú thích sử dụng cho một dòng mã nguồn chuẩn của XML///commentTập các ký tự thường dùngChữ cái hoa: A, B, ..., ZChữ cái thường: a, b, c, ..., zChữ số: 0, 1, ..., 9Các ký hiệu toán học: +, -, *, /, =, (, ),...Ký hiệu gạch nối: _Các ký hiệu đặc biệt như: . ,  ; [] {} ? ! \ & | % # ...Không được dùng các ký hiệu như: α, φ, Ω, π, hoặc tiếng việt có dấu: â, ă, ô25Lệnh & Khối lệnhMột câu lệnh thực hiện một chức năng nào đó (gán, xuất, nhập, ) và được kết thúc bằng dấu chấm phẩy (;)Khối lệnh gồm nhiều lệnh và được đặt trong cặp dấu ngoặc nhọn { }26Data Types (Kiểu dữ liệu - KDL)KDL là các loại dữ liệu và phạm vi giá trị của chúng trong bộ nhớ mà người lập trình sử dụng để lưu trữ.Có 2 loại : KDL dựng sẵn & KDL tự định nghĩa.27Data Types (Kiểu dữ liệu - KDL)C# cũng chia tập dữ liệu thành hai kiểu: giá trị và tham chiếuBiến kiểu giá trị được lưu trong vùng nhớ stackBiến kiểu tham chiếu được lưu trong vùng nhớ heap28KDL định sẵnSố nguyênSố thực Ký tự, logicMảng, chuỗi ký tựMột số KDL có cấu trúc khác29Số nguyênC#KíchThước(byte).NETMiền giá trịMô tảbyte1Byte[0..255]Số nguyên dương không dấusbyte1Sbyte[-128..127]Số nguyên có dấushort 2Int16[0..65.535]Số nguyên không dấuint4Int32 Từ -2.147.483.647 đến 2.147.483.646Số nguyên có dấuuint4Uint32Từ 0 đến 4.294.967.295Số nguyên không dấulong8Int64Từ -9.223.370.036.854.775.808đến 9.223.370.036.854.775.807Số nguyên có dấuulong8Uint64Từ 0 đến 0xffff ffff ffff ffffSố nguyên không dấu30Ký tự và logicC#Kích thước (byte).NETMiền giá trịMô tảbool1Booleantrue hoặc falseGiá trị logicchar2CharKý tự Unicode31Số thựcC#Kích thước (byte).NETMiền giá trịMô tảfloat4SingleTừ 3,4E-38 đến 3,4E+38Kiểu dấu chấm động, với 7 chữ số có nghĩadouble8DoubleTừ 1,7E308 đến 1,7E+308Kiểu dấu chấm động có độ chính xác gấp đôi, với 15 chữ số có nghĩadecimal8DecimalCó độ chính xác đến 28 con số, phải có hậu tố “m” hoặc “M” theo sau giá trị32String (kiểu chuỗi)Kiểu string có thể chứa nội dung không giới hạn, vì đây là kiểu dữ liệu đối tượng được chứa ở bộ nhớ heap. Khai báo: string s = “Nguyen Van A”;33Kiểu mảngMảng là một tập hợp các phần tử cùng một kiểu dữ liệu liên tiếp nhau và được truy xuất thông qua chỉ số.Chỉ số bắt đầu từ 0.34Kiểu mảngMảng một chiều []=new [Số phần tử];VD: Khai báo mảng số nguyên arr gồm 5 phần tử int [] arr = new int [5];35Kiểu mảngMảng hai chiều [,]=new [Số dòng, số cột];VD: Khai báo ma trận số nguyên mt gồm 5 dòng và 3 cột long [ ,] mt = new long [5, 3];36Enum (kiểu liệt kê)Enum là một cách thức để đặt tên cho các trị nguyên (các trị kiểu số nguyên, theo nghĩa nào đó tương tự như tập các hằng), làm cho chương trình rõ ràng, dễ hiểu hơn37Enum (kiểu liệt kê)VD1: enum Ngay {Hai, Ba, Tu, Nam, Sau, Bay, ChuNhat}; Hai = 0; Ba = 1; ; ChuNhat = 6VD2: enum Ngay {Hai = 1, Ba, Tu, Nam, Sau, Bay, ChuNhat}; Hai = 1; Ba = 2; ; ChuNhat = 738Enum (kiểu liệt kê)VD3: enum Ngay {Hai = 1, Ba, Tu, Nam, Sau=10, Bay, ChuNhat}; Hai = 1; Ba = 2; ; Sau=10; Bay=11;ChuNhat = 1239Struct (kiểu cấu trúc)Struct dùng để nhóm các dữ liệu cùng liên quan đến một đối tượng nào đó.Khai báo :struct { Danh sách các thuộc tính;}Truy xuất: .thuộc tính40Struct (kiểu cấu trúc) struct SV { public string ten; public string maso; } static void Main(string[] args) { SV a; a.ten = "Le Van Teo"; a.maso = "002"; Console.WriteLine("Ten: "+a.ten+" Ma so: "+a.maso); Console.ReadLine(); }41Identifier (định danh)Định danh là việc xác định tên: biến, hàm, hằng, Phân biệt chữ hoa thường42Identifier (định danh)Quy ước đặt tên :Sử dụng 26 chữ cái (thường/ hoa), 10 chữ sốDấu nối ( _ )Không dùng chữ số ở đầuKhông trùng với từ khoá43BiếnMột biến đại diện cho một vùng nhớ hay tập các vùng nhớ trên bộ nhớ chính của máy tính. Tên biến được dùng để tham khảo đến những vùng nhớ nàyBiến để lưu trữ các giá trị do người dùng nhập vào hoặc các giá trị tạm thời trong quá trình tính toánMỗi biến sẽ có tên và kiểu dữ liệu tương ứng. Kiểu dữ liệu của biến xác định những giá trị kiểu nào có thể được lưu trong biến (ví dụ số hay chữ)PHẢI khai báo BiẾN trước khi sử dụng44Biến & khai báo biếnKhai báo: tên biến;VD: int x; int a, b;45Biến & khai báo biếnVD: Khai báo và khởi tạo: int x = 5; int y = x; float z = 3.7; float k = (float) x/2;46Toán tử số họcKý hiệuÝ nghĩaGhi chú+Cộng- Trừ*Nhân/ChiaĐối với số chia & bị chia là nguyên thì cho kết quả là phần nguyên%Chia lấy phần dưChỉ áp dụng cho số chia & bị chia là số nguyên++x; x++Tăng x 1 đơn vị--x; x--Giảm x 1 đơn vị47Ký hiệu so sánh và phép toán bitKý hiệuÝ nghĩa>Lớn hơn>=Lớn hơn hoặc bằng>Dịch phải1Từ trái qua phải! ~ ++ -- - + * & sizeof2Từ phải qua trái* / %3Từ trái qua phải+ -4Từ trái qua phải>5Từ trái qua phải= >6Từ trái qua phải== !=7Từ trái qua phải&8Từ trái qua phải|9Từ trái qua phải^10Từ trái qua phải&&11Từ trái qua phải||12Từ trái qua phải? :13Từ phải qua trái= += -= *= /= %=14Từ phải qua trái49Ví dụ:int x = 5, y = 11;int z = ++x + y++;Kết quả: x=6; y=12; z=17Cho biết kết quả của đoạn chương trình sau:int a, b;b=a++ + ++a + --a;Với a = 2 Kết quả: Với a = 9 Kết quả: 50Sttxyz15112++xx=63z=x+yz=6+11=174y++y=12Cho biết kết quả của đoạn chương trình sau:int a, b;b=a%2 + a/2 + --a;Với a = 17 Kết quả: a = ?; b = ?Với a = 3 Kết quả: a = ?; b = ?----------------------------------------int a, b;b=a/3 + a--;Với a = 8 Kết quả: a = ?; b = ? Với a =21 Kết quả: a = ?; b = ? 51Toán tử điều kiện(ĐK)?:Ví dụ:int n;(n%2==0)? n ++ : n --; nếu n = 10 thì giá trị n = 11 nếu n = 21 thì giá trị n = 20Cho biết kết quả đoạn chương trình sau:int k;m = (k%3==0)?k++: k--;Với k =10 Kết quả: m = ? Với k =15 Kết quả: m = ? 52n = 10  (n%2==0): đúngthực hiện lệnh n++ = 10++ = 11n = 21  (n%2==0): sai thực hiện lệnh n-- = 21-- = 20Hàm xuất – System. Console Write (Xuất ra màn hình)WriteLine (Xuất xong xuống dòng)Xuất không định dạng int a = 5; double x = 7.534; string s = "ABC"; Console.WriteLine("a = " +a); Console.WriteLine("x = "+x+"; s = "+s);53Hàm xuất – System. Console Xuất có định dạng thập phânfloat x = 7.53489F;double y = 5.6482;Console.WriteLine("x = {0: 0.0000}; y = {1: 0.00} ", x, y);Trần Minh Thái54Xuất ký tự đặc biệtKý tự Ý nghĩa \’ Dấu nháy đơn \” Dấu nháy đôi \\ Dấu chéo ngược “\” \0 Null \a Alert : Tiếng bip\b Lùi về trước \f Form feed \n Xuống dòng \r Về đầu dòng \t Tab ngang Trần Minh Thái55Bài tập áp dụngViết chương trình in ra màn hình thông tin cá nhân theo mẫu sau: Ho ten: Lop: Thong tin lien lac: Dia chi: So dien thoai:56Hàm nhập – System. Consolestring s;int n;s = Console.ReadLine();n = int.Parse(s);Hoặcint n;n = int.Parse(Console.ReadLine());Trần Minh Thái57Hàm nhập – System. ConsoleMẫu chung: Biến;Biến = .Parse(Console.ReadLine());Hoặc Biến;Biến = Convert.To(Console.ReadLine());Trần Minh Thái58VD Viết chương trình nhập vào số nguyên và in ra màn hình số vừa nhậpint n;n = int.Parse(Console.ReadLine());Console.WriteLine(“So ban vua nhap la: “ + n);59Bài tập áp dụngNhập vào giờ phút và giây, đổi ra giây và xuất kết quả ra màn hình.Nhập vào 3 số nguyên a, b và c, tính giá trị trung bình cộng của 3 số trên và xuất kết quả ra màn hình.60Thao tác trên ConsoleTrần Minh Thái61Di chuyển dấu nháyConsole.SetCursorPosition(cột, dòng);VD: Xuất chuỗi Hello vị trí dòng 20 và cột 10 Console.SetCursorPosition(10, 20); Console.Write(“Hello”);Trần Minh Thái62Lấy số ngẫu nhiênSử dụng lớp RandomPhương thứcMiền giá trị phát sinhNext()[02,147,483,646]Next(max)[0max -1]Next(min, max)[min..max -1]NextDouble()Số thực từ 0.0 đến 1.0Trần Minh Thái63int songaunhien;double sothuc;Random rd = new Random();songaunhien = rd.Next();Console.WriteLine(songaunhien);songaunhien = rd.Next(100);Console.WriteLine(songaunhien);songaunhien = rd.Next(10, 100);Console.WriteLine(songaunhien);sothuc = rd.NextDouble();Console.WriteLine(sothuc);Trần Minh Thái64Lấy ngày giờ hệ thốngSử dụng lớp DateTime DateTime d = DateTime.NowThuộc tínhÝ nghĩaint iNg = d.Day;Lấy ngàyint iTh = d.Month;Lấy thángint iNm = d.Year;Lấy nămint iGio = d.Hour; Lấy giờint iPhut = d.Minute;Lấy phútint iGiay = d.Second;Lấy giâyint iMGiay = d.Millisecond;Lấy phần ngàn của giâyTrần Minh Thái65Xác định phím nhấn trong ConsoleConsoleKeyInfo k = Console.ReadKey() Nếu không muốn hiển thị phím được nhấn thì truyền true vào tham số phương thức ReadKey:ConsoleKeyInfo k = Console.ReadKey(true)Trần Minh Thái66Xác định phím nhấn trong ConsoleCấu trúc ConsoleKeyInfoThuộc tính Key: Chứa tên phím được nhấn. Xác định bằng cách so giá trị với các phím trong ConsoleKeyThuộc tính Modifiers: Cho biết phím Ctrl, Shift hoặc Alt có được nhấn kèmTrần Minh Thái67Xác định phím nhấn trong ConsoleXác định phím Ctrl, Alt hay Shift được nhấn bằng cách dùng phép toán AND (&) thuộc tính Modifiers với :ConsoleModifiers.CtrlConsoleModifiers.AltConsonleModifiers.ShiftTrần Minh Thái68ConsoleKeyInfo k;k = Console.ReadKey(true);switch(k.Key){ case ConsoleKey.A: if (k.Modifiers!=0 && (k.Modifiers&ConsoleModifiers.Shift)!=0) Console.Write(“Ban nhan phim Shift + A”); else Console.Write(“Ban nhan phim A”); break; case ConsoleKey.UpArrow: Console.Write(“Ban nhan phim mui ten huong len”); break; default: Console.Write(“Ban nhan phim khac”);}69VD Kiểm tra xem người dùng nhấn phím A, Shift + A hoặc phím up arrowKiểm tra phím có nhấn hay không?Có nhấn phím: Console.KeyAvailable = trueKhông nhấn phím: Console.KeyAvailable = falseTrần Minh Thái70while (!Console.KeyAvailable) { DateTime d = DateTime.Now; Console.Write("{0:00}:{1:00}:{2:00}", d.Hour, d.Minute, d.Second); Thread.Sleep(1000); //using System.Threading; Console.Clear(); }Hiển thị giờ hệ thống cho đến khi nhấn phím bất kỳTrần Minh Thái71Thiết lập màuMàu nền của chữ Console.BackgroundColor = hằng số màu;VD: Console.BackgroundColor = ConsoleColor.Green;Màu chữ Console.ForegroundColor = hằng số màu;VD: Console.ForegroundColor = ConsoleColor.Red;Xóa nội dung cửa sổ console: Console.Clear();Trần Minh Thái72Hằng số màuCác hằng số màuConsoleColor.BlackConsoleColor.DarkRedConsoleColor.BlueConsoleColor.DarkYellowConsoleColor.CyanConsoleColor.GrayConsoleColor.DarkBlueConsoleColor.GreenConsoleColor.DarkCyanConsoleColor.MagentaConsoleColor.DarkGrayConsoleColor.RedConsoleColor.DarkGreenConsoleColor.WhiteConsoleColor.DarkMagentaConsoleColor.Yellow 73Ẩn hiện dấu nháyẨn dấu nháy Console.CursorVisible = false; Hiện dấu nháy Console.CursorVisible = true;VD: Hiển thị giờ phút giây trên màn hình với màu nền là màu xanh và màu chữ là đỏTrần Minh Thái74Console.CursorVisible = false;ConsoleColor mauchu = Console.ForegroundColor;ConsoleColor maunen = Console.BackgroundColor; Console.BackgroundColor = ConsoleColor.Green;while (!Console.KeyAvailable){ Console.ForegroundColor = ConsoleColor.Red; DateTime d = DateTime.Now; Console.SetCursorPosition(5, 5); Console.Write("{0:00}:{1:00}:{2:00}", d.Hour, d.Minute, d.Second); Thread.Sleep(1000); //using System.Threading; Console.ForegroundColor = Console.BackgroundColor; Console.SetCursorPosition(5, 5); Console.Write("{0:00}:{1:00}:{2:00}", d.Hour, d.Minute, d.Second); }Trần Minh Thái75Qui tắc đặt tênDùng để đặt tên biến, tên hằng, tên hàm, Bắt đầu bằng một ký tự.Các ký tự trong tên biến chỉ có thể là các ký tự chữ, số hoặc dấu gạch dưới (_)Không được trùng với các từ khoá.Không được trùng với phạm vi khai báo.Tên dễ hiểu, súc tích và gợi nhớ. Phân biệt chữ hoa và thường76Các định danh nào sau đây là không hợp lệ? MainTinh TongTinh-TongTinh_Tongx_Mu_2 2_Mu_2using class Tien$ default yahoo.com77Khai báo biếnCú pháp tênbiến;Ví dụ: int a; //Khai báo biến để lưu số nguyên tên afloat c; //Khai báo biến để lưu số thực tên cKhai báo nhiều biến cùng kiểu tênbiến1, tênbiến2, tênbiến3; Ví dụ: int a, x, y;78Khai báo và khởi gán giá trị ban đầu cho biến tênbiến = giá trị;Ví dụ: int a = 5; float b = 5.4, c = 9.2; char ch = ‘n’;79Các loại hằng sốHằng số: Đó là các giá trị xác định, một hằng số có thể là nguyên (có kiểu dữ liệu int, hay long int) hay thực (có kiểu dữ liệu là float, double, long double)Hằng ký tự: Được đặt trong dấu nháy đơn. Ví dụ: 'A', 'a' tương ứng với giá trị nguyên 65, 97 trong bảng mã ASCIIHằng chuỗi: Là tập hợp các ký tự được đặt trong cặp dấu nháy kép " ". Ví dụ: “Lap trinh C#”80Cách trình bày chương trìnhMỗi lệnh nằm trên một dòng. Cuối dòng lệnh PHẢI có dấu chấm phẩy (;)Lệnh quá dài có thể được viết thành nhiều dòng sao cho mỗi lệnh phải được quan sát trọn vẹn trong pham vi cửa sổ lệnh81Cách trình bày chương trình (tt)Không nên đặt nhiều lệnh trên cùng một dòng, ngay cả các khai báo biến, nếu các biến có khác kiểu cũng nên đặt trên các dòng khác nhau.Có các chú thích, ghi chú đầy đủChương trình phân cấp các khối lệnh con theo từng cột82Các lỗi thường gặp khi viết chương trìnhKHÔNG khai báo các biến sử dụng trong chương trìnhLưu một giá trị vào một biến nhưng KHÔNG cùng kiểu dữ liệu với biếnSử dụng biến trong một biểu thức khi CHƯA có giá trị83Các lỗi thường gặp khi viết chương trìnhDùng phép chia KHÔNG ép kiểu cho số nguyên Ví dụ: float kq = 3.2 + 2/3 + 1.5; thì kq sẽ bằng 4.7 thay vì float kq = 3.2 + (float)2/3 + 1.5; thì kq sẽ bằng 5.3666666666666784Bài tập về nhà85Viết chương trình cho phép nhập vào một số đo nhiệt độ theo độ Fahrenheit và xuất ra nhiệt độ tương đương của nó theo độ Celsius, sử dụng công thức chuyển đổi:Viết chương trình nhập vào 3 số nguyên a, b và c, cho biết 3 số vừa nhập có thứ tự tăng dần (a<b<c) không? Xuất kết quảQ&A86
Tài liệu liên quan