【分支语句与循环语句】

简介: 【分支语句与循环语句】

一、分支语句

1、多分支语句

if else语句,if与else if的使用

int main()
  {
    int age = 100;
    if (age < 18)
      printf("未成年\n");
    else if (age >= 18 && age < 28)  
      printf("青年\n");
    else if (age >= 28 && age < 50)
      printf("壮年\n");
    else if (age >= 50 && age < 90)
      printf("老年\n");
    else
      printf("长寿\n");
    return 0;
  }

if与else if的使用,if与else if使用时,如果if执行else if就不会执行。

2、悬空else

else与最近的且未匹配的if匹配

int main()
  {
    int a = 0;
    int b = 2;
    if (a == 1)
      if (a == 2)               //若在这加{}else就无法和这个if匹配
        printf("hehe\n");
      else
        printf("haha\n");
    return 0;
  }

3、switch语句

switch(整型表达式)

{

case(整型常量表达式):

}

int main()
  {
    int day = 0;
    scanf("%d", &day);
    switch(day)          //switch括号内的必须是整型表达式
    {
    case 1:             //case后面必须是整型常量表达式
      printf("星期一\n");
      break;
    case 2:                               //若1-5的内容都相同
      printf("星期二\n");               //case 1:
      break;                           //case 2:
    case 3:                              //case 3:
      printf("星期三\n");              //case 4:
      break;                          //case 5:
    case 4:                             //       printf();
      printf("星期四\n");             //       break;
      break;
    case 5:
      printf("星期五\n");
      break;
    case 6:
      printf("星期六\n");
      break;
    case 7:
      printf("星期天\n");
      break;
    default:                        
      printf("输入错误\n");
      break;
    }
    return 0;
  }

2.循环语句

2.1 while循环

int main()
  {
    int i = 1;
    while (i <= 10)
    {
      if (i == 6) 
        break;
      printf("%d ", i);
      i++;
    }
    return 0;
  }

结论:break的作用------直接跳到结尾(只要遇到break直接终止所有循环)

int main()
  {
    int i = 0;
    while (i < 10)
    {
      i++;
      if (i == 6)
        continue;
      printf("%d ", i);
    }
    return 0;
  }

结论:continue的作用-----回到开头-----终止本次循环,即本次continue后面的语句不再执行,跳回while的判断部分

2.2 getchar()和putchar()

getchar()-----读取一个字符

putchar()-----输出/打印一个字符

int main()
  {
    char password[20] = { 0 };
    printf("请输入密码:");
    scanf("%s", password);
    //清理缓冲区
    while (getchar() != '\n')
    {
      ;
    }
    //scanf读取完password后剩余一个\n,若不加getchar();会直接读取\n然后输出放弃确认
    printf("请确认(Y/N):");
    int ch = getchar();
    int ret = getchar();
    if (ret == 'Y')
    {
      printf("确认成功\n");
    }
    else
    {
      printf("放弃确认\n");
    }
    return 0;
  }

2.3 for循环

for(表达式1; 表达式2; 表达式3)
  {
    循环语句;
  }

表达式1:初始化

表达式2:判读

表达式3:调整

int main()
  {
    int i = 0;
    for (i = 1; i <= 10; i++)
      printf("%d\n", i);
    return 0;
  }

2.4 do…while循环

do…while()循环-----先执行再判断

do
   {
    循环语句;
   }
  while(表达式);     (判断)
  如:
  int main()
  {
    int i = 1;
    do
    {
      printf("%d ", i);
      i++;
    } 
    while (i <= 10);
    return 0;
  }

2.5 在arr数组(有序的)中找到某个数-----二分查找

int main()
  {
    int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
    int k = 7;
    int sz = sizeof(arr) / sizeof(arr[0]);    //计算元素个数
    int left = 0;          //左下标(以中间元素的下标为标准)      数组元素   1 2 3 4 5 6 7 8 9 10
    int right = sz-1;     //右下标(以中间元素的下标为标准)          下标    0 1 2 3 4 5 6 7 8 9
    while (left <= right)     //若查找的元素存在,右下标是会比左下标大的
    {
      //int mid = (left + right) / 2;
      int mid = left + (right - left) / 2;
      if (arr[mid] > k)
      {
        right = mid - 1;
      }
      else if (arr[mid] < k)
      {
        left = mid + 1;
      }
      else
      {
        printf("找到了,下标是:%d\n",mid);
        break;
      }
    }
        if (left > right)            //若查找的元素不存在,左下标是会比右下标大的
        printf("找不到\n");
        return 0;
      }

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

int main()
  {
    char arr1[] = "welcome to LOL!!!!!";
    char arr2[] = "###################";
    int left = 0;
    int right = strlen(arr1)-1;
    while (right >= left)
    {
      arr2[left] = arr1[left];   //使arr1数组左边的元素赋给arr2左边,下同 
      arr2[right] = arr1[right];
      printf("%s\n", arr2);
      Sleep(1000);           //休息1秒,需引用头文件#include<windows.h>
      system("cls");         //执行系统命令的一个函数-cls-清空屏幕,需引用头文件#include<stdlib.h>
      left++;
      right--;
    }
    printf("%s\n", arr2);
    return 0;
  }

2.7 编写代码实现,模拟登陆情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则提示登陆成功,如果三次都输入错误,则退出程序)

int main()
  {
    int i = 0;
    char password[20] = { 0 };
    for (i = 0; i < 3; i++)
    {
      printf("请输入密码:");
      scanf("%s", &password);
      if (strcmp(password, "123456") == 0)      //(password=="123456"), == 不能用来比较两个字符串是否相等,应该使用一个库函数-strcmp
      {
        printf("登陆成功\n");
        break;
      }
      else
      {
        printf("密码错误\n");
      }
    }
    return 0;
  }

2.8 猜数字游戏

void menu()
  {
    printf("****************************************\n");
    printf("****       1.play     0.exit        ****\n");
    printf("****************************************\n");
  }
  void game()
  {
    //1.电脑生成一个随机数-使用rand()函数--在调用rand之前,使用srand函数为伪随机数生成器种子--在srand()函数里面要放一个随机值,所以引用时间戳放进去
    int ret = 0;
    int guess = 0;
    //拿时间戳来设置随机数的生成起点
    //time_t time(time_t *timer)  -时间戳的使用方法time函数(需引用time.h头文件)--time_t是它的类型,实质是long(长整型)--time_t *是指针类型
    ret = rand() % 100 + 1;
    //printf("%d\n", ret);
    //2.猜数字,猜大了提示你大了,......
    while (1)
    {
      printf("请输入一个整数(1-100):\n");
      scanf("%d", &guess);
      if (guess > ret)
      {
        printf("猜大了\n");
      }
      else if (guess < ret)
      {
        printf("猜小了\n");
      }
      else
      {
        printf("恭喜你,猜对了\n");
        break;
      }
    }
  }
  int main()
  {
    int input = 0;
    //srand 放在主函数,防止在game()函数里面过于频繁使用,以至于生成的随机值过于相近
    srand((unsigned int)time(NULL));
    do
    {
      menu();
      printf("请选择:\n");
      scanf("%d", &input);
      switch (input)
      {
      case 1:
        game();
        break;
      case 0:
        printf("退出游戏\n");
        break;
      default:
        printf("选择错误\n");
        break;
      }
    } while (input);
    return 0;
  }

2.9 goto语句的应用-----一个关机程序

在cmd中输入shutdown -s -t 60,电脑会在60s后关机;输入shutdown -a 会取消。代码形式:

int main()
{
  char input[] = { 0 };
  //system()--执行系统命令
  system("shutdown -s -t 60");
again:
  printf("请注意,你的电脑将在1分钟内关机,如果输入:我是猪,就会取消关机\n请输入:");
  scanf("%s", input);     //这里的input是数组,可以不用加&
  if (strcmp(input, "我是猪") == 0)      //strcmp()比较两个字符串
  {
    system("shutdown -a");
  }
  else
  {
    goto again;
  }
  return 0;
}

用循环形式:

int main()
{
  char input[] = { 0 };
  //system()--执行系统命令
  system("shutdown -s -t 60");
  while (1)
  {
    printf("请注意,你的电脑将在1分钟内关机,如果输入:我是猪,就会取消关机\n请输入:");
    scanf("%s", input);     //这里的input是数组,可以不用加&
    if (strcmp(input, "我是猪") == 0)      //strcmp()比较两个字符串
    {
      system("shutdown -a");
      break;
    }
  }
  return 0;
}

2.10 辗转相除法求最大公约数

求两个数的最大公约数-----辗转相除法:

假如两个数a=24,b=18,先让k=a%b=6,若结果不为0,则将b的值赋给a(a=b=18),k的值赋给b(b=k=6),a%b=0,则b为他们的最大公约数

int main()
      {
        int a = 190;
        int b = 25;
        int k = 0;
        while (a % b)         //a%b不等于0即为真,执行下面内容;a%b等于0为假,不执行
        {
          k = a % b;
          a = b;
          b = k;
        }
        printf("最大公约数为:%d\n", b);   //5
        return 0;
      }
目录
相关文章
|
前端开发
Axios request 封装技巧:提升代码复用和效率的步骤
在开发中,为了提高效率,通常对 Axios 进行封装,简化了请求的发送和对响应的处理。同时,统一错误处理机制有助于维护代码的清晰和一致性。本文介绍了一些高效封装 Axios 请求的方法。
Axios request 封装技巧:提升代码复用和效率的步骤
|
机器学习/深度学习 人工智能 自然语言处理
springboot基于人工智能和自然语言理解技术的医院智能导医系统源码
智能导诊系统可为患者提供线上挂号智能辅助服务,患者根据提示手动输入自己的基本症状,通过智能对话方式,该系统会依据大数据一步步帮助患者“诊断”,并最终推荐就医的科室和相关专家。患者可自主选择,实现“一键挂号”。这一模式将精确的导诊服务前置,从源头上让医疗服务更高效。
645 2
|
7月前
|
机器学习/深度学习 数据采集 API
Python自动化解决滑块验证码的最佳实践
Python自动化解决滑块验证码的最佳实践
|
存储 开发工具 数据安全/隐私保护
Git 与 SVN:版本控制领域的双星对比
【8月更文挑战第27天】
564 6
|
11月前
|
机器学习/深度学习 监控 算法
机器学习在图像识别中的应用:解锁视觉世界的钥匙
机器学习在图像识别中的应用:解锁视觉世界的钥匙
1408 95
|
存储 运维 安全
SaaS多租户和单租户的区别解析
SaaS多租户的系统维护成本低,多租户系统在升级时,只需要更新一次,维护人员不需要对每个用户更新,节省了很大的运维成本,这对于所有客户都在做同样事情的系统来说是很有用的。
503 3
|
8月前
|
存储 数据可视化 定位技术
以考勤记录、微信聊天记录主张存在加班事实能否获支持?
在现代职场中,加班管理成为HR的核心挑战。本文探讨如何通过考勤记录与微信聊天记录佐证加班事实,结合数字化工具提升管理效能。分析加班认定困境、证据体系构建及实战案例,提出智能预警、证据协同和动态申报三大优化路径。数字化管理不仅减少争议,还助力企业实现合规与共赢,提升员工满意度与组织效能。
|
存储 JSON 安全
JWT令牌详解
JWT令牌详解
571 3
|
SQL 运维 数据可视化
阿里云实时计算Flink版产品体验测评
阿里云实时计算Flink基于Apache Flink构建,提供一站式实时大数据分析平台,支持端到端亚秒级实时数据分析,适用于实时大屏、实时报表、实时ETL和风控监测等场景,具备高性价比、开发效率、运维管理和企业安全等优势。
|
测试技术
探索软件测试中的“思维侧翼”——如何以创新思维引领测试策略###
本文旨在探讨软件测试领域中,如何通过培养与运用创新思维,提升测试策略的有效性与效率。不同于传统的技术解析或理论阐述,本文将以“思维侧翼”为喻,启发读者从不同维度审视软件测试,寻找突破常规的思路与方法。我们相信,在快速迭代的软件开发周期中,灵活多变且富有创造力的测试思维,是发现潜在缺陷、保障产品质量的关键。 ###