c# - 计算平方根的程序
问题描述
我是一名学生,不幸的是,在线学习真的不是学习,更像是一步一步地解释“为什么”,所以我很难弄清楚这一点,任何解释帮助都会很棒!我正在尝试编写一个不使用 Math.Sqrt 计算数字平方根的程序。到目前为止,我计算的是整数并给出整数或小数的结果。但是我遇到的麻烦是如果用户输入一个负数,那么程序就会中断。我需要帮助的第二部分是添加代码,提示用户在输入单词时输入数字。这是我到目前为止所拥有的:
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;
//Calculate the square root of decimals and whole numbers
namespace Sqaure_Root
{
public sealed partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent();
}
private void okClick(object sender, RoutedEventArgs e)
{
double number = Convert.ToDouble(userInput.Text);
double root = 1, temp = 0;
//Calculate square root
while (root != temp)
{
temp = root;
root = (number / root + root) / 2;
}
if (number < 0)
{
resultBx.Text = ("Please enter a positive number");
number = Convert.ToDouble(userInput.Text);
}
else
{
resultBx.Text = ("Please enter a number");
}
resultBx.Text = root.ToString();
}
}
}
解决方案
让我们提取一个方法:我们希望用户输入一个有效的正双精度值:
private bool TryReadDouble(out double result) {
if (!double.TryParse(userInput.Text, out result)) {
resultBx.Text = "Sorry, not a number. Please, enter a non-negative value.";
return false;
}
else if (result < 0) {
resultBx.Text = "Please, enter a non-negative value.";
return false;
}
else if (double.IsNaN(result)) { // <- from now on let's be a bit paranoic
resultBx.Text = "Please, enter a valid non-negative value.";
return false;
}
else if (double.IsInfinity(result)) {
resultBx.Text = "Please, enter a finite non-negative value.";
return false;
}
// result is finite non-negative value
return true;
}
现在您可以在主程序中使用此方法:
private void okClick(object sender, RoutedEventArgs e) {
if (!TryReadDouble(out var number))
return;
// number is a non-negative double value; no further check required
// time to compute the square root:
double root = 1;
// Math.Abs(temp - root) > ... - we should compare double with some tolerance
for (double temp = 0; Math.Abs(temp - root) > 1e-8; ) {
temp = root;
root = (number / root + root) / 2;
}
resultBx.Text = root.ToString();
}
推荐阅读
- python - 如何将生成器添加到 Sympy Poly 对象?
- assembly - UEFI 引导模式引导流程如何?
- python - 这个循环是怎么回事?
- python - 如果数字为 0 或大于 1,则将 's' 添加到字符串
- cluster-analysis - 混合数据类型使用哪种分析方法
- android - 在 javadoc 中自动生成 @version 值
- clojure - 在不同的命名空间中覆盖 Clojure 规范
- python - 控制 Legend() 显示特定数据集
- javascript - 使用 jQuery 更改具有类型写入文本效果的图像
- typescript - React Native“全局”变量 Intellij 未定义