2010年11月14日 星期日

幹,我只是來寫作業而已啊,為什麼會寫成講義呢???

這個經典的題目,似乎沒什麼最笨的寫法......

指定日期到指定日期之間的運算,就跟從一加到十一樣,其實都是一種很古老且經典的程式:


第一步:要會飛之前,先要會爬

//這是用來單純計算日期的

#include<iostream>
#include<iomanip>

using namespace std;

int main(void)

{

int i,d=0,dsum=0;//很多人在設全域變數的時候都會忘記在外面設好,不設會怎樣,其實也不會怎樣,for後面很難處理而已,除非你宣告他是全域變數,這就是c++最邪門歪道的地方
cout << "請輸入日期:" ;
cin >> d ;
for (i=1;i<d;i++)
{dsum = i;} //其實用空函數也可以,這樣做反而佔用記憶體,不過我爽,就多寫一個好了
cout << "總共幾天:" << i << "天" << endl;
system("pause");
return 0;
}



第二步:會爬之後,就要學怎麼走


//這是單純用來了解怎麼從指定日期算到月底的(未加閏年判斷)

#include<iostream>
#include<iomanip>

using namespace std;

int main(void)

{

int i,j,k;

cout << "請輸入一日期數字 : " ;
cin >> i;
cout << "請輸入月份 : " ;
cin >> j ;

if (j == 2 || j == 4 || j == 6 || j == 9 || j == 11) {

k = 30 - i;}//這一段很簡單,先不管閏年的話,就用大月小月來算吧

else {k = 31 - i;//娘的這樣還不會,那就去撞豆腐吧

}

cout << "天數等於 " << k ;
system("pause");
return 0;

}





第三步:會走之後,難保不會跌倒

//加入閏年判斷的指定日期到月底的算法

#include<iostream>
#include<iomanip>

using namespace std;

int main(void)

{
int i=0,j=0,k=0,asum=0;//一樣先指定日期月份年份,分開讓人輸入會比較清楚

cout << "請輸入一日期數字 : " ;
cin >> i;
cout << "請輸入月份 : " ;
cin >> j ;
cout << "請輸入年份 : " ;
cin >> k ;

if (j == 4 || j == 6 || j == 9 || j == 11) {//這一段很明顯的是要規避閏年限制,也就是說選中月份為小月

asum = 30 - i;}

else if (j==2) //這裡開始閏年判斷

{

if (k % 4 == 0 && k % 100 != 0 || k % 400 == 0){//用最直觀的方式來看,可以被4與400種除卻不能用100整除了就是閏年
asum = 29 - i;}

else {asum = 28 - i ;}//如果不是平年就是閏年,除非你住在火星上
}
else {asum = 31 - i;}//規避完閏平年及小月後就用這個算式吧,如果還有一個else的話,那地球是很危險的,快回火星去吧



cout << "天數等於 " << asum ;
system("pause");
return 0;

}


第四步:接下來就要會跳了

//這一段可以用來計算這一年總共經過多少天

#include<iostream>
#include<iomanip>

using namespace std;

int main(void)

{

int days=0,sign=0,y1=0,m1=0,d1=0;
cout << "請輸入開始年月日(數字之間請用空格分隔) : " ;
cin >> y1 >> m1 >> d1 ;

{
if(y1%4==0&&y1%100!=0||y1%400==0)
{
sign=1;
}
else
sign=0;
}

if (sign) {

if(1==m1)
days=d1;
if(2==m1)
days=31+d1;
if(3==m1)
days=60+d1;
if(4==m1)
days=91+d1;
if(5==m1)
days=121+d1;
if(6==m1)
days=152+d1;
if(7==m1)
days=182+d1;
if(8==m1)
days=213+d1;
if(9==m1)
days=244+d1;
if(10==m1)
days=274+d1;
if(11==m1)
days=305+d1;
if(12==m1)
days=335+d1;
}
if(!sign) {
if(1==m1)
days=d1;
if(2==m1)
days=31+d1;
if(3==m1)
days=59+d1;
if(4==m1)
days=90+d1;
if(5==m1)
days=120+d1;
if(6==m1)
days=151+d1;
if(7==m1)
days=181+d1;
if(8==m1)
days=212+d1;
if(9==m1)
days=243+d1;
if(10==m1)
days=273+d1;
if(11==m1)
days=304+d1;
if(12==m1)
days=334+d1;
}

cout << "這一年總共經過了 :" << days << "天" << endl ;
system("pause");
return 0;

}


第五步:小心跳過頭就不好玩了

//這一段可以用來計算這一年總共經過多少天

#include<iostream>
#include<iomanip>

using namespace std;

int main(void)

{

int days=0,sign=0,y1=0,m1=0,d1=0,edays=0;//當然你要先宣告一個變數edays
cout << "請輸入開始年月日(數字之間請用空格分隔) : " ;
cin >> y1 >> m1 >> d1 ;

{
if(y1%4==0&&y1%100!=0||y1%400==0)
{
sign=1;
}
else
sign=0;
}

if (sign) {

cout << "這年是閏年呢!!" << endl;//這一行讓人家看清楚一點
if(1==m1)
days=d1;
if(2==m1)
days=31+d1;
if(3==m1)
days=60+d1;
if(4==m1)
days=91+d1;
if(5==m1)
days=121+d1;
if(6==m1)
days=152+d1;
if(7==m1)
days=182+d1;
if(8==m1)
days=213+d1;
if(9==m1)
days=244+d1;
if(10==m1)
days=274+d1;
if(11==m1)
days=305+d1;
if(12==m1)
days=335+d1;
edays=366-days;//對,實際上就增加這一行而已
}
if(!sign) {

cout << "這年是平年呢!!" << endl;//跟上面一樣的道理
if(1==m1)
days=d1;
if(2==m1)
days=31+d1;
if(3==m1)
days=59+d1;
if(4==m1)
days=90+d1;
if(5==m1)
days=120+d1;
if(6==m1)
days=151+d1;
if(7==m1)
days=181+d1;
if(8==m1)
days=212+d1;
if(9==m1)
days=243+d1;
if(10==m1)
days=273+d1;
if(11==m1)
days=304+d1;
if(12==m1)
days=334+d1;
edays=365-days;//這一行不加的話,你就從頭在看一下吧
}



cout << "這一年總共經過了 :" << days << "天" << endl ;
cout << "到年底還有 :" << edays << "天" << endl;//事實上也就增加這個而已,訝異嗎?這就是程式阿....
system("pause");
return 0;

}

第六步:完成的部分


#include<iostream>
#include<iomanip>

using namespace std;
//這一段開始,首先,因為我們需要call fun(),所以我們必須先宣告
int back_days(int,int,int);
//看完前面的教學後,實際上整年的計算跟指定日期到月底的計算,到底是一樣的
int forward_days(int,int,int);
//同理,從月初到指定日期,跟從指定日期到年底的意義都是一樣的,要把日期的計算當成一種分段的線性
int year(int y1,int y2);
//back跟forward的意思就是頭尾,但是中間的整年的算法也必須要加上閏年判斷,但是這樣一來會比較好寫,因為判斷是閏年,就是i=i+366,else就是i=i+365

int main()
{
int y1,y2,m1,m2,d1,d2;

cout<<"請輸入第一個年月日(日期之間可用空格隔開):";
cin>>y1>>m1>>d1;
cout<<"請輸入第二個年月日(日期之間可用空格隔開):";
cin>>y2>>m2>>d2;
cout<<endl;
if (m1>12|m2>12|d1>31|d2>31){ //做一個簡易的輸入錯誤判斷,但是正確作法應該是月份作輸入判斷,日期依照閏年判斷後來做

cout << "數值輸入錯誤,別搞我了好嗎大哥!! " << endl << endl ;}

else {

cout << "數值輸入正確請耐心等候 ... ... ..." << endl << endl;}


if(y1>y2)//這一種寫法是所謂的使用者介面親和,也就是說你不能把程式寫成大型計算機,而是最好寫成可以看懂的玩意兒
{
cout<<y2<<"年"<<m2<<"月"<<d2<<"日到"<<y1<<"年"<<m1<<"月"<<d1<<"日是";
cout<<forward_days(y2,m2,d2)+back_days(y1,m1,d1)+year(y2,y1)<<"天"<<endl;//假如有人擺爛,程式也要自行判斷那個年份的日期比較大來顯示
}
if(y1==y2)
{
{
if(back_days(y1,m1,d1)>back_days(y2,m2,d2))
{
cout<<y2<<"年"<<m2<<"月"<<d2<<"日到"<<y1<<"年"<<m1<<"月"<<d1<<"日是"<<back_days(y1,m1,d1)-back_days(y2,m2,d2)<<"天"<<endl;
}
else
{

cout<<y1<<"年"<<m1<<"月"<<d1<<"日到"<<y2<<"年"<<m2<<"月"<<d2<<"日是"<<back_days(y2,m2,d2)-back_days(y1,m1,d1)<<"天"<<endl;
//事實上,這一小段判斷雖然是可有可無,可是最好能謹記在心
}
}


}
if(y1<y2)
{
cout<<y1<<"年"<<m1<<"月"<<d1<<"日到"<<y2<<"年"<<m2<<"月"<<d2<<"日是"<<forward_days(y1,m1,d1)+back_days(y2,m2,d2)+year(y1,y2)<<"天"<<endl;//這一段也是 同上的原理
}

system("pause");

}

int forward_days(int y,int m,int d) //假如不call函數的話,整體的變數複雜度會呈現指數複雜度,所以觀念清楚後,可以不必用指標,但必定要call fun()
{

int days=0; //call fun()有個好處,前面我們可以先用if排好,不管誰大誰小,這一段就是在計算指定日期的尾巴 ,也就是指定日期到年底的距離
days=back_days(y,m,d);
int sign; //閏年判斷依據

{
if(y%4==0&&y%100!=0||y%400==0)//這段看不懂,就跳樓吧
{
sign=1;
}
else
sign=0;
}
{
if(sign)
days=366-days;
else
days=365-days;
}
return days;
}
//******************************************************
int back_days(int yy,int mm,int dd)
{
int days;
int sign;

{
if(yy%4==0&&yy%100!=0||yy%400==0)
{
sign=1;
}
else
sign=0;
}
{
if(1==mm) //這一段前面的講義也講過,大部分的人會用switch來做,不過我用最笨的方式,這是用來計算年初到指定日期的距離,這兩種作法都一樣有好處,都比較方便加入閏年判斷
days=dd;
if(2==mm)
days=31+dd;
if(3==mm)
days=60+dd;
if(4==mm)
days=91+dd;
if(5==mm)
days=121+dd;
if(6==mm)
days=152+dd;
if(7==mm)
days=182+dd;
if(8==mm)
days=213+dd;
if(9==mm)
days=244+dd;
if(10==mm)
days=274+dd;
if(11==mm)
days=305+dd;
if(12==mm)
days=335+dd;
}
if(!sign)//但是這裡就可以比較輕鬆一點,因為直接用閏年判斷,就不需要跟剛剛教學講義一樣再寫一段了,平年等於閏年-1。
days=days-1;
return days;
}
//***************************************************************
int year(int y1,int y2)
{
int i=0;
int sign;
for(int y=y1+1;y<y2;y++)//算整年的話,就跟日期到日期的意思是一樣的,就是兩個數字之間的距離,所以用for來算是比較方便的
{
{
{


if(y%4==0&&y%100!=0||y%400==0)//只是要記得加入閏年判斷 揪咪! >_^
{
sign=1;
}
else
sign=0;
}
}

{
if(sign)
i=i+366;
else
i=i+365;
}


}
return i;
}

2010年11月13日 星期六

夜觀某文後有感 - 其實,過去我曾每天抱怨這件事情....


  孩子,同學,我眼中最秀氣美麗的女孩......「那是因為你沒見過我家人」這句話,我十年前講過,六年前講過,今天年初我也講過,我輔導過不少跟我講這句話的人,甚至包括當兵的朋友,這句話在往後,在離別後,你將會發現可以講這句話,是何等奢侈的事情。

  認識我的人大致上都知道,我雖然反叛性奇重,又喜歡獨斷獨行,但是骨子裡......仍是個相當保守且遵守傳統的傢伙。

  這起源於我的傳統家庭教育與後來的職場、學校環境所致,我很享受這種表裡不一,而且可以隨時替換身份的感覺,像是「不可能的任務」第一集裡面,Max對主角講的話:「代替用的身份就像是溫水被一樣,暖洋洋的讓人有種受到保護的感覺」。

  我極為自負,尤其對於一身學問而言,還有處理事情的手段,小從整理房間,大到整理帳目,我都有自己一套的邏輯,這套邏輯,我不容許他人對抗與侵犯,只要是弄亂這套邏輯的人,我必毫不留情的批評,並指責不按照我的邏輯做事的種種後果,因為我喜歡扛責任,但是我討厭收爛攤子。

  從以前到現在,膽敢「挺身而出」對抗我的邏輯概念的,就只有我的家人,不論我在外面有多光鮮亮麗,回到家我就是次末的家庭成員,而這一點,在以前的每一天,我都無法接受,所以我總是諸多批評,而且諸多厭煩......。

  事實上,我用了相當久的時間來整理情緒,直到現在,我才有辦法好好的對談與談論某些事情,且不提我落後了學校進度幾乎一個半月的課業,與公司裡面的事情,我想說的是,昨天看完某篇文章後,我突然想起當初在寫告別式致謝詞的事情。

  家人看完後,都哭的一把鼻涕一把眼淚,向來長於批評我撰文能力的姊姊,總算給予我的文章正面的評價,指稱「這是平淡無奇中顯見真功夫」的文章,我爸就更別提了,其實我在寫那篇文章的時候,我什麼都沒想,我只是想起從很久以前,到媽媽住院後的許多點點滴滴,而諷刺的是,那些畫面,無一非所謂的「對抗我的邏輯」的日常片段。

  我媽常把我的衣服整理到不見,比方說大一到大二的夏季衣服,他們在家中消失長達六年,這份衣服清單包括數十條內褲與襪子,還有大三買的外套,大四買的長袖襯衫等等,不計其數的衣服都給媽媽整理到消失。

  我每個禮拜都會整理房間,每次都是整理的有條不紊,然後在隔天被搞的亂七八糟,不是桌上又堆了一大堆水瓶,就是被堆了一些營養食品,還有水果盒,和一堆洗好的襪子跟內褲,還有滿屋子亂掛的襯衫,而媽媽暴躁的脾氣也常被我拿來寫在部落格中,配合她無與倫比的毒舌跟一針見血的批評,種種開火的火力絲毫不遜於我,這些日子的片段組合成一個活生生的媽媽,而我想的,幾乎就是這些。

  動什麼都會被罵,做什麼都是不對,什麼都是她最大......
  
  我也在不下數十次的對談中透露出我恨死這段日子,家人的生病把我留在高雄長達數年,把我的雄心壯志完全消磨殆盡,我非常懷念跟真正有知識的人的對談,談論文史哲,談論那些艱深且充滿玄機的話題......。

  後來,將時間推進了一下,到了住院之後的生活,這裡的片段,是我一生中最難忘的記憶,我想起常常滿醫院的跑,填寫一推莫名其妙的表格,然後再回到病房去跟媽媽報告今日進度,我會把重病的表格,講成請領補助的表格,醫生的病情隱憂,解釋成「只要處理好這一段就會獲得健康」的說法,當時我滿醫院的跪,滿醫院的失望,被強迫出院的時候,我掛院長的門診,進去就下跪磕頭,希望他能多給我一點時間,自尊什麼的,社會地位什麼的,是我當時用來拋棄的最有利籌碼。

  而這些,都是為了去換取所謂的「對抗我邏輯的日子」所做的努力,真是稀奇,我明明討厭人家對抗我的邏輯,為什麼我還要去爭取呢?在外面,我風光極了,人人都稱呼我為李先生,但是回到病房,家人還是毫不留情的把我降到最末,稱呼我「阿弟仔」,批評我吃東西挑食,而我竟然要去為了這段時間努力......。

  告別式後,我整理了自己的房間,整理完後,覺得自己真滿意,我的衣櫥裡面有完整的夏季衣服(一格),完整的冬季衣服(一排),掛了熊寶貝的香精袋,襪子好好的放在袋子中,內衣內褲都歸類好,然後起身拿水,發現水壺沒水了,只有整齊的書桌跟電腦,空蕩蕩的房間,到處都是有條不紊的景象......

  我去廁所刮個鬍子,發現衛生紙沒了,補充完衛生紙後,發現枕頭套皺了,又發現空蕩蕩的書桌上沒有那些凌亂的安全別針,找了半天後,肚子也餓了,但是我找了半天,還是找不到東西可以吃,洗完澡後,我把門開一個縫,才發現外面沒有掛好的毛巾,我得自己去陽台拿。晚風很冷,讓我急匆匆的躲回浴室擦身體......

  那不是悲從中來,取而代之的,是一種濃濃的失落感,我很清楚,我比誰都清楚......十六號當天早上是我一手冷靜的跟醫生對談,經過三方同意後停止使用止喘劑,而改用嗎啡。

  所以我比任何人都清楚,這是一種無法再度回頭的心情,不再有人坐在那邊,聽我上樓去吹噓我把房間整理的多乾淨,或是去抱怨公司有多累,也不再有人可以讓我問安全別針放哪裡,水壺不會隨時有人加滿,廁所的衛生紙再也不會神奇的補充,也不再有人會隨時幫我準備吃的,不再需要晚回家的時後,上去三樓報告......

  「媽~我回家了......」。

  整理完房間過後幾天,因為我把我媽的告別式辦的隆重而風光,親戚沒口子的稱讚,一位跟媽媽很好的阿姨來我家時,還跟笑著叫我可別因此而太驕傲了喔......不知道為什麼,我聽了之後完全沒反應,只是淡淡的說:「實際上,我很討厭......我得親自把媽媽的葬禮辦得這麼好」。

  因為我知道我沒有一個坐在三樓打電腦的老媽子可以吹噓了......。
  

  我想說的是,可能傳統的家庭習慣,把我們逼的很緊,就如同孔孟學說,始終會有一票年輕學子去批評迂腐,這是一千年前人家講過的,二千年前人家講過的,連古埃及都把這種情緒刻在金字塔中(附註:這段文字被刻在石碑上,談論:現在的年輕人啊......),但我們不得不沈痛的去瞭解,真理,就在這裡面。

  這些厭煩的日子,構成了我們鞭策自己態度的指標與依歸,還有對於倫理跟親情的重新認定,是的,有些爸爸回家會強姦女兒,母親回家會揍孩子,所以更不能因此而讓自己成為行為心裡學下的案例,子曰:「何以報德?以直報怨,以德報德。」,亦曰:「以德報怨,則寬身之仁也;以怨報德,則刑戮之民也」。

  幾千年來,同樣的事情一直都有,所以幾千年前,人家也提出了終極的回答,儘管我有點來得及做,但離別還是離別,不是嗎......剛剛騎車出來的時候,路上看到有一個媽媽載著兩個幼子出門,她一手托住後面的長子,又一手將站在機車龍頭的幼子扶正。

  不知道為什麼,這種平常的場面看在我的眼裡,卻比什麼都還要珍貴萬分。