当前位置: 首页 > article >正文

【C语言程序设计——循环程序设计】利用循环求数值 x 的平方根(头歌实践教学平台习题)【合集】

目录😋

任务描述

相关知识

一、求平方根的迭代公式

1. 原理

2. 代码实现示例

二、绝对值函数fabs()

1. 函数介绍

2. 代码示例

三、循环语句

1. for循环

2. while循环

3. do - while循环

编程要求

测试说明

通关代码

测试结果


任务描述

本关任务:运用迭代公式,编写一个循环程序,求解出数值x的平方根。


相关知识

为了完成本关任务,你需要掌握:

  1. 求平方根的迭代公式
  2. 绝对值函数 fabs()
  3. 循环语句

一、求平方根的迭代公式

1. 原理
  • 在 C 语言中,求一个数的平方根可以使用牛顿迭代法。对于方程x^{2}=a(为要求平方根的数),设x_{n}x的第n次近似值,牛顿迭代公式为x_{n+1}=\frac{1}{2}(x_{n}+{\frac{a}{x_{n}} } )
  • 其基本思想是从一个初始近似值开始,通过不断迭代这个公式,使得x_{n}越来越接近\sqrt{a}。例如,假设要求\sqrt{2},可以先取一个初始值x_{0}=1(初始值的选择会影响收敛速度,但只要不太离谱,一般都能收敛),然后根据迭代公式计算x_{1}=\frac{1}{2}(x_{0}+\frac{2}{x_{0}})=\frac{1}{2}(1+2)=1.5,再用x_{1}计算x_{2},以此类推,经过多次迭代后,就可以得到一个足够精确的的\sqrt{2}近似值。
2. 代码实现示例
  • 以下是一个使用牛顿迭代法求平方根的简单函数:
    #include <stdio.h>
    double mySqrt(double a) {
      double x = 1.0;  // 初始近似值
      double diff;
      do {
        double new_x = 0.5 * (x + a / x);
        diff = new_x - x;
        x = new_x;
      } while (diff > 0.00001 || diff < -0.00001);  // 精度控制
      return x;
    }
    int main() {
      double num = 2.0;
      double result = mySqrt(num);
      printf("The square root of %lf is %lf\n", num, result);
      return 0;
    }
    
    在这个函数mySqrt中,首先设置了初始近似值,然后在do - while循环中,根据牛顿迭代公式计算新的近似值new_x,计算当前近似值和新近似值的差值diff,并更新x。循环的终止条件是差值的绝对值小于一个给定的精度值(这里是),最后返回近似的平方根值。

二、绝对值函数fabs()

1. 函数介绍
  • fabs()函数定义在<math.h>头文件中,它用于计算一个浮点数的绝对值。例如,fabs(-3.14)会返回3.14fabs(5.0)会返回5.0。这个函数在很多数值计算场景中都很有用,比如在比较两个浮点数的差值是否小于某个精度值时,需要先计算差值的绝对值。
2. 代码示例
  • 以下是一个简单的示例,展示了fabs()函数的使用:
    #include <stdio.h>
    #include <math.h>
    int main() {
      double num1 = -7.5;
      double num2 = 3.2;
      double diff = num1 - num2;
      double abs_diff = fabs(diff);
      printf("The absolute difference between %lf and %lf is %lf\n", num1, num2, abs_diff);
      return 0;
    }
    在这个例子中,首先计算了num1num2的差值diff,然后使用fabs()函数计算了差值的绝对值abs_diff,最后将结果输出。

三、循环语句

1.for循环
  • 语法和基本原理
    • for循环的基本语法是for(初始化表达式; 条件表达式; 更新表达式)。其中,初始化表达式用于初始化循环变量,一般在循环开始时执行一次;条件表达式用于判断循环是否继续执行,只要条件为真(非零),循环就会继续;更新表达式用于在每次循环体执行后更新循环变量。
    • 例如,下面的for循环用于打印从到的数字:
      #include <stdio.h>
      int main() {
        for (int i = 1; i <= 5; i++) {
          printf("%d ", i);
        }
        printf("\n");
        return 0;
      }
      
      其中,int i = 1是初始化表达式,定义并初始化了循环变量为;i <= 5是条件表达式,只要小于等于,循环就会继续;i++是更新表达式,每次循环后的值会增加。循环体printf("%d ", i);会在每次循环时执行,打印出当前的值。
2.while循环
  • 语法和基本原理
    #include <stdio.h>
    int main() {
      int i = 1;
      int sum = 0;
      while (i <= 100) {
        sum += i;
        i++;
      }
      printf("The sum of integers from 1 to 100 is %d\n", sum);
      return 0;
    }
    
     
    • while循环的语法是while(条件表达式)。只要条件表达式为真(非零),循环体就会一直执行。它与for循环的主要区别在于while循环没有专门的初始化和更新部分,这些操作需要在循环体外部或内部手动完成。
    • 例如,下面是一个使用while循环计算到的整数和的程序:
      • 在这里,首先在循环体外部初始化了循环变量和累加和变量sum = 0。然后在while循环中,只要i <= 100条件为真,就会执行循环体。循环体中先将i累加到sum中,然后更新i的值(i++)。
3.do - while循环
  • 语法和基本原理
    • do - while循环的语法是do{循环体}while(条件表达式);。它与while循环的不同之处在于,do - while循环先执行一次循环体,然后再判断条件表达式。这意味着循环体至少会执行一次。
    • 例如,下面是一个使用do - while循环来验证用户输入是否为正数的程序:
      #include <stdio.h>
      int main() {
        int num;
        do {
          printf("Please enter a positive number: ");
          scanf("%d", &num);
        } while (num <= 0);
        printf("You entered a positive number: %d\n", num);
        return 0;
      }
      
      在这个例子中,首先会执行一次do后面的循环体,提示用户输入一个正数并读取用户输入。然后判断num <= 0这个条件,如果为真,就会再次执行循环体,要求用户重新输入,直到用户输入一个正数为止。

编程要求

根据提示在右侧编辑器Begin--End之间的区域内补充必要的代码,求解出数值x的平方根;
注意:不能直接用平方根公式/函数求解本题!


测试说明

平台会对你编写的代码进行测试:

测试输入:

2

预期输出:

1.414214

 测试输入:

36

预期输出:

6.000000

开始你的任务吧,祝你成功!


通关代码

/*1.编程实现:求一个数x的平方根*/
#include "stdio.h"
main(){
	double x,x0,x1,x2; 
	scanf("%lf",&x);
    x0=x/2;
	x1=(x0+x/x0)/2;
	x2=x1-x0;
	if(x2<0)x2=-x2;
	/************************begin***********************/
    while(x2 >= 1e-5){
        x0 = x1;
        x1 = (x0 + x/x0)/2;
        x2 = x1 - x0;
        if(x2<0){x2 = -x2;}
    }
    /************************end************************/
	printf("键盘输入的该数字的平方根是%lf",x1);
}

测试结果

在这里插入图片描述


http://www.kler.cn/a/456367.html

相关文章:

  • STM32学习之 按键/光敏电阻 控制 LED/蜂鸣器
  • 第十七周:Fast R-CNN论文阅读
  • 线索二叉树的实现(c语言)
  • 【开源免费】基于SpringBoot+Vue.JS网上摄影工作室系统(JAVA毕业设计)
  • Redisson 框架详解
  • springboot配置并使用RestTemplate
  • 钉钉机器人发送excel表(简易版)
  • 使用ArcGIS/ArcGIS pro绘制六边形/三角形/菱形渔网图
  • vim文本编辑器常用命令和快捷键
  • Modern C++ std::atomic简介
  • neo4j无法导入csv文件
  • 渗透测试入门DVWA 教程1:环境搭建
  • 【WRF模拟】最高/最低日气温偏高/偏低的参数调整
  • 【Android】application@label 属性属性冲突报错
  • 潇洒郎:部署Dify, 安装Ollama,Ollama下载模型,Dify配置模型
  • JavaScript甘特图 dhtmlx-gantt
  • 面试场景题系列:设计URL短链
  • 深度学习中的参数初始化
  • Anaconda 安装与虚拟环境创建完整指南
  • jetbrains HTTPS 请求与响应流量分析报告【二】
  • C语言实践中的补充知识 Ⅶ
  • 在国产电脑上运行PDFSAM软件使用pdf分割合并交替混合处理pdf文档
  • 基于 Vant UI + Redisson BitSet 实现签到日历
  • springBoot发布https服务及调用
  • 77、将adaface的mtcnn模型npy文件转成atlas310p模型,并进行推理
  • 【Linux网络编程】第十五弹---传输层深度解析:端口号划分、UDP协议特性与TCP协议全面剖析(含连接管理、流量控制、拥塞控制等)