iT邦幫忙

0

求大神幫忙小弟抓出程式的問題點(C語言)

不明 2019-10-08 20:25:012026 瀏覽

我想寫一個幾秒後,讓電腦做出指令。
我的想法是先讀取當下的時間(存放在seconds),然後再輸入未來時間(指令要開始的時間),再來兩者相減,可是讀出的直怪怪的?????
#include <stdio.h>
#include <time.h>
int main ()
{
int seconds=time((time_t*)NULL);//讀取現在時間

int sec;
int Y,M,D,H,MIN,SEC;
printf("請輸入年分、月份、日期、幾時、幾分、幾秒=");
scanf("%d%d%d%d%d%d",&Y,&M,&D,&H,&MIN,&SEC);


int year;//多少年
int a=0;
int b=0;
for(year=1970;year<Y;year++)
{
	
	if( year%400==0 || ( year%4==0 && year%100!= 0 ) )
	{
		a=a+1;
					
	}   
    else
        b=b+1;
}

int month2;//月份對應天數
scanf("%d",&M);
switch(M)
{
case 1:
month2=0;
break;
case 2:
month2=31;
break;
case 3:
month2=59;
break;
case 4:
month2=90;
break;
case 5:
month2=120;
break;
case 6:
month2=151;
break;
case 7:
month2=181;
break;
case 8:
month2=212;
break;
case 9:
month2=243;
break;
case 10:
month2=273;
break;
case 11:
month2=304;
break;
case 12:
month2=334;
break;
printf("month2=%d",month2);
}
sec=((a366+b365)(243600))+((month2+D)243600)+(H3600)+(MIN60)+SEC;
sec=sec-seconds;
printf("After %d seconds will shotdown the computer",sec);
return 0;
}

哪裡怪 你輸出的值是什麼
不明 檢舉
請輸入年分、月份、日期、幾時、幾分、幾秒=2019 10 8 22 25 0
After 115501 seconds will shotdown the computer
(執行當下時間:2019 10 8 22 20 0)
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
2
小魚
iT邦大師 1 級 ‧ 2019-10-08 22:29:58
最佳解答

自己算蠻辛苦的,
現在C++還沒有DateTime物件嗎?
還是你要學的是傳統的C語言,
有需要這麼拚嗎?

看更多先前的回應...收起先前的回應...
不明 檢舉

我其實是自學C語言(並不知物件的方法),剛好有個同學是資工系的,有個作業是自動關機的程式。我是想用自己已知的方法去寫寫看

小魚 iT邦大師 1 級 ‧ 2019-10-09 08:19:01 檢舉
  1. 首先你D的地方多加了一天,
    今天是9號,
    你加9天就等於多了一天,
    你應該要加8天.

  2. 你忘了考慮時區的問題,
    系統抓的秒數是以UTC時間,
    也就是會少8個小時.

綜合以上兩點,
你總共多算了32個小時 = 115200秒,
所以你的結果 115501 - 115200 = 301秒,
看來你的秒數應該也多了1...
不過也可能是計算的時候是前一秒也不一定...

另外,
3. 你是不是忘了考慮今年是平年還閏年?

小魚 iT邦大師 1 級 ‧ 2019-10-09 08:26:18 檢舉

不過我好奇的是,
一天為什麼是243600秒呢?

啊我懂了,
原來是 24 * 3600,
你的算術符號都不見了...
/images/emoticon/emoticon16.gif

ant1017 iT邦新手 2 級 ‧ 2019-10-09 08:38:14 檢舉

24*3600不是86400嗎-.-
求解釋..

小魚 iT邦大師 1 級 ‧ 2019-10-09 08:41:55 檢舉

我以為是24萬3千6百秒

不明 檢舉

謝謝,問題解決了

不明 檢舉

system( "shutdown -f -t %d",sec) ;
請問為甚麼不能直接讀取sec 的值啊?

小魚 iT邦大師 1 級 ‧ 2019-10-10 22:36:09 檢舉

你沒有printf啊.
/images/emoticon/emoticon01.gif

不明 檢舉

我如果要加入關機指令,然後讓他讀取sec的值,請問要怎麼寫啊?

小魚 iT邦大師 1 級 ‧ 2019-10-11 13:19:51 檢舉

我沒試過,
不過應該是
system(printf(xxx xxx %d, rec));
這樣子試試看吧...
應該說照你原本的語法,
只是要加個printf,
否則 %d 應該會直接被當成文字吧...

p.s.
因為你把原文改掉了,
我也忘記你原本的語法是什麼了...

0
淺水員
iT邦大師 6 級 ‧ 2019-10-09 00:49:51

就算是 C 語言,也是有現成的可以用
可以參考:time.h
(大概會用到:localtime、mktime、struct tm 這幾個)

1
dragonH
iT邦超人 5 級 ‧ 2019-10-09 01:28:42

算法的問題

用你的算法

2019-10-8 22:25:00

(17897) * 24 * 3600 + (273 + 8) *24 * 3600 + 3600 * 22 + 25 * 60 = 1570659900

2019-10-8 22:20:00

(17897) * 24 * 3600 + (273 + 8) *24 * 3600 + 3600 * 22 + 20 * 60 = 1570659600

相減等於 300 = 5 分鐘

答案沒錯

但是 timestamp (我用 js new Date() 取的值)

2019-10-8 22:25:00

Number(new Date('2019-10-08 22:25:00')) / 1000 = 1570544700

2019-10-8 22:20:00

Number(new Date('2019-10-08 22:20:00')) / 1000 = 1570544400

用你的算法取的值

都會多 115200 秒 (32 分鐘小時)

然後用 timestamp 去 跟你算的值相減

也就會得到 115200(誤差值) + 300(答案) = 115500(最後算的結果)

我是不知道哪裡出問題啦

但是這種東西通常也不會手算就是 /images/emoticon/emoticon07.gif

參考

小魚 iT邦大師 1 級 ‧ 2019-10-09 08:20:10 檢舉

我知道哪裡出問題,
我的回答有說了.

另外,
是32小時不是32分鐘...

dragonH iT邦超人 5 級 ‧ 2019-10-09 09:08:28 檢舉

/images/emoticon/emoticon82.gif

1
海綿寶寶
iT邦大神 1 級 ‧ 2019-10-09 09:45:28

原因出在int seconds=time((time_t*)NULL);//讀取現在時間可能是「美國時間」

可以加下面這段看一下就可以確定
你程式裡的「讀取現在時間」是不是比你手錶的時間「早 24+8 個小時(115,200秒)」

time_t rawtime;
struct tm * timeinfo;

time ( &rawtime );
timeinfo = localtime ( &rawtime );
printf ( "\nCurrent local time and date: %s\n", asctime (timeinfo) );

選我正解

忘了回答「程式的問題點」
有一個問題
前面的for(year=1970;year<Y;year++)有判斷「閏年」

後面的int month2;//月份對應天數 那一堆 case
沒有判斷閏年
/images/emoticon/emoticon57.gif

淺水員 iT邦大師 6 級 ‧ 2019-10-09 10:46:38 檢舉

說美國時間好像怪怪的,要說的話英國的格林威治才是最接近的。

我要發表回答

立即登入回答