文章目录

  • goto语句
  • 一些简单的练习题
    • 打印三的倍数
    • 从大到小输入
    • 打印素数
    • 最大公约数
    • 打印闰年

goto语句

顾名思义goto语句就是去到任何我们想去的语句,当我们写了很长的一段代码时,我们想要回到某一行代码,就可以使用goto语句,这是C语言为我们提供了可以滥用的goto语句和标记跳转的标号。但是,如果没有goto语句其实我们的代码也可以很好的完成,有些时候使用goto语句反而会增加产生bug的风险,因为goto语句会让代码的逻辑变得更加不可控。但有些时候我们还是可以使用goto语句的,最常见的就是终止程序在某些深度嵌套的结构的处理过程。
例如:一次跳出多层循环

int mian()
{for (;;){for (;;){for (;;){if (0){goto error;}}}}
error:if(0)//当错误时的执行程序return 0;
}

假设我们有这样一个程序,在第三次循环嵌套时需要跳出全部的循环就可以使用goto语句。但是大多数时间没有goto语句我们也可以很好的完成代码。例如我们来举一个有意思的整蛊代码吧

int main()
{char arr[10] = { 0 };system("shutdown - s - t 60");again:printf("电脑将在1分钟之内关机,请输入:我是猪。终止程序\n");scanf("%s", arr);if (strcmp(arr, "我是猪")==0){printf("程序终止,取消关机");}else{goto again;}
}


上面代码的思路就是让用户输入我是猪,如果用户输入那么终止关机,如果用户不输入则再一次给出警示直到用户输入或者电脑关机。我们在上面的逻辑当中使用了goto语句,那么我们可不可以不使用呢?答案是可以的,上面的逻辑我们也可以使用循环来实现。

int main()
{char arr[10] = { 0 };system("shutdown - s - t 60");while (1){printf("电脑将在1分钟之内关机,请输入:我是猪。终止程序\n");scanf("%s", arr);if (strcmp(arr, "我是猪") == 0){printf("程序终止,取消关机");}}}

这样同样可以实现我们想要的逻辑。

一些简单的练习题

打印三的倍数

内容要求:写一个代码打印1-100之间所有3的倍数的数字

int main()
{int i = 0;for (i = 1; i <= 100; i++){if (i % 3 == 0){printf("%d ", i);}}return 0;
}

代码分析:因为要输出的是3的倍数,因此i%3==0表达式成立,又因为要输出1-100之间的3的倍数,所以我们使用for循环实现,每一次拿到i之后进行判断,如果i%3==0成立就输出,不成立就不是3的倍数。

从大到小输入

内容要求:写代码将三个整数按从大到小输出
例如 :
输入 : 2 1 3
输出 : 3 2 1

int main()
{int a = 0;int b = 0;int c = 0;//输入printf("请输入三个整数 :");scanf("%d%d%d", &a, &b, &c);//判断大小if (a < b){int tmp = a;a = b;b = tmp;}if (a < c){int tmp = a;a = c;c = tmp;}if (b < c){int tmp = b;b = c;c = tmp;}//输出printf("%d %d %d", a, b, c);
}


代码分析:我们的代码主要分三个部分1.输入2.判断大小3.输出。我们先创建三个整形变量用于接收我们的输入的数据,在写输出部分先输出a在输出b最后输出c,所以在判断的过程当中我们需要将最大的数放在a变量里面,所以我们分别将a与b和c比较,如果a比他们小那么将他们的值交换位置。这里我们主要讲一下是如何交换值的,有很多同学会问,我们为什么不直接a = b将b的值赋给a,而是分三步去做呢?我们注意一下,现在我们需要的逻辑是交换两个变量的值,而不是单一的把b的值赋给a,仅仅是a = b之后a变量的值会消失,还如何进行下面的比较和排序呢?所以这里我们需要一个中间变量去存储变量a的值,所以我们分了三部去做。

打印素数

内容要求:写一个代码:打印100-200之间的素数

int main()
{int i = 0;int j = 0;int sum = 0;for (i = 101; i <= 200; i++){for (j = 2; j <= i; j++){if (i % j == 0){break;}}if (i == j){sum++;printf("%d ", i);}}return 0;
}


代码分析

1.首先我们要了解素数的概念,素数就是只能被1和他本身整除的数。
2.我们需要获取100—200的之间的数字,需要使用for循环语句实现,因为100肯定不是素数所以从101开始。
3.进入循环后我们还需要进行判断从[2,i)之间的每个数据是否可以被i整除,所以我们进行循环嵌套,在第二层循环中判断是否能被整除,如果是则跳出循环。
4.跳出循环后进行判断,如果只有i本身可以整除那么就输出i。

当然我们这里给的只是一种思路,这种思路太过繁琐,还有很多很便捷的思路大家可以之后自己学习。

最大公约数

关于最大公约数的求解方法有很多种,比如:暴力穷举,辗转相除,更相减损发,Stein算法等,这里我们主要讲解一下,辗转相除法。

int main()
{int a = 18;int b = 24;int c = 0;while (c = a % b){a = b;b = c;}printf("%d\n", b);return 0;
}

代码分析:假如18 和 24 求最大公约数,第一次循环,我们让a%b取余,将b的值赋给a,将余数赋给b,反复循环,直到余数为0那么当前b的值就是最大公约数。

打印闰年

内容要求:打印1000到2000年之间的闰年
首先我们要知道闰年的概念,如果年份能被4整除并且不能被100整除则是闰年,如果年份能被400整除也是闰年,即:4年一闰且百年不闰,每400年在闰一次

int main()
{int i = 0;for (i = 1000; i <= 2000; i++){if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0){printf("%d是闰年\n", i);}}return 0;
}

C语言详解系列——goto语句的讲解和循环语句的简单练习题相关推荐

  1. C语言详解系列——分支语句详解if、switch

    文章目录 什么是语句 if语句 悬空else switch语句 break的使用 default 的使用 在之前的分享中,我们了解到了c语言是结构化的程序设计语言.分为顺序结构,选择结构,循环结构三大 ...

  2. C语言详解系列——循环语句详解(1)while语句的语法结构

    文章目录 while语句 break continue while语句 之前的学习中我们了解到了if语句的用法,这个语句只会执行一次,但在我们的生活当中有许多事情是需要重复去做的,那我们应该怎么实现呢 ...

  3. C语言详解系列——循环语句详解(3)do while语句的语法结构

    文章目录 do while语句 do while语句中的break和continue break continue do while语句与while语句的不同点 简单练习 do while语句 之前的 ...

  4. C语言详解系列——循环语句详解(2)for语句的语法结构

    文章目录 for语句 break与continue 关于if语句的建议 关于for循环的变种写法 一道笔试题 for语句 在之前的学习中我们已经了解到了循环结构中while语句的用法,那么为什么我们还 ...

  5. C语言详解系列——综合练习,猜数字小游戏

    文章目录 题目需求 思路分析 rand()库函数随机数的生成 游戏的试玩 题目需求 今天与大家分享一个简单的猜数字小游戏,当作我们前面学习的一个综合练习,我们的需求是: 1.可以自动生成一个1-100 ...

  6. C语言详解系列——函数的认识(4)函数的声明与定义,简单练习题

    文章目录 函数的声明与定义 函数的声明 函数的定义 简单的练习题 写一个函数可以判断一个数是不是素数 写一个函数实现二分查找 写一个函数,每调用一次这个函数,就会将 num 的值增加1. 函数的声明与 ...

  7. C语言详解系列——函数的认识(5)函数递归与迭代

    文章目录 函数递归 函数的迭代 函数递归 什么是函数递归?函数自己调用自己的编程技巧我们称为递归,函数递归通常会把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需要少量 ...

  8. 单片机 rs232 c语言,完全手册 51单片机C语言开发详解系列之第8章 串口通讯实战—RS232...

    完全手册 51单片机C语言开发详解系列 技术凝聚实力 专业创新出版 第8章 串口通讯实战-RS232接口电路与软件设计 本章主要通过实际的例子讲解AT89S51单片机的RS232串行通讯接口设计. 随 ...

  9. Java并发编程最佳实例详解系列

    Java并发编程最佳实例详解系列: Java并发编程(一)线程定义.状态和属性 Java并发编程(一)线程定义.状态和属性 线程是指程序在执行过程中,能够执行程序代码的一个执行单元.在java语言中, ...

最新文章

  1. 矩阵奇异值分解简介及C++/OpenCV/Eigen的三种实现
  2. Drug Target Review | 筛选用于抗COVID-19的抗病毒化合物
  3. 牛客题霸 [将升序数组转化为平衡二叉搜索树]C++题解/答案
  4. C链表(顺序表、静态链表区别)
  5. mysql通过集合查询_MySQL使用集合函数进行查询操作实例详解
  6. C#LeetCode刷题之#453-最小移动次数使数组元素相等(Minimum Moves to Equal Array Elements)
  7. 火爆全网络!这个GitHub项目开源了!搞定目标检测、图像识别
  8. Java把表导出成Excel的代码
  9. 23种经典设计模式的java实现_5_职责链模式
  10. 自动拷贝远程服务器文件夹,怎么从远程服务器上拷贝文件夹
  11. 论文阅读-Rethinking ImageNet Pre-trainging
  12. Excel VBA入门教程
  13. vue源码之数据侦测
  14. 工业树莓派结合USB摄像头实现远程网络监控
  15. Android cpu降频工具,免root安卓cpu降频软件-安卓cpu降频软件免root版下载-游戏大玩家...
  16. CSS3的clac 没有效果,警告提示“invalid property value”
  17. 自己动手打造mini型QQ
  18. adcclk最大_关于STM32 在进行ADC采样时,ADCCLK时钟频率的确定
  19. HLSL 的基础知识
  20. [C#] 使用 NAudio 实现音频可视化

热门文章

  1. 一个完整的缺陷管理流程是什么样的?
  2. 单纯形法和对偶单纯形法
  3. Sql(presto语法) 实现行转列和列转行
  4. OA and Ding
  5. 达梦数据库管理员每日数据库巡查清单
  6. 对象属性赋值还在一个一个的进行get/set操作吗?不,丑拒,一句代码解决
  7. ROCKY 8.4搭建本地yum源及配置局域网公用
  8. mysql通过TimeStampDiff求时间差
  9. 训练神经网络的技巧总结
  10. 【JavaEE】TCP协议的十大原理保姆讲解(Transmission Control Protocol)