1

ユーザーに浮動小数点数を入力するように求め、その数値を取得して整数部分と小数部分を分離するコンソール アプリを C++ で作成しようとしています。

出力例は次のとおりです。

浮動小数点数を入力してください:
800.589
整数部分は 800 で、小数部分は .589 です

私の解決策を以下に示します。

#include <iostream>
#include <cmath>
using namespace std;

void spliceAnyNumber (double anyNumber)
{
double integerPart = 1;
double fractionPart = 1;
double *pIntegerPart = &integerPart;
double *pFractionPart = &fractionPart;
fractionPart = fmod(anyNumber,1);
integerPart = anyNumber - fractionPart;
cout << "The integer part is " << *pIntegerPart << " and the fraction part is " << *pFractionPart << "\n";
cout << endl;
cout << "The address of *pIntegerPart is " << &integerPart << "\n";
cout << endl;
cout << "The address of *pFractionPart is " << &fractionPart << "\n";
cout << endl;
}

int main()
{   
cout << "Please enter a floating point number: ";
double anyNumber = 0;
cin >> anyNumber;
cout << endl;    
spliceAnyNumber(anyNumber);
system("Pause");
return 0;   
}

私はプログラムを書きましたが、関数にポインターを渡し、逆参照された値を操作するように求められています。以下でそれを実行しようとしましたが、コンパイラから大量のエラーが返されます。

#include <iostream>
#include <cmath>
using namespace std;

void spliceAnyNumber (double *pAnyNumber)
{
double integerPart = 1;
double fractionPart = 1;
double *pIntegerPart = &integerPart;
double *pFractionPart = &fractionPart;
&fractionPart = fmod(&anyNumber,1);
&integerPart = &anyNumber - &fractionPart;
cout << "The integer part is " << *pIntegerPart << " and the fraction part is " <<     *pFractionPart << "\n"; *pFractionPart << "\n";
cout << endl;
cout << "The address of *pIntegerPart is " << &integerPart << "\n";
cout << endl;
cout << "The address of *pFractionPart is " << &fractionPart << "\n";
cout << endl;
}

int main()
{   
cout << "Please enter a floating point number: ";
double *pAnyNumber = &anyNumber;
cin >> *pAnyNumber;
cout << endl;    
spliceAnyNumber(*pAnyNumber);
system("Pause");
return 0;   
}

ポインターを追加する際にどこが間違っていますか? バージョン 1 は機能しますが、バージョン 2 は機能しません。

4

4 に答える 4

1

私はこれをインラインで記しました。

#include <iostream>
#include <cmath>
using namespace std;

void spliceAnyNumber (double *pAnyNumber)
{
  double integerPart = 1;
  double fractionPart = 1;
  double *pIntegerPart = &integerPart;
  double *pFractionPart = &fractionPart;
  &fractionPart = fmod(&anyNumber,1);  // <- you should dereference pAnyNumber instead, and assign to fractionPart (i.e. "fractionPart = fmod(*pAnyNymber, 1);
  &integerPart = &anyNumber - &fractionPart;  // <- similar as above
  cout << "The integer part is " << *pIntegerPart << " and the fraction part is " <<     *pFractionPart << "\n"; *pFractionPart << "\n";
  cout << endl;
  cout << "The address of *pIntegerPart is " << &integerPart << "\n";
  cout << endl;
  cout << "The address of *pFractionPart is " << &fractionPart << "\n";
  cout << endl;
}

int main()
{   
  cout << "Please enter a floating point number: ";
  double *pAnyNumber = &anyNumber;  // <- you haven't declared an 'anyNumber' variable to take the address of
  cin >> *pAnyNumber;
  cout << endl;    
  spliceAnyNumber(*pAnyNumber);
  system("Pause");
  return 0;   
}
于 2013-01-30T21:21:27.007 に答える
0

演算子は変数の&アドレスを取るので、typeof(&anyNumber) == double**. *代わりにオペレーターが必要です。

「演算子double *pAnyNumberを適用すると、」と読む必要があります。(実際には左辺値参照を取得しますが、それは舌から転がり落ちず、おそらく混乱するでしょう...)*double

あなたのmain機能は混乱しています。元のままにして、 に変更spliceAnyNumber(pAnyNumber);spliceAnyNumber(&pAnyNumber);ます。

于 2013-01-30T21:21:04.373 に答える
0

あなたが書いたとき、あなたはanyNumber実際に を意味していたと思いますpAnyNumber。ポインタがあれば

double* p;

*pではなくによって逆参照し&pます。前者は を与えdouble、後者は を与えますdouble**

于 2013-01-30T21:23:09.083 に答える
0

anyNumber逆参照する前に宣言する必要があります。

double *pAnyNumber = &anyNumber; // references an undeclared variable

関数に渡すときにアドレスを取得するだけです。その前に、通常の変数を使用できます - ポインタは必要ありません:

double anyNumber;
cin >> anyNumber;
cout << endl;
spliceAnyNumber(&anyNumber); 

さらに、関数で間違った演算子を使用しています。次のようになります。

*pFractionPart = fmod(*pAnyNumber,1);
*pIntegerPart = *pAnyNumber - fractionPart;

もう 1 つは無効な構文です。&variable = ...文字通り「変数 = のアドレス」を意味し、結果としてdouble**.

したがって、変更する必要があるのは、関数パラメーターとそれにアクセスすることだけです。関数内のこれらすべてのポインターは必要ありません..

于 2013-01-30T21:19:05.100 に答える