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

Đề tài: Cách thức in ra màn hình cũng như gọi lại hàm trong C++?

  1. #1
    Ngày gia nhập
    01 2013
    Nơi ở
    Hà Nội
    Bài viết
    6

    Unhappy Cách thức in ra màn hình cũng như gọi lại hàm trong C++?

    Code:
    //Chuyen doi so thanh cac chu so.
    #include<iostream>
    #include<conio.h>
    
    void Chuyen(int n);
    
    void main()
    {
    	using namespace std;
    
    	int n;
    
    	cout<<"n= ";
    	cin>>n;
    
    	Chuyen(n);
    	
    	getch();
    }
    
    void Chuyen(int n)
    {
    	using namespace std;
    
    	if(n<0)
    	{
    		cout<<"-";
    		n=-n;
    	}
    
    	if(n/10)
    		Chuyen(n/10);
    
    	cout<<"Chu so la: "<<(n%10)<<endl;
    }
    Em có đoạn mã đơn giản như trên nhưng em ko hiểu cho lắm về cách thức in ra màn hình cũng như gọi lại hàm trng C++.
    1. Ở dòng cuối cùng có đoạn code
    Code:
    cout<<"Chu so la: "<<(n%10)<<endl;
    và đoạn code sau:
    Code:
    cout<<"Chu so la: "<<char(n%10 + '0'<<endl;
    . CHo em hỏi là hai đoạn trên có gì khác nhau không ạ? vì em thấy in ra màn hình là như nhau.
    2. Trong hàm trên có sử dụng đệ quy ạ. và khi gọi lại hàm Chuyen(n/10) thì sẽ có dòng in ra
    Code:
    cout<<"Chu so la: <<(n%10)<<endl;
    vậy tại sao khi gọi lại sau nhưng dòng in ra màn hình sau lại được in lên trên dòng in ra màn hình trướng ạ.Ví dụ: em có số 12345 thì sau khi qua hàm trên đáng lẽ nó phải in ra là:
    Code:
    Chu so la: 5
    Chu so la: 4
    Chu so la: 3
    Chu so la: 2
    Chu so la: 1
    Nhưng sao nó lại in ngược lại ạ??
    CÁc anh chị NÀO biết giải thích cho em với ạ.

  2. #2
    Ngày gia nhập
    11 2012
    Bài viết
    136

    vậy tại sao khi gọi lại sau nhưng dòng in ra màn hình sau lại được in lên trên dòng in ra màn hình trướng ạ.Ví dụ: em có số 12345 thì sau khi qua hàm trên đáng lẽ nó phải in ra là:
    Giả sử với ví dụ của bạn nhá, nó cứ thực hiện cho tới khi mà tới khi n sai khi ở lệnh if(n/10) thì nó sẽ thực hiện dòng lệnh cout<<"Chu so la: "<<(n%10)<<endl; đương nhiên lúc này n chỉ là 1 mà thôi và lần gọi đệ quy cuối cùng kết thúc, nhưng đệ quy là quay trở lại và n = 12 tương tự cho đến lần đầu tiên là 12345 thì kết thúc, và các lần thực hiện đệ quy này sẽ bắt đầu tại điểm gọi đệ quy là
    C Code:
    1. if(n/10)
    2.        Chuyen(n/10);// từ chỗ này bởi chương trình đã chứa toàn bộ địa chỉ và các lệnh, biến ở lần đệ quy
    3.                          // lần đệ quy trước đó của hàm. muốn in kiểu của bạn muốn thì chuyển lệnh cout<<"Chu so la: "<<(n%10)<<endl; lên trên if(n%10), thì đệ quy này trở thành tail recursive
    Để hiểu cái đệ quy này bạn nên debug ra giấy sẽ hiệu quả hơn nhiều. Còn dòng code bạn đưa khác nhau chứ một cái là n%10 một cái là n%10 + 48; mã kí tự 0 trong bảng mã acsii là 48 mà.
    Giao lưu và học hỏi
    https://www.facebook.com/kimcy1992

  3. #3
    Ngày gia nhập
    01 2013
    Nơi ở
    Hà Nội
    Bài viết
    6

    Giả sử với ví dụ của bạn nhá, nó cứ thực hiện cho tới khi mà tới khi n sai khi ở lệnh if(n/10) thì nó sẽ thực hiện dòng lệnh cout<<"Chu so la: "<<(n%10)<<endl;
    Chỗ này à lệnh rẽ nhánh
    Code:
    if()....
    chứ có phải
    Code:
    if()...else
    đâu mà nó phải sai ở lệnh
    Code:
    if(n/10)
    hả c??.

  4. #4
    Ngày gia nhập
    11 2012
    Bài viết
    136

    Bạn đọc lại bản chât đệ quy là gì đi rồi hỏi tiếp, nếu không sai ở if(n/10) liệu lời gọi đệ quy có kết thúc không thử cho else kiểu này xem nó chạy nổi khônng hay chương trình không chạy được nữa .
    C Code:
    1. if(n/10)
    2.       Chuyen(n/10);
    3.   else
    4.     cout<<"Chu so la: "<<(n%10)<<endl;
    Đã được chỉnh sửa lần cuối bởi kimcy1992 : 08-01-2013 lúc 07:37 PM. Lý do: nữa thêm thông tin
    Giao lưu và học hỏi
    https://www.facebook.com/kimcy1992

  5. #5
    Ngày gia nhập
    01 2013
    Nơi ở
    Hà Nội
    Bài viết
    6

    t ko hỏi ở đệ quy. t hỏi ở lệnh if ấy. đâu phải sai ở if(n/10) thì lệnh cout<<"Chu so la: "<<(n%10)<<endl; mới thực hiện đâu hả c?
    Giả sử số là 12345 thì ở lần gọi đầu tiên nó vẫn chạy lệnh cout<<"Chu so la: "<<(n%10)<<endl; chứ. Sau lệnh if và đệ quy được gọi ấy.

  6. #6
    Ngày gia nhập
    05 2012
    Bài viết
    4

    Mặc định Giải thích vấn đề đệ quy và lệnh if mà bạn thắc mắc

    Trích dẫn Nguyên bản được gửi bởi baobka2012 Xem bài viết
    t ko hỏi ở đệ quy. t hỏi ở lệnh if ấy. đâu phải sai ở if(n/10) thì lệnh cout<<"Chu so la: "<<(n%10)<<endl; mới thực hiện đâu hả c?
    Giả sử số là 12345 thì ở lần gọi đầu tiên nó vẫn chạy lệnh cout<<"Chu so la: "<<(n%10)<<endl; chứ. Sau lệnh if và đệ quy được gọi ấy.
    Bạn à, bạn phải tìm hiểu rõ về Đệ Quy trước và lắng nghe người khác nói nhé , cứ bảo thủ ý kiến thì bạn không thể nào sáng tạo 1 vấn đề đâu.

    Mình giải bài bạn như sau :
    + Bạn nhập vào 1 số là 12345
    + Gửi tham số này vào hàm Chuyen(int n) mà bạn đã định nghĩa.
    + Bắt đầu xét n < 0 hay không , dĩ nhiên là không !
    + Tiếp đến xét n/10 hay không , mấu chốt là trong lệnh if(n/10) nếu đúng thì thực thi gọi lại đệ quy .

    ~~ Tại chỗ này , với lần chạy đầu tiên ( n = 12345 ) thì kết quả đúng thật là 5 trước,nhưng tại dòng này lệnh đệ quy được gọi,nó sẽ nhảy lại hàm này 1 lần nữa nhưng tham số được thay đổi ( 1234) , nhớ rằng tại dòng lệnh này cái hàm Chuyen(12345) đã bị ngưng lại tại dòng đệ quy ( Chuyen(1234) ,do đó dòng xuất kết quả ra 5 sẽ chưa thực hiện.

    ~~ Và cứ thế cho đến khi n = 1 thì điều if(n/10) sai , do đó thoát điểm đệ quy bắt đầu in kết quả ra 1 trước , sau đó trả về lần đệ quy trước là 2,..... cho đến khi lần đầu tiên chạy ( tham số n = 12345 ) và in kết quả ra 5, đó là lý do bạn thấy kết quả bị ngược

  7. #7
    Ngày gia nhập
    01 2013
    Nơi ở
    Hà Nội
    Bài viết
    6

    ok. Rõ rồi. thank bạn nhé. t ko hiểu chỗ in ngược thôi. ^^

  8. #8
    Ngày gia nhập
    06 2007
    Nơi ở
    C:\WINDOWS\system32\dllcache\
    Bài viết
    3,007

    Trích dẫn Nguyên bản được gửi bởi baobka2012 Xem bài viết
    ok. Rõ rồi. thank bạn nhé. t ko hiểu chỗ in ngược thôi. ^^
    thử như này là hiểu luôn nè
    C++ Code:
    1. void Chuyen(int n)
    2. {
    3.     if(n<0)
    4.     {
    5.         cout<<"-";
    6.         n=-n;
    7.     }
    8.     cout<<"Chu so la: "<<(n%10)<<endl;
    9.     if(n/10) Chuyen(n/10);
    10. }
    ^_,^

    Facebook : https://www.facebook.com/langmaninternet

    Bùi Tấn Quang

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