Thông tin tài liệu
Bài tập thực hành Cấu trúc dữ liệu và giải thuật GVHD: Nguyễn Hữu Nhân Trang 1 THỰC HÀNH CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT CẤU TRÚC // CauTrucNgay.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <conio.h> #include <stdio.h> #include <math.h> #include <string.h> // Khai bao kieu NGAY struct ngay { int ngay; int thang; int nam; }; typedef struct ngay NGAY; // Nguyen mau ham int KiemTraNamNhuan(int nam); int TinhSoNgayTrongThang(int thang, int nam); int KiemTraHopLe(NGAY ng); void Nhap(NGAY &ng); void Xuat(NGAY ng, char *thongbao); int TinhSTTNgayTrongNam(NGAY ng); int TinhSTTNgay(NGAY ng); NGAY TinhNgayHomTruoc(NGAY ng); NGAY TinhNgayHomSau(NGAY ng); NGAY TinhNgayTruoc(NGAY ng, int k); NGAY TinhNgaySau(NGAY ng, int k); int TinhKhoangCach(NGAY ng1, NGAY ng2); int SoSanh(NGAY ng1, NGAY ng2); void main() Bài tập thực hành Cấu trúc dữ liệu và giải thuật GVHD: Nguyễn Hữu Nhân Trang 2 { NGAY ng1, ng2; Nhap(ng1); Xuat(ng1, "Ngay 1: "); Nhap(ng2); Xuat(ng2, "Ngay 2: "); if (KiemTraNamNhuan(ng1.nam) == 1) printf("Nam %d la nam nhuan\n", ng1.nam); else printf("Nam %d khong la nam nhuan\n", ng1.nam); printf("Ngay 1 la ngay thu %d trong nam %d\n", TinhSTTNgayTrongNam(ng1), ng1.nam); printf("Ngay 1 la ngay thu %d ke tu 1/1/1\n", TinhSTTNgay(ng1)); Xuat(TinhNgayHomTruoc(ng1), "Ngay hom truoc cua Ngay 1 la: "); Xuat(TinhNgayHomSau(ng1), "Ngay hom sau cua Ngay 1 la: "); int k; printf("Nhap k: "); scanf("%d", &k); Xuat(TinhNgayTruoc(ng1, k), "Ngay truoc k ngay cua Ngay 1 la: "); Xuat(TinhNgaySau(ng1, k), "Ngay sau k ngay cua Ngay 1 la: "); int n = TinhKhoangCach(ng1, ng2); if (n < 0) printf("Ngay 1 truoc ngay 2 %d ngay\n", -n); else printf("Ngay 1 sau ngay 2 %d ngay\n", n); } Bài tập thực hành Cấu trúc dữ liệu và giải thuật GVHD: Nguyễn Hữu Nhân Trang 3 // Dinh nghia ham int KiemTraNamNhuan(int nam) { if (nam % 400 == 0 || (nam % 4 == 0 && nam % 100 != 0)) return 1; return 0; } int TinhSoNgayTrongThang(int thang, int nam) { int songay; switch (thang) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: songay = 31; break; case 4: case 6: case 9: case 11: songay = 30; break; case 2: if (KiemTraNamNhuan(nam) == 1) songay = 29; else songay = 28; break; default: songay = 0; Bài tập thực hành Cấu trúc dữ liệu và giải thuật GVHD: Nguyễn Hữu Nhân Trang 4 } return songay; } int KiemTraHopLe(NGAY ng) { int hople = 1; if (ng.nam <= 0) hople = 0; else if (ng.thang < 1 || ng.thang > 12) hople = 0; else if (ng.ngay < 1 || ng.ngay > TinhSoNgayTrongThang(ng.thang, ng.nam)) hople = 0; return hople; } void Nhap(NGAY &ng) { int hople; do { printf("Nhap ngay: "); scanf("%d", &ng.ngay); printf("Nhap thang: "); scanf("%d", &ng.thang); printf("Nhap nam: "); scanf("%d", &ng.nam); hople = KiemTraHopLe(ng); Bài tập thực hành Cấu trúc dữ liệu và giải thuật GVHD: Nguyễn Hữu Nhân Trang 5 if (!hople) printf("Nhap lai! Ngay khong hop le.\n"); } while(!hople); } void Xuat(NGAY ng, char *thongbao) { printf("%s", thongbao); printf("%d/%d/%d\n", ng.ngay, ng.thang, ng.nam); } int TinhSTTNgayTrongNam(NGAY ng) { int stt = 0; // Tinh tong so ngay cac thang truoc do for (int i=1; i<ng.thang; i++) stt = stt + TinhSoNgayTrongThang(i, ng.nam); stt = stt + ng.ngay; return stt; } int TinhSTTNgay(NGAY ng) { int stt = 0; // Tinh tong so ngay cac nam truoc do for (int i=1; i<ng.nam; i++) if (KiemTraNamNhuan(i) == 1) stt = stt + 366; else stt = stt + 365; stt = stt + TinhSTTNgayTrongNam(ng); return stt; Bài tập thực hành Cấu trúc dữ liệu và giải thuật GVHD: Nguyễn Hữu Nhân Trang 6 } NGAY TinhNgayHomTruoc(NGAY ng) { NGAY kq; if (ng.ngay == 1) // Ngay dau tien cua thang (1/?/?) { if (ng.thang == 1) // Thang dau tien cua nam (1/1/?) { kq.nam = ng.nam - 1; kq.thang = 12; kq.ngay = 31; } else { kq.nam = ng.nam; kq.thang = ng.thang - 1; kq.ngay = TinhSoNgayTrongThang(kq.thang, kq.nam); } } else { kq.ngay = ng.ngay - 1; kq.thang = ng.thang; kq.nam = ng.nam; } return kq; } NGAY TinhNgayHomSau(NGAY ng) { NGAY kq; int max = TinhSoNgayTrongThang(ng.thang, ng.nam); Bài tập thực hành Cấu trúc dữ liệu và giải thuật GVHD: Nguyễn Hữu Nhân Trang 7 if (ng.ngay == max) // Ngay cuoi cung cua thang { if (ng.thang == 12) // Thang cuoi cung cua nam { kq.nam = ng.nam + 1; kq.thang = 1; kq.ngay = 1; } else { kq.nam = ng.nam; kq.thang = ng.thang + 1; kq.ngay = 1; } } else { kq.ngay = ng.ngay + 1; kq.thang = ng.thang; kq.nam = ng.nam; } return kq; } NGAY TinhNgayTruoc(NGAY ng, int k) { NGAY kq = ng; for (int i=0; i<k; i++) kq = TinhNgayHomTruoc(kq); return kq; } NGAY TinhNgaySau(NGAY ng, int k) { NGAY kq = ng; Bài tập thực hành Cấu trúc dữ liệu và giải thuật GVHD: Nguyễn Hữu Nhân Trang 8 for (int i=0; i<k; i++) kq = TinhNgayHomSau(kq); return kq; } int TinhKhoangCach(NGAY ng1, NGAY ng2) { return TinhSTTNgay(ng1) - TinhSTTNgay(ng2); } int SoSanh(NGAY ng1, NGAY ng2) { int kc = TinhKhoangCach(ng1, ng2); if (kc > 0) return 1; else if (kc < 0) return -1; else return 0; } Bài tập thực hành Cấu trúc dữ liệu và giải thuật GVHD: Nguyễn Hữu Nhân Trang 9 // TamGiac.cpp : Defines the entry point for the console application. //Cấu trúc dữ liệu tam giác #include "stdafx.h" #include <stdio.h> #include <conio.h> #include <math.h> // Khai bao kieu DIEM & TAMGIAC struct diem { int x; // hoanh do int y; // tung do }; typedef struct diem DIEM; struct tamgiac { DIEM dA; DIEM dB; DIEM dC; }; typedef struct tamgiac TAMGIAC; // Nguyen mau ham void NhapDiem(DIEM &d); void XuatDiem(DIEM d, char *thongbao); float TinhKhoangCach(DIEM d1, DIEM d2); int KiemTraHopLe(DIEM a, DIEM b, DIEM c); void NhapTamGiac(TAMGIAC &tg); void XuatTamGiac(TAMGIAC tg, char *thongbao); float TinhChuVi(TAMGIAC tg); float TinhDienTich(TAMGIAC tg); void main() Bài tập thực hành Cấu trúc dữ liệu và giải thuật GVHD: Nguyễn Hữu Nhân Trang 10 { TAMGIAC tg; NhapTamGiac(tg); XuatTamGiac(tg, "Toa do ba diem cua Tam giac:\n"); printf("Chu vi Tam giac = %.2f\n", TinhChuVi(tg)); printf("Dien tich Tam giac = %.2f\n", TinhDienTich(tg)); getch(); } // Dinh nghia ham void NhapDiem(DIEM &d) { printf("Nhap hoanh do x: "); scanf("%d", &d.x); printf("Nhap tung do y: "); scanf("%d", &d.y); } void XuatDiem(DIEM d, char *thongbao) { printf("%s", thongbao); printf("(%d, %d)\n", d.x, d.y); } float TinhKhoangCach(DIEM d1, DIEM d2) { float kq; int dx = d1.x - d2.x; int dy = d1.y - d2.y; kq = sqrt((float)(dx*dx + dy*dy)); return kq; } int KiemTraHopLe(TAMGIAC tg) [...]... { GVHD: Nguyễn Hữu Nhân Trang 14 Bài tập thực hành Cấu trúc dữ liệu và giải thuật DIEM kq; kq.x = -d.x; kq.y = -d.y; return kq; } DIEM TimDoiXungQuaOx(DIEM d) { DIEM kq; kq.x = d.x; kq.y = -d.y; return kq; } DIEM TimDoiXungQuaOy(DIEM d) { DIEM kq; kq.x = -d.x; kq.y = d.y; return kq; } GVHD: Nguyễn Hữu Nhân Trang 15 Bài tập thực hành Cấu trúc dữ liệu và giải thuật // DaThuc.cpp : Defines the entry point... 22 Bài tập thực hành Cấu trúc dữ liệu và giải thuật // 01 Hàm so sánh 2 biến kiểu cấu trúc cho trước // Đầu vào: biến cấu trúc (info1) và biến cấu trúc (info2) // Đầu ra: 0 (bằng nhau), -1 (info1 nhỏ hơn info2), 1 (info1 lớn hơn info2) int CompareData(DATA info1, DATA info2) { if(info1.xinfo2.x) return 1; return 0; } // 02 Hàm khởi tạo DSLK (rỗng) // Đầu vào: tham chiếu... thực hành Cấu trúc dữ liệu và giải thuật if (p != NULL) AddHead(l, p); return p; } // 12 Hàm chèn một nút cho trước vào cuối DSLK // Đầu vào: Tham chiếu đến DSLK (l), con trỏ đến nút cần chèn (pNewNode) // Đầu ra: Không có void AddTail(LIST &l, NODE *p) { if (IsEmptyList(l)) { l.pHead = p; l.pTail = l.pHead; } else { l.pTail->pNext = p; l.pTail = p; } } // 13 Hàm chèn một nút có dữ liệu cho trước vào... // Đầu vào: Tham chiếu đến DSLK (l), dữ liệu của nút cần chèn (info) // Đầu ra: Con trỏ đến nút được chèn (trả về NULL nếu không chèn được) NODE* AddTail(LIST &l, DATA info) { NODE *p = CreateNode(info); if (p != NULL) AddTail(l, p); return p; } // 14 Hàm chèn một nút cho trước vào sau một nút khác cho trước GVHD: Nguyễn Hữu Nhân Trang 27 Bài tập thực hành Cấu trúc dữ liệu và giải thuật // Đầu vào: Tham... Cấu trúc dữ liệu và giải thuật while (p != NULL) { printf("\n",p->info.x ); p = p->pNext; } } // 05 Hàm tạo một node mới với dữ liệu cho trước // Đầu vào: Dữ liệu của nút (info) // Đầu ra: Con trỏ đến nút đó (trả về NULL nếu không tạo được) NODE*CreateNode(DATA info) { NODE*p=new NODE; if(p!=NULL) { p->info=info; p->pNext=NULL; } return p; } // 06 Hàm tìm nút đầu tiên trong DSLK cho trước có dữ liệu cho... Đầu vào: Tham chiếu đến DSLK (l), con trỏ đến nút cho trước (q), con trỏ đến nút cần chèn (pNewNode) // Đầu ra: Không có void AddBefore(LIST &l, NODE *q, NODE *p) { if (q != NULL) { if (l.pHead == q) GVHD: Nguyễn Hữu Nhân Trang 28 Bài tập thực hành Cấu trúc dữ liệu và giải thuật AddHead(l, p); else { NODE *p = GetPreviousNodePointer(l, q); AddAfter(l, p, p); } } } // 17 Hàm chèn một nút có dữ liệu. .. vào: Tham chiếu đến DSLK (l), con trỏ đến nút cần chèn (pNewNode) // Đầu ra: Không có void AddAscendingList(LIST &l,NODE*q) { NODE *p = l.pHead; q = NULL; while (p != NULL && CompareData(p->info, p->info) < 0) { q = p; p = p->pNext; } if (q != NULL) GVHD: Nguyễn Hữu Nhân Trang 29 Bài tập thực hành Cấu trúc dữ liệu và giải thuật AddAfter(l, q, p); else AddHead(l, p); } // 19 Hàm chèn một nút có dữ liệu. .. p->info; delete p; if (l.pHead == NULL) l.pTail = NULL; } return info; GVHD: Nguyễn Hữu Nhân Trang 30 Bài tập thực hành Cấu trúc dữ liệu và giải thuật } // 21 Hàm hủy một nút đứng sau một nút cho trước trong DSLK // Đầu vào: Tham chiếu đến DSLK (l), con trỏ đến nút cho trước (q) // Đầu ra: Dữ liệu của nút bị xóa (nếu có) DATA RemoveAfter(LIST &l, NODE *q) { DATA info = {0}; if (q != NULL) { if (q !=... } } return info; } // 22 Hàm hủy một nút cuối DSLK // Đầu vào: Tham chiếu đến DSLK (l) // Đầu ra: Dữ liệu của nút bị xóa (nếu có) DATA RemoveTail(LIST &l) { DATA info = {0}; if (!IsEmptyList(l)) { if (l.pHead == l.pTail) // Chỉ có một nút return RemoveHead(l); else { GVHD: Nguyễn Hữu Nhân Trang 31 Bài tập thực hành Cấu trúc dữ liệu và giải thuật NODE *q = GetPreviousNodePointer(l, l.pTail); return... fflush(stdin); // Chèn nút có giá trị 8 vào đầu dslk DATA info; info.x = 8; AddHead(l, info); PrintList(l, "Chen nut 8 vao dau:\t\t"); // Chèn nút có giá trị 9 vào đầu dslk info.x = 9; NODE *q = AddHead(l, info); PrintList(l, "Chen nut 9 vao dau:\t\t"); // Chèn nút có giá trị 10 vào đầu dslk GVHD: Nguyễn Hữu Nhân Trang 33 Bài tập thực hành Cấu trúc dữ liệu và giải thuật info.x = 10; AddHead(l, info); . Bài tập thực hành Cấu trúc dữ liệu và giải thuật GVHD: Nguyễn Hữu Nhân Trang 1 THỰC HÀNH CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT CẤU TRÚC // CauTrucNgay.cpp : Defines. } Bài tập thực hành Cấu trúc dữ liệu và giải thuật GVHD: Nguyễn Hữu Nhân Trang 9 // TamGiac.cpp : Defines the entry point for the console application. / /Cấu trúc dữ liệu tam giác. -n); else printf("Ngay 1 sau ngay 2 %d ngay
", n); } Bài tập thực hành Cấu trúc dữ liệu và giải thuật GVHD: Nguyễn Hữu Nhân Trang 3 // Dinh nghia ham int KiemTraNamNhuan(int
Ngày đăng: 08/06/2014, 07:10
Xem thêm: THỰC HÀNH CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT, THỰC HÀNH CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT