Mảng trong C# có gì mà khó khăn?

Ngày đăng: 29 - 01 - 2021 Lượt xem: 422 lượt

Mở đầu

Mảng và các xử lý mảng luôn là 1 vấn đề khó cho các bạn mới bắt đầu. Để có thể tự tin hơn với mảng, chúng ta cần nắm rõ khái niệm về mảng, 2 xử lý căn bản nhất: tìm kiếm và sắp xếp.

Khái niệm

Thông thường, để lưu 1 giá trị ta sẽ khai báo 1 biến kiểu int, string, object, … Tuy nhiên, nếu chúng ta muốn lưu nhiều giá trị cho cùng 1 kiểu dữ liệu, ví dụ: điểm môn lập trình của 10 sinh viên, danh sách sinh viên của 1 lớp học. Lúc đó, chúng ta sẽ phải dùng đến mảng. Vậy mảng là:

  1. Tập hợp các biến có cùng kiểu dữ liệu
  2. Có độ dài cố định
  3. Dữ liệu được truy xuất qua chỉ mục (index)
  4. Chỉ mục bắt đầu vị trí 0 và kết thúc bởi vị trí n-1

Cú pháp khai báo

Cú pháp chuẩn

int[] myArray = new int[10];

Cú pháp rút gọn

int[] myArray = { 1, 2, 3, 4, 5 };

Cú pháp kết hợp

int[] myArray = new int[] { 1, 2, 3, 4, 5 };

Việc sử dụng cú pháp nào tùy thuộc vào thói quen của lập trình viên.

Gán giá trị cho mảng

Để gán giá trị cho tất cả phần tử của mảng, ta thường sử dụng vòng lặp. Dưới đây là đoạn code mẫu về gán giá trị cho 1 mảng có n phần

int n = 10;
int[] myArray = new int[n];

for(int i = 0; i < n; i++)
{
                Console.WriteLine("Moi nhap so thu {0}", i + 1);
                //nhập giá trị và gọi hàm chuyển đổi sang int
                int number = Convert.ToInt32(Console.ReadLine());
                //gán giá trị vào mảng qua chỉ mục i
                myArray[i] = number;
}

Ngoài ra, ta có thể gán giá trị cho 1 chỉ mục bất kỳ. Ví dụ:

int n = 10;
int[] myArray = new int[n];

//gán giá trị tại chỉ mục 5
myArray[5] = 100;

Mảng các đối tượng

Trong các ví dụ trên, chúng ta đang sử dụng 1 mảng kiểu int, string, … đây là các kiểu dữ liệu nguyên thủy nên khi gán ta không cần khởi tạo. Với mảng các đối tượng, ta cần khởi tạo trước khi sử dụng. Ví dụ:

int n = 10;

SinhVien[] list = new SinhVien[n];

for(int i =0; i < n; i++)
{
    //khởi tạo đối tượng
    list[i] = new SinhVien();

    //gọi phương thức của đối tượng sinh viên
    list[i].NhapDiem(6, 7, 8);
}

Trong đó, class SinhVien được khai báo như sau:

class SinhVien
{
    public double LapTrinh { get; set; }
    public double CoSoDuLieu { get; set; }
    public double PhanTichHeThong { get; set; }

    public void NhapDiem(double lapTrinh, double coSoDuLieu, double phanTichHeThong)
    {
        LapTrinh = lapTrinh;
        CoSoDuLieu = coSoDuLieu;
        PhanTichHeThong = phanTichHeThong;
    }

    public double TinhDiemTrungBinh()
    {
        double avg = (LapTrinh + CoSoDuLieu + PhanTichHeThong) / 3;

        return avg;
    }
}

Đọc các phần tử của mảng

Để đọc các phần tử của mảng, ta sử dụng chỉ mục giống như khi gán. Ví dụ:

int[] myArray = { 1, 2, 3, 4, 5 };

//đọc chỉ mục 0
int num0 = myArray[0];
//đọc chỉ mục 1
int num1 = myArray[1];
//đọc chỉ mục 2,3 và tính tổng
int total = myArray[2] + myArray[3];

Tương tự cho mảng các đối tượng

SinhVien[] list = new SinhVien[n];
//khởi tạo
list[0] = new SinhVien();
//gọi phương thức của đối tượng sinh viên
list[0].NhapDiem(6, 7, 8);
//đọc giá trị
double diemTrungBinh = list[0].TinhDiemTrungBinh();

Sử dụng mảng là tham số của phương thức

Trong Phương thức và các tham số bổ trợ, ta đã biết cách khởi tạo 1 phương thức. Với tham số dạng mảng, ta khai báo 1 phương thức như sau:

  • Khai báo tham số trong lớp Program
static double TinhTong(int[] arr)
{
    int total = 0;
    foreach(int number in arr)
    {
        total += number;
    }
    return total;
}
  • Sử dụng trong hàm Main
static void Main(string[] args)
{
    int[] myArray = { 1, 2, 3, 4, 5 };

    double ketQua = TinhTong(myArray);
}

Có thể thấy, tham số kiểu mảng, việc khai báo 1 phương thức cũng tương tự như các kiểu dữ liệu khác.

Sử dụng mảng là giá trị trả về của 1 phương thức

Trong ví dụ sau, ta viết 1 phương thức có nhiệm vụ cắt 1 chuỗi có định dạng dd/MM/yyyy thành 1 mảng có 3 phần tử: dd, MM và yyyy. Mã nguồn như sau:

static int[] XuLyNgayThangNam(string thoiGian)
{
    string[] parts = thoiGian.Split('/');

    int day = Convert.ToInt32(parts[0]);
    int month = Convert.ToInt32(parts[1]);
    int year = Convert.ToInt32(parts[2]);

    return new int[] { day, month, year };
}

Ta sử dụng trong hàm Main như sau:

static void Main(string[] args)
{
    string date = "29/01/2021";

    int[] ketQua = XuLyNgayThangNam(date);

    Console.WriteLine("Ngay: " + ketQua[0]);
    Console.WriteLine("Thang: " + ketQua[1]);
    Console.WriteLine("Nam: " + ketQua[2]);
}

Một số phương thức và thuộc tính của mảng trong C#

int[] myArray = new int[5] { 1, 2, 3, 4, 5 };

 

Tên thuộc tính hoặc phương thức Ý nghĩa Sử dụng
Length Thuộc tính trả về số nguyên kiểu int là số phần tử tối đa của mảng int len = myArray.Length;
LongLength Thuộc tính trả về số nguyên kiểu long là số phần tử tối đa của mảng long len = myArray.LongLength;
GetLength(<số chiều>) Trả về số nguyên kiểu int là số phần tử trong chiều đã xác định. Lưu ý chiều của mảng là các số nguyên và được đánh số từ 0. Cho nên đối với mảng 1 chiều thì số chiều là 0. int len = myArray.GetLength(0);
GetLongLength(<số chiều>) Tương tự GetLength nhưng trả về số nguyên kiểu long long len = myArray.GetLongLength(0);
Sort() Phương thức thực hiện sắp xếp mảng theo một thứ tự Array.Sort(myArray);
Clear() Phương thức xóa hết dữ liệu trong mảng và đưa về giá trị mặc định của kiểu. Lưu ý là chỉ xóa giá trị, vùng nhớ vẫn còn đó và có thể tiếp tục sử dụng mà không cần cấp phát. Array.Clear(myArray, 0, myArray.Length);
Copy() Thực hiện copy giá trị của mảng ra một vùng nhớ mới (phép gán thông thường thì 2 đối tượng sẽ dùng chung vùng nhớ rất nguy hiểm vì đối tượng này thay đổi dẫn đến đối tượng kia cũng thay đổi) int[] copied = new int[5];

Array.Copy(myArray, copied, 5);

Reverse() Phương thức thực hiện đảo ngược thứ tự của mảng 1 chiều int[] reversed = myArray.Reverse().ToArray();

Một số xử lý cơ bản trong mảng

1. Tìm kiếm

Có rất nhiều kỹ thuật tìm kiếm 1 giá trị trong mảng. Trong ví dụ dưới đây, ta sử dụng kỹ thuật tìm kiếm tuần tự như sau:

Đoạn code tìm tất cả film có tên bắt đầu bằng từ “S”

string[] films = {
    "Công dân Kane",
    "Casablanca",
    "Bố già",
    "Cuốn theo chiều gió",
    "Lawrence of Arabia",
    "The Wizard of Oz",
    "The Graduate",
    "On the Waterfront",
    "Bản danh sách của Schindler" 
};

int counter = 0;

foreach(string film in films)
{
    if (film.StartsWith("C"))
    {
        counter++;
    }
}

Console.WriteLine("Total: " + counter);

2. Sắp xếp

C# cung cấp sẵn hàm Sort, ta có thể sử dụng như sau:

a) Sắp xếp theo chiều tăng dần

string[] films = {
    "Bố già",
    "Cuốn theo chiều gió",
    "Bản danh sách của Schindler",
    "Lawrence of Arabia",
    "Công dân Kane",
    "Casablanca",
    "The Wizard of Oz",
    "The Graduate",
    "On the Waterfront"
};

//sort theo thứ tự từ điển (A-Z)
Array.Sort(films);

foreach(var film in films)
{
    Console.WriteLine(film);
}

b) Sắp xếp theo chiều giảm dần

string[] films = {
    "Bố già",
    "Cuốn theo chiều gió",
    "Bản danh sách của Schindler",
    "Lawrence of Arabia",
    "Công dân Kane",
    "Casablanca",
    "The Wizard of Oz",
    "The Graduate",
    "On the Waterfront"
};

//sort theo thứ tự từ điển (Z-A)
Array.Sort(films, new Comparison<string>((i1, i2) => i2.CompareTo(i1)));

foreach(var film in films)
{
    Console.WriteLine(film);
}

Bài tập củng cố:

  1. Tính tổng các số chẵn trong 1 mảng int
  2. Tạo 1 mảng string, lưu danh sách tên các sinh viên. Đếm số lượng sinh viên có tên chứa từ “Thị”
  3. Tạo 1 class Lớp học gồm các thuộc tính: Mã lớp (int), Tên lớp (string), Giảng viên (string), Chỉ số (int). Khởi tạo 1 mảng Lớp học gồm 10 phần tử. Thực hiện các yêu cầu sau:
    1. Viết hàm nhập vào 10 phần tử của mảng Lớp học
    2. Đếm số lượng lớp học có Giảng viên tên “Vương”
    3. Đếm số lượng lớp học có Sỉ số trong khoản từ 30 – 50 sinh viên
    4. Kiểm tra và in ra thông tin của lớp học có Mã lớp được nhập từ bàn phím. Nếu có thì in ra thông tin, nếu không có thì in ra “Không tồn tại” lớp này.

 

5 2 votes
Article Rating

Subscribe
Notify of
guest
16 Comments
Most Voted
Newest Oldest
Inline Feedbacks
View all comments
loveColor

1. int SumEven(int[] arr)   {    int sum = 0;    foreach(int i in arr)    {     sum += i % 2 == 0 ? i:0;    }    return sum;   } 2. int n = int.Parse(Console.ReadLine());    String[] listSV = new String[n];    for(int i=0;i<n;i++)    {     listSV[i] = Console.ReadLine();    }    int count = 0;    foreach(String name… Read more »

Đào Ngọc Khuê

using System; namespace ConsoleApp1 {   class Program   {     static void Main(string[] args)     {       int n,sum=0,counterName=0;       Console.WriteLine(“Nhap vao so phan tu cua mang: “);       n = Convert.ToInt32(Console.ReadLine());       int[] arr = new int[n];       for(int i=0,len=arr.Length;i<len;i++)       {         arr[i] = Convert.ToInt32(Console.ReadLine());         if (arr[i] % 2 == 0) sum += arr[i];       }               //———————————————–       //————————————————-… Read more »

HuynhVanDong-17C1

class Program     {         static void Main(string[] args)         {             Program program = new Program();             int[] arr = {1,2,3,5,6};             int tongChan = program.TongChanTrongMang(arr);             Console.WriteLine("Dem Tong Chan: " + tongChan);             program.B2Mang();             program.B3Mang();         }         int TongChanTrongMang(int[] arr)         {             int result = 0;             foreach(int item in arr)             {                 if(item % 2 == 0)                 {                     result+= item;                 }             }             return result;         }         void B2Mang()         {             string[] dsSinhVien = {"Huỳnh Văn Đồng","Huỳnh Thị Loan Nhi","Trần Thị Thanh Tú","Võ Công Quốc"};             int count = 0;             foreach(string sv in dsSinhVien)             {                 if(sv.IndexOf("Thị") != -1)                 {                     count++;                 }             }             Console.WriteLine("So Sinh Vien Ten Co Chu 'Thi' la: " + count);         }         void B3Mang()         {             int n = 3;             Lop[] list = new Lop[n];             // Nhap thong tin             for(int i =0; i < n; i++)             {                 list[i] = new Lop();                 Console.WriteLine("Nhap Thong Tin Lop");                 Console.WriteLine("------------------");                 Console.Write("Nhap ma lop: ");                 int MaLop = Convert.ToInt32(Console.ReadLine());                 Console.Write("Nhap giang vien: ");                 string GiangVien = Console.ReadLine();… Read more »

Đoàn Thị Thu

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace BT3 {   class Program   {     static void Main(string[] args)     {       Console.WriteLine(“**Cau 1:”);       Console.WriteLine(“Nhap so phan tu cua mang: “);       int n;       n = Convert.ToInt32(Console.ReadLine());       int[] myArray = new int[n];       for (int i = 0; i < n; i++)       {… Read more »

Phạm Văn Lợi

namespace PV {   class Program   {     //1. Tính tổng các số chẵn trong 1 mảng int     public static void sumEven(int[] arr)     {       int sum = 0;       foreach(int number in arr)       {         if (number % 2 == 0) sum += number;       }       Console.WriteLine(“sum of even numbers: ” + sum);     }     //2.… Read more »

hoang2k

cau1: int n =int.Parse(Console.ReadLine());       int[] a = { 1, 2, 3, 4, 5 };       for(int i=0;i<n;i++)       {         a[i] = int.Parse(Console.ReadLine());       }       int tong = 0;       for(int i=0;i<n;i++)       {         if(a[i]%2==0)         {           tong += a[i];         }       }       Console.WriteLine(tong);       Console.ReadKey(); cau2:  String[] a = {“Nguyễn Văn A”, “Nguyễn Văn B”, “Nguyễn Văn C”,… Read more »

Đoàn Thị Thu 18CNTT4

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace BT3 {   class Program   {     static void Main(string[] args)     {       Console.WriteLine(“**Cau 1:”);       Console.WriteLine(“Nhap so phan tu cua mang: “);       int n;       n = Convert.ToInt32(Console.ReadLine());       int[] myArray = new int[n];       for (int i = 0; i < n; i++)       {… Read more »

Phạm Văn Lợi

class Program   {     //1. Tính tổng các số chẵn trong 1 mảng int     public static void sumEven(int[] arr)     {       int sum = 0;       foreach(int number in arr)       {         if (number % 2 == 0) sum += number;       }       Console.WriteLine(“sum of even numbers: ” + sum);     }     //2. Tạo 1 mảng… Read more »

Thuong Thi Thu Hiep

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace mang {   class Program   {     static void Main(string[] args)     {       //cau 1:Tinh tong cac so chan trong 1 mang int       int n;       Console.WriteLine(“Vui long nhap phan tu cua mang: “);       n = Convert.ToInt32(Console.ReadLine());       int[] arr = new int[n];       for… Read more »

Lê Văn Thắng 16CNTT2

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Baitap_tuan_3 {   class Program   {     static void Main(string[] args)     {       //Cau 1: Tinh tong cac so chan trong 1 mang int       Console.WriteLine(“Input the number of elements of array: “);       int numberOfElements = int.Parse(Console.ReadLine());       int[] a = new int[numberOfElements];       for… Read more »

Hồ Khánh Hòa 17CNTT2

class Program   {     //Bai 1 Tính tổng các số chẵn trong 1 mảng int     public static int TongChan(int[] Array)     {       int sum = 0;       for (int i = 0; i < Array.Length; i++)       {         if (Array[i] % 2 == 0)         {           sum += Array[i];         }       }       return sum;     }     //Bai… Read more »

Nguyen Hoang Lan

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Baitap3 {   class Program   {     static void Main(string[] args)     {       Console.WriteLine(“Cau 1:”);       Console.WriteLine(“Nhap so phan tu cua mang: “);       int n;       n = Convert.ToInt32(Console.ReadLine());       int[] myArray = new int[n];       for (int i = 0; i < n; i++)       {… Read more »

Bài viết liên quan

Kiểu dữ liệu và biến trong C#

Kiểu dữ liệu và biến trong C#

20 - 01 - 2021

Chúng ta đã tìm hiểu được kỹ thuật Input, Output trong ứng dụng Console trong bài trước. Trong bài...

Input và Output trong ứng dụng Console

Input và Output trong ứng dụng Console

19 - 01 - 2021

Với Console, người học sẽ tập trung vào các câu lệnh C# hơn là giao diện người dùng. Vì...

Lập trình C# căn bản - Phần 1

Lập trình C# căn bản - Phần 1

19 - 01 - 2021

Để bắt đầu làm việc với C#, chúng ta cần nắm các kiến thức căn bản gồm các nội...

16
0
Would love your thoughts, please comment.x
()
x