Hiển thị các bài đăng có nhãn C Programing. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn C Programing. Hiển thị tất cả bài đăng

Đa năng hóa toán tử "<<" && ">>"

Posted by with No comments

//Chỗ dành cho comment cá nhân, nhưng hiện tại chưa có comment!







============================================

Chap ?? : Đa năng hóa toán tử "<<" và ">>"


I. Tìm hiểu về ý nghĩa của << và >> trong việc xuất nhập trong C++ 
Tìm hiểu về 2 toán tử << >>
Trong C : nó là toán tử 2 ngôi, khi tham số là 2 số nguyên thì được biết với cái tên dịch bit

Trong C++ :
Ngày hôm nay học về toán tử << và toán tử >> . Lúc đầu cảm thấy rất khó hiểu, về sau quyết định về nhà tìm hiểu bằng được họ hàng và gốc rễ thằng toán tử này mới được. Và sau 3h ngồi đọc mấy cái file .h ở trong thư mục BC. Đã phát hiện ra rất nhiều điều lý thú sau đây :
1. Xèng khẳng định đây là 1 toán tử bình thường có 2 toán hạng tham gia. Nó ko phải là 1 thứ đặc biết gắn liền với cin như các bạn nghĩ. Có nghĩa là ko phải cứ >> là phải đi liền với cin và << phải đi cùng với cout. 
>> và << là 1 toán tử bình thường như + - * / mà trong đó cin, cout là 1 trong 2 thành phần tham gia vào phép toán mà thôi.
Ví dụ : a+b :đây là phép toán bao gồm 2 thành phần là a và b
cin>>a :đây là phép toán bao gồm 2 thành phần là cin và a
chứng minh :
Xèng viết đoạn code sau và nó chạy hoàn toàn đúng : 


#include 
#include 
class phanso    {        private:
            int t// tu            int m// mau        public:            friend void operator>>(phanso &,istream &);            friend void operator<<(phanso,ostream&);    };
void operator>>(phanso &x,istream &is)    {
        is>>x.t>>x.m;    }
void operator<<(phanso x,ostream &os)    {
        os<<x.t<<"/"<<x.m;    }
void main(void)    {
        clrscr();        phanso a;        a>>cin;        a<<cout;
        getch();    }  

Tại sao xèng lại cố tình để kiểu dữ liệu trả về là void tôi sẽ trình bày ở đoạn dưới. 
Tại sao xèng lại cố tình thay đổi vị trí của 2 thành phần tham gia, tại sao xèng lại a>>cin??
Vì xèng muốn khẳng định với các bạn rằng đây là 2 toán tử hoàn toàn bình thường như + - * / mà thôi. Nội tại nó ko có quy tắc gì đặc biệt cả.
Cái đặc biệt nằm trong thằng cin, cout. Thằng cin, cout nó có kiểu dữ liệu là istream và ostream.
Xèng đã đổi vị trí 2 thành phần và dùng a>>cin và a< để chứng tỏ rằng, toán từ này hoàn toàn bình thường, ko phải bị gò bó trong 1 quy tắc.




2. Giải thích thành phần 2 tham số : 
Ta có : istream & operator >> (istream& is, phanso &x)
Ta thấy rõ ràng ở đây có 2 tham số. 
1 là is có kiểu dữ liệu là istream& tương ứng với cin.
cin được định nghĩa trong iostream như sau : 

istream_withassign _Cdecl cin;  

Vì vậy khi ta cin>>a chính là ta truyền thằng cin vào và trở thành toán hạng đầu tiên, a là toán hạng tiếp theo

#include 
#include 
class phanso
    
    {
        private:
            
        private:            int t// tu
            
            int m// mau
        
        public:
            
            friend void operator>>(istream &,phanso &);
    };
    };void operator>>( istream &isphanso &x)
    {
        
    {        is>>x.t>>x.m;
        
        //cin>>x.t>>x.m
    
    }

void main(void)
    {
        
    {        clrscr();
        
        phanso a;
    
                      
                          cin>>a;
        
        getch();
    }  
    }  
Dùng cin hay is ?
Cái ta sẽ truyền vào chính là cin.
Nếu is ở đây chỉ là 1 tham biến hình thức, khi ta gọi cin>>a thì cin được truyền vào. Và cái is>>x.t>>x.m; lúc nãy cũng đơn giản chính là cin>>x.t>>x.m
Ok?
3. Giải thích tại sao phải trả về kiểu dữ liệu istream & và việc return
Như đã thấy ở trên. Xèng có thể dùng kiểu dữ liệu void. Nó vẫn hoàn toàn đúng. Ko có gì sai cả. vậy tại sao người ta ( thầy phạm văn ất, thầy quách tuấn ngọc) lại để kiểu dữ liệu trả về là istream &. 
Điều đầu tiên ở bài 1 ,2 trên của xèng chỉ có thể dùng cin với 1 đối tượng chứ ko thể cin liên tiếp nhiều đối tượng. ko thể cin>>a>>b được. ha ha ha. 

Nếu đổi về như này istream & operator>>( istream &is, phanso &x)) và return is thì lại có thể cin>>a>>b liên tiếp được
Giải thích nha 

#include 
#include 
class phanso
    
    {
        private:
            
        private:            int t// tu
            
            int m// mau
        
        public:
            
            friend istream operator>>(istream &,phanso &);
    };
    };istream operator>>( istream &isphanso &x)
    {
        
    {        is>>x.t>>x.m;
        
        //cin>>x.t>>x.m
                      
                      return is;
    }
    }
void main(void)
    {
        
    {        clrscr();
        
        phanso a,b,c;
    
                      
                          cin>>a>>b>>c;
        
        getch();
    }  
    }  

cin>>a>>b>>c;
+ đầu tiên : 1 biểu thức toàn toán tử >> , toán tử này được ưu tiên thực hiện từ trái qua phải.
+ Vậy cin>>a được thực hiện trước. >> đã được đa năng hóa, thực hiện với 2 thành phần, thành phần 1 là cin và a
+ Sau đó return is cái gì được return ???? chính là cin. Vậy cin được trả về.
Biểu thức lúc này trở thành : (a đã được nhập)
cin>>b>>c
+ biểu thức vẫn toàn toán tử >> , toán tử này được ưu tiên thực hiện từ trái qua phải. vậy cin>>b tiếp tục được thực hiện và trả về cin. Sau khi nhập xong b thì trả về cin và biểu thức lại trở thành cin>>c;
Hj hj hj hj
Ok?


More linh tinh thêm: ngoài ra chúng ta hoàn toàn có thể dùng cerr và clog để in ra màn hình 

#include 
using namespace std;

void main()
{
    
{    cerr<<"abc";
    
    clog<<"egd";
}  
}  

đây cũng là 2 đối tượng khác


II. Bản chất của nó
+ nó là toán tử 2 ngôi
+ giá trị trả về : khi đa năng hóa toán tử này chúng ta thường trả về tham chiếu đến cin và cout
+ thứ tự ưu tiên của nó từ trái sang phải
==> phép đa năng hóa không bắt buộc phải trả về
==> phép đa năng hóa bắt buộc phải có 1 tham số nếu là phương thức của lớp
==> phép đa năng hóa bắt buộc phải có 2 tham số nếu là global function 

III. Code đa năng hóa mẫu

#include
using namespace std;#include
  class phanso{private:    int tu; // tuso    int mau; // mausopublic:    friend istream& operator>>(istream &,phanso &);    friend ostream& operator<<(ostream&,const phanso &);};istream& operator>>(istream &is,phanso &x){    return is>>x.tu>>x.mau;}ostream& operator<<(ostream &os,const phanso &x){    return os<<x.tu<<"/"<<x.mau;}void main(void){    phanso a;    cin>>a;    cout<<a;     getch();} 

IV. Chú ý và ngoại lệ
chú ý quan trọng vô cùng khi làm việc với toán tử đó là thứ tự ưu tiên và chiều ưu tiên của toán tử

IV. Mở rộng

endl, hex, oct được định nghĩa như nào ?

hôm nay có người hỏi tôi câu hỏi rất hay như này
endl nó được định nghĩa như này ?

ostreamendl ostreamos )
{
       
{       os.push('\n');
       return 
       return os;
}  
}   
vậy thì câu lệnh 
cout<
ko hiểu thằng endl được truyền tham số vào như nào 

câu hỏi khá hay và khá ảo, bạn ơi vấn đề là thằng toán tử << có 1 hàm overload như này
tôi demo lại cho dễ hiểu nha

friend ostreamoperator<<(ostream &osostream& (*p)(ostream&) )
{
       return 
{       return p(os);
}  
}  

Nguồn: http://diendan.congdongcviet.com/threads/t24853::ban-chat-cua-toan-tu-gt-gt-lt-lt-kha-nang-da-nang-hoa-gt-gt-lt-lt-cpp-toan-tu-xuat-nhap.cpp 

Chi tiết về đệ quy trong C/C++

Posted by with No comments


1. Khái niệm:

Đệ quy là trong thân hàm có một lời gọi đến chính nó ( chính hàm đó) tường minh, hoặc không tường minh.

2. Phân loại:

Đệ quy có 5 loai:
        + Đệ quy tuyến tính: là trong thân một hàm có một lời gọi đến chính nó.
        + Đệ quy nhị phân: là trong thân một hàm có duy nhất 2 lời gọi đến chính nó.
        + Đệ quy hỗ tương: là trong thân một hàm có một lời gọi đến một hàm nào đó, mà trong hàm đó có một lời gọi đến hàm này.
        + Đệ quy phi tuyến: là hàm đệ quy được đặt trong thân vòng lặp.
        + Đệ quy đôi

4. Một vài ưu nhược điểm:

Đệ quy tốn bộ nhớ hơn vì gọi hàm nhiều lần, và cần bộ nhớ đệm để lưu giá trị trả về của từng lần gọi hàm đó. Vì vậy nếu bài toán có thể giải quyết nhanh gọn bằng những cách khác thì chúng ta nên ưu tiên những cách đó hơn là dùng đệ quy. Tuy nhiên, có những bài toán mà những cách thông thường khó có thể giải được (Tháp Hà Nội, Fibo, ...) thì dùng đệ quy là phương án tối ưu nhất.

5. Video bài giảng chi tiết ( sưu tầm)



Tài liệu hay về C/C++ và Bài tập hay và khó

Posted by with No comments
Một số đề bài mình có lấy trên các trang giải bài trực tuyến như URIOnlineJudge, UVa, POJ... v.v..nữa đó nha :smiley:.. Mình nghĩ mọi người cùng thảo luận về những bài toán như thế này sẽ rất hay và sẽ cải thiện được tư duy trong lập trình. Đừng thấy khó mà nản chí nha, nếu vậy bạn đã là người thất bại khi theo con đường lập trình :smile: khó không giải được thì tìm những bài dễ mà làm .[QUAN TRỌNG LÀ PHẢI CÓ ĐAM MÊ !]




Trước tiên là công cụ để lập trình, khuyến khích các bạn dùng code::block nha!
Download tại đây (khuyến nghị download bản "...mingw-setup.exe"):http://www.codeblocks.org/downloads/26709
hoặc dùng Visual studio tùy bạn :smiley: 

Đây là một số tài liệu hay về C/C++ mình tổng hợp từ internet cho các bạn tham khảo. Dành cho người mới bắt đầu và cả người "bắt đầu từ lâu" :smiley: Xem trước và chọn một tài liệu phù hợp với mình rồi đọc nhé. Đừng có download miên man về rồi không biết đọc quyển nào -> LOẠN !
Tài liệu hay để luyện OLP - (Có tài liệu của Lê Minh Hoàng + Tra cứu thư viện offline + ...)1.2k
C (AptechWorldWide)346
Giáo trình C căn bản (HaNoiAptech)726
Algorithms - Jeff Erickson152
Introduction to C++ - (Massachusetts Institute of Technology)205
C++ How to Program (8th Edition)337
Kỹ thuật lập trình - Phạm Văn Ất643
Practical C++ Programming215
Thinking in C++, Volume 1, 2nd Edition179
Thinking in C++, Volume 2, 2nd Edition88
Teach Yourself C++ in One Hour a Day 7th108
The ANSI C Programming Language - Ritchie & Kernighan84
Beginning C++ Through Game Programming (3rd Edition)160
C++ Programming From Problem Analysis to Program Design [5th Edition]133
Head First C86
Algorithms (4th Edition)118
C++ CookBook165
Data Structures And Algorithms in C++ (2nd Edition)137
Data Structures and Program Design in C++86
Ivor Horton's Beginning Visual C++ 201057
C++ Language Tutorial160
Illustrating C (ANSI_ISO version) - Donald Alcock67
Bài tập C giải sẵn (1)1.4k
Bài tập C giải sẵn (2)776
Lê Minh Hoàng - 150 bài toán tin787
Ngôn ngữ lập trình C++ - Tự học1.1k
Sẽ còn cập nhật thêm !

... CÒN ĐÂY LÀ PHẦN CHÍNH CỦA TOPIC NÀY !!

1 - Bài toán Cấp số cộng?
2 - Số đối xứng lớn nhất?
3 - Kiểm tra xem số đã cho có là SỐ HOÀN HẢO hay không?
4 - THỨ 6 NGÀY 13
5 - Kiểm tra xem dãy có phải là một dãy hoán vị hay không?
6 - Liên quan đến số đối xứng?
7 - Đếm số phần tử lớn thứ 2 trong dãy?
8 - Tìm phần tử chung?
9 - Dãy tam giác bao nhau?
10 - [Tách từ]Bài toán liên quan đến ký tự?107
11 - Đếm số lượng xâu lặp?105
12 - Cơ hội thắng cho người chơi DOMINO?
13 - Bài toán liên quan đến can - chi trong âm lịch?
14 - Bài toán liên quan đến xử lý số?
15 - Tìm và đếm “bộ 3” ký tự xuất hiện nhiều nhất trong xâu?
16 - Cùng giải bài này nhé! :smiley: đơn giản mà phải không?170
17 - Những người tặng quà?
18 - Chấm điểm cho học sinh?
19 - Dãy số nguyên tố?
20 - Dò mìn, Đếm số lượng mìn 8 ô xung quanh?
21 - Kiểm tra phép toán ĐÚNG hay SAI?60
22 - Mã hóa truyền tín hiệu số?90
23 - Số dư chia 9?88
24 - Phân số tối giản?
25 - Đếm số chính phương?125
26 - Thám hiểm60
27 - Bài toán về cái ĐỒNG HỒ?207
28 - [Cơ bản] - Tính giá trị biểu thức?
29 - Giải phương trình trùng phương?
30 - [Cơ bản] - Bàn cờ vua?
31 - Tính giá trị biểu thức? (2)
32 - [Cơ bản] - Xử lý với số nguyên?
33 - Tính biểu thức phân số?
34 - Số chữ số 0 tận cùng của n!?
35 - Dãy số FIBONACCI?
36 - [Cơ bản] - Giai thừa kép?
37 - [Adhoc] - Nói bằng con số?
38 - Sắp xếp ELLO của các kỳ thủ?
39 - Tam giác thần bí?
40 - Tìm từ khóa trong ô chữ?
41 - Bài toán xác định phương hướng? 
42 - "Chữ" nguyên tố156
Sẽ còn được cập nhật !
Cho 1 cái máy tính fx570 plus để khi cần kiểm tra các phép toán :smiley: pin nó xuống taskbar sẽ rất tiện lợi
nếu không chạy được thì thử vào folder "support" và cài "vcredist_x86.exe"


Nguồn: https://daynhauhoc.com