2017-11-07 5 views
-1

私は、ヘッダーファイルで定義された関数を使用し、スロープをメイン関数に返すことによって、ユーザーによるスロープ入力を計算しようとしています。関数が10進数を返さず、時には間違った値を返しますか?

今私の問題は、私の数式が正しいのに、プログラムが計算する勾配が間違っていることです。

また、時には与えられた傾きがちょうど四捨五入され、ランダムに負であることもあります。私はここで何か悪いことをしましたか?

私のメインのコード:

#include <iostream> 
#include "findSlope.h" 
using namespace std; 

int main() 
{ 
    float p1, p2, p3, p4, rep, slope; 
    int i; 

    cout << "input point 1:"; 
    cin >> p1; 
    cout << "input point 2:"; 
    cin >> p2; 
    cout << "input point 3:"; 
    cin >> p3; 
    cout << "input point 4:"; 
    cin >> p4; 
    cout << "input amount of repetition:"; 
    cin >> rep; 

    cout << "\nYour points are =" << p1 << "\t" 
     << p2 << "\t" << p3 << "\t" << p4; 
    for (i=0;i<rep;i++) 
    { 
     slope = findSlope(p1,p2,p3,p4,rep); 
     cout << "Point 1\tPoint2\tSlope\n"; 
     cout << "("<<p1<<","<<p2<<")\t"; 
     cout << "("<<p3<<","<<p4<<")\t"; 
     cout << slope; 
    } 
    return 0; 
} 

私のヘッダファイル:原則として

#include <iostream> 
using namespace std; 

findSlope(float p1,float p2,float p3,float p4,float rep) 
{ 
    float slope; 

    cout << "\nInput your first coordinates (seperated by space) :"; 
    cin >> p1 >> p2; 
    cout << "Input your second coordinates (seperated by space) :"; 
    cin >> p3 >> p4; 

    slope = (p4-p2)/(p3-p1); 

    return slope; 
} 
+4

'main'はユーザにいくつかの数字を入力するように要求し、それらを' findSlope'に渡します。後者はこれらのパラメータを完全に無視し、さらに多くの数値を入力するように求め、それらの計算を実行します。あなたはそれをこのように意味しましたか? –

+2

ヘッダーファイルに*関数*を定義しないでください。 [ヘッダーファイルで 'using namespace std;'を使わないでください(https://stackoverflow.com/questions/14575799/using-namespace-std-in-a-header-file)(または[一般的には(https ://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-bad-practice))。 [ヘッダーを含むガード](https://en.wikipedia.org/wiki/Include_guard)と['#pragma once'](https://en.wikipedia.org/wiki/Pragma_once)について学んでください。そして、コンパイラの警告を読んでください。 –

+2

あなたの 'for'ループは同じことを' rep'時間計算します。あなたはそれをこのように意味しましたか? – EJP

答えて

1

あなたがfindSlope()機能の種類を指定していないので、このコードは、C++でコンパイルべきではありません。

コンパイラフラグ-fpermissiveでコンパイルを強制すると、関数はconsidered as returning an intになります。 floatからintへの変換は、あなたが記述した奇妙な振る舞いを説明することができます(変換でオーバーフローが発生した場合は切り捨てられます)。

float findSlope(float p1,float p2,float p3,float p4,float rep) 
{ 
    ... 
} 

その他備考:

  • あなたがdouble代わりのfloatを使用して検討することもでき

    は、とのコードを修正してください。精度は高く、最新のCPUのオーバーヘッドはあまり高くありません。

  • findSlope.hヘッダーでは、次の2つのことを行うべきではありません。まず、そのヘッダーを含むすべてのファイルを汚染する名前空間を使用します。他のコンパイル単位に同じヘッダーを含めると、各.cppファイルが関数を再コンパイルし、リンカーエラーが発生する可能性があるように、関数を定義します。
関連する問題