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ố 14 kết quả

Đề tài: Tính khoảng cách giữa 2 ngày trong lập trình C

  1. #1
    Ngày gia nhập
    08 2008
    Bài viết
    15

    Mặc định Tính khoảng cách giữa 2 ngày trong lập trình C

    Mình nhập vào 2 ngày( gồm cả tháng và năm) sau đó tính khoảng cách giữa 2 ngày đó có bao nhiêu ngày.

    Mọi người giúp em thuật toán làm bài này với.thanks alot.

  2. #2
    Ngày gia nhập
    02 2008
    Nơi ở
    Việt Nam
    Bài viết
    577

    Mình nhập vào 2 ngày( gồm cả tháng và năm) sau đó tính khoảng cách giữa 2 ngày đó có bao nhiêu ngày.

    Mọi người giúp em thuật toán làm bài này với.thanks alot.
    Trả lời cùng với trích dẫn
    Mình không rõ có thuật toán nào đặc biệt để tính không, nhưng cách của mình là cứ tính bình thường thôi, lần lượt:

    - Khoảng cách năm này đến năm kia (tính cả năm nhuận),
    - Khoảng cách tháng này đến tháng kia (kết quả sẽ là âm hoặc dương, trong cái năm mà nhập sau ý),
    - Tính ngày này trên ngày kia (ngày trong cái tháng của thời gian nhập sau)

    Bạn cứ code thử xem sao, nêu không ổn đưa code lên để mọi người trao đổi.

    Have fun!

  3. #3
    Ngày gia nhập
    10 2007
    Nơi ở
    /root
    Bài viết
    318

    Tính số ngày từ 1/1/1900 đến ngày thứ nhất.
    Tính số ngày từ 1/1/1900 đến ngày thứ hai .
    Trừ cho nhau sẽ ra được khoảng cách 2 ngày .
    What you see is never what you get...

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

    ok để em làm thử rùi post lên nhờ mọi người chỉ giáo nhé.

  5. #5
    Ngày gia nhập
    02 2008
    Nơi ở
    Việt Nam
    Bài viết
    577

    Code sơ sơ thôi, mình chưa test thử nhiều TH đành nhờ mọi người test dùm vậy, Hàm TestDate cũng chưa viết cậu tự xem qua rồi bổ sung.
    C++ Code:
    1. #include <iostream>
    2. #include <cstdio>
    3. using namespace std;
    4.  
    5. void EnterDate(int &date, int &month, int &year);
    6. int TestDate();
    7. int LeapYear(int year);
    8.  
    9. int main()
    10. {
    11.     int date1, month1, year1;
    12.     cout<<"  - Enter date (dd/mm/yyyy) from: ";
    13.     EnterDate(date1,month1,year1);
    14.     int date2, month2, year2;
    15.     cout<<"  - Enter date (dd/mm/yyyy) to: ";
    16.     EnterDate(date2,month2,year2);
    17.     int dateOfYear=0,dateOfMonth=0, date=0;
    18.  
    19.     /* Tinh khoang cach so ngay giua 2 nam */
    20.     for (int i=year1;i<year2;i++)
    21.         if( LeapYear(i)) dateOfYear+=366;  //////
    22.         else dateOfYear+=365;
    23.  
    24.     /* Tinh khoang cach so ngay giua 2 thang */
    25.     int a[]={31,28,31,30,31,30,31,31,30,31,30,31};
    26.     if ( LeapYear(year2)) a[1]=29;           /////
    27.     if (month1>month2)
    28.     {
    29.         for (int i=month2;i<month1;i++)
    30.             dateOfMonth-=a[i-1];
    31.     }
    32.     else
    33.     {
    34.         for (int i=month1;i<month2;i++)
    35.             dateOfMonth+=a[i-1];
    36.     }
    37.  
    38.     /* Tinh khoang cach giua 2 ngay */
    39.     date=date2-date1+1;       //Ket qua tinh ca ngay cuoi cung
    40.  
    41.     cout<< "Result:   " << dateOfYear + dateOfMonth + date;
    42.     cout<<" date.";
    43.     return 0;
    44. }
    45.  
    46. void EnterDate(int &date, int &month, int &year)
    47. {
    48.     //cin>>date>>"/">>month>>"/">>year;
    49.     scanf("%d/%d/%d",&date,&month,&year);
    50. }
    51.  
    52. int LeapYear(int year)
    53. {
    54.     if (year % 400==0) return 1;
    55.     else if (year % 100!=0 && year % 4==0) return 1;
    56.     return 0;
    57. }

    *Edit: nên dùng struct thì hay hơn là nhập 3 biến như mình.
    Đã được chỉnh sửa lần cuối bởi QuangHoang : 01-10-2008 lúc 11:11 PM.

  6. #6
    Ngày gia nhập
    02 2008
    Nơi ở
    Việt Nam
    Bài viết
    577

    Mặc định Tính khoảng cách giữa 2 ngày trong lập trình C

    Bổ xung TestDate

    C++ Code:
    1. int TestDate(int date, int month, int year)
    2. {
    3.     int a[]={31,28,31,30,31,30,31,31,30,31,30,31};
    4.     if (LeapYear(year)) a[1]=29;
    5.     if (month < 1 || month >12) return 0;
    6.     if (date < 1 || date > a[month-1]) return 0;
    7.     return 1;
    8. }
    9.  
    10. void EnterDate(int &date, int &month, int &year)
    11. {
    12.     //cin>>date>>"/">>month>>"/">>year;
    13.     scanf("%d/%d/%d",&date,&month,&year);
    14.     if (!TestDate(date,month,year))
    15.     {
    16.         cout<<"  - Error, enter agian: ";
    17.         scanf("%d/%d/%d",&date,&month,&year);
    18.     }
    19. }

  7. #7
    Ngày gia nhập
    10 2008
    Bài viết
    1

    Tớ cũng đóng góp bài mới làm (theo kiểu hướng đối tượng)
    C++ Code:
    1. //Xay dung lop Date
    2. #include<iostream.h>
    3. #include<stdio.h>
    4. #include<math.h>
    5. #include<conio.h>
    6. class Date
    7.     {   int d,m,y;
    8.         public:
    9.             int songay(int y);
    10.             int isdate();
    11.             int TTngay();
    12.             void nhap();
    13.             void hienthi()
    14.                 {   cout<<d<<"/"<<m<<"/"<<y;
    15.                 }
    16.             double kc(Date d2);
    17.     };
    18. //kiem tra xem ngay co hop le k
    19. int Date::isdate()
    20.     {   int a[]={31,28,31,30,31,30,31,31,30,31,30,31};
    21.                 if (y%4==0&&y%100!=0||y%400==0) a[1]=29;
    22.                 if (m < 1 || m >12) return 0;
    23.                 if (d < 1 || d > a[m-1]) return 0;
    24.                 return 1;
    25.     }
    26. void Date::nhap()
    27.     {   cout<<"\n      dd mm yyyy: ";
    28.         tt:;
    29.         cin>>d>>m>>y;
    30.         if(!(isdate())) {cout<<"\Ban nhap sai! moi nhap lai"; goto tt;}
    31.     }
    32. //Tinh so thu tu cua ngay trong nam
    33. int Date::TTngay()
    34.     {   int ngaynam[2][12]={{31,29,31,30,31,30,31,31,30,31,30,31},{31,28,31,30,31,30,31,31,30,31,30,31}};
    35.         int i;
    36.         int s=d;
    37.         if(y%4==0&&y%100!=0||y%400==0) i=0;
    38.             else i=1;
    39.         for(int j=0;j<m-1;j++)  s+=ngaynam[i][j];
    40.         return s;
    41.     }
    42. //Tinh so ngay cua nam, neu nhuan la 365 khong nhuan la 366
    43. int Date::songay(int y)
    44.     {   if(y%4==0&&y%100!=0||y%400==0) return 365;
    45.         return 366;
    46.     }
    47. //Tinh khoang cach 2 ngay
    48. double Date::kc(Date N)
    49.     {   int d1=TTngay();
    50.         int d2=N.TTngay();
    51.         if(y==N.y) return(abs(d1-d2));
    52.         int s=0;
    53.         if(y<N.y)
    54.             {   d1=songay(y)-d1;
    55.                 for(int i=y+1;i<N.y;i++) s+=songay(i);
    56.                 return(s+d1+d2);
    57.             }
    58.         else
    59.             {   d2=songay(N.y)-d2;
    60.                 for(int i=N.y+1;i<y;i++) s+=songay(i);
    61.                 return(s+d1+d2);
    62.             }
    63.     }
    64. void main()
    65.     {   clrscr();
    66.         Date D1,D2,D3;
    67.         cout<<"\n Nhap ngay thu nhat: ";    D1.nhap();
    68.         cout<<"\n Nhap ngay thu hai:  ";    D2.nhap();
    69.         cout<<"\n Khoang cach giua hai ngay: "<<D1.kc(D2);
    70.         getch();
    71.     }
    Đã được chỉnh sửa lần cuối bởi dont_lucky1988 : 02-10-2008 lúc 09:08 PM.

  8. #8
    Ngày gia nhập
    09 2010
    Bài viết
    17

    Mình cũng góp thêm một bài vik dưới dạng struct ^_^
    C++ Code:
    1. //Khaibao.h
    2. #include    "iostream"
    3. using namespace std;
    4. typedef struct DATE
    5. {
    6.     int d;
    7.     int m;
    8.     int y;
    9. };
    10. void NhapDate(DATE &D);
    11. bool KiemTraDate(DATE D);
    12. void XuatDate(DATE D);
    13. DATE KhoangCachDate(DATE D1,DATE D2);
    14.  
    15. //Caidat.cpp
    16. void NhapDate(DATE &D)
    17. {
    18.     do
    19.     {           //Nhap vo ngay thang nam
    20.         cout<<"\nNhap vao ngay thang nam:\n";
    21.         cout<<"Nhap ngay: ";
    22.         cin>>D.d;
    23.         cout<<"Nhap thang: ";
    24.         cin>>D.m;
    25.         cout<<"Nhap nam: ";
    26.         cin>>D.y;
    27.                           //kiem tra xem co thoa dieu kien ko
    28.         if(KiemTraDate(D)==false)
    29.             cout<<"\nBan da nhap sai, moi ban nhap lai: ";
    30.         else
    31.             break;
    32.     }while(true);
    33. //Ham kiem tra ngay thang nam co thoa mang ko
    34. bool KiemTraDate(DATE D)
    35. {
    36.     //kiem tra ngay thang nam >0
    37.     if(D.m>0 && D.y>0 && D.d>0)
    38.     {  //Neu thang 2
    39.         if(D.m==2)
    40.         {   //kiem tra nam nhuan hay ko, neu la nam nhuan thi chia het cho 400 hoac chia het cho 4 va chia het cho 100
    41.             if((D.y/400==0) || (D.y%4==0 && D.y%100==0))
    42.             {
    43.                 if(D.d<=29)
    44.                     return true;
    45.                 else
    46.                     return false;
    47.             }
    48.             else
    49.             {
    50.                 if(D.d<29)
    51.                     return true;
    52.                 else
    53.                     return false;
    54.             }  
    55.         }
    56.         //thang 1,3,5,7,9,11 ko dc lon hon 31 ngay
    57.         if(D.m==1 || D.m==3 || D.m==5 || D.m==7 || D.m==9 || D.m==11)
    58.         {
    59.             if(D.d>31)
    60.                 return false;
    61.             else
    62.                 return true;
    63.         }  
    64.     //thang 4,6,8,10,12 ko dc lon hon 30 ngay
    65.         if(D.m==4 || D.m==6 || D.m==8 || D.m==10 || D.m==12)
    66.         {
    67.             if(D.d>30)
    68.                 return false;
    69.             else
    70.                 return true;
    71.         }  
    72.    
    73.     }
    74.     else
    75.         return false;
    76. }
    77. void XuatDate(DATE D)
    78. {
    79.     cout<<"\nThoi gian: Ngay "<<D.d<<" thang "<<D.m<<" nam "<<D.y;
    80. }
    81. DATE KhoangCachDate(DATE D1,DATE D2)
    82. {
    83.     int d1,m1,y1;
    84.     DATE temp;
    85.     d1=D1.d-D2.d;
    86.     if(d1>0)
    87.         temp.d=d1;
    88.     else
    89.         temp.d=d1*(-1);
    90.     m1=D1.m-D2.m;
    91.     if(m1>0)
    92.         temp.m=m1;
    93.     else
    94.         temp.m=m1*(-1);
    95.     y1=D1.y-D2.y;
    96.     if(y1>0)
    97.         temp.y=y1;
    98.     else
    99.         temp.y=y1*(-1);
    100.     return temp;
    101. }
    102.  
    103. //main.cpp
    104. void main()
    105. {  
    106.              DATE D1,D2,D;
    107.     NhapDate(D1);
    108.     XuatDate(D1);
    109.     NhapDate(D2);
    110.     XuatDate(D2);
    111.              cout<<"\nKhoang cach giua 2 ngay: ";
    112.     D=KhoangCachDate(D1,D2);
    113.     XuatDate(D);
    114. }
    Mọi người góp ý dùm mình nha ^^

  9. #9
    Ngày gia nhập
    04 2010
    Bài viết
    1,534

    Nếu ngày được chứa bằng 3 con số ngay, thang, nam thì
    thuật toán thường dùng cho C để tính ngay2 - ngay1 là:

    1. viết hàm SoNgayTrongThang(thang,nam) để tính xem tháng đó có bao nhiêu ngày

    2. Tính xem ngay1 là ngày thứ mấy trong năm (soNgay1), ngay2 là ngày thứ mấy trong năm (soNgay2).

    3. Tính số ngày kể từ nam1 đến nam2 (soNgayN1N2)

    4. khoảng cách = soNgay2 - soNgay1 + soNgayN1N2

    PHP Code:

    int SoNgayTrongThang
    (int thangint nam)
    {
       switch (
    thang)
       {
          case 
    2:
             return ((
    nam%!= || nam%100 == && nam%400 != 0)? 1)? 29 28;
          case 
    4: case 6: case 9: case 11:
             return 
    30;
          case 
    1: case 3: case 5: case 7: case 8: case 10: case 12:
             return 
    31;
          default:
             return 
    0;
       }
       return -
    1;
    }

    /* code trong main */
    int ng1 10th1 5nm1 1999;
    int ng2 1th2 3nm2 2009;
    int i;

    soNgay1 ng1/* bắt đầu từ ngày và cộng số ngày của các tháng trước đó */
    for (i=1th1i++) soNgay1 += SoNgayTrongThang(inm1);

    soNgay2 ng2/* bắt đầu từ ngày và cộng số ngày của các tháng trước đó */
    for (i=1th2i++) soNgay2 += SoNgayTrongThang(inm2);

    int soNgayN1N2 0;
    int *n1 = &nm1;
    int *n2 = &nm2;
    if (
    nm1 nm2/* mẹo nhỏ này dùng khi cần đếm từ số nhỏ đến số lớn */
    {  n1 n2n2 = &nm1;  }
    for (
    i=*n1< *n2i++) soNgayN1N2 += 365 SoNgayTrongThang(2,i) - 28;
    if (
    nm1 nm2soNgayN1N2 -= -1;
    int khoangCach soNgay2 soNgay1 soNgayN1N2

    Đây chỉ là thuật toán căn bản, nếu muốn dùng struct hay class thì cứ việc chỉnh sửa

    Chết, quên không để ý bài này cũ quá rồi bị moi lên - xin lỗi.
    Đã được chỉnh sửa lần cuối bởi VoTichSu : 26-11-2010 lúc 10:51 AM.

  10. #10
    Ngày gia nhập
    07 2015
    Bài viết
    1

    Trích dẫn Nguyên bản được gửi bởi dont_lucky1988 Xem bài viết
    Tớ cũng đóng góp bài mới làm (theo kiểu hướng đối tượng)
    C++ Code:
    1. //Xay dung lop Date
    2. #include<iostream.h>
    3. #include<stdio.h>
    4. #include<math.h>
    5. #include<conio.h>
    6. class Date
    7.     {   int d,m,y;
    8.         public:
    9.             int songay(int y);
    10.             int isdate();
    11.             int TTngay();
    12.             void nhap();
    13.             void hienthi()
    14.                 {   cout<<d<<"/"<<m<<"/"<<y;
    15.                 }
    16.             double kc(Date d2);
    17.     };
    18. //kiem tra xem ngay co hop le k
    19. int Date::isdate()
    20.     {   int a[]={31,28,31,30,31,30,31,31,30,31,30,31};
    21.                 if (y%4==0&&y%100!=0||y%400==0) a[1]=29;
    22.                 if (m < 1 || m >12) return 0;
    23.                 if (d < 1 || d > a[m-1]) return 0;
    24.                 return 1;
    25.     }
    26. void Date::nhap()
    27.     {   cout<<"\n      dd mm yyyy: ";
    28.         tt:;
    29.         cin>>d>>m>>y;
    30.         if(!(isdate())) {cout<<"\Ban nhap sai! moi nhap lai"; goto tt;}
    31.     }
    32. //Tinh so thu tu cua ngay trong nam
    33. int Date::TTngay()
    34.     {   int ngaynam[2][12]={{31,29,31,30,31,30,31,31,30,31,30,31},{31,28,31,30,31,30,31,31,30,31,30,31}};
    35.         int i;
    36.         int s=d;
    37.         if(y%4==0&&y%100!=0||y%400==0) i=0;
    38.             else i=1;
    39.         for(int j=0;j<m-1;j++)  s+=ngaynam[i][j];
    40.         return s;
    41.     }
    42. //Tinh so ngay cua nam, neu nhuan la 365 khong nhuan la 366
    43. int Date::songay(int y)
    44.     {   if(y%4==0&&y%100!=0||y%400==0) return 365;
    45.         return 366;
    46.     }
    47. //Tinh khoang cach 2 ngay
    48. double Date::kc(Date N)
    49.     {   int d1=TTngay();
    50.         int d2=N.TTngay();
    51.         if(y==N.y) return(abs(d1-d2));
    52.         int s=0;
    53.         if(y<N.y)
    54.             {   d1=songay(y)-d1;
    55.                 for(int i=y+1;i<N.y;i++) s+=songay(i);
    56.                 return(s+d1+d2);
    57.             }
    58.         else
    59.             {   d2=songay(N.y)-d2;
    60.                 for(int i=N.y+1;i<y;i++) s+=songay(i);
    61.                 return(s+d1+d2);
    62.             }
    63.     }
    64. void main()
    65.     {   clrscr();
    66.         Date D1,D2,D3;
    67.         cout<<"\n Nhap ngay thu nhat: ";    D1.nhap();
    68.         cout<<"\n Nhap ngay thu hai:  ";    D2.nhap();
    69.         cout<<"\n Khoang cach giua hai ngay: "<<D1.kc(D2);
    70.         getch();
    71.     }
    năm nhuận là 366 ngày bạn ơi

Các đề tài tương tự

  1. bài toán tìm các ước số của k trong khoảng [a,b]
    Gửi bởi bethaophuong2004 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 5
    Bài viết cuối: 23-05-2016, 10:17 PM
  2. Điện Tử Thái Thắng chuyên cung cấp ống nhòm đo khoảng cách, máy đo khoảng cách
    Gửi bởi thaithangtelecom trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 1
    Bài viết cuối: 28-07-2013, 09:04 PM
  3. ADO.NET Tạo report trong khoảng thời gian tự chọn trong c# 2010
    Gửi bởi vanthaophamit trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 3
    Bài viết cuối: 26-06-2012, 03:55 PM
  4. Bài tập C++ Cách tạo ra số ngẫu nhiên trong 1 khoảng nào đó trong Turbo C?
    Gửi bởi anhducvt08 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 11
    Bài viết cuối: 13-05-2011, 12:07 AM
  5. em muốn tìm các ước của số k trong khoảng a,b
    Gửi bởi bethaophuong2004 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 3
    Bài viết cuối: 09-03-2009, 03:59 PM

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