30/09/2018, 22:38

Về mảng Jagged Arrays trong c#

em có một mảng trong c# bây giờ em muốn nhập vào số phần từ cho từng mảng sau đó lại nhập từng phần tử vào mảng nhưng không được code của em đâu mong các bác chỉ giáo nha

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace nhiendo
{
   
    class Program
    {
        static void Main(string[] args)
        {
            int[][] a = new int[4][];
            int[]b = new int [4];
            for(int i=0;i<4;i++)
            {
                Console.Write("moi cac ban nhap so phan tu cua mang :");
                b[i] = Convert.ToInt16(Console.ReadLine());
            }
            for(int i=0;i<4;i++)
            {
                for(int j=0;j<b[i];j++)
                {
                    Console.Write("moi cac ban nhap phan tu");
                    a[i][j] = Convert.ToInt16(Console.ReadLine());
                }
            }
        }
    }
}
Văn Dương viết 00:45 ngày 01/10/2018

Code của cậu có 1 số vấn đề.

int[][] a = new int[4][];

Đây là một cách khai báo mảng 2 chiều. a đã xác định có chiều dài =4. Nhưng a[x] thì chưa khởi tạo nên khi truy xuất đến a[i][j] sẽ báo lỗi NullReferenceException.
=> Hay khởi tạo a[x] đi.

b[i] = Convert.ToInt16(Console.ReadLine());

Hàm chuyển đổi một chuỗi nhập từ bàn phím. Nhưng không kiểm tra định dạng và ngoại lệ nên sẽ có thể dính lỗi nếu chuỗi nhập vào không phải định dạng số. Ví dụ nhập “ABC” là đứt nhị.
=> Hay dung tryparse hoặc try-catch để xử lý ngoại lệ.

for(int j=0;j<b[i];j++)
                {
                    Console.Write("moi cac ban nhap phan tu");
                    a[i][j] = Convert.ToInt16(Console.ReadLine());
                }

Không có liên hệ nào giữa b[I] và a[I].Length cả. Có thể sẽ ném ra một ngoại lệ “out of bound” nếu b[I] > a[I].Length.
=> Kiểm tra độ dài a[I] và giá trị b[I]

Đỗ Nhiên viết 00:43 ngày 01/10/2018

ý em là nhập số phần từ cho a[][] tức là mỗi một mảng con sẽ có bao nhiêu phần tử là do người dùng nhập vào ý anh à

Văn Dương viết 00:49 ngày 01/10/2018

Sẽ không có kiểu đó đâu. Mình nhớ là rất nhiều ngôn ngữ không làm được điều đó. Mảng là các phần tử lien tiếp nhau nên nếu không xác định được chiều dài mảng thì không biết chương trình sẽ tạo ra nó như thế nào nữa. a[] chỉ có thể chỉ dùng để khai báo một mảng tĩnh (không biết gọi sao đành gọi vậy). Tức là só lượng các phần tử đã được cố định và khởi tạo cùng với a.

a[]=new int[]{1,2,3,4,5,6,7,8};

Mảng sinh ra thì kích thước của nó cố định. Nếu bạn muốn thay đổi kích thước thì chỉ có cách tạo mới mảng thôi.
Còn bạn muốn có phần tử không cố định thì dung các kiểu khác. Như Array, List, …

Đỗ Nhiên viết 00:53 ngày 01/10/2018

a[4][] phần tử thứ nhất là a[0][] thì em muốn số phần tử của mảng này do người dungfn hập vào ko được hả anh

Văn Dương viết 00:43 ngày 01/10/2018

Bạn làm được điều đó.

int[][] a = new int[4][]; 
Console.Write("Nhap so phan tu mang");
int num =..... // số phần tử người dung đã nhập.
a[0] = new int[num]; // a[num] có num phần tử
a[1] = new int[8]; // a[1] có 8 phần tử

Nó rất going với mảng 2 chiều khai báo bang con trỏ trong C++ :

int **a = new int*[4];
int num=...;
a[0] = new int[num];
Đỗ Nhiên viết 00:47 ngày 01/10/2018

em cảm ơn anh em làm được rồi ạ

Đỗ Nhiên viết 00:53 ngày 01/10/2018

không làm vòng lặp được hả anh

Văn Dương viết 00:51 ngày 01/10/2018

Mình không biết làm vòng lặp là làm kiểu gì ?

Đỗ Nhiên viết 00:39 ngày 01/10/2018

ý em là thế nào em có một mảng đa chiều trong c# vd là int[][]a = new int [4][0]
và bây giờ em muốn nhập số phần tử của các mảng sau đó lại nhập vào từng phần tử của mỗi mảng con cảm ơn anh em làm được rồi anh à nhờ cái dòng này của anh này a[0] = new int[num] không biết đây là kiến thức gì nhỉ
code của em đây anh à

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace nhiendo
{
   
    class Program
    {
        static void Main(string[] args)
        {
            int[][] a = new int[4][];
            int[] b = new int[4];
             for (int i = 0; i < 4; i++)
            {
                Console.WriteLine("moi ban nhap so phan tu:");
                b[i] = Convert.ToInt16(Console.ReadLine());
            }
            for (int i = 0; i < 4; i++)
            {
                a[i] = new int[b[i]];
            }
            for(int i=0;i<4;i++)
            {
                for (int j = 0; j < b[i]; j++)
                {
                    Console.Write("moi ban nhap phan tu cho mang:");
                    a[i][j] = Convert.ToInt16(Console.ReadLine());
                }
            }
        }    
    }
}

cảm ơn anh nha

Văn Dương viết 00:47 ngày 01/10/2018

a[0] = new int[num] không biết đây là kiến thức gì nhỉ

Thực ra trước lúc em hỏi bài này anh chưa bao giờ dùng : int[][] a = new int[y][x] cả. Thấy lạ vác VS ra test thử viết đại thế lại được. Bởi vì anh toàn dùng mảng có kích thước cố định nên toàn chơi :

int[,] a = new int[y,x]; 
int[,,] a  = new int[z,y,x];
for (int i = 0; i < 4; i++)
            {
                Console.WriteLine("moi ban nhap so phan tu:");
                b[i] = Convert.ToInt16(Console.ReadLine());
            }
            for (int i = 0; i &lt; 4; i++)
            {
                a[i] = new int[b[i]];
            }

Chỗ này của em anh nghĩ nên viết gộp lại cho ngắn

for (int i = 0; i < 4; i++)
    {
         Console.WriteLine("moi ban nhap so phan tu:");
         b[i] = Convert.ToInt16(Console.ReadLine());
         a[i] = new int[b[i]];
    }
Đỗ Nhiên viết 00:53 ngày 01/10/2018

ok anh muộn rồi anh em mình ngủ ngon thôi mà anh để gia tộc họ đểu ngủ trước à em là đỗ nhiên ngày trước là jobs apples steve kết bạn facebook mà ông không đồng ý gì cả

Văn Dương viết 00:51 ngày 01/10/2018


Anh sao mà biết được Gia Tộc Họ Đểu ngủ lúc nào.

Facebook thì cách đây 1 năm cãi nhau với gấu (giờ thành sư tử) nên thề giời không dùng nữa. Ai dè bỏ được đến giờ

Đỗ Nhiên viết 00:46 ngày 01/10/2018

rước người ta về rồi còn gì nữa à

Bài liên quan
0