Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 11 kết quả

Đề tài: [help] tìm chuỗi con có định dạng date trong chuỗi cha

  1. #1
    Ngày gia nhập
    03 2017
    Bài viết
    11

    Mặc định [help] tìm chuỗi con có định dạng date trong chuỗi cha

    Chào mọi người,
    mình vào thẳng đề bài nhé, đề như sau :
    Cho chuỗi cha s1, viết hàm tìm trong s1 có chứa chuỗi con dạng date (dd/mm/yy) hay không,nếu có thì xuất chuỗi con đó.
    Cảm ơn.

    - - - Nội dung đã được cập nhật ngày 27-12-2017 lúc 08:47 PM - - -

    mọi người góp ý cho e với, e cạn ý tưởng rồi @@
    Đã được chỉnh sửa lần cuối bởi congdongc041 : 29-12-2017 lúc 07:39 PM.

  2. #2
    Ngày gia nhập
    02 2016
    Bài viết
    267

    Giải thuật:
    1. dùng hàm strtok để tách chuỗi ra từng nhóm theo dấu cách
    2. dò từng nhóm, lần lượt với các điều kiện sau:
    - ký tự thứ 3 và 6 là '/'
    - dài 8 ký tự
    - xét 3 nhóm ký tự, 2 ký tự đầu trong khoảng "01" - "31", 2 ký tự giữa trong khoảng "01" - "12"
    - là một ngày hợp lệ (ví dụ 30/02/17 không phải là ngày hợp lệ)
    Lưu ý là cách xét theo dễ đến khó. Nếu không thỏa điều kiện đầu thì không cần xét đến các điều kiện sau.

    Bạn cũng có thể dùng Regex, nhưng nếu bạn đã biết dùng thì đã không hỏi bài này.
    Đã được chỉnh sửa lần cuối bởi NguNhuheo : 28-12-2017 lúc 10:17 AM.

  3. #3
    Ngày gia nhập
    03 2017
    Bài viết
    11

    Trích dẫn Nguyên bản được gửi bởi NguNhuheo Xem bài viết
    Giải thuật:
    1. dùng hàm strtok để tách chuỗi ra từng nhóm theo dấu cách
    2. dò từng nhóm, lần lượt với các điều kiện sau:
    - ký tự thứ 3 và 6 là '/'
    - dài 8 ký tự
    - xét 3 nhóm ký tự, 2 ký tự đầu trong khoảng "01" - "31", 2 ký tự giữa trong khoảng "01" - "12"
    - là một ngày hợp lệ (ví dụ 30/02/17 không phải là ngày hợp lệ)
    Lưu ý là cách xét theo dễ đến khó. Nếu không thỏa điều kiện đầu thì không cần xét đến các điều kiện sau.

    Bạn cũng có thể dùng Regex, nhưng nếu bạn đã biết dùng thì đã không hỏi bài này.

    như này ổn chưa bác
    Code:
    #include<stdio.h>
    #include<conio.h>
    #include<string.h>
    #include<cstdlib>
    
    bool kiemTraDinhDang(char *s);
    bool kiemTraChuoi(char *s);
    void xuatChuoiDinhDangDate(char s[100]);
    
    bool kiemTraDinhDang(char *s)
    {
    	int d, m, y;
    	char*context;
    	d = atoi(strtok_s(s, ", ", &context));
    	m = atoi(strtok_s(s + 3, ", ", &context));
    	y = atoi(strtok_s(s + 6, ", ", &context));
    	if (d < 1 || d>31)
    		return false;
    	if (m < 1 || m>31)
    		return false;
    	if (y < 1)
    		return false;
    	return true;
    }
    bool kiemTraChuoi(char *s)
    {
    	if (s[2] == '/' && s[5] == '/' &&strlen(s) == 8)
    		return true;
    	return false;
    }
    void xuatChuoiDinhDangDate(char s[100])
    {
    	char* kyTuTach = " ";
    	char* context = NULL;
    	char* tachChuoi = strtok_s(s, kyTuTach, &context);
    	while (tachChuoi != NULL)
    	{
    		if (kiemTraChuoi(tachChuoi) && kiemTraDinhDang(tachChuoi))
    			printf("\n%s", tachChuoi);
    		tachChuoi = strtok_s(NULL, " ", &context);
    	}
    }
    
    int main()
    {
    	char s[100] = "hom nay ngay 28/10/17 ngay sai la 27/10/17 va ngay ke tiep la 29/10/18";
    	xuatChuoiDinhDangDate(s);
    	_getch();
    	return 0;
    }

  4. #4
    Ngày gia nhập
    08 2017
    Bài viết
    541

    Trích dẫn Nguyên bản được gửi bởi congdongc041 Xem bài viết
    như này ổn chưa bác
    ...
    C Code:
    1. //...
    2. bool kiemTraDinhDang(char *s){
    3.     int d, m, y;
    4.     char*context;
    5.  
    6.     d = atoi(strtok_s(s, ", ", &context));
    7.     m = atoi(strtok_s(s + 3, ", ", &context));
    8.     y = atoi(strtok_s(s + 6, ", ", &context));
    9.  
    10.     if (d < 1 || d>31) return false; //day - ngày - copy.
    11.     if (m < 1 || m>31) return false; //month - tháng - paste (1)
    12.     if (y < 1) return false; //year .... (2)
    13.     //... Các trường hợp khác (3)
    14.     return true;
    15. }
    16. //...

    Note - chú thích:
    (1) tháng từ 01 đến 12 thôi
    (2) ngày của năm không cố định 365 ngày hoặc 366 ngày
    (3) số ngày trong tháng không cố định 31, 20, 28 hay 29 ngày (hỏi học sinh cấp 1 xem)

  5. #5
    Ngày gia nhập
    03 2017
    Bài viết
    11

    Trích dẫn Nguyên bản được gửi bởi Monre Xem bài viết
    C Code:
    1. //...
    2. bool kiemTraDinhDang(char *s){
    3.     int d, m, y;
    4.     char*context;
    5.  
    6.     d = atoi(strtok_s(s, ", ", &context));
    7.     m = atoi(strtok_s(s + 3, ", ", &context));
    8.     y = atoi(strtok_s(s + 6, ", ", &context));
    9.  
    10.     if (d < 1 || d>31) return false; //day - ngày - copy.
    11.     if (m < 1 || m>31) return false; //month - tháng - paste (1)
    12.     if (y < 1) return false; //year .... (2)
    13.     //... Các trường hợp khác (3)
    14.     return true;
    15. }
    16. //...

    Note - chú thích:
    (1) tháng từ 01 đến 12 thôi
    (2) ngày của năm không cố định 365 ngày hoặc 366 ngày
    (3) số ngày trong tháng không cố định 31, 20, 28 hay 29 ngày (hỏi học sinh cấp 1 xem)
    đề bài chỉ yêu cầu đúng định dạng date( dd/mm/yy ) thôi chứ không có yêu cầu date đó phải hợp lệ nên e không chú trọng phần đó, chỉ bỏ vào cho có lệ thôi bác ạ
    e chú trọng code và độ phức tạp của giải thuật tốt nhất có thể, bác có ý tưởng nào có thể góp ý cho e đc không

  6. #6
    Ngày gia nhập
    07 2011
    Bài viết
    429

    Mặc định [help] tìm chuỗi con có định dạng date trong chuỗi cha

    5 dòng là được rồi

    C++ Code:
    1. #include <iostream>
    2. #include <regex>
    3. #include <string>
    4.  
    5. int main()
    6. {
    7.     std::string s = "Today is 31/12/1999, tommorrow is 01/01/2000."
    8.         "Another sample date: 05/08/2017, and another: "
    9.         "27/04/2015... Month 8/2015. Day 12. Invalid date: 2017/01/09."
    10.         "Wed, Jun 13, 1999. Catch this invalid date: 32/19/2015";
    11.    
    12.     std::regex date_re("\\d{2}/\\d{2}/\\d{4}");
    13.     auto beg = std::sregex_iterator(begin(s), end(s), date_re);
    14.     auto end = std::sregex_iterator();
    15.     for (; beg != end; ++beg)
    16.         std::cout << beg->str() << "\n";
    17. }

  7. #7
    Ngày gia nhập
    08 2017
    Bài viết
    541

    Trích dẫn Nguyên bản được gửi bởi congdongc041 Xem bài viết
    đề bài chỉ yêu cầu đúng định dạng date( dd/mm/yy ) thôi chứ không có yêu cầu date đó phải hợp lệ nên e không chú trọng phần đó, chỉ bỏ vào cho có lệ thôi bác ạ
    e chú trọng code và độ phức tạp của giải thuật tốt nhất có thể, bác có ý tưởng nào có thể góp ý cho e đc không
    Sao lắm người hoang tưởng thế!
    Cái ngay trước mắt không thấy, đòi thấy tương lai - tai ương

  8. #8
    Ngày gia nhập
    02 2016
    Bài viết
    267

    Trích dẫn Nguyên bản được gửi bởi INTP Xem bài viết
    5 dòng là được rồi

    C++ Code:
    1. #include <iostream>
    2. #include <regex>
    3. #include <string>
    4.  
    5. int main()
    6. {
    7.     std::string s = "Today is 31/12/1999, tommorrow is 01/01/2000."
    8.         "Another sample date: 05/08/2017, and another: "
    9.         "27/04/2015... Month 8/2015. Day 12. Invalid date: 2017/01/09."
    10.         "Wed, Jun 13, 1999. Catch this invalid date: 32/19/2015";
    11.    
    12.     std::regex date_re("\\d{2}/\\d{2}/\\d{4}");
    13.     auto beg = std::sregex_iterator(begin(s), end(s), date_re);
    14.     auto end = std::sregex_iterator();
    15.     for (; beg != end; ++beg)
    16.         std::cout << beg->str() << "\n";
    17. }
    Lý do tại sao dòng 13 và 14 không gộp luôn vào dòng 15 được vậy?

  9. #9
    Ngày gia nhập
    07 2011
    Bài viết
    429

    dài quá có gộp cũng phải ngắt dòng...

  10. #10
    Ngày gia nhập
    02 2016
    Bài viết
    267

    Trích dẫn Nguyên bản được gửi bởi INTP Xem bài viết
    dài quá có gộp cũng phải ngắt dòng...
    Chỉ liên quan đến số dòng thôi sao?

    Trường phái (style) viết code quản lý được (manageable code) của bạn đặt nặng về số dòng.
    Trường phái của tôi đặt nặng về tầm vực (scope) của biến
    Hai biến beg và end có tầm vực trong cả khối main. Nếu đặt vào dòng 15 thì tầm vực của chúng sẽ giới hạn trong khối for ấy thôi.

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