Tải bản đầy đủ (.pdf) (30 trang)

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

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (3.68 MB, 30 trang )

<span class="text_page_counter">Trang 2</span><div class="page_container" data-page="2">

<small>2 </small>

<b>DANH MỤC CÁC CÔNG VIỆC </b>

Tên <b>nội dungNgười thực hiện</b>

- 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

</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="3">

<small>2.1 Hiển thị lịch theo tháng và năm: ... 5 </small>

<small>2.2 Thêm ghi vànhớ sự kiện: ... 5 </small>

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

<small>2.5 Lưu trữ dữ liệu sự kiện: ... 5 </small>

<small>2.6 Kiểm tra xóa vàsự kiện cũ: ... 5 </small>

<small>3. Phân tích Thiết kế Chi Tiết ... 6 </small>

<small>3.4 Xem Danh Sách Sự Kiện: ... 15 </small>

<small>3.5 Hiển thị lịch : ... 16 </small>

<small>3.6 Chuyển Đổi Lịch Âm:... 17 </small>

<small>3.6.1 Tính tốn thời gian: ... 17 </small>

<small>3.6.2 Xác định tháng âm lịch chứa Đơng Chí: ... 19 </small>

</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4">

<small>4 </small>

1. <b>Giới thiệu</b>

<b>1.1Mục tiêu của dự án </b>

- 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. <b>Ghi danh sách sự kiện</b> 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 <b>Lý do chọn đề</b> 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.

</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="5">

<b>2. Tổng quan về ứng dụng lịch</b>

Ứ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 <b>Hiển thị lịch</b> theo tháng <b>và năm:</b>

- Ứ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à <b>nhớ sự kiện:</b>

- Ứ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<b>ưu trữ sự kiện trong danh sách liên kết:</b>

- 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 <b>lịch âm lịch: </b>

- Ứ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.

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

- Ứ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.

</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6">

<small>6 </small>

Ứ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.

</div><span class="text_page_counter">Trang 7</span><div class="page_container" data-page="7">

- Hàm print_calendar in ra l ch cho mị ột tháng và năm cụ thể. Nó tính tố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 ứ

<b>“int startDay = (1 + (month <= 2 ? year - 1 : year) + (year - 1) / 4 - (year - 1) / 100 + (year - 1) / 400) % 7” (0: Chủ </b>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

</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="8">

<small>-8 </small>

- 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

<b>3.2 Các thao tác của ứng dụng </b>

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

</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="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à ln ln in ra các l a chự ọn

</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10">

<small>10 </small>- 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).

</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="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 ngồ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.

</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="12">

<small>12 </small>

+ 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

<b>3.3 Thêm Sự Kiện: </b>

</div><span class="text_page_counter">Trang 13</span><div class="page_container" data-page="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.

</div><span class="text_page_counter">Trang 14</span><div class="page_container" data-page="14">

<small>14 </small>

- 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. ẽ ớ

</div><span class="text_page_counter">Trang 15</span><div class="page_container" data-page="15">

3.4 Xem Danh Sách <b>Sự Kiện:</b>

- 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.

</div><span class="text_page_counter">Trang 16</span><div class="page_container" data-page="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.

</div><span class="text_page_counter">Trang 17</span><div class="page_container" data-page="17">

3.6 <b>Chuyển Đổi Lịch Âm: </b>

- Ứ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 tốn l ch âm. ị

<b>3.6.1 Tính tốn thời gian: </b>

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 tốn tính tốn ử ụ ậJD dựa trên ngày, tháng, và năm cung cấp.

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

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

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.

</div><span class="text_page_counter">Trang 18</span><div class="page_container" data-page="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 tốn chính xác. Cuối cùng, hàm trả về số ngày Julius được tính tố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

</div><span class="text_page_counter">Trang 19</span><div class="page_container" data-page="19">

<b>3.6.2 Xác định tháng âm lịch chứa Đơng Chí: </b>

- 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 tố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 tố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

<b>lịch thứ k. </b>

- 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 hồ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à

</div><span class="text_page_counter">Trang 20</span><div class="page_container" data-page="20">

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

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

<small>- </small> 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 tố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.

</div>

×