IT pro - 10th --[1][0][T][H] - Welcome to dh10th forum .AG Universitas
 :: 

Góc thảo luận

 :: 

Học kì 1 : 2011- 2012

 :: 

Lập trình trên windows


Alo thông báo dừa khô lên giá
-‘๑’-CHÀO MỪNG BẠN ĐẾN VỚI FORUM DH10TH-‘๑’-
  • Gallery & Others

Quà Tặng Âm Nhạc -‘๑’- DH10TH -‘๑’-
Góc kỉ niệm

MERRY CHHRISTMAS
Nhấn nút PLAY > để xem nhé !!

Bàn về bài toán “Xác định thứ trong tuần dựa trên ngày - tháng – năm”Xem chủ đề cũ hơn Xem chủ đề mới hơn Go down
Wed Sep 07, 2011 7:43 pm
[Thành viên] - levientrinh
[Chức vụ] Lớp Phó
Lớp Phó
Tổng số bài viết Tổng số bài viết : 74
Xu Xu : 161
Số lần được cám ơn Số lần được cám ơn : 15
Tham gia Tham gia : 03/12/2010

Bài gửiTiêu đề: Bàn về bài toán “Xác định thứ trong tuần dựa trên ngày - tháng – năm”
Xem lý lịch thành viên

Tiêu đề: Bàn về bài toán “Xác định thứ trong tuần dựa trên ngày - tháng – năm”

Bàn về bài toán “Xác định thứ trong tuần dựa trên ngày - tháng – năm”

Bạn có thể xem bài này trên blog của tôi tại
Code:
http://vn.360plus.yahoo.com/levientrinh-DH10TH
Đã có bao giờ bạn muốn biết một ngày nào đó là ngày thứ mấy trong tuần. Nếu như ngày đó là ngày mà bạn có thể tra cứu được trên lịch thì chẳng có gì đáng phải bàn, tuy nhiên nếu đó là một ngày ở trong quá khứ thì sao (chẳng hạn như ngày sinh của mình, sự kiện đặc biệt nào đó trong quá khứ,…). Chúng ta sẽ bàn về cách để xác định đó là ngày thứ mấy trong tuần mà không cần phải dùng lịch hoặc không thể xác định chỉ qua một vài phép tính đơn giản. Thực sự ra mà nói nếu bạn đã từng sử dụng ứng dụng văn phòng Microsoft Excel thì nó có hỗ trợ cho chúng ta một hàm tên là WEEKDAY() với đối số đầu vào là ngày tháng năm dùng để xác định đó là ngày thứ mấy trong tuần. Nhưng chúng ta sẽ giải bài toán này thông qua một giải thuật rất đơn giản sau đây.

Đầu tiên, bạn phải tính được giá trị của biểu thức như sau

S = Year - 1 + ((Year - 1) / 4) - ((Year - 1) / 100) + ((Year - 1) / 400) + khoangNgay;

Trong đó Year là số năm. khoangNgay là số ngày từ đầu năm đến ngày mà ta cần tìm. Kết quả của các phép tính chia trong biểu thức trên đều lấy phần nguyên. Bạn cứ yên tâm là ta sẽ không phải cần chuyển đổi kiểu của phép tính này bởi vì trong cơ chế thực hiện phép chia của C# thì nếu tử và mẫu đều là số nguyên thì kết quả sẽ trả về phần nguyên. Trong trường hợp tử hoặc mẫu là số thực thì kết quả sẽ trả về số thực. Do đó trong khi tính toán bạn chỉ cần cho biến Year có kiểu nguyên là được.

Để tính được giá trị khoangNgay thì bạn hãy xem ví dụ sau :

Tôi cần xác định thứ là ngày 01/3/2011. Ta sẽ tính giá trị khoangNgay sẽ là = 31 + 28 + 1 = 60. Trong đó 31 là số ngày của tháng 1, 28 là số ngày của tháng 2, 1 là ngày mà ta cần tính xác định thứ. Đối với một số năm thì tháng 2 có thể có 29 ngày. Do đó để xác định số ngày của một tháng trong một năm nào đó mà không cần phải thao tác nhiều ta có thể sử hàm DaysInMonth(int year, int month) của lớp DateTime.

Sau khi tính được giá trị S ở trên bạn tiến hành lấy phần dư của phép chia S cho 7. Kết quả phần dư của phép chia này chính là thứ trong tuần của ngày ta tiến hành xác định. Nếu phần dư là 0, thì đó là ngày Chủ Nhật, nếu phần dư là 1 đó là ngày thứ Hai, nếu phần dư là 2 đó là ngày thứ Ba,… nếu phần dư là 6 đó là ngày thứ Bảy.

Bây giờ để minh họa cho giải thuật này tôi sẽ minh họa một Form trong C# có giao diện cơ bản như sau (nếu bạn học lớp DH10TH – Đại học An Giang và đang học môn học lập trình trên Windows thì bạn có thể xem bài tập số 1 - phần III - xử lý các điều khiển - bài tập Visual Basic cơ bản).
[You must be registered and logged in to see this image.]

Mô tả :

- cbxYear là một Combobox chứa năm. Bạn dùng thuộc tính MinValue và MaxValue của lớp DateTime để nạp số năm vào Combobox này.

- cbxMonth là một Combobox chứa tháng.

- cbxDay là một Combobox chứa ngày. Ngày này bạn nên dùng hàm DaysInMonth nói ở trên để nạp các ngày vào Combobox này.

- btnDocNgay dùng để tính và xuất kết quả lên txtKetQua và btnThoat dùng để thoát khỏi chương trình.

Để cho chương trình chạy đúng, bạn nên chọn năm, sau đó chọn tháng, cuối cùng chọn ngày.

Tham khảo đoạn Code sau đây (dựa trên giải thuật được trình bày ở trên). Tải source code tại [You must be registered and logged in to see this link.] (viết trên Visual Studio 2010), đối với phiên bản thấp hơn, bạn có thể tự tay viết lại chương trình hoặc chép đoạn code vào dự án của mình.

Code:
using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

 

namespace Doc_ngay

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

 

        private void btnThoat_Click(object sender, EventArgs e)

        {

            if (MessageBox.Show("Bạn có muốn thoát khỏi ứng dụng không ?", "Exit", MessageBoxButtons.OKCancel, MessageBoxIcon.Information) == DialogResult.OK)

            {

                Application.Exit();

            }

        }

 

        private void Form1_Load(object sender, EventArgs e)

        {

            for (int i = DateTime.MinValue.Year; i <= DateTime.MaxValue.Year; i++)

            {

                cbxYear.Items.Add(i);

            }

        }

 

        private void cbxYear_SelectedIndexChanged(object sender, EventArgs e)

        {

            btnDocNgay.Enabled = true;

            for (int i = 1; i <= 12; i++)

            {

                cbxMonth.Items.Add(i);

            }

        }

 

        private void cbxMonth_SelectedIndexChanged(object sender, EventArgs e)

        {

            btnDocNgay.Enabled = true;

            int ngay = DateTime.DaysInMonth(Convert.ToInt32(cbxYear.Text), Convert.ToInt32(cbxMonth.Text));

            for (int i = 1; i <= ngay; i++)

            {

                cbxDay.Items.Add(i);

            }

        }

 

        private void btnDocNgay_Click(object sender, EventArgs e)

        {

            btnDocNgay.Enabled = false;

            int Year = Convert.ToInt32(cbxYear.Text);

            int Month = Convert.ToInt32(cbxMonth.Text);

            int Day = Convert.ToInt32(cbxDay.Text);

            int khoangNgay = Day;

            for (int i = 1; i <= Month - 1; i++)

            {

                khoangNgay += DateTime.DaysInMonth(Year, i);

            }

            int S = Year - 1 + ((Year - 1) / 4) - ((Year - 1) / 100) + ((Year - 1) / 400) + khoangNgay;

            string thuMay = null;

            switch (S % 7)

            {

                case 0: thuMay = "Chủ Nhật";

                    break;

                case 1: thuMay = "Thứ Hai";

                    break;

                case 2: thuMay = "Thứ Ba";

                    break;

                case 3: thuMay = "Thứ Tư";

                    break;

                case 4: thuMay = "Thứ Năm";

                    break;

                case 5: thuMay = "Thứ Sáu";

                    break;

                case 6: thuMay = "Thứ Bảy";

                    break;

            }

            txtKetQua.Text = thuMay + " " + Day + "/" + Month + "/" + Year;

        }

 

        private void cbxDay_SelectedIndexChanged(object sender, EventArgs e)

        {

            btnDocNgay.Enabled = true;

        }

    }

}
Sau khi chạy chương trình này, giả sử hôm nay tôi chọn năm là 2011, tháng là 9, ngày là 7. Kết quả sẽ hiện như sau :
[You must be registered and logged in to see this image.]
Trong C# có hỗ trợ cho bạn sử dụng một hàm trong lớp DateTime để xác định thứ của một ngày. Xem code sau :
Code:
DateTime dt = new DateTime(2011, 9, 7);
Console.WriteLine(dt.DayOfWeek.ToString());
Bạn có thể xem thêm giải thuật xác định thứ dựa trên một ngày tại Wikipedia English (http://en.wikipedia.org/wiki/Calculating_the_day_of_the_week).
Chúc các bạn thành công !



"Trên đời này làm gì có đường, người ta đi mãi thì thành đường thôi"

Fri Sep 09, 2011 8:50 am
Cuộc sống vốn không công bằng, chúng ta phải tìm cách thích ứng với nó
[Thành viên] - nam707123
[Chức vụ] Thành viên lớp
Thành viên lớp
Tổng số bài viết Tổng số bài viết : 117
Xu Xu : 168
Số lần được cám ơn Số lần được cám ơn : 17
Tham gia Tham gia : 25/11/2010
Đến từ Đến từ : Việt Nam
Nghề ngỗng Nghề ngỗng : Lang thang
Châm ngôn sống Châm ngôn sống : Cuộc sống vốn không công bằng, chúng ta phải tìm cách thích ứng với nó

Bài gửiTiêu đề: Re: Bàn về bài toán “Xác định thứ trong tuần dựa trên ngày - tháng – năm”
Xem lý lịch thành viên

Tiêu đề: Bàn về bài toán “Xác định thứ trong tuần dựa trên ngày - tháng – năm”

tui hỏi og này koi Trình: cái này của og
( S = Year - 1 + ((Year - 1) / 4) - ((Year - 1) / 100) + ((Year - 1) / 400) + khoangNgay;)
nó hơi giống cái này Sakamoto's algorithm: (y + y/4 - y/100 + y/400 + t[m-1] + d) % 7;
chứ nó không giống Gaussian algorithm:
[You must be registered and logged in to see this image.]

[You must be registered and logged in to see this image.]




Fri Sep 09, 2011 10:25 am
[Thành viên] - levientrinh
[Chức vụ] Lớp Phó
Lớp Phó
Tổng số bài viết Tổng số bài viết : 74
Xu Xu : 161
Số lần được cám ơn Số lần được cám ơn : 15
Tham gia Tham gia : 03/12/2010

Bài gửiTiêu đề: Re: Bàn về bài toán “Xác định thứ trong tuần dựa trên ngày - tháng – năm”
Xem lý lịch thành viên

Tiêu đề: Bàn về bài toán “Xác định thứ trong tuần dựa trên ngày - tháng – năm”

Nói chung là có nhiều giải thuật để giải quyết bài toán này (thậm chí có một số thành viên nước ngoài viết rất nhiều giải thuật để giải). Cái tôi trình bày chỉ là một trong những giải thuật đó. Tôi thấy thuật toán thứ hai của bạn giới thiệu thấy cũng hay nên nếu có thể được, bạn hãy viết lại giải thuật này trong code của tôi đưa (hàm thụ lý xử lý sự kiện click của control button btnDocNgay).



"Trên đời này làm gì có đường, người ta đi mãi thì thành đường thôi"

Sat Apr 26, 2014 12:25 am
Mốn có nhiều tiền
[Thành viên] - cuchuoj05
[Chức vụ] Thành viên lớp
Thành viên lớp
Tổng số bài viết Tổng số bài viết : 1
Xu Xu : 1
Số lần được cám ơn Số lần được cám ơn : 10
Tham gia Tham gia : 26/04/2014
Châm ngôn sống Châm ngôn sống : Mốn có nhiều tiền

Bài gửiTiêu đề: Re: Bàn về bài toán “Xác định thứ trong tuần dựa trên ngày - tháng – năm”
Xem lý lịch thành viên

Tiêu đề: Bàn về bài toán “Xác định thứ trong tuần dựa trên ngày - tháng – năm”

cái công thức của bạn sai rồi. bạn hãy xem lại đi nhé. cái của bạn chỉ đúng trong 1 năm. sang năm khác thì độ lệch của thứ vs kết quả tìm được sẽ khác. công thức này thì chuẩn Sakamoto's algorithm: (y + y/4 - y/100 + y/400 + t[m-1] + d) % 7



Today at 6:37 pm
[Thành viên] - Sponsored content
[Chức vụ]

Bài gửiTiêu đề: Re: Bàn về bài toán “Xác định thứ trong tuần dựa trên ngày - tháng – năm”

Tiêu đề: Bàn về bài toán “Xác định thứ trong tuần dựa trên ngày - tháng – năm”




Bàn về bài toán “Xác định thứ trong tuần dựa trên ngày - tháng – năm”

Xem chủ đề cũ hơn Xem chủ đề mới hơn Về Đầu Trang
Xem tiếp các bài khác:

Trang 1 trong tổng số 1 trang
.::Host upload ảnh miễn phí Clickhere!::.
Permissions in this forum:Bạn không có quyền trả lời bài viết
[1][0][T][H] - Welcome to dh10th forum .AG Universitas :: Góc thảo luận :: Học kì 1 : 2011- 2012 :: Lập trình trên windows-
Logo bạn bè:
Lượt xem
Cố găn nâng cao số lượng truy cập
Hỗ trợ online
Web trường đại học An Giang
Web khoa CN-KT-MT
Xem thới khóa biểu online
Trường Đại Học An Giang
Lớp : DH10TH
Khoa :Kỹ thuật - Công nghệ - Môi trường
Chuyên ngành : Kỹ thuật phần mềm
Diễn Đàn Được Xây dựng và phát triển bởi các thành viên
.
Copyright © 2009 - 2013, DH10TH.CO.CC .
Powered by phpBB2 - GNU General Public License.
Style Win7 of VBB - - FM Rip by BI
Xem tốt nhất ở độ phần giải lớn hơn 1280x1024 và trình duyệt Firefox
Get Firefox Now Get Windows Media Player Now

Đầu trang
Giữa trang
Cuối trang
Để lại tin nhắn cho Forum
Free forum | © phpBB | Free forum support | Liên hệ | Report an abuse | Create a blog
Jen