私は現在、私の大学での実験室演習用の銀行端末プログラムに取り組んでいます。
私の足を踏み外したのは、転送される金額のユーザー入力を受け取り、それがすべての要件に適合するかどうかを確認し、適合する場合はプログラムに提供された値を返す関数です。
私たちの家庭教師は、入力を保護するあらゆる手段に腹を立てているため、あらゆる種類の不一致についてエラーを呼び出す必要があります。価値が高すぎる?エラー。負またはゼロの値? エラー。0.01 よりも正確な数値は? エラー。入力に数字以外のドット以外の文字が含まれていますか? エラー。
そのため、私の機能は間違いなく過度に複雑ですが、それでも問題ありません。私を壁に押し上げるのは、atof()
とstrtod()
関数の両方が何らかの形で間違った方法で数値を読み取るという事実です。
long double take_amount()
{
char input[21];
bool success, correct;
unsigned long int control1;
long double amount, control, control2, control3;
do
{
success = true, correct = true;
printf("\t\tAmount:\t\t");
success = scanf("%20[^ \t\n]c", input);
__fpurge(stdin);
correct = check(input, 'b');
amount = strtod(input, NULL);
printf("\n\tGOT %.20Lf\n", amount); ///
control = amount * 100;
control1 = (unsigned long int)floor(control);
control2 = (long double) control1;
control3 = control2 - control;
printf("\n\tGOT2 %.20Lf\n", control3); ///
if (control3 != 0)
{
if (control3 >= 1 || control3 <= -1)
{
printf("\n\t\tWe are sorry, but for the safety reasons it is impossible to transfer");
printf("\n\t\tsuch a great amounts while online. If you really wish to finalize");
printf("\n\t\tthis operation, please, visit the closest division of our bank.");
printf("\n\t\tWe are sory for the inconvenience and wish you a pleasent day.");
press_enter();
}
correct = false;
printf("\nDAMN\n"); ///
}
if (amount <= 0)
{
correct = false;
printf("\nGOD DAMN\n"); ///
}
if(success == false || correct == false)
{
printf("\n\t\tInvalid input, please try again.\n\n");
}
else
{
printf("\t\t\t\t%.2Lf\n", amount);
printf("\n\t\tIs it correct input? ((Y)es/(N)o/(E)xit)");
if (accept())
{
break;
}
else
{
continue;
}
break;
}
}while (1);
return amount;
ここで使用されている関数に関する限りcheck()
、文字列に有効な文字 (数字とドット) のみが含まれているかどうかを確認し、press_enter()
Enter キーを押してメイン メニューに移動するのを待機し、accept()
y/n/e のみを読み取り、true
yに戻り、 false
nに戻り、終了します。 eのメニューへ。
制御変数の長い部分は、数値が 0.01 よりも正確でないかどうかを確認するための私の解決策です。悲しいことに、それは動作しませんstrtod()
。
私の問題は、それstrtod()
が実際には機能しないことです!アンダーフローやオーバーフローにはほど遠い、本当に平凡な数値であっても、返される値は入力と一致しません。いくつかの例:
入金したい金額を入力します。 金額: 1234.45 1234.45000000000004547474 を取得しました 入金したい金額を入力します。 金額: 0.999 GOT 0.9989999999999999911
それが私のせいである可能性は低いですが、このコードを数時間使用した後でも、まだ機能する解決策を思い付くことができませんでした。
の読みを修正する方法はありますstrtod()
か? そうでない場合、チェックする必要があるすべてをチェックできるように、その入力を取得する別の方法はありますか?
編集:注意してください!
私の家庭教師は一緒に仕事をするのが最も簡単な人ではないことをまだ述べていない場合は、今そうします.
彼は、アカウントに保存されている残高を保持するために、DOUBLE 形式を使用することを強制します。私の同僚の 1 人が、2 整数ドル - セント構造を使用したことでプログラムが拒否されたので、私はそれを知っています。
ここで助けていただければ幸いです。どうにかしてその問題を解決できますか? 私はお金を保管するためにダブルタイプを使わなければなりません。また、入力に文字が含まれていないかどうかを確認する必要があります(scanf()
オンに設定する%Lf
と、数字以外のすべてが末尾から削除されます)、入力が 0.01 よりも正確でないかどうかを確認する必要があります。入力。助言がありますか?