Hỏi về lỗi thêm và xóa phần tử trong mảng một chiều

Mình đang học C# và đang mần mảng 1 chiều nhưng chả hiểu sao lỗi tè le,mới tiếp xúc C# nên còn nhiều băn khoăn,mong mọi người chỉ ra lỗi cho chứ đừng edit code rồi ném qua,mình " không tiêu " được :stuck_out_tongue:

My code:
https://drive.google.com/open?id=0B_p7PlV-es4-d1B6QVlTRERPRnM

Mình xin hỏi thêm vài vấn đề:
Vấn đề thứ nhất là có cách nào tạo số ngẫu nhiên khác nhau để đưa chúng vào trong mảng không,mình có tham khảo google nhưng toàn sài list

Vấn đề thứ hai cho mình hỏi làm sao để copy đường dẫn của 1 file trong VS2015,như ví dụ bọn mình nhập mảng 1 chiều từ file data.txt nhưng mình toàn phải làm thủ công để copy đường dẫn của nó chứ không làm như thầy lấy đường dẫn trực tiếp trong phần mềm
Vd:C:\Users\quang\OneDrive\Documents\Visual Studio 2015\Projects\test\MangMotChieu\data.txt

Mình xin chân thành cảm ơn

A. Với code thêm:


Bạn lỗi nằm ở việc bạn khai báo mảng có int[] a = new int[5] { 2, 4, 6, 8, 10 }; nên chỉ có tối đa 5 phần tử là a[0], a[1] … a[4]. Nếu chương trình duyệt a[5] thì sẽ quăng exception “Chỉ số vượt ngoài giới hạn của mảng”.

B. Với code xoá:


Cùng một lỗi với code thêm.
=> Cách sửa với cả 2: Thay vì khai báo int[] a = new int[5] { 2, 4, 6, 8, 10 }; ta khai báo như sau:

int[] a = new int[6];
a[0] = 2;
a[0] = 4;
a[0] = 6;
a[0] = 8;
a[0] = 10;

Thực ra thì khai báo như thế này nó vẫn sẽ lỗi nếu như mảng có 6 phần tử (tức là khi length==6) :))
Có 2 cách giải quyết ổn thoả hơn
a) Dùng List
b) Mỗi khi thêm phần tử thì không dùng mảng a mà tạo mảng b = new int[length+1] rồi thêm giá trị mới vào b, thêm vào b xong thì a=b;

C. Với vấn đề lấy đường dẫn từ trong phần mềm…
Cái này, bạn dùng Console nó hơi dị (Vẫn làm được nhưng hơi dị). Để tầm 6h chiều mình sẽ code cho bạn một project mẫu trên Console nhé. Mình vào làm việc đây :))

D. Với vấn đề sinh số ngẫu nhiên
Bạn có thể học cách dùng System.Random, rất đơn giản. Trong cái pj (6h chiều) mình sẽ đưa luôn :smiley:

3 Likes

bạn tìm chỗ nào mà người ta toàn dùng list nhỉ ? Mảng random thì cứ tạo mảng rồi dùng Random sinh số ra sau đó gán vào từng phần tử của nó thôi.

1 Like

mình không tiện đưa diễn đàn khác vô đây,cái code nó đại loại như sau:

static void Main(string[] args)
{
    for (int i = 0; i < 10; i++)
        Console.Write(" {0} ", SinhSoNgauNhien());
}
static int SinhSoNgauNhien()
{
    int Number = 0;
    Random rd = new Random();
    Number = rd.Next(1, 100);
    return Number;
}

Thường thì mình sẽ nhận được 10 số giống nhau bạn à,mình mới học được 1 bữa trên trường,thầy bảo về nhà tìm hiểu hôm sau lên học cho thoải mái,đang cày C++ giờ sang C# có vài cái khác quá :slight_smile:

Cảm ơn bạn đã cho mình hướng giải quyết và chỉ cho mình sai chỗ nào

C. Có lẽ tớ chưa diễn đạt đúng , đây là 1 code mình tìm hiểu được từ thầy

static void NhapTuFile(int[] mang, ref int length)
{
    string line = "";
    using (StreamReader sr = new StreamReader(@"C:\Users\Tran Thong\Source\Repos\OOP2018\ConsoleApplication2\Mang1Chieu\data.txt"))
    {
        while ((line = sr.ReadLine()) != null)
        {
            mang[length++] = int.Parse(line);
        }
    }
}

D. Rất mong bạn cho mình code mẫu,C# khác nhiều hàm quá,mình muốn sinh số ngẫu nhiên để làm 1 hàm nhập mảng tự động cho mỗi lần test :slight_smile:

Vụ bạn sinh 10 số giống nhau là do thế này:
Random() không phải là sinh số ngẫu nhiên thực sự, nó chỉ giả ngẫu nhiên thôi, sử dụng TimeStamp hiện thời để làm seed (Hoặc có thể dùng Random(int seed) để dùng seed khác thay vì thời gian hiện thời).
Bạn chạy vòng for với i từ 0 đến 10, chắc tốn không đến 1ms nên 10 cái new Random() có seed giống hệt nhau, đâm ra Random.Next() cũng giống hệt nhau. Bạn phải khai báo new Random() ở ngoài vòng for thì các số sinh ra mới khác nhau được.

Xem ra code của mình nó phức tạp quá mức :))
http://puu.sh/tVdnJ.rar
Đoạn nào không hiểu cứ inbox hoặc pm qua fb, mình sẽ “cố” giải thích :v

2 Likes

Về cái này thì bạn cần sửa lại phương thức SinhSoNgauNhien một chút là được, hoặc dùng cách của bạn kia

namespace TestRandom
{
    class Program
    {
        //tạo đối tượng static Random ở đây
        //static Random rand = new Random();
        static void Main(string[] args)
        {
            // hoặc tạo ngay trong hàm main
            Random rand = new Random(DateTime.Now.Millisecond);
            for (int i = 0; i < 10; i++)
                Console.Write(" {0} ", SinhSoNgauNhien(rand));
        }
        static int SinhSoNgauNhien(Random rd)// truyền đối tượng Random rand vào 
        {
            int Number = 0;
            Number = rd.Next(1, 100);
            return Number;
        }
    }
}
2 Likes

bạn tối giản hết cỡ được không,học C# mới được có 1 ngày,đọc code của bạn của nhiều cái lạ quá nên mình hiểu sơ sơ thôi :stuck_out_tongue:

Nó không như hàm rand() trong C++ nhỉ,loằng nhoằng ghê luôn nhưng cảm ơn bạn đã code lại cho mình :stuck_out_tongue:

Tặng bạn hàm sinh một mảng số ngẫu nhiên nhé :slight_smile:

int[] SinhSoNgauNhien(int Min, int Max, int SoLuong)
{
    var KetQua = new int[SoLuong];
    var BoTaoSoNgauNhien = new System.Random();
    for (int ChiSo = 0; ChiSo < SoLuong; Index ++)
        KetQua[ChiSo] = BoTaoSoNgauNhien.Next(Min, Max + 1);
    return KetQua;
}
2 Likes

Cảm ơn bạn nhiều lắm,chúc bạn một ngày vui vẻ,C# nhiều lệnh khác C++ quá,mình toàn vác System(“pause”) qua,lỗi từa lưa :stuck_out_tongue:

mình cũng học C++ trước C#. Hồi mới học cũng có bỡ ngỡ. Và đến giờ thì mình quên gần hết C++ rồi. Mình “cuồng” C# vì mình thấy cú pháp của nó cực kỳ sáng sủa, phân cấp rất rõ ràng, được hỗ trợ sẵn nhiều thứ, nên giờ mình coi như biết mỗi C# :))

1 Like

Mình trong trường học Java, coi như chuyên về Java luôn, từ app desktop đến Java web. Quen cách viết code của Java, qua C# không quá nhiều trở ngại, chỉ cần nghiên cứu thêm những đặc tính của C# thôi. Giờ học lại C++ lại rất ngán vì cú pháp của nó khiến mình khá rối (học theo kiểu đã biết về các thành phần cơ bản thì bị vướng cú pháp, học lại từ đầu thì ngán :grin: ) Mà thà học lại chứ dùng kiến thức Java bỏ qua C++ chắc không chịu nổi

1 Like

Tớ vẫn thích C++ hơn nhưng công nhận C# nhanh hơn nhiều :stuck_out_tongue:

trường tớ dạy C# trước java cậu à,thầy kêu học C# xong học JAVA nó dễ hơn

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?