PCDVD數位科技討論區

PCDVD數位科技討論區 (https://www.pcdvd.com.tw/index.php)
-   疑難雜症區 (https://www.pcdvd.com.tw/forumdisplay.php?f=34)
-   -   有人會寫程式嗎? (https://www.pcdvd.com.tw/showthread.php?t=403665)

jackyepson 2004-10-29 01:16 AM

8:5的!!!為什麼我試都不正常

8:5 2004-10-29 01:17 AM

其實有一點是沒有釐清的•••題目對次大數沒有很明確的定義,如果輸入 1 2 2 0,那次大數應該是 2 還是 1呢?

在上面的程式輸入 1 2 2 0 則會輸出 2 2 (最大跟次大一樣)
如果要求最大數與次大數相異的話,
那要將上面的 n>max2
改為max1>n && n>max2

Kaworucloud 2004-10-29 01:19 AM

引用:
作者jackyepson
8:5的!!!為什麼我試都不正常


你輸入的測試值是什麼?
有試過徹底關掉編譯器再重開一次嗎?
我用的 BCB 有時候明明舊的程式碼更新了,編譯出來的還是舊的程式碼 :jolin:

jackyepson 2004-10-29 01:20 AM

是當我輸入-1,-2時,最大是-1沒錯,次大就變-xxxxxxxx

Kaworucloud 2004-10-29 01:23 AM

引用:
作者jackyepson
是當我輸入-1,-2時,最大是-1沒錯,次大就變-xxxxxxxx


我輸入 -1 -2 0 之後,很正常的出現 max1=-1, max2=-2.....
單純是你編譯器的問題吧 :flash:

jackyepson 2004-10-29 01:29 AM

引用:
作者Kaworucloud
我輸入 -1 -2 0 之後,很正常的出現 max1=-1, max2=-2.....
單純是你編譯器的問題吧 :flash:

我用的是Microsoft Visual C++ 6.0因 該不會有問題吧

jackyepson 2004-10-29 01:43 AM

經過我融合各位寶貴的意見後,我最後的程式碼是這樣的
#include<stdio.h>
void main()
{
int a,b,c;
printf("請輸入整數,如要跳出請輸入0\n");
while(a!=0)
{
printf("輸入整數:");
scanf("%d",&a);
if (a==0) break;
if (a>b) {
c=b;
b=a;
}if (a>b) {
c=a;
}
}
printf("輸入中最大者和次大者依序是%d和%d\n",b,c);
}
只差負數的次大有問題,那....因為我明天一大早還要上課我怕會爬不起來我就先下線了!!!
希望各位高手能夠把最後的問題解決並告知是為什麼,如果真沒辦法也沒關係!!!

8:5 2004-10-29 01:48 AM

引用:
作者jackyepson
經過我融合各位寶貴的意見後,我最後的程式碼是這樣的
#include<stdio.h>
void main()
{
int a,b,c;
printf("請輸入整數,如要跳出請輸入0\n");
while(a!=0)
{
printf("輸入整數:");
scanf("%d",&a);
if (a==0) break;
if (a>b) {
c=b;
b=a;
}if (a>b) {
c=a;
}
}
printf("輸入中最大者和次大者依序是%d和%d\n",b,c);
}
只差負數的次大有問題,那....因為我明天一大早還要上課我怕會爬不起來我就先下線了!!!
希望各位高手能夠把最後的問題解決並告知是為什麼,如果真沒辦法也沒關係!!!

應該是 a>c 吧?

另外,如果區域變數不給初始值的話,它的初始值就不一定。
在您的例子裡,如果 b,c 的初始值不定的話,那•••您再想想吧。(比如說,如果b,c一開始分別是 1354324跟 23432432•••)

Kaworucloud 2004-10-29 01:54 AM

引用:
作者jackyepson
經過我融合各位寶貴的意見後,我最後的程式碼是這樣的
#include<stdio.h>
void main()
{
int a,b,c;
printf("請輸入整數,如要跳出請輸入0\n");
while(a!=0)
{
printf("輸入整數:");
scanf("%d",&a);
if (a==0) break;
if (a>b) {
c=b;
b=a;
}if (a>b) {
c=a;
}
}
printf("輸入中最大者和次大者依序是%d和%d\n",b,c);
}
只差負數的次大有問題,那....因為我明天一大早還要上課我怕會爬不起來我就先下線了!!!
希望各位高手能夠把最後的問題解決並告知是為什麼,如果真沒辦法也沒關係!!!


if (a>b 筆誤) {
c=a;
第一, b 跟 c 沒有給定初始值,所以一開始的 b 跟 c 值是多少,unknown
如果運氣不好, b 的值是 65535
那你的測試值大概都不會通過吧

如果初始值是零,那輸入 -1 -2 -3 -4 ,也都不會對,因為根沒有沒進到任何一個 if 述句,我的寫法就是針對這個狀況
如果初始值設成整數的最小值,也不會有上面的問題,就是 8:5 兄的做法

flowofsoul 2004-10-29 05:17 AM

/////////////////////////////////////////////////////////

int test1,temp,big, sec = 0,counter = 0;



cout << "請輸入整數,若輸入0則程式結束" << endl ;

cin >> test1 ;


sec = big = temp = test1 - 1;



while(test1){


if(counter == 1)
temp = big;

if(counter > 1 && test1 > big)
temp = big;

else if(counter > 1 && test1 > temp)
if(test1 == big){
}
else
temp = test1;

if(big == temp && sec == temp && test1 < temp){
temp = test1;

}


big = big > test1 ? big : test1;

if(counter ==1 && test1 < big)
sec = test1;
else
sec = temp;

if(counter > 1 && big > sec && test1 > sec)
sec = temp;


if(counter == 0){
sec = 0;
}



counter++;


cout << "big " << big << endl;
cout << "sec " << sec << endl;
cout << "temp " << temp << endl;
cout << "counter " << counter << endl;



cout << "請輸入整數,若輸入0則程式結束" << endl;

cin >> test1;


}

cout << "最大為" << big << " 次大為" << sec << endl;

////////////////////////////////////////////////

太久沒摸實在是不行呀,剛剛真不應該說簡單的,真是丟臉。抱歉拖了你們那麼久的時間。

樓主,這個應該行了,參考一下吧。記得自己再debug一下。

我的visual c++ .net 2003有點怪怪的,程式碼一分未改,同樣的測試,有時候行有時候不行。

我除掉了幾個bug:
一、如果一開始一直按重覆的數字,後來再按比較小的數字,程式會沒反應(不是當掉),按比較大的才行。
二、按負數,按的負值越來越大程式無作用。

還有,中間下面那四行
cout << "big " << big << endl;
cout << "sec " << sec << endl;
cout << "temp " << temp << endl;
cout << "counter " << counter << endl;

是我方便除錯用的,可刪。

我的寫法是一開始指定給所有變數使用者輸入值-1的值。也就是說
big = big > test1 ? big : test1;
這一行源碼一開始是絕對有用的。

關鍵是counter變數,在前兩個迴圈的時候很有用。

其他的就自己看吧,正負數及一直重覆按鍵都修正了。

不過程式防呆你就自己來吧,加幾個判斷句就行了。


所有的時間均為GMT +8。 現在的時間是02:21 PM.

vBulletin Version 3.0.1
powered_by_vbulletin 2026。