作者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