Câu lệnh so sánh 2 ký tự lập trình c
So sánh 2 ký tựCó ai biết hàm so sánh 2 ký tự trong C hay C++ ko? Hình như ko có thì phải? Chỉ có hàm strcmp() là so sánh 2 chuỗi thôi? Đây là phần 2 của bài học về Cấu trúc (Struct) trong C++. Để hiểu rõ bài viết này, mời bạn đọc hãy xem lại bài viết phần 1 tại đây. I. Hàm khởi tạo (Constructor)1. Hàm khởi tạo mặc định (Default constructor)Khi tạo ra một biến kiểu
8, ta thường đơn giản khai báo bằng cú pháp
9 (đã học ở bài trước). Tuy nhiên, trên thực tế khi ta tạo một biến cấu trúc, thì chương trình C++ đã ngầm gọi một hàm đặc biệt, có vai trò khởi tạo giá trị ban đầu cho các biến thành viên của
8, hàm này gọi là Hàm khởi tạo (Constructor). Lấy ví dụ, ta có một
8 BookBook như sau:
Nếu ta khai báo một biến kiểu Book,Book, theo cú pháp cơ bản ta sẽ viết:
Đối với cách khai báo này, một biến book1book1 được tạo ra mà không có các giá trị khởi tạo cho các trường của
8 BookBook. Tuy nhiên, khi ta tạo ra
8 Book,Book, thì phiên bản đầy đủ của nó sẽ là như sau:
Khi tạo một biến kiểu
8 mà không cung cấp giá trị khởi tạo cho các trường, một hàm khởi tạo mặc định sẽ được gọi, hàm này có vai trò khởi tạo các trường của biến tạo ra bằng giá trị mặc định của chúng (nếu có). Trong trường hợp này, hàm
5 là hàm khởi tạo mặc định của
8 sẽ được gọi, nhưng ta không cần viết hàm này khi khai báo
8 vì nó được gọi mặc định. Vì thế, khi ta thử in ra giá trị của các trường trong biến book1,book1, ta vẫn sẽ thu được kết quả id=0id = 0 và book_name=author=book\_name = author = xâu rỗng. 2. Hàm khởi tạo có tham số (Parameterized constructor)Khi muốn tạo ra các biến
8 đồng thời truyền vào dữ liệu luôn cho các trường thành viên, ta có thể sử dụng các hàm khởi tạo có tham số. Cú pháp hàm khởi tạo này như sau:
Chẳng hạn, nếu ta muốn một hàm khởi tạo trước các giá trị idid và book_namebook\_name cho
8 Book,Book, cú pháp như sau:
Và khi khởi tạo một biến
8, ta sẽ đồng thời truyền vào cho nó các giá trị tương ứng với hàm khởi tạo đã viết (vẫn có thể không dùng tham số, vì hàm khởi tạo mặc định vẫn tồn tại):
Lúc này, book1book1 sẽ có id=0id = 0 và các trường book_name,authorbook\_name, author là xâu rỗng; còn book2book2 sẽ có id=1id = 1 và trường book_name=book\_name =
1. Trong cùng một
8 có thể tồn tại nhiều hàm khởi tạo có tham số với số lượng tham số khác nhau, phục vụ cho các mục đích khởi tạo khác nhau. Với
8 BookBook nói trên, ta có thể thêm một vài hàm khởi tạo khác như sau:
Lúc này, ta có thể khởi tạo một biến kiểu BookBook theo 4 cách khác nhau:
Tuy nhiên, kĩ thuật này không cần thiết lắm trong các bài toán của lập trình thi đấu. Thay vào đó, ta có thể viết trực tiếp một hàm thành viên để nhập dữ liệu trong thân
8, các bạn sẽ hiểu rõ hơn qua phần II. II. Các hàm thành viên của StructKhông chỉ đơn giản là lưu trữ một bản ghi gồm nhiều dữ liệu khác nhau,
8 trong C++ còn có sức mạnh vô cùng to lớn trong việc cài đặt các cấu trúc dữ liệu tích hợp cùng các thao tác của nó. Hãy tưởng tượng các bạn có một cấu trúc thể hiện đối tượng "Con mèo". Một con mèo sẽ có các thông tin: Tên, tuổi, giống loài; và ta có thể thực hiện các hành động sau với một con mèo: Kêu, Đưa ra tên, Đưa ra giống loài và Tính giá tiền phụ thuộc vào giống loài. Tất cả những thông tin và hành động trên có thể được đóng gói lại trong một
8 thể hiện con mèo như sau:
Cách lập trình với
8 như trên là một phần của kĩ thuật Lập trình hướng đối tượng (OOPs), thường sẽ được đào tạo ở bậc Đại học. Trong kĩ thuật này, ta sẽ tạo ra một
8 đi kèm với các dữ liệu và các hành động sẽ thao tác với dữ liệu đó (dưới dạng các hàm thành viên của
8). Ở đây chúng ta chỉ học một phần rất nhỏ của kĩ thuật này để giúp cho việc sử dụng
8 được chuyên nghiệp và có nhiều ích lợi hơn. Sau khi tạo ra một
8 hoàn chỉnh như trên, giờ ta sẽ tạo ra một biến thể hiện một con mèo:
Các hàm thành viên của một
8 cũng được truy cập bằng toán tử
3 giống như các trường thông tin. Mỗi khi một biến kiểu CatCat được tạo ra, nó sẽ sở hữu toàn bộ các thông tin cũng như các hàm được cài đặt ở
8 CatCat:
0 Kết quả chạy đoạn chương trình:
1 Như vậy, mỗi khi chương trình phát sinh lỗi liên quan tới các biến thuộc kiểu Cat,Cat, ta sẽ chỉ tập trung sửa lỗi ở bên trong
8 CatCat mà thôi. Điều này giúp chương trình dễ dàng bảo trì, sửa lỗi, bởi vì khi cần thay đổi một phần của chương trình, ta chỉ cần tập trung sửa đổi logic của những
8 liên quan tới phần đó mà không cần quan tâm tới các
8 khác. III. Bài tập áp dụng1. Thao tác phân sốĐề bàiCho hai phân số ab\frac{a}{b} và cd\frac{c}{d}. Yêu cầu: Hãy in ra tổng, hiệu, tích và thương của hai phân số trên? Input:
Ràng buộc:
Output:
Sample Input:
2 Sample Output:
3 Ý tưởngĐây là một bài toán rất đơn giản, chúng ta hoàn toàn có thể khai báo một
8 thể hiện phân số, rồi viết các hàm đơn lẻ để thực hiện từng phép toán theo yêu cầu đề bài. Tuy nhiên, việc lập trình sẽ trở nên khoa học hơn, nếu như ta "đính kèm" các phép toán vào trong
8 thể hiện phân số, như vậy
8 này sẽ bao gồm luôn cả các thao tác cộng, trừ, nhân và chia hai phân số. Thậm chí cả thao tác nhập xuất dữ liệu cho phân số cũng nên được cài đặt dưới dạng một hàm thành viên trong
8. Trong code mẫu bên dưới, hai hàm nhập xuất sẽ được cài đặt luôn trong
8, vì thế nên hàm khởi tạo là không cần thiết. Khi nhập dữ liệu cho phân số, ta sẽ gọi hàm
3 thay vì nhập dữ liệu ở ngoài rồi khai báo phân số thông qua hàm khởi tạo. Các hàm tính toán sẽ được cài đặt một cách hơi đặc biệt:
Các cài đặt cụ thể khác, các bạn hãy xem ở code mẫu để hiểu rõ hơn! Code mẫu
4 2. Xử lý tam giácĐề bàiCho một tam giác trong mặt phẳng tọa độ OxyOxy. Mỗi đỉnh của tam giác được thể hiện bằng hoành độ và tung độ. Yêu cầu: Hãy tính diện tích tam giác, đồng thời cho biết tam giác này có dạng đều, vuông cân, cân, vuông hay thường? Input:
Ràng buộc:
Output:
Sample Input:
5 Sample Output:
6 Ý tưởngTrong bài toán này, có tới hai dạng dữ liệu có thể được trừu tượng hóa thành các
8: Điểm trên mặt phẳng tọa độ và Tam giác. |