作者Ricrollp (刀控)
看板C_and_CPP
標題[問題] 求平均.與其值之判定問題
時間Thu Dec 3 00:28:50 2009
初次來到這個版
已經爬過文與翻閱至底十誡
但是似乎還是沒辦法解決目前的問題
感謝昨晚幾位好手的幫助 解決了不少地方
不過目前在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
1F:→ fragileness:pass裡面的int i沒有給值啊 12/03 00:32
2F:→ Ricrollp:想請教一下 i不是應該是跟隨arr[i]的變數嗎? 12/03 00:36
3F:→ Ricrollp:我以為只要讓程式知道它是一個int就夠了 12/03 00:37
4F:→ fragileness:arr[]本身沒有跟隨一個"現在要取第幾個值"的變數 12/03 00:40
5F:→ fragileness:要你自己在[]裡面填一個已知值i,程式才知道arr[i]是啥 12/03 00:41
6F:→ fragileness:你把arr[i]傳給pass的時候 pass只知道arr[i]的值 12/03 00:42
7F:→ fragileness:不知道他是出自arr[]這個array 更不知道他是第i個 12/03 00:43
8F:→ fragileness:還有你pass宣告的時候應該要傳一個double和一個 12/03 00:45
9F:→ fragileness:double array進去 結果你使用的時候傳兩個double進去 12/03 00:45
※ 編輯: Ricrollp 來自: 140.116.131.226 (12/03 01:09)
10F:→ Ricrollp:感謝fragileness大的指導 錯誤AC都已經解決了 12/03 01:09
11F:→ akasan:你直接拿double 跟字元是想比較什麼= =? 12/03 01:11
12F:→ Ricrollp:可以請問一下樓上的意思是... 我用x=arr[i]是錯的嗎? 12/03 01:16
※ 編輯: Ricrollp 來自: 140.116.131.226 (12/03 01:17)
13F:推 VictorTom:錯誤B就是樓上說的, 錯誤D等你跑到再說, 應該是OK的吧. 12/03 01:17
14F:→ fragileness:akasan說的是 if (arr[0]=='s') 這行吧 12/03 01:17
15F:→ akasan:arr[0] == 's' <----問題點 12/03 01:18
16F:→ VictorTom:-1.#QNAN就是算出了一個非正常結果的浮點數, 詳情請查 12/03 01:18
17F:→ VictorTom:IEEE 754浮點數表示法, 其中定義了怎樣的bit表示是非正 12/03 01:18
18F:→ VictorTom:常浮點數(如超小數, 無限大, 非數), NAN就是非數的case, 12/03 01:19
19F:→ VictorTom:當你執行某些錯誤運算時就可能產生NAN, 如0/0; 或者你操 12/03 01:19
20F:→ VictorTom:作記憶體錯誤導致寫壞浮點數結構, 也有可能發生. 12/03 01:19
21F:→ Ricrollp:是這樣的 之前曾照範例用arr[0]=='\0'會得到一樣的結果 12/03 01:20
22F:→ Ricrollp:所以想說嘗試用字母來表示看看 12/03 01:20
23F:→ VictorTom:arr[0]是一個double, 's', '\0'是一個字元, 雖然實際跑 12/03 01:20
24F:→ VictorTom:程式不是不能比, 問題是你拿一個浮點數和字元想要比出什 12/03 01:21
25F:→ akasan:說真的double 跟 字元比 沒丟警告之類的還滿意外的... 12/03 01:21
26F:→ VictorTom:麼結果??請先釐清你這個條件判斷的邏輯.... 12/03 01:21
27F:→ Ricrollp:明白了 原來是我誤解了範例的意思 12/03 01:21
28F:→ Ricrollp:那可以請問一下如果要在這裡使用if進行停止 12/03 01:22
29F:→ Ricrollp:是要使用哪一類型的東西呢? 12/03 01:23
30F:推 VictorTom:你的cin的目標是double, 如果你不能挑選一個特殊的 12/03 01:23
31F:→ VictorTom:double數值來當作停止輸入的特別訊號, 你就得改別你輸入 12/03 01:23
32F:→ VictorTom:的模式, 比如每次輸入double都問user是否繼續輸入然後請 12/03 01:24
33F:→ VictorTom:user輸入的Y或N, 你再另行讀入字元判斷; 或者cin有其他 12/03 01:24
34F:→ fragileness:還有不管arr[0]==? 這裡的?你打算用啥 好像0要改成i吧 12/03 01:24
35F:→ VictorTom:method可以直接做好這種判斷, 就請其他強者補完了@_@" 12/03 01:25
36F:→ fragileness:永遠都拿第0個來比 如果第0個不是表示結束的那個 12/03 01:25
37F:→ fragileness:不就注定要跑到完... 12/03 01:26
38F:→ Ricrollp:arr[0]也是我誤解了範例的原意.. 另.感謝VictorTom大幫助 12/03 01:26
39F:→ Ricrollp:題目要求的顯示畫面似乎是以輸入空白或s進行結束 12/03 01:27
40F:→ Ricrollp:如果無法使用double進行的話 小數點亦無法計算 12/03 01:27
41F:推 VictorTom:那有一個簡單的策略, 先用一個string存每次的輸入, 12/03 01:29
42F:→ Ricrollp:另有使用輸入-1當做結尾的 我試試看 12/03 01:29
43F:推 ledia:那麼就是用 string 或 char* 接下來, 判斷是結束還是資料 12/03 01:29
44F:→ VictorTom:然後判斷string是不是空白或s, 是就代表迴圈要break, 12/03 01:29
45F:→ ledia:慢了... orz 12/03 01:29
46F:→ VictorTom:不是就從string去讀數值出來轉成double(toDouble??) 12/03 01:29
47F:→ VictorTom:l大想偷襲....XD 12/03 01:30
48F:→ Ricrollp:string嗎...從沒用過@@ 開始爬文+翻書 12/03 01:37
49F:推 VictorTom:像l大說的開個夠大的char[]來放也可以, 只是想說既然你 12/03 01:45
50F:→ VictorTom:都寫C++了, 直接抓string應該會方便簡單很多:) 12/03 01:45
51F:→ Ricrollp:因為我真正學C++還不到兩週 所以很多東西都還不明白 12/03 01:46
52F:→ Ricrollp:麻煩大家了 12/03 01:47
53F:→ Ricrollp:想請教一下 string的使用和new是一樣的嗎? 12/03 01:47
54F:→ fragileness:上面這句還真難回答 12/03 01:53
55F:→ fragileness:你不如問我 吃跟午餐是一樣的嗎 12/03 01:54
56F:→ Ricrollp:string的用法還摸索不出來的樣子 我再翻書看看好了 12/03 01:55
57F:→ Ricrollp:麻煩各位了 12/03 01:56
59F:→ VictorTom:再說我覺得string的使用, C++的入門書多少會教一些吧!? 12/03 09:09
※ 編輯: Ricrollp 來自: 140.116.131.226 (12/03 09:22)
60F:推 VictorTom:我很想請你先試著畫流程圖再回來寫code.... 12/03 09:43
61F:→ VictorTom:你的arr[]與i都還沒有初值你就做str = arr[i], 你覺得 12/03 09:44
62F:→ VictorTom:會得到什麼結果?? 程式是一步一步執行的, 你可以自己試 12/03 09:44
63F:→ VictorTom:用大腦人工走一遍你的code, 只要有哪一步你懷疑不知道 12/03 09:45
64F:→ VictorTom:會有什麼結果, 八成那行程式碼就有問題....@_@" 12/03 09:45
65F:→ VictorTom:寫程式要明確了解自己每一行再幹麻, 而不是把=還是 12/03 09:46
66F:→ VictorTom:string用猜的胡亂移來移去就想湊出結果, 你這樣只是純 12/03 09:47
67F:→ VictorTom:脆浪費時間, 對寫程式的基礎與技術沒有任何幫助.... 12/03 09:47
68F:推 VictorTom:再整理一次大致的流程: 1. 每次迴圈先輸入到string裡, 12/03 09:50
69F:→ VictorTom:別懷疑string輸入一樣用cin>>str;就可以; 2. 從讀回來 12/03 09:50
70F:→ VictorTom:的str裡判斷是不是's'或者你設定的其他條件, 操作方式 12/03 09:51
71F:→ VictorTom:你可以參考我上面貼過的連結; 3. 符合中止條件就結束迴 12/03 09:52
72F:→ VictorTom:圈, 否則就把該str轉成double存入arr[i]裡去. 12/03 09:54
73F:→ VictorTom:至於怎麼從string轉成double, C我會, C++就有請板上大 12/03 09:54
74F:→ VictorTom:大們補完了....Orz 12/03 09:54
75F:→ Ricrollp:感謝V大的耐心指點... 我會先試著了解學會string的 12/03 09:56
76F:推 VictorTom:PS. 雖然自己寫時盡量不要, 但是看/研究別人的程式或者 12/03 10:00
77F:→ Ricrollp:因為照V大說的 我在string跟陣列值之間的轉換思考有問題 12/03 10:00
78F:→ VictorTom:sample時, 改東改西移來移去反而是一個測試/了解方式:) 12/03 10:00