PCDVD數位科技討論區

PCDVD數位科技討論區 (https://www.pcdvd.com.tw/index.php)
-   七嘴八舌異言堂 (https://www.pcdvd.com.tw/forumdisplay.php?f=12)
-   -   寫程式:找出每個月的第二個星期二 (https://www.pcdvd.com.tw/showthread.php?t=1078668)

vxr 2015-05-23 08:54 PM

引用:
作者micall.lee
如果自己都不願意學,該上課卻翹課,考試都作弊過關,不會是正常

我的問題是如果學生願意好好上課,學校教育也沒辦法讓資工系畢業的寫這種邏輯?

寫不出來沒關係...
學會看API的doc就行了...
練一練就會寫了..

如果連API的doc都看不懂, 那就真的是入錯行了...
沒天分, 沒資質...
學會看API的doc比會寫還重要..
很多就是看到API文件是英文開頭就馬上放棄...

學校教育教的一個課題應該也包括如何看懂API文件..
只是很多應該都是略過不講...:unbelief:..

NTC_TW_IT 2015-05-23 08:57 PM

一年有365天
一年有約52周=52*7+1
所以正常情況下,每年當月當日的星期x就會自動shift一天
如果偷懶一點,弄個長度為12的陣列,隨便抓各一年把當年每月第二個星期二擺進去
這樣就可以瞬間抓出你要的答案了
假如以2017當基準(2016是閏年)
2017年二月的第二個星期二是7號-->隔年就會變6號-->再隔年5-->再隔年4->再隔年9(剛過閏年多減1--因為2-2=0,所以2會落到第一周,要加7才對)
用這個演算法,應該很容易寫成程式吧?

AntoineHu 2015-05-23 09:22 PM

星期是循環的,所以第二個週二一定在第8∼14天之間,只有7種可能,判斷一下就好,不用迴圈...
如果知道 xx月 1日 是星期w
w>2 : 第二個星期二是 xx月 17-w 日
w<=2 : 第二個星期二是 xx月 10-w 日

打工吧魔王大人 2015-05-23 09:54 PM

引用:
作者vxr
寫不出來沒關係...
學會看API的doc就行了...

學校教育教的一個課題應該也包括如何看懂API文件..
只是很多應該都是略過不講...:unbelief:..


那,把
http://developer.android.com/reference/packages.html
看完就????

vxr 2015-05-23 09:58 PM

引用:
作者打工吧魔王大人

你覺得你很神..
你就把他看完吧...:laugh:...

我個人不想做這種殺死腦細胞...:laugh:...

Crazynut 2015-05-24 07:06 AM

我的第一感也是找到第一個星期二,然後給它+7天……

路有很多種啦,知道剛好可以應用的函數很好,不知道也無所謂,只要邏輯正確都可以推出來的。

年輕時和教課的講師說的一樣,會沈迷於盡可能寫出精簡的程式,最好一行結束,又帥又神氣。

其實這都不是必要的,寫出簡明易懂的程式比較方便後人維護、依情況改變時方便修改才是正途。等到程式龐大到某個程度再來考慮精簡的問題吧。

嚐起來像雞 2015-05-24 10:21 AM

PHP
代碼:
<?php
    $year = '2015';
    $month = '04';
    $dt = new DateTime("{$year}-{$month}");
    $dt->modify('second tuesday');
    echo "{$year}年{$month}月的第二個禮拜二是",$dt->format('Y-m-d');
?>


會不會寫不重要
我覺得重要的是有基本sense跟找尋資源的能力

炭甲郎 2015-05-24 01:13 PM

如果可以運用模組的話
這程式邏輯不是很難

使用 PERL
代碼:
use DateTime;
my $yyyy = 2015;
my $mm = 05;
my $date = DateTime->new(year => $yyyy, month => $mm);
$date->subtract(days => ($date->day_of_week - 2) % 7 - 7 * 2);
print "$yyyy年$mm月的第二個禮拜二是$date\n";


代碼:
use Date::Manip::Base;
my $dmb = new Date::Manip::Base;
my $yyyy = 2015;
my $mm = 5;
my $ymd = $dmb->nth_day_of_week( $yyyy, 2, 2, $mm);
printf "$yyyy年$mm月的第二個禮拜二是%s\n", join '-', @$ymd;


代碼:
use Date::Manip::Date;
my $date = new Date::Manip::Date;
$date->parse('Second Tuesday in Jul 2015');
print $date->printf('%Y-%m-%d'); # prints 2015-07-14

anomaly 2015-05-24 01:34 PM

重點是萬年曆的運算, 英文版Wiki有說如何運算

http://en.wikipedia.org/wiki/Julian_day#Calculation

以下C99 code是小弟網路上找的, 利用以上演算, 不仰賴外部library. code只有3行, 若要壓到1行也是可以的, 但compiler會抱怨, 且最後轉出的assembler不會比較優.

代碼:
#include <stdio.h>

const char *wd(int year, int month, int day) {
  static const char *weekdayname[] = {"Monday", "Tuesday",
        "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};
  size_t JND =                                                     \
          day                                                      \
        + ((153 * (month + 12 * ((14 - month) / 12) - 3) + 2) / 5) \
        + (365 * (year + 4800 - ((14 - month) / 12)))              \
        + ((year + 4800 - ((14 - month) / 12)) / 4)                \
        - ((year + 4800 - ((14 - month) / 12)) / 100)              \
        + ((year + 4800 - ((14 - month) / 12)) / 400)              \
        - 32045;
  return weekdayname[JND % 7];
}


找出第一個週二再稍微寫一些code即可

oversky. 2015-05-24 02:19 PM

http://rosettacode.org/wiki/Day_of_the_week

95 種程式語言應該夠用了吧 :laugh:


所有的時間均為GMT +8。 現在的時間是07:09 PM.

vBulletin Version 3.0.1
powered_by_vbulletin 2025。