2010-01-12 26 views
5

Tôi đang mắc kẹt trên các vấn đề sau đây từ lớp lập trình C của tôi:năm Input, sau đó in lịch

Viết một chương trình mà sẽ nhắc người dùng nhập vào một năm, và sau đó tạo ra lịch (trong cả năm) .

Tôi không biết cách tiếp cận vấn đề này. Tôi thường có thể bắt đầu vấn đề bài tập về nhà của tôi (đây là một vấn đề thách thức tùy chọn), nhưng tôi thực sự bị mất. Chúng tôi đã làm việc qua các chương 1-10 của Deitel & Deitel (vòng lặp, mảng, con trỏ, I/O, v.v.), nhưng tôi không biết cách tiếp cận điều này. Bất kỳ gợi ý hoặc gợi ý nào sẽ được đánh giá cao.

+1

Nếu bạn có thể làm cho chương trình in các tuần đầu tiên của tháng, bạn sẽ có chương trình 90% thực hiện. –

+0

Làm thế nào để anh ta bắt đầu tháng vào một ngày cụ thể –

Trả lời

0

Khởi động tốt có thể là các hàm giờ địa phương (3)mktime (3). Ngoài ra, bạn có thể thực hiện số học ngày có liên quan từ đầu. Sau đó, chỉ cần tạo dòng đầu tiên của lịch (tìm ngày trong tuần tương ứng với ngày 1 tháng 1, sau đó in taht vào đúng vị trí, tiếp theo phần còn lại của tuần), sau đó in tất cả trừ các dòng cuối cùng, sau đó in hàng.

Tùy thuộc vào việc bạn muốn lịch được phân trang theo tháng hay không, điều này có thể được thực hiện tốt hơn ona mỗi tháng thay vì mỗi năm.

3

Nói chung, khi bạn có một vấn đề lớn như thế này, bạn muốn chia nhỏ thành các vấn đề nhỏ dễ giải quyết hơn.

Đây là một vấn đề nhỏ có thể xảy ra: nếu bạn biết có bao nhiêu ngày trong một tháng và ngày nào trong tuần đầu tiên của tháng, bạn có thể xuất lịch cho tháng đó không?

1

Phần khó nhất là xác định ngày nào trong tuần của năm bắt đầu.

http://en.wikipedia.org/wiki/Calculating_the_day_of_the_week

Nhưng ngay cả khi không biết rằng, khi tôi lần đầu tiên thực hiện điều này, tôi đã sử dụng một ngày tham chiếu (ví dụ, bạn biết rằng ngày hôm nay, 11 tháng 1 năm 2010 là một thứ Hai) và đếm ngày, kể từ đó. (Chỉ cần ghi nhớ rằng năm nhuận có thêm một ngày, và đó là năm nhuận là mỗi 4 năm, ngoại trừ mỗi 100 năm, ngoại trừ mỗi 400 năm.)

http://en.wikipedia.org/wiki/Leap_year

4

Nó có thể giúp bạn hiểu được toán học của lịch. Nếu cuốn sách tuyệt vời Calendrical Calculations không có trong thư viện trường đại học của bạn, họ có thể giúp bạn in lại bài viết của cùng một tác giả trong Phần mềm — Thực hành & Trải nghiệm. Và yêu cầu giáo sư của bạn yêu cầu sách cho thư viện.

0

Đầu tiên, hãy tìm hiểu phần thuật toán của vấn đề của bạn - được một năm, tìm ngày 1 tháng 1 là gì.

Sau này, chỉ cần lưu ý số ngày trong mỗi tháng (lưu trữ số ngày trong một mảng, nói num_days[]) và ghi chú số tháng trong năm và một chuỗi các chuỗi cho các tháng.

Ví dụ: vòng lặp ngoài cùng lặp lại qua các tháng. Nói, lặp lại for(i=0;i<NumMonths;++i). Sau đó, mỗi tháng, in chuỗi, ví dụ: month[i], sau đó là một dòng mới.

Sau đó, với các tab đơn giản, in Sun Mon Tue ... và một dòng mới khác.

Sau đó, sử dụng ngày 1 tháng 1 tương ứng với (gọi số FirstDay), chèn dấu cách và bắt đầu với ngày đó. Hãy in các ngày và dòng mới cho đến khi bạn nhấn max_month[i]31 (cho tháng 1). Lưu trữ tên của ngày của ngày cuối cùng của tháng trước và chỉ nhắc lại ngày hôm đó là FirstDay.

0

Bạn cần một vài phần để bắt đầu. Đầu tiên, bạn cần một công thức tính toán ngày trong tuần cho ngày 1 tháng 1 của bất kỳ năm nào được nhập vào. Bạn cũng sẽ cần một công thức để xác định xem năm đó có phải là năm nhuận hay không. Cả hai công thức này đều dễ dàng tìm thấy với một tìm kiếm đơn giản của Google. Mục thứ ba bạn cần là một mảng đơn giản chứa số ngày trong mỗi 12 tháng cho năm không phải là năm nhuận.

Một khi bạn có những điều này, tầm quan trọng của nó để xác định ngày trong tuần cho mỗi tháng trong năm. Đảm bảo tính đến ngày 29 tháng 2 trong năm nhuận. Từ đó, bạn chỉ cần tạo ra một chức năng mà mồi ra lịch hàng tháng trong một hình thức trông giống như lịch treo trên tường. Trước tiên, hãy thử phác thảo bố cục mong muốn trên giấy và sử dụng nó làm mẫu để tạo các câu lệnh định dạng thích hợp.

0

Có thể xem thuật toán doomsday. Điều này sẽ giúp bạn có một số "ngày tận thế" nhất định như ngày 31 tháng 1 là ngày tận thế, cho năm 2008, đó là thứ bảy. Bạn có thể làm việc backwords từ đó

+0

Đây là quá mức cần thiết cho một bài tập về nhà như thế này. – jason

1

Mã này có đủ điều kiện không? :-)

char command[]="cal 2010"; 
sprintf(command,"cal %d",argv[1]); 
system(command); 

Nó giả định một máy Unix với cal trong đường dẫn.

0

Về cơ bản, có hai phương pháp:

  1. Các/cách thuộc về thực hành dễ dàng: Giải quyết các nhiệm vụ, và quên đi mọi thứ khác. Ở đây bạn có thể kiểm tra tài liệu cho mktime() (bạn sẽ tìm thấy một ví dụ dựa trên mktime bên dưới ..).

  2. Cách khoa học/kỹ thuật: Tìm hiểu cách hoạt động! Bạn có thể bắt đầu tại số great wikipedia article about the gregorian calendar. Đọc nó, hiểu nó, và viết mã thực hiện các thuật toán cơ bản (là được biết đến, không có khoa học tên lửa, có thể). Điều này sẽ cải thiện kỹ năng của bạn rất nhiều (trên thực tế, bạn thực sự nên làm một điều như vậy, có thể không phải là lịch nhưng một chủ đề khác, nó sẽ cho bạn một bước nhảy vọt lớn trong sự hiểu biết tất cả điều).

Bây giờ, hãy bắt đầu một số mã thực dụng. mktime() có một tính năng tuyệt vời: nó biết chi tiết lịch và nó chấp nhận ví dụ: một ngày "2010-01-60" và sẽ chuyển đổi nó thành 29 tháng 2 năm 2010. Nhưng, điều này sẽ chỉ làm việc cho những ngày sau năm 1970. Nó sẽ không hoạt động cho những ngày trước đó (mặc dù tôi không chắc chắn 100%, nhưng nó không nên ' t làm việc, bởi vì thời gian unix bắt đầu từ ngày 1 tháng 1 năm 1970, nhưng thử với các ngày khác, có lẽ mktime() không bị giới hạn thời gian unix).

Pseudo-Code, điều này sẽ in mỗi ngày trên một dòng đơn (YYYY-MM-DD):

void print_cal(int year) { 
    static char weekdays[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; 
    struct tm tm; 
    for(int day=0; day<365; ++day) { 
     memset(&tm, 0, sizeof(tm)); 
     tm.tm_year = year - 1900; 
     tm.tm_mday = day; 
     mktime(&tm); // modifies tm 

     printf("%04d-%02d-%02d, %s\n", tm.tm_year, tm.tm_mon+1, tm.tm_mday, weekdays[tm.tm_wday]); 
    } 
} 

Mã này bỏ qua năm nhuận. Bạn vẫn phải điều chỉnh nó để chính xác cho những năm nhuận! Ngoài ra kết quả không phải là rất đẹp được nêu ra, chỉ là một dòng mỗi ngày.

EDIT: thêm đầu ra của các ngày trong tuần.

Các vấn đề liên quan