Một số thuật toán cơ bản xung quanh số nguyên tố – Csharp

Giới thiệu

Trong nội dung bài này, chúng ta cùng nhau tìm hiểu một số kiến thức cơ bản xung quanh số nguyên tố.

Một số tự nhiên p (p > 1) là số nguyên tố nếu p có đúng 02 ước số là 1 và p.

Ví dụ các số nguyên tố: 2, 3, 5, 7, 11, 13, 17, 19, 23, …

Chúng ta cùng nhau thực hiện một số giải thuật cơ bản bằng ngôn ngữ Csharp để giải quyết các bài toán con sau:

  • Kiểm tra xem một số tự nhiên n có phải là số nguyên tố hay không.
  • Liệt kê các số nguyên tố nằm trong phạm vi [1, n].

Kiểm tra tính nguyên tố

Giải thuật thứ nhất

Ý tưởng giải thuật

Chúng ta kiểm tra xem có tồn tại một số nguyên k (2 ≤ k ≤ n – 1) mà k là ước của n (n chia hết cho k) thì n không phải là số nguyên tố, ngược lại n là số nguyên tố.

Trên thực tế ta chỉ cần kiểm tra k từ 2 đến √n là được.

Bước 1.

Chúng ta tạo một Console Project trong MonoDevelop và đặt tên là CsharpAlgorithmBasicProject.

Mặc định thì class Program.cs với MainClass và phương thức Main() được tạo ra.

Bước 2.

Chúng ta tạo class SoNguyenTo.cs và điều chỉnh namespace Algorithm.

Chúng ta tiếp tục tạo phương thức KiemTraSNTFirst() với:

  • Tham số cho phương thức này là một số tự nhiên n.
  • Kiểu dữ liệu trả về là bool. Phương thức trả về kết quả: (i) true nếu n là số nguyên tố; (ii) false nếu ngược lại.

Bước 3.

Chúng ta thực hiện giải thuật bằng ngôn ngữ Csharp như sau:

Những kỹ thuật lập trình cần chú ý:

  • Phương thức để tính căn bậc 2 của một số tự nhiên n là Math.Sqrt().
  • Phương thức để lấy phần nguyên của một số thập phân là Math.Round().
  • Thư viện Math định nghĩa các phương thức dùng tính toán các biểu thức toán học cơ bản. Các phương thức này đều là tĩnh nên được gọi trực tiếp bằng cú pháp Math.phương_thức().

Bước 4.

Chúng ta thực hiện thử nghiệm phương thức KiemTraSNTFirst() trong class Program.cs như sau:

Bước 5.

Chúng ta thực thi toàn bộ project để kiểm tra kết quả thử nghiệm:

Giải thuật thứ hai

Ý tưởng giải thuật

Chúng ta sẽ chỉ kiểm tra các số k có tính chất giống với một trong hai tính chất cơ bản sau của số nguyên tố:

  • Trừ số 2 và các số nguyên tố là số lẻ.
  • Trừ số 2, 3, các số nguyên tố có dạng 6k ± 1 (vì số có dạng 6k ± 2 thì chia hết cho 2, số có dạng 6k ± 3 thì chia hết cho 3).

Bước 1.

Chúng ta thực hiện giải thuật bằng ngôn ngữ Csharp như sau:

Bước 2.

Chúng ta thực hiện thử nghiệm phương thức KiemTraSNTSecond() trong class Program.cs như sau:

Bước 3.

Chúng ta thực thi toàn bộ project để kiểm tra kết quả thử nghiệm:

Liệt kê các số nguyên tố trong đoạn [1, N]

Giải thuật thứ nhất

Ý tưởng giải thuật

Chúng ta lần lượt xem xét các số m trong đoạn [1, n], rồi kiểm tra tính nguyên tố của m.

Bước 1.

Chúng ta thực hiện giải thuật bằng ngôn ngữ Csharp như sau:

Những kỹ thuật lập trình cần chú ý:

  • Csharp cung cấp cho chúng ta một số kiểu dữ liệu lưu trữ tập hợp các phần tử bên cạnh kiểu dữ liệu mảng. Chúng ta thường sử dụng một số dạng sau: (i) List để lưu trữ không giới hạn các phần tử có thể trùng nhau; (ii) HashSet để lưu trữ không giới hạn các phần tử không trùng nhau; (ii) Dictionary để lưu trữ không giới hạn các phần tử theo từng cặp <từ_khóa, giá_trị>. Chúng ta sẽ dần tìm hiểu cụ thể hơn trong những bài tiếp theo.
  • Csharp cung cấp một phương pháp để xác định kiểu dữ liệu cho toàn bộ các phần tử trong danh sách: định nghĩa ngay từ ban đầu kiểu dữ liệu trong cặp dấu <>. Ví dụ ở đây là List<int>.
  • Với tham số là một biến riêng lẻ, giá trị của tham số sẽ không bị thay đổi sau khi thực hiện phương thức.
  • Với tham số là một danh sách, các phần tử của danh sách có thể bị thay đổi sau khi thực hiện phương thức.

Bước 2.

Chúng ta thực hiện thử nghiệm phương thức LietKeSNTFirst() trong class Program.cs như sau:

Bước 3.

Chúng ta thực thi toàn bộ project để kiểm tra kết quả thử nghiệm:

Giải thuật thứ hai

Ý tưởng giải thuật

Chúng ta áp dụng sàng Eratosthenes để tìm các số nguyên tố nhỏ hơn hoặc bằng số tự nhiên n:

  • Bước 1: Tạo 1 danh sách các số tự nhiên liên tiếp từ 2 đến n: (2, 3, 4,…, n).
  • Bước 2: Giả sử tất cả các số trong danh sách đều là số nguyên tố. Trong đó, p = 2 là số nguyên tố đầu tiên.
  • Bước 3: Tất cả các bội số của p: 2p, 3p, 4p,… sẽ bị đánh dấu vì không phải là số nguyên tố.
  • Bước 4: Tìm các số còn lại trong danh sách mà chưa bị đánh dấu và phải lớn hơn p. Nếu không còn số nào, dừng tìm kiếm. Ngược lại, gán cho p giá trị bằng số nguyên tố tiếp theo và quay lại bước 3.

Khi giải thuật kết thúc, tất các số chưa bị đánh dấu trong danh sách là các số nguyên tố cần tìm.

Bước 1.

Chúng ta thực hiện giải thuật bằng ngôn ngữ Csharp như sau:

Bước 2.

Chúng ta thực hiện thử nghiệm phương thức LietKeSNTSecond() trong class Program.cs như sau:

Bước 3.

Chúng ta thực thi toàn bộ project để kiểm tra kết quả thử nghiệm:

Tổng kết

Trong bài này, chúng ta đã cùng nhau tìm hiểu một số giải thuật cơ bản xung quanh số nguyên tố và thực hiện bằng ngôn ngữ Csharp.

Hy vọng rằng chúng ta có thể áp dụng phù hợp những kỹ thuật và chức năng này cho những bài tiếp theo.

Học kỹ thuật lập trình C# cơ bản qua các ví dụ – Phần 2 – Xây dựng phương thức và Debug trong MonoDevelop

Giới thiệu

Tiếp theo nội dung của bài trước, trong bài này chúng ta cùng nhau tìm hiểu một số kỹ thuật lập trình cơ bản trong C# đồng thời tìm hiểu một số chức năng cần thiết trong MonoDevelop.

Chúng ta thực hiện tiếp Yêu cầu 2 và Yêu cầu 3 của bài toán cơ bản thông qua những kỹ thuật về lập trình:

  • Câu lệnh điều khiển và rẽ nhánh.
  • Các toán tử cơ bản.
  • Định nghĩa và thực thi các phương thức.

Chúng ta cũng tìm hiểu phương pháp debug trong MonoDevelop để kiểm tra từng câu lệnh cũng như bắt lỗi.

Những kỹ thuật được trình bày sẽ mang tính phổ quát và độc lập ngôn ngữ lập trình. Điều đó có nghĩa rằng chúng ta có thể áp dụng ý tưởng từ các kỹ thuật này khi tìm hiểu các ngôn ngữ khác như PHP / Java / Python.

Xây dựng phương thức trong C#

Một phương thức trong C# là một khối các câu lệnh có tên và có thể được thực thi bằng cách gọi từ một nơi khác trong chương trình.

Chú ý rằng một phương thức phải được định nghĩa bên trong một class. Điều này sẽ được thảo luận kỹ hơn trong các bài tiếp theo về lập trình hướng đối tượng.

Cấu trúc cú pháp của một phương thức như sau:

phạm_vi_truy_cập [static] kiểu_dữ_liệu_trả_về tên_phương_thức (danh_sách_tham_số) {
  // Thực hiện công việc
}

Chúng ta có hai dạng phương thức chính:

  • Dạng phương thức không trả về kết quả.
  • Dạng phương thức có trả về kết quả.

Xây dựng phương thức không trả về kết quả

Bước 1.

Chúng ta thực hiện việc tạo một Console Project mới trong MonoDevelop.

Màn hình giao diện MonoDevelop hiển thị nội dung mặc của class MainClass.cs hiện ra.

Bước 2.

Chúng ta lựa chọn tạo class mới bằng cách nhấn chuột phải vào tên của project trong phân vùng màn hình bên trái.

Chúng ta lựa chọn chức năng Add → New File …

Bước 3.

Màn hình New File hiện ra.

Chúng ta lựa chọn mục General trong phân vùng màn hình bên trái.

Chúng ta lựa chọn chức năng Empty Class trong phân vùng màn hình ở giữa.

Chúng ta nhập thông tin như sau:

Name: BaiCoBan

Chú ý rằng, theo quy định trong C# thì chữ cái đầu của file phải được viết hoa.

Chúng ta lựa chọn nút New để thực hiện.

Bước 4.

Hệ thống thực hiện việc tạo mới class BaiCoBan.cs.

Chúng ta điều chỉnh thông tin thứ nhất như sau:

namespace BaiTap

Về cơ bản thì namespace trong C# có ý nghĩa tương tự như package trong Java. Nội dung về namespaceclass sẽ được thảo luận sâu hơn trong các bài tiếp theo về lập trình hướng đối tượng.

Chúng ta tiếp tục tạo phương thức:

public void TinhTong() {}

Những điểm cần chú ý ở đây:

  • Theo quy định trong C# thì chữ cái đầu của phương thức phải được viết hoa.
  • Về nguyên tắc chung khi viết mã nguồn C#, cặp dấu {} nên để bên dưới phần định nghĩa phương thức. Không giống như Java là dấu { để ngay bên phải phần định nghĩa phương thức.
  • Từ khóa thứ nhất cho biết phạm vi được phép truy xuất đến phương thức này. Ở đây chúng ta sử dụng từ khóa public. Từ khóa này cho biết phạm vi được truy xuất đến phương thức này là trên toàn bộ project. Điều này sẽ được thảo luận kỹ hơn trong các bài tiếp theo về lập trình hướng đối tượng.
  • Từ khóa thứ hai cho biết kiểu dữ liệu của kết quả được trả về sau khi thực thi phương thức. Ở đây chúng ta sử dụng từ khóa void. Từ khóa này cho biết phương thức này không trả về kết quả mà chỉ thực hiện các tác vụ bên trong.

Bước 5.

Nội dung đầu tiên bên trong phương thức TinhTong() như sau:

Bước 6.

Nội dung thứ hai bên trong phương thức TinhTong() như sau:

Bước 7.

Nội dung thứ ba bên trong phương thức TinhTong() như sau:

Ở đây chúng ta có một số điểm cần chú ý:

  1. Thứ nhất, câu lệnh điều kiện và rẽ nhánh.

Câu lệnh điều kiện thứ nhất là if có cấu trúc cú pháp như sau:

if (điều_kiện_1)
{
  // Thực thi công việc nếu điều_kiện_1 là đúng
}
else if (điều_kiện_2)
{
  // Thực thi công việc nếu điều_kiện_2 là đúng
}
else
{
  // Thực thi công việc nếu cả điều_kiện_1 và điều_kiện_2 đều sai
}

Chú ý rằng tùy trường hợp chúng ta mới cần đến rẽ nhánh else if hoặc else.

Câu lệnh điều khiển thứ hai là switch có cấu trúc cú pháp như sau:

switch(biểu_thức)
{
  case giá_trị_1:
    // thực thi công việc nếu giá trị của biểu_thức trùng với giá_trị_1
    break;
  case giá_trị_2:
    // thực thi công việc nếu giá trị của biểu_thức trùng với giá_trị_2
    break;
  default:
    // thực thi công việc nếu giá trị của biểu_thức khác với các giá trị bên trên
}

Chúng ta có một số chú ý ở đây:

  • Từ khóa break thực hiện thoát khỏi một đoạn chương trình bên trong cặp {} hoặc một vòng lặp.
  • Từ khóa default được sử dụng tùy trường hợp cần thiết.
  1. Thứ hai, một số toán tử cơ bản.

Chúng ta có thể tham khảo một số toán tử cơ bản trong C# như sau:

  • Toán tử +. Thực hiện phép cộng: x + y.
  • Toán tử . Thực hiện phép trừ: x – y.
  • Toán tử *. Thực hiện phép nhân: x * y.
  • Toán tử /. Thực hiện phép chia: x / y.
  • Toán tử %. Thực hiện phép chia lấy số dư: x % y.
  • Toán tử ++. Thực hiện phép cộng thêm 1 vào số: x ++.
  • Toán tử --. Thực hiện phép trừ đi 1 vào số: x --.

Bước 8.

Nội dung thứ tư bên trong phương thức TinhTong() như sau:

Bước 9.

Chúng ta thực thi phương thức TinhTong() trong class MainClass.cs như sau:

Xây dựng phương thức có trả về kết quả

Bước 1.

Đối với phương thức TinhTong() có trả về kết quả, chúng ta có một số chú ý như sau:

  • Chúng ta thay thế từ khóa void bằng kiểu dữ liệu của kết quả được trả về. Ở đây do chúng ta thực hiện tính tổng các số tự nhiên nên kiểu dữ liệu của kết quả được trả về là int.
  • Chúng ta có thể cung cấp tham số cho phương thức này. Ở đây chúng ta cung cấp 02 tham số là số lượng phần tử n và mảng int[] tapHop để thực hiện việc tính tổng các số tự nhiên.
  • Do là có trả về kết quả nên ở câu lệnh cuối chúng ta sử dụng từ khóa return. Ở đây chúng ta thực hiện return tong.

Bước 2.

Trong phương thức main() của class MainClass.cs, chúng ta thực hiện một số nội dung trước khi thực thi phương thức TinhTong().

Chúng ta chú ý rằng nên định nghĩa một biến để lưu giá trị được trả về của phương thức TinhTong().

Bước 3.

Chúng ta thực thi toàn bộ project để thử nghiệm những đoạn mã nguồn C# được xây dựng bên trên:

Thực hiện Debug để kiểm tra các dòng lệnh và bắt lỗi trong MonoDevelop

Bước 1.

Chúng ta để con trỏ chuột tại dòng lệnh muốn bắt đầu debug.

Chúng ta lựa chọn chức năng Run → New Breakpoint … trên thanh Toolbars.

Chúng ta cũng nhận thấy trên menu Run có những chức năng cơ bản để debug:

  • Chức năng Step Into với phím F11. Thực hiện lần lượt chuyển đến phương thức gặp phải tại dòng lệnh đang được debug.
  • Chức năng Step Over với phím F10. Thực thi dòng lệnh hiện tại và chuyển tiếp đến dòng lệnh tiếp theo bên dưới.

Bước 2.

Màn hình Create a Breakpoint hiện ra.

Chúng ta giữ nguyên các thông tin mặc định.

Chúng ta lựa chọn nút Create để thực hiện.

Bước 3.

Chúng ta nhận thấy xuất hiện một chấm nhỏ màu đỏ bên trái và dòng lệnh đặt con trỏ chuột đã được tô đậm màu hồng.

Bước 4.

Chúng ta lựa chọn nút mũi tên ở góc trái trên thanh Toolbars để thực hiện debug.

Project sẽ được thực thi cho đến dòng lệnh được đặt dấu chấm đỏ debug.

Bước 5.

Màn hình giao diện chính cho tác vụ debug.

Bước 6.

Chúng ta thực hiện chức năng Step Over với phím F10 tại một số dòng lệnh liên tiếp.

Chúng ta thử dừng lại tại dòng lệnh:

Console.WriteLine(tapHop[i] + “ ”);

Chúng ta chú ý tab Locals trong phần màn hình bên dưới.

Giá trị của các biến được định nghĩa trước dòng lệnh hiện tại đã được hiển thị chi tiết.

Tổng kết

Trong bài này, chúng ta đã cùng nhau tìm hiểu một số kỹ thuật lập trình cơ bản trong C# đồng thời tìm hiểu một số chức năng cần thiết trong MonoDevelop.

Hy vọng rằng chúng ta có thể áp dụng phù hợp những kỹ thuật và chức năng này cho những bài tiếp theo.

Học kỹ thuật lập trình Csharp cơ bản qua các ví dụ – Phần 1

Giới thiệu

Trong chuỗi các bài học về kỹ thuật lập trình Csharp cơ bản qua các ví dụ, chúng ta sẽ cùng nhau tìm hiểu những kỹ thuật lập trình cơ bản nhất mà có thể áp dụng ngay để xây dựng các chương trình ứng dụng thực tế.

Những kỹ thuật được trình bày sẽ mang tính phổ quát và độc lập ngôn ngữ lập trình. Điều đó có nghĩa rằng chúng ta có thể áp dụng các kỹ thuật này đối với các ngôn ngữ khác như PHP / Java / Python.

Đề bài

  • Yêu cầu 1: Thiết lập một tập hợp gồm một số lượng nhất định các số tự nhiên ngẫu nhiên.
  • Yêu cầu 2: Tính tổng các số chẵn trong tập hợp này.
  • Yêu cầu 3: Hiển thị các số này và tổng ra màn hình Console.

Phân tích và lập trình Yêu cầu 1

Phân tích

Để thực hiện Yêu cầu 1, chúng ta xem xét một số tác vụ nhỏ sau:

  • Tác vụ 1. Xác định một số lượng cố định.
  • Tác vụ 2. Thiết lập một tập hợp với số lượng phần tử được xác định bên trên.
  • Tác vụ 3. Xác định giá trị số tự nhiên cho từng phần tử.

Như vậy chúng ta sẽ cùng tìm hiểu những kỹ thuật lập trình sau để thực hiện lần lượt các tác vụ trên:

  • Kỹ thuật 1. Các kiểu dữ liệu số nguyên cơ bản trong Csharp.
  • Kỹ thuật 2. Khai báo biến và gán giá trị.
  • Kỹ thuật 3. Kiểu dữ liệu về tập hợp: mảng.
  • Kỹ thuật 4. Sử dụng thư viện toán học cơ bản trong dotNET Core SDK.
  • Kỹ thuật 5. Kỹ thuật thực hiện vòng lặp để duyệt các phần tử trong tập hợp.

Lập trình với ngôn ngữ Csharp

Thực hiện Tác vụ 1 – Xác định một số lượng cố định

Chúng ta có thể thực hiện Tác vụ 1 với chuỗi lệnh sau:

int n = 10;

Những điểm cơ bản cần chú ý với chuỗi lệnh trên:

  1. Thứ nhất, cú pháp cho việc định nghĩa một biến và gán giá trị.

Theo quy định trong Csharp, tất cả các biến phải được định nghĩa trước khi có thể được sử dụng.

Cú pháp cơ bản cho việc định nghĩa một biến như sau:

kiểu_dữ_liệu tên_biến [ = giá_trị ][, tên_biến [= giá_trị ] …];

  1. Thứ hai, kiểu dữ liệu.

Theo Yêu cầu 1, số lượng phần tử của một tập hợp phải là một số tự nhiên.

Csharp cung cấp cho chúng ta một số kiểu dữ liệu số tự nhiên tương ứng với phạm vi khác nhau:

  • Kiểu dữ liệu byte. Đây là kiểu dữ liệu không dấu 8-bit có phạm vi số từ 0 đến 255.
  • Kiểu dữ liệu sbyte. Đây là kiểu dữ liệu có dấu 8-bit có phạm vi số từ -128 đến 127.
  • Kiểu dữ liệu ushort. Đây là kiểu dữ liệu không dấu 16-bit có phạm vi số từ 0 đến 65,535.
  • Kiểu dữ liệu short. Đây là kiểu dữ liệu có dấu 16-bit có phạm vi số từ –32,768 đến 32,767.
  • Kiểu dữ liệu int. Đây là kiểu dữ liệu có dấu 32-bit có phạm vi số từ –2,147,483,648 đến 2,147,483,647.
  • Kiểu dữ liệu uint. Đây là kiểu dữ liệu không dấu 32-bit có phạm vi số từ 0 đến 4,294,967,295.
  • Kiểu dữ liệu long. Đây là kiểu dữ liệu có dấu 64-bit có phạm vi số rất lớn so với kiểu int.
  • Kiểu dữ liệu ulong. Đây là kiểu dữ liệu không dấu 64-bit có phạm vi số rất lớn so với kiểu uint.

Trong các chương trình ứng dụng thông thường, chúng ta chỉ cần sử dụng kiểu dữ liệu int là đủ.

  1. Thứ ba, gán giá trị cho biến.

Chúng ta có thể gán giá trị cho biến ngay khi định nghĩa giống như chuỗi lệnh trên.

Chúng ta cũng có thể định nghĩa biến trước rồi gán giá trị sau:

int n;
n = 10;

Theo nguyên tắc chung, chúng ta nên đặt tên biến có một ý nghĩa cụ thể phù hợp mục tiêu sử dụng.

Tên của biến có thể bao gồm nhiều ký tự viết liền nhau và nên bắt đầu bằng một ký tự in thường.

Ví dụ với Yêu cầu 1 trong bài này, chúng ta có thể đặt tên biến là n hoặc soPhanTu.

  1. Thứ tư, xác định số lượng.

Theo Yêu cầu 1, chúng ta có thể xác định trước một số lượng phần tử.

Ví dụ ở đây là n = 10.

Chúng ta cũng có thể xác định một cách ngẫu nhiên một số lượng trong phạm vi nào đó.

Chúng ta thực hiện ý tưởng trên với các chuỗi lệnh sau:

Random rand = new Random();
int n = rand.Next(1000);

Chuỗi lệnh thứ nhất là định nghĩa một thực thể của lớp đối tượng Random. Chúng ta sẽ tìm hiểu kỹ hơn những kiến thức về lớp đối tượng trong các bài sau.

Chuỗi lệnh thứ hai là thực thi phương thức Next() để phát sinh ngẫu nhiên một số tự nhiên trong phạm vi từ 0 đến 999. Chúng ta sẽ tìm hiểu kỹ hơn những kiến thức về phương thức trong các bài sau.

Thực hiện Tác vụ 2 – Thiết lập một tập hợp với số lượng phần tử được xác định

Chúng ta có thể thực hiện Tác vụ 2 với chuỗi lệnh sau:

int[] tapHop = new int[n];

Những điểm cơ bản cần chú ý với chuỗi lệnh trên:

  1. Thứ nhất, cú pháp cho việc định nghĩa mảng một chiều và gán giá trị.

Csharp cung cấp cho chúng ta một kiểu dữ liệu cơ bản để lưu trữ một tập hợp các phần tử: mảng.

Tùy thuộc vào yêu cầu của chương trình ứng dụng, chúng ta có thể định nghĩa mảng một chiều hoặc mảng nhiều chiều.

Theo Yêu cầu 1, chúng ta định nghĩa mảng một chiều.

Cú pháp cơ bản cho việc định nghĩa một mảng một chiều như sau:

kiểu_dữ_liệu[] tên_mảng = new kiểu_dữ_liệu[số_lượng];

Chú ý rằng toán tử đặc biệt new giúp khởi tạo trong bộ nhớ một khoảng để lưu trữ mảng một chiều.

Chúng ta sẽ tìm hiểu kỹ hơn những kiến thức về các toán tử trong các bài sau.

  1. Thứ hai, gán giá trị.

Chúng ta có thể gán giá trị cho mảng ngay khi định nghĩa giống như chuỗi lệnh trên.

Chúng ta cũng có thể định nghĩa mảng trước rồi gán giá trị sau:

int[] tapHop;
tapHop = new int[số_lượng];

Thực hiện Tác vụ 3 – Xác định giá trị số tự nhiên cho từng phần tử

Những điểm cần chú ý khi thực hiện Tác vụ 3:

  1. Thứ nhất, truy xuất từng phần tử trong mảng.

Theo quy định trong Csharp, các phần tử trong mảng được bắt đầu từ vị trí 0 đến số_lượng – 1.

Như vậy, để truy xuất phần tử thứ i trong mảng, chúng ta sử dụng cú pháp:

tên_mảng[i-1]

  1. Thứ hai, gán giá trị cho từng phần tử trong mảng bằng phương pháp thủ công.

Chúng ta truy xuất từng phần tử trong mảng rồi gán giá trị.

Ví dụ với mảng tapHop[] gồm có 10 phần tử là các số tự nhiên. Chúng ta thực hiện gán giá trị như sau:

tapHop[0] = 1;
tapHop[1] = 8;
tapHop[2] = 15;
tapHop[3] = 19;
tapHop[4] = 24;
tapHop[5] = 35;
tapHop[6] = 12;
tapHop[7] = 64;
tapHop[8] = 24;
tapHop[9] = 88;

  1. Thứ ba, gán giá trị cho từng phần tử trong mảng bằng phương pháp tự động với kỹ thuật lặp for.

Cú pháp cơ bản cho việc truy xuất các phần tử trong một mảng một chiều với kỹ thuật lặp for như sau:

for (khởi_tạo_biến_truy_xuất; điều_kiện_lặp; bước_lặp) {
  // thực hiện công việc
}

Vòng lặp for hoạt động như sau:

  • Khi vòng lặp đầu tiên bắt đầu, phần khởi tạo của vòng lặp được thực thi. Nói chung, đây là một biểu thức đặt giá trị của biến điều khiển vòng lặp, hoạt động như một bộ đếm điều khiển vòng lặp. Điều quan trọng là phải hiểu rằng biểu thức khởi tạo chỉ được thực hiện một lần.
  • Tiếp theo, điều kiện được đánh giá. Đây phải là một biểu thức Boolean. Nó thường kiểm tra biến điều khiển vòng lặp dựa trên giá trị đích. Nếu biểu thức này là đúng, thì phần thân của vòng lặp được thực thi. Nếu nó sai, vòng lặp chấm dứt.
  • Tiếp theo, phần lặp của vòng lặp được thực thi. Đây thường là một biểu thức làm tăng hoặc giảm biến điều khiển vòng lặp. Vòng lặp sau đó lặp lại, đầu tiên đánh giá biểu thức điều kiện, sau đó thực hiện phần thân của vòng lặp và sau đó thực hiện biểu thức lặp với mỗi lần truyền. Quá trình này lặp lại cho đến khi biểu thức kiểm soát là sai.

Ví dụ với mảng tapHop[] gồm có 10 phần tử là các số tự nhiên. Chúng ta thực hiện gán giá trị như sau:

for (int i = 0; i < n; i++) {
  tapHop[i] = rand.nextInt(100);
}

  1. Thứ tư, gán giá trị cho từng phần tử trong mảng bằng phương pháp tự động với kỹ thuật lặp while.

Vòng lặp while là câu lệnh vòng lặp cơ bản.

  • Nó lặp lại một câu lệnh hoặc khối trong khi biểu thức kiểm soát của nó là đúng. Điều kiện có thể là bất kỳ biểu thức Boolean nào.
  • Phần thân của vòng lặp sẽ được thực thi miễn là biểu thức điều kiện là đúng.
  • Khi điều kiện trở thành sai, điều khiển chuyển sang dòng mã tiếp theo ngay sau vòng lặp.

Ví dụ với mảng tapHop[] gồm có 10 phần tử là các số tự nhiên. Chúng ta thực hiện gán giá trị như sau:

int i = 0;
while (i < n) {
  tapHop[i] = rand.nextInt(100);
  i = i + 1;
}

Tổng kết

Trong bài này, chúng ta đã cùng nhau tìm hiểu một số những kỹ thuật lập trình cơ bản đầu tiên trong ngôn ngữ Csharp.

Trong những bài tiếp theo, chúng ta sẽ tiếp tục tìm hiểu những kỹ thuật lập trình cơ bản khác để hoàn thành bài toán đặt ra ban đầu.

Chương trình C# đầu tiên trên MonoDevelop

Giới thiệu

Trong bài này, chúng ta cùng nhau xây dựng chương trình C# đầu tiên trên MonoDevelop.

Tương tự như các chương trình lập trình đầu tiên với các ngôn ngữ khác, nội dung chính của chương trình này:

  • Xuất ra trên màn hình câu tiếng Việt “Xin chào thế giới lập trình và ngôn ngữ C#”.
  • Giao diện hiển thị ở đây là dòng lệnh Console.

Xây dựng chương trình C# đầu tiên

Bước 1.

Chúng ta khởi động MonoDevelop.

Màn hình chính của MonoDevelop hiện ra.

Chúng ta lựa chọn chức năng File → New Solution… để tạo dự án mới.

Hình 1. Lựa chọn chức năng New Solution để tạo dự án mới.

Bước 2.

Màn hình New Project hiện ra.

Chúng ta lựa chọn mục Other → .NET trong phân vùng bên trái.

Chúng ta lựa chọn General → Console Project trong phân vùng ở giữa.

Chúng ta lựa chọn nút Next để tiếp tục.

Hình 2. Lựa chọn mục Console Project.

Bước 3.

Màn hình nhập thông tin về dự án mới.

Chúng ta nhập thông tin tương tự như sau:

Project Name: CsharpHelloWorld

Solution Name: CsharpHelloWorld

Location: /home/homes/Documents/dotNet

Create a project directory within the solution directory

Chú ý rằng thông tin Location là đường dẫn đến thư mục chứa dự án.

Chúng ta lựa chọn nút Create để thực hiện tạo dự án mới.

Hình 3. Nhập thông tin về dự án mới.

Bước 4.

Màn hình chính của MonoDevelop sau khi tạo dự án mới.

Chúng ta nhận thấy rằng MonoDevelop đã tự động tạo một tập tin mới là Program.cs.

Những thông tin chính trong tập tin Program.cs:

  • namespace CsharpHelloWorld. Đây là một khung làm việc, có thể hiểu khái quát là một phạm vi lưu trữ một số các lớp đối tượng.
  • class MainClass. Đây là lớp đối tượng chính để thực thi chương trình.
  • public static void Main(string[] args). Đây là phương thức chính của lớp MainClass để thực thi chương trình.

Những điều này sẽ được trao đổi kỹ hơn trong các bài sau về ngôn ngữ C#.

Hình 4. Màn hình chính của MonoDevelop sau khi tạo dự án mới.

Bước 5.

Chúng ta thực hiện đoạn mã nguồn để hiển thị ra các câu trên màn hình với 02 chuỗi lệnh sau:

Console.WriteLine(“Xin chào thế giới lập trình và ngôn ngữ C#”);

Console.WriteLine(“Chúng ta làm bạn nhé !!!”);

Những điểm cần chú ý theo quy định trong C#:

  • Hai dòng mã nguồn trên được viết bên trong một phương thức nào đó. Cụ thể ở đây là phương thức Main().
  • Phương thức để hiển thị một thông tin ra màn hình ConsoleConsole.WriteLine().
  • Do hiển thị 02 câu nên ở đây chúng ta áp dụng một phương pháp là viết 02 lần phương thức Console.WriteLine().

Những điều này sẽ được trao đổi kỹ hơn trong các bài sau về ngôn ngữ C#.

Hình 5. Mã nguồn C# để hiển thị thông tin ra màn hình Console.

Bước 6.

Chúng ta thực thi chương trình bằng cách nhấn vào nút mũi tên nằm bên góc trái trên thanh công cụ.

Chương trình của chúng ta đã được biên dịch và chạy tốt.

Màn hình Console hiển thị 02 câu mà chúng ta muốn hiển thị.

Hình 7. Thực thi chương trình.

Tổng kết

Trong bài này chúng ta đã cùng nhau thực hiện những công việc chính sau:

  • Thiết lập một dự án C# Console bằng MonoDevelop.
  • Tìm hiểu một số đoạn mã nguồn C# cơ bản để hiển thị thông tin ra màn hình Console.

Thiết lập môi trường lập trình C# – Cài đặt dotNet Core trên Ubuntu 18.04 x64 LTS

Giới thiệu

Trong bài này chúng ta cùng tìm hiểu việc cài đặt dotNet Core 2.2 trên Hệ điều hành Ubuntu 18.04 x64 LTS.

dotNet là gì

.NET là một nền tảng phát triển mã nguồn mở, đa nền tảng, miễn phí để xây dựng nhiều loại ứng dụng khác nhau.

Với .NET, chúng ta có thể sử dụng nhiều ngôn ngữ, trình soạn thảo và thư viện để xây dựng cho web, thiết bị di động, máy tính để bàn, chơi game và IoT.

Cho dù chúng ta đang làm việc với ngôn ngữ C#, F# hoặc Visual Basic, mã nguồn sẽ chạy tự nhiên trên mọi hệ điều hành tương thích. Những triển khai .NET khác nhau xử lý các tác vụ nặng cho chúng ta:

  • .NET Core là một triển khai .NET đa nền tảng cho các trang web, máy chủ và ứng dụng bảng điều khiển trên Linux, Windows và macOS.
  • .NET Framework hỗ trợ các trang web, dịch vụ, ứng dụng máy tính để bàn và nhiều hơn nữa trên Windows.
  • Xamarin / Mono là một triển khai .NET để chạy các ứng dụng trên tất cả các hệ điều hành di động chính.

dotNet Core

.NET Core có các đặc điểm sau:

  • Đa nền tảng: Chạy trên các hệ điều hành Windows, macOS và Linux.
  • Nhất quán trên các kiến trúc: Chạy mã nguồn với cùng một hành vi trên nhiều kiến trúc, bao gồm x64, x86 và ARM.
  • Các công cụ dòng lệnh: Bao gồm các công cụ dòng lệnh dễ sử dụng có thể được sử dụng để phát triển cục bộ và trong các tình huống tích hợp liên tục.
  • Triển khai linh hoạt: Có thể được bao gồm trong ứng dụng riêng hoặc được cài đặt song song (cài đặt toàn người dùng hoặc toàn hệ thống).
  • Tương thích: .NET Core tương thích với .NET Framework, XamarinMono, thông qua .NET Standard.
  • Nguồn mở: Nền tảng .NET Core là nguồn mở, sử dụng giấy phép MIT và Apache 2. .NET Core là một dự án .NET Foundation.
  • Được hỗ trợ bởi Microsoft: .NET Core được Microsoft hỗ trợ, theo Hỗ trợ .NET Core.

Các bước cài đặt dotNet Core 2.2

Bước 1.

Chúng ta chọn chức năng Show Applications ở phía dưới cùng trên thanh Toolbars bên trái màn hình.

Chúng ta nhập chuỗi terminal để lựa chọn ứng dụng thực thi dòng lệnh Terminal.

Hình 1. Lựa chọn ứng dụng Terminal.

Bước 2.

Cửa sổ Terminal hiện ra.

Trước khi cài đặt .NET, chúng ta sẽ cần phải đăng ký khóa Microsoft, đăng ký kho sản phẩm và cài đặt các phụ thuộc cần thiết.

Điều này chỉ cần được thực hiện một lần trên mỗi máy.

Chúng ta thực hiện công việc trên với chuỗi lệnh:

wget -q https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb

Chúng ta lựa chọn phím Enter để tiếp tục.

Hình 2. Thực hiện đăng ký khóa Microsoft và cài đặt bổ sung.

Bước 3.

Chúng ta tiếp tục thực hiện tác vụ trên với chuỗi lệnh:

sudo dpkg -i packages-microsoft-prod.deb

Chúng ta lựa chọn phím Enter để tiếp tục.

Hình 3. Thực hiện cài đặt bổ sung.

Bước 4.

Chúng ta thực hiện đăng ký repository với các chuỗi lệnh:

sudo add-apt-repository universe

sudo apt-get install apt-transport-https

Chúng ta lựa chọn phím Enter để tiếp tục.

Hình 4. Thực hiện đăng ký repository.

Bước 5.

Chúng ta thực hiện cập nhật hệ thống với chuỗi lệnh:

sudo apt-get update

Chúng ta lựa chọn phím Enter để tiếp tục.

Hình 5. Thực hiện cập nhật hệ thống.

Bước 6.

Chúng ta thực hiện cài đặt dotNet Core 2.2 với chuỗi lệnh:

sudo apt-get install dotnet-sdk-2.2

Chúng ta lựa chọn phím Enter để tiếp tục.

Hình 6. Thực hiện cài đặt dotNet Core 2.2.

Bước 7.

Hệ thống yêu cầu chúng ta đồng ý download dotNet Core 2.2.

Chúng ta lựa chọn phím Y để download.

Chúng ta lựa chọn phím Enter để tiếp tục.

Hình 7. Thực hiện đồng ý download dotNet Core 2.2.

Bước 8.

Hệ thống tiến hành download dotNet Core SDK 2.2.

Hình 8. Hệ thống download dotNet Core 2.2.

Bước 9.

Hệ thống thực hiện cài đặt dotNet Core SDK 2.2.

Hình 9. Hệ thống thực hiện cài đặt dotNet Core 2.2.

Bước 10.

Hệ thống hoàn thành việc cài đặt dotNet Core SDK 2.2.

Hình 10. Hệ thống hoàn thành việc cài đặt dotNet Core 2.2.

Tổng kết

Trong bài này chúng ta đã thực hiện cài đặt dotNet Core SDK 2.2 trên Hệ điều hành Ubuntu 18.04 x64 LTS.

Hi vọng rằng chúng ta có thể phát triển tốt Desktop và Web Applications bằng ngôn ngữ lập trình C# với nền tảng này.

Mọi tác vụ đều được thực hiện tương tự như trên Windows.