2016-02-15 96 views
0

我不得不寫一個程序,以緩解在尋找我們的物理實驗室的作品擬合線性曲線我們的負擔。 我的程序正確計算了西格瑪xi和西格瑪(西^ 2)。我使用類似的代碼來計算其他值。 但後來,它顯示了所有值0 我找不到在剩餘部分的任何錯誤爲我之前使用的工作相同的代碼。C++代數計算

我附上了cpp文件Cpp file here

樣品部分施加值0

float * yl; 
yl= new float[N]; 

cout << "Enter values for Y (total "<<N<<")\n"<<endl; 
for(j=1;j<N+1;j++) 
{ 
cin >> yl[i]; 
} 

sigyi=0; 
for(o=1;o<N+1;o++) 
{ 
sigyi=sigyi+yl[o]; 
} 

但是這一個正常工作

float * xl; 
xl= new float[N]; 

cout << "Enter values for X (total "<<N<<")\n"<<endl; 
for(i=1;i<N+1;i++) 
{ 
cin >> xl[i]; 
} 

sigxi=0; 
for(l=1;l<N+1;l++) 
{ 
sigxi=sigxi+xl[l]; 
} 

請幫助我。

+4

注意,將在C++的數組索引從0到N-1。使用從1到N將超出範圍(緩衝區溢出) – Christophe

+0

但它適用於第二種情況。 –

+0

,它的工作原理或似乎工作是不是有足夠保證我將它下面 –

回答

1

首先,無論是代碼段您發佈是正確的。工作的出現是不夠的。代碼正在訪問合法的邊界之外,而在C++中,這意味着任何時候都可能發生任何事情。它有時似乎有效,有時可能不起作用。

但是爲什麼第一個片段可能不會出現工作最直接的原因是因爲你被錯誤地重用指數i當你切換循環聲明使用j

for(j=1;j<N+1;j++) // <--- j 
{ 
cin >> yl[i]; // <--- i 
} 

這是一個預先確定循環指數的原因是不好的做法。你應該總是在循環中聲明循環變量。假如你這樣做,那麼就不會在外部範圍,爲您無意中在j循環使用過任何i

+0

非常感謝。我正要找到替代代碼。 –

+0

意外錯誤。仍然無法確定在校對閱讀過程中它是如何吸引我的。 –