史上最强C语言分支和循环教程详解

目录
  • 3.3 do...while()循环
    • 3.3.1 do语句的语法:
    • 3.3.2 执行流程
    • 3.3.3 do语句的特点
    • 3.3.4 do while循环中的break和continue
  • 3.4 练习
    • 3.4.1. 计算 n的阶乘。
    • 3.4.2. 计算 1!+2!+3!+……+10!
    • 3.4.3. 在一个有序数组中查找具体的某个数字n。
    • 3.4.4. 编写代码,演示多个字符从两端移动,向中间汇聚。
    • 3.4.5. 编写代码实现,模拟用户登录情景,并且只能登录三次。
    • 3.4.6.猜数字游戏实现
  • 4.goto语句

3.3 do...while()循环

3.3.1 do语句的语法:

do

循环语句;

while(表达式);

3.3.2 执行流程

3.3.3 do语句的特点

循环至少执行一次,使用的场景有限,所以不是经常使用。一般常常用在某些项目或者游戏的开始界面,因为无论用户做出怎样的选择,菜单或者游戏的开始页面至少会显示一次。

下面代码给大家展示一下:

#include <stdio.h>
int main()
{
 int i = 10;
 do
 {
  printf("%d\n", i);
 } while (i < 10);
 return 0;
}

3.3.4 do while循环中的break和continue

break:同while与for循环,执行break后直接跳出循环。下面给大家代码展示一下:

#include <stdio.h>
int main()
{
    int i = 0;

    do
    {
        if (5 == i)
            break;
        printf("%d\n", i);
        i++;
    } while (i < 10);

    return 0;
}

在i = 0 到4 的时候程序正常执行,当i = 5的时候,执行break语句循环退出结束,因此在屏幕上值打印了0 1 2 3 4。

continue:当do while循环体语句中遇到continue之后,就会跳转到条件判断语句。

#include <stdio.h>
int main()
{
    int i = 0;

    do
    {
        if (5 == i)
            continue;
        printf("%d\n", i);
        i++;
    } while (i < 10);

    return 0;
}

程序在i=5的时候if条件判定成立,执行continue语句,跳转到条件判定语句while(i<10)成立,陷入了死循环,此时i的值始终为5。

3.4 练习

3.4.1. 计算 n的阶乘。

#include<stdio.h>
int main()
{
 int n = 0;
 int i = 1;
 int ret = 1;//ret用来存放阶乘的结果
 scanf("%d", &n);
 for (i = 1; i <= n; i++)
 {
  ret *= i;
 }
 printf("%d", ret);
 return 0;
}

通过for循环即可实现求阶乘。

3.4.2. 计算 1!+2!+3!+……+10!

#include<stdio.h>
int main()
{
 int n = 10;
 int i = 1;
 int ret = 1;//ret用来存放阶乘的结果
 int sum = 0;
 for (i = 1; i <= n; i++)
 {
  ret *= i;
  sum += ret;

 }
 printf("%d", sum);
 return 0;
}

求阶乘的和时,此处用了一个比较巧妙的方法,即n的阶乘等于(n-1)的阶乘再乘n即可得出,当然,也可以用其它的方法,此处需要注意的是,如果用两个for循环求的话不要忘记ret的初始化!

3.4.3. 在一个有序数组中查找具体的某个数字n。

#include<stdio.h>
int main()
{
 int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
 int left = 0;
 int right = sizeof(arr) / sizeof(arr[0]) - 1;
 int key = 7;
 int mid = 0;
 while (left <= right)
 {
  mid = (left + right) / 2;
  if (arr[mid] > key)
  {
   right = mid - 1;
  }
  else if (arr[mid] < key)
  {
   left = mid + 1;
  }
  else
   break;
 }
 if (left <= right)
  printf("找到了,下标是%d\n", mid);
 else
  printf("找不到\n");
}

二分查找法主要是弄明白原理,只要原理弄清楚了就能很容易的写出代码,其原理为:定义首元素下标记为left,尾元素下标记为right,中间元素下标记为mid,拿我们向要查找的元素即mid下标对应的元素进行比较,如果比中间元素小,就将mid元素的前一个元素的下标记为right,反之,就将mid的后一个元素的下标记为left,重复这个过程即可,即构成一个循环,另外,需要记住这个循环终止的条件,当left>right时就表明中间已经没有中间元素供我们进行查找,在退出循环之后,如果left仍然小于right,就说明已经找到了我们想要查找的元素,即mid下标所对应的元素,mid即为其对应的下标。

3.4.4. 编写代码,演示多个字符从两端移动,向中间汇聚。

#include <stdio.h>
#include<string.h>
#include<windows.h>
int main()
{
    char arr1[] = "welcome to bit";
    char arr2[] = "##############";
    int left = 0;
    int right = strlen(arr1) - 1;
    printf("%s\n", arr2);
    //while循环实现
    while (left <= right)
    {
        Sleep(1000);
        arr2[left] = arr1[left];
        arr2[right] = arr1[right];
        left++;
        right--;
        printf("%s\n", arr2);
    }
    return 0;
}

这段代码并不复杂,就是将我们给出的字符串的左右元素逐个赋值到新建的字符串中即可,同样的,需要注意的是循环终止的条件,因为每次赋值完后,left下标+1,right下标-1,当left下标大于right下标即停止,此时中间已经没有元素了,就无法从两端向中间移动了。

3.4.5. 编写代码实现,模拟用户登录情景,并且只能登录三次。

(只允许输入三次密码,如果密码正确则 提示登录成,如果三次均输入错误,则退出程序。

#include<stdio.h>
#include<string.h>
int main()
{
    char psw[10] = "";
    int i = 0;
    int j = 0;
    for (i = 0; i < 3; ++i)
    {
        printf("please input:");
        scanf("%s", psw);
        if (strcmp(psw, "password") == 0)
            break;
    }
    if (i == 3)
        printf("exit\n");
    else
        printf("log in\n");
}

这个题中需要注意的是两个字符串不能直接进行比较,只能利用string.h库函数中的strcmp()进行比较,当两个字符串的每一个元素都相等的时候,给函数的返回值为0,即可进行判断。

3.4.6.猜数字游戏实现

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void menu()
{
 printf("**********************************\n");
 printf("*********** 1.play     **********\n");
 printf("*********** 0.exit     **********\n");
 printf("**********************************\n");
}
void game()
{
 int random_num = rand() % 100 + 1;
 int input = 0;
 while (1)
 {
  printf("请输入猜的数字>:");
  scanf("%d", &input);
  if (input > random_num)
  {
   printf("猜大了\n");
  }
  else if (input < random_num)
  {
   printf("猜小了\n");
  }
  else
  {
   printf("恭喜你,猜对了\n");
   break;
  }
 }
}
int main()
{
 int input = 0;
 srand((unsigned)time(NULL));
 do
 {
  menu();
  printf("请选择>:");
  scanf("%d", &input);
  switch (input)
  {
  case 1:
   game();
   break;
  case 0:
   break;
  default:
   printf("选择错误,请重新输入!\n");
   break;
  }
 } while (input);
 return 0;
}

猜数字游戏并不复杂,但运用了函数模块化的思想,其中生成随机数用到了rand()函数和时间戳进行搭配,需要注意的是,时间戳只需要在主函数中声明或者运行一次即可,不需要在每次生成随机数时都进行声明。

4.goto语句

C语言中提供了可以随意滥用的 goto语句和标记跳转的标号。

从理论上 goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。 但是某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过程。

例如:一次跳出两层或多层循环。 多层循环这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环。当然,利用多个break也可以跳出循环,不过要加很多条件进行限制,代码会变得过于冗长,且容易出错。

goto语言真正适合的场景如下:

for (...)
{
    for (...)
    {
        if (disaster)
            goto error;
    }
}
error :
     if (disaster)
         //处理错误情况

下面是使用goto语句的一个例子,然后使用循环的实现方式替换goto语句:

一个关机程序

#include <stdio.h>
int main()
{
    char input[10] = { 0 };
    system("shutdown -s -t 60");
again:
    printf("电脑将在1分钟内关机,如果输入:我是猪,就取消关机!\n请输入:>");
    scanf("%s", input);
    if (0 == strcmp(input, "我是猪"))
    {
        system("shutdown -a");
    }
    else
    {
        goto again;
    }
    return 0;
}

而如果不想用goto语句,则可以使用循环:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    char input[10] = { 0 };
    system("shutdown -s -t 60");
    while (1)
    {
        printf("电脑将在1分钟内关机,如果输入:我是猪,就取消关机!\n请输入:>");
        scanf("%s", input);
        if (0 == strcmp(input, "我是猪"))
        {
            system("shutdown -a");
            break;
        }
    }
    return 0;
}

到此这篇关于史上最强C语言分支和循环教程详解的文章就介绍到这了,更多相关C语言分支和循环内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C语言中for循环问题(一个小坑需注意)

    今天分享一下C语言中的for循环中我们常常忽略的小问题. 举一个小例子来说明,大家也可以自己先算一下哦 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> int main() { int a=0; int b=0; for(a=0,b=0;b=0;a++,b++) b++; return 0; } 这是一道面试题,问程序运行几次呢?运行结果如何? 其实这个小题关键是我们有没有被上图所示的b=

  • C语言之循环语句详细介绍

    目录 前言 while语句 do...while语句 for语句 结语 前言 C语言中的循环结构是程序中的一个基本结构. 循环结构可以使我们写很少的语句,让计算机反复执行某一过程. C语言提供了while语句,do......while语句和for语句,可以组成各种不同形式的循环结构. while语句 while语句又称当型循环控制语句 while(表达式) 语句 表达式式循环条件 ,语句是循环体 当表达式的值为真(非0)时,执行循环体语句,否则终止循环.其特点是先判断,再执行. 例如:计算1+

  • C语言分支循环其嵌套语句的使用

    目录 switch 嵌套 1.语法结构: 2.switch-case 嵌套语句程序示例 循环嵌套 1.while 循环嵌套 2.do-while 嵌套循环 3.for 循环嵌套 总结 Hello,everyone! forever之前给大家介绍了C语言的分支结构和循环结构,在分支中介绍了分支语句嵌套,但当时没有介绍 switch 嵌套,所以这次主要介绍 switch 嵌套和循环嵌套. 首先来说说什么是嵌套吧!一个语句内包含另一个完整的语句结构称为语句嵌套.内嵌套的语句结构内还可以继续嵌套其他语句

  • 深入了解c语言的循环语句

    目录 C语言循环语句 while循环 for循环 do......while 循环的嵌套 总结: C语言循环语句 大多数人都希望自己是体格强健,天资聪慧,多才多艺的人.虽然有时事与愿违,但至少我们用c能写出这样的程序.诀窍是控制程序流.对于计算机科学(是研究计算机,不是用计算机作研究) 1 如果满足某些条件就重复执行语句(循环). 2 通过测试选择执行哪一个语句(分支). 在c语言当中有while,for,do......while循环. while循环 while循环语句 while(表达式)

  • C语言控制语句之 循环

    入口条件循环:while循环 在执行多次循环之前之就已经决定是否执行循环 代码格式: while(关系表达式) 语句 //可以是以分号结尾的简单语句,也可以是用花括号括起来的复合语句. 关系表达式的结果有真(非0)执行和假(0)不执行两种状态 所以,我们发现while循环的终止条件很重要,要实现终止就必须让测试表达式的值产生变化,直到为假.while循环才可终止,否则,没有人为干预,它就不会停止(后面会学到使用if和break语句来终止循环,现在先不说) 看下面代码: #include <std

  • 史上最强C语言分支和循环教程详解

    目录 3.3 do...while()循环 3.3.1 do语句的语法: 3.3.2 执行流程 3.3.3 do语句的特点 3.3.4 do while循环中的break和continue 3.4 练习 3.4.1. 计算 n的阶乘. 3.4.2. 计算 1!+2!+3!+--+10! 3.4.3. 在一个有序数组中查找具体的某个数字n. 3.4.4. 编写代码,演示多个字符从两端移动,向中间汇聚. 3.4.5. 编写代码实现,模拟用户登录情景,并且只能登录三次. 3.4.6.猜数字游戏实现 4

  • linux上免安装版MySQL5.7.18的教程详解

    1. 下载mysql 从官网下载mysql的压缩包    mysql-5.7.18-linux-glibc2.5-x86_64.tar.gz 2 把下载的包上传到linux上,先安装下依赖包:Ubuntu用 apt-get install libaio*    centOS用yum install libaio* 3 用tar -xzvf mysql-5.7.18-linux-glibc2.5-x86_64.tar.gz 解压 改名并移动到/usr/local  下:mv mysql-5.7.1

  • linux上传并配置jdk和tomcat的教程详解

    准备工作 1.开启虚拟机 2. git工具 root账号登陆 使用root账号登陆 登陆后:使用linux命令: cd /opt/ 打开opt目录 mkdir app 在opt下创建app目录(压缩包解压到这儿) mkdir software在opt下创建software目录(上传的压缩包放在这儿) mkdir war 在opt下创建war 目录(上传的项目放在这儿) 关闭linux防火墙 防火墙相关设置 查看防火墙状态 service iptables status 关闭防火墙状态 servi

  • C语言入门之基础知识详解

    一.思维导图 内容不限于此思维导图 二.环境搭建 对于老手,自动跳过这一趴吧,或者也可以看一下我有没有啥纰漏,毕竟小白需要这一趴. 编译器很多,大部分老师会在学生学习C语言的时候推荐使用VC,不带语言提示器的那种,说是可以提高学生的编码能力.我也不知道到底是不是这么一回事儿.我推荐使用VS,这样学的快,函数记不住的问题很严重吗?项目的车轮碾压过去,再记不住也得记住吧!!! 更何况这个系列到后面是会有需要用文本文件编程写项目的阶段. 下载VS2019社区版,不要标新立异选那些最新版的,出了问题到时

  • C语言container of()函数案例详解

          在linux 内核编程中,会经常见到一个宏函数container_of(ptr,type,member), 但是当你通过追踪源码时,像我们这样的一般人就会绝望了(这一堆都是什么呀? 函数还可以这样定义??? 怎么还有0呢???  哎,算了,还是放弃吧...). 这就是内核大佬们厉害的地方,随便两行代码就让我们怀疑人生,凡是都需要一个过程,慢慢来吧.         其实,原理很简单:  已知结构体type的成员member的地址ptr,求解结构体type的起始地址.        

  • C语言实现面向对象的方法详解

    目录 1.引言 2.封装 3.继承 4.多态 4.1 虚表和虚指针 4.2 在构造函数中设置vptr 4.3 继承 vtbl 和 重载 vptr 4.4 虚函数调用 4.5 main.c 5.总结 1.引言 面向对象编程(OOP)并不是一种特定的语言或者工具,它只是一种设计方法.设计思想.它表现出来的三个最基本的特性就是封装.继承与多态.很多面向对象的编程语言已经包含这三个特性了,例如 Smalltalk.C++.Java.但是你也可以用几乎所有的编程语言来实现面向对象编程,例如 ANSI-C.

  • Go语言包和包管理详解

    目录 1 包简介 1.1 工作空间 1.2 源文件 1.3 包命名 1.4 main 包 2导包 2.1 两种方式 2.2 包的别名 2.3 简洁模式 2.4非导入模式(匿名导入) 2.5 导包的路径 2.6 远程导入 3 初始化 init 3.1 init总结 4 包管理 4.1 演变过程 4.2 Go Model优点 4.3 启用go module 4.4 GOPROXY 5 go mod详解 5.1 go mod命令 5.2 go.mod说明 5.2.1 依赖的版本 5.2.2 repla

  • C语言const关键字的用法详解

    目录 1 介绍 1.1 const修饰变量 1.2 const修饰数组 1.3 const修饰指针 1.4 const修饰函数参数 2 const对程序的影响 3 总结 1 介绍 const关键字是constant的缩写,翻译为常量.常数.在C语言中const的作用很强大,它可以修饰变量.数组.指针.函数参数等. 1.1 const修饰变量 const修饰变量,表示希望此变量具有只读性,防止被直接直接修改. //const关键字是constant的缩写,翻译为常量.常数. //在C语言中cons

  • 重学Go语言之运算符与控制结构详解

    目录 运算符 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 指针运算符 运算符的优先级 控制结构 If For Switch 小结 运算符 运算符的作用是将操作数组合成表达式,比如下面的代码中,我们通过赋值和加号组成了两个表达式: var i,j = 1,2 n := i + j Go的运算符大体分为六种:算术运算符.关系运算符.逻辑运算符.位运算符.赋值运算符和指针运算符. 算术运算符 运算符 含义 + 加号,除了用于整数,浮点数,复数外,还可以用于字符串的拼接 - 减号 * 相乘

  • windows上安装Anaconda和python的教程详解

    一提到数字图像处理编程,可能大多数人就会想到matlab,但matlab也有自身的缺点: 1.不开源,价格贵 2.软件容量大.一般3G以上,高版本甚至达5G以上. 3.只能做研究,不易转化成软件. 因此,我们这里使用Python这个脚本语言来进行数字图像处理. 要使用Python,必须先安装python,一般是2.7版本以上,不管是在windows系统,还是Linux系统,安装都是非常简单的. 要使用python进行各种开发和科学计算,还需要安装对应的包.这和matlab非常相似,只是matla

随机推荐