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?

đề bài: Nhập 1 chuỗi ký tự từ bàn phím. Sắp xếp rồi in ra màn hình Do ko so sánh đc 2 ký tự nên m` so ánh bằng mã ascii. Nhg ko ổn lắm???

include

include

include

void main() { //clrscr(); char a[20]; int n; char tg; cout<<"Nhap chuoi: ";cin>>a; for (int i=0;itoascii(a[i])) { char tg=a[i]; a[i]=a[j]; a[j]=tg; } } cout<<"chuoi sau sx la: "< Mọi ng` xem phần sắp xếp cho m` nha

Câu lệnh so sánh 2 ký tự lập trình c
Biết là sai rùi nhg ko biết sửa

Đâ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

Book book1;

8, ta thường đơn giản khai báo bằng cú pháp

Book book1;

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

Book book1;

8, hàm này gọi là Hàm khởi tạo (Constructor).

Lấy ví dụ, ta có một

Book book1;

8 BookBook như sau:

struct Book
{
    int id;
    string book_name, author;
};

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:

Book book1;

Đố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

Book book1;

8 BookBook. Tuy nhiên, khi ta tạo ra

Book book1;

8 Book,Book, thì phiên bản đầy đủ của nó sẽ là như sau:

struct Book
{
    int id;
    string book_name, author;
    Book()
    {
        id = 0;
        book_name = author = ""; // Chuỗi rỗng.
    }
};

Khi tạo một biến kiểu

Book book1;

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

struct Book
{
    int id;
    string book_name, author;
    Book()
    {
        id = 0;
        book_name = author = ""; // Chuỗi rỗng.
    }
};

5 là hàm khởi tạo mặc định của

Book book1;

8 sẽ được gọi, nhưng ta không cần viết hàm này khi khai báo

Book book1;

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

Book book1;

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:

{Tên_struct}({Danh_sách_tham_số_truyền_vào})
{
    {Khởi_tạo_các_trường_bằng_tham_số_tương_ứng};    
}

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

Book book1;

8 Book,Book, cú pháp như sau:

struct Book
{
    int id;
    string book_name, author;
    Book(int _id, string _book_name)
    {
        id = _id;
        book_name = _book_name;
    }
};

Và khi khởi tạo một biến

Book book1;

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):

Book book1; // Sử dụng hàm khởi tạo mặc định.
Book book2(1, "Đất rừng phương Nam"); // Sử dụng hàm khởi tạo có tham số.

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 =

{Tên_struct}({Danh_sách_tham_số_truyền_vào})
{
    {Khởi_tạo_các_trường_bằng_tham_số_tương_ứng};    
}

1.

Trong cùng một

Book book1;

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

Book book1;

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:

struct Book
{
    int id;
    string book_name, author;
    Book(int _id)
    {
        id = _id;    
    }
    Book(int _id, string _book_name)
    {
        id = _id;
        book_name = _book_name;
    }
    Book(int _id, string _book_name, string _author)
    {
        id = _id;
        book_name = _book_name;
        author = _author;
    }
};

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:

Book book1; // Constructor mặc định.
Book book2(1); // Constructor số 1.
Book book3(2, "Đất rừng phương Nam"); // Constructor số 2.
Book book4(3, "Lều chõng", "Ngô Tất Tố"); // Constructor số 3.

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

Book book1;

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 Struct

Không chỉ đơn giản là lưu trữ một bản ghi gồm nhiều dữ liệu khác nhau,

Book book1;

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

Book book1;

8 thể hiện con mèo như sau:

struct Cat
{
    string name;
    int age;
    string type;
    Cat(string _name, int _age, string _type)
    {
        name = _name;
        age = _age;
        type = _type;
    }
    void shout()
    {
        cout << "Meow...meow" << endl;
    }
    void get_name()
    {
        cout << name << endl;    
    }
    void get_type()
    {
        cout << type << endl;
    }
    int get_cost()
    {
        if (type == "Short-haired")
            return 10000;
        else if (type == "Long-haired")
            return 20000;
        else if (type == "Short-legged")
            return 30000;
    }
};

Cách lập trình với

Book book1;

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

Book book1;

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

Book book1;

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

Book book1;

8 được chuyên nghiệp và có nhiều ích lợi hơn.

Sau khi tạo ra một

Book book1;

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:

Cat cat1("Tom", "2", "Short-haired");

Các hàm thành viên của một

Book book1;

8 cũng được truy cập bằng toán tử

struct Book
{
    int id;
    string book_name, author;
    Book(int _id, string _book_name)
    {
        id = _id;
        book_name = _book_name;
    }
};

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 ở

Book book1;

8 CatCat:

Book book1;

0

Kết quả chạy đoạn chương trình:

Book book1;

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

Book book1;

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

Book book1;

8 liên quan tới phần đó mà không cần quan tâm tới các

Book book1;

8 khác.

III. Bài tập áp dụng

1. Thao tác phân số

Đề bài

Cho 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:

  • Một dòng duy nhất chứa bốn số nguyên a,b,c,da, b, c, d.

Ràng buộc:

  • 1≤a,b,c,d≤1001 \le a, b, c, d \le 100.

Output:

  • In ra trên bốn dòng, mỗi dòng là một phân số lần lượt thể hiện tổng - hiệu - tích - thương của hai phân số đã cho. Các kết quả không cần phải tối giản.

Sample Input:

Book book1;

2

Sample Output:

Book book1;

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

Book book1;

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

Book book1;

8 thể hiện phân số, như vậy

Book book1;

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

Book book1;

8.

Trong code mẫu bên dưới, hai hàm nhập xuất sẽ được cài đặt luôn trong

Book book1;

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

Book book1; // Sử dụng hàm khởi tạo mặc định.
Book book2(1, "Đất rừng phương Nam"); // Sử dụng hàm khởi tạo có tham số.

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:

  • Do tổng, hiệu, tích và thương của hai phân số cũng lại là một phân số, nên các hàm thao tác sẽ có kiểu trả về chính là kiểu phân số (ở đây là

    Book book1;

    8 FracFrac).
  • Trong các hàm này, tham số truyền vào lại là một phân số khác (biến otherother). Tức là khi gọi hàm cộng của phân số f1f_1 chẳng hạn, thì thực tế ta cần cộng f1f_1 với một phân số f2f_2. Vì vậy, các hàm này sẽ có tham số thể hiện rằng phép tính này được thực hiện giữa hai

    Book book1;

    8 cùng kiểu FracFrac. Các tham số được truyền kiểu tham chiếu để đẩy nhanh tốc độ chương trình, và thêm từ khóa

    Book book1; // Sử dụng hàm khởi tạo mặc định. Book book2(1, "Đất rừng phương Nam"); // Sử dụng hàm khởi tạo có tham số.

    6 để tránh bất kì sự thay đổi nào tác động lên tham số thực sự ở bên ngoài.
  • Kết quả của các hàm sẽ được lưu vào một phân số, nên ta lại khai báo một biến kiểu FracFrac để lưu kết quả, rồi trả ra chính biến đó cho hàm. Hoặc có thể trả về kết quả bằng cặp dấu

    Book book1; // Sử dụng hàm khởi tạo mặc định. Book book2(1, "Đất rừng phương Nam"); // Sử dụng hàm khởi tạo có tham số.

    7 để thể hiện kết quả có nhiều hơn 11 trường dữ liệu.

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

Book book1;

4

2. Xử lý tam giác

Đề bài

Cho 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:

  • Gồm ba dòng, mỗi dòng gồm hai số nguyên x,yx, y thể hiện tọa độ một đỉnh của tam giác.

Ràng buộc:

  • ∣x∣,∣y∣≤100|x|, |y| \le 100.
  • Dữ liệu đảm bảo ba đỉnh cho trước tạo thành một tam giác.

Output:

  • Dòng đầu tiên in ra diện tích tam giác, làm tròn tới 22 chữ số sau dấu chấm thập phân.
  • Dòng thứ hai in ra dạng của tam giác là

    Book book1; // Sử dụng hàm khởi tạo mặc định. Book book2(1, "Đất rừng phương Nam"); // Sử dụng hàm khởi tạo có tham số.

    8,

    Book book1; // Sử dụng hàm khởi tạo mặc định. Book book2(1, "Đất rừng phương Nam"); // Sử dụng hàm khởi tạo có tham số.

    9,

    struct Book {

    int id;  
    string book_name, author;  
    Book(int _id)  
    {  
        id = _id;  
    }  
    Book(int _id, string _book_name)  
    {  
        id = _id;  
        book_name = _book_name;  
    }  
    Book(int _id, string _book_name, string _author)  
    {  
        id = _id;  
        book_name = _book_name;  
        author = _author;  
    }  
    
    };

    0,

    struct Book {

    int id;  
    string book_name, author;  
    Book(int _id)  
    {  
        id = _id;  
    }  
    Book(int _id, string _book_name)  
    {  
        id = _id;  
        book_name = _book_name;  
    }  
    Book(int _id, string _book_name, string _author)  
    {  
        id = _id;  
        book_name = _book_name;  
        author = _author;  
    }  
    
    };

    1 hoặc

    struct Book {

    int id;  
    string book_name, author;  
    Book(int _id)  
    {  
        id = _id;  
    }  
    Book(int _id, string _book_name)  
    {  
        id = _id;  
        book_name = _book_name;  
    }  
    Book(int _id, string _book_name, string _author)  
    {  
        id = _id;  
        book_name = _book_name;  
        author = _author;  
    }  
    
    };

    2 tương ứng.

Sample Input:

Book book1;

5

Sample Output:

Book book1;

6

Ý tưởng

Trong 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

Book book1;

8: Điểm trên mặt phẳng tọa độ và Tam giác.