【C语言必知必会 | 第八篇】一文带你精通循环结构

news2024/11/18 3:44:11

引言

C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发。它在编程语言中具有举足轻重的地位。
此文为【C语言必知必会】系列第八篇,进行C语言循环结构的专项练习,结合专题优质题目,带领读者从0开始,深度掌握知识点。

在这里插入图片描述

文章目录

    • 1️⃣ 前言
    • 2️⃣专项练习
    • 5️⃣总结


1️⃣ 前言

在上一讲中,带领读者掌握了循环结构的相关知识点,由于题目和实践是学习的核心,所以开展专项练习十分重要。

在本讲中,将深入剖析几个经典的C语言循环结构练习带领读者在理论结合实际的基础上更好地学习、吸收、掌握C语言。


2️⃣专项练习

在循环结构的学习中我们主要学习while、do…while、for三种循环。常用的三种循环结构学习的重点在于弄清它们相同与不同之处,以便在不同场合下使用。

在这里插入图片描述

一个通用的解题思路如下:

在C语言中,循环结构通常用于重复执行一段代码,直到满足特定条件为止。下面是一种通用的解题思路,适用于很多循环问题:

1.首先需要明确何时应该终止循环。这个条件可以是一个比较表达式、逻辑表达式或其他能够计算为布尔值的表达式。

2.在进入循环之前,要初始化用于控制循环的变量。这个变量在循环的迭代过程中会不断更新。

3.循环体是被重复执行的代码块。它包含了解题的主要逻辑,并且会根据实际情况更新循环变量。

4.在每次循环迭代结束时,要对循环变量进行更新操作。这样可以使循环朝着终止条件逐渐演进。

下面是一个简单的示例,展示了如何使用循环结构计算1到10的累加和:

#include <stdio.h>

int main() {
    int sum = 0; // 用于存储累加和的变量
    int i; // 控制循环的变量
    
    for (i = 1; i <= 10; i++) {
        sum += i; // 累加当前的数到sum变量
    }

    printf("1到10的累加和为:%d\n", sum);
    
    return 0;
}

在这个示例中,我们使用了for循环来重复执行累加操作。循环条件为i <= 10,即当i的值小于等于10时,继续循环。循环体中的代码是将当前的数累加到sum变量中。每次循环结束时,i会自增1,从而逐渐迭代到11,退出循环。

这个通用的解题思路可以帮助你处理很多循环问题,无论是求和、查找、遍历数组还是其他类型的算法。

以上是一个通用的解题思路,仍需根据具体问题的要求进行适当的调整和扩展。

接下来,让我们开始本节课程的专题练习,读者需要躬身实践来掌握。


第一题:求1!+2!+……+n!

解题思路如下:

使用二重循环做题,先使 i1 遍历到 n,再使 j1 遍历到 i ,进行相乘

下面是具体的代码实现:

#include <stdio.h>
int main()
{


    int n,i,j,sum=1,sum1=0;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
		for(j=1;j<=i;j++)
		{
			sum*=j;
		}
		sum1+=sum;
	}
    
    printf("%d",sum1);
  }

注意,上面这个代码块有一个致命的错误:没有将sum进行重置。

在每次内层循环前,要将sum变量重置为1,以确保每次内层循环都从1开始计算阶乘。否则,sum会一直累积上一次循环的结果。

修正后的代码如下:

#include <stdio.h>

int main() {
    int n, i, j, sum = 1, sum1 = 0;
    scanf("%d", &n);
    
    for (i = 1; i <= n; i++) {
        sum = 1; // 重置sum为1
        for (j = 1; j <= i; j++) {
            sum *= j; // 计算阶乘
        }
        sum1 += sum; // 累加阶乘结果
    }
    
    printf("%d\n", sum1);
    
    return 0;
}

程序运行结果如下:

在这里插入图片描述

至此,第一题已解题结束。


第二题:计算

要求:(1)最后一项小于10的-6次方停止。(2) 用for语句实现循环。

解题思路

1/i 的形式,并且i以2为单位自增。同时要确保1进行正负交替。

代码实现:

#include <stdio.h>

int main() {

int i;
double a=-1.0,x,sum=0.0;

for(i=1;;i+=2)
    
    {
    	a=-a;  //1进行正负交替
    	x=a/i;
    	if(x<1e-6)  //逻辑判断,跳出循环
    	{
			break;
		}
		sum+=x;
	}
	
	printf("%lf",sum);
    
    return 0;
}

程序运行结果:

在这里插入图片描述

至此,第二题已解题完毕。


第三题:

在这里插入图片描述

解题思路

密码只允许输入3次,则使用循环来使用scanf;

如果在第3次或3次以内输入正确,则输出welcome,否则输出Bye

代码实现

#include <stdio.h>

int main() {

int x=11;  //正确密码

int a,i;

for(i=1;i<=3;i++)
{
	scanf("%d",&a);  //输入密码
	if(a==x)
	{
		printf("Welcome!");  //如果正确,直接跳出循环
		break;
	}

if(i==3)   //第三次还是不能达到if的条件时,输出break
{
	printf("break");
}	
     }

    return 0;
}

注意:判断数值是否相等时需要使用的运算符为== 而不是=

程序运行结果:

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

至此,第三题已解题完毕。


第四题:打印所示图形

要求:输入n代表图形所占的行数

在这里插入图片描述

解题思路

使用两个嵌套的 for 循环来控制每行的输出。外层循环控制行数,内层循环控制每行中的列数。

内层循环中的第一个循环用于输出空格,以对齐三角形。它根据当前行数和总行数之间的差值来确定需要打印的空格数。

内层循环中的第二个循环用于输出等边三角形的边。它打印 (2 * i - 1) 个星号,其中 i 是当前行数。

最后,使用 printf(“\n”) 来打印换行符,以继续下一行的输出。

代码实现

首先我们确保每一行的*能被打印出来:

#include <stdio.h>

int main() {
    int hang;
  
    printf("请输入行数:");
    scanf("%d", &hang);

    for (int i = hang; i >= 1; i--) 
	{
        for (int k = 1; k <= 2 * i - 1; k++) {
            printf("*"); // 打印三角形的边
        }
        printf("\n"); // 打印换行
    }

    return 0;
}

接着我们确保输出空格,以对齐三角形:

#include <stdio.h>

int main() {
    int hang;
  
    printf("请输入行数:");
    scanf("%d", &hang);

    for (int i = hang; i >= 1; i--) 
	{
        for (int j = 1; j <= hang - i; j++) {
            printf(" "); // 打印空格来对齐
        }
        for (int k = 1; k <= 2 * i - 1; k++) {
            printf("*"); // 打印三角形的边
        }
        printf("\n"); // 打印换行
    }

    return 0;
}

程序运行结果:

在这里插入图片描述

自此,第四题已解题完成。


现在让我们看看第五题:

第五题:计算

在这里插入图片描述

解题思路

分子/分母的形式,分子看成以1为增量的阶乘,分母看成以2为增量的阶乘。

代码实现

#include <stdio.h>

int main() {
    int i = 1;
    double sum = 0.0;
    double fenzi = 1.0;
    double fenmu = 1.0;

    while (fenzi / fenmu >= 1e-6)
    {
        sum += fenzi / fenmu;
        fenzi *= i;                   // 计算分子的阶乘
        fenmu *= (i * 2 + 1);       // 计算分母的阶乘
        i++;
    }

    printf("%lf", sum);

    return 0;
}

程序运行结果:

在这里插入图片描述

至此,第五题已解题完成。


5️⃣总结

此文为 【C语言你还没卷起来?】系列之第八篇 ,通过以题代练的形式带领读者掌握C语言的循环结构,带领读者从0开始,深度掌握知识点。

以题代练对于C语言的学习是十分重要的,专栏将持续提供优质C语言编程题与理论课的学习,带领读者全方位掌握C语言,读者可订阅专栏持续跟进。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1115554.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

丰富功能带来新奇体验,乐划锁屏持续引领行业潮流

在日常使用手机的过程中,为了省电或在口袋里误触,不少用户都会对手机进行锁屏,有这么一款锁屏软件,不仅能够解决以上功能性问题,还有不少其他新奇的功能,那就是乐划锁屏。 现在“手机不离手”、每天翻看手机上百遍的年轻人,最喜欢关注什么样的内容呢?乐划锁屏以图片和视频为主…

RabbitMQ官方案例学习记录

官方文档&#xff1a;RabbitMQ教程 — RabbitMQ (rabbitmq.com) 一、安装RabbitMQ服务 直接使用docker在服务器上安装 docker run -it -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.12-management 安装完成后&#xff0c;访问15672端口&#xff0c;默认用户…

实时数据更新与Apollo:探索GraphQL订阅

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…

FIFO设计16*8,verilog,源码和视频

名称&#xff1a;FIFO设计16*8&#xff0c;数据显示在数码管 软件&#xff1a;Quartus 语言&#xff1a;Verilog 代码功能&#xff1a; 使用verilog语言设计一个16*8的FIFO&#xff0c;深度16&#xff0c;宽度为8。可对FIFO进行写和读&#xff0c;并将FIFO读出的数据显示到…

【微服务保护】初识 Sentinel —— 探索微服务雪崩问题的解决方案,Sentinel 的安装部署以及将 Sentinel 集成到微服务项目

文章目录 前言一、雪崩问题及其解决方案1.1 什么是雪崩问题1.2 雪崩问题的原因1.3 解决雪崩问题的方法1.4 总结 二、初识 Sentinel 框架2.1 什么是 Sentinel2.2 Sentinel 和 Hystrix 的对比 三、Sentinel 的安装部署四、集成 Sentinel 到微服务 前言 微服务架构在现代软件开发…

Rust通用编程概念

文章目录 变量与可变性数据类型标量类型整数类型浮点类型布尔类型字符类型 复合类型元组数组 函数注释控制流if表达式循环 变量与可变性 变量与可变性 在Rust中&#xff0c;声明变量使用let关键字&#xff0c;并且默认情况下&#xff0c;声明的变量是不可变的&#xff0c;要使变…

C语言实现用递归法将一个整数 n 转换成字符串。例如,输入 483,应输出字符串“483“。n 的位数不确定,可以是任意位数的整数

完整代码&#xff1a; /*用递归法将一个整数 n 转换成字符串。例如&#xff0c;输入 483&#xff0c;应输出字符串"483"。n 的 位数不确定&#xff0c;可以是任意位数的整数。*/ #include<stdio.h> //long long int让n的取值范围更广 void func(long long int…

手搭手zabbix5.0监控redis7

Centos7安装配置Redis7 安装redis #安装gcc yum -y install gcc gcc-c #安装net-tools yum -y install net-tools #官网https://redis.io/ cd /opt/ wget http://download.redis.io/releases/redis-7.0.4.tar.gz 解压至/opt/目录下 tar -zxvf redis-7.0.4.tar.gz -C /opt/ #…

SpringCloud链路追踪——Spring Cloud Sleuth 和 Zipkin 介绍 Windows 下使用初步

前言 在微服务中&#xff0c;随着服务越来越多&#xff0c;对调用链的分析越来越复杂。如何能够分析调用链&#xff0c;定位微服务中的调用瓶颈&#xff0c;并对其进行解决。 本篇博客介绍springCloud中用到的链路追踪的组件&#xff0c;Spring Cloud Sleuth和Zipkin&#xf…

扩散模型学习

第一章 1.1 的原理 给定一批训练数据X&#xff0c;假设其服从某种复杂的真实 分布p(x)&#xff0c;则给定的训练数据可视为从该分布中采样的观测样本x。 生成模型就是估计训练数据的真实分布&#xff0c;使得估计的分布q(x)和真实分布p(x)差距尽可能能的小。 使得所有训练…

【五:Httprunner的介绍使用】

接口自动化框架封装思想的建立。httprunner&#xff08;热加载&#xff1a;动态参数&#xff09;&#xff0c;去应用 意义不大。 day1 一、什么是Httprunner? 1.httprunner是一个面向http协议的通用测试框架&#xff0c;目前最新的版本3.X。以前比较流行的 2.X的版本。2.它的…

FPGA的音乐彩灯VHDL流水灯LED花样,源码和视频

名称&#xff1a;FPGA的音乐彩灯VHDL流水灯LED 软件&#xff1a;Quartus 语言&#xff1a;VHDL 代码功能&#xff1a; &#xff08;1&#xff09;设计一彩灯控制电路&#xff0c;按要求控制8路&#xff08;彩灯由发光 二极管代替&#xff0c;受实验箱限制&#xff0c;多路同…

CUDA 学习记录

1.关于volatile&#xff1a; 对于文章中这个函数&#xff0c; __global__ void reduceUnrollWarps8 (int *g_idata, int *g_odata, unsigned int n) {// set thread IDunsigned int tid threadIdx.x;unsigned int idx blockIdx.x * blockDim.x * 8 threadIdx.x;// convert…

李m圆申论

听话出活 3小时 /处理7500字 /一共5题 /写出2200字 字写得好看点&#xff0c;符号也算字数&#xff0c;占一个格 基本思路&#xff1a;考什么范围答什么 。。。落后&#xff1b;资源闲置、缺乏 申论&#xff1a; 作文题&#xff1a;举例子 处理材料 摘抄&#xff1a; 有人出…

《数据结构、算法与应用C++语言描述》-队列的应用-电路布线问题

《数据结构、算法与应用C语言描述》-队列的应用-电路布线问题 问题描述 在 迷宫老鼠问题中&#xff0c;可以寻找从迷宫入口到迷宫出口的一条最短路径。这种在网格中寻找最短路径的算法有许多应用。例如&#xff0c;在电路布线问题的求解中&#xff0c;一个常用的方法就是在布…

Linux进程(三)--进程切换命令行参数

继上回书Linux进程概念&#xff08;二&#xff09;--进程状态&进程优先级&#xff0c;我们在了解了Linux进程状态和优先级的概念&#xff0c;初步掌握了进程状态的相关知识&#xff0c;最终&#xff0c;我们以Linux进程的优先级&#xff0c;引出了一些其他的概念&#xff1…

非平稳信号分析和处理、STFT的瞬时频率研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

高校教务系统登录页面JS分析——华南理工大学

高校教务系统密码加密逻辑及JS逆向 本文将介绍高校教务系统的密码加密逻辑以及使用JavaScript进行逆向分析的过程。通过本文&#xff0c;你将了解到密码加密的基本概念、常用加密算法以及如何通过逆向分析来破解密码。 本文仅供交流学习&#xff0c;勿用于非法用途。 一、密码加…

可以更改字体颜色的便签备忘录工具选择用哪个

日常添加笔记记录是一个非常好的习惯&#xff0c;通过笔记来记录一些重要的内容一方面可以帮助大家回顾过去的相关记录&#xff0c;另一方面如果记录的笔记是有关学习类的&#xff0c;还有助于大家随时查看记录的笔记。 多数时候记录笔记内容大家通常会选择一些比较方便易操作…

Spring中配置文件参数化

目录 一、什么是配置文件参数化 二、配置文件参数化的开发步骤 一、什么是配置文件参数化 配置文件参数化就是将Spring中经常需要修改的字符串信息&#xff0c;转移到一个更小的配置文件中。那么为什么要进行配置文件参数化呢&#xff1f;我们看一个代码 <bean id"co…