Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Trang 1 của 2 12 CuốiCuối
Kết quả 1 đến 10 của 11
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    có nhầm lẫn gì chăng trong mảng mảng C++

    các bác nào PRo cho em hỏi C++ 1 chút

    biểu diễn một mảng hai chiều kích thước 3x5 có kiểu int. Cách khai báo mảng này như sau:

    int jimmy [3][5];
    (hãy nhớ rằng chỉ số của mảng luôn bắt đầu từ 0).

    em co 1 đoạn mã như thế này(viết 1 ma trận mxn sau đó in ma trận dưới dạng bảng và tìm 1 phần tử lớn nhất)

    em khong hieu phan tu a[0][0]...a[0][n]
    a[1][0]...a[m][0]
    o cho nao trong khi đoạn mã dưới đây không hề nhắc đến các phần tử này ?? theo lý thuyết các phần tử của mảng luôn bắt đầu từ chỉ số 0
    vd int a[5] thi gom 5 phan tu a[0] a[1] a[2] a[3] va a[4]


    trich sach "C++ lap trinh huong doi tuong GS nguyen van at"
    Mã:
    #include<iostream.h>
    #include<conio.h>
    #include<iomanip.h>
    
    void main();
    {
    	float a[20][20],smax;
    	int m,n,imax,jmax,k;
    	
    	cout<<"so hang cua ma tran la :"; cin>>m;
    	cout<<"so cot cua ma tran la "; cin>>n; 
    	
    	for(i=1;1<=m;++i)
    		for(j=1;j<=n;++j)
    		{
    			cout<<"a["<<i<<"],["<<J<<"j] =";
    			cin>>a [i][j]; 
    		}
    
    
    
    smax=a[1][1];
    imax=1;
    jmax=1;
    
    for(i=1;1<=m;++i)
    	for(j=1;j<=n;++j)
    		if(smax<=a [i][j])
    		{
    			smax=a [i][j];
    			imax=i;
    			jmax=j; 
    		}
    	cout<<"
    
     Matran";
    	cout<<setiosflags(ios::showpoint)<<setpricision(1);
    
    for(i=1;1<=m;++i)
    	for(j=1;j<=n;++j)
    	{
    		if(j==1)cout<<"
    ";
    		cout<<a [i][j];
    	} 
    	cout<<"phan tu lon nhat cua mang la: "<<smax<<"
    ";
    	cout<<"hang thu: "<<imax<<"
    ";
    	cout<<"cot thu: "<<jmax; 
    }

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Đúng là trong c/c++ chỉ số mảng bắt đầu bằng 0 thật nhưng mà ta cũng ko nên hiểu máy móc như vậy . Bạn tưởng tượng ta có 1 tỷ đồng , ta cho bạn ta 1 ngàn đồng thì có hề hấn gì chứ , vẫn còn đến 9.999.999.000 đồng để xài thoải mái mà . Ở đây cái ông ất này thích vậy thì ổng cứ làm vậy thôi . Bạn suy nghĩ lại sẽ thấy ổng bỏ hết mấy phần tử đầu mảng 2 chiều , chỉ thao tác trên mảng còn lại thôi . Cũng được , chẳng sao ...

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Ở trên, phần tử a[0][j] và a[i][0] chưa được gán giá trị thôi, có thể đem ra sử dụng tùy ý mà không lo bị đòi lại. Thử xem! [IMG]images/smilies/biggrin.png[/IMG]

    Hơn nữa khai báo mảng tĩnh thì thường là khai báo thừa, dùng bao nhiêu thì tùy, miễn sao nó không 'tòi' ra cái thằng chưa được khai báo là OK. [IMG]images/smilies/biggrin.png[/IMG] (kiểu này là của mấy bác PMU18 ấy mà)

    Thực chất Bác Ất muốn làm thế để cho người đọc dễ hiểu thôi.

    Một ma trận thì thường chỉ số bắt đầu từ 1. Viết như thế mọi người dễ hình dung hơn về cách giải bài toán, sau khi hình dung ra cách giải, đi vào công việc cụ thể thì phải làm cho chuẩn. Giáo viên cũng thường dạy như kiểu đó, nếu trái ý có khi còn không được điểm ấy chứ?

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Mã:
    #include<iostream.h>
    #include<conio.h>
    #include<iomanip.h>
    
    void main();
    {
    	float a[20][20],smax;
    	int m,n,imax,jmax,k;
    	
    	cout<<"so hang cua ma tran la :"; cin>>m;
    	cout<<"so cot cua ma tran la "; cin>>n; 
    	
            //
            // i,  j ban đầu đã đc set giá trị là 1, bắt đầu đi từ số 1
            //
    	for(i=1;1<=m;++i)
    		for(j=1;j<=n;++j)
    		{
    			cout<<"a["<<i<<"],["<<J<<"j] =";
    			cin>>a [i][j]; 
    		}
    
    
    
    smax=a[1][1];
    imax=1;
    jmax=1;
    
    //
    // i,  j ban đầu đã đc set giá trị là 1
    //
    for(i=1;1<=m;++i)
    	for(j=1;j<=n;++j)
    		if(smax<=a [i][j])
    		{
    			smax=a [i][j];
    			imax=i;
    			jmax=j; 
    		}
    	cout<<"
    
     Matran";
    	cout<<setiosflags(ios::showpoint)<<setpricision(1);
    
    //
    // i,  j ban đầu đã đc set giá trị là 1
    //
    for(i=1;1<=m;++i)
    	for(j=1;j<=n;++j)
    	{
    		if(j==1)cout<<"
    ";
    		cout<<a [i][j];
    	} 
    	cout<<"phan tu lon nhat cua mang la: "<<smax<<"
    ";
    	cout<<"hang thu: "<<imax<<"
    ";
    	cout<<"cot thu: "<<jmax; 
    }
    Hình như là bác Ất đã bỏ mất giá trị 0, đúng theo bác Dr nói giá trị 0 chưa đc set, mà cái kiểu dạy giá trị mãng bắt đầu bằng 1 thì cũng nguy hiểm nhỉ [IMG]images/smilies/2.gif[/IMG] nếu đó không phải là int mà là con trỏ thì thế nào chương trình cũng la ỏm tỏi.

    @ledinhtung61 : đang suy nghĩ tại sao điều kiện 1 <= m chương trình lại không báo lỗi khi ra ngoài mảng [IMG]images/smilies/1.gif[/IMG]

  5. #5
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    đang suy nghĩ tại sao điều kiện 1 <= m chương trình lại không báo lỗi khi ra ngoài mảng
    Chắc ghi lộn i là 1 đó thôi ...

  6. #6
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    @ledinhtung61 : đang suy nghĩ tại sao điều kiện 1 <= m chương trình lại không báo lỗi khi ra ngoài mảng
    Cái này hên xui, do array không có lỗi catch lỗi out of bound, vui thì nó catch, không thì thôi, nhưng mỗi lần làm vậy thì vùng nhớ ngoài đó bị overwrite hết, cho nên xài vector ngon hơn [IMG]images/smilies/biggrin.png[/IMG].

  7. #7
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Nếu code trên chạy, user nhập m & n >= 20 thì sao nhỉ, 30 chẵng hạn ?

  8. #8
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    Nếu code trên chạy, user nhập m & n >= 20 thì sao nhỉ, 30 chẵng hạn ?
    Đúng như anh nói, em không hiểu sao code trong sách của bác Ất rất hay để giá trị cuối cùng <= m, n. Sao không khởi tạo cho nó nhỏ hơn nhỏ hơn hẳn n nhỉ ?
    Bị mấy cái bug này mà code dài 1 tí thì có mà khóc.

  9. #9
    Tư duy của Pascal mang sang đấy em à !

  10. #10
    Hồi trước lúc em đọc sách pascal, em cũng không hiểu nhiều lắm về giải thuật, cho nên cũng hay bê y chang, để subscript đúng = n để cài đặt giải thuật. T_T. Lúc sau em bị bug chỗ n này quá em tởn luôn ^_^. Bị tìm mãi ko ra vì cứ quan niệm mình viết cái chỗ vòng for cả trăm lần rùi thì sao sai được, cứ vòng vòng kiếm mãi cuối cùng mới lòi ra là nó T_T.

 

 
Trang 1 của 2 12 CuốiCuối

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •