THỰC HÀNH CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT

45 1.2K 3
THỰC HÀNH CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Bài tập thực hành Cấu trúc dữ liệu giải thuật GVHD: Nguyễn Hữu Nhân Trang 1 THỰC HÀNH CẤU TRÚC DỮ LIỆU 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 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 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 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 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 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 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 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 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 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 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 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 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) 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 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 giải thuật // Đầu vào: Tham... Cấu trúc dữ liệu 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 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 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 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 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 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

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan