作者tomnelson (ㄚ隆)
看板PLT
標題Re: [問題] 請求幫忙解釋C語言
時間Fri Apr 10 04:14:34 2009
※ 引述《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
1F:→ weiyucsie:其實... main的回傳值最好是用int 04/19 02:18
2F:→ weiyucsie:不然印象中Dev-C++不會過 04/19 02:19
3F:→ weiyucsie:然後... 有個回傳0也比較好 告訴使用者程式是正常結束 04/19 02:19
4F:推 jtmh:嗯,比較標準的寫法應該都要用 int 當回傳值。 04/19 14:53
5F:→ tomnelson:以上兩位說的都對, 不過Dev-C++是用GCC(mingw)吧? 我本 04/21 11:01
6F:→ tomnelson:身是用mingw+msys試是會過的! 我常用void main(void)來 04/21 11:04
7F:→ tomnelson:寫一些function的test case, 嗯, 不過勤勞點寫int main 04/21 11:05
8F:→ tomnelson:然後回傳個0是值得被鼓勵的, 謝謝以上兩位意見喔! 04/21 11:06