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;
}

沒有留言: