[問題] 求平均.與其值之判定問題

看板C_and_CPP (C/C++)作者 (刀控)時間16年前 (2009/12/03 00:28), 編輯推噓9(9069)
留言78則, 5人參與, 最新討論串1/1
初次來到這個版 已經爬過文與翻閱至底十誡 但是似乎還是沒辦法解決目前的問題 感謝昨晚幾位好手的幫助 解決了不少地方 不過目前在string的部分卡住了(嘆~ 問題基本敘述: 程式目標希望能 在輸入n個數值以後 求出平均 並且列出表格 表格有輸入之數值 與平均之差 以及a/r 其中A/R代表的 若數值與平均之差小於平均的1% 則顯示A 否則顯示R 開發平台: Dev-C++ 有問題的code: (請善用置底文標色功能) #include<iostream> #include<cmath> #include <string> using namespace std; const int number=100; long double pass (double aver,double x) 原為double arr[] { int i; return 1-(x/aver); } //求出(數值與平均之差 )除以平均的值 此處似乎有著錯誤A->改為x以後似乎已解決 double Average(double arr[],int n) { double sum=0; for(int i=0;i<n;i++) sum+=arr[i]; return sum/n; } //求出平均 int main() { double arr[number]; int i; string str =arr[i]; cout<<"Enter a number or separated by 's'\n"; for(int i=0;i<number;i++) { cout<<"Input "<<i+1<<" :"+1; cin>>arr[i]; if (str.empty()) //此處似乎有不明錯誤B break; } 嘗試使用string做修正 不過目前試過許多種方法(就是少一個=.把string那行移來移去....之類的) 最好的狀況是 (cpp conversion from `double' to non-scalar type `std::basic_string<char, std::char_traits<char>, std::allocator<char> >' requested ) 找不太到問題出在哪裡... int total=i; cout<<"================================================\n"; cout<<"Average:"<<Average(arr,number)<<endl; cout<<"================================================\n"; cout<<"Item Difference PASS\n"; double t; double aver=Average(arr,number); 新增 double x=arr[i]; double s=pass(arr[i],aver); (此處由於錯誤C cannot convert `double' to `double*' for argument `2' to `long double pass(double, double*)' 而無法進行下一部的檢驗 ) 目前已解決 t=fabs(s); //為將pass的值轉為正數 char K[2]={'R','A'}; for (i=0;i<total;i++) { if(t>=0.01) {cout<<arr[i]; cout<<" "; cout<<arr[i]-aver; cout<<" "; cout<<K[0];} else {cout<<arr[i]; cout<<" "; cout<<arr[i]-aver; cout<<" "; cout<<K[1]; } //此處似乎亦有未知錯誤D } system("PAUSE"); return 0; } 目前執行程式時遇到的問題 1.在疑似錯誤B的部分 輸入數據之後再輸入S並沒有如預期的結束迴圈 反而是強制將所有的"Input"都當作輸入空白而跑完 並且無法求出平均 曾經考慮使用cin.getline(arr,數字) 但是似乎會有更多錯誤 目前因為錯誤C而無法確認是否已經正常 2.在疑似錯誤D的部分我是依照對課本的概念去寫的 但是因為目前還沒辦法順利的跑到這裡 所以沒辦法確認是否有錯 還煩請指導了 感謝 01:07 修正了pass的double問題之後 錯誤A與C均已解決 感謝fragileness大的指導 目前錯誤B依然無法找出解決辦法 求其平均會出現 -1.#QNAN 意義不明 -- 我對普通人沒有興趣, 如果妳們之中有偽娘、百合女、或是蘿莉屬性正太的話再來找我吧! 以上! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.116.131.226

12/03 00:32, , 1F
pass裡面的int i沒有給值啊
12/03 00:32, 1F

12/03 00:36, , 2F
想請教一下 i不是應該是跟隨arr[i]的變數嗎?
12/03 00:36, 2F

12/03 00:37, , 3F
我以為只要讓程式知道它是一個int就夠了
12/03 00:37, 3F

12/03 00:40, , 4F
arr[]本身沒有跟隨一個"現在要取第幾個值"的變數
12/03 00:40, 4F

12/03 00:41, , 5F
要你自己在[]裡面填一個已知值i,程式才知道arr[i]是啥
12/03 00:41, 5F

12/03 00:42, , 6F
你把arr[i]傳給pass的時候 pass只知道arr[i]的值
12/03 00:42, 6F

12/03 00:43, , 7F
不知道他是出自arr[]這個array 更不知道他是第i個
12/03 00:43, 7F

12/03 00:45, , 8F
還有你pass宣告的時候應該要傳一個double和一個
12/03 00:45, 8F

12/03 00:45, , 9F
double array進去 結果你使用的時候傳兩個double進去
12/03 00:45, 9F
※ 編輯: Ricrollp 來自: 140.116.131.226 (12/03 01:09)

12/03 01:09, , 10F
感謝fragileness大的指導 錯誤AC都已經解決了
12/03 01:09, 10F

12/03 01:11, , 11F
你直接拿double 跟字元是想比較什麼= =?
12/03 01:11, 11F

12/03 01:16, , 12F
可以請問一下樓上的意思是... 我用x=arr[i]是錯的嗎?
12/03 01:16, 12F
※ 編輯: Ricrollp 來自: 140.116.131.226 (12/03 01:17)

12/03 01:17, , 13F
錯誤B就是樓上說的, 錯誤D等你跑到再說, 應該是OK的吧.
12/03 01:17, 13F

12/03 01:17, , 14F
akasan說的是 if (arr[0]=='s') 這行吧
12/03 01:17, 14F

12/03 01:18, , 15F
arr[0] == 's' <----問題點
12/03 01:18, 15F

12/03 01:18, , 16F
-1.#QNAN就是算出了一個非正常結果的浮點數, 詳情請查
12/03 01:18, 16F

12/03 01:18, , 17F
IEEE 754浮點數表示法, 其中定義了怎樣的bit表示是非正
12/03 01:18, 17F

12/03 01:19, , 18F
常浮點數(如超小數, 無限大, 非數), NAN就是非數的case,
12/03 01:19, 18F

12/03 01:19, , 19F
當你執行某些錯誤運算時就可能產生NAN, 如0/0; 或者你操
12/03 01:19, 19F

12/03 01:19, , 20F
作記憶體錯誤導致寫壞浮點數結構, 也有可能發生.
12/03 01:19, 20F

12/03 01:20, , 21F
是這樣的 之前曾照範例用arr[0]=='\0'會得到一樣的結果
12/03 01:20, 21F

12/03 01:20, , 22F
所以想說嘗試用字母來表示看看
12/03 01:20, 22F

12/03 01:20, , 23F
arr[0]是一個double, 's', '\0'是一個字元, 雖然實際跑
12/03 01:20, 23F

12/03 01:21, , 24F
程式不是不能比, 問題是你拿一個浮點數和字元想要比出什
12/03 01:21, 24F

12/03 01:21, , 25F
說真的double 跟 字元比 沒丟警告之類的還滿意外的...
12/03 01:21, 25F

12/03 01:21, , 26F
麼結果??請先釐清你這個條件判斷的邏輯....
12/03 01:21, 26F

12/03 01:21, , 27F
明白了 原來是我誤解了範例的意思
12/03 01:21, 27F

12/03 01:22, , 28F
那可以請問一下如果要在這裡使用if進行停止
12/03 01:22, 28F

12/03 01:23, , 29F
是要使用哪一類型的東西呢?
12/03 01:23, 29F

12/03 01:23, , 30F
你的cin的目標是double, 如果你不能挑選一個特殊的
12/03 01:23, 30F

12/03 01:23, , 31F
double數值來當作停止輸入的特別訊號, 你就得改別你輸入
12/03 01:23, 31F

12/03 01:24, , 32F
的模式, 比如每次輸入double都問user是否繼續輸入然後請
12/03 01:24, 32F

12/03 01:24, , 33F
user輸入的Y或N, 你再另行讀入字元判斷; 或者cin有其他
12/03 01:24, 33F

12/03 01:24, , 34F
還有不管arr[0]==? 這裡的?你打算用啥 好像0要改成i吧
12/03 01:24, 34F

12/03 01:25, , 35F
method可以直接做好這種判斷, 就請其他強者補完了@_@"
12/03 01:25, 35F

12/03 01:25, , 36F
永遠都拿第0個來比 如果第0個不是表示結束的那個
12/03 01:25, 36F

12/03 01:26, , 37F
不就注定要跑到完...
12/03 01:26, 37F

12/03 01:26, , 38F
arr[0]也是我誤解了範例的原意.. 另.感謝VictorTom大幫助
12/03 01:26, 38F

12/03 01:27, , 39F
題目要求的顯示畫面似乎是以輸入空白或s進行結束
12/03 01:27, 39F

12/03 01:27, , 40F
如果無法使用double進行的話 小數點亦無法計算
12/03 01:27, 40F

12/03 01:29, , 41F
那有一個簡單的策略, 先用一個string存每次的輸入,
12/03 01:29, 41F

12/03 01:29, , 42F
另有使用輸入-1當做結尾的 我試試看
12/03 01:29, 42F

12/03 01:29, , 43F
那麼就是用 string 或 char* 接下來, 判斷是結束還是資料
12/03 01:29, 43F

12/03 01:29, , 44F
然後判斷string是不是空白或s, 是就代表迴圈要break,
12/03 01:29, 44F

12/03 01:29, , 45F
慢了... orz
12/03 01:29, 45F

12/03 01:29, , 46F
不是就從string去讀數值出來轉成double(toDouble??)
12/03 01:29, 46F

12/03 01:30, , 47F
l大想偷襲....XD
12/03 01:30, 47F

12/03 01:37, , 48F
string嗎...從沒用過@@ 開始爬文+翻書
12/03 01:37, 48F

12/03 01:45, , 49F
像l大說的開個夠大的char[]來放也可以, 只是想說既然你
12/03 01:45, 49F

12/03 01:45, , 50F
都寫C++了, 直接抓string應該會方便簡單很多:)
12/03 01:45, 50F

12/03 01:46, , 51F
因為我真正學C++還不到兩週 所以很多東西都還不明白
12/03 01:46, 51F

12/03 01:47, , 52F
麻煩大家了
12/03 01:47, 52F

12/03 01:47, , 53F
想請教一下 string的使用和new是一樣的嗎?
12/03 01:47, 53F

12/03 01:53, , 54F
上面這句還真難回答
12/03 01:53, 54F

12/03 01:54, , 55F
你不如問我 吃跟午餐是一樣的嗎
12/03 01:54, 55F

12/03 01:55, , 56F
string的用法還摸索不出來的樣子 我再翻書看看好了
12/03 01:55, 56F

12/03 01:56, , 57F
麻煩各位了
12/03 01:56, 57F

12/03 09:09, , 59F
再說我覺得string的使用, C++的入門書多少會教一些吧!?
12/03 09:09, 59F
※ 編輯: Ricrollp 來自: 140.116.131.226 (12/03 09:22)

12/03 09:43, , 60F
我很想請你先試著畫流程圖再回來寫code....
12/03 09:43, 60F

12/03 09:44, , 61F
你的arr[]與i都還沒有初值你就做str = arr[i], 你覺得
12/03 09:44, 61F

12/03 09:44, , 62F
會得到什麼結果?? 程式是一步一步執行的, 你可以自己試
12/03 09:44, 62F

12/03 09:45, , 63F
用大腦人工走一遍你的code, 只要有哪一步你懷疑不知道
12/03 09:45, 63F

12/03 09:45, , 64F
會有什麼結果, 八成那行程式碼就有問題....@_@"
12/03 09:45, 64F

12/03 09:46, , 65F
寫程式要明確了解自己每一行再幹麻, 而不是把=還是
12/03 09:46, 65F

12/03 09:47, , 66F
string用猜的胡亂移來移去就想湊出結果, 你這樣只是純
12/03 09:47, 66F

12/03 09:47, , 67F
脆浪費時間, 對寫程式的基礎與技術沒有任何幫助....
12/03 09:47, 67F

12/03 09:50, , 68F
再整理一次大致的流程: 1. 每次迴圈先輸入到string裡,
12/03 09:50, 68F

12/03 09:50, , 69F
別懷疑string輸入一樣用cin>>str;就可以; 2. 從讀回來
12/03 09:50, 69F

12/03 09:51, , 70F
的str裡判斷是不是's'或者你設定的其他條件, 操作方式
12/03 09:51, 70F

12/03 09:52, , 71F
你可以參考我上面貼過的連結; 3. 符合中止條件就結束迴
12/03 09:52, 71F

12/03 09:54, , 72F
圈, 否則就把該str轉成double存入arr[i]裡去.
12/03 09:54, 72F

12/03 09:54, , 73F
至於怎麼從string轉成double, C我會, C++就有請板上大
12/03 09:54, 73F

12/03 09:54, , 74F
大們補完了....Orz
12/03 09:54, 74F

12/03 09:56, , 75F
感謝V大的耐心指點... 我會先試著了解學會string的
12/03 09:56, 75F

12/03 10:00, , 76F
PS. 雖然自己寫時盡量不要, 但是看/研究別人的程式或者
12/03 10:00, 76F

12/03 10:00, , 77F
因為照V大說的 我在string跟陣列值之間的轉換思考有問題
12/03 10:00, 77F

12/03 10:00, , 78F
sample時, 改東改西移來移去反而是一個測試/了解方式:)
12/03 10:00, 78F
文章代碼(AID): #1B5fN52b (C_and_CPP)
文章代碼(AID): #1B5fN52b (C_and_CPP)