[問題] 請教高中生解題系統b077題

看板C_and_CPP (C/C++)作者 (專心致志)時間15年前 (2010/12/13 23:50), 編輯推噓7(707)
留言14則, 6人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, Gcc, Linux, ...) Dev C++ 額外使用到的庫(Library Used) (Ex: OpenGL, ...) <string.h> 問題(Question): 輸出錯誤 餵入的資料(Input): 不知道 預期的正確結果(Expected Output): Fair 錯誤結果(Wrong Output): Unfair 程式碼(Code): (請善用置底文標色功能) #include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { char range1[20],range2[20]; int i; while(scanf("%s %s",&range1,&range2)!=EOF) { if(range1[0]=='0'&&range2[0]=='0') break; if(strlen(range1)>strlen(range2)) { printf("Unfair\n"); }else if(strlen(range1)<strlen(range2)) { printf("Fair\n"); }else { i=strcmp(range1,range2); switch(i) { case -1: case 0: printf("Fair\n"); break; case 1: printf("Unfair\n"); } } } return 0; } 補充說明(Supplement): http://zerojudge.tw/ShowProblem?problemid=b077 我想請問的是我這程式有哪裡邏輯錯誤嗎? 因為我在自己電腦上測試是OK的 他的範例輸入也沒問題 就是不知道為什麼丟進去的時候錯誤 另外問一下 while(scanf("%s %s",&range1,&range2)&&(range1[0]=='0'&&range2[0]=='0')) 如果這樣寫程式直接結束 請問這樣寫跟我寫在 while裡面有什麼差別嗎? 最後 請問此程式碼的寫法還有哪裡可以改善的地方嗎? 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 120.119.126.4

12/13 23:53, , 1F
strcmp比的是 '字典序'
12/13 23:53, 1F

12/13 23:54, , 2F
查一下回傳值的意義吧~
12/13 23:54, 2F

12/13 23:55, , 3F
你是不是誤會了題目的意思 要比數字大小阿 怎麼用strcmp
12/13 23:55, 3F

12/14 00:14, , 4F
先比長度 再用strcmp
12/14 00:14, 4F
我改寫之後的程式如上 不過還是被賞了個WA 第一次寫我忽略了字串長度並不一定會一樣的問題 這次我是把字串長度先比較 當然比較長的那個代表數字比較大這沒問題 不過這次問題似乎是在字串相同的部份 就我認知 strcmp是比較字元在ASCII中的大小也就是順序 順序越後面的越大 所以當像這樣"694"<"65M" 在十進位代表從第一個比較到第二個時 因為'9'!='5' 而且'9'等於57 '5'等於53 所以回傳1代表"694">"65M" 相等回傳0 反之則回傳-1 是這樣沒錯吧? 我程式的想法是 當字串相等的情況下 如果S1<S2 那表示從第一個字元檢查到其中一個字元兩邊並不相等 譬如'3'跟'7' '7'的順序比'3'後面 所以回傳-1 相等則0 最後一種情況就是S1>S2回傳1 請問以上的想法有什麼問題嗎? ※ 編輯: Mysteltainn 來自: 120.119.126.4 (12/14 00:54) ※ 編輯: Mysteltainn 來自: 120.119.126.8 (12/14 01:15)

12/14 07:58, , 5F
請查詢strcmp回傳值。
12/14 07:58, 5F

12/14 14:56, , 6F
不是0,1,-1
12/14 14:56, 6F

12/14 14:57, , 7F
然後你那樣把它擠進while()的()裡面 造成直接結束的原因
12/14 14:57, 7F

12/14 14:57, , 8F
是程式邏輯不同= =
12/14 14:57, 8F
這題終於AC了 第一次AC我並沒有使用strcmp 後來我想說實驗看看 是否strcmp回傳的值是個範圍的整數 而非只是0,1,-1 所以就寫了以下的程式 結果沒想到AC了 而且比我第一次寫的速度還快 那麼現在問題來了 請問一下我要怎麼實驗strcmp的回傳值呢? 因為我自己在電腦上試都是回傳0,-1,1 請問如果要實驗的話範例應該怎麼寫才能證明strcmp回傳的不只是0,-1,1呢? #include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { char range1[20],range2[20]; int i; while(scanf("%s %s",&range1,&range2)!=EOF) { if(range1[0]=='0'&&range2[0]=='0') break; if(strlen(range1)>strlen(range2)) { printf("Unfair\n"); }else if(strlen(range1)<strlen(range2)) { printf("Fair\n"); }else { i=strcmp(range1,range2); if(i>0) { printf("Unfair\n"); }else { printf("Fair\n"); } } } return 0; } ※ 編輯: Mysteltainn 來自: 120.119.126.1 (12/14 19:43)

12/14 23:44, , 9F
strcmp("123", "123456");
12/14 23:44, 9F

12/15 00:02, , 10F
還是一樣 我是printf("%d"); %d要改嗎?
12/15 00:02, 10F

12/15 01:26, , 11F
我在windows底下以CodeBlocks測試是-1 但是在Linux底下
12/15 01:26, 11F

12/15 01:26, , 12F
(gcc 4.4.3)測試是-52
12/15 01:26, 12F

12/15 10:27, , 13F
因為標準就是規定回傳<0, =0, >0. 那他到底回傳什麼不就是
12/15 10:27, 13F

12/15 10:27, , 14F
implement define
12/15 10:27, 14F
文章代碼(AID): #1D1a2lUD (C_and_CPP)
文章代碼(AID): #1D1a2lUD (C_and_CPP)