Tìm kiếm tên trong danh sách

Em có 1 mảng string gồm danh sách các họ và tên, chẳng hạn như

string list[]={'Nguyen van A', 'Nguyen van B', 'Le Van A', 'Dao van A'}

Gợi ý giúp em ý tưởng để khi tìm kiếm tên A, thì nó in ra 3 cái tên Nguyen Van A, Le Van A, Dao Van A.
Em cảm ơn ạ

2 Likes

Em muốn dùng ngôn ngữ gì?

Em dùng C++ ạ.

//Chỗ này là em viết cho đủ 20 ký tự để đc reply bài

Trong C++, std::string có hỗ trợ phương thức find. Khi tìm kiếm, nếu tìm thấy thì phương thức string::find sẽ trả về vị trí đầu tiên tìm thấy chuỗi. Nếu không tìm thấy thì string::find sẽ trả về std::string::npos tương đương với -1.

Em xem ví dụ dưới đây.

#include <iostream>
#include <string>

main()
{
    std::string list[]={"Nguyen van A", "Nguyen van B", "Le Van A", "Dao van A"};
    for(int i = 0; i < 4; ++i)
        if (list[i].find("A") != std::string::npos)
            std::cout << list[i] << std::endl;
    return 0;
}
1 Like

Có 1 trường hợp có thể xảy ra.
Ví dụ lúc gặp 1 thằng tên Nguyễn A B. Nhưng mình tìm những thằng tên A thì sao?. Nó vẫn in ra thằng nguyễn A B này?
Vậy phải làm sao kiểm tra A có ở cuối String đó hay không.

3 Likes

Khi đó mình sử dụng std::string::find_last_of để tìm vị trí xuất hiện cuối cùng của A. Xem nó có phải ở cuối chuỗi không. Trường hợp này phức tạp hơn, nên phải nghiên cứu sao cho phù hợp với bài toán của mình.

2 Likes

Cái này khó thật. Em có ý tưởng tách từng string trong list ra rồi kiểm tra từng string 1 mà còn khó hơn nữa :))).

Hehe,Em tìm ra cách rồi anh, tách ra từng string có chứa A rồi kiểm tra xem nó có ở cuối k?. Ở đây em lấy độ dài -1 vì là A. Em thay = Quan rồi trừ 4 vẫn đúng ^^

#include <iostream>
#include <string>

main()
{
    std::string list[]={"Nguyen van A", "Nguyen A B", "Le Van A", "Dao van A"};
    std::string str2 = "Quan"; // 4
    for(int i = 0; i < 4; ++i){
    	if (list[i].find("A") != std::string::npos){
    		// kiem tra A co o cuoi list[i] hay khong
    			if(list[i][list[i].length() -1 ] =='A'){
    				//in ra
    				std::cout<<list[i]<<std::endl;
    			}
    		//	
    		
    		//in ra list[i]
    	//	std::cout<<list[i].length()<<std::endl;
    	}
    }
        
    return 0;
}

@ltd

2 Likes

Nhưng mà khổ cái phải kiểm tra từng ký tự nếu là Quân. -1 -2 -3 -4 lần lượt = n a u Q. haha.
làm sao kiểm tra

  list[i] = str2; // "Quan"
#include <iostream>
#include <string>

main()
{
    std::string list[]={"Nguyen van A Van", "Nguyen van A B", "Le Van A", "Dao van A"};
    std::string firstName = "Van";
    for(int i = 0; i < 4; ++i) {
        std::string fullName = list[i];
        int nFirstName = fullName.find_last_of(firstName);
        if (fullName.length() - 1 == nFirstName)
            std::cout << list[i] << std::endl;
    }
            
    return 0;
}

Thử với cái này được không @Is2IT

2 Likes

Đúng rồi anh ^^. Done! clos topic =)))

1 Like

Xem lại vẫn không đủ anh ạ. Chắc vẫn phải kiểm tra hết đủ các chữ luôn.
Nếu list string là cái này.

  std::string list[]={"Nguyen van A van", "Nguyen van A Ban", "Le Van An", "Dao van On"};

Nó sẽ in ra hết các thằng có tận cùng là chữ “n”.

Ừm, a hiểu sai lệnh find_last_of lệnh này so sánh ký tự, không phải chuỗi.

Vậy giờ em dùng strtok để tách chuỗi ra thành nhiều chuỗi nhỏ, rồi dùng strcmp để so sánh chuỗi cuối cùng(tức tên).

1 Like

Tách ra có vẻ nhanh hơn. Em làm cách khác, kiểm tra xem firstName ở vị trí nào.

firstName.pos() + với độ dài firstName.length() = fullName.length(); //đúng
1 Like

Lúc trưa đi ngủ quên chưa up code. Anh @ltd xem đúng không.

#include <iostream>
#include <string>

main()
{
    std::string list[]={"Nguyen Van Ngoc", "Nguyen Ngoc Ban", "Ngoc Van An", "Dao Nhan"};
    std::string firstName = "Ngoc";
    
    for(int i = 0; i < 4; ++i) {
    	if (list[i].find(firstName) != std::string::npos){
    		std::string fullName = list[i];
                // tìm vị trí "Ngọc" xuất hiện cuối cùng trong fullName	
    		int d = fullName.rfind(firstName);
                // Nếu "Ngọc" là firstName thì + Ngọc.length() = size(fullName)
    		if(d+firstName.length() == fullName.length()) 
    			std::cout<<fullName;
   		}
    }      
    return 0;
}
2 Likes

Ẹc, quên chưa sửa chỗ find(“Van”) của anh Đạt =)). Done!

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?