Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Trang 2 của 2 Đầu tiênĐầu tiên 12
Kết quả 11 đến 14 của 14
  1. #11
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Mình chỉ có một góp ý nhỏ về lý do code của bạn trandinhnamvn chạy không đúng khi có 2 số liền nhau.
    xét mảng đầu vào A[] = {1, 2, 2, 3, 4, 5, 6, 7, 8, 9} với n bằng 2.

    bạn for một biến i chạy từ 0->9
    - khi i= 1 thì gặp A[i] == n và bạn cho dịch các phần tử ở phía sau lên 1 bước nên A sẽ thành {1, 2, 3, 4, 5, 6, 7, 8, 9, x} //(x tức là không xác định được, vì bạn gán A[9] = A[10] nhưng mảng chỉ có đến A[9] thôi nên câu lệnh này xẽ không chắc chắn được giá trị của A[9] là gì)
    - sau đó i nhảy một đơn vị, chương trình kiểm tra sang A[i] (lúc này là A[2] do i=2) , thấy A[i] = 3 khác với n nên nó chạy tiếp. Ở đây thực ra bạn cần kiểm tra A[1] chứ không phải A[2] do ở bước trước bạn đã dịch A[2] lên vị trí A[1].
    - sửa lại code thì thêm 1 dòng là ổn:

    Mã:
    	for (i = 0; i < 10; i++){
    		if (a[i] == n){
    			for (j = i; j<10; j++){  //j nên nhỏ hơn 9 chứ không phải mười, nếu không câu lệnh A[j+1] ở dưới sẽ truy cập đến A[10] mà  
    				tam = a[j];        // mảng này chỉ có đến phần tử A[9] thôi
    				a[j] = a[j + 1];
    				a[j + 1] = tam;
    			}
    			d2++;
    			i--; //them dong nay
    		}
    	}

  2. #12
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi acthu489
    Mình chỉ có một góp ý nhỏ về lý do code của bạn trandinhnamvn chạy không đúng khi có 2 số liền nhau.
    xét mảng đầu vào A[] = {1, 2, 2, 3, 4, 5, 6, 7, 8, 9} với n bằng 2.

    bạn for một biến i chạy từ 0->9
    - khi i= 1 thì gặp A[i] == n và bạn cho dịch các phần tử ở phía sau lên 1 bước nên A sẽ thành {1, 2, 3, 4, 5, 6, 7, 8, 9, x} //(x tức là không xác định được, vì bạn gán A[9] = A[10] nhưng mảng chỉ có đến A[9] thôi nên câu lệnh này xẽ không chắc chắn được giá trị của A[9] là gì)
    - sau đó i nhảy một đơn vị, chương trình kiểm tra sang A[i] (lúc này là A[2] do i=2) , thấy A[i] = 3 khác với n nên nó chạy tiếp. Ở đây thực ra bạn cần kiểm tra A[1] chứ không phải A[2] do ở bước trước bạn đã dịch A[2] lên vị trí A[1].
    - sửa lại code thì thêm 1 dòng là ổn:

    Mã:
    	for (i = 0; i < 10; i++){
    		if (a[i] == n){
    			for (j = i; j<10; j++){  //j nên nhỏ hơn 9 chứ không phải mười, nếu không câu lệnh A[j+1] ở dưới sẽ truy cập đến A[10] mà  
    				tam = a[j];        // mảng này chỉ có đến phần tử A[9] thôi
    				a[j] = a[j + 1];
    				a[j + 1] = tam;
    			}
    			d2++;
    			i--; //them dong nay
    		}
    	}
    Cách thêm i-- mình đã thử trước rồi, và chạy là sẽ lỗi ngay.

  3. #13
    Cách dẫn dắt của INTP rất hay, các bạn nên theo cách đó, còn đi theo hướng chủ đề tài, cách của mình bảo đảm sẽ không lỗi.

  4. #14
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi trandinhnamvn
    Cách thêm i-- mình đã thử trước rồi, và chạy là sẽ lỗi ngay.
    - à mình xem lại rồi, do đến vòng cuối mảng sẽ là {1,3,4,5,6,7,8,2,2} nó thực hiện dịch số 2 cuối cùng lên nhưng lại đổi chỗ số 2 đằng trước ra phía sau và thực hiện i-- =>vòng sau nó vẫn kiểm tra thấy a[8] == 2 và làm lại => lặp vô tận.

    sửa thế này thì chạy đúng :
    Mã:
    void printArray(int a[10], int n){
    	int i = 0, dem = 0, tam,j, d2=0,k;
    	int temp=0;
    	for (i = 0; i < 10 - d2; i++){
    		temp++;
    		if(temp>=150) break; 
    		
    		if (a[i] == n){
    			cout<<endl;
    			cout<<"i="<<i<<"  :";
    			for (j = i; j<9; j++){
    				tam = a[j];
    				a[j] = a[j + 1];
    				a[j + 1] = tam;
    			}
    			d2++;
    			i--;	
    			for(int t=0;t<10;t++)
    			 cout<<	a[t]<<"-";	
    		}
    	}
    	for (i = 9; i>(9 - d2); i--)  
    		a[i] = 0;
    	for (i = 0; i < 10; i++)
    		cout << a[i] << "  ";
    }

 

 
Trang 2 của 2 Đầu tiênĐầu tiên 12

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
  •