作者 主題: 為什麼有錯?  (閱讀 12267 次)

0 會員 與 1 訪客 正在閱讀本文。

fell0206

  • 活潑的大學生
  • ***
  • 文章數: 339
    • 檢視個人資料
為什麼有錯?
« 於: 2006-07-26 22:13 »
各位大大,我的程式如下:

#include<stdio.h>
int main(void)
{

menu()

return 0;

}


int menu(void)
{
printf("歡迎使用此系統 \n");
printf("請選擇有要用的功能代號 \n");
printf("1.計算機 \n");

}


在編譯的過程中,一直有二個錯!不知錯在那?
請各位大大指導一下!!! Thank you~

湯姆貓

  • 活潑的大學生
  • ***
  • 文章數: 475
    • 檢視個人資料
為什麼有錯?
« 回覆 #1 於: 2006-07-26 22:43 »
這裡嗎??
menu();

fell0206

  • 活潑的大學生
  • ***
  • 文章數: 339
    • 檢視個人資料
為什麼有錯?
« 回覆 #2 於: 2006-07-26 23:02 »
啊!忘記加了!!
OK了!!! ^^
感謝大大的指點!! Thank you~

fell0206

  • 活潑的大學生
  • ***
  • 文章數: 339
    • 檢視個人資料
為什麼有錯?
« 回覆 #3 於: 2006-07-28 00:08 »
各位大大我的程式又出了問題!內容如下:
#include<stdio.h>
int number;

int main(void)
{

menu();

if (number=1)
system("cls");
calculator();

return 0;

}


int menu(void)
{

printf("歡迎使用此系統 \n");
printf("請選擇有要用的功能代號 \n");
printf("1.計算機 \n");
printf("請選擇所要使用的功能代號:");
scanf("%d",&number);
}

int calculator(void)
{
int a,b,math;
char c;
scanf("%d %c %d",&a,&c,&b);
if (c="+")
math=a+b;
else if(c="-")
math=a-b;
else if (c="*")
math=a*b;
else (c="/");
math=a/b;
printf("%d \n",math);

}

為什麼不管我怎麼打!結果都"1"!為什麼會這樣??請各位大大指導!!
Thank you~~

Darkhero

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 3728
  • 性別: 男
    • 檢視個人資料
    • ㄚ凱隨手紀
為什麼有錯?
« 回覆 #4 於: 2006-07-28 00:25 »
這個錯了...
代碼: [選擇]
if (number=1)
希望我們的討論是為了把問題解決,而不是爭論誰對誰錯.
『灌水才是重點,發文只是順便』
『我寧可讓不會釣魚的工程師餓死,也不想讓會餓死的工程師去攪沉公司....』
Blog: http://blog.darkhero.net/
秘密基地: http://www.darkhero.net/comic/
目前服務的網站: http://www.libook.com.tw/

thyme

  • 老人組
  • 俺是博士!
  • *****
  • 文章數: 1281
    • 檢視個人資料
為什麼有錯?
« 回覆 #5 於: 2006-07-28 09:58 »
引述: "Darkhero"
這個錯了...
代碼: [選擇]
if (number=1)


從頭到尾的 if 判斷式都錯了,要用 == 不是用 = 。

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
為什麼有錯?
« 回覆 #6 於: 2006-07-28 10:14 »
最近好像有不少這種問題  :o

是不是現在的入門書都沒有說明 =, == 的不同  :roll:

leeraphael

  • 可愛的小學生
  • *
  • 文章數: 28
    • 檢視個人資料
    • http://www.wretch.cc/blog/leeraphael
為什麼有錯?
« 回覆 #7 於: 2006-07-28 11:51 »
嗯....樓主   "提問的智慧" 可以看一下
建議啦!!

oscars80

  • 憂鬱的高中生
  • ***
  • 文章數: 92
    • 檢視個人資料
為什麼有錯?
« 回覆 #8 於: 2006-07-28 17:04 »
怎麼看都覺得有點像是在寫作業的感覺... =.=

以下是建議:
1.在compile的時候至少都會顯示第幾行有錯誤吧
 或者會產生一些錯誤訊息,去看這些訊息來找出你程式錯誤的地方,
 會遠比你把程式po來這邊問大家等回應來的快多了。
2.我不知道是剪貼簿還是論壇的格式影響,也或者是本來寫作問題,
 程式的格式,最好能夠多多的練習跟習慣一下,無論是在程式判讀或
 在其他方面都會很不錯。
3.覺得有問題的話,可以在幾個程式的處理點下一些提示的語句。如果
 你能學會用gdb的話,debug起來會輕鬆很多。

給人魚吃不如給他魚竿自己釣,希望下次不要在看到有人又是這樣:
先貼一大篇程式出來,自己不debug,然後叫人「幫忙」看。

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
為什麼有錯?
« 回覆 #9 於: 2006-07-28 17:31 »
引述: "oscars80"
1.在compile的時候至少都會顯示第幾行有錯誤吧
 或者會產生一些錯誤訊息,去看這些訊息來找出你程式錯誤的地方,
 會遠比你把程式po來這邊問大家等回應來的快多了。


就原提問者的第二個問題來說...

= 用在 if 判斷式裏, 在編譯時是 OK 的,
在語法上來說是正確的, 不但正確,
還可能常常用到這種方式..
例如...

if (ch = getch()) {...}

編譯時或許會有一些警告吧(也許沒有)  :roll:

也或許因為如此, 所以常常會有人搞不清楚  :roll:

fell0206

  • 活潑的大學生
  • ***
  • 文章數: 339
    • 檢視個人資料
為什麼有錯?
« 回覆 #10 於: 2006-07-28 22:17 »
感謝各位大大的指點!!!
原來是"char"的部份要用'  '而我用成"  "!!
而"="和"=="的部份!真的要感謝大大的指點!!後來去翻書!!才發現..真的不一樣!
修正部份如下:

if (c=='+')
math=a+b;
else if(c=='-')
math=a-b;
else if (c=='*')
math=a*b;
else
math=a/b;
printf("%d \n",math);



Thank you~~~
p.s 我這個不是做業!只是無聊時!玩玩而已!必竟花了時間學的東西!如果就這麼忘了!!那就太浪費了!而且也不錯玩! ^^ 請大大不要誤會~ ^^

fell0206

  • 活潑的大學生
  • ***
  • 文章數: 339
    • 檢視個人資料
為什麼有錯?
« 回覆 #11 於: 2006-07-28 22:23 »
各位大大!!我想在程式load到calculator時所出現的畫面後!
可以用自訂的快捷鍵!跳回到 menu()!
不知要怎麼做??請各位大大指點一下!!
Thank you~~

fell0206

  • 活潑的大學生
  • ***
  • 文章數: 339
    • 檢視個人資料
為什麼有錯?
« 回覆 #12 於: 2006-07-30 00:05 »
各位大大,我在程式中,又加了一些東西!可是有錯!雖然看了debug的說明,可是還是不會改!請各位大大指點一下!!

#include<stdio.h>
#include<stdlib.h>
#include<time.h>


int number;

int main(void)
{

menu();

if (number=1)
system("cls");
calculator();
else
system("cls");
time();
return 0;

}

...

int time(void)
{
time_t timep;
struct tm *p;
while(1)
{
time(&timep);
p=localtime(&timep);
printf("%d:%d:%d \n",p->tm_hour,p->tm_min,p->tm_sec);
system("cls");


}

}

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
為什麼有錯?
« 回覆 #13 於: 2006-07-30 00:29 »
1. 你的老問題還是沒改呀~~~
2. 自定函數 time()??  :o
3. 真的建議你把基礎再好好的看過幾遍...

fell0206

  • 活潑的大學生
  • ***
  • 文章數: 339
    • 檢視個人資料
為什麼有錯?
« 回覆 #14 於: 2006-07-30 14:52 »
感謝上面大大的提醒!!!(基礎....幾遍)現在都OK了! Thank you~

fell0206

  • 活潑的大學生
  • ***
  • 文章數: 339
    • 檢視個人資料
指導一下!!!謝謝~
« 回覆 #15 於: 2006-08-04 22:27 »
引述: "fell0206"
各位大大!!我想在程式load到calculator時所出現的畫面後!
可以用自訂的快捷鍵!跳回到 menu()!
不知要怎麼做??請各位大大指點一下!!
Thank you~~



各位大大誰可以指點一下嗎??? Thank you~~

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
為什麼有錯?
« 回覆 #16 於: 2006-08-04 22:58 »
就在上面嘍.....我不是提到了嗎~~

stlee

  • 鑽研的研究生
  • *****
  • 文章數: 817
    • 檢視個人資料
為什麼有錯?
« 回覆 #17 於: 2006-08-10 00:29 »
首先是number這一個變數只是要接收menu()的傳回值所以不必宣告成整體變數

main()
{
int number

number=menu();
...
}

這樣這個變數的壽命僅在main()內而且menu()也比較模組化
當你的程式越寫越大時這個寫作習慣會讓你寫程式滿有效率的

再來這一行....你的程式執行到這一定都是1啦
if (number=1) /*因為你在這使number"等於1"了*/

比較有問題的是這一段
if (number=1)
system("cls");
calculator();
else
system("cls");
time();
return 0;

A.....應該是這樣吧
if (number==1)
{
system("cls");
calculator();
}
else
{
system("cls");
time();
return 0;
}

B......但是寫成這樣
if (number==1)
{
system("cls");
calculator();
}
else
{
system("cls");
time();

return 0;

C....或這樣.....
if (number==1)
{
system("cls");
calculator();
}
else
{
system("cls");
}
time();
return 0;

這3個執行起來的結果都不一樣喔!!因為你大括號放的位置不同結果也會有完全不同的結果


這裡也有問題.....
int time(void)
{
...
while(1) /*無窮迴路不錯用喔.....但是...*/
{
...
/*無窮迴路裡面沒有〔出口〕啊*/
...
}
...
}
程式是人寫的,別讓工具的限制成為您想像力的極限
~程式中最重要的部份應該是註解而不是程式碼,這是因為解讀註解一定比解讀程式碼簡單
~程式寫好後約一個月就會忘的差不多了,所以花點時間把註解寫好至少能讓自己(或別人)看的懂當初在寫什麼

stlee

  • 鑽研的研究生
  • *****
  • 文章數: 817
    • 檢視個人資料
為什麼有錯?
« 回覆 #18 於: 2006-08-10 00:40 »
補充一下...
你要在選單程式內顯示時鐘吧!!!

int main(void)
{

while(1)
{
menu();
if (number==1)
{
system("cls");
calculator();
return(0);
}

time();

}

...

int time(void)
{
time_t timep;
struct tm *p;

time(&timep);
p=localtime(&timep);
printf("%d:%d:%d \n",p->tm_hour,p->tm_min,p->tm_sec);

}

把〔無窮迴路〕擺到主程式並安排適當的〔出口〕這樣就可以讓程式跑起來可以不在使用多執行緒的情形下處理多個流程了
程式是人寫的,別讓工具的限制成為您想像力的極限
~程式中最重要的部份應該是註解而不是程式碼,這是因為解讀註解一定比解讀程式碼簡單
~程式寫好後約一個月就會忘的差不多了,所以花點時間把註解寫好至少能讓自己(或別人)看的懂當初在寫什麼

stlee

  • 鑽研的研究生
  • *****
  • 文章數: 817
    • 檢視個人資料
為什麼有錯?
« 回覆 #19 於: 2006-08-10 08:12 »
不好意思...又沒仔細看清楚就貼上去了
更正一下再說清楚一點吧

int main(void)
{
int number;/*忘了這個*/

while(1)
{
number=menu();/*這裡是接收menu()的傳回值阿就是menu()內return的東東*/
if (number=='1')/*這裡是出口的條件判斷所以不可以用=而是用==阿*/
{
system("cls");
calculator();
return(0);
}

time();

}


int time(void)
{
time_t timep;
struct tm *p;

time(&timep);
p=localtime(&timep);
printf("%d:%d:%d \n",p->tm_hour,p->tm_min,p->tm_sec);

}

int menu(void)
{

printf("歡迎使用此系統 \n");
printf("請選擇有要用的功能代號 \n");
printf("1.計算機 \n");
printf("請選擇所要使用的功能代號:");
return(getch());
}



而oscars80大大所說的if (ch = getch())則可以改成
if((ch=getch())=='1')
{
....
....
}
其實在if()判斷式內只有兩種情形"真"及"假"
當if條件()內的程式碼為"真"時則執行其下{}內的程式碼
所以你用if (number=1)或if (number=999)都是條件為"真"
而你可以用函數傳回值使之傳回"假"
例如

main()
{
int i;

if(i=menu())
{...}
else
{...}
}

int menu()
{
int ch;

ch=getch();

if(ch=='1')
return 1;/*布林值的"真"忘了怎麼拼,但布林值的"真"就是1啦*/
else
return 0;/*1是"真"...0就是"假"了"*/
}

那if (number=0)就是"假"了嗎???不好意思,很像還是為"真"因為用的是=不是==

不過把各程式碼拆成函數是不錯的習慣喔
程式是人寫的,別讓工具的限制成為您想像力的極限
~程式中最重要的部份應該是註解而不是程式碼,這是因為解讀註解一定比解讀程式碼簡單
~程式寫好後約一個月就會忘的差不多了,所以花點時間把註解寫好至少能讓自己(或別人)看的懂當初在寫什麼

fell0206

  • 活潑的大學生
  • ***
  • 文章數: 339
    • 檢視個人資料
為什麼有錯?
« 回覆 #20 於: 2007-01-26 17:46 »
感謝各位大大的指導!!已解決了!!