Từ 1 tới 10 trên tổng số 10 kết quả

Đề tài: hỏi về lỗi trong vòng lặp

  1. #1
    Ngày gia nhập
    05 2018
    Bài viết
    0

    Mặc định hỏi về lỗi trong vòng lặp

    cho em hỏi về bài C++ này xíu : Viết chương trình nhập vào một dãy các sô theo giá trị tăng, nếu nhập sai quy cách thì yêu cầu nhập lại. In dãy số sau khi đã nhập xong.
    em thử viết chương trình bằng cả while và for nhưng ra kết quả khác nhau. Mong anh chị chỉ dùng em lỗi sai. Em cảm ơn ạ.

    code bằng vòng lặp while
    Code:
    #include<iostream>
    using namespace std;
    int main(){
         int n;
         cout<<"Nhap so phan tu"'
         cin>>n;
         int M[n];
         int i = 0;
         while(i<n)
         {
         cout<<"Nhap M[''<<i<<"] = ";
         cin>>M[i];
         if(i > 0 && M[i] <= M[i-1])
            continue;
           i++;
         }
    cout<<"Du lieu ban vua nhap la : "<<endl;
    for(int i = 0 : i < n ; i++)
         cout<<"M[i]<< "<<"\t";
    return 0;
    }
    đây là code dùng vòng lặp for :

    Code:
    include <iostream>
    using namespace std;
    int main(){
    	int n;
    cout<<"BAN HAY NHAP VAO GIA TRI CUA n : ";
    cin>>n;
    int M[n];
    	for(int i = 0 ; i < n ; i++){
    	cout<<"M["<<i<<"] = "<<endl;
    	cin>>M[i];
    	if(i > 0 && M[i] <= M[i-1])
    		continue;
    	
    }
    cout<<"DU LIEU BAN VUA NHAP LA :";
    for(int i = 0 ; i < n ; i++){
    	cout<<M[i]<<"\t";
    }
    	return 0;
    }
    Đã được chỉnh sửa lần cuối bởi lambmt : 08-04-2019 lúc 10:55 AM.

  2. #2
    Ngày gia nhập
    02 2016
    Bài viết
    305

    Trích dẫn Nguyên bản được gửi bởi lambmt Xem bài viết
    ... code dùng vòng lặp for :

    Code:
    // ...
    	for(int i = 0 ; i < n ; i++){
    	cout<<"M["<<i<<"] = "<<endl;
    	cin>>M[i];
    	if(i > 0 && M[i] <= M[i-1]) // if này vô dụng bởi vì continue nó đâu có bỏ qua (skip) cái gì đâu !!!
    		continue;
    	
    }
    // ...
    Sửa lại:
    for(int i = 0 ; i < n ; i++){
    cout<<"M["<<i<<"] = "<<endl;
    cin>>M[i];
    if(i > 0 && M[i] <= M[i-1]) i--;
    }

  3. #3
    Ngày gia nhập
    05 2018
    Bài viết
    0

    em cảm ơn ạ , anh có thể giải thích kĩ hơn cho em hiểu được không ạ , có lẽ là em chưa vững kiến thức về continue.

  4. #4
    Ngày gia nhập
    08 2017
    Bài viết
    2,573

    Như trên đã đúng, đã được chưa mà cám ơn?

    C++ Code:
    1. #include<iostream>
    2. using namespace std;
    3.  
    4. int main(){
    5.      int n;
    6.      cout<<"Nhap so phan tu";
    7.      cin>>n;
    8.      int M[n]; //cấp phát cho TBD nào (1) ?
    9.  
    10.      int i = 0;
    11.      while(i<n)
    12.      {
    13.           cout<<"Nhap M[''<<i<<"] = ";
    14.          cin>>M[i];
    15.          if(i > 0 && M[i] <= M[i-1])
    16.                continue; //nó có làm thay đổi biến lặp i không (2)?
    17.           i++;
    18.     }
    19.     cout<<"Du lieu ban vua nhap la : "<<endl;
    20.     for(int i = 0 : i < n ; i++)
    21.          cout<<"M[i]<< "<<"\t";
    22.     return 0;
    23. }

    (1) nó n < 1 thì sao, xem #7 ở
    http://diendan.congdongcviet.com/threads/t400425::ctdl-giai-thuat-dung-de-lam-gi.cpp

    (2) phầm tử đầu tiên không cần so sánh, nên đưa nó ra khỏi vòng lặp.

    viết code cần có chú thích, viết cho máy TBD đọc thôi thì không cần. Nên copy/paste từ IDE cho đúng, trình bày nên tuân thủ định dạng.

  5. #5
    Ngày gia nhập
    02 2016
    Bài viết
    305

    Trích dẫn Nguyên bản được gửi bởi lambmt Xem bài viết
    em cảm ơn ạ , anh có thể giải thích kĩ hơn cho em hiểu được không ạ , có lẽ là em chưa vững kiến thức về continue.
    Điểm mà bạn chưa nắm vững là vòng lặp for chứ khoan nói đến continue.

    for(int i = 0 ; i < n ; i++){

    Vòng lặp for như thế thì mỗi lượt nó lại nhảy i lên 1. Tức là theo code cũ của bạn thì dẫu phần tử M[i] có đạt điều kiện hay khong, nó vẫn nhận và đi tiếp sang phần tử kế.
    Code tôi sửa lại để khi phần tử i không đạt thì nó thụt lùi về (i--), để lượt tới lặp lại i

  6. #6
    Ngày gia nhập
    08 2017
    Bài viết
    2,573

    Mặc định hỏi về lỗi trong vòng lặp

    quá rảnh, không cần biện luận

  7. #7
    Ngày gia nhập
    05 2018
    Bài viết
    0

    Trích dẫn Nguyên bản được gửi bởi NguNhuheo Xem bài viết
    Điểm mà bạn chưa nắm vững là vòng lặp for chứ khoan nói đến continue.

    for(int i = 0 ; i < n ; i++){

    Vòng lặp for như thế thì mỗi lượt nó lại nhảy i lên 1. Tức là theo code cũ của bạn thì dẫu phần tử M[i] có đạt điều kiện hay khong, nó vẫn nhận và đi tiếp sang phần tử kế.
    Code tôi sửa lại để khi phần tử i không đạt thì nó thụt lùi về (i--), để lượt tới lặp lại i
    dạ vâng em cảm ơn ạ , do em nghĩ nó cũng tương tự khi dùng i++ ở while cho nên em thử với for luôn mà thấy nó sai

  8. #8
    Ngày gia nhập
    02 2016
    Bài viết
    305

    Trích dẫn Nguyên bản được gửi bởi lambmt Xem bài viết
    dạ vâng em cảm ơn ạ , do em nghĩ nó cũng tương tự khi dùng i++ ở while cho nên em thử với for luôn mà thấy nó sai
    Muốn giống như while thì bỏ cả đuôi i++ đi. Và tăng i khi thỏa điều kiện
    Code:
    // vòng lặp while
    while(i<n)
         {
         cout<<"Nhap M[''<<i<<"] = ";
         cin>>M[i];
         if(i > 0 && M[i] <= M[i-1])
            continue;
           i++;
         }
    
    // vòng lặp for
    for(int i = 0; i<n; ) // chú ý: lệnh thứ 3 trong mệnh đề for là trống (không làm gì cả)
         {
         cout<<"Nhap M[''<<i<<"] = ";
         cin>>M[i];
         if(i > 0 && M[i] <= M[i-1])
            continue;
           i++;
         }
    
    // vòng lặp for, sử dụng lệnh thứ 3
    for(int i = 0; i<n; if(i <= 0 || M[i] >= M[i-1]) i++ ) // chú ý: điều kiện phần tử được thực hiện trong lệnh thứ 3, thay vì bên trong vòng lặp
         {
         cout<<"Nhap M[''<<i<<"] = ";
         cin>>M[i];
         }
    Đã được chỉnh sửa lần cuối bởi NguNhuheo : 15-03-2019 lúc 09:37 AM.

  9. #9
    Ngày gia nhập
    05 2018
    Bài viết
    0

    Trích dẫn Nguyên bản được gửi bởi NguNhuheo Xem bài viết
    Muốn giống như while thì bỏ cả đuôi i++ đi. Và tăng i khi thỏa điều kiện
    Code:
    // vòng lặp while
    while(i<n)
         {
         cout<<"Nhap M[''<<i<<"] = ";
         cin>>M[i];
         if(i > 0 && M[i] <= M[i-1])
            continue;
           i++;
         }
    
    // vòng lặp for
    for(int i = 0; i<n; ) // chú ý: lệnh thứ 3 trong mệnh đề for là trống (không làm gì cả)
         {
         cout<<"Nhap M[''<<i<<"] = ";
         cin>>M[i];
         if(i > 0 && M[i] <= M[i-1])
            continue;
           i++;
         }
    
    // vòng lặp for, sử dụng lệnh thứ 3
    for(int i = 0; i<n; if(i <= 0 || M[i] >= M[i-1]) i++ ) // chú ý: điều kiện phần tử được thực hiện trong lệnh thứ 3, thay vì bên trong vòng lặp
         {
         cout<<"Nhap M[''<<i<<"] = ";
         cin>>M[i];
         }
    dạ em cảm ơn anh nhiều lắm ạ, anh giải thích rất kĩ , em đã hiểu ra vấn đề rồi , giải thích kĩ vấn đề như vậy rất cần cho 1 thằng mới học lập trình như em.
    Đã được chỉnh sửa lần cuối bởi lambmt : 08-04-2019 lúc 10:55 AM.

  10. #10
    Ngày gia nhập
    08 2017
    Bài viết
    2,573

    viết chương trình bằng while như trên đã đúng, đã đạt chưa ?

    một lần cho chín hơn 9, 10 lần

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn