庖丁解C 3.0

简介: 从理论上 goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。

请问循环要循环多少次?


#include int main()
{ int i = 0; int k = 0;
for(i =0,k=0; k=0; i++,k++)
       k++;
return 0;
}


答案是零次!


for里面的判断部分他变成了赋值,但是赋值结果是0,所以是假,因此for不执行


1.1 do while


1.1.1 语句的语法:


do
循环语句;
while(表达式);


先执行循环语句然后再判断表达式是否成立


1.1.2 语句的特点:


循环至少执行一次!使用的场景有限,所以不是经常使用


1.1.3 do while循环中的break和continue:


同我们以前说的for和while里的是一样的都是永久结束循环和跳过当前循环


练习:


1. 计算 n的阶乘。


#include <stdio.h>
int main()
{
  int n = 0, i = 1, sum = 1;
  scanf("%d", &n);
  for (i = 1; i <= n; i++)
  {
    sum = i * sum;
  }
  printf("%d", sum);
  return 0;
}


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


#include <stdio.h>
int main()
{
  int j = 0, SUM = 0;
  int sum = 1;
  for (j = 1; j <= 10; j++)
  {
    sum = j * sum;
    SUM += sum;
  }
    printf("%d", SUM);  
  return 0;
}

3. 在一个有序数组中查找具体的某个数字n。(二分查找/折半查找)


#include <stdio.h>
int main()
{
  int k = 7;
  int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
  int sz = sizeof (arr) / sizeof (arr[0]);
  int left = 0;  //左下标
  int reght = sz - 1;  //右下标
  while (left <= reght)
  {
    int mid = left + (reght - left) / 2;
    if (arr[mid] < k)
    {
      left = mid + 1;
    }
    else if (arr[mid] > k)
    {
      reght = mid - 1;
    }
    else
    {
      printf("目标已找到!下标是%d", mid);
      break;
    }
  }
  if (reght < left)
  {
    printf("找不到了!");
  }
  return 0; 
}


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


#include <string.h>
#include <Windows.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
  char arr1[] = { "welcome to my world!" };
  char arr2[] = { "####################" };
  int left = 0;
  int reght = strlen(arr1) - 1;
  while (left<=reght)
  {
    arr2[left] = arr1[left];
    arr2[reght] = arr1[reght];
    printf("%s\n", arr2);
    Sleep(1000);    // ms
    system("cls");
    left++;
    reght--;
  }
  printf("%s\n", arr2);
  return 0;
}


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


#include <stdio.h>
int main()
{
  char passwords[20] = { 0 };
  for (int i = 0; i < 3; i++)
  {
    printf("请输入密码!\n");
    scanf("%s", passwords);
    if(strcmp(passwords, "abcd") == 0)
    {
      printf("密码正确!");
        break;
    }
    else
    {
      printf("密码输入错误,请重新输入!\n");
    }
    if (i == 3)   //  for是调整完再判断 所以最后一次的i为3
    {
      printf("三次密码均错误,退出程序");
    }
  }
  return 0;
}


2. goto语句


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


从理论上 goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。


但是某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过程。


goto语句无法跨函数跳跃


适用于以下情况
for(...)
    for(...)
   {
        for(...)
       {
            if(disaster)
                goto error;
       }
   }
error:
 if(disaster)
         // 处理错误情况


相关文章
|
SQL 前端开发 关系型数据库
SqlAlchemy 2.0 中文文档(二十七)(2)
SqlAlchemy 2.0 中文文档(二十七)
89 2
|
XML Java 关系型数据库
Activiti工作流引擎介绍
Activiti工作流引擎介绍
|
Python
numpy.min(axis)用法
重点看看 axis,这里没有告诉你none、0、1表示啥。需要查找: - none:整个矩阵 - 0:每列 - 1:每行
2130 0
|
uml 应用服务中间件 AHAS
|
1天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1059 0
|
10天前
|
人工智能 运维 安全
|
1天前
|
弹性计算 Kubernetes jenkins
如何在 ECS/EKS 集群中有效使用 Jenkins
本文探讨了如何将 Jenkins 与 AWS ECS 和 EKS 集群集成,以构建高效、灵活且具备自动扩缩容能力的 CI/CD 流水线,提升软件交付效率并优化资源成本。
242 0
|
8天前
|
人工智能 异构计算
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
|
9天前
|
人工智能 测试技术 API
智能体(AI Agent)搭建全攻略:从概念到实践的终极指南
在人工智能浪潮中,智能体(AI Agent)正成为变革性技术。它们具备自主决策、环境感知、任务执行等能力,广泛应用于日常任务与商业流程。本文详解智能体概念、架构及七步搭建指南,助你打造专属智能体,迎接智能自动化新时代。
|
9天前
|
机器学习/深度学习 人工智能 自然语言处理
B站开源IndexTTS2,用极致表现力颠覆听觉体验
在语音合成技术不断演进的背景下,早期版本的IndexTTS虽然在多场景应用中展现出良好的表现,但在情感表达的细腻度与时长控制的精准性方面仍存在提升空间。为了解决这些问题,并进一步推动零样本语音合成在实际场景中的落地能力,B站语音团队对模型架构与训练策略进行了深度优化,推出了全新一代语音合成模型——IndexTTS2 。
735 23