Archive | Chương 08 – Trừu tượng hóa dữ liệu RSS for this section

[C] Điểm Oxy

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

  • Điểm trong mặt phẳng Oxy
    540 khai báo dữ liệu điểm OXY
    541 Nhập tọa độ điểm trong mặt phẳng
    542 Xuất tọa độ điểm trong mặt phẳng
    543 Tính khoảng cách giữa 2 điểm
    544 Tính khoảng cách 2 điểm theo phương Ox
    545 Tính khoảng cách 2 điểm theo phương Oy
    546 Tìm tọa độ điểm đối xứng qua gốc tọa độ
    547 Tìm điểm đối xứng qua trục hoành
    548 Tìm điểm đối xứng qua trục tung
    549 Tìm điểm đối xứng qua đường phân giác thứ 1 (y=x)
    550 Tìm điểm đối xứng qua đường phân giác thứ 2 (y=-x)
    551 Kiểm tra điểm thuộc phần tư thứ 1 ko?
    552 Kiểm tra điểm thuộc phần tư thứ 2 ko?
    553 Kiểm tra điểm thuộc phần tư thứ 3 ko?
    554 Kiểm tra điểm thuộc phần tư thứ 4 ko?

Code

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

#include <stdio.h>
#include <math.h>
//540 khai báo dữ liệu điểm OXY
struct Diem
{
    float fX;
    float fY;
};
//541 Nhập tọa độ điểm trong mặt phẳng
void Nhap(Diem &a)
{
    printf("Nhap X: ");
    scanf_s("%f",&a.fX);
    printf("Nhap Y: ");
    scanf_s("%f",&a.fY);
}
//542 Xuất tọa độ điểm trong mặt phẳng
void Xuat(Diem a)
{
    printf("<%.2f,%.2f>", a.fX,a.fY);
}
//543 Tính khoảng cách giữa 2 điểm
float KhoangCach2Diem(Diem a, Diem b)
{
    float X = pow((b.fX - a.fX),2);
    float Y = pow((b.fY - a.fY),2);
    return sqrt(X + Y);
}
//544 Tính khoảng cách 2 điểm theo phương Ox
float KhoangCach2DiemTheoOx(Diem a, Diem b)
{
    return fabs(a.fX - b.fX);
}
//545 Tính khoảng cách 2 điểm theo phương Oy
float KhoangCach2DiemTheoOy(Diem a, Diem b)
{
    return fabs(a.fY - b.fY);
}
//546 Tìm tọa độ điểm đối xứng qua gốc tọa độ
Diem DiemDoiXungQuaO(Diem a)
{
    Diem c;
    c.fX = -1*a.fX;
    c.fY = -1*a.fY;
    return c;
}
//547 Tìm điểm đối xứng qua trục hoành
Diem DiemDoiXungQuaOx(Diem a)
{
    Diem c;
    c.fX = 1*a.fX;
    c.fY = -1*a.fY;
    return c;
}
//548 Tìm điểm đối xứng qua trục tung
Diem DiemDoiXungQuaOy(Diem a)
{
    Diem c;
    c.fX = -1*a.fX;
    c.fY = 1*a.fY;
    return c;
}
//549 Tìm điểm đối xứng qua đường phân giác thứ 1 (y=x)
Diem DiemDoiXungQuaPhanGiac1(Diem a)
{
    Diem c;
    c.fX = 1*a.fY;
    c.fY = 1*a.fX;
    return c;
}
//550 Tìm điểm đối xứng qua đường phân giác thứ 2 (y=-x)
Diem DiemDoiXungQuaPhanGiac2(Diem a)
{
    Diem c;
    c.fX = -1*a.fY;
    c.fY = -1*a.fX;
    return c;
}
//551 Kiểm tra điểm thuộc phần tư thứ 1 ko?
bool KiemTraPhanTu1(Diem a)
{
    if (a.fX > 0 && a.fY >0)
        return true;
    return false;
}
//552 Kiểm tra điểm thuộc phần tư thứ 2 ko?
bool KiemTraPhanTu2(Diem a)
{
    if (a.fX < 0 && a.fY >0)
        return true;
    return false;
}
//553 Kiểm tra điểm thuộc phần tư thứ 3 ko?
bool KiemTraPhanTu3(Diem a)
{
    if (a.fX < 0 && a.fY <0)
        return true;
    return false;
}
//554 Kiểm tra điểm thuộc phần tư thứ 4 ko?
bool KiemTraPhanTu4(Diem a)
{
    if (a.fX > 0 && a.fY <0)
        return true;
    return false;
}
void main()
{
    Diem a, b;
    Nhap(a);
    Nhap(b);
    printf("\nDiem a: ");
    Xuat(a);
    printf("\nDiem b: ");
    Xuat(b);
    printf("\nKhoang cach 2 diem: %.2f", KhoangCach2Diem(a,b));
    printf("\nKhoang cach 2 diem theo Ox: %.2f", KhoangCach2DiemTheoOx(a,b));
    printf("\nKhoang cach 2 diem theo Oy: %.2f", KhoangCach2DiemTheoOy(a,b));
    Diem c;
    c = DiemDoiXungQuaO(a);
    printf("\nDiem doi xung qua O cua a: ");
    Xuat(c);
    c = DiemDoiXungQuaOx(a);
    printf("\nDiem doi xung qua Ox cua a: ");
    Xuat(c);
    c = DiemDoiXungQuaOy(a);
    printf("\nDiem doi xung qua Oy cua a: ");
    Xuat(c);
    c = DiemDoiXungQuaPhanGiac1(a);
    printf("\nDiem doi xung qua phan giac 1 cua a: ");
    Xuat(c);
    c = DiemDoiXungQuaPhanGiac2(a);
    printf("\nDiem doi xung qua phan giac 2 cua a: ");
    Xuat(c);
    if (KiemTraPhanTu1(a))
        printf("\na thuoc phan tu thu 1");
    else
        printf("\na ko thuoc phan tu thu 1");
    if (KiemTraPhanTu2(a))
        printf("\na thuoc phan tu thu 2");
    else
        printf("\na ko thuoc phan tu thu 2");
    if (KiemTraPhanTu3(a))
        printf("\na thuoc phan tu thu 3");
    else
        printf("\na ko thuoc phan tu thu 3");
    if (KiemTraPhanTu4(a))
        printf("\na thuoc phan tu thu 4");
    else
        printf("\na ko thuoc phan tu thu 4");
}
 

Link source:

[C] Số phức

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

  • Số phức
    532 Khai báo biểu diễn thông tin số phức
    533 Nhập số phức
    534 Xuất số phức
    535 Tính tổng 2 số phức
    536 Tính hiệu 2 số phức
    537 Tính tích 2 số phức
    538 Tính thương 2 số phức
    539 Tính lũy thừa bậc n số phức

Code

#include <stdio.h>
//532 Khai báo biểu diễn thông tin số phức
struct SoPhuc
{
    int iThuc;
    int iAo;
};
//533 Nhập số phức
void NhapSoPhuc(SoPhuc &a)
{
    printf("Nhap phan thuc: ");
    scanf_s("%d", &a.iThuc);
    printf("Nhap phan ao: ");
    scanf_s("%d", &a.iAo);
}
//534 Xuất số phức
void XuatSoPhuc(SoPhuc a)
{
    printf("%d+%di", a.iThuc,a.iAo);
}
//535 Tính tổng 2 số phức
SoPhuc TinhTong2SoPhuc(SoPhuc a, SoPhuc b)
{
    SoPhuc c;
    c.iThuc = a.iThuc + b.iThuc;
    c.iAo = a.iAo + b.iAo;
    return c;
}
//536 Tính hiệu 2 số phức
SoPhuc TinhHieu2SoPhuc(SoPhuc a, SoPhuc b)
{
    SoPhuc c;
    c.iThuc = a.iThuc - b.iThuc;
    c.iAo = a.iAo - b.iAo;
    return c;
}
//537 Tính tích 2 số phức
SoPhuc TinhTich2SoPhuc(SoPhuc a, SoPhuc b)
{
    SoPhuc c;
    c.iThuc = a.iThuc * b.iThuc - a.iAo * b.iAo;
    c.iAo = a.iThuc * b.iAo + a.iAo * b.iThuc;
    return c;
}
//538 Tính thương 2 số phức
SoPhuc TinhThuong2SoPhuc(SoPhuc a, SoPhuc b)
{
    SoPhuc c;
    c.iThuc = (a.iThuc * b.iThuc + a.iAo * b.iAo)/(b.iThuc*b.iThuc + b.iAo*b.iAo);    
    c.iAo = (b.iThuc * a.iAo - b.iAo * a.iThuc)/(b.iThuc*b.iThuc + b.iAo*b.iAo);
    return c;
}
//539 Tính lũy thừa bậc n số phức
SoPhuc LuyThuaBacN(SoPhuc a, int n)
{
    while (n!=0)
    {
        a = TinhTich2SoPhuc(a,a);
        n--;
    }
    return a;
}
void main()
{
    SoPhuc a;
    SoPhuc b;
    a.iThuc = 2;
    a.iAo = 5;
    b.iThuc = 1;
    b.iAo = 3;
} 

Link source:

Số phức
532 Khai báo biểu diễn thông tin số phức
533 Nhập số phức
534 Xuất số phức
535 Tính tổng 2 số phức
536 Tính hiệu 2 số phức
537 Tính tích 2 số phức
538 Tính thương 2 số phức
539 Tính lũy thừa bậc n số phức

[C] Hỗn số

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

  • Hỗn số
    523 Nhập hỗn số
    524 Xuất hỗn số
    525 Rút gọn hỗn số
    526 Tính tổng 2 hỗn số
    527 Tính hiệu 2 hỗn số
    528 Tính tích 2 hỗn số
    529 Tính thương 2 hỗn số
    530 Kiểm tra hỗn số tối giản
    531 Qui đồng 2 hỗn số

Code

/*Nick yahoo: conloyal*/
/*Soft: Visual studio 2008*/
#include <stdio.h>
//522 Khai báo dữ liệu để biểu diễn thông tin của một hỗn số
struct HonSo
{
    int iNguyen;
    int iTu;
    int iMau;
};
//523 Nhập hỗn số
void Nhap(HonSo &a)
{
    printf("\nNhap phan nguyen: ");
    scanf_s("%d",&a.iNguyen);
    printf("\nNhap tu so: ");
    scanf_s("%d",&a.iTu);
    printf("\nNhap mau so: ");
    scanf_s("%d",&a.iMau);
}
//524 Xuất hỗn số
void Xuat(HonSo a)
{
    printf("%d %d/%d", a.iNguyen, a.iTu, a.iMau);
}
//525 Rút gọn hỗn số
int UocChungLonNhat(int a, int b)
{
    while (a!=b)
    {
        if (a>b)
            a-=b;
        else
            b-=a;
    }
    return a;
}

HonSo RutGonHonSo(HonSo a)
{
    if (a.iTu > a.iMau)
    {
        int tam = a.iTu / a.iMau;
        a.iNguyen += tam;
        a.iTu -= a.iMau * tam;
    }
    int UCLN = UocChungLonNhat(a.iTu, a.iMau);
    a.iTu /= UCLN;
    a.iMau /= UCLN;
    return a;
}
//526 Tính tổng 2 hỗn số
HonSo TinhTong(HonSo a, HonSo b)
{
    HonSo c;
    c.iNguyen = a.iNguyen + b.iNguyen;
    c.iTu = a.iTu * b.iMau + a.iMau * b.iTu;
    c.iMau = a.iMau * b.iMau;
    return c;
}
//527 Tính hiệu 2 hỗn số
HonSo TinhHieu(HonSo a, HonSo b)
{
    HonSo c;
    c.iNguyen = a.iNguyen - b.iNguyen;
    c.iTu = a.iTu * b.iMau - a.iMau * b.iTu;
    c.iMau = a.iMau * b.iMau;
    return c;
}
//528 Tính tích 2 hỗn số
HonSo TinhTich(HonSo a, HonSo b)
{
    a.iTu = a.iTu + a.iNguyen*a.iMau;
    b.iTu = b.iTu + b.iNguyen*b.iMau;

    HonSo c;
    c.iNguyen = 0;
    c.iTu = a.iTu * b.iTu;
    c.iMau = a.iMau * b.iMau;
    c = RutGonHonSo(c);
    return c;
}
//529 Tính thương 2 hỗn số
HonSo TinhThuong(HonSo a, HonSo b)
{
    a.iTu = a.iTu + a.iNguyen*a.iMau;
    b.iTu = b.iTu + b.iNguyen*b.iMau;

    HonSo c;
    c.iNguyen = 0;
    c.iTu = a.iTu * b.iMau;
    c.iMau = a.iMau * b.iTu;
    c = RutGonHonSo(c);
    return c;
}
//530 Kiểm tra hỗn số tối giản
bool KtraHonSoToiGian(HonSo a)
{
    int UCLN = UocChungLonNhat(a.iTu, a.iMau);
    if (UCLN == 1)
        return true;
    return false;
}
//531 Qui đồng 2 hỗn số
void QuiDong2HonSo(HonSo &a, HonSo &b)
{
    HonSo c = a;
    a.iTu = a.iTu * b.iMau;
    a.iMau = a.iMau * b.iMau;
    b.iTu = b.iTu * c.iMau;
    b.iMau = c.iMau * b.iMau;
}
void main()
{
    HonSo a,b,c;
    Nhap(a);
    Nhap(b);
    printf ("\nHon so a: ");
    Xuat(a);
    printf ("\nHon so b: ");
    Xuat(b);

    a = RutGonHonSo(a);
    printf("\na sau khi rut gon: ");
    Xuat(a);
    
    printf("\nTong 2 hon so: ");
    Xuat(TinhTong(a,b));

    printf("\nHieu 2 hon so: ");
    Xuat(TinhHieu(a,b));

    printf("\nTich 2 hon so: ");
    Xuat(TinhTich(a,b));

    printf("\nThuong 2 hon so: ");
    Xuat(TinhThuong(a,b));

    if (KtraHonSoToiGian(a))
        printf("\nHon so a toi gian");
    else
        printf("\nHon so a chua toi gian");

    QuiDong2HonSo(a,b);
    printf("\na sau khi qui dong: ");
    Xuat(a);
    printf("\nb sau khi qui dong: ");
    Xuat(b);
}
  

Link source:

[C] Phân số

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

  • Phân số
    506 rút gọn phân số
    507 Tính tổng 2 phân số
    508 Tính hiệu 2 phân số
    509 Tính tích 2 phân số
    510 Tính thương 2 phân số
    511 Kiểm tra phân số tối giản
    512 Qui đồng phân số
    513 Kiểm tra phâ số dương
    514 Kiểm tra phâ số âm
    515 So sánh 2 phân số: hàm trả về 1 trong 3 giá trị: 0,-1,1
    516 Định nghĩa toán tử operator + cho 2 phân số
    517 Định nghĩa toán tử operator – cho 2 phân số
    518 Định nghĩa toán tử operator * cho 2 phân số
    519 Định nghĩa toán tử operator / cho 2 phân số
    520 Định nghĩa toán tử operator ++ cho 2 phân số
    521 Định nghĩa toán tử operator — cho 2 phân số

Code

#include <stdio.h>
#include <conio.h>
struct PhanSo
{
    float fTuSo;
    float fMauSo;
};
void NhapPhanSo(PhanSo &a)
{
    printf("Nhap Tu so: ");
    scanf_s("%f", a.fTuSo);
    printf("Nhap Mau so: ");
    scanf_s("%f", a.fMauSo);
}
void XuatPhanSo(PhanSo a)
{
    printf("%.2f / %.2f", a.fTuSo, a.fMauSo);
}
//506 rút gọn phân số
float UocSoChungLonNhat(float x, float y)
{
    while (x!=y)
    {
        if (x>y)
            x -= y;
        else
            y -=x;
    }
    return x;
}
PhanSo RutGonPhanSo(PhanSo a)
{
    float UCLN = UocSoChungLonNhat (a.fTuSo, a.fMauSo);
    a.fTuSo = a.fTuSo/UCLN;
    a.fMauSo = a.fMauSo/UCLN;
    return a;
}
//507 Tính tổng 2 phân số
PhanSo TinhTong2PhanSo(PhanSo a, PhanSo b)
{
    PhanSo kq;
    kq.fTuSo = a.fTuSo * b.fMauSo + a.fMauSo * b.fTuSo;
    kq.fMauSo = a.fMauSo * b.fMauSo;
    return kq;
}
//508 Tính hiệu 2 phân số
PhanSo TinhHieu2PhanSo(PhanSo a, PhanSo b)
{
    PhanSo kq;
    kq.fTuSo = a.fTuSo * b.fMauSo - a.fMauSo * b.fTuSo;
    kq.fMauSo = a.fMauSo + b.fMauSo;
    return kq;
}
//509 Tính tích 2 phân số
PhanSo TinhTich2PhanSo(PhanSo a, PhanSo b)
{
    PhanSo kq;
    kq.fTuSo = a.fTuSo * b.fTuSo;
    kq.fMauSo = a.fMauSo * b.fMauSo;
    return kq;
}
//510 Tính thương 2 phân số
PhanSo TinhThuong2PhanSo(PhanSo a, PhanSo b)
{
    PhanSo kq;
    kq.fTuSo = a.fTuSo * b.fMauSo;
    kq.fMauSo = a.fMauSo * b.fTuSo;
    return kq;
}
//511 Kiểm tra phân số tối giản
bool KiemTraPhanSoToiGian(PhanSo a)
{
    PhanSo c = RutGonPhanSo(a);
    if (c.fTuSo == a.fTuSo && c.fMauSo == a.fMauSo)
        return true;
    return false;
}


//512 Qui đồng phân số
void QuiDong2PhanSo(PhanSo &a, PhanSo &b)
{
    PhanSo c; 
    c.fTuSo = a.fTuSo;
    c.fMauSo = a.fMauSo;

    a.fTuSo *= b.fMauSo;
    a.fMauSo *= b.fMauSo;

    b.fTuSo *= c.fMauSo;
    b.fMauSo *= c.fMauSo;
}
//513 Kiểm tra phâ số dương
bool KiemTraPhanSoDuong(PhanSo a)
{
    if (a.fTuSo >=0 && a.fMauSo>0)
        return true;
    return false;
}
//514 Kiểm tra phâ số âm
bool KiemTraPhanSoAm(PhanSo a)
{
    if (a.fTuSo <0 || a.fMauSo<0)
        return true;
    return false;
}
//515 So sánh 2 phân số: hàm trả về 1 trong 3 giá trị: 0,-1,1
int SoSanh2PhanSo(PhanSo a, PhanSo b)
{
    float kq1 = a.fTuSo / a.fMauSo;
    float kq2 = b.fTuSo / b.fMauSo;
    if (kq1 < kq2)
        return -1;
    if (kq1 > kq2)
        return 1;
    return 0;
}
//516 Định nghĩa toán tử operator + cho 2 phân số
PhanSo operator +(PhanSo a, PhanSo b)
{
    PhanSo kq;
    kq.fTuSo = a.fTuSo * b.fMauSo + a.fMauSo * b.fTuSo;
    kq.fMauSo = a.fMauSo * b.fMauSo;
    return kq;
}
//517 Định nghĩa toán tử operator - cho 2 phân số
PhanSo operator -(PhanSo a, PhanSo b)
{
    PhanSo kq;
    kq.fTuSo = a.fTuSo * b.fMauSo - a.fMauSo * b.fTuSo;
    kq.fMauSo = a.fMauSo + b.fMauSo;
    return kq;
}
//518 Định nghĩa toán tử operator * cho 2 phân số
PhanSo operator *(PhanSo a, PhanSo b)
{
    PhanSo kq;
    kq.fTuSo = a.fTuSo * b.fTuSo;
    kq.fMauSo = a.fMauSo * b.fMauSo;
    return kq;
}
//519 Định nghĩa toán tử operator / cho 2 phân số
PhanSo operator /(PhanSo a, PhanSo b)
{
    PhanSo kq;
    kq.fTuSo = a.fTuSo * b.fMauSo;
    kq.fMauSo = a.fMauSo * b.fTuSo;
    return kq;
}
//520 Định nghĩa toán tử operator ++ cho 2 phân số
PhanSo operator ++ (PhanSo &a)
{
    a.fTuSo += a.fMauSo;
    return a;
}
//521 Định nghĩa toán tử operator -- cho 2 phân số
PhanSo operator ++ (PhanSo &a)
{
    a.fTuSo -= a.fMauSo;
    return a;
}

void main()
{
    PhanSo a;
    a.fTuSo = 5;
    a.fMauSo = 2;

    PhanSo b;
    b.fTuSo = 2;
    b.fMauSo=1;
    
    PhanSo c;

    //Xuat
    printf("\nPhan so a: ");
    XuatPhanSo(a);
    printf("\nPhan so b: ");
    XuatPhanSo(b);

    //506
    a = RutGonPhanSo(a);
    printf("\nSau khi rut gon phan so a: ");
    XuatPhanSo(a);
    b = RutGonPhanSo(b);
    printf("\nSau khi rut gon phan so b: ");
    XuatPhanSo(b);

    //507
    c = TinhTong2PhanSo(a,b);
    printf("\nTong 2 phan so: ");
    XuatPhanSo(c);

    //508
    c = TinhHieu2PhanSo(a,b);
    printf("\nHieu 2 phan so: ");
    XuatPhanSo(c);

    //509
    c = TinhTich2PhanSo(a,b);
    printf("\nTich 2 phan so: ");
    XuatPhanSo(c);
    
    //510
    c = TinhThuong2PhanSo(a,b);
    printf("\nThuong 2 phan so: ");
    XuatPhanSo(c);

    //511
    bool f = KiemTraPhanSoToiGian(a);
    if (f)
        printf("\nPhan so a toi gian roi");
    else
        printf("\nPhan so a chua toi gian");

    //512
    QuiDong2PhanSo(a,b);
    printf("\nSau khi qui dong");
    printf("\nPhan so a: ");
    XuatPhanSo(a);
    printf("\nPhan so b: ");
    XuatPhanSo(b);
}

Link source:

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