báo cáo project i đề tài xây dựng ứng dụng lịch

30 0 0
Tài liệu đã được kiểm tra trùng lặp
báo cáo project i đề tài xây dựng ứng dụng lịch

Đ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

Dưới đây là các chức năng chính và tính năng quan trọng của ứng d ng: ụ2.1 Hiển thị lịch theo tháng và năm:- Ứng d ng có kh ụ ả năng hiển thị l ch dị ựa trên tháng và năm được ch n bọ ởi

Trang 2

2

DANH MỤC CÁC CÔNG VIỆC

Tên nội dungNgười thực hiện

- Xây dựng các hàm làm việc với ngày dương

- Xử lý file lưu trữ sự kiện - Kiểm thử và tinh gọn - Báo cáo đồ án

Nguyễn Anh Đức 20200168

-Xây dựng hàm in lịch của 1 tháng bất kỳ ra màn hình

-Xây dựng các hàm tính lịch âm dựa dựa trên 1 ngày dương lịch - Kiểm thử và tinh gọn - Báo cáo đồ án

Ngô Văn Tân 20210769

Trang 3

2.1 Hiển thị lịch theo tháng và năm: 5

2.2 Thêm ghi vànhớ sự kiện: 5

2.3 Lưu trữ sự kiện trong danh sách liên kết: 5

2.5 Lưu trữ dữ liệu sự kiện: 5

2.6 Kiểm tra xóa vàsự kiện cũ: 5

3 Phân tích Thiết kế Chi Tiết 6

3.4 Xem Danh Sách Sự Kiện: 15

3.5 Hiển thị lịch : 16

3.6 Chuyển Đổi Lịch Âm: 17

3.6.1 Tính toán thời gian: 17

3.6.2 Xác định tháng âm lịch chứa Đông Chí: 19

Trang 4

4

1 Giới thiệu1.1Mục tiêu của dự án

- D ự án này được th c hi n v i m c tiêu phát tri n mự ệ ớ ụ ể ột ứng dụng lịch đơn giản nhưng đa chức năng, giúp người dùng qu n lý th i gian cá nhân và s ả ờ ự kiện một cách hi u qu Các mệ ả ục tiêu chính c a d án bao gủ ự ồm:

tháng và năm, tạo sự thuận tiện trong vi c theo dõi các s ệ ự kiện và hoạt động trong m t khoộ ảng thời gian c ụ thể

dùng d dàng chuyễ ển đổi giữa các tháng và năm khác nhau để kiểm tra và quản lý thời gian trong tương lai hoặc quá khứ

hoạt động c ụ thể cho m t ngày, bao g m giộ ồ ờ bắt đầu và nội dung liên quan đến s ựkiện đó.

lưu trữ trong một danh sách liên kết để ễ d dàng qu n lý và xem l i sau này ả ạ5 Ghi danh sách sự kiện vào file: Cung c p kh ấ ả năng lưu trữ danh sách s ự

kiện xuống file để đảm bảo thông tin không b m t sau khi ng dị ấ ứ ụng được tắt

ngày âm dựa vào ngày dương 1.2 Lý do chọn đề tài

Lý do chọn đề tài này là do nó mang tính ứng dụng cao trong cu c s ng hàng ngày ộ ốcủa mọi người Việc quản lý thời gian và s ự kiện là một ph n quan tr ng c a cuầ ọ ủ ộc sống hiện đại, và ứng d ng lụ ịch giúp người dùng t ổ chức và theo dõi l ch trình mị ột cách hi u quệ ả Hơn nữa, dự án này cung c p mấ ột cơ hộ ốt để ọi t h c và th c hành ựcác k ỹ năng lập trình, qu n lý d ả ữ liệu và tương tác người dùng

Trang 5

2 Tổng quan về ứng dụng lịch

Ứng dụng lịch là một ứng dụng đơn giản được phát triển để giúp người dùng quản lý thời gian cá nhân và theo dõi các s ự kiện và hoạt động trong cu c s ng hàng ộ ốngày Dưới đây là các chức năng chính và tính năng quan trọng của ứng d ng: ụ

2.1 Hiển thị lịch theo tháng và năm:

- Ứng d ng có kh ụ ả năng hiển thị l ch dị ựa trên tháng và năm được ch n bọ ởi người dùng

- Người dùng có th xem các tháng khác nhau và d dàng duy t qua các tháng ể ễ ệtiếp theo hoặc trước đó.

2.2 Thêm ghi và nhớ sự kiện:

- Ứng dụng cho phép người dùng thêm s ự kiện ho c hoặ ạt động vào lịch cho m t ngày c ộ ụ thể

- M i s ỗ ự kiện bao g m thông tin v ồ ề thời gian bắt đầu và nội dung liên quan đến s ựkiện đó.

2.3 Lưu trữ sự kiện trong danh sách liên kết:

- Các s ự kiện đã ghi nhớ được lưu trữ trong m t danh sách liên k t, cho phép ộ ếngười dùng d dàng qu n lý và xem l i các s ễ ả ạ ự kiện đã tạo

2.4 Xem lịch âm lịch:

- Ứng d ng cung c p kh ụ ấ ả năng chuyển đổ ngày dương sang ngày âm lịi ch, giúp người dùng có cái nhìn t ng quan v c lổ ề ả ịch dương lẫn lịch âm

- Thông tin v các s ề ự kiện và hoạt động được lưu trữ trong một tệp tin để đảm bảo r ng d ằ ữ liệu không b m t sau khi ng dị ấ ứ ụng đượ ắt và khc t ởi động lại

2.6 Kiểm tra và xóa sự kiện cũ:

- Ứng dụng kiểm tra và xóa các s ự kiện đã qua thờ ạn quy định, giúp người h i dùng duy trì l ch trình s ch s và c p nh ị ạ ẽ ậ ật.

Ứng dụng lịch giúp người dùng tổ chức cuộc sống hàng ngày, lên k ế hoạch cho các sự kiện quan tr ng và theo dõi th i gian m t cách d ọ ờ ộ ễ dàng Nó cũng cung cấp tính linh ho t và ti n ích trong vi c ghi chú và xem l i các s ạ ệ ệ ạ ự kiện đã diễn ra trong quá khứ hoặc s p tắ ới

Trang 6

6

Ứng dụng lịch được thiết kế để cung cấp cho người dùng m t giao diộ ện đơn giản và ti n lệ ợi để quản lý th i gian, xem và ghi chú s ờ ự kiện Dưới đây là các thành phần và phân tích thi t k chi ti ế ế ết:

- Để kiểm tra năm nhuận ta s d ng hàm ử ụ isLeapYear Hàm này ki m tra xem mể ột năm có phải là năm nhuận không Năm nhuận là năm chia hết cho 4 nhưng không chia h t cho 100, ho c chia h t cho 400 ế ặ ế

- Để có th ể xác định s ngày trong tháng ta s d ng hàm ố ử ụ getDaysInMonth Hàm này v strả ề ố ngày trong m t tháng c ộ ụ thể ựa trên tháng và năm được cung cấp dNếu tháng là tháng 2, thì s ố ngày được xác định d a trên vi c kiự ệ ểm tra năm nhuận

Trang 7

- Hàm print_calendar in ra l ch cho mị ột tháng và năm cụ thể Nó tính toán và in ra các ngày trong tháng, bắt đầ ừ ngày đầu tiên và xác định ngày nào u t là Ch ủ Nhật để in ra màu đỏ

- Để xác định ngày đầu tiên trong tháng ta dùng công th c sau ứ

“int startDay = (1 + (month <= 2 ? year - 1 : year) + (year - 1) / 4 - (year - 1) / 100 + (year - 1) / 400) % 7” (0: Chủ Nhật, 1: Th 2, , 6: Th ứ ứ 7)

- Ta dùng vòng lập for để có th in ra nh ng kho ng tr ng mà nhể ữ ả ắ ững ngày đầu tiên của tuần đầu tiên tháng đó không thuộc tháng đó

- Khi ngày được in ra là ngày ch ủ nhật thì ngày đó sẽ tự động in màu đỏ khi in xong s l p t c quay v màu mẽ ậ ứ ề ặc định

- Nếu ngày t ừ 1 đến 9 s t ng thêm 1 khoẽ ự độ ảng cách để có thể căn chỉnh d ữ liệu khi xác định đã in ra 7 ngày trong tuần sẽ tự động xuống dòng và in ra ngày tiếp theo

Trang 8

-8

- Hàm getCurrentDate l y thông tin v ấ ề ngày, tháng và năm hiện tại d a trên thự ời gian h ệ thống Do h ệ thống lấy năm 1900 là năm tham chiếu nên năm được l y t ấ ừhệ thống s ẽ được cộng thêm 1900 Tháng được lấy từ hệ thống được lưu trữ bắt đầ ừu t 0 nên khi l y t h ấ ừ ệ thống ta ph i cả ộng thêm 1

3.2 Các thao tác của ứng dụng

- Người dùng mu n s dố ử ụng ứng d ng ch cụ ỉ ần đưa ra lựa chọn mong muốn của mình như sau :

Trang 9

- Ở đây e có dùng vòng lập while để cho phép người dùng có th l a chể ự ọn ưu cầu mong mu n cố ủa mình và luôn luôn in ra các l a chự ọn

Trang 10

10 - Vớ ựi l a ch n 2 : ọ

+ nếu tháng hi n tệ ại đang là 12 thì chương trình sẽ cập nhật seeing_month = 0 và ++seeing_year sau đó chương trình sẽ gọi hàm print_calendar(++seeing_month, seeing_year) để in ra l ch tháng sau ị

+Sau khi nhập ngày, chương trình kiểm tra xem ngày này có cách xa hơn 3 năm so với ngày hi n t i hay không b ng cách s d ng hàm ệ ạ ằ ử ụ check_3year(date) Nếu ngày nhập vào n m trong khoằ ảng 3 năm so với ngày hi n tệ ại, chương trình tiếp tục thực hiện bước tiếp theo Ngượ ạc l i, nó in ra thông báo "!!!OVER 3 YEARS FROM TODAY!!!" cđể ảnh báo người dùng rằng h không th ghi nh s ọ ể ớ ự kiện quá xa trong tương lai

+Nếu ngày nh p vào h p l ậ ợ ệ (không cách xa hơn 3 năm so với ngày hiện tại), chương trình tiếp tục yêu cầu người dùng nhập thông tin v s ề ự kiện ghi nhớ, bao gồm gi bờ ắt đầu (startTime) và n i dung s ộ ự kiện (content) b ng cách g i hàm ằ ọinput_note(calendar, date)

Trang 11

+Sau khi nh p thông tin s ậ ự kiện, chương trình gọi hàm

writeCalendarData(calendar) c p nh t thông tin s để ậ ậ ự kiện ghi nh vào d ớ ữ liệu lịch và ghi l i d u l ch vào t p tin ạ ữ liệ ị ệ

- Với l a ch n 4 : ự ọ

+ readCalendarData(calendar);: Đầu tiên, hàm này đọc dữ liệu t t p tin lừ ệ ịch đã lưu trữ và nạp chúng vào biến calendar Biến calendar chứa thông tin v các s ề ựkiện ghi nh cho m i ngày trong l ch ớ ỗ ị

+ delete_event(calendar);: Sau khi đọc dữ liệu t t p, hàm này s ừ ệ ẽ được gọi để xóa bỏ các s ự kiện ghi nh n m ngoài phớ ằ ạm vi 1 năm từ ngày hi n t i Nó th c hiệ ạ ự ện điều này b ng cách ki m tra mằ ể ỗi ngày trong calendar, và nếu ngày đó cách ngày hiện tại hơn 1 năm, thì các sự kiện ghi nh cớ ủa ngày đó sẽ bị loại bỏ

+ In danh sách s ự kiện ghi nh : ớ

- Sau khi xóa các s ự kiện ngoài phạm vi, chương trình in ra danh sách các sự kiện ghi nh còn l i Vòng lớ ạ ặp for (auto i : calendar) l p qua tặ ừng ngày trong lịch và in ra ngày đó

- Sau đó, một vòng l p l ng bên trong ặ ồ for (auto j : i.events) l p qua các s ặ ựkiện ứng v i m i ngày và in ra th i gian bớ ỗ ờ ắt đầu (j.startTime) và n i dung ộsự kiện (j.content)

Dòng cout << " YOUR NOTED AROUND 1 YEAR : " << endl; được s ửdụng để hiển thị một thông báo trước khi in danh sách

Trang 12

12

+ writeCalendarData(calendar);: Cuối cùng, sau khi in danh sách, d ữ liệu trong biến calendar (đã được cập nhật sau khi xóa s ự kiện) s ẽ được ghi l i vào t p tin ạ ệlịch

+ Solar2Lunar(D, M, Y);: Sau khi đã có thông tin ngày tháng năm, chương trình gọi hàm Solar2Lunar v i các tham s D, M, và Y Hàm này s ớ ố ẽ thực hi n việ ệc chuyển đổi ngày dương lịch sang ngày âm l ch và in k t qu ra màn hình Chuyị ế ả ển đổi này d a trên các quy t c c a l ch Âm L ch ự ắ ủ ị ị

- Với lựa chọn 6 : Chương trình sẽ dừng hoạt động

3.3 Thêm Sự Kiện:

Trang 13

- Cấu trúc của một sự kiện gồm 2 phần là thời gian bắt đầu vànội dung sự kiện - Cấu trúc cho một ngày làthời gian bắt đầu sự kiện vànội dung sự kiện - vector<Day> calendar;: Đây là một vector (mảng động) của các ngày (Day) Biến calendar này được sử dụng để lưu trữ tất cả các sự kiện ghi nhớ trong lịch Mỗi phần tử trong vector calendar đại diện cho một ngày bao và gồm thông tin về ngày cũng như danh sách các sự kiện ghi nhớ trong ngày đó.

- Hàm input_note nhận vào tham số calendar, đại diện cho lịch cần cập nhật, và date, đại diện cho ngày mà sự kiện ghi nhớ sẽ được thêm vào

- Người dùng nhập thời gian và nội dung cần ghi nhớ

- Hàm s ẽ duyệt qua danh sách ngày trong biến calendar để kiểm tra xem ngày

dateđã tồ ại trong ln t ịch hay chưa Việc này được thực hiện thông qua vòng lặp

break, vì ngày đã tồn tại và sự kiện đã được thêm

Trang 14

14

- Nếu ngày chưa tồn tại (!found), hàm sẽ tạo m t s ộ ự kiện mới (Event event = {startTime, content}) và m t ngày m i (ộ ớ Day newDay = {date, {event}}) Sau đó, ngày mới và s ự kiện m i này s ớ ẽ được thêm vào biến calendar

(calendar.push_back(newDay)) Điều này đảm bảo rằng nếu ngày chưa tồ ạn t i, m t ngày m i s ộ ớ ẽ được t o và s ạ ự kiện s được thêm vào ngày m i này ẽ ớ

Trang 15

3.4 Xem Danh Sách Sự Kiện:

- Mỗi sự kiện lần lượt chiếm 2 dòng trong file lưu trữ Hàm

readCalendar(calendar) sẽ đọc thông tin trong file và lưu vào vector sự kiện calendar

- Hàm delete_event(calendar) sẽ kiểm tra các sự kiện trong vector sự kiện calendar và xóa các sự kiện không hợp lệ bằng cách duyệt iterator it trong calendar Nếu sự kiện đó không thỏa mãn hàm check_1year(it->date) thì sẽ bị xóa khỏi danh sách

Trang 16

- int seeing_month, seeing_year;: Khai báo biến seeing_month và seeing_year để lưu trữ thông tin về tháng và năm mà bạn đang xem lịch (ban đầu sẽ là tháng và năm hiện hành)

- seeing_month = month; seeing_year = year;: Gán giá trị của month và year vào seeing_month và seeing_year để thiết lập mặc định cho việc xem lịch

- print_calendar(month, year);: Gọi hàm print_calendar() để in lịch cho tháng và năm hiện hành (month và yearchứa thông tin về ngày hiện tại) Hàm này được gọi ban đầu để hiển thị lịch cho ngày hiện tại

Trang 17

3.6 Chuyển Đổi Lịch Âm:

- Ứng d ng cung cụ ấp tính năng chuyển đổi ngày dương sang ngày âm lịch dựa trên tính toán l ch âm ị

3.6.1 Tính toán thời gian:

Chương trình sử dụng Julian Date (JD) để thực hi n các phép tính JD là m t h ệ ộ ệthống giúp bi u di n thể ễ ời gian dưới dạng số ngày, t mừ ột điểm thời gian cố định - UniversalToJD(int day, int month, int year): Hàm này chuyển đổi ngày tháng năm dương lịch sang s ố ngày Julius tương ứng Nó s d ng thu t toán tính toán ử ụ ậJD dựa trên ngày, tháng, và năm cung cấp

+ Hàm nhận 3 tham số đầu vào kiểu int là ngày, tháng, năm hiện tại và -

đổi sang số ngày Julius( Lấy điểm gốc là ngày 1/1/4713 (TCN)) day là một số

nguyên từ 1 đến 31, month từ 1 đến 12 và year là một số nguyên lớn hơn -4712 Hàm trả về kết quả là 1 số thực kiểu double

+ Đầu tiên, kiểm tra năm và tháng có nằm sau ngày 15/10/1582 hay không Đây là ngày mà lịch chuyển từ lịch Julian sang lịch Gregorian, nên cách tính số ngày Julius phải khác nhau trước và sau ngày này

• Nếu ngày, tháng và năm nằm sau ngày 15/10/1582 (year > 1582 hoặc year == 1582 && month > 10 hoặc year == 1582 && month == 10 && day > 14), thì sử dụng công thức tính số ngày Julius sau thay đổi lịch Gregorian:

- 367 * year: Tính số ngày từ năm 0 đến năm hiện tại

- int(7 * (year + int((month + 9) / 12)) / 4): Điều chỉnh cho năm nhuận (leap year)

- int(3 * (int((year + (month - 9) / 7) / 100) + 1) / 4): Điều chỉnh cho các năm lớn (century years) không nhuận

- int(275 * month / 9): Điều chỉnh cho tháng - day: Số ngày trong tháng

Trang 18

- 367 * year: Tính số ngày từ năm 0 đến năm hiện tại

- int(7 * (year + 5001 + int((month - 9) / 7)) / 4): Điều chỉnh cho năm nhuận và năm lớn trước thay đổi lịch

- int(275 * month / 9): Điều chỉnh cho tháng - day: Số ngày trong tháng

- 1729776.5: Đây là một hằng số tương tự để đảm bảo tính toán chính xác Cuối cùng, hàm trả về số ngày Julius được tính toán dựa trên ngày, tháng và

năm đầu vào Số ngày Julius này có thể được sử dụng để thực hiện các tính toán liên quan đến thời gian và lịch

- LocalFromJD(double JD): Hàm này chuyển đổ ối s ngày Julius thành ngày tháng năm dương lịch dựa trên múi gi ờ địa phương

- LocalToJD(int int int D, M, Y): Hàm này chuyển đổi ngày tháng năm dương lịch thành s ngày Julius d a trên múi gi ố ự ờ địa phương

> Hàm hoạt động ngược lại so với hàm LocalFromJD

Trang 19

3.6.2 Xác định tháng âm lịch chứa Đông Chí:

- LunarMonth11(int Y): Hàm này xác định tháng âm l ch chị ứa Đông Chí (Tháng 11 âm l ch) c a mị ủ ột năm cụ ể Điều này đượ th c thực hiện bằng cách tính toán thời điểm Sóc (New Moon) gần Đông Chí

khoảng cách đó cho chu kỳ trung bình của một tháng âm lịch (29.530588853 ngày) Giá trị k này thường cho biết là tháng âm lịch thứ bao nhiêu trong chuỗi các tháng âm lịch

- Sử dụng giá trị k tính toán ngày Mặt trăng mới (New Moon) bằng cách gọi hàm NewMoon(k) Hàm này trả về ngày Mặt trăng mới ứng với tháng âm

lịch thứ k

- Sử dụng kết quả ngày Mặt trăng mới (trong dạng Julian Date - jd) tính toán ngày, tháng và năm của tháng âm lịch chứa ngày Đông chí bằng cách gọi hàm LocalFromJD(jd) Kết quả trả về là một vector chứa thông tin về ngày, tháng và năm âm lịch

- Tính kinh độ của Mặt trời (Sun Longitude) vào thời điểm nửa đêm (local midnight) của ngày âm lịch được tính ở bước 4 bằng cách gọi hàm SunLongitude với tham số LocalToJD(ret[0], ret[1], ret[2]) Kinh độ của Mặt trời cho biết vị trí của Mặt trời trên đường hoàng đạo

- Kiểm tra xem kinh độ của Mặt trời có lớn hơn giá trị 3*PI/2 (tương ứng với Đông chí) hay không Nếu có, thì tháng âm lịch được tính trước Đông chí và

Trang 20

về một tháng trong lịch âm lịch bao gồm ngày, tháng, năm âm lịch và

thông tin về tháng nhuận (nếu có)

- Khai báo biến ret là một vector của vector để lưu thông tin về lịch âm lịch Biến này sẽ được trả về cuối cùng Gọi hàm LunarMonth11(Y-1) để tính tháng âm lịch chứa ngày Đông chí của năm trước đó (Y-1) Điều này được thực hiện để xác định tháng 11 âm lịch của năm trước và tính toán chu kỳ của tháng âm lịch

- Tính toán Julian Date của tháng 11 âm lịch được xác định ở bước 2 và lưu vào biến jdMonth11A

Ngày đăng: 13/06/2024, 16:33