首页 > 解决方案 > 计算平方根的程序

问题描述

我是一名学生,不幸的是,在线学习真的不是学习,更像是一步一步地解释“为什么”,所以我很难弄清楚这一点,任何解释帮助都会很棒!我正在尝试编写一个不使用 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();
        }
    }
}

标签: c#

解决方案


让我们提取一个方法:我们希望用户输入一个有效的正双精度值:

  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();                    
  }

推荐阅读