[C] Ngày

Tác giả:

  • Trần Hán Huy – tranhanhuy.wordpress.com

Sách:

  • Bài tập kĩ thuật lập trình C/C++ – Nguyễn Tấn Trần Minh Khang

Đề bài

  • Ngày
  • 593 Khai báo dữ liệu biểu diễn ngày
  • 594 Nhập ngày
  • 595 Xuất ngày theo định dạng (ng/th/nm)
  • 596 Kiểm tra năm nhuận
  • 597 Tính số thứ tự ngày trong năm
  • 598 Tính số thứ tự ngày kể từ ngày 1/1/1
  • 599 Tìm ngày khi biết năm và số thứ tự của ngày trong năm
  • 600 Tìm ngày khi biết số thứ tự ngày từ năm 1/1/1
  • 601 Tìm ngày kế tiếp
  • 602 Tìm ngày hôm trước
  • 603 Tìm ngày kế đó k ngày
  • 604 Tìm ngày hôm trước k ngày
  • 605 Khoảng cách giữa 2 ngày
  • 606 So sánh 2 ngày

Code

/*Nick yahoo: conloyal*/
/*Soft: visual studio 2008*/

#include <stdio.h>
//593 Khai báo dữ liệu biểu diễn ngày
struct Ngay
{
    int iNgay;
    int iThang;
    int iNam;
};
//594 Nhập ngày
void NhapNgay(Ngay &a)
{
    printf("Nhap ngay: ");
    scanf_s("%d",&a.iNgay);
    printf("Nhap thang: ");
    scanf_s("%d",&a.iThang);
    printf("Nhap nam: ");
    scanf_s("%d",&a.iNam);
}
//595 Xuất ngày theo định dạng (ng/th/nm)
void XuatNgay(Ngay a)
{
    printf("%d/%d/%d", a.iNgay, a.iThang, a.iNam);
}
//596 Kiểm tra năm nhuận
bool KiemTraNamNhuan(Ngay a)
{
    if (a.iNam%4==0 && a.iNam%100!=0)
        return true;
    if (a.iNam%400==0)
        return true;
    return false;
}
bool KiemTraNamNhuan(int i)
{
    if (i%4==0 && i%100!=0)
        return true;
    if (i%400==0)
        return true;
    return false;
}
//597 Tính số thứ tự ngày trong năm
int STTNgayTrongNam(Ngay a)
{
    int n[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
    if (KiemTraNamNhuan(a))
        n[1] = 29;
    int stt = 0;
    for (int i=0; i<a.iThang-1; i++)
        stt += n;
    return stt + a.iNgay;
}
//598 Tính số thứ tự ngày kể từ ngày 1/1/1
int STTNgay(Ngay a)
{
    int stt = 0;
    for(int i=1; i<a.iNam; i++)
    {
        if (KiemTraNamNhuan(i))
            stt+=366;
        else
            stt+=365;
    }
    return stt + STTNgayTrongNam(a);
}
//599 Tìm ngày khi biết năm và số thứ tự của ngày trong năm
int TimNgay(int iNam, int iSTT)
{
    int n[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
    if (KiemTraNamNhuan(iNam))
        n[1] = 29;
    for (int i=0; i<12; i++)
    {
        if (n < iSTT)
            iSTT -= n;
        else
            break;
    }
    return iSTT;
}
//600 Tìm ngày khi biết số thứ tự ngày từ năm 1/1/1
int TimNgay(int iSTT)
{
    int iNam = 1;
    while(1)
    {
        if (KiemTraNamNhuan(iNam))
        {
            if (iSTT > 366)
                iSTT -= 366;
            else
                return TimNgay(iNam,iSTT);
        }
        else
        {
            if (iSTT > 365)
                iSTT -= 365;
            else
                return TimNgay(iNam,iSTT);
        }
        iNam++;
    }
    return -1;
}
//601 Tìm ngày kế tiếp
Ngay TimNgayKeTiep(Ngay a)
{
    bool flag =false;
    if (a.iNgay == 30 || a.iNgay == 31)
    {
        flag = true;
        a.iNgay =1;
    }
    if (a.iThang == 2)
    {
        if (KiemTraNamNhuan(a))
        {
            if (a.iNgay == 29)
            {
                a.iNgay = 1;
                flag = true;
            }
        }
        else
        {
            if (a.iNgay == 28)
            {
                a.iNgay = 1;
                flag = true;
            }
        }
    }
    if (flag)
    {
        a.iThang++;
        if (a.iThang == 13)
        {
            a.iThang = 1;
            a.iNam ++;
        }
    }
    else
        a.iNgay++;
    return a;
}
//602 Tìm ngày hôm trước
Ngay TimNgayHomTruoc(Ngay a)
{
    if (a.iNgay == 1)
    {
        switch(a.iThang)
        {
            case 1: case 2: case 4:case 6:case 8:case 9:case 11:
                {
                    a.iNgay = 31;
                    a.iThang --;
                    if (a.iThang == 0)
                    {
                        a.iThang = 12;
                        a.iNam -- ;
                    }
                    break;
                }
            case 3:
                {
                    if (KiemTraNamNhuan(a))
                    {
                        a.iNgay = 29;
                    }
                    else
                    {
                        a.iNgay = 28;
                    }
                    a.iThang = 2;
                    break;
                }
            default :
                {
                    a.iNgay = 30;
                    a.iThang--;
                }
        }
    }
    else
        a.iNgay--;
    return a;
}
//603 Tìm ngày kế đó k ngày
Ngay TimNgayKeTiepKNgay(Ngay a, int k)
{
    while(k>0)
    {
        a = TimNgayKeTiep(a);
        k--;
    }
    return a;
}
//604 Tìm ngày hôm trước k ngày
Ngay TimNgayHomTruocKNgay(Ngay a, int k)
{
    while(k>0)
    {
        a = TimNgayHomTruoc(a);
        k--;
    }
    return a;
}
//605 Khoảng cách giữa 2 ngày
int KhoangCach2Ngay(Ngay a, Ngay b)
{
    int STTa = STTNgay(a);
    int STTb = STTNgay(b);
    if (STTa > STTb)
        return STTa-STTb;
    return STTb-STTa;
}
//606 So sánh 2 ngày
int SoSanh2Ngay(Ngay a, Ngay b)
{
    int STTa = STTNgay(a);
    int STTb = STTNgay(b);
    if (STTa > STTb)
        return 1;
    if (STTa == STTb)
        return 0;
    return -1;
}
void main()
{
    Ngay a;
    NhapNgay(a);
    printf("\nNgay: ");
    XuatNgay(a);

    if (KiemTraNamNhuan(a))
        printf("\nLa nam nhuan");
    else
        printf("\nKhong phai nam nhuan");

    printf("\nSTT ngay trong nam: %d", STTNgayTrongNam(a));
    printf("\nSTT ngay tu ngay 1 thang 1 nam 1: %d", STTNgay(a));
    printf("\nTim ngay biet nam 2010, stt 273: %d", TimNgay(2010,273));
    printf("\nTim ngay biet stt tu 1/1/1: %d", TimNgay(734046));
    printf("\nNgay ke tiep : ");
    XuatNgay(TimNgayKeTiep(a));
    printf("\nNgay hom truoc : ");
    XuatNgay(TimNgayHomTruoc(a));
    printf("\nNgay ke tiep 5 ngay: ");
    XuatNgay(TimNgayKeTiepKNgay(a,5));
    printf("\nNgay hom truoc 5 ngay: ");
    XuatNgay(TimNgayHomTruocKNgay(a,5));
} 

Link source:

Leave a comment