Re: [問題] 請求幫忙解釋C語言

看板PLT (程式語言與理論)作者 (ㄚ隆)時間15年前 (2009/04/10 04:14), 編輯推噓1(107)
留言8則, 3人參與, 最新討論串2/3 (看更多)
※ 引述《IwanTuRasS (阿姨)》之銘言: : 各位版大,小弟不才,初學C語言不久 : 下列這個程式是關於輸入年跟月來PRINT出月曆的程式 : 有些地方 (我用/**/包起來的地方 ) 看不太懂各位大大希望可以解釋看看 : 感激不盡(這個程式是可以編譯執行的 不是要大大幫我除BUG) : #include <stdio.h> : int main(int argc, char *argv[]) : /*這邊後面宣告的是什麼意思 一定要這樣打嗎*/ 這是C語言的main function, C語言程式"一般"都是從main這邊開始執行的, 以上的宣告不一定是這樣, 後面"(int argc, char *argv[])"的參數宣告, 是表示可以傳參數給main function, 就是一般你在命令模式要執行這支你 compile好的執行檔(例如Windows/DOS下的 *.exe 檔案)時傳入的命令參數, 舉例來說, 你編(compile)好的這支程式叫 "calendar.exe" 好了, 那如果 你執行時是這樣執行: C:\EXAMPLES\calendar.exe 123 freedom 那麼後面"123 freedom"就是傳入給 main的參數! 比較要注意的是, C語言的 "固定" 會把自己這支程式的名稱當成一個參數 傳入main function, 所以實際上你也要把我上面舉例的"calendar.exe"當 成一個參數! 所以上面例子是一共傳入 3 個參數給main function喔! argc是表示傳入的參數個數, 以上例來說, argc = 3 argv[]是存放實際參數的地方, 上例來說, argv[0] = "calendar.exe", argv[1] = "123", argv[2] = "freedom" 所以, 如果你是用 "C:\EXAMPLES\calendar.exe" 不傳入參數來執行, 就變成, argc = 1, argv[0] = "calendar.exe", 了解嗎? (*請看上面 ..."固定"... 那邊的解釋!) 你也可以不傳參數, 這時, 你可以把main function寫成: int main(void) 這樣一樣可以, 只是你程式中就不能去使用argc與argv[]了喔! (*你的程式是根本沒有用到argc, argv[]的, 所以這樣宣告OK啦!) 再來我們來說 "int main..." 中的 "int" ! 這個int是表示函式(function)的傳回值是整數型態, 剛好在這邊是 main function, 所以表示我們main function執行完要回傳一個整數, 所以你會在後面main function結束前看到 "return 0;" 這東東! 當然你也可以不要這個回傳值啊! 所以又可以寫: void main(void) 這樣你就不用寫"return 0;"這行 結論, main function有以下 4 種組合可以寫: int main(int argc, char *argv[]) int main(void) void main(int argc, char *argv[]) void main(void) : { : int i, j, l, y, m, d, w; : int b[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; : printf("請輸入年/月:"); : scanf("%d/%d", &j,&k); : y = j; : l = (y%4==0) && (y%100!=0) || (y%400==0); : /*這邊&&是什麼意思*/ && 是邏輯運算AND(Logic AND), 也就是 "A 而且 B" 中的 "而且" 的意思! 以後你還會看到只有一個"&"的 &, 那個叫位元運算AND(Bitwise AND), 到時 你再問人囉! ( e.g: 11011001 & 00111001 = 00011001 ) : y =y+y/4-y/100+y/400; : for (m=k; m<k+1; m=m+1) : { : printf("\n%d年%4d月\n 日 一 二 三 四 五 六\n", j, m); : /*以下開始的回圈我就不是很懂了*/ 以下迴圈就只是要去判斷該月的第幾天落在星期幾, 然後印到相對位置, 需要判斷要不要換行? 該月第一天沒有落在星期日時, 要空幾天? 詳細我就不說了, 網路上有許多關於曆法的資料可參考, 所以以下程式 只是套用公式, 並使用查表法(上面的b[])來做而已, 不難! : for (w=y, i=0; i<m; i++) : w=w+ b[i]; : if (l && m<3) w=w-1; : w %= 7; : if (w) printf("%*s", w*3, " "); : /*這邊超級不懂 */ 這裡的printf就是要處理該月第一天不是落在星期日的問題, 所以判斷 w 不為 0 時 (if (w)), 要多印出空白, 至於這邊的 printf是屬於 "進階" 用法, 在此不詳述, 你也可以把這裡的 if (w) ... 這行後面的printf用一個你剛入門會想到的for迴圈 加上不使用進階用法的printf迴圈主體來替換掉(印出空白), 之 後懂進階的printf用法後就會知道上面人家怎麼會這麼寫. : for (i=1; i<=b[m]; i++) : { printf("%3d", i); : if (++w == 7) : { printf("\n"); : w = 0; : } : } : if (w) printf("\n"); : } : return 0; : } : 感謝各位了 以上給你參考, 希望對你有幫助! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 211.74.246.199

04/19 02:18, , 1F
其實... main的回傳值最好是用int
04/19 02:18, 1F

04/19 02:19, , 2F
不然印象中Dev-C++不會過
04/19 02:19, 2F

04/19 02:19, , 3F
然後... 有個回傳0也比較好 告訴使用者程式是正常結束
04/19 02:19, 3F

04/19 14:53, , 4F
嗯,比較標準的寫法應該都要用 int 當回傳值。
04/19 14:53, 4F

04/21 11:01, , 5F
以上兩位說的都對, 不過Dev-C++是用GCC(mingw)吧? 我本
04/21 11:01, 5F

04/21 11:04, , 6F
身是用mingw+msys試是會過的! 我常用void main(void)來
04/21 11:04, 6F

04/21 11:05, , 7F
寫一些function的test case, 嗯, 不過勤勞點寫int main
04/21 11:05, 7F

04/21 11:06, , 8F
然後回傳個0是值得被鼓勵的, 謝謝以上兩位意見喔!
04/21 11:06, 8F
文章代碼(AID): #19tbShlo (PLT)
討論串 (同標題文章)
文章代碼(AID): #19tbShlo (PLT)